From e9c214d8c89d654d4bc467081b54f1e5d26908c5 Mon Sep 17 00:00:00 2001 From: Sean Song Date: Mon, 13 Nov 2023 17:16:01 +0800 Subject: [PATCH] first --- .gitignore | 76 + Assets/NuGet.config | 16 + Assets/NuGet.config.meta | 23 + Assets/NuGet.meta | 8 + Assets/NuGet/Editor.meta | 9 + Assets/NuGet/Editor/NugetForUnity.dll | Bin 0 -> 187904 bytes Assets/NuGet/Editor/NugetForUnity.dll.meta | 33 + Assets/NuGet/LICENSE | 21 + Assets/NuGet/LICENSE.meta | 8 + Assets/NuGet/README.pdf | Bin 0 -> 246595 bytes Assets/NuGet/README.pdf.meta | 8 + Assets/NuGet/Resources.meta | 9 + Assets/NuGet/Resources/defaultIcon.png | Bin 0 -> 4415 bytes Assets/NuGet/Resources/defaultIcon.png.meta | 88 ++ Assets/Packages.meta | 8 + Assets/Packages/Sylvan.Data.0.2.12.meta | 8 + .../Sylvan.Data.0.2.12/.signature.p7s | Bin 0 -> 11512 bytes .../Sylvan.Data.0.2.12/Sylvan.Data.nuspec | 23 + .../Sylvan.Data.nuspec.meta | 7 + Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png | Bin 0 -> 5233 bytes .../Sylvan.Data.0.2.12/Sylvan.png.meta | 127 ++ Assets/Packages/Sylvan.Data.0.2.12/lib.meta | 8 + .../lib/netstandard2.1.meta | 8 + .../lib/netstandard2.1/Sylvan.Data.dll | Bin 0 -> 109056 bytes .../lib/netstandard2.1/Sylvan.Data.dll.meta | 23 + .../lib/netstandard2.1/Sylvan.Data.xml | 1237 ++++++++++++++++ .../lib/netstandard2.1/Sylvan.Data.xml.meta | 7 + .../Packages/Sylvan.Data.0.2.12/license.txt | 21 + .../Sylvan.Data.0.2.12/license.txt.meta | 7 + Assets/Packages/Sylvan.Data.0.2.12/readme.md | 94 ++ .../Sylvan.Data.0.2.12/readme.md.meta | 7 + Assets/Packages/Sylvan.Data.Csv.1.3.5.meta | 8 + .../Sylvan.Data.Csv.1.3.5/.signature.p7s | Bin 0 -> 11514 bytes .../Sylvan.Data.Csv.nuspec | 23 + .../Sylvan.Data.Csv.nuspec.meta | 7 + .../Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png | Bin 0 -> 5233 bytes .../Sylvan.Data.Csv.1.3.5/Sylvan.png.meta | 127 ++ .../Packages/Sylvan.Data.Csv.1.3.5/lib.meta | 8 + .../lib/netstandard2.1.meta | 8 + .../lib/netstandard2.1/Sylvan.Data.Csv.dll | Bin 0 -> 87040 bytes .../netstandard2.1/Sylvan.Data.Csv.dll.meta | 23 + .../lib/netstandard2.1/Sylvan.Data.Csv.xml | 828 +++++++++++ .../netstandard2.1/Sylvan.Data.Csv.xml.meta | 7 + .../Sylvan.Data.Csv.1.3.5/license.txt | 21 + .../Sylvan.Data.Csv.1.3.5/license.txt.meta | 7 + .../Packages/Sylvan.Data.Csv.1.3.5/readme.md | 81 ++ .../Sylvan.Data.Csv.1.3.5/readme.md.meta | 7 + Assets/Packages/Sylvan.Data.Excel.0.4.17.meta | 8 + .../Sylvan.Data.Excel.0.4.17/.signature.p7s | Bin 0 -> 11515 bytes .../Sylvan.Data.Excel.nuspec | 23 + .../Sylvan.Data.Excel.nuspec.meta | 7 + .../Sylvan.Data.Excel.0.4.17/Sylvan.png | Bin 0 -> 5233 bytes .../Sylvan.Data.Excel.0.4.17/Sylvan.png.meta | 127 ++ .../Sylvan.Data.Excel.0.4.17/lib.meta | 8 + .../lib/netstandard2.1.meta | 8 + .../lib/netstandard2.1/Sylvan.Data.Excel.dll | Bin 0 -> 122880 bytes .../netstandard2.1/Sylvan.Data.Excel.dll.meta | 23 + .../lib/netstandard2.1/Sylvan.Data.Excel.xml | 933 ++++++++++++ .../netstandard2.1/Sylvan.Data.Excel.xml.meta | 7 + .../Sylvan.Data.Excel.0.4.17/license.txt | 21 + .../Sylvan.Data.Excel.0.4.17/license.txt.meta | 7 + .../Sylvan.Data.Excel.0.4.17/readme.md | 115 ++ .../Sylvan.Data.Excel.0.4.17/readme.md.meta | 7 + Assets/Plugins.meta | 8 + Assets/Plugins/ExcelExtruder.meta | 8 + Assets/Plugins/ExcelExtruder/Editor.meta | 8 + .../Plugins/ExcelExtruder/Editor/EditorUI.cs | 29 + .../ExcelExtruder/Editor/EditorUI.cs.meta | 11 + .../ExcelExtruder/Editor/ExcelExtruder.cs | 252 ++++ .../Editor/ExcelExtruder.cs.meta | 11 + .../ExcelExtruder/Editor/TypeConvert.cs | 520 +++++++ .../ExcelExtruder/Editor/TypeConvert.cs.meta | 11 + Assets/Plugins/ExcelExtruder/Runtime.meta | 8 + .../ExcelExtruder/Runtime/StaticDataModel.cs | 18 + .../Runtime/StaticDataModel.cs.meta | 11 + Assets/Plugins/MemoryPack.meta | 8 + Assets/Plugins/MemoryPack/Runtime.meta | 8 + .../MemoryPack/Runtime/MemoryPack.Core.meta | 8 + .../Runtime/MemoryPack.Core/Attributes.cs | 166 +++ .../MemoryPack.Core/Attributes.cs.meta | 11 + .../Runtime/MemoryPack.Core/Compression.meta | 8 + .../Compression/BitPackFormatter.cs | 181 +++ .../Compression/BitPackFormatter.cs.meta | 11 + .../Compression/BrotliCompressor.cs | 338 +++++ .../Compression/BrotliCompressor.cs.meta | 11 + .../Compression/BrotliDecompressor.cs | 162 +++ .../Compression/BrotliDecompressor.cs.meta | 11 + .../Compression/BrotliFormatter.cs | 213 +++ .../Compression/BrotliFormatter.cs.meta | 11 + .../CustomFormatterAttributes.cs | 136 ++ .../CustomFormatterAttributes.cs.meta | 11 + .../Runtime/MemoryPack.Core/Formatters.meta | 8 + .../Formatters/ArrayFormatters.cs | 228 +++ .../Formatters/ArrayFormatters.cs.meta | 11 + .../Formatters/BigIntegerFormatter.cs | 55 + .../Formatters/BigIntegerFormatter.cs.meta | 11 + .../Formatters/BitArrayFormatter.cs | 67 + .../Formatters/BitArrayFormatter.cs.meta | 11 + .../Formatters/CollectionFormatters.cs | 1201 ++++++++++++++++ .../Formatters/CollectionFormatters.cs.meta | 11 + .../Formatters/CultureInfoFormatter.cs | 40 + .../Formatters/CultureInfoFormatter.cs.meta | 11 + .../Formatters/DynamicUnionFormatter.cs | 65 + .../Formatters/DynamicUnionFormatter.cs.meta | 11 + .../Formatters/GenericCollectionFormatters.cs | 182 +++ .../GenericCollectionFormatters.cs.meta | 11 + .../InterfaceCollectionFormatters.cs | 725 ++++++++++ .../InterfaceCollectionFormatters.cs.meta | 11 + .../Formatters/KeyValuePairFormatter.cs | 92 ++ .../Formatters/KeyValuePairFormatter.cs.meta | 11 + .../Formatters/LazyFormatter.cs | 46 + .../Formatters/LazyFormatter.cs.meta | 11 + .../Formatters/MemoryPackableFormatter.cs | 36 + .../MemoryPackableFormatter.cs.meta | 11 + .../MultiDimensionalArrayFormatters.cs | 373 +++++ .../MultiDimensionalArrayFormatters.cs.meta | 11 + .../Formatters/NullableFormatter.cs | 65 + .../Formatters/NullableFormatter.cs.meta | 11 + .../Formatters/StringBuilderFormatter.cs | 83 ++ .../Formatters/StringBuilderFormatter.cs.meta | 11 + .../Formatters/StringFormatter.cs | 279 ++++ .../Formatters/StringFormatter.cs.meta | 11 + .../Formatters/TimeZoneInfoFormatter.cs | 38 + .../Formatters/TimeZoneInfoFormatter.cs.meta | 11 + .../Formatters/TupleFormatter.cs | 657 +++++++++ .../Formatters/TupleFormatter.cs.meta | 11 + .../Formatters/TypeFormatter.cs | 62 + .../Formatters/TypeFormatter.cs.meta | 11 + .../Formatters/UnmanagedFormatter.cs | 58 + .../Formatters/UnmanagedFormatter.cs.meta | 11 + .../Formatters/UriFormatter.cs | 41 + .../Formatters/UriFormatter.cs.meta | 11 + .../Formatters/VersionFormatter.cs | 63 + .../Formatters/VersionFormatter.cs.meta | 11 + .../MemoryPack.Core/IMemoryPackFormatter.cs | 76 + .../IMemoryPackFormatter.cs.meta | 11 + .../MemoryPack.Core/IMemoryPackable.cs | 42 + .../MemoryPack.Core/IMemoryPackable.cs.meta | 11 + .../Runtime/MemoryPack.Core/Internal.meta | 8 + .../Internal/EnumerableExtensions.cs | 43 + .../Internal/EnumerableExtensions.cs.meta | 11 + .../Internal/FixedArrayBufferWriter.cs | 69 + .../Internal/FixedArrayBufferWriter.cs.meta | 11 + .../MemoryPack.Core/Internal/MathEx.cs | 30 + .../MemoryPack.Core/Internal/MathEx.cs.meta | 11 + .../Internal/MemoryMarshalEx.cs | 35 + .../Internal/MemoryMarshalEx.cs.meta | 11 + .../Internal/PreserveAttribute.cs | 18 + .../Internal/PreserveAttribute.cs.meta | 11 + .../ReusableLinkedArrayBufferWriter.cs | 395 ++++++ .../ReusableLinkedArrayBufferWriter.cs.meta | 11 + .../ReusableReadOnlySequenceBuilder.cs | 158 +++ .../ReusableReadOnlySequenceBuilder.cs.meta | 11 + .../MemoryPack.Core/Internal/TypeHelpers.cs | 114 ++ .../Internal/TypeHelpers.cs.meta | 11 + .../Runtime/MemoryPack.Core/MemoryPackCode.cs | 35 + .../MemoryPack.Core/MemoryPackCode.cs.meta | 11 + ...oryPackFormatterProvider.WellknownTypes.cs | 144 ++ ...ckFormatterProvider.WellknownTypes.cs.meta | 11 + .../MemoryPackFormatterProvider.cs | 458 ++++++ .../MemoryPackFormatterProvider.cs.meta | 11 + .../MemoryPackReader.Unmanaged.cs | 620 ++++++++ .../MemoryPackReader.Unmanaged.cs.meta | 11 + .../MemoryPack.Core/MemoryPackReader.cs | 930 ++++++++++++ .../MemoryPack.Core/MemoryPackReader.cs.meta | 11 + .../MemoryPackReaderOptionalState.cs | 82 ++ .../MemoryPackReaderOptionalState.cs.meta | 11 + .../MemoryPackReaderWriter.VarInt.cs | 448 ++++++ .../MemoryPackReaderWriter.VarInt.cs.meta | 11 + .../MemoryPackSerializationException.cs | 154 ++ .../MemoryPackSerializationException.cs.meta | 11 + .../MemoryPackSerializer.Deserialize.cs | 160 +++ .../MemoryPackSerializer.Deserialize.cs.meta | 11 + .../MemoryPackSerializer.NonGenerics.cs | 244 ++++ .../MemoryPackSerializer.NonGenerics.cs.meta | 11 + .../MemoryPackSerializer.Serialize.cs | 213 +++ .../MemoryPackSerializer.Serialize.cs.meta | 11 + .../MemoryPackSerializerOptions.cs | 40 + .../MemoryPackSerializerOptions.cs.meta | 11 + .../MemoryPackWriter.Unmanaged.cs | 1250 +++++++++++++++++ .../MemoryPackWriter.Unmanaged.cs.meta | 11 + .../MemoryPack.Core/MemoryPackWriter.cs | 715 ++++++++++ .../MemoryPack.Core/MemoryPackWriter.cs.meta | 11 + .../MemoryPackWriterOptionalState.cs | 122 ++ .../MemoryPackWriterOptionalState.cs.meta | 11 + .../Runtime/MemoryPack.Generator.meta | 8 + .../MemoryPack.Generator.Roslyn3.dll | Bin 0 -> 122368 bytes .../MemoryPack.Generator.Roslyn3.dll.meta | 71 + .../MemoryPack/Runtime/MemoryPack.Unity.meta | 8 + .../MemoryPack.Unity/ProviderInitializer.cs | 64 + .../ProviderInitializer.cs.meta | 11 + .../MemoryPack.Unity/UnityFormatters.cs | 134 ++ .../MemoryPack.Unity/UnityFormatters.cs.meta | 11 + .../MemoryPack/Runtime/MemoryPack.asmdef | 16 + .../MemoryPack/Runtime/MemoryPack.asmdef.meta | 7 + Assets/Plugins/MemoryPack/package.json | 12 + Assets/Plugins/MemoryPack/package.json.meta | 7 + ...System.Runtime.CompilerServices.Unsafe.dll | Bin 0 -> 18024 bytes ...m.Runtime.CompilerServices.Unsafe.dll.meta | 33 + Assets/Resources.meta | 8 + Assets/Resources/StaticData.meta | 8 + Assets/Scenes.meta | 8 + Assets/Scenes/SampleScene.unity | 267 ++++ Assets/Scenes/SampleScene.unity.meta | 7 + Assets/packages.config | 6 + Assets/packages.config.meta | 23 + Packages/manifest.json | 41 + Packages/packages-lock.json | 382 +++++ ProjectSettings/AudioManager.asset | 19 + ProjectSettings/ClusterInputManager.asset | 6 + ProjectSettings/DynamicsManager.asset | 34 + ProjectSettings/EditorBuildSettings.asset | 8 + ProjectSettings/EditorSettings.asset | 30 + ProjectSettings/GraphicsSettings.asset | 63 + ProjectSettings/InputManager.asset | 295 ++++ ProjectSettings/MemorySettings.asset | 35 + ProjectSettings/NavMeshAreas.asset | 91 ++ ProjectSettings/PackageManagerSettings.asset | 36 + .../Settings.json | 5 + ProjectSettings/Physics2DSettings.asset | 56 + ProjectSettings/PresetManager.asset | 7 + ProjectSettings/ProjectSettings.asset | 763 ++++++++++ ProjectSettings/ProjectVersion.txt | 2 + ProjectSettings/QualitySettings.asset | 232 +++ ProjectSettings/TagManager.asset | 43 + ProjectSettings/TimeManager.asset | 9 + ProjectSettings/UnityConnectSettings.asset | 38 + ProjectSettings/VFXManager.asset | 12 + ProjectSettings/VersionControlSettings.asset | 8 + ProjectSettings/XRSettings.asset | 10 + 230 files changed, 21029 insertions(+) create mode 100644 .gitignore create mode 100644 Assets/NuGet.config create mode 100644 Assets/NuGet.config.meta create mode 100644 Assets/NuGet.meta create mode 100644 Assets/NuGet/Editor.meta create mode 100644 Assets/NuGet/Editor/NugetForUnity.dll create mode 100644 Assets/NuGet/Editor/NugetForUnity.dll.meta create mode 100644 Assets/NuGet/LICENSE create mode 100644 Assets/NuGet/LICENSE.meta create mode 100644 Assets/NuGet/README.pdf create mode 100644 Assets/NuGet/README.pdf.meta create mode 100644 Assets/NuGet/Resources.meta create mode 100644 Assets/NuGet/Resources/defaultIcon.png create mode 100644 Assets/NuGet/Resources/defaultIcon.png.meta create mode 100644 Assets/Packages.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/.signature.p7s create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/Sylvan.Data.nuspec create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/Sylvan.Data.nuspec.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/lib.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/license.txt create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/license.txt.meta create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/readme.md create mode 100644 Assets/Packages/Sylvan.Data.0.2.12/readme.md.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/.signature.p7s create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.Data.Csv.nuspec create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.Data.Csv.nuspec.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/lib.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.dll create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.dll.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.xml create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.xml.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt.meta create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md create mode 100644 Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/.signature.p7s create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.Data.Excel.nuspec create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.Data.Excel.nuspec.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/lib.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt.meta create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md create mode 100644 Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md.meta create mode 100644 Assets/Plugins.meta create mode 100644 Assets/Plugins/ExcelExtruder.meta create mode 100644 Assets/Plugins/ExcelExtruder/Editor.meta create mode 100644 Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs create mode 100644 Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs.meta create mode 100644 Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs create mode 100644 Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs.meta create mode 100644 Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs create mode 100644 Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs.meta create mode 100644 Assets/Plugins/ExcelExtruder/Runtime.meta create mode 100644 Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs create mode 100644 Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs.meta create mode 100644 Assets/Plugins/MemoryPack.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/ProviderInitializer.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/ProviderInitializer.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs.meta create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef create mode 100644 Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef.meta create mode 100644 Assets/Plugins/MemoryPack/package.json create mode 100644 Assets/Plugins/MemoryPack/package.json.meta create mode 100644 Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll create mode 100644 Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta create mode 100644 Assets/Resources.meta create mode 100644 Assets/Resources/StaticData.meta create mode 100644 Assets/Scenes.meta create mode 100644 Assets/Scenes/SampleScene.unity create mode 100644 Assets/Scenes/SampleScene.unity.meta create mode 100644 Assets/packages.config create mode 100644 Assets/packages.config.meta create mode 100644 Packages/manifest.json create mode 100644 Packages/packages-lock.json create mode 100644 ProjectSettings/AudioManager.asset create mode 100644 ProjectSettings/ClusterInputManager.asset create mode 100644 ProjectSettings/DynamicsManager.asset create mode 100644 ProjectSettings/EditorBuildSettings.asset create mode 100644 ProjectSettings/EditorSettings.asset create mode 100644 ProjectSettings/GraphicsSettings.asset create mode 100644 ProjectSettings/InputManager.asset create mode 100644 ProjectSettings/MemorySettings.asset create mode 100644 ProjectSettings/NavMeshAreas.asset create mode 100644 ProjectSettings/PackageManagerSettings.asset create mode 100644 ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json create mode 100644 ProjectSettings/Physics2DSettings.asset create mode 100644 ProjectSettings/PresetManager.asset create mode 100644 ProjectSettings/ProjectSettings.asset create mode 100644 ProjectSettings/ProjectVersion.txt create mode 100644 ProjectSettings/QualitySettings.asset create mode 100644 ProjectSettings/TagManager.asset create mode 100644 ProjectSettings/TimeManager.asset create mode 100644 ProjectSettings/UnityConnectSettings.asset create mode 100644 ProjectSettings/VFXManager.asset create mode 100644 ProjectSettings/VersionControlSettings.asset create mode 100644 ProjectSettings/XRSettings.asset diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f617cb --- /dev/null +++ b/.gitignore @@ -0,0 +1,76 @@ +# This .gitignore file should be placed at the root of your Unity project directory +# +# Get latest from https://github.com/github/gitignore/blob/main/Unity.gitignore +# +/[Ll]ibrary/ +/[Tt]emp/ +/[Oo]bj/ +/[Bb]uild/ +/[Bb]uilds/ +/[Ll]ogs/ +/[Uu]ser[Ss]ettings/ + +# MemoryCaptures can get excessive in size. +# They also could contain extremely sensitive data +/[Mm]emoryCaptures/ + +# Recordings can get excessive in size +/[Rr]ecordings/ + +# Uncomment this line if you wish to ignore the asset store tools plugin +# /[Aa]ssets/AssetStoreTools* + +# Autogenerated Jetbrains Rider plugin +/[Aa]ssets/Plugins/Editor/JetBrains* + +# Visual Studio cache directory +.vs/ + +# Gradle cache directory +.gradle/ + +# Autogenerated VS/MD/Consulo solution and project files +ExportedObj/ +.consulo/ +*.csproj +*.unityproj +*.sln +*.suo +*.tmp +*.user +*.userprefs +*.pidb +*.booproj +*.svd +*.pdb +*.mdb +*.opendb +*.VC.db + +# Unity3D generated meta files +*.pidb.meta +*.pdb.meta +*.mdb.meta + +# Unity3D generated file on crash reports +sysinfo.txt + +# Builds +*.apk +*.aab +*.unitypackage +*.app + +# Crashlytics generated file +crashlytics-build.properties + +# Packed Addressables +/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin* + +# Temporary auto-generated Android Assets +/[Aa]ssets/[Ss]treamingAssets/aa.meta +/[Aa]ssets/[Ss]treamingAssets/aa/* + +.vscode +Documents +excelconfig diff --git a/Assets/NuGet.config b/Assets/NuGet.config new file mode 100644 index 0000000..82fb1c8 --- /dev/null +++ b/Assets/NuGet.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Assets/NuGet.config.meta b/Assets/NuGet.config.meta new file mode 100644 index 0000000..b6b2cd1 --- /dev/null +++ b/Assets/NuGet.config.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 55b3308e019e6544ea36feb03253564c +labels: +- NuGetForUnity +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet.meta b/Assets/NuGet.meta new file mode 100644 index 0000000..27037b5 --- /dev/null +++ b/Assets/NuGet.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: dbf134857daf7df428aa31cdd055514f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet/Editor.meta b/Assets/NuGet/Editor.meta new file mode 100644 index 0000000..3b6fd6b --- /dev/null +++ b/Assets/NuGet/Editor.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: b3fad56c531ac5a4db190a745f589a8e +folderAsset: yes +timeCreated: 1510280304 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet/Editor/NugetForUnity.dll b/Assets/NuGet/Editor/NugetForUnity.dll new file mode 100644 index 0000000000000000000000000000000000000000..d010342447f4d95d79129bdb82c032d8f00a2dd4 GIT binary patch literal 187904 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

{^M(oC4DBwu4 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 literal 0 HcmV?d00001 diff --git a/Assets/NuGet/Editor/NugetForUnity.dll.meta b/Assets/NuGet/Editor/NugetForUnity.dll.meta new file mode 100644 index 0000000..833aac7 --- /dev/null +++ b/Assets/NuGet/Editor/NugetForUnity.dll.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8dc1be91775c4bb469f6b74cef450eaa +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 0 + settings: {} + - first: + Editor: Editor + second: + enabled: 1 + settings: + DefaultValueInitialized: true + - first: + Windows Store Apps: WindowsStoreApps + second: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet/LICENSE b/Assets/NuGet/LICENSE new file mode 100644 index 0000000..e5e7210 --- /dev/null +++ b/Assets/NuGet/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 Patrick McCarthy + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/NuGet/LICENSE.meta b/Assets/NuGet/LICENSE.meta new file mode 100644 index 0000000..9de0ac8 --- /dev/null +++ b/Assets/NuGet/LICENSE.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1d9014b99ad06af428514a5902d29ff3 +timeCreated: 1573248500 +licenseType: Pro +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet/README.pdf b/Assets/NuGet/README.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e67f9fa5922f206ddc30562e92cf9ed7e8381e04 GIT binary patch literal 246595 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�ZEdKm>WP|kC={o;(m6<dNTb1AJy4K(q0WRO|t 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 z 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%0DZ@?7ydphKwK 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

{f6Z@u29|Z~r2&HE1}@%> z{^RBLAUXj0APql4Ns7n0ZfX5Cc1vhRT1Cr6%Rb1+Xi#8Kq=9MI9E8(^if&}zDg<-V zCZDA8E!R2XqHo2V$s+viSoNHy#qa)e=^gcvz{6K+!PFM`8el~Q5cd!R*ixM zStDS+TiG4A(&sIIVM}O@>8YCK%^!fs($|Q0G34O!RkhZq*M*wfFxH=t!tyGK<)HU_ zRUXOso4?JY$*z{qaN5vVh`wKrZ#2@YXouSgZ?`|1#p^0EUpu1rh>L(fuSY+1S5Fpw ztLJE6^sQIEQvsoqzzE&(nRWh@kKNYFx)^d|(kX6}+Mu{WaYpw#{gb5%V`SxL9ac6i zzXy+~C03F2%=ReHnyUt@B8YWzZ#dve{%|!9tQNw4eoneV*f&q)o&L0ipA6Ma+)qR3 zIBXf?ecd@o5kPQejC^JHc%xPxGGdf*_4U5v+bl_D9cI#puXzfUiQ!FD<@;F9lyX&4 zA$v&Q3>$EQUpwkD^5|z%Zsx^>U6omk;N{DhC=7x&5jVj$ogu+kY@`-59yo4PhL9`m zibR`{e6wH-Y(kp#n*wL{DIQN#`pV3;kQ;5uf2aM<5X?MJD56E{Nrmr8y_{grC!fY} z`n}Y#^U{iYFaiV8+HC9ovhdjI*^WIq5_nJmgu**u7YF==CC|4@1hGHKz+#cJt=1WI$E8Mlw(7k zg!5ceO{Eq0eu(W-NW#GRASKK>IGhlMKLb1;G@^w3=-rO;J)Qu~Z{A^b;I+pY$kUFpQ6pY4NjWFBi4S(Q2JRRuQvd5+S<%#0mz~{XXCvn||u&EcM zJ5mw0j#z_DT7{k}yT%)$T!z_Jak?VGDeRlO%;q-^OHB1I|Q!ftnxM$ ze8wAPEW#h9{KiM@y#J_yZT7a|rLP!DJW}wb_buHo`ljXbiKJ}3zIWd<8PGIZopXLFI!q^ zl^Mgf_TV8#ww1@Qvp$|TE}xZK=f9p0_+Qu#*$zdfK?@h#0fPaBeH(E@KvKukZJv3< zw>7VfUg5JRfx$7;iD>7;UINt0`ZG=xM7`=Z=vRaQHPT0+3qz%CPnuCz6D^y-tlf7w zJ3QjSr#JWahwc5EIYnPqpC&TbMG!>v5r4v>lxn!_HFEORBj@V zbT}LO3_WsfiX(4lwLkqCMDQl{AD&df-9rX(JtC3rRG%=oCVm@PwI*wp`4a=O=eX z3}5U0?)T+x^D;!}QUsE~(p!Q@XqP?z@!Fi*)sZdkhB+2=T?DD1FI_ZXkb2>(1!Wp!29pg9_Hd}_{p61eMR*8oa*HX*S`cgwPsB;BHI3MZB# zU+0Vo_>oWS9_?~$%Gj5h-(0lW75V|Nc(X05wU|u(1+2Pi-u^7teM4G#cGGGTc_{mR zKpNrwX9a4{$N2nbO1sqoz6%{+W!!bBM)YY%V$}hGKnnI&(+9WiD>72+>NJlg#&%rW z5m9ZN$pod58M{h923tCS8DQ_dJ|$qiZjoU(nm>0^b)qx>Cb?`p|9O8?{O3d!6#P}+ z{tgK&dhB=FgmYuV`*3we0lLmT!E1T%Tz&Go1kyyIguuOEFtuRzW=SzEZ1VOfMu}*< zo;_ajp5NS4>rK#2<6HzjE*s5$YLFN zm~G7G%4;*f@^+X8G}>YG5o*6^$!XbY`D)QQfAc4aFGDr0aiO4Ere#aEW{Eb2IWq^uZ;qptf;;()(_N|ny24Qd3p}mQV&G6lml?R$B!gr)8NOY~YlUkfZ}i;;*#LDx+V{Z_ zFKFg%xn%VcZ90uqItB%AyRUoB)815Jrh`LkI8Dr@^r@x?LkxW+^99=9@_{VwlK6vB_yg; zv)eWQ2w$C)>;A z_sA8^P!5r=%k78?&6rYZq(}U^g&;0$lizEOPwZjm{t#=Nh+{9o`@*T2nbIq0K75Eb zm%!a-A`LZL7VPqICQWbrCwPo*(-7SF;cDKIFISs(R&iX2oaIhvYC>jKMWk{2&^|vrEiR2e9u7Ixi>ZlRqacb3-Kp-KWC9XTTG$+RdX%?;6&ky)|eihCk!bxjcu{NUQu6B zb0p4;>GBo)A=bKt=N#fQjeXHj`S(;dNu;9y|JXOEnnHMMx^5ApL)2LxpYKf5frq$2 zX{Ff!pDd5*PxM8;71T1Y$zd z*1D1)E5_I|1UDpwVr2Hn(rNRKl+szZOi4B?YJa6BE0l@SRV$`-Mc+g8OexQ4KV4y= zS$v=1y?T9Wwn?ngS&NR}9Zmd;A$w}r`0{4FO)RDYI?Rh%cP3m7FyAbp$NOP)j27bq ziZ)j!suS)kVV8w92clNUIMb0$#8$p?W~bDva(;iy|HBy4VrfyG9cx~+Y_+^*%o!GI zp}2gbtQp@^3aS=FG6OAp;Y?C!!+RiQ^-(v<*s*5)rqIFiwx+S|D_p6uqqiM4)n<$~ zn_G74kWM@NkYmn-Glh|!^>4J+gh^Y&>Wcni1Xbgg#q{<5{e~wy=*}cSF|H2gVlsyr z$#YnbMf9(iaAthRL_q;x+WNlE*xsLWu`EJkW`%FohfO(3m(iid2+&w^$xUTNYI#aXqV zS|jSb^f}3lRC*`HZkipm1}P4*aX%US0mNDz4BoP+R7OV?x2ir2{>fR%FaWu+Mc%5_ zmbw;@HqR!clzmzAMe{`qX*1~^*RB6^*0bL8>NDSSz^l=7=d?_%QTd*v; z-7}d*J*zl=<>#c0r4B2D1^i=q_f%fJoT81=joL|#3+01~n}v_ZIme>zi5=SAat4J= z8fg{SmksgLEbbruOKa7&Dm<$m${#8pDykM<7G&Ka_|9|wGa7hi>WKC=tEW)uNbZjG znD;L4*yql~J>)r}L&aZxy;!i+L9?w~Z((S`{uoo23m`SN&|&MXiwZD0skoct3_ zw9vpJUyliD6Y?o~Yqq_4e4~OL+v@Mu#-SC?#cUEwrTVi|nZ@sC#!CH|Dcx^uE#E6B{NkE4|B|rve^9 z-BW@Iz=n`hvBjv8hInmTj|l&9L6h(m^n1FO82|G}O@F z#sWzzgZ^mhaH_I#R6|0eguSBWw(ItLWkttr;q6ZwwX@l=S%%rFSwjwC_wrzygxk#9 z4uWdl1vC!znzBW$Kl4r;qOr*v3HLINvW_y2au?+)Hn1GJ_OxedZ&ck3-DMCl$|n0* z6}0eSp@vfx6M{Re+x!G-Zx#vFajIk;GaoV^lU7Zr#{>243#hB;Y~(mJ>`O{3Y8E(c z^jdNNMK4{jyHI$uyO65v0X$WJtD2$NYoqmv)bwAq8_v zTEChh%BE9E*J$aATh_$4wvWq1t-^WRtj)3!{g)N!%xQ15Q&&i)zm+2d8lKm0BEe8Ka$^R^6P-H36& zyp1keL-8I~KT=p4! zJlv7caoHW)v(78cYxY}HfZ=<5fXKVVyT<#(;tcxEC-?a#_eP7A#=Ffsq1)(ZDk*=d zbjmgK?Fct<9s=${Vo9=(jly)wD7(S3WT^=Tt*)J>T4$LCZL6mqzCr6IsLk*zA!mxd z5d!muQ-+%)-%#76mMPCv?&0pOe8qg_^Kr`IfiP#m(7`CLjR6vMv&edudboO8dR%&O zv3BFBwkHl_O?UNseCKYA%|->?x0&6e4(7O6_YA)(JnJC81Fky`JkDl$_^Q-~#!=4L zW>;J6=Xh&0Y{rszaV7*NGC8fYlb45c&@Q5)W3BPl$>>=r_^SiDr_n5(l=CV39OgJQ zwi^e^d7^J6JpiNl2eHSxJMO@E!KU+9oQJwtq@-sl z7*|H9kPF4Zs#@(!IzhLORz|X@%-C26rz~-0l!>#T=&Mt$-Pk*+=xE1*-5c@24PCo? z6YR;HxboWdF7-efo;Y7Rc`Uy0Id%)5EU&%@O!6iU*{jCqgYN3ww9q@au_X`kN@BU* z;Lk3jL+!4kL!yOyR9Y53lQc74TA@{iMk>+-->K&Wx-V`4Kz!qi<8$8GxDTwDR%HTE zbkG#g3i2BxL^i8%3 zV@Se}+Mu5-Of2i`)x-h73)AtUgIeH@Ej9SskCEqg9xcZDN!c-F|Hbn zq}C|zp*-w|RScH;T+k}$K&4j|UuBg^JkQAm6c(osy8}RX5U5*)M5UpSLaJU{7v?kBtA->ZMli^!manb2kYed-l$3=6E& z+A^7cHSOClNe@Y6$%4h91Ew&HkCAAHTGg=`FseDt_I^6aAD`E`3BGe?BZ$XgkYG|A z$MbXz*n{URl&DIJw6 zF?=5UGBj3u=szhOqi za76u2v3ZF?K+E794bT=+Y<}tTY5MXbL)4IPXZOm)R~RiqH{06O-xPAPM>C7`82)!? zV(py0x>0YeOLA?N+Z+u9XPMqd3rM~7!&xU+ZJ=n+2l1tt{e{u@*6OSrZiyP|q~|TlvH)kDY*~PAZ{?XAMT(`_--QMkNgb(fbQ>$5 zyd|bOBN`{vWs0N3(VZhd-I-h2rxj=I73ED)XFBe?u=U5Jotc=I9=)+kTKIl3%ACui zCXaoYZJc1An;1TSSZKJ62qO*rK4jk(F16|5J0DI;&TmFdf=LZ>9{a*SsPs9WM96ug z2DwzBj&#xKmYZKP_OID)`tuCs5M%BvnT^e3cCE@)Q*gDG4z3g0IPV;sFl(H^jjNiH z1rk-?7PP}iqf^YpReq_d7e#fcA`H$!APjHGyd{z)1OWE zPPRrNTOcE7Kj3HCrt=8s8t%h4{;4m6jYU*bDPtZ}C1qGs-n(5_rMn|<{1o&cT8eV; z?Nw^UH%gTuGgG!kR4H+D@MF}jw?)ma_a|+=iv0P8b<2}*%QeqByD;W?q$zHL5dr1~ z{Z!a(Z|zCfl#YXqQAy|FNfg@Xm{B~9!A12blsEx{jO8z8sAf|WDg0^iK!K?yMMhWL z^krC#rB6C^o%@9*so-0R6;~%z+c(CsH>}TyrFJhE7;KG3@M_-|x{(V%u6HltXF6{Q z^p9_>zp&f}cAJGYsgF*W)lmK2mmX(D zU~FdZyZ1QT1Il^3St3u@sUl_HdxXSz6P7j%BODIXPVNQnYlAdFXM{u>QnVc*<Bq zv%9vFZhDbMI)Fpo9-q4Ghl-2#0p4P+dmm9*(`Q6edmTQ+La0eR-g|Nx;}wF>BFe+F3|71Ab{t(`M~k;f#z2TL3@Z9=)1mie^M5)Ewu`@E9a;Kd;3h7B>yu0PW=ij zQDrHgc`bK@Ox%|ilWcma!H;7)*IJF>ul^FM?9m7@^8_Elcqn1SykGm0trq#4biO5x z7mrJ3AY{~zFOMIN50BT6PmgcO>y>8GS*m^$(IvkLyD!cSHR!s-JDf1+vd+!*HP;ey zWKdG7t1)((Q5@97rd(hE{Ph9cUYBSWhB_g`BQpX26pG*P93GI9UEee6bTux6BCk@T zC(Hum8`@GntzoLg*!O4{IW~7jm)$#7KBXVWKZ)^WecAKM+DrDyI!Jb7V=Fx~v6);J z7|&&E#ZvNY6Oe!SD~IOd*;IL9awcKpGpYThEL!zjR}H@734`XV*<7j7kTPJApQIAy zbwcU#JofgRNK{Lc2k-|s(zE-~(ZV+K(Z`T(m+Twa(=QUm=;%!Z1nX}%Mq*6Lw$31 zZh<-cs;d5HnJ(nYkI?<-I_~#dPrSglhrG1bs9s8wx7N(S&MTWoQub0_$bTyJ+-#dW z)2|EsZ?6}4Z+7`fr`Xg6X`Z-|4|0yPgv~+M)@XMcar9D&n&J;o*myS!oACQ;F)lb0 z#XRbWjP=(z>8uoNj^AZ2#DMcS`Pa0R-WV-P4oWKH;2&b$nL* z`)uMi;^eIOLIt5S2`}%j7Y_7A9L;Su&I|mvhKg*59!FY-@G4|RX5er{I$ZvkGDF~U zr8=(+bMWTh1%cMLz#zUit_a7YcT4_^lf+YANK@4Cw#2fsLexy%we3yO8lfphV z^r1eLKxbLXe2lWOisKSdr4Q=rB5tt&#l2jN_*gldcmDtP!}nfMFayf~E*+aRbu5vR z?aswXF_AP+0+1E(MeqxY;Fo|V@ZR1*@j>k_0~?d(+SChL(I=2^hp?lXK%)@xsm8I& zV#a*x*)hD#`4967g%d?p-74)PQE9umhzRNia`FZR3X06ZFf4Km0vm}0y0;}4 z2N_*;0He0eYOSGPr$|3*32!eoR8;SCrJpYTo#rwlS z&D(k68z8)9+0|6$4N{!Y^zr{N_ZGlyHCx)QA+}?7A~Q2HGh1e6rkI(Tnc0q+8RM9l zneCW4=EThWE8qEM&YAkB=1$$JJ9En_siob$d#zrrw|B|CpLK9ydU-p1`sTBLgK;(y zQ8CS~riZmf>@)z_Vo1L`9)JJ3z|>&qUAN7dE73?})tmcjfqs%qMMKkQ(t)$i>IyTO z@!QmbRxMWI7in{4+K_nUzB- z*;`Xts{OiGl45Nd#S+LyvCo*L?jPcaF&YameuJ@1%+@oLb|{)e&u5u^k09ilK-BAf zR-FwIH*hE`lA3Ch~NO8Mmt87P1V0Jm4<3X*#>ANCZaob;p z*T@Q=c(su?V=q@K)3||+OJnml5O(-_nm*Sp1n4GeA$5DXKR++kTOx-F5vRfz0=k$ z3LmOdKaY@2njY-SV9%6GcJh!rYo_dWWWjb1ctOw5!&wlQUJD^nM*p z(%SU#gkSDk5nv7(I4YFVDO*91!)`XPJRWEjBu{JBV_gw%{odUW(sD8+C`mgc8V zMgSW7jf^=^s!eaRMs=P%}2F1)AZh^$;A9TwmEf=``q_1_OAZ>`R-1&rawu~ViRetX68anO={~r z0X1&JeolJG=%i<|^VpaTi?h)5*PAY*jg`u#@mCeO+4ydf5kvSI1Vr*;=0wHCl;--W zqDHB2GJzEq78yA3{TuYvx)hot`nG0vM~*ztXyT+faRT}-4lMJX4x1&nZHSpGeBZp1 znPt8mk3BeKrs`V`-!u3XAKmfC;Bre2VW>JBJXy%3FWh+43pw86^?I%MbQ#mFIl zqNuPyZgwS`GxYc~ji1~32;N6ej?#w1dLtRM%bBON0cW+;IC4By;Mc}jW|A&4S)(oA zRhJSF zL&Pi%`GgXr=Fh1z8orp{JhS)M7dzmh$V<}$_mC#h^Cs4L(|%E(=j8JFfv~#|lT~Xa zF1+8$tc9N+qlzke*wgV&^dAMO9oel8n(nb?oDNPps7oE6qza?w&SdfZ`BO0uiy8L; zaE0!@Vk+r0v4bl?A~YsaTuHZ=3d?t*`9_j9TK!d}y=B@o?Rq{mXjOHHikc22&MERUOh1%(~bGYF(N#h_4g9notS41%f%vHi#Su+>tT(i zed32}k56Y(WV{v3%a0U#!He9Q75Ptz-rw#!3Dz|m>Z@e8e!$ogwA6QOsHs2uT8LEw z8zRPAT3s$HK2;YFN;CY%&*g7&TprWU!9(P(xE{$G5USM2owfLKU$py!!7!yuH)X`d zDUHSEI|+BS5H9l|)T@Tk=MujdNIe zj$$T*B~oUa>a1aD`#CmE)y<;kq?1-7ezZ@&%{ZLR4|YCgv!|IeI+EhXN95XS%rz$7 z7V1d53#^knO*~<;McF}8{>qR0)EqZ~20or243r4CY0c(X=%gaQitKRR~#$`&Z9Zhz7$iE*PapV%A{K)|z?^uqntM zMe*^8eCCWCpXz3BKeK$MNb?9)jg6c9HOofbv)$mCVqr&Lfl8@zaVq zJUfOsVQNAvCv$tUOT^M?fcL?Hht86F9R6gK?bNijDZx9Y69@for_;F+B-AJgsm}Tz zI--10I4-|=T8g;Z1x3^63@;fboUoE`K^yHS^1FphHJIj;s_P`CS^KHy@K^`noFa>v zOf^{M&+Ge$U-?<8GLQ9WXy^2q``K?a<#M$R%?W>f2~o_s{np1kSTCgZb?GAw>Zqxv zVG4G=S5+Obx&Bm5qtsNX3Jobwm}(jhW=y)+MUArzgxMBBy2Exv@m2R}Oh7wGE-J}1 zgqh1eVWgR$63R9Y4T`U+yw@<4LtKEFtW$2NJ*)3C*Wa)T{gr+^TvaC_04goTo4sOR zAprIp32CCQv_x2NZA;9w3=?wfLJLKCRyk>+T^q1WIag`@y3x@0IWl&>V!sY89C1up zAG*-cu6k@Ca4@fN*@TGkU`*P>E9%)9gedCCe>Ut4&AP>QT(r8VUE1DKEbJ%*dWa)F z^1NJ~OU+OEDSFdR<|(zM1Lw>$f=i>Gl#zLBCkgC^4rbB?sC;bR94 z5@_t=^^=>&<;SPTd1@IvWY2y|*oe^?=B^Pg;53fUjFC35L;z=5ovf4MnOD41iA`vQ z0pEOe7t(Ee2{3L&R?VvxEy~D@NQA@-ZV-6K73JarI8fMpS4aVT1gfEzB}0Flt`w`ue3Z7d6-{vpSl6Ej=3Dl*A=@B_rN#4ACps z@``sQIs7Z6x(gzc-QdAjof1;hAUTf1aSGVnftO;jRZ^#g=7M0%VF}Av_f}201_mv2 z+cEcomAHqr`(Z7Y@hUZ-)}_+-)6s*hNG4DcY0>IW9KTm%}$85bA&(o3?&E;_zVm}-%r6^}D!9G7gS zY$@CoOwpN^!H#i2p<#3PC632v-Cth#(X3Tgr)AQ`09UI^@a0*|YO1uPyU|nh7*16`j$#!Qo?m5c~J2}vq94dtORCUGmm;c0r%nMIn)=Ozn5$; z3S_>yijHbeq`Vw*pM19jRHwJDw)urbHx|*}h+pvZB{$gFT4^0hnm*lhH_iPhuF*zpqV*f7d^?Bi<4ST`4Jff5h~847{(c zX7eGDs~J5+bXU)rVYgAnFCeuOGy>xJx zcYv#WZ8sn?sq-X|x>^?YpU^`7P&@t`bORQ~{|IYIkhKe9Ly^}6_miU zAwzneS@s1ZEs0_kM(qpm>o#!9ZjkWLdGN6@7I$&7jK1UbbV{=By%xgRH^@P!2)MWZ z5lTj-uJweoqaB-VqR80%>$jox1mm~*Jzh`b*_HN`^H|H1odB^~xq$hDF}GY7oEF`x z*U(SVhfI~!H3lEkb9kQTVtPm#PI1t7S8JcQAC?dbTWlUo5k&LtOSggeHCrMNZEGj6f?+{cN62gRdpMP(wNx!Id zaZn>A7m&LEH(7M`j;>%CoTyWkYhfzVllc4w*!{$85q^ zdwk|y>ocvqe8I+$)BXRGL1+8tp#LG75Hctjnwh|Xa3xN5E{?_~PJh@X3XXQh$|iqc zD+~&vKoGXY#N8PLJFx-P6#n~F})|D5HhGLNy7bkBBV5TcD8roW?(S0a5i@_qBpj)VGy^ra5gp(Zs~o$sFVY1Be6TqHh7>kI>uOnh7`>y74(X zx|mS?asOX>|KsleJMUN+ndsR#IhhIBSUKq#{}kBSSm;4W5|+Ql@n8D*|H?xOHnah9Fg5}Tqzh&cpaR&dJRsTPkx2#Mc zehmno!}QP4{?AQY3tJ~=Lu+f3FaLF1IsOC^4kS4Ld0hV-{@;)5U)uHmq(>kz0nvK? zk|t0Q#4q~0)&G=A{Uh4!jBNiK(RQ)_0@8Y?|2o!x_)`BxtpAMHe~9%T_5T-5`}4*A z51=rRI5^o^8#;kj8{7XLChRW@K(eA@2hv)ZKbk z|LGNI+Jd~4GqeF+0sPY)ptYfy)1PJXZ&DT)6W2c&VE+Xui=C66ll2d8>|Z%q>?|OR z7bl3G1;-!>k_HQ7AzL$R6GBi(|8)Crlq?qJziDE0pldu30F0fHi;$gz zbFut~>&oAqFy5%DYwW&L6X_f2E6K7XG4UI;lK!Mcp9mYQg+FJ+3p3@D-_+lb;}yYJ z7=agwiV6xY2OEJwsfa34LAauzSin(!3>S2LzfWgLqW$FUy?Ot*dH?MDZhe>WD`)N0d8`o^jO=r#}-g>Y1r};&S_RqT?U$)ye;J=xdF@^&@F8 zxfluQmpd#i&Vsz98}^Tb3&1itfT+vT#`Ni{u%Q&gw5eMHDe=>)8&eDZK0{|{$D_H> z<9Hv+EP<`q02LQXCtUNG-A+!?dm&UTu3vjJirj{)WO$8AbNL`K{?v^tzRID14CWK3iUwQI%As*=-!R3R`X zFuPl!DYdJy(8*2bd^^Yw2n1Y+d|$$-Mqn=#Jq-0zqG%VVpc5@ zl)J1?-Z;d%O0pD4ZSGRPxaG0iz{FN1zDcAwuYONUcmv%#x>|9XeTDq%THe_~tSR#G zop{3=<0Z+tT2&BJ4q_^#?MOA9|GYjUHni4tl;X2#l9mTwWy5R&wX4uR2>Xl2^8nMs zBk70q8*ELt&kh1#a9Ikh(FzkrLq%vlwIV#EWm*L{@L7GK15$Ovj(Lb&(3h-mF!+%y zrWgMbs&5FT=dtYbS4diwPl$x{S?}&E=6KtQ@bll=m7(_3huYco74(-SY`iA*$xztI z%jBGqW)324EPaM5JQ`bttr)oF6|`fG_IdL0vMy*35zx;+ydPQTkHM&DQ>i_3iT$t& z)w=U$^KPJ?cStHJDdo4IGJKcSCi9^||Df191j<23GJjD1`E-grtBn;?mFz zTcclF;_%@?bni}WJOjLb7L!&rS@FIn~Z#^NX*)SQi*1D+%MdMNdcAS z5=)$UUoE7sl_w9;(mw2EHuDiGt1~t!OT0B+pkF}~ho8$TqjaiLWp5=(;->QfU}`Sb z<@~7K(?h6<3s3Fkm{oT+c@^pft4+!(=Ir99CxMpmJC+(b@aEaQ(=^6$Ln#$Da?d%d zz^!*-&$gVxI~exR^6D&zl4_qe@VABgzX;e}A>3YUd5s?PwnuInPKin73x^8B={PT^F|4 z`m{?*M{HR`sdWgu^1uOc-uX-qmMq3qe!hph$D>fG#$b{{;T^eYkGEiq%u+X_!h)@& ztLq!J`ZuEAV#yw=9^`nr$No!Tg&MjS_Z2=1FwS7^DC~Mi+{sTBs}WIyQQKWyC^*CDb!FDY|nl$%AD4`7f34IWM(yJ3494euVGi&J9REbp>Ay zBP{`bf*Dg_7p<5>q)p|FV7m(~w1Nyh#Qr>BWBow3sj{J7euO2(B?V*+-{S1^?>FJf zmkl0IEs+&A?LQp|XL@1p0^wDnl^y!XWctmao$=f;x6wzia~fQuJ%k@@&{o|mhx4LC z5P!Ee@X8GLo%fKaCNruee-CH+q1#$p08;$ICaucj09&a5_6qD+&`Gv2Tv31j79melv|=(PYWR!rDQsAitRup~konepG|f zP0E;_?!ELETUX0Lj_7+Y2?UyIFUTX1ru>?%@G_94;6~aszIB>o!Yrv_`(!18UE5I0 zjm({03EbwQ~7 zJ9C)0aYy6jBZqN|B;;z*SoL<=)9XJp|eGYjf_ z)t}{^R%RHhk29W)ylw9xo#ngNZ-_i%Ki^8Wj+UL2*Y;c5paab~n+1vq-j$aR=NJ}h zmMZS$c`~^xn&jciaZB+Q?sRIWoNgE1%uo9oyidf}%4C)}8yB8U5S-rwk5{1<$8KJP z($$$qjSq##GA=BB2CO=@jCZ>7i|*gi@1wr;H_hIe-_Vjqtb|=t6jZfmId7pH1!B|B zTv<6G0a@Z^L_T?RgNE(qFee>@4 zqf~MPl(!Ovs9)h5&zY>dW)v z8y~fiPZs!Q)hl$uz&D6~cYLshc&^BMu9}8jllCghJM6ht`2cy;N}-FPr@UlU$3Boy z#ak?6$w5&5s|AJ@ufVG4nO1;LJI|!x9PCgfd#&Qw&p}eTnHljmB6eCMm*?1w_vC2? z-0BO(?_=D$&61zU`4rxdn0J^PI*M{iI9J|lURwE$d?dF`_yztK3QsUV{}U|`^LngX&CRuPS`eH z+sWK(Q>gTGlxBHYnenY^ZMZNfoA`-M8={(P5I9ks-u3Xln5IoV(uaef8 zy|P1jMhzAK7m^oRRaQ`qD=n6O#^K8e4lmvAt{k2pYvhHJpRe6ezL39l*Wy|7h07@s z4=c@!#9y$Z>XQC0$vyQ{p>RKOVeTp|z<_sLLhzXW%}t$1C&AWm(D zj4ve>*^|eDA30K^|)`FV9ZBipF6!IpTE9xY}JgDJ>_^aAOP0PT`p2LR?@E{H5%s14%(x0Q{W#8G-G~1C&i=?$VUKON2XHVC zGB6J`!-8o~BdS*j&sI5(8qF#FFST1Zwi;$~Q5hI$OS3j6pk zR*#fwX@2Qi5d&{`V+_#RWz;F8Nm+5BfLR^_cF_Oof%Hce!WP8_B)y^m_rYCrw`6HOgPcZRDED zqiDIcHA+ISyxC3-(>2GB!3SOyzU;C-_5x^(soCn7N7yn{>d#ebG*Km1TAHDbv7yxc z$-Fn4w>oGE-S0jjR@6AE*_37Pg;o@vZxCLnhpM-a7DZQX-^%pX7TPSkbHDfQUu&Ma zNn5rQQK_woTvzf*?(1Zf^V`+HVOCCQQ{xt0Iq6m7W{~Ho_@YY-;4Jt~i}N*?b9T>9 z$*`IqmJE=|JV$FhPpHpRDOWS-_RoEfH90YpTRj|KH48iFw)jZ_L3D^E$XTx8XMF4S zDf!m2zRmZv><(5pw<~{kcBI|0fglM_SjBX`YrIETciGe_LG^%NgDZSb}@U9Ip7-1yV{>!49J!lGX+E}Pyf zLed#bN>k8l<(0>VXu)qM-P74)gKmllo}cK;fSMaKG`*0Vt3H9B5f$!ht>8aInsZaH z?DVg9%qks=1>QH7AQqrx#cvg{Ek9z{sNHmEjl!u_KD~=A`o67cwR9{ir>kHMkiifj{%1vlaDQreJ6VHSL?hbVVL1vE11*U>(xS2*#YbXRXOp*)z(D&Z9#6 z*q}}YU3NZ=QUbaIZHZyh@`QB?AvXLbE;SMmFE8>cEF#PzycWiflR>ab*C2kBJd>RtCM+M~OYmfMl&ugp zY7WQpgI(SpTN3>6Kl`{DYZG&!SYjcWMX?y@hAcfR)>hIFHJ(Z1YX zRPPk;@br)O-G_GLbP2o!U5M=Dh7lmYv%ffse*b7CswFBUnj8N1NrV^&C>NEZw&iC$ z1H2YF%kS>rwGS*NES@4)nLynA{UYj%zTolc9hxbTGm&lp{!uueQD5Vu3y=s#1UDZ% zzhq`Hf5kG}D?|=?1J9H5rgG+cezVAVdiMxzbf~nIDi$8C>2_PhJog zS|!D@pT!VDx#Obf{kfm*SosE!eQ?Q(r0K$E4eH?vDed>M3 zVf#yM?XiniqZjiRlAxpv;}|{IwVe+60f}ego}F{ZMLhm3m1zvtf=9x0A!ryUx-WX; zPKH~Le23#xX~fQrU5*6yzQ>QfAG4>qa$We(I`$n|5&67Me}{ZO)QJ6Vm$L!pe*L@R zd*yTuZ~N!`+#yIfA|NkKR;%y9NqX*-4lh6yB%?yT98jgfd_%a++@W_TcEei(nfbmk zE@3VdD04og>JYc31hrAD(pt8h)|@-&duo{>En@A6&OAG=8@h+K&UV|I%bktSf`jI! zR7-~&hdnN_&%7;tEl%$V`*WB@EN22OTMpgo4t}|PuK}LwpOCI(kz*zCk>q#FD_5uR zNnnL<{Q=L4jG2hL0U@tHPjiBX}{u*ofC^;uWiqN7SaCmn~nhHeo#yAI?B`# z;(n+@f9t0foU^gh?ceKi>tW+!A7HluHxiUu=x*zHhZ3*tJ^7H}42nXiC3Z;A@d-;6Zj0ZaLb&EJCo&9pm}5^^wK zZaeJS;Or=}&0$S};UcSl_Tz=Wa!>Oc-1kxJ2K1NXU*>$P;hR9RGE~zz-6O~wBJNP%nbB6k(_?Oe*Gk0fOG_(93@$P*m8rH@#|7_JVjr z61g|?hO|>6V4LJ2QFt!%hRCN??}MwjFe0-*0%=e%7?DDmByQ{0ZilmV*`AF%)C2%gItjxM);-()J_dJL)CQyw=X^CPd(0501i2^3jK9BO|2gHjW zz#~c~%!JdTU?*V&f2mh67e3pcff05j}+_>D{-Y7nq`$Ttj@v9M(#to}wmB{zl+(bMlM*`_y+u zbd`6dceQqf@Qc|Ep4!vfB3B+EWL3-mC_UCbnZLz)lJTMOvGT$3(e~kaWqGo@-8$}G z%AL*q@t!A8Dp1><_pa!t_@4BZ_*VZG`Bw3k@n-hQ@bv2m=PA=MT1P)N<>#KeZ*3MK z#Ta5s+#YFb{(87y+SW9|p1?Npj@hI9gS-RxJC|Rwz!1Tq{7B4W(hJoa>pR&y+B@4j z;yv3t-80^A z&M*Jm3{R2(fZQuF`fyGdZqWBB=cA}RDKP-jfds#<I=dz08Rr(qG?fXCWOT0kxn_-$@(y@K6Hmdj< zI*mQFZFk}34tT@w4&nGo=Z@3#GszuRFH(PC{6hM{*v2nY`51jk~-2-GTsOJOi7q%}*^!;8J{4eyr$mhc_7eX)m zZ(x4m0)1f@hA&KSAN(Q(`g4CWT&O>w^2c%ydILd}er4!<-C{Yu*O z>F0nmlh6bzPIz^3`y9z}jtc!N5m(W3qVkh6a1Ihn8rek7nwlL$d7#M%@7uSpwCt#B z5iWzG-%^%^t0;gGvspdIoUtOf)1Ty~BeDis9nP{~%(lNwC9yb;>Hunpmi(;-*bXur zCtD7(Ql$6iT2O1CmJ+4YVjStFqQ>Jp_Y_vN*+=>7HSbdTzX+@lFU4Dpzd3RqPMSFK z>(Fos#>PYLOK?flkid+)>}NRgaf!wzZhX-rua`qd{P_iWMOiAfL_)TxTuIpiJFJzo zJe^h7l72E?OJZ7@YEEVpjwVXQqA8htGC@nqso2>fCz)t6jk%b(9F%(9lCG1mF#%o5 zrdUjg$Ku;fbc3iR16>NY1cQ|395a=+r{q|IUaDiUdQq$r#j$Gn_XeF4;_CRE6g4T2 zIV+{E2B{P3>eNMvjiN>+w{ndWqE7nT3T z=@SNq9qJTLyi};%+R*hA1#Dpek_ECDo6saOZrE*rCRic=9S1FQW-8o8&W>zgv zacq(lN#kO^IZlgOR=rgUK8j8n+4#*Qa;fKH$vJR~dgqzC<+_2og^L2i^c}K(!hVB( zl%UCr`W>|X%Fz8#w9u5$C4@?ZN<=FJE5yOjCB$C{c9@Geo2=G^bdt~(Vp>V;MR*qS z^%6+O65L7jq;VY-6NJwphoj(zm z2V;zUG9-Fb(GcYapeId-knNS#MdJeWh=)VcMqzi*u0k%Txu|F2o5Wl2+M`&8JX|!(qsYRrTolQP*L_HiLd%lAsICc7eYRIg z7f7w7$qD0q_>N-B(lv0;BWydmSKsa9Ux;yumqO%65O3Y1j1u&z?{!_UJt{wh@}hK+A%~ogknDKf;5z2Pjzo|f%8Z4u z3=n0J$?d>^!ybO1&BEZ^3G9IvfD>(@d?D5OOb@RfT-nFg@80iph2H<+3`cLfYu{zv ztt00-2cwmxV<3CqtD{W>|aQv!l9) zz!|oF&~y6zq3;f4%P((2w;<$Q+pFI7T5s7i5X7o|aB0`}I)DAVBci=Ov(>93R`5!7nAtJXP!vB0Uajo-=z5HapAe)xe)|WxsjcN zzDD{E{>$RO8Snw}krV^-yAGGh4G#2EOt z`@x}uQxca#4mB4*A>FG~hDw}XoRKJ5K^78W7ikxPGf1}!?eM)ta-I6@)A)eMuHL1{ zCEg_olf1XuZ(>*U>tbjn5-Q;e3bIIyLAybMLA!z60ij(%hXzh5ToN&9MWtwW@fY0= zs!bHTsP4$?f!1AIhbB~-A8EU!$fLTS$vQRYxk))BKdXn252_EU4-_i}qB8tQv6L1{ z6oX6d8zkE`xYp2)qnP`2tbELJ>~vh_EMrUG+{0J= z)15cRpF&dq0`U@z7X>*%Zb!(Su}QM@65gFChqlx{^U<`W`vx(0ymM4GVZH@x{d!%- z7M&wAvww2`z~Q=;*cN;%*(*SMgl-qzNxG$YJ!+l#jO@(h4DC$Sma92Xo63g*#Od70 zyrwJqK8Nfb=`6?1pu3G@uUkw|95p9DM|NEAEY?P?o8+5%dgU7Q1#|3nhg*6ngl7)% zxa6ktCevBEjqa5mbdTg^%;T4?h;8zhsr!BS2VZZZt=#iTpB|e*<(B)F&KIznVEH7B zk=pTJdmMYWSD9DP9)%r}zS5ht@_Q7cWG@n}Dw{;-$!??V`)+&89&sIMxs>NgTPa&V zDMp_6A+LmdJ6^h80$zv&&T-`dl@vUzlSjP*{_pO`){yBvQMdy#ol^(7Jr@=Mq6kw4Vmje015iF)Dn zh3ihv9T%AH?(6Q6|Cx4q{W$va**Df({!OHd;hjn#o?t9)&vAu_2XVw7F)M%rCCFd~ z>jpZ3U}EjT@WtNu!A-v) za|zgZ{@w!hdso_kV>4ZvH_AW z--h*d2?%Z6mr{HAe(>^ZTO$bN59ySGwkbL1f?`XcQ zPcjYvy~oY_LONwVD7lI0O<4j-C^C*E4zv4A5BTfz?de9PS=`x1+rgpB*#Z*>1y5yv z?A>&O73h|i%8BTkREzS(Wc0~QHk-ut7RCOe#Acg zR%aHAqmir_kF=kHxtE%n`nvbkT!k1%kk$W7tudBj;ID?B$etgg=1P4;v)TNMQ(rYUf&j>|2%e5nkIa90E z$~hYuNP&$C)mA`B9oixWT7M~og30(Kv$)3Sx@WC94Tz77v;3F~O!A`zrr)2N8VUpX zE$O|if!sgFlND9sr%;PbG##(*@waQZREW?Ia?=T#i3e=CeoGJ?OHDMpdJroPKrp1B>d(2jp zAt5Fyl+!`5Bs`PME817uNAx-(D_8t#92=`*zcrVJhVkQ!(winrvTXcz=13ET6tWb|-LX6Va%EPG!EJpo=UVxpW9m zClF1@yp?b(2Q9_!+kI^P*YX3VSu$cr7B^~h*g_5fZXVh986)Nl<|w%Fta&et6pd;z z5@tAP_J9PXFBbF7BXdl(nsrLq>m5|RfO7WDGCbQQD#XZL1+56E>2a!WyB>J$2d7NL zUow`cYEfNn>EP$Cq%B2sHt_*6uu_!bA{K<5OtUyzO7!dDQcv4_YQZHm-$Y>*&YqJE zi-IGxFo8Z}oam-skRuiFzlh-upr9N7Py&1eXf8Xaw#8;>1!I!LtV9`D3Q3WAr4X*} zscF_ls*Osy4bBv?mZ1vY32VU?;@K|a!K4YMw@TS#<>(P>2HjJV?N?Bhib!FzcM>D8 zmX7Mc1s;BjbgQWnI;`>FSw~5()gcnY_6g91M)*(}h(+GNkfyb__Yxom^|+9mhi%Y# zG307(5%4>!7|OiL>HB!9uZ3$6Squm!e1VEyQ@G=a3Eu)8I#puZQq}`egEgdp4>x3e zbJ-xFoIbxoHSNv%0PMm7s=Em;@wTHv&1a)*qR%xJQ2KAH-5vYDmE)H=;ZIf~+s#uD z04vl8NiB@i@;*q?fh&EX_Bi?&EaTI&2uBzBv3FahV2uDH^h4qSZ6}%@ULYp42TcqSPTR(}Xs$ zAgv)H^omk8w;)%TG=+n8^K=7OkAU;MYobO0)D9SE>M@22Y=d)jGyt6%qKkT9RHW!V zg_*%AS(`d2B|*r2{`Ch&HqOCK87$|kh6cJFZc(aeGry*nLnW(tYUdhe=qoV1zC3li>`4%*VLP`g6%ZA|K6J}t+Xn53 zw93-LUIQv$n6)xAj>JaSBMZQ|%Z)VrAA^3(3bAy?QPpx_@}PdzR7lno#i;gy`(dh_ z`-K4gRwIFto)MI-Nwm^9H^+v0gafU|2<>n$eX^GkJ3#i;aNm-uNLh%zQr=bFj0JKRrp|QfUfer@|9^ICyW0%pJz*@!DUpPfy`98x|j%VGaqe^boo&SK1=Pe65&9oWacZ9@!jmC5RG}cqe|0K z7YCZQdfZvlMKI@-F*1)$J#vIfXnACkGp&r zFhZ5CU8k0K#y**-{-6i$A%okk4A*0mugWFcli{xd&coK554)dnp#Z=)@5{}w*9W}K z1bb!Js{_u=`_41$wE?ykeRdfamE`LS!8jTAx&YtV;9Rzy404?x!8956ngDu>KKTrL zMS$-@Fnor+9$?C%4>`kL4KQWicb{>QP3~O@yJg$%E@H`lF9z#o)F}g8&4tU!lg$Hl0ZmqYYZ-N_fF|=kQ(1Ru0J}vW zP_EQ3WKv#h%! zAl0((v#drHY!s_uJ~^sIpSSGSQdlQ8!&vf(#bC`0MrDAhc^|9n*9ur=R>OL7nYm!t zjEgMt=%rwX3`QUTXw?TI(AL2Avl^C>FS8nklOrq!3uQ1W0HDo<{bY|yVSU*0UAX;4fGt|!Bw)N8#SM0rhs?H?78NYc$Q%)wI;$KDENmH>2rQ>x+~>ZykGZzw zK+bd|Jv(IrhOoyhF|7aA?nYDt7dQml%H7bf>ZUGJNsDz>2qnt*L1!oe3*@-dM|3 zE=uy$n(k+4id0Uz7bgx!5i1euSs3O0RFKX)UZVCvgwMLU!pd08`ll^QK!JGbBCA=d zgSSO>oq`4%V_z|mi+{ZE^5{r!S=KBG5Lwy^2+n74Ls9q~{bt}CH>(SDlL|5p@HKPJ zoTUSHGd-ou$^tnsb={pB4hdV9QgoYu<#5Ta%a7wH%%JiX7zwxm?ipt3roH>7?NAv-6M!z|G zp=PuxvuDmM0&pHn)|fSA78RI;C2Pc*F#7>G&4fK|j$8OGdWaEw(j2ugAsWbtJ!Otr zm>+E&9m(p$z;XdB(eJZ6@xu2sk~ z^F6wa@noV5P#7ESh_%l+W|}-$23dF)onyEVtEdgM!E7{Lh*TsmL;xN~YcWe1Cy$Mc zQHChO11GWAj2Ds>0l?8{?6jv_Xv={zqC!$2A|_etlL;glW29MtL$ndr4>MHd6L@+& zah6ExTUeNi;WFEDj@wZeOflw21JtQ9b`tnPMxZIMM5&fEPXXA78Ip`WA7IH0XNo#N z8LtRN;s<2Id}O*Z+3O$4Ou!%^A(02-N3UbGrg%0%GBYM(Nk)qTJ%QXn2$H^VvjL{Q z==dM7GCN?&koe&E5cptkAJ$=Bz*}Hi;9DRc@a%Ey;V*Eu)q7-n5PMvD82od=m%!A) z)xpxh)4&8kdHj4o=zwLxWI?`wal&&#KHy*AZEN>%_}7B#gLmDGAo3w{LUF=AK-fdr zdm+?82D^jYgzSJ{hFOMRhNOh- zfLumghFXSQ2B(BdZn;NlglvLr0^fwThO%~;M%qAlK{o&xkQhL2%l3Ho;P|`vFM$vG zH~O>r|L|7@?YuNu=e6>4b2^f0-pQu{8wan2&;##4aEGl!xF9y5GJrK;GDyg$bSBz{ z@@M)O_b~&1Am(Eh{>UJ7(T6Wk7x{1B-l*PQwBAqOvVI6~vO2N9tlJ~j8o}m7y zkvX5RF~j)YzH-UytIFkux8^*icv4Q)|=blzJTC?^8Pypy(p2z>2D&u zYpKWG-S~zV*SlktCM~oTNs|wfSA|zqIV9et&p8)-=h7w5+eRexPWbDF(XrznnnJNe z`kBSucOi4!zYS}}o#MZ^#zEq*gU9{EKjd|<6pw0{D4R7Nip9r4WAnT@+V;j}^ZfmF zws1JF?EP8)!B0EjorS^tX}02{E;F8D{_FE}Gue%CUrJ=hpHGB`4rAH*5t8`wJJI@CJ&3sMVW3)BPR1~EOdhHNL>*`f{51i>%f2cpHAfzBMAvg+hIOG7tNnzJJ56Qj2?b!R)|7q^5C?PS! z1Vc)fgwoQT!_XZPf^?@e2uO-_gNSr@r!a(c=NX^9-+dl^&i;J%KJRX~q_bE_-wuWsh{6v0FN59w#v$84W+J$dnp zR9*?tHEtk=E#{YA2aJh?BZS{)q^YYJbx@R(!zCDr8s)Gj{Tuz#a67!|G9{3z_PARp zAy96t!VfSj!nrJZ>b&w-PNo%lrq8Geet=&O8c-(@fU_OmXO_2sKJ=PiaI%>woyln$ z;nwFNo9>sVyR!N6C|o6OBbf9GJ-v!(Lp{nEuBDE2R3lf}@`|+1*r(;nX&TVL^B4{s zZ|k%kApEA9K2&y06B(#BoroKlZOF3QOy7`bh&P3Y%!%!^NV15yJVGW_{F+0d0aT~pEeaRkU(R-H_h$SUS;ZtMK=XM&i{q*s=dtllDoh!xBwJMI% zX~DIwL_uD_ot^AP-5fW(z>KEoViG=4KT&z4?*~B=FY(W5p!Ep~(5O>|*D%|>t z>2rnN5<Y0+fA{D`;dO*F8 zMrO=D>bv5W@BU7O>^PFG-1aDThDF~{9Tx@0j#;ENZM<_c+LYEdMl z<~H0J{`B~S1^tX*(-z`z3HVvP?H7E&2Ygf6^9^yfk0(7u1s}H4$*-1ZjTZN|ub&`x z6ubxtZxkM$wlF?C)ni$|vc`7;=h&IABuQ`?ync#tBHKfya4n->ozyoyO}215^npmQ zLjc9FuhI*R?hUpBQ3jt5J?ux(+D|+6sg6I5tvI88`Bjju@7$!Q(@nGnd*bTIiClale2n{*j!~26@K_aki{DE3(cyur z(kKaGl2JgfNDj<#YNb3W5AR~@)9A{b^^-Gr1b*#_HQ8O{z2dTj2+G6P`oj2LP4BQ| z5-``+Hd7J?J`sD_9I3Q(gq7IEdvWDX=Z_V|IsLfaZ~oRUuwDLH*`38IU|5w`8b?@m z`q8Fwk2}Jrb@5&Kb3**LPq4k|Y(>BdJY^<+f>UPp?c0q;&JD^GS03!r9~)Igk^VHy zK^wVlOqJ_T&NR!VK4$Kazt6j;7o_jnNcUC$82Fy3Bq3QfGtkdZ?V`!vG-#QnuLYai zSjV@et&+TK&(lh|zlcK?Ny3WGD`0D>V{NTD^hnTj9<(NV9Y*B4ktrp8ah~)t)Wex} zUx-1#Ft+FDvhU(lbfi$jAI;HN$h8sAZ97QP?xx0=XEd_%Q#>#|uNW1wPZi-t^i2nl zB>X{lUP~q)V_!Y8NR{C$6OCSb72npE+Ee$2URP0o9C3>y<6)g!-&-tN{T*+4mGyR6 zp^f7ssK>p2Sf?S8wc_ns^(9tS+Wc8-?pNk=<4|_;??rHtBysVIlsd0Ny9*N|l7_<8 zw(hQr^O5~n-Ub)M>}FpSU54IBe(}SvUby@Z)1Ai%(Glg+Sew;Kw%DvigycNZ@2_du z$)ja92IMnxERLlQfd}((G)^|MdT->s_rHm_GzqzE=Rw&JPbuzBej+T%op1III~u9U z-3M|6pDSs}grr~k#l(DFSz#`XHb8r2z4dki7hAhidf4T2OdbPsNIDsh_eg&i~=RsB5Vj)f$a_<9DdkZqpm=wWQD1(GoFj;yzBQLw*K4Wm8Q zsLCJ|200f0oDZyMF+^sF=DUVcKe>ANKB`+`GqZ?6=T`5%4~8Mq#@l%UIxh(~N{_(J zD-WsQ(E;M>5y<;x#(`|&=idDw7a7j-rv6Khz-uc(6d5$zyqZF0*GW|WgoV6`)v{SxJ{h*mQ5_Xdr z_K_NXN)CeaS@ql7T@)U#9$O_He$B=xmpGJSbDk3N)OP=X@cZ~Q zd8KhQtNUx=F0P4O2=(+?FQ1*<_#F1E_SU%d#pFn8uWi1J%%flPc!f&xKgb2fZ(vp^3zwW5wX%2B1nOHS_&ns zoln#rZIaN3pJuo;Htsn}lcjG2LSuw5V+HV8ncA=#X3+baZE0j5`=xvyG+e04i~*<& z>JUc`Xr24xlaj06J|G{F-f4Rlch|Q6=p`KBzj_FP9g$+T zgK4G!sie8?pe9+h>VYwU8KNny$YeV)0bF1brQK&w=~|w#eg1w&c9$62@F*(q>y6`zAMk@Yk2^2 zzA@u63}Av;K6D>Iqe;^+O1Y&K5S7nPX3o@50ruGAg3|U?+8u`>IZMPgX2#gso!|IAQSGabQqpnh+kP>}K0xy5&ij$@DTWJtJ2QaPx)e(ilOtB8kTFr{}S zte06wwA-9u(Gkh(KS%yK_F)#ca4!jY|E-T9w+Stur4YG}V=%`)%&ry~n2{KzI&aIQ z)_s&y6~9F0Z`?Nl<|~%yIaaQPyuYwdJhQZ4kC-#-w#~$N!u~p#5@uttE5+$zu4<5S*t8B)U{lk;QyinPvho}Vs&n!?A7vb1RuOD+&5)oZ zeIeN}rGsu%=e3^GWYS}l8rCN)?KHz<$mb?Rt9JYGVIKY~%+c#R-=f}M#6zH2*K|q> zo8dv~Qn}Cz7XQ%>c^b8z*>#$H|Mr`2Hs6^w#>LjYS8`QMz2r35IbB&bfKFo+(WKS~ zLo2r4$IWmxq&ADaeLA9cmNVC@_l$HAl_34@RcVm*VHZ7L* zP*jeE)q$dLQ{^iUZVtki)h1ldu7Q~$_0?_=M#>a-(ur3*EG@zK97t9{!Lqc(J{_sm z$62rz`sjr-56>2(urbE46Kk1ztA&w(_>Q&+x8o1rL#rRjKo>sT4jcRgdd^Qf8_02} zsCbCS@_ZiHzvUgAK0UP@<+K#}Few~?gIi5fa8XvVoK{40vsJd|;8J!Ya0!!^=-o9L z!?Md5Y>%Ae;X2_ebuS=7yR`&Tlh#zhdHTvnoq|$#9 ztl0Reg_Nv4iKLCLC6(xVY@Q{|8sCAH;&u)}>#$BZN$E?Lda#=*7XQ^>?_`E&H)O%YRTn|AE z-qAIj7X1`#X`5r5z${hU_j-X=6UoxsGcx|i;9!KW zZMjiwLBI(o^`&1xWzgd(9BFkv7w|jXz8PVDzLZMy(>;2G8>D@RuSjI65?))Yu3j@( zQn+RuLiL06{cK@<6X!HQSJu7Tb#8~LQJ>ZHm7VA;;Xgr zy>Cy5;KMM^Ot?F1-aH`%yvUOg?A2Ou3oF^H;@%iMsfHg!_*n}!?fMbLo^7MJZ8i2E z-&`^*iI_hTJv|e9Jc1V(zMBPaps5#nTwc-Rh~}ot>fjOZ_@Rs7_3g?vJ`mql*dAK} zF{y7%Tc>L(7H#0vzV0crdAFB69Y*ads+0EUyLsyqR?p2Glix|Ll!PJS)4Kujv<@}t z``ur*Bnoy-!kqI-EfyySz7$o^$_I|hz}3~w)DIcwUs7eV%YNk3fJ@SOnE8@*5xLcW z*VG7_(YPFdufIC)DIOrOT2R*?;BH$LzJt_R!?SIV(f^_+H*Iy~m%2Pc>zv%X_6-=`+vL`uD-H$cRn^Y3ESe9Lu7=~;7uK9% zT6YMxM;N&0^^2?9w~8qn^Y`ViwU8h~3E|Qt8~bL|JO&o|ZZ&wdOXG)wHJr`b8g*WT;D$2QZao14^zBL}Xzh3=1`1~ZZnBvNv7yI#t0pchk&p`a3H{`Rm6o0@uuZA!Bs ze;M1!+nFvjEXV5ws?(>>cF?;$-bZY@UN`eYYVzTQKb8ZNAvN~d@a|KxP?=2uu5zP* z#iAaEw9*fX-@;1i+27E%wlEvaW2V|ztAyX>*MEPKHcjD38MBTvI+*5li{~QK8j|T) z-TfqzI`Y1E40&W4l5UYg$*RY(JBmj`4sfJ6p@cSVQOjlcl(Z3)0mz&A7KIb1_}b&u zMB!rX>kt0>+274Yu7&Ej|_INQ`|_2dl-kgW#Wb z>mS`x>mj>kIoj*8)5_RYBNI5vbaraXx$`LPepP^v@e})xy9pW2`DW-<0g#L@ zuVM^)RPv6&hjIQ%AMUHOt~8}oZ8)T)>?FX=MvE1bQ<@r0BwKRn`>E+C@?;M7rGjpJ zVy6WLo?*-CH8N1|Opt5xR#)N`HCP11&kP9Ps4Kv0)sF})wRrbaRmfdD~tRb{XSd3CD&#88$Eh2reWY^S{! z+@s<;mfMJV-4qv4g|N|8aFw=JGHlSD|Jsu}=IT-RxQ<5W;ApSnD+Z>-co7XzOmd>c z^y9n7tJF44HNPNRsJe4QqMISSp=!WL`9=$ptkw}u0^+1#?;}D?J z@0bd>iq7Ow(4}r`NOM}@$r#Q@2{DVNYPB}6+{EF}$ATdg-Q zGAgxxf-AnwXA^CB-YFEPUDCbe66Fi1xHrYI6>30gKpGlAx-iQQMLZ2~0PbLu`ZIJ` zSFGq8jA(|7d}Fq26FJKR$TI4th?=s9Mfl}^G^Hk9SEm+>STOGt^J4CNbGYRa^nfNm z=hcj%@(~*7`(kgL!o9h`L)i^&n;F}gnl~oA6sfHYt4)qQZNvAuc0JtN0px-^>Fo@8 zAG4m9F5d#lmohl%q}?*ykJAk&zPF;f%GZQ@Og#sCMYUR#`nis@ow#swX?c?-{k4O> zw5_edk!VS&IsNT`W;D)&xgx{(*h_7Q`r39maR`gF0-nH2o0zVLQA^KCfzK))HHs%B zio7$h8|r|ydH8JH9Wx~&883y`b^o#lMqBt#0*^`VPOZiSMe;LQc91NMjc3 zemLL5C$*wE1$PQx2r}9~31+Y84BGMV@zhjOJ4i@RPgvE9Gmd$`m?L!bUgOJzY{CbZ zs|V*GV)`{V+blgw+Kgm~H}15r*ttBzf{?_zZ*#6*=~w@kw|En8<@TLCo9}UGX&-NO z#cTIT)5hN1f1pIq-ws;cqsSI{a=8}fdgT7R-+*_<-ERSSUoW=xY}tw@Mc%pC3H4`R zfiBw=xf5u}_jc=Nmg#zR>CYw{vBs8na#2!K>S_68I!nl?7kv8pVq&!h8=N$$-G_^}U1ejeXP%ek(aRlNQo>klY^@2`nV+(` zjC7#EKiMr$uMWwBWburslSd|vyA5OocvdX?`Yu27^o*-sSU8>P(l#qEEB?&!{bdL+ z%Fxe+V2>6MAD&m@Yy2Ynk$yaN4!2O-3|qoYHJ=k&m2AS*nyZ!*GSpq|sWHxb-QZEt zb$tHCF6&5T62ItrS*NILRn|65j%4M^a;tjlp>NX>+u8V;EYFlDhn*A8UIY*}E>8Gr zz|J>^wNDRNr{Ta6*&v zgl|hrzb|JY`QTNK#i$%DO&+8`rcCU^!1yXMXtohr<|g1vBc|LiHCu(4uMeMhjqu@l=kpeBx8of<64^2J=(1?`iAU!klHv-7OoZu~tltwP zS>lo%L-KnYQBQUK19d{CIQpE~p?Jg{CVDiwhtyGXk)YxtA4`e~@|?5-D&*QN&__)M z)fWoMhgx*CJx|rg1->k~P)@eG=c^JrT~f+E+B%HJl!N$1S--({=e@$+uJ$j-G$vQ( zF~Gxbeuo%*;t9rbvU&@%ZCXfJvGjP)@3-TSB~PA`_qqT^J~ zAC&B`CS9lwbL*%Qs=|4!x8Lj?plLuU=h>FdXw{RhoWUCIsbK=XqdGD8+W}8~bfa*(^)Bok_04-7!iI_nQnh{KJavTnH3?wSBi^?c`Q+ z|BCo$r9$zvP=&2wFW!1QalY<239AkuzQ_v`)@YgZv^+ss@Gbp@Q}lMyA&(zRqcZMb zk+2y~p?Z?<{fPs&+~Ur;o`72P?96_Y5f{i;Tt zy)MRaPe*9K&$IGkzt_odzL`miwNUvS&^Ig}5I_8F14+3k{VL1<-gB=ctR`zFFYJK8 zc$wu>QwP~YT*Y@J--boq!%sJ*oJFf7^(UXb8e}n6x}?z%%d+3>!{!l)q$>Ql^L_?o ztX=T=+ih=5Pl40`Az&nd<(mPj8 zD`v>4C-f3{b5j(5voai`)MY0?%RnCaPF}`P`SHfj-V&dMbEbvG?6G#_NCwEOM!i1k z7ijQPk^l-cgp^Adqk8)on!LNt)Nl{BGpw9lLgIBh*gyW%8Rzu^v#ED(`rT9?g7{7> zzPq%{%eZ`Z*>=gwn-vG{$P4|)hXXbwbX)}SIqdNE5jWtS^nHC|%44$Aj&zRCZwwBy z?%YSqyC1T9kLuwQOT1GIsc5_zyR%pV6WYFu#XRp7CWJS&?7%{l%|fnJstzo8;{IV# zTvg%gfQzNvGrH}gyhc!y?2-ltxz z(j3*26&&6ET$mAHRfcZ}Dn?);ENrgmEFoW`-V`-gahujmYtM|Q-m2|*DQ8y#A5cIq z#ZZ|0#J`uz?EGs0l&#i%(f+ z{p}4C1~k!%fQa_wxHxDcsvS#y;?rAVO^+jpRUCP5sVesJm1c@T$$NAx}?luo)-zu5t^ zoYy9&CA$1*A=N)+GPp`_k_s#D_;FJ}pRj{Q!bjk~T8h~ghvT(jJg2`|H+EFojz3ze z$@;zYWp^o?#2y|irOBh5&ijv2_B2&QcayEcf^tmAO_J1^SB(yVb!P2d(;X^Bg+(iPv!Q}lD4D(BUfuC$y%r9rb6xu`w2h-u}vA$~uaLnlLc z7f6XepmxE(``Ob6uS_$R=O*CoL;LyTEkydJ)86nqXyReyK>sA>gTgn?t4drYLITor z8nChseQ}!MGO1l7?fW42*eXp;E?cvn(zSamtDbYWAROyc9mMabblZl@)R@9L5atz6+z@4t$g{~_%9FGzrLaRX37+IIG~MtX1@=VYy@S##g#L~nOI zf*LG2eCjMN(TMf+A5dOpn9(;QACqse(AX_bJEa(q<`FG+_awu(!kYNE2y$rO-dJ6n zOJ;Fb<&@h0KvX`l$&|6+`ye(vwk&*ETxY)PuIip#{Kx^*ZoA6aVp!A;Yrd*x>5 zr2KBz@8KPls|=})l@jgk)0~$I62@dh-FAZmlgtfDtrnw^yET>$rkeG%xv>Q(v()ITd%{&jF@{ zQ$XgsEJ6y{8JQ#s+|f9=Il5?5nL5}kLcBRxEG?1N*ud4N0MCSi z)p?FCj1Ig1!y0m-WLRXUg#g(>KlQ&+TDkwKQoSLeL@!Nka(9bs$2VSrLKc7Pjk z{9$23eKIyPVY4%`w>PsgvHP#npoc)X*g-%D5c+3@eb7&(Uoha`@&5m3oqZ5WRUZcW zl_CJ<0YR{q~;lGg~VdY?FZDgSH6D9FiiS|Dc z9{%qs5nss2S6n)E*O*(wWQpjpI8u79{v}%G71UuM@F?XvUN1FWw$c2=lIVi zQvd{tN+o}C4+sRXLjWid_J7;E--soDU`qZ5E0Op~bg*^#&-w}kf`6ua5cJRPf`Na~ zN4WlNcTp!3g%2@Au>ZuXSlc2{*RDSt{3WUVtR((9djRx5MZo!k9q?zs%}=b$|4XV3 z041dl2B9MP0rYPL0~CgW8Nk@NxVV9+;QpgxKrtl#^*H{$U_jN;_C_402)myp0-Fm8 zAjF1nvSRyN0by)pWcatT;g`kvJNf6ITydOjjf`II@@k=`>7mynTc=^S~4F&$C9XIsn znf#?4fD_F5`>_B{D1h^~{s5?k+$iM9pT_{8$U~^Q=vNzv6a1GkKtLe$_i;f$C>V7) z|D`{a4ffmI03aYY3{|@R+K!7GhPuf9W`m*FN59!XoPU`ID!_i;fBkwah#T;id4M^8 zKlcC#4EC4)pqyMNuF0?cp%U*;%)>8ZKmowN^alliexC;r6m8=7 z^Ng~AQC0RYmF2&W3xI)tmL-3l2M_>*p-3LT+JKxO?%$6E zazcKBwSGAk$jSZlHsn_uD%yVU4+I3G_WrN!KwO+$zxxd0f}s-iZ|%US+5K;uy{(=Z z>bih~N@R*=t|+Jqiu>^jfv|t@b5s6IyHZxhhzF>S|DbxIxInh{e{5h1&v#bIO= HlNbMAQybwF literal 0 HcmV?d00001 diff --git a/Assets/NuGet/README.pdf.meta b/Assets/NuGet/README.pdf.meta new file mode 100644 index 0000000..e95001a --- /dev/null +++ b/Assets/NuGet/README.pdf.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 83c5d2001771f15429a88d67e81366d6 +timeCreated: 1517876157 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet/Resources.meta b/Assets/NuGet/Resources.meta new file mode 100644 index 0000000..49a5e3b --- /dev/null +++ b/Assets/NuGet/Resources.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 1738075a39a390447b7a620ca6962142 +folderAsset: yes +timeCreated: 1510280362 +licenseType: Free +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/NuGet/Resources/defaultIcon.png b/Assets/NuGet/Resources/defaultIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..a16cc1989ebe2038ab00f914223a2a4a26b4ee9d GIT binary patch literal 4415 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 FV1mv%Ns0gf literal 0 HcmV?d00001 diff --git a/Assets/NuGet/Resources/defaultIcon.png.meta b/Assets/NuGet/Resources/defaultIcon.png.meta new file mode 100644 index 0000000..d23111a --- /dev/null +++ b/Assets/NuGet/Resources/defaultIcon.png.meta @@ -0,0 +1,88 @@ +fileFormatVersion: 2 +guid: eec19781926cd2248b7c9abfde8db555 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 9 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -100 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - serializedVersion: 2 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 215e43cda847e6d44af8b40376eeed8a + vertices: [] + indices: + edges: [] + weights: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages.meta b/Assets/Packages.meta new file mode 100644 index 0000000..0ec33a1 --- /dev/null +++ b/Assets/Packages.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f73ec265901ea514891cea7fd1a5664c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12.meta b/Assets/Packages/Sylvan.Data.0.2.12.meta new file mode 100644 index 0000000..cc9a3e0 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8b168b452bfe34e49af72ccda9346c6f +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/.signature.p7s b/Assets/Packages/Sylvan.Data.0.2.12/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..856c199bea5a5aff4988314d8d0ae4414a21d696 GIT binary patch literal 11512 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 + + + Sylvan.Data + 0.2.12 + Mark Pflug + license.txt + https://aka.ms/deprecateLicenseUrl + Sylvan.png + readme.md + https://github.com/MarkPflug/Sylvan + https://markpflug.github.io/Sylvan.png + A .NET library of types for working with data objects. + © 2022 Mark Pflug + data datareader ADO.NET .NET Sylvan + + + + + + + + \ No newline at end of file diff --git a/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.Data.nuspec.meta b/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.Data.nuspec.meta new file mode 100644 index 0000000..85849ad --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.Data.nuspec.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cf27dcc2d5a55244ba88fd2192a399e6 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png b/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png new file mode 100644 index 0000000000000000000000000000000000000000..e603bc83bd24432a229575642cf9caa8702d02db GIT binary patch literal 5233 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 literal 0 HcmV?d00001 diff --git a/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png.meta b/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png.meta new file mode 100644 index 0000000..9705a06 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/Sylvan.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 666ffc88d2e98cb4fa953cd62fbf4691 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/lib.meta b/Assets/Packages/Sylvan.Data.0.2.12/lib.meta new file mode 100644 index 0000000..6f3364e --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/lib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8163790f77248a7489cb85e1533ab4b5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1.meta b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1.meta new file mode 100644 index 0000000..626cc9f --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e7403f9931c543c41a9c576fe789b4f7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll new file mode 100644 index 0000000000000000000000000000000000000000..658a9be7f99775145755a8230524d7242525bda0 GIT binary patch literal 109056 zcmeGFcYGYh`3H{A?cVJb>13@=x|1ba&6d2rJIR)0gWTj!F_>(VU)Ib# zWuBRNX6Bh^W@q=7ul}4el~O_c?bxBzV~F{0frS4(7y`Mf`SB|CaP-C2#{&Dl*m}q* zYjQ2?2i%hfjy=8Q_+!_tb2qdccVf%H#&s=g*0n6z|KOI>-4jmiipOJb2{3#9qC9He@-bYalmpJP=Yhw%r0SjJWLI0(4i`z=@~1U}Rkt>MXME-HC5eSvE-? zK)vE0>t?8sTKSMt??nS@bWUOUR6&#B%u*_rK1#<%YRg8Y0_{oj<^n_p)3ZIiITl3Q zgK4E2ryD8_PW-ox&WZuV>vOXq@toWogt1UIY=zvpNE!}?hEx^JW6lYOs!hVxezCV7iadfEvH{N zGmDX&uakW~Z(})cTZuOn&eoQoXfdZ{TT&f6lv#NM5-%-WB$sA+uqGP5)drMe&bwtMztNCcH zMazNxh&g*8NLU#=oUH<{p!O70QQcPM7>)N_=PCQFG0OgrDpr9B)McaEa<5jQfywyw zCv+OBh(ZU@p{c+|dt@7V%&J(nM#pB2a`z@|Sn1ky+AxDbXBpr$^i`o|qfkx#w6~qmZ;$Wm?9E_bzWsQmqt|Xzvyo$`L zg_)GW!$*^kAo)lklj0o30OKK3I0mVRdo034eP&fny>lFs?25+@*GHzX$1 zOmI#_veT@~gpoc8X{Q~HNi^Dx*(NJbQFfzyGI_@NAo8CA1O%@k{?_ePHT5G&=%7(6 zq(+4tbWUdQRFKOWbQ-|i>BJ3@;-E7!gX>1~xa3(cJfsYsF`7I;a!$yk=tjd{X9^nt zZkq(F=D-@p+6ORH*1KmS8Q-=5H4|(i=$r*iBD4)NPop%#vOP+8TfrBhDUofMlOF5Y z%p1*phEZ%A)TGOD1YeOm2l#fo!p%z@@#3h&iOOv#xtu?4SK4u**)hAqwn|kRfWceu zY=RUAm5Din2;6fKfDu-%j1iV-*NnmD8SW5r44#LetOw2qn7e?uAyQ~5GJ_Y6=DCPG z7Yh$5gRtf0A}%HQG9i1SZ>)JI&fm*q-cMBYYJd+b~bHvJ>t0O4Ak4{+yD zrd{FOD|CBW=U#TYn7w`2y^r`lyRX){AE|7!-RC#E8Di~r=ZioOJ71FQnToO++PlsA zgms)*E4A;8vB6SFEB9rvpJUG~7Bs^vXqKnFG0mCoh;JkyUL!si&i(nIjT*Jt4&m!bhxa|6JUZ;5;_kXT>&xz9rk1LZ_UnZ?z*U_n>#BR?`d3?0gZ&K=NkxGg) zt|+zIuI>!l{L@*b%tH%ejj-YPa`ml{DF+}Y*X$TqMt>OMk(wZ)uJXZ z(c3^n{Yjm4Z~)3wioX59OyHj(R=d5^=rF34Ax5CH#@L3%%hQUO7{f>#&U28Q>TNc* z9k~;+WMI+;eOODK8i2|%DT1Mzfb%?Z!fU+*t5l_SfIBOU+z(h?EV`&Z!wCJ-!T&?b za$i6gc3(u8sL0g7RoS1(%8*^@&C3ey;Jyt9w*n4sh4$yFg6` z6)5Xj56j&~X+gMB;t+*47to+m7dx^hVKZ12Dt3-F?EDy+kcI1o*o{QkbbmrY5j*0K z6FbQ90eh#Fr_FGCt@BgxWoriJ!ws?{&P#xDFC#doIA++aY^GHJBg9aPRP(XA&$<7=BCNvbhrw4+o^fqVV)NPxtF9{;uIt4XZt!QI zSk2X|!z-^!V{Am!*U)znbfT)Mf!Pgw(4RM$7x*81z$wrh$CtaX2Z64+O@4vcIp zn=ovw$5}A6CxcowX`|#ti74kxa5}FcNSgyNJnQ}LDGgJ0Q>hg9brymhxK~Kh4*5M} zfD`4sQ4&_HCG3UY&13S{V1Mb=(eU!3@uJOA6|@@nFt=e4md~{rMu}(ODLT&EQMmg{ z1isLuj9BMQpga}mb+MNH7m_n9^n$$&_Enp*0ZfPW&5rXcU$l!RByl&xkE!0~VTq`xm4O?-7w_n1i9S zDhB_GWEk@PM%3RCxbGt0;ZY&HqZy--B=;toyJJRcC?D^K(pX?scM$Pb&7p~ zuCWJAj0(erk+HBoKwzx1W&ny_KQ7?x0OTNNENvzA@zfGvvXw%&gn}AUUP#@KamIh! zwxTRq=7%6YI1mV6qB)R0)JCwb2%>v}1JeNJz!Dpp46tP2CGVgJz=YG=_#tQ}sBsIC zO}6$!i6ZW>BCfWGJGqEM_j!5GD&mqw++{^vs)+l15m#TteYuDmU&MWz0QxVr*#I^W1*MQarVZ4GPRsz;0X99Mhj?7Ric^LTi zsN{8Mn>2*M$3sN++wSN$C>CqdF#EP{R7OMddp=6c8oz2O$B%)(4*X$k%cBFvP`dm< z35tJMNmLL1IClH-*MdKc9>Hf84YJ?TgY1>`Ap0RbNX@4Qsq6G0Tb>?dKc)w%t@I%E zogSoy(}UD0)}|x8FF4VR)XlIY}NB63;!-P zvtMZ~FuZku#wo-}BQ^j{k$G*Tu+u<`GCZ2xc7$IeBiD_&aSp)gQPlv&LNRtOjO?*o z1Yt!me4yc8MhCByDZUMA(hHEk0!OjB816Ob!eJLj&{)}XF-9SA{1TRq!jbIULC&;@ zTS00C9K1>-vK>goiK&bv;R{wVX+>~ARpE|9dZk-UOt^8&Sx{Mfa$t81NR)_kU>gMZ z(F1b?Gaj2BjcFKIN{my(j1j9|R>497P_(oRYyD0ctOdHgv$10k<^hMKNrbr+aYLje z;&wa{&CIu=1A9YebA4(1!0Jd}qcTyq9?Zkqvnh;68tX;_A`z8{+L4w36r5|M$e5|U z;Hu2Ic9r&m$JyiLR5VeI4O_KV5cUjOL939MfQ(5Ohx;+Ni85-i%d2slnM~LTw*`r8 zH-sFIUP#o{)H$sr)nX@D4RRX*yEZookvkbd7@Y0IRq5vu8+k-tX;;DPuJWEaU;=a5 z!O=}<*y#W-=B)NbPYYc6NuUx#3u7#x&^hwYSc)m2FfY_8_~T54Syu<)Z_xW=dQbf2 z@P}z6vls(VUF-eLMa=v@?8nSUd^wFWFT-Eol?b-o>i0x?+s0Dzwod-cd@z z{^-7x>ES1fJ)AC0>~v}Fr#ZQO-r{^tYqyQ-97YuF64v17&@H1(7!`zxB#t%X7Vi(M zmEzwD{7uJSAO7a!Z$JDIw+H?*2anH9VUN`7s5#}uF)yz0;z}E4_N4A)>>|xkKg$^77HRfm?quE~&5b%wO<<%BW3-Wvv@m`QMH_{I2A>H-%7D*Q zW0@|HRz)})4sSRCyztVERzQ!Q%_KDg}Z@u;5dnyI^`hW8iR1R_A4C z-KZ-FuHOi1*wpYrnkVQ?)pCSskr51yLZCcURLadT{<={&a2G|-Kn)F3p1Pp+nF6_t zU*CNdPg;M@Zr%{d~yK&$#BWl$0|M5uU*oa<)Ha(bAcUvHycD9bhtw->mWVb$ioL1`U^>7`_S z^7*i7+#hu;@gYCu?1mVH+vXK(WP=e)R%BWYGrZNE0kK#vrd15Iu*x$5o@0e0w}w+I zE5cy!`Gu9fo{yKa#TJceU#+RDwAQ4Q*+nTv-CA>P?h)2@Cz83g&LbTc?5r$pP^%3* z?91)O=A(tl+=X6SQ#yrC##EL^;?LOq)1&MpV$lmm0ifqCUX ze>pIpKvDLBQ4l=Y80Lyp&J2dCf>j}R(I^gVPIltJCZ$Z`(oxVJqo6%UL3LZI4gTnHGCj+SX{HGujK5>>cRK#yXbJ8T#C?|| zfNXZiW-ebWi2bp7qX$s+o6q(DHhMGHGqSPGa#lcqP2POFN1@&}-{Aq&_hznZWMfxs zhT|syducP5E>c7jR%ubwZc!W*>U}d7U9jmP;vNi4Nr#7wf>scs6}UlL8#8w&6PU+A z@x8;G$C!|NlqTdAJ}A@Ia5=s)cb!8KbE;RFVI1$W&|#U^R?nZUQt|91+&1w>uX`B5 z;&?(&X3B{0;4{TJwVIs$X12ncV}}#=C)^R`z>x&@&}_1S=d*jSO|#K~5NnI4%-XiF zvK(`WIAn5Nbeye-I9gJF-NK%qS-GPqSo=?(fgJwJ?FROtZp?~YA5%R{&1I^Wso6|n z(Fx}InVQMe0;XUigSkaa?atH^rr@H-10w&7va{Md6eeKBAeFHJGp7;TrQ0zMOB*W?sUM#R{?SCL%qJFIJ3X>12B}4# z$SE;OEEVe$&l*dlu6-i3Shmwcg{Xd?xNanDHu|#%~Ph3Bi$bR#QXN)DXD>YF& zozNub+j&~0*rs8;#td`tcqm<-+nj*Jh;<^u+)2a@k>WI9dN_>;3a0?X^9M$QYskP0 zAv)7qfLc~mkTG$C5&<G8W2pYYNIl z*J0gq)`BNyjoIOLa?4-mk7R9+??N7QpPy$;j#=k}?5zwjt7S(3P@d)Cq0dIvEgaU% z&nTMso1jJXGGpm1$r{r+OY%hZieup_*x5ux?4VxwJkFYs^BIi~ZHChyz}n>GXl>Ec z=YYUC@5P%K!&5FG?!?m$unrtgwr|;<+njeF&Se!W$*NS2c197IT=!L_qo@>m@M&c zW{oyt5aDP&TV;iURl&7Yp|#HWsERI0`@#DlFT4%!?igkW6;f&roRgbTnF=G!M}Ag; zYBIw5=0s=2axVa!38V^C8^$opFSGiGpl5+y!6;NXl;didkr!;9NLkaypt!!VLxj75 zUT*B1(V4_m7>%ljtr#Om)^N7bQct6eEz(BMN5+T`VieLT2wt&fGjjr#!3n0!r*k)r)|B7>-dttgVK8SIUNna6y>vTxblk$li zK=9$A#?0EXEHJbGD+@+5vMloixnD%da!;X5$|OoD)noE#u$`c1Ja;P>QPWY zT;(7-u^gN_8pJHhz4dln#Br?iq8d;eMIj z>P--HYgsp;lf{3RDRKn5wK#diMTbA}TV&NI9xzKX2jNd>OVZw1*)ecjak3OvbB4kb zWo){aP+AeX)RRq`ds#VfIRSVfn6*OuY&mf=fufKtqo6AYT|8#O>cYJ}_m!jgKleZR zuNuXF^(g3?QP8!cpz8=>2fi8x3?5lHP_BpTN3q^83c7I=bkitk>nP~+qoA8dLAQ*8 zZXE^PHVV3Z6m$n6U+u%?z?~X!A~+E#k)sXuFtKmia8O~h* zVMS1ZSmADx4#LsnJ!6q*5Q%dBp56}+Jntok%kk{stWbu#Fukbi)wuON`R z^TgF#n7;~~kt{rjh(3VCZAMBXuyi#gbpxA;5|-ItV59A^;uH{mBJKlutl_lYWJ@Vz9XO?UsK@mf4j4>5#)qNc zwkRxT7$3TVctLtc-}G*=0wxpBRmZcNmX) z-XRN{=B+CsIk2Z~9BlxCEqLN`?%M8(fq`NrgKIc!a5R`{zhaHGswyN0Ar%%5=E4q+ zPh;V=;#go?ENfOsE%WsEX=NV(A?@x$XsskZxQ6oG$F+Q{urd|&;?I^~pPi9nv8UDv z?4PkvCv)GVG^6kYB4NNPpc$}D)`{KyM4z9)R@Yl^vHejP%B4Qg8m{oV;sSIS&2e z3EP3K5IxEW9Lj)pDCNbO{I^j(Z>W5S)yDMV5Yq=fSf;)UKwBy-b9zk6z81S%x+Tze z$yucK#f@G!_$0E8Sl^?hrx<)6!4Rivx*skPRz>U$3&(I>6Z?m;Ej|$rZGgkh5)&7fDYr+IOygXP~2w`nC^23v*S^R=aGn6-dMN%oluQ2QpZhE z1ape_MDBzP=-3wP3LX4_lKu}tMP_Z-g=ZDpa0=b@NcQmDpI}YfBZDu1>OjXC_wO3< zA`v*#$P{l4x_EPttUn}WE?IYI)*lfukBAUB;&_ot%yw8`A-rOHZFnO#3;|v;!$ZxW zeyC}Q9ry3l)u=Nsm1_f{vpnh#7u2gi%*?Sk$KwK4iI|IHTvt1l+Xld^@tAss<;4MA z#b|qH`I`Vz%>;H4L9e2GP+_>2LsrlAUcE3Rjzj-kv4%bnQ}BVXo-Bs$(98X3Y=Kx9 zUA+|19sUSJXBii!?LOyVGZuC^xM@OS#JUa|%l#MywGWZPH{3F1(s~AAk8um<486MX zWX9sSWl?(E?x6u^0oDCe2to~<{m6zzLD#MTQ_NlD@vI+g!;S1Equ|iR0P}%brgI2l zuMfEA!%?DwpO5*)?7RY9iNQ)4G<{agU#a`DVAO=j*0?nb>%Fq_lOa5^;9uxBE8mKA zA{2E`LbimJOoTI&iu`ss>Y^m;m_*pdI3df?xM08q-paQlWA{tAOK>uC0zpao2AT(C zLIan>zTg>tbl^rLSh=x^*HEc+RC>;VydgM^sqP+E1h+^ zQzc_);AV)nHj#HE33t~J>o#yZ3w((KZW{O!Sg2Ux%CH^N!zhCyPhri29OPx5i)azI z+MgNOvBP`TYRVY|rYrYK6YN(mj z%Ber5z;Wt%+DP&wPLxt-?hW&8@@UBb}c^ zG;q=a3Ef`+lU;%lA|eVLnc-|BdZ}w1dg=x!CoJJ~Gn}#P7+%teRYdKI!Xz+SUb&G1 zyH@+1e(&8Oz2`p@ZmEWWbyh)*M$$PP5#6toIODKX6eIz}$v#37UAe=+ICLVBIL+j2 z#eKm+!qov7_m!X)V3>K-vYP2N3J;H;fR`tP$RjAwoG_Ru%iY2fwfVH`|5XSmm(5U5QD7gRR z!lE1Vn6RNF21|eJwA^nHR`gw~QG1a|W6sx@J&Ac6L1iCScV^pznBO9Z_Z_7%2LND; zIo3NfMxG3za*@l{G z=ii_Yjv#P$Ajooz=}x9)>`Z|Jd!<;*(DgT}wMT-SDv$uT`%Lb=x1e`a5BxJRjTzfc;H5>}`NZ|lg_w6euNZmSNEi1@W6dW_!!Zj%jNMw- z0E%BH&vIDf}W%e$r|;*aF%A<^w4QR?xD3k*bQ)e=mV1J zX7g$3=2O5a^TljFCN274nI`=X)s6b3Vwv$NtGW5;yc`m&t=gAuuI~AD z=@BQ_3_g#;u84QUQ5sj0;xR&ORQ+qpo~G*4LDYm+ESs`Qw@&rqB-;UyM>P`9qy&cH zl;LJ3Gl7Y+JIF-2(9FR?6RosLdxJ7r?Gbk(oPLNDEp60V>I6*vq}KMfXf4-w|L4kZ z26}pJ7^TDjOtax@h-K159Sq)4S75WdikjbBI^-i|Al;btaIM3$juQA0?cRN=z6r zlKOdeQ2hXU;=d;U?bTa-MdSK;Y5d?ie5q%L+sBu>cDTJ^+a0AmjisI%Zl6%<&EfWm zrO7fp#EI14-@JbaEk|hsUzfOk;M)?9ANU^QA$DJp^#zZ0o5%W!$NH+Uvd=IPc~*Y{ z+SJQ=sP`tW1-0TL=$2D3P6}6nFUh0&Sw^1eh#7IiV8{)_?tFnP;pXPm9_>oPBT0sC z1WYR{^d7(GDI;9CnkB+*l$f@IHjd`alnVrcHzn+a!DLxitTDZ~3uX*kW^^L)mXxDu z)}1WP!Hr;xV!X3zox5jSO4}M!U5Bz}pe*gyM%lt`i~X)}Vt_XwPa_*TAso3jZoxDp z$>1)4g^#)w;E=X(#Ba9-ehVdz7pyh#9@5P*5BL{>3J(Z|%79t|l^&&uz&H)y)X_h~ z*-9PJHXaSd%tU?lS>E7Hz`K>GL&e~YNE&k9>f&9YSaUY%Rw1rT#`~I(DH7e92o7Ek zCM=v4SQY6u%PxKvyaXJAyW_w;kVg4#HB$UKlSa)bqQX9EQ4xj7E<*H6@)7+81P&2& z)Ptc1IoyAtnvd{NkCCoK9v$oCHSc?Og7xfz`=ab zJDA@+D(^61&C&^xU=0lU!hq&W?4`p!VaW7H-4ujp(>jjI(L@{4w%_J*kW&wMY4cv0l%)lK}GwZ->Dg=UjB{#&J=AE9>%EMp%YVHsw$ad2lhLb z?K1z%QwZc4kDA5dN1q7h&Oq99FF@;{nvjEcytpw4IgLnQ?pfoz_Oz{utCogPkyiZG z;}6DI{^;!4c!j*TbKpX#DiO>~8K8YZqG{l2jj0>BT_-BVCV^yP+ic@mLuW!)-hWmD z`-X=Iv)+PGW8ka4>Tw9k?i^dib!CVNpz{)*m0dZyY1zGufrpENinMm!ZhpC^O1>zS z2xFtU1I3Gv#}iyB(-?Tn&-`EX33p)Ni4xzH&?MYdIjq%EOqV!MB2Q~2iN`X{)m;%I z8!}Q@z_}3cJndMtp8t|L7Y!P^24gs-lh_6Y2fmAfTCh6k*TjZsMhCuQ`7f#7KyYFh zmOCb|kqyxn*N#~0ASyQzTFSu!$A)OE^}1v59SpueWaH(8X3+3d=2=W`%WVO``!hT{ z`H3mF)@^yF87qyoijo^qx$QQ8v5J?x-b8R<3Tl&Ug)o}=!51Mr%o~C@fd}|QfDsMC zqz|@%%>yFOrVSA$A@vFxoGYw4q7Mg9@^>pNcaE&Yn-jSpiNAUd$+5H}tDi2_%NG{u~v?Ekqt2A~{$>dCoBMeT zK(zwv$vPyS!d$PU0m8qM+xK~~82#!s)-ZQM;ypStM(lS-n$!x~mzv`@9R<7nv28P*7)6;hb0g`OnDB z0v1p_rsPN8U^y?KB&stW=Sq(@)k+%!6Y_YVAzvM*g`x~&)toJa(QMR zCZeuzJEKtH3&MF32)YhWpa$6GL#HfTZkNJ+VJW!eF>N|_I&0BMx>#$=X-rGGmb~$% z3%0f_ge}x1ix_?X72Abl!V!JdmD4fq12PRQoV@DUk;2y%Et!UiAdjOiM&%MABhPYR zi-&b}ka8bKqX4qCk-A&G?bFSo>$@<9YS<3{17(9p;E7J!dv!ko6+cPU`>(pX;l+gtT^!4fW5sY%4+cC@Bg2uqVAx+6@Dz^>tFacBy@nDtb5DsfDS8ayX-&Yi zFMn~x@_NJT1t^Pa`xeA=*=I)nc62Gu8W|<|w$fg@)5BXUBkn^GsYgS2s~)BpNZ$l< zdsCcSS|iUfAC7t>Bdn#}iVv8`C5F<#?z!K{bNqJ(tz>tdk(X(e=lpQb#+c(4S@y*A zc{v7BvsDvEcJZdmm>V#d$GC_9rRsT81m?jFC<6Tiz_}Jf5Q7vg;p8&6Zoo#M(VYV; z$;YG4UYNU**qaHw^+>U!-g+e0vRx1{^ zDhG-_W0?YNhdB;}{eQkb?iRCLXPtK2nGS~br{Y?=!H}|nO=u)$vBq) z$ja%j^y87>>HIzW)j1TKMlob;F^-$@_m&{7(Cr5byH}y${Dyoy$C=NVWBhou zZ64d^onpA_Q9^-iWdgQrz*xYr$CIxGpt#+brA@ znqd{BIB&1kqnZ!Ydo^5iSqO2s=zw}xqH}v z`evFiD@jhRU8UJXA#wp!A4!pzTs!^eMxNPYR^8gJ8Y|m~Y=oJOvDTwxgUZW_zK_IY z;eJHv-{O`h;?8Mh+?`Q8>L8Y9^up}o<-r)x^&XmiDC_85&~ZO?TvzxCrPdX`%E-SE z`XvCt?2;huO1l-l7B6P^RNt?j35)+Dw^*Yw z++vf);P`}hY#p#3?u6shVyJ_!i|$0@O^dNI_`rEA4lC(SI4q|-;jpIegu_C)6HW{t z#+?6d0bEz!S!zKqi25w8X0nZa$wT*2&&#8QnA1j%U{=((~?-<7lcw8j+f!0cF z7EYD8j&GU*ze$swL!fXEa`t08Kg73+a6=Zwz-tj}ljrO<#71TD!G%065oi*@f=P{J zb$J$6OZN#q$py4qLY1`!tHOiG*tx{NTbOAI!)4&GiCinLbndTM(?(sT^TyQAa1nG6 zGzU}0Do~1+#kCAqDZDoje7gbH4=cgo$!O+?^;2Za?T>a1(N3i=H_XkbSEF7f%)$Yn zV6ixmQK)bb+y4;8I?=+XS9$ndLMkJe+PzqYFNQL&s`hW~EYiSgf!h}|9@%LN&O${K8KNH9k@b@eH z;j*K`vQ(#qCJWz2)?@`%v+p3$_c}O?JT_M703xJ4&I*)_+r^1UYR(pji!{x-6;a<= zU=Am{+c07%C7i>h2&?coGp9s69!z`XXlYVdssj9!jS==;M156|<(Emss50Y`R98); zscW@tQ>f6sAEIU9R6h>Ka3M^WoLW^@cKuFeQ)+6Jl#U#Pq_y=GeXq0ZovS~7mm+o& zkgVwY5v~#LLO{c=1+dwE4YcC>FqqML)+uga{S}pHSnI@Hh|x3ubzKZQMi9EUnvgf# z$&0-dEY%YYS;X(UV;Xm=STXC^j>(+ypL(UK*J3%D1-oeZgq;fTw7+xPaS!}|HvBU< z-A5^-8=i5{y2-mJeB$WBF|I{3TC-9Cfy?C0ufqAxf6!Ia7-^ii9Nqp#1onvF=Go{$ zZ5It$D;5{$Wb;UGy^-gfmD$_Nc_x!NmI){2_e1cVOn!_wSYQijA{<=fDZl-FD6LPh za2PF5S8gSuA?#ALN6fh2)K5>|0l+8PO&U(eOgUSapyc~}cy_@DIk8j)77y&+VqrYR zQTizkKE@+YY4p`>e5IFu+_Q$49{2S=>NMss1O6Sx??v^rh zcu*VL5X4GS%qzYCc9`C~>BoQpuYVv+n!`GgsvWM?Dfic4yX#hLz_Ya}kGS=&1rV1z zjwK~|MUtSU;gYRCo?^AFhsnm*|I&}!jzpcx|6zW?#GV13Z0L;`G8uL4F)a}nrYJa{L#WlZ z0jbOqUu}dmPf=|fiE93rC*cjQvn6?cDLAS@k(BM8i6H4>t&}H+XCtn}{lU*5?p%!f zkzPe2g>!&0a7}a*TU=w{8S6@P-5XbnBoZr)O^inBuxD&6771CKfStXJk3py7?6G-7 zH*FIust1{t=@fu4Ho?!rb0FtjMBDp56?f7Z0&`ktO=-Zt&lX1Yf>0@*amz>b7GlWj zvk^mK=qVftVQjE}Fg7x{@`RKg8%;*@zrAiPbu=yzg29MoBF+EKorfgH$oYs1)Fsjv zFwNeQd11&I#j^4;pt_N|P0&!ptFUt+xD7O1^omRV(5h~Vb1^6tIvsXk_3*j&8XvqA zVD2&mX(ODwoG~T?Rf;1O(V^*(r35iQzG$Rr+8o%A=IO1j z$NLU@QH^-BWTXyEfp8l0R}>~??6Rf0cxh^GGb{9U!`XrupOd;0cEGuU>7a8ZBm5qV zL}J99tB@|c!tycgD7#ktU-YxuSL#SS=Ey%0RcN!+C}xTHObT}9A4s5{gvHJ<5!NQ= zS7Ktw;F}mIS->`&C&`}HUj~Sf4Q)BX+hJ>~O%B;YmvhLzyc{7LRUe_-(t@@uM_Z7e zo3kvQ&gjb{R@$qDsH(USu#cE$zp;5>q#Gp*%>m4;40rXoL9_iLq| zUR+wdt^?Y$($|wiKc~7By29}*#xv;{E9)T58!LOsSdo0m!VMs2_7BT9l8ii|t?rEo zE5rHIkj2Q~1R&yWMF^L!@Oi`-Sj;Q~OQc9Pm{EN8ex(T1g0xVaYTY42j#>R72RDx3 zW}Z=s&%`wiK9*Nsy{54_r8P}Tie(bX-07$n?Gl?LA7Vnv@-L8Ws}i#vEjDlT}bB^WX7Qzwzig@n}+<1$u1{o2>W4~pd2@xpV;}M4ManA zVML?mC-E{rv0LE$BrIxVV$}R3gRd;iPXU*Ci*)W*)Ua?H+qei1GZ140t%iy1Fv<{z zYs75L;SPfhbev5~2KP>8FG~CZpuz*tp|&+aSzoBQ++Cowm+n!xcT-M#=@E~QKymuf zj*oyxpdab@2yl!>Ts0PP!dS!+V-fYE5kvQ&HrpopMdOFM?ge7-J_IAy{Rs7^ydfsz zpgx&)kMzYNDFN)zmr9xNtk%mUlm`G}e1_$IC7f_O_Z48;gN3g$8nGTE`$Gr_e2u`v z2r5RbN0|OP0{oZ=^{PYnQDDq%7+P9a_{L}MF`(RUAn^7xVfhj;mKr@ z-?@i>VQ*XDGrQjdFOOk5EP3<>zaN{H8xeNmw-28J5f4xz&i9e%kb@Zu*5D-rk67HN zfx80xX!(5-=NUjeo|iexwYU-G46=7|$p@i4a&e!N6s(u~d=WQ{!h|Xxjfz?NJ5jjP zCa?$bGHZDmmU;$dtV9|5_fc?Vi&d|{SEg9`Y{kH-d;;|YlyXj~well&_%WOe24Qpe;Y>^18-x<0z94T;yIvc0G?x`T8_<>Dj-kVBuko#;Q=^QHia> zw;6}zzDD7P$hiwAB{W*Mb%tjc^(9U*n3)#elku!2$0hd0WhQkeGuoB=5txRaLlph3-5_Xn&Osyv%VU(REUhM3Tk${~gEOwTOQFfLLWp-A;qE-9} zh=n>@Vyst;-Jg>EdOT39g2sy&c#C_2fQOYtneI#E!Wf=z$a|MC&HnSeTv4R{XnHJD zZ^?BkY!{gq=XuyayDvikZsB1#;P)|Q1)OR^gCg1hU)XZY%JnC99vj-0xSLrP2uTt_jXp6l_A-_vZZ1vUy)(%Z9?S zRJHzQwA|mdg7SJnCFVOeM|wXJ6gjZGUfs|rYH-W3*s1Y)cp@CZ6;i6pMVa^_nY_g= zJUzb&=ioM3eEt4y*4rpx?C*kXId?X1kX5fX1&$o zJ~%Zr=Xr2zRM)WL)uP2@|cB-l~I@m z5Kog;vTQ zY&^<4jy7x~bZ6k=*IkV9_L9621ov#amS>7o{iwPPcUK_Al+d{Y)yR%B@)T@JC}-BR z(YP=m%P8YK_=4$!@a6t)Oxbqh4D^b@?|e#?g#*X9LGxN8FTm{py0B69z}raMs&zC8 zb%x2o`XZb+3uz-x+xZPrd?IZQ)vZ51if7VgJl=&O+U`!sz}925416MpQt-14k#Nx6 zPBB)HAA@alAEdcDXq2>|Mq+h9r|U(@OQam^7-Unr7|P+Y^-Id4N+f}E^*4c#^If_6 zf$M&79$2s4P%o_AwwaBYa-V%9fS35#9~5cfu`v&&7NAOD=T{VJm~z~$0lh9IAtT1N z6%W6KYB<=mNUgAGDb=na_iM^Q9zKJ&5o46vp$%W5KJlXfmirdzFw5ABc>b8B9s=LV z;4A&+ls@Y}6Gi)OtoQRrWxpyd-gMcueC=I_@yl;n&%c)6L9O@PZT^g4WVqyM$4&fX z0S;L7Z};G(&jCMOR%8^qbbo^?C%5{){}LT`;ZDRhoCbFBbqs|SN&XEEqVGnmIT(|< z--0LiI|M^Zfb=MHNqL8q-;=VmM43m*yQKVqls!t6ep3EO%AZJqOXEwMPs*Q3`3osH zSMn(fNO_MGc!RN_y-SpZr2LJPzmtOVD?iU7Qr;)!15)-WQ5KW(At@h`f}1RUo+YGw zOv*n{AXRMf4UW1(!{H z%E6?>fXr2pas(*2{pnN!z&E)!Vlott0uBZP_d)c%J4-Fah=p~A%_1@z^^Ozq-Yx82 zG*s)xkv-F7;>w+oXLfvv8x|?nfs4`vg&wk8F-|D0N|$yvOM_d$(vC)ib)md0qIOZ% zxU#aC8D(MCNLd73(*3e<0i&8_nFSkB`XJPY3Dmy^kt=qr#FHQoZBaMcE4EOd7eibp z))|t$oOl7K9=28d>^$6haF|+u4B1Lk+8-#bl{5q4CC>KI|ZWnKld3|pW8%~0o zUx(#|`-^R(HFPpN#6PHpcs`GN2klrZ?KlNgh+c~b?I>ir;REre5ej7#mJ3H=ec`AM zG}v^~B&vMlO2`T8`%(E**=LwmzVjC3N6yiDzJ({g+g$P8SRhV>aY_u=Z4JU2({SK7 zXST1xcWnU2jZKWo+%{%`kWCOa`$)KE$;$2H_2V-UCQ|U6tN|_GUQ3UwgpN3P#XKgz zzo=A|`qJZSyysW3Xw#WMYF7@Q7>Et={I94e|MBzg{$@pd9j>iB7cu2$<5T))%qJz-Dpqum~uuVKlh44v7wF)wIL`L8e@m*M(}3O-mQ2hYV(|?4-(5i~)f-dW!-fMhZ@uoHQ`pK# z@EW1cw*@hlT`wO_JT@SEB^|6(*OFvxJGX9>Xhifu2EHX1D{LeJPc2EvbQqfmJ84k( zG$Kc0N@%Ir_8yutMR-wj8W$ zmJ!kiWLVAh@Ak}~uBann4$7;@^!OxCP`;_)Uv`=zKr1I{vSE;_9#qOjK;w-8gyD`X-vA`jA$Z_LT@{5whZdDoMDP&IJs$z@;llsb-{{42I{{4TydsHRSR%16izN1FiNvlg zlGwo|5_`HxVtB5@2A zNgPQf5{Fcg#DP^JafB5~9A_mG2V99XDi_CJk;GA0%EjSWBymudNF1F-631wX#KBr5 zambcP9J@slM{tS6pw_eo zQSn!3cu-nEl-UR0q#~FnbZt57?O^SlfP-053TKlE-)%%Bn*@<8B>dZxup>w_fm1Y{*w;_sFv!!02_@j19ePsf}AxZyG(x*vynS>_`{((mFOqFm&BPBwbY*`k-DFh_4*Xn@F$aNA;E2D*zXWCNy1}W zh*i94VNkBKhHor0yx&cvCd9d{Phk!kj?-*(vIFllkGa z-oUkZ#)EoFuJ4%@J(l{7k;J*p^)na-g5=-S&2(jg;R~YAi(ANfaGG-PL>u^4>A`W+ zsH;6v%=K^!!>i&9pB2gL+oqzPjcJClAT^v3{d{{8G3iOPS28PG?vvuDN zvaF}2E$ei;nLX%=ga;k!;d?SFUY|t%_ayHHyHUa{sYz0_H%Ug6A-cM#nbe;-3?Hfe zrempmhUxpIZsY0%FE#mz^!t<2clUR*$Kw+pLikn>(=qA&L<7@xlD?o1=* zYc)()G*BBi^)mcbJHxQ(c434(t3(fTq;(&Ngs({r-)<%KkD`-#G9Ff&)XATxb4L79 z!ke_-g#T(818*42_4jt_yuO2BQv*XanKik%m()lH>oCws%#S4Rox2ks79DPc253_r zk1`ZHicR(6#&^5-E-wDz3RjbcqX77!3Pz}LWuCF_%eFaW{LqaLmsV3od@%G z51@ue-mK?G2J5*%T`sg0 z7C9I2TL;Luy6xpyA+T88AW#6cJ}KM7roJ587r&Wu5Axxw%!!v{m*EEU{UY&L$zVFrT!mJZJ}My#k)wx&U>3N-d$! ztBsI?Z@Gi^bl~&qERosJuW5MHh`QV?^}JbK5V!;VuojwE>MnJ^aGomtaF=>O%G)TM z_ozn%x>TV1)T07D2xyD?qWXqFX=q|!oQJ#%2w$kdd|06#QGW`=QM0EK+><}5{v0p? z1>t6{Krj3a=RnnJQ9q$4;R=|@XW~)pW$G#QNx*EaRsl?e6*yl3gnS*KpRRtU@Qo5c zb(l^o)T$DuI5j zQUc*H75RRn@Y^XU?`eVlsPMbxkh!!?VZ42;x`Z}MTKln@CQxUV`94uI1=`btb{FVa z51J*=*F0#BKsR{MJb^ZO(0qZ~J!qjo^F3&>KwtErr2?(;pgje;(u4LEXoCmsQ>KYe z)N-NySbAkd9VqSl-6Xaz6j&v+w}ci7tTqg2q9FQ=1dcI6=#i_^Y;81fq7i~#c1&Tu zcwk*w33k90DOyW4fdPYG8q)dd0%wcNj>*iI44hY%uPJbi)TP&92`z!^Map|H&nqw% zZWQQx)a-PX3EXNVP_rqugn9$FOU-_YAzE3Opb(A2pS_H?TPHu+ZKRoh=DGE)W{2z8Y8(_?B@2q@-|Yxk4=oJSq8}2Iny5 z@KXZ)9MIkB=)ltgy$+q-kKajoR-nHNbX?$hfi8j;VHpDdSJw8E13wnpd+@AJSEmGC zLi=z6DbVSGR|ML#2$jY)X@s7T(Yh}1nn*cAp!I?60%22$^3DkSS|GSkfCd6@8|+)% zD`y7&D75>e-_Htko23#41GCHyb#r%Lv_o|^|FUT}b#}wAn=Gp@_Hq2sp*fYmZ8~)5 zf(C|LB%Fn?Ri!(IBdsdj*o^S+Q(iS&)dBtAjs%oF<9MT69pKD}cB{3M`=YjbK5=TS zR}I!L7}u*lun(;4#e)-ubrOC~FkuOQUrqeS5-t_$L4yB{ggp|zB;j!qZW5k{Bz>!d z8zg*ELVNzZsOM0X9c@*0RSU))ICO1->916M96xaATuI+P?l0hZ3SqCx@3v1YpiZuO z6=v)1_(x3vHE-OKajoig=Y`6IdL;BoQv%+K(VS4v&Ws}bptc&}!!0R<7d5va{6c67 z!o9-12p^a^AK_cI`yjlbAS%<@_-;e8>w5q*(ZmMck?_?f9c+|`w!c6*w zO7OIPj0I{_$BD>Q!nCSircY`1@n*xTrr%S~&;JO0^we~Qcl0p4zx5-wPD-2x4YaB@ zX^~2-K)PJ!%r?KJt?GrI(@^5~Vyk0p`x!_Fry11@Gt~)od3ryjU+B58I-u57GS{9h zXQDn^`aedCUg#MFKd1;lJADayJipuJpf*>tE$2(=56mMcsi@od1>*v$vxRB47d1@T zSfu}n`UKRn-5EYHli`yM4Es_HFNrg}2e|_3*=Y>FHILynwG1DH{D3+`!eboyJ}~J@girP}ynfQv2=D7>I5>&9u0ksU>WWDZ)CANW{R|%#%pF2q-%1I2ssD<3 zH#B#v3Ej6N{6Y6!2)~8U?~8j=_cb3n^w%`QryA}Pojic>SIr;Cd)5A_hnsuV2?!4y z+PlrhOnJNi-KK7}L&CpFc&76W@UKIATh+mx&!gOz6F)@QI^!jVnHkX1-Mz0O{bGiC zJ1)a9Grj*!mKZ`;5AP8g^L!HxnFDuQa@ibhz>3c(-~EX@5Li zh?(nC*{1<@s)YSLdOUF4o<6NA*{bGnMhAW!{h+xwa8UH0kgx!~+^TNC{DN-`$pQ7r z+#M*zu4FoipG30oc^&reB#W3|N_a*1<2ZbF*bw;OuqVC_4~Pd_4jsxYU>N9U_?c#g zAJ1d>%?5^FZwt2UruK{e%}lCsf!`q<2`mgI)vKW+5k6<7LP_O@dl5z=`y+fV@<)Vr zw8~1VJELiYHR|zjQk{lemO8@uCc-P6dO9-fg47#np=D${LsW-c8q=tJ|CE+voA$&Z*FDCdr zuYsSE$@whsKdNC3e}FKc{u(OpM=dSc(yDGv$MHP>g`PFl-D&|^+N~T3w6! z#!Ul$A6T$}dJ7mz+r1^J&Q^0E1J4#Vx3r7Msn&3-da34WjP^&nk=I)# z?@gVI(HNe@@Tmrde@!!du$kcpwG1C_VR#WR+RAC`*Q!Eddo$_NP)ZCIGJrMf{df|) zfXjtJd=uygVq2>o7WPx+(zd5n$Mx@kY_EZR)k9Lm4D<$xCMDK4(>nZ^yy$|Cez zNLpWn{s8FQB1D@0_e|)$d4C1;IiX#n&Z_*d#ZdohCG{G0+Ke5jVI}qygigsMVqrB; zpbMqEi0n7uYuEQpi?v47AwqjbQD#K#1z+8-SyUY$(60i4&e`#(I$NL%Amz8q?suo^8P}i&P)*RK^r{)%+(_3e&&k1ymdMbH&>pbV;FG-q??-K|U25q#wY zQq1~qweF?P#=8TA#??RFy0^M{u7(~@{G@f6dPbm&Bh#ANjpgcx9`suMu(e#hA`p9e zd+T!bN00VIOQ*5FdcQ~usQp!B9%YjA?biKOeG&RY>w&7X2>reFVAU_s#gQAQ|Eu*- zwTA~C-$Q7>B4?=WP_@aUy)r)Dwo+Z_LBAfK0JOz}_D?jlty0%{(9wxzK(~6(FP$lB zwYuAb{_V84tyW*rkj#L?)$;;r%^$9QF3|OA;nZ~7;p!s~I;^(0?FhBQgD&b>*mk6f z;Cz97`-f@E+m2Rt5nA1LjN-3nlD4RBP1|v5z6V`bk#9Re?Nx*>YdcXL?LkjZy{YYF zb#f89yX_RU-h*D7`Doi(c(z*RYcqe)cAC1e2)*34PCX{jRjRG$&9?RGpB`=7_%&?< zs%5^HFY#{M1~tcnZgJjiJ5wF%LD$FMZ#x_3rXJoR-CYQcCpUp?hP)8`S|=0WoXdc%YE zo;gLGuio{bV=D=L-mfdPMRM-U)6X}OVg701**k^db;dtJIJO{jK)Y_|@tP5Bjic zIcC!>9&~d3`uH{Kiyrj-nPW`cszh1rUK@Wv4iQk~!@}NV* zo8vdCzj{zZDpGlq+TlU_w${hDs`x^Mf6u7%nS~->23cHdv6|IRgtxeSJgfzWQ5GKkdTQPG7*FbIV1st zOp-9DU^pZPh=c@kPQWN27(i`tpg~1NI|wumh~j{vphSjN8(V3yTU*p1h@v>BRa(0H zzH3#TlM~SI_V@kqyZ1iN51##=^{%R2Rl92KRkdr^uKXpYMJzHbzRw3So5XU%=4F4} z?IH1&Vf#}@gl!fd8g^62lVMxLmxfL6zBlam;%CF=gd7NaSim)LIqyl7n8}M{c0fFt zn9=hwk!8Y$6l96*BG0h?XzA_3VVEoW?cnXALNobr@B}dZ?~wiD{6EKS7aKWD-?uvi zoFD#?MXm_lA%<%fcw0<{+9^gE);J;;qtEe%kq6u9O*3qA{*kU7Y;RABss9}cdyUx? zKJQeJj(N3VI%ch5I%czBnXv1f;x@xJ^xV>Ir`X7Bt;p{GXxFF2H>H#Zl{z8qX|Z$^ zGchy!mY8S6dS<8O4+Bat-?@p|arswR-Lv8m9TVqer9CVD!0b?9CTj3G@w#CPQ;5A` zSZorpw+#EX$DF9=#9s}Yl}YR)!|F2!radQ4X(mo##PYoO#<2dOd1=oJ+UA;U@YzaUli=L~4W%bPR{dJ^6_A{wd(tKg|jon9g z`=j?fuo-EGeeAp7*=cWxR?hEK5asY^@tR?j!=J?w!zhP8i}y5>l*6AzyJ3{(+oGb3 zl079UzoTNMVU)u=VjnZAB~RMlMBEsPNvt{Tn8;(MbN@(;HjHxrNL*LMv4t7swGmL!s7vfIC z$d`X1?lX+M_ZMQDVdTBP5YHG!-unyjoM!C3zYvEEBkz4iyki)7?=Qt!!^nGoCj!TE z$pm@t??peu$b0`JMi@rk`>Ysm7lhLKG~$km3CO+?Cv4I`U~le-Kfn~0b18b&s8kvwG> z*+h5QZW!4_52+^Vx+a@Qk>Q4sO{B^mhLKIA%KnCtP4tw*3?rLJlVygHO{B}IhLKHV zNS9$`6PeO&7}-RYTwxg5L@#-VVPq4%m+7d!F2C7>zvgG;*WrJZf zCMuMaK0Kd|a=*mKD0d$Vquhtf>&$u7n#1KShLOFDkQ)r6wk?wOa!!-&+9AUYqkD6t zY%q+hyhJWBjI6v={>d=1@-gyV!^p}nlLIPrnq=h@WuakY<(JD+!^p}f$?=Afm6yw@ zhLM$5$k~RGU029@!^o~D%WDlIyPhIf7)EwIRsO~>vg>Jby%%X)gH~vr|Dd%9|~pHEcuAf2GZqFEd+#9PH_HpZ`(l=)*U20GV%EvuFk6jzjqwQEVA#k$6<~qbWP@rVWkgtLoh)It zLM$6}W%>fS|0)WjYmj)u_km`Ct5Fkp-)Go;m)H^Zm0>l5vV>dyVAyqoGJ3k@znSS) z@yL+r-ZZPzJ#vU5JsU%;@^E(iY2uSMzy+e^1R4P4W%HXmsBs z-!Y8FZcVa{Su@hiN^6prR?~TFMPBrc>DS9@X3gTQ_*>GK$ak5o6SpPY0T%6|n9bt1 z!S|#umCw#0wn97>l_i$S1I+X_ER`GQQW(|C1Be+~L+p^qiR!PG$!KP$WI@g&>C5DD zW@|-tuP4)Qkg3;DOuC|so;S!r%yhdimm6y-Y_+h5>`7lCpPWx@t+*q8fBKDbQN3p8 zdc2XoQr@f?&*iO>Kbf$C(4*! z>1%xKlc@IeJ7m0vQlWDGoPMY5#cXw84(0^b$`Z{)mpqlRR?akRepWEp62rE3kI49~ z+~{Ko8SCX9!#2Vz-YwttvHY-mWIMC9Vry!Tj1BT9W|Vto#=UY$Bb8-^n1UJmjk07B zF?z1b&e$k_TCBsGhG&Tf<(6xS=`rnt@^K#<8umN6$1w6QE%If<$oI6!!-kQ!X_4<4 zM*T{QJY^X9o)&qU*$QzDuAxQRnm9l9`kQ2!VdUo@lCg%7pWiI|7)E~nVVP?f`T0lW zXv4_Q?~s!XBR~IyyxK7G^H0h-hLNA&DHj+#7=sCQD z(GzaB-=eKLk%O_JuG7lqq()ivb$kq$%kcM!^n~k%OQr5B_Ech%vOl?y>1FSEL}Q` zE%^=EWEffUpX65#4=qI zWXT`M48zEhKa~9qBTN2JIt(LA{zy(Xj4ZiL))+>Xd|WOyj4b(Mxz;eUk0yl#IARmyE`4pUMowXs+wD9BSAYl$8CyXvg`iJ2Zy?5upw#H2PlCr@g|Be{RdpO~!^Z}wQ0@lQGEM#^Dz;8ED;zvK|ZzU@J*$gu0f ziA~T9IW%YdOIG?A7EGxoX2<0ND4A4C42yu*m+IS9l*93$+lJkeA=O#UyVn)~ZY@kgoWTvk@KrQu!;T^47#jIJx%b%?Pb(djX z)L2^=^?+d~?AO==Rf}Oq0(#nm)T@SF+hw>tSe-B|B5=ArM4j@+4E)iK$%LDz)XgF> zC?Npf>Ke8^s34%L3NS<=pn4Mc1AEOTX#f()){9?wc_e{)_Vn}GL`qVEhUVUT2hN>Z<@#?ahsnm3}c9E!D z%(R6hskw%cg(RtuH4FM=XfD|2CX6g3NquX=$U>47ZydUp3OOqP_@h#wku<(y2&rBP~G7Rdnuz(ZSV^lu3CIy zhcbq%NBqKy)J|X6TNy>_1;4P7>VPlo-Hegy8^5p;^^-5`lZ+CTemh;ezJ^h%A2YhX z?=nWIX?|gss+qp9e`j2(*7${uQR{tSp_yaUKEJTB>Q!IZTNz{3F~6`0>LfFLA5Bo- zbPD^4S+jUiOzJv8i94vA&EkNZ)ODf?WTx%&a@CWWz8@y3bi=4^C#mN(3z{;lDPWS? zXTs=yn56z-!l-R0siP*WaKIOF zsYA@xijuI46K1P69~+l2N0qGCF-H~^CCpW^cWFksU!(dlqic9Iex5qaOy|B(z3U6Z z`a#uZ&RZ)kk65VA_`>jXt$t>vThp!Zc!z(-CDo@}jnjuN&s?mkeQZ(YwQ9Rzjp5_d zuUFqOqjB;Lnb#}1L6?(y*y~jgv(cIVa@8RdnqQ(3`wy{{lHAO`zodG<5WyoFtcX7{cg!zrBZ!icClIw*DR36 zOE;+reqlGMtC?w=xLM6KjBMg&^@V0ZUk-aD^JewE2_u`hS^dL=kxksJZ1+=H$d;tI zMLoY!GwR1~QHPk3y*!cm8}%2>0)NIV$F1r!U)Zk9TUGxD=sZ0GvPMlatRQD^<{JJh zwro8)uVmh)p5-t~^R>*|)k~W3YJ)q}A2s8dg*#N6VKlRFhYEd=a#)S|y1ij{s$o8s zAGTIaG>m5*)Ga=SSqJr?W`PlScXqe>y_ON*)|h9B-V64mHB%$nVAlIL@n@z{XO$h)#?ko zJMnS#mM`pz#2xArzp$OE-7oAZmA%EApItnwikN9j-la+mBTL?;-qS4T#-X;XUFx_A zBTIfxeP+VQlAlw5XQr>{c_p`cbHICT6~wF=Ux-XedtQYy(>A|bh5w#n9+zbEyH$5) zI+YhxA7;9ZUQjvAnz8%U()brtiD8e)rSUJS)rP%jUmCwhtz)KB*{goXOsBF}Z8I^? z$fMR?^{8LiOX?XDHcZY7eM!A*SReI5{L3nQ8FT}U1 zX?`(ZQFXqUcClYAXQu1=fO_6As_O%)`eDjpg_vWPV9S^t4;oTMng=;9F_oSqIfNX1Zht)eAlri?Cxp);;T0mHY_hw_4l<-}*Wl5n0uQHd3wT5QWZ1FP_P94xz~ee>EWG}oRFq*eWAVM7N;T}a2zyfvFl;Nr-c*H# z-Hln|w^W&7kHmzFx71X_{)qFAsA|JL#Cb}Dew8wp@j(8c)`$&Cg*b6xCBX!2Gz1_D3 zw5hX(z23b&u1$4$Lf1rI`p358D%!BJ^yawZs;6Q0=#On5tAU2aMmNWOtS&KZ58C#G z8e`adu!$3Dnqf3zIjLNR(TL@wavMe?mQU1j!)V0viMpLxGmjEZsrwD1QNk(ph+#DH z_*CsOj7A=xsso16$m270#4s9pe5O7!j7B=A)fvNRq;p#R!!Q~leXhDZNj1?NNF$`r zRg7UY3i?9zG>k?;U#LOMR*S~)@T@axgl4$^?Ba~Nf|>RcU#jVbk)QZd{j6D#V`zW% zrLuNXe#hA}e5ryp3nI_(rHVIUt^KpIzEW2iM&rS+RTVSsBfnAg%(U0|MlEL6EdDJ9 zW__cU8}_y=$ofv*V%Y2U5n1i(w}w3*@cWD()cuB4cG;2fliFg~PhCc5{X;!&*o}d2 zWt>yHyypeJl<_b1vSBi4SB9`&HEdnbp$ugm@rH>BSvKo$hFvAE$O^Dd7}jVXm=$Q9 zG3@Suf~;Wc?}lY|8Icug{mZa@U4EZ|zx(&46 z7Cu-OPY(2=63b)4@%6;?{^8*^k(NaI*uLIS9h34QO}9A0wRyBtMssjy*%FPc*_A;0 zD~l*j|8#tj%Q0>E)`oTiY3@loE-VIi5w`=S_%4KE1`OvcIG4vzHYFZFI+nPf%Q*ru zDMtm(wK;Uwn~|h>lvD7Rk02d|ue#`5`X}+-8EL4@zjhW!M5w;HW4$QmE5YI6-n07l z@s}wz3bjm{f8zA13{rSy3Z0BP^rrlLES)tqwL`O?Yl+I~ZHwo+lYHTo>X?My)O0So zw4cRO%KBVNUy038l#Z5nWOc}-w}jU07(_7_aZT!T{gG;nYJgDJ-eHcZ^%vI0UlP4B zDSk&?J;ycqTrbkxfUjQy$<;S&5%fDsP-F*&T96`nb|dI`sbXC9q!njXl(c zH-%!hVV#SXb<0xCNVX7NOa7=t$Y83a&rt(5kpUUsB&Se(eU`4(|9u?)`2QVQ+e1fQ z-g7I{s0n7>6ye6dR{ z^8eP=`CrjLf~oxfU~jK|l-78C7qws+x1bIsz1N#*nL;h&-}D`-@0VY@XFF`5b4}_x zB>X>Z5B~MjQCi*B_`5tQy4+N6^sS2SZ86&zO&V<)e`lQ~NHR<5~6_b==$P+_nA=F8>t1 zyLCVN0j|P3e$W~n^JqTl*K^7f*((w%{*KQQ6e>k=0bzN6LjTs(SD{Uhm=Gf*0164n1G*Jy-YO+9PSy^)?@Ux`i+0 zJ1o%2w)8nhP1rLfh4c#J@C*M*(FdW5N9j_u^Bwvu`*w{NYWzblly!U>QAm8lPAO00 zyXG_8Yxm%)oohV5%-;Cq>-3Yzg|)3cu)?>`R9AFIdu9K7wnOht z^FqxwwjBRw7Ol~J>-jZo!&m$?(jEZ}z*qdia_b^mhc78hhugl{<=F~C&6ODgQ z@gVoY7oPQNdfi)H82{Jw=i3!}J?`1*-jssw?#`&6(En@fNYiU|`xD6L>($6@dN zIK0J(!|t!~*gY>Ex_Ic~p^JyEyYPq}I8qQl6-Ne+EG${g63cL`z;Ppv8re(Sj#O9R zZ(QAtUHo_8SRwMTKV2T=JjexzGYo$rY8d2U@LR(~6OKkvj6GgPBfrtmj~1~wns79V zOOf-Xq9=~Y@=}qB-^=maUyc!d#2CaGgE*Io0r+bHIr#hD*fRoqB~B2-u@~V;ak&^J zCLu;Sv=xvhW3R+1&`-mz#nX__H0<^_4QWh68doB{DPDGca6S%;;b&W4xU43PvYm4dX(_CdL)O7%aY`)HVT=#A`t8U&NZz_?{Shdf?mp zEbK5$-{yQP=pE{}kcWt9L0`^FtT`BmUF0Z*Wbq;PlE_vhJAkR!la9*PkI&8H_*W=; z<9&sqw|<3U2Ucp8h?7{MRl;$`iu8i*Xo<}Hr+~e}c8g6az2H?KX*Ma+Jfg0|3ai&R zp*Uj zYPFmNDZq)qNBDb@-4?9|XtjRqn+*-cZ?!50XRF@wtAsJoyZcTAehu_U+8u3)ytlgt za?Ze|Y9-gt8pidK_8i*CCE3CyStIccf#s33H_~=V`x|YSwAaygNoyUS!C9fU*Q~b^ zB7wof2idku+Wly|q_vNGICQ(DoshOmTK{-}HAk#ji8mnru@S3m>m}`YbQn3lX*`PmUKS8!d#6u-Tzk&Iz4jm*eZP{x=#jL`i9^ymK!>Ea zpko!)%veRWR3qynp9{ELo*VH}K&tIj?yCX4ZKZf?j4|jRZ zdTqoLUA9Zw0c*RY^{dlO&Agxg88oyf)^c0%%RT(rP|t~T7x{QJ?d{k zo46()v0XmmbkGvyg5CBM?F6>l$}5TrKFRm*N=0|^5=E~%!Z zR}yO!?HRUS(GG}f6s_&uh&Z9PEh;B;YcLQgx7xM_zZBeRdpP)D@M%fwzPCf)7W|B& zeRN1(s$R2w8`(8vk0LL603|F4Ic?FGYP+qf{81stQIp}=Z?$dU*pS1V{%h8-n4T!@ zhmld(4fy%Q`j9i6*I};nR*?|@X-GS3j?0&O{2a2-qV>b?+1?r6A8D@Xp+euYkxwHz zF!Z>5IxZ}f@`?;SqiBb-bLwx{?d+TyA2bk1D}!zDmZ7#*@g%;FKci^>vonfT1yk9k zgf6r)vab$3ZQIbZ8Y$CWH#Vz1YF=n4=X*@jx}8vqFdFHs2yN%P`!L%8UHdJe$PbV@)A6$3shi--nLnd=n&nX^>#2 zdaHmwBP@YyCPC6pDuhFU^mRvqq^~*>Bz?`1An7ZP1W8|SBuM&dBSF$mD2R#gGLQnk z$4HR$9Y%tr?=KQ0eRq){>3fR=N#9u{Ncz4aLDDMy1W8{|BuM&lB0Fa}3`_At7LQh{QBuM%?HbK(Y1-_>o`%q4|Xh+Oyi}s#ekC(?ofa8Nk18G(3 zM$`}WGQ&p9>soEmUX|-D+Cy%=MXOw^E!t0`+M?Ynw zShR2DGZyW)@Qg(}D_oAY!`_S*?PR%!+jOVxjS-8wwTkXNvcwe}x)JTTrQ2@n+=ye{ zq@tE39E$HosAZ+1mOag_d74{ODr!xss5Pac)|84`Qz~jrsi-xjqSlm(T2m@&O{u6g zrJ~l9ids`DYE7xAHKn4~l!{tYDzZAMs7~GLeef_cXWBX>Oy#TuUc;EOFGL z-8V@N4lh&4TR81^4vq~!27TY~lh&OnB?zTmInVGNbcT24Ye(;v5O|Vy;zTIz)4AJv zHQ{#1WFhA)+NJL#kB)5cd-FoiS+rwcD9con?}qQT{+RVicr-krT}0d3vVRCqHZf^e zzjT&Q3i5LOY_zvuKO3!+%|rZ9+ZmL9ZbTvC?6o_rOW@PKl~Z$Wj96$NpL27B!=hIB zRu0O4AYz4`Mv1rB+fpNfZm~ZeOPI)VKzu~dSlG;7dkLrcn)P(_v50d#mLp%(C6a6= zHj+HpC6TAC7ZXb(k66VR+Z?e9a>hiCwLRLmIz#*wK9la1pQ?xx5(ZLCN>pS2C_)tc8BBJ;MHcVn`I(YGjmzoD_8$a?hxh7WMus zx#sCk>>JhF{>E^^6XDrWYdCa`FLW@6YJ4=z!=WBu=tvG78C7eeG;84}bH#hAd)lQ@ z@2PH##Umy~rCOKung$FkngPAcnG;oQqaL%`M*UH>ZBx&4wrU%V)~J?#8|C59CGfpl zx?yyRwW2HeN+aaF>^GxU+Gs?#p7S~`{}P!Qz1x~TxL=khIp!A!+59L(;k|hon_j4oT~x9FkT* zIV7!TYC_qfVzzV5JY%C>RG$%4hkFFo_A@rxQMKBl9fS7ZitJ(!?vdZcJY%CT5)YXB z=<&EAViSDPn=y~DM@o?Nr5bt!_Tls`T7sl+(2lZw9%cJH%JzAH>*|>8Sg-c5V>a4v z^_Y$JTRo{$w*L^48QW@|9+49ps_5w;RMFUMJNIHW(uuJRJzum1pRv(?rDtrkUuiqi z#C#g=R`lAC>tk(p>ZxsZ>eJ7#Ce%)QD2Cc;_ry>;?N=IVr}0dvo%SdVwbPEIp|}>i z2(?q68)~OMH`Gqw=j>Le6CaF?w$l!#(VR{+rxR_b9ZaJ+wP;Q)np2DB)Tl3eBR1K7 z@!$_))9sJ;{W`XvJufUvMB8aU$ldCqu)w%}cDjpqtFRh!A-lb#dvkj{2-lJ9H6S*E|;dk#r! z1s#%B1v(_H@pDL8&9{WlS`WmYlNLQSY`3Vcwp&zJ+b!DRa=Jxdzi+o_7u8yecgwPV zE_^?3yG7q?I3%r>Ji}hS&`!Ikp5gBt2nRu??;6fv?N@1hJLgiuHd6vSJZha0w7V*e z@n*%3wbLG%W9_u+b*!CMyPn~FSjXCFt?L=yjkSW$t+3PHnH6?gy=r5Ns<6}A)lehT z%GGq1+by!{bIA8q#@ON5KfNe;PC~1FY>X%2 zD006p;haVL#r8ue+S*1n9Buo#@ab?5m&aqLa(du}wsiBLX3)Q&mmeDDw5}W;lsMf+ z*5b6b_d*-l$U>&u$U>&uXjb7{8+pI&Hd+_H#7=vxF0qr3U1HZ7%CSPyO6^wBH*ay` zLVTCMEO90B4YjQS-krFf<&7+FVR<{t&#=6QT()&2lo!=`8nSIgjN+mP;7NGFC87XRKzdW%MvEVO+_$hH*XPM#e2bJSnqW!j}I` z0M)}-miMq+!SaCs+S~PTKzmet@==!eaJ%fWke=M#S&pYDUyv50_qBm@*Rg`7oc>(82aVCIlsXc%!_8jtp#de|Av2~%|FtiKV zVRRSLdoX5r)0W(Y`k>@4G#BBJwDQ;?X~nTa(%NE&q*cTYNvnq)l2#2nB&`p2NLtbB zkhEIYA!#M9L(&RdhoqIa4oPcl9g^18IwY;Bbx2xE>yWgD)*)%NtV7beSRnTov<}uG zX~nBU(%M$U$0}Bbq}8hqNvl>Z5h32~9*9}7ukm+%V_1$C?a6_d6*~(|5&uf=DmDu1 zqOM|#7<*A9X4<|^jub~2KVZbX8e$HTgn5$A9U|%6LisPmTm^lkxR-G&<7tjLL{a=g zMe&Q&S>#foor~Kon(vBxrp^C*0YF{ZoL5PWxd=zQtY)+{C63T+32h` z8=ZC1MlnCL9RQxOy$1Zo_9tMw?QNWO#Qt@%67vJzhn(7lN|?d8Dv;z)f++NK(EHt$ zxG3ZUU~gasW@&e(48ZJhd-4FxA1C!1Ad*BnFijK#`--uQRgBAkx#BM1F!2GfSbPb* zO#A~_E+Tsm5Lb!uz$!5vI8Uqvx*4w*5A`m_I?eXvV$2t}CzoP|cuz_N@UfIC)>pB< zO5BRSE8*f$H!!wOGlw>FXfr|=_Fu>P&6r1iEM+st+{*Yg>ksl3z0GnPcCdM`_b06R zp5s`O&ayBAvnR#Q7zK>&lPVL%=l#++G>!G?tj~acXG$*1#T;77nwc!SSY84Asb4c| zRF4J%?Z|g!e?1F zE}@M}XyX#HoW}YzBa=RZz#=OoLYaLUrowQc8Xv9q->W-t~(zbD1Paf&%k zG3!eiovg27eHCk5jLmkgTb9=`wjfSypG_QpGsoY|`mKylGw!ofZM1Tn{TydM>kj~9 z`y6EXZI;_O&T+;Q9PE;gSyRrk69`|#F8vwj8Zn_1t?`jxC-#qv6qHvu0@*~*%yS<}jz z{e0Gb*0*tajrb%$1efO|4}U&?XHIdmq6 zx>&QEkRYi<|na;yCL#P7CW>SihC^2M|BA|3Q{daGEDs z^9gIdXS71NR3Th@K(u=Z*BEPxIkc4Jat^Ix*~Qq*xQcO8NTNvWznSH&jIFHM&nX-T z`2sa?ko6~6V}(+VRw&)wY4|e$$d@%~tVxHA+F*TgD3!1Z@}89CtZ8P=Cd9#rg5_4m z{T$~2pL?7&Cs=bLl>DI;#yN)FkJM7IBlfF((pXa*Mk!YTWBXLGrkQaQFt*QTmbZja z`S-JYB8=MoBx|g$B&RVJGgft_(l#@0X0*DICXKO}v7{TNT*dP8Zj^g7%PlN#M(CcD z{j52`SQJiWYYV4zL zc$`tjQRs>|%5f9p$#^Q;%mm8OnLzp#j4iC$#BwX+aYmU)aZ(u_j84WCjGGu+8ILo{ zB#xg%_2y)G1>iIFc-OHRZ$zeUMZGY-h_r#M;P0!?h6<19-&2OuV+gVA{rrP<2z zamJMH6yJgIH9Qr|PL@|NZenchPG=owS@c*ZhV)JCLGc}oPR13Cn;275IF!-J*vfdE z(UwZ}p9)OuU!6+zpW2h+I~i9nw)UhtKh7xAxOEsEj84WCjGGu+(#!GY78|5&c>QQwl2!sEyKxB#I~cw+x~9ZH%^yDSrCJbf@eaN;TZZxV-Q& zS=8@jA*G*w3E{p=$cOB^gzBe_1*9 zO$uXr5nW>u%Oxz&WVxE<OGe;607)j4KwqnARV#>FOvAUR2Ue5AL zmRnff!ty?r+Za!>MwHOGwh}rkh2;{KXR=()@^Y42822$AV0|0QCs`JyeC>=yj58UR zGp;P9^jlco!t%aSYN5n zl8YFZGqy19o6L72qrf6d^m;&C#T3%FFz#dhfhpvpPEMinr%xq30EADNM)J%ns65LV z_c69HiYrOq!YHm{t6(f*Y-4PhPI2}zrpzF@h;b(4@)=aBEi)*WeJmefxsBzMEQ_nT z`=G(W&jwo|K_Mw2BSWe}mV~SgeK=HxMTD&ldpqp?uAg>2({+5e z+HTF=e$(xQeOL4&(TOoRF_*<$7jq!yWXz8-sj+=xhr|w#9Ur?oc75#5*o)(eY(zj=1OIUWxlC?q6{$A3hvJSE9v6^uqV!6%g#l^yj6^K>hMyyKQKLo&Kh$GVKL*le2VD`C0rFs`itTym(3$ufI62e^0z{6?Ma$97%$Z9 ze)^lC+LVh;?Z6uo$lABDM%TYCbMeLhgkI-c z5KZOR)}F!^rAvOMz`~ky9p^U}ck{`a=`oPoQYroFSjy`W#>Znw{+Q)Z#zZdF<1EV_ zRN4Tx+Yzjp8cHdwDXzf*4sh4tcgV2 zVGVW!+yE3pRUQt(^Zz}w*=X=A^9;GHNP_8@>qRbm6mrNq4`krMZzEDC?8 z-2vPPuPMa?Kk}L5d-dHHH2kXd{ zctuPF?#IYh&jN|;e8eU=F2?b8T^H5 zCBB5mR^lu8Y=w2DZeXlz1SZJEz#g&*c(J@5I8-hL4wE+k3*`#nC9)YfT&@C^V*67i zM#)=%)8wtVx+{RFXL%dstAGmcaqj@ml52rgavgAqybE}r_Md;<8S+zH$%p9a1lp9Q`sp9AiZ zyMcSLv z*iF3y3|D^zCad>=-PQZRO!WaUM|}j$Q^$c7>I86#`UE&beG05pr-6;?3*ch)C9p|- z4ZKc$3tXYTN4?z$#10zj?~qpl6?Ucj5%Ovv>{FeEd@~TWr+$X~8z5>={S)#UAZkzj z8}jWy*r$>be~S_b`@~=RR@gty4!mD=0Y0FDfSd4F)3K)j{#rU}RdqxBCxA*kqaq+b z3sl&zDGKG*Z8sxJ; zd|9e8ApZ=+U&d5fkpBr(;$K)BkFOAc3ZF;zg)D(eD62nY3#f$68VK1A#9ky;Hsmfq zB?7Hn$U#6Qf~|bWAwaa9RRB2*s6eXJ zX8>U{*5#11fC}$a%OUp$D$&Q947o2*VGZk4$o+x%!q&P1@<1SL%(@CV*qR{&@#e4) zU)S`3{|Usm6GJfS>nHQ!!yZ)m81ZcZ=83shK0MPYt2gj7t1s|#t3ME{1A$*z*}!is z{4E#p9b%3adA8ob!8RHb4zW3aLu~_rg|=+qa9c63$d->WV2Q01ILbB}c&V)nIL3Av zaI9?{aJ+2-aH8#U;3Qi)umXRGfwPh0 z7%>+)P7_-YI!*i@q0_{}HYe~=giaINIdq4u3i6XE&y`{qVqPhpN6ah53rOcmtic)x zd)SeB` zT4*l?4!4iSSat(qy2X8n=@uL93xN+JrdzZiW}|o*F&o9Bh`B@@M$9GRPl&lh{MkMS zcoZ?0h`%7_GEp7S8#p_lFK}+aeBdk1E$$Hq@Y3;WTTOV1@*jcX_wVt%1=&uLfDc@xjHx)xkFf-yQs3@K?bJA-zJ%Lux{5 zLz+T93i&!DKD0QrA@sV?--Yf7JrH^%^u5q8LIc7s3i~qb=dhrz;a%gpcJG?ebwJk{ zUAJ}J+x6mZ&Tb9ezU%gnZfW6{gijA&9R67NuJG5xzY33vD2OPExGKUO@rQ`3BI_cT zMm`;>qJ9_kaMZ!5zedGH&x~FjJtgMqn7d+Lh&dedc}zfTeC)K?nXz+Y7sW1%-4gqk z*w13m#`cY~$6p>_8{ZPYFaDqLkqH|U9EmFv??~L5_+;X9iLWHSmUuMr{lrs=Unc&P z`0vEvq==;Cq_m^~N%=`5lP*h|mgG#TOInqRl!mo;JUy}Hu%eGwLAN&;k z@V|HXD{OvrWqvC8e(Yu-FzT`6?zHp0ehKdM;W$R%D8k{u=x8LyL&Z2saFpU0g<~|H z1TV!=hSAU%9G77{G#1A=9OH3Jz%dcWNf@!INKKj6nM0d9gpnAUUwv9E?J8 z@Z6Y#aYzoH9dj@e$q@^1;2Sg1fWr+><-usG5yv9B9rw4%(A&ga=Jy`{#S@D8 z-C@eR!<6?)!=E&Kmx=eh`F+9s?lHeFncu&d-@lpPkInB%^Lxsqd&;EyjnRLHUuv)K zV5#)4ojKM^8UBL_|H1IH=DeTHZ>7}r<21kXWUua&PQ5(N?RCBRy}{@Yns`x4pBH0( zNm-@t&E#n^xtSrw2ZZwi=)U$>NjF|upmJlO|pH6jCV zl8Xc1gM3y-hXkn^Az>;yWU}fSxJE>W{1(Sf@TYOSsaAE3k#}}=OZt7N>(%nnZdc14 z-DcvrT0Vu}r|`QA#~vK7;5dZibsTTuIEv$499;viMn2`%quu84u>-$vhtIK|!tX8| zdvLsh;}DM5alD1&D2{i#tyG&MR-#-h)pq~8sX#8xZ9{-U)Za+*Clqyooe zl@c>qW#Ty6ZL;bY(;fMAw|3xo3db%SdvLsh;}DM5alD1&D2{h=bPc@U_H9g(yfk*C zc&O`HT<4FrsJIY&MVtd^7vp$b%m|5*GeUOSyCvoZ%uDV9Zx$(T!7(3RaWMq2T4Nh8maKQB~z~yYf?im&9LIM(sM*en zN>Eb~9N?|NJPPP^O(r4=APPGbm^G9J8n<(SE^I)K(&=oR@{6@f*)^hNFHD2#d*(0b z^M6^5*6_y8%_9lfO>$M$H&naH^jJl$GPrY?!`)O@MG*?1AJte_g`cu1&e}#-h0{H+ zyuPua%0;RYr^l&nVv@6N4ylUk=P#(Kbye#oEOu7SCGGge+FIwVT0VzjI2*jo+zKX) z^X;sf&;V0#Rd-gFE^I{3`lRCey4f{z8WD%e=2+~k@rI0Z)-^h7C%N1%&v|7pu5X~S zuy&GbwpXMC=o%W`p8EN8ZQ3xQ>bOv!s`T0g4Y&gy2hsPbr`Y?8}aJ)y3)3Gr%O zKJA1BCVYysp@s@h2~t#71I{i-ZBLkW4Wf5ab8Y;Zp2|AT<(XSwJ+iT;R;R=5p=+Kl z!!!k@=~I?b)z#K`P(Eq~&fZsV%s3J6EskVHyXtV)S8-iksP?w(`N3r!J`QP=`8O=? zGN>+fy62X=JQO&##?8Opsxy47^SUMk7Y;9|tX$mSTtMRd%F0nSb#z5!1dK~fN_Qem0*0e_;oL)3xIHetJS)4*PQt% z5c`%~eObBQdjl~#H(1_zikv+EHX58~+6Y4D6Tx*cIlxy;uqrAYey=gV4p>UlbuKnO zc6Ykq4Gr~Z6>@*Nh@6gpP34P1vPEtTj+hP21(%!yWv43w*9GGMU%}3gmW{ncj6Z}4 zf@xcXP+3{-ae8X191RW5rn0&kPes!LS9#5Ku1j+A|Eth~!RM8PITc_|WhGLFFIrMi zd48nqg7eM-*X8E`U-{3EmOVsQkFQ$uq3Bc*;5s1=@FjG9wCsz2saByJez7RcDK5wz zQj#+=e@JQZ#Ut|u7Y`m)T3qbN9XVuFY0jYR{Os)ff{P0Vm*zW)M`dS^8d8#%oj)jl zWJ$@8+`&UikVvNzaiY{obAYczVB_km8*5#|Md8GTnng~Jt8D&)S{E5H8lt|g#N~0; z)Vha@iyZ}dLmVR=j*AP1VbAS(@@umw~d@E^^ilV7Y?P&BH$yaVGy(Q_NXtvMMrTomlw-SCw!RnB+S8 zLiYgEoru{ORS3Gv*o?d}bw@#?-g-B6lLNGgyf*)ZQK z7lx5^TTXHp0`#qba6mVX^??`VsyMikO02o-@_-Zgw)W#vd`)jUuW zINmw`7qq&&{pB!J&wRKD+yUgLFHDh!K))QK@5^5f(>eZfSTT$jBi#$L;;!mK^;lQk z9M9Yf^%zvsDC)w1k+3~oxL=K;%lE6nWo~Mc3sZK~*48in@y&b=4Ca>KC{gJa~q^FaZ-qm*W@0N7XmXcX}>7 zPiJ{4ZfaM=~msB?Mn$;l|C9}wJ z8G?+AR5(1hva*3^2+%uY?y1U!Zj~-`Lc`R#H5i*LAeA0ol+{tvpo?f6qdS%h<_V}G z$(t3!>k5xofRdg7Sy?!Iab;yS_xUdJ&1}RMF&xsDKd*4*_nWvbsg}kVd-Z)YKW7TL!~0 zUFz|TnAoeSDrW_C;hhvFXB~Pq3PVHM zMn$b|G>A@&F3@Pa>6PP-!zonFurEkv+Cofpx>1Y8=#a`iO{90a5mn1&)fk}H%&u`Y zXztd}otjX6QirY0h|cGlVih$B^>KbGiaxm-!#X$moZ6<#X?g@HSNr1sY9O6SiE$hF zqIcF%9Bv(4y)Q~9#b`Z}rt0Ac-c*ZWJY~{7j()V-P$5oL#Gq{RFu5#_Jt&sCu^G+ zTT|x}QybuOSQ>|$xrU|rK1q+$>7m&*4tFb^0LR#g!$Wlhj;}`yjG}?1u&xE#MyTr9 zSiJ4R4#!96T00N*IQ%@7Ern$Pif<*eXJV~NUMhG8(x+|pG}n9V;_tdUKa`DBJXC)0#`Z4+)V zuLicnBBkIR$O@Mk(Q<8RYwL(#2YaFEP}X$Jjxw#{p)!kTgDEu3aZe&Ub-k)Z2>pW&iE~-pmv2y_p(S`1X>3+j=JT3^sZL%m-nwb{n zpo$t#t&4mdXLf#~WpnBe%|lM&jp1?{lD^kM}-Ri;9LO z9zvNL5xmhg5w(qp1dmH#e%nYeAfA{o{l4IPvC8T8l(=eLb0}`%@a)P;zSp=C>8VlI zpR=MN-GV&)f_#xCQ&;a} z=<{ba&Y45~Rfo>&bUHNNLU85#t1%7l?>o*5Dnl#MJG)I#jygu7*o%PzQA#`qFDXt~$D@I#k}$k3!v;8|lJ8nueyw6`bj; z{nc3BS0^0r!bD13?y80wesj?g=rv~dlp1#pD!QWHFO2QA1nsJaVjUsA!5BT(b*M+x zI_J1MsBUrdgkS5tmLsd{3gCk)r!yjs4oby^OETVovdmi`X zx*E)>u%9dQ5=ytsjfv6un2212ah+>ECc*T5%_9ezn>L*xy}@N_o^_3@Kw(V=+~3e^ zA8K^3Q}Rttc@?Ho2N;`0hvXYI=%+FBG-3!w$o$MkHEg8v##wHy(~lICgualm^$@AX z%iJuYaxloMnk&XJmV4?KEM|$C6h28ONRKIEF2ShUMj#^3gT*qECSVunysJj;yUm zq=_!qJlzD&x^k~fQ+xV#CQA-C|9EZCJa>?n*UvsYLNOxMjpXRR0+CB zEn>t>Gb4yV^^I<8zAgj_6lN;Qyyxafa3wYK8}$ir4=f`Iw~K~;IvIXm^xceRsskqF zmC#6Dv3^12XcU!(ahTf{pkraxEYk!IrV#2(n!3L;b!3SDL~jKix9d#%>ZxC?@vt7Q zxn@qCsMeOuPt&*%QH`AWSL;di84QuxJj(*1rp`m0?xG3kHXzpPAF4NP<$BJ<$Yx={ zEJJ;7afRPwx(TCBkoppg#Mo0(s~M?ED<}^$JAffq6?)Tpl=GLA6w~-adh5GLkDkp- zqmF^LVE^F95w{wSn}z^>T0JnOd!Un&I%Yow+Yb%I{d820GPj?CO4~_cx_Q4SC<83B z&f}*V?^^7~%JAfItsjR|_G6Rl@K)Q8W7em$!raC*k7UM)RE<^W>}#<2gD&3d7Dm_B z&!U%Uos{10hVHuy16{MtSRF2dNA+kyuZ9{}H>jU-bVGgP0zb}HK$E_{)ATJ%lUJB6 z#w#!`p|7FHO8g!UQJwq_2^T?iKe67;&B<2cBY0D$wRmabdwGckGuKw3!=dZ(J5z4dPG0qX}1gM@XkB zyACx~n68`-ot{+h;HaYxQtnT@h3E)21;BHW-#IQ{)tFaal2*Z&9LnTMS3|v^$5S$C zOv(tFIicTg%Nz3xs}^0*d=@_9AT5ny})ieZjmLq)`e-n#=6D+_(j zou;kXVbO1OgZ9cUIx0`cD;z#oJ3{aDGdV?8^WDKd65}BMj!u*`;i_w@ z{37s!5FQWxRCHZ5ZRn@+%_92gV5s!$ieaFivZBFR=cY#_KOM^8bJ_x5-xLk<&~j=!ITpWbKWp z+uh5I2lmp!;hxIMS>`;ycRso;v<>R}jY?poS?ry-i7*mFV=X`jIkFM&l^et?{X-+M zIiU3(%#>iN*38;qpvAMYm=3^e1WaO?Sz6(uH8J=gw=LHaU&G02See=&?-HFXN1Csh5|=qngGg7Z|UKsrmCjxVDBXqxNI z-?XsiDL9O}^^=8XkhC~i1E@}I8cz;p$@>?9kY z=dS-S1rv=SD55z>J3-k=QN5x{?tgSQP(8&r>e*WtpG zf}SA5onwZ``VKGyGqf5llf@z{NW63#Nd2LCeTb<b}-HFH3zZjU$DN06np{<149gV%ExyRd;TFaG(i_2B%(7SzC@5p?HQTbJZ@G z#YuVrwKoOt7?OMt%~!(o7u8@2#vAUNs{%fyH{L2 zJs9e46T@=vN(T=0U;2QDA-~W$|Es<853%z)@BDe+`|F)Mb6?H9WBEsYuefaNR;iqk zG`8f*ag@lG6N`;)HB!==Saz zJ|rqbavwON9j%klk!^ncIfJZ;;w+ntGyLabZPdu^sS<4`aI87FIPD;6K59f~iTmiGP=KX<{ z5fu0sgIZ~d{`fXv48z^%J!EgU#}J$kCPRcA3I$5bo7JU>DV4Hh!}ZNVOwn>HfP=1- zVL3gT!Ho#SfII!A*`rIxdWAXWFq+zgnbv|C4Bj;HuhE0FW@H^gjfeYAvJe|V6fpa2 z3=HjlSYT5lPgS#p1F<#UiB~r8#eM7tXOGb@ynIGW$3iww8X7+adca;Trdt*d$}G4z zn)%E%C-&-T!TA+v8|+Mq_APlo-A~K7Zb)&zonRTn*Q{03FkOsOpCGWbZ(+0^=zE6t zEtZA^{t&J7i(d<*%|p5O=~})fpM7W|V5BOjG!|LvxE-kYq`UQYFtS-xS>=r$TpS zhI(oNof3n4cFCmi@3-2EB*7b1R0xJ%`O9$s`f?KYW6Gg#^hz#knR+u9ZeUzR<9@gw z8ZGV-z=n9%l}sR*7A!5E*mL~QDSLC<_C7lx26lRkUpUU=nhh4m0QL$kE>H_sZj6OkLC&AG`Jb_<&}RJExDL^{y|2k1Unf zQ3N9PQBz$*IzMXCDGz5e{KlGI-^s}GUZ>&kVF#QuUDic(udy?5u#6HgrS zry#DS8#Qi+SWBkG6+epW{Uw|8TQIy%Fj@)lvqFzBJAZQVj5o_Y;5b8gh?2oI$|kI~ zU_f}7wkWQIor;l%tTIQm9kgcJhe_w_h@pee8*{;L5E{iU%%Xd^N9m`v{=@>a<3%G4 zRGemX@vz7hi(RDCO9;{I!LW`HZ{Nnyp@_#K6*XYT#4@5)Ox{?Lvp2OA3Ra@LAjx55 z=ecG}toN+n5|bOY#PDK*QgQZB+3yQmVtD4*5|eZISwFIBcLt!IC=I=tU?#On)4O;+ z;B72#ixnXZbUye6|8k$lW4G(b+_QSSNRF*A-gm}I)8^nKM|Stl6c)S9K8CE`l?XAi z>wKK0poB0Pkk7};=Xa*$6G=6hlK-h8jwY0P%_ATVgS(C^#mO`5@;^0en@ zj29&iG4*3de)i~zQ)gte#WS^Lza8gn3Tv5*u{wUGg`ls~Fc{yeen7IV8F-j*^L6s! z*+3OuOt{JE;aA(RX=bC%CKV>)fz&y5ha0?83oZPwM#+9PS zZ<9~+-wb-BZ($9*iq=>gM|O#|{gVb8gcSC{)= zP7v?wvqWf-Fl##0Z9l$!gimp63%gd-VK1pzaZw${@3#^Za-aAD5KJ+i!c{$Xk<%gb zF+l_B8u#NKqgC_d<)%hCJwRAccZ+Bd>9D5Urf!khNS!uuzu#lD*RA&@-bbFwb=KPG z)_G{GSq$F?wTx~}A1|6Nx~+T%-mQV$$!#`kA=|mzCPF?>IVX&2Zp!DgoA43`=2U*H z(Qf>Qpus$ta5G@8X-%l5zFV(*s@zR6H_zSumYN(x-M(Tu>3j07^f(uoMmo6CZQ$&O zwrAXknylAZ9ec=>xOSLyr{Ml9esOxq+Ai2EaZxsAxy44@Itg8PnFSp9KS0c$1SsKB z)q41R7RM}U6tsheb1-DCOeI2k`qWCvaywWO%f%qNci^8h$gH`-RYkoxDvhcyfmUwH zPb57~>MkK+`cjUN?ld8#i{iCF^}C3px`>!@#8RpLoGT-wG$Me+pgSa#7xIV5M?{PH zi;ZHu$~b6sQXc9KB3_poN(9s;l-CLJzOpW{zOnPEY>`>r1Ts$vE@sS8*U-VokK>y+ z4A)R>&+0@s8XqyyHJ$;kHY+FBIEXK{%~cMQs~d~?xb=~Tj~I@xFLw?$M&d;trQhWD z`~2u)V~-4nTi;bOo%H|UQgmv zyIoDx!(HcHUO^*Q)m2pXYUYShT(odwQPsJ|=Pd_G0r2L1xGLpgTv5u64SiF)Nbh+T z)rlM12Yr7}c%?h|?Sx)l<#}GZh7{s^<7la!+_>fS)lRh5X9ISuWW>5BVEOoaxRJ)^8k;S=9{1J!9(w*$+^psE z+(`ak4VbZEJAsK|(vSxVC0844}6Tm}ywt8Ttwe_t7Nwfcxa+iDN z0JH(j36OQ2qNW@%tuxj2tvm2%-KEe zbArtGlEKp!%IgZPZ}#6!vXQqw@=lDrjfo*H$yLYoR7dVNRIT-`$3pNAe2~T_zOe~N z{cncYlen2BZVgt5n1c)}0(?WB0Jw~MfUsN;`mgzL|1}|A1n?%+=VDNvb4fRN}A92mHVYK2^(FkEW?$@KWq7<)UVZM=2|FLu(0U=cQVb z;R=wJe45glG!^Gs{cqK{%e90HdYjgZV;OG$+i5O&F&ELG9+Oka`fe#{?FRZHO*$9d z!9?wTYW>e71@ubNwkHU!{`pp~)qlPCKg3-C7QBkaOM$Ka#ZKPAQEaRKR;&Lu5r2-@ z^k1NktGNG2Au0x9EB|wp`a|D!Uz zvg)Ge?!^&CVCD#8*tGsd^#WB?p2$r3jWs63qG%@y&^R~NMhPDq`ZS6p8F)~Axgn}A zS8j0Pt!Gm{i7P?Zpwf#>WGE05ReuPTjyZahdfEAE*L7OU>#LBB-h~#jUY3at-)pye zd_aT#X9PJ9H7?YNSe8dwE2~bcXG8;s>@GBfkJ_+)d%;lN0>zi7ZYzZ4PILKo!%RnxS1p6xN4cjZ3#5rl!FZ@dtGX z7JA5}?_5KI=8U1zR$i5?BmH~nFqq#wDHV^5)1eBzdP6c%FJP7GNnWi}&^bnb*I}5i zcG?qaPpJ5XR<}$u5vJDi4hRATK9eb44Kf10ZMyb?D6+f@AQ5jjO{JiD)x!jNeF~Yl zQVZV**WR}H7F|Md>K@R%+5d5?x2e`(xDbh@BI0m?4*r4k?T@5`N4nmX z+D33gpA5;;YEGXskhNituknS7OY^*4uBBN9QS__aRIAc!`#^~B?q>Ur`< z4$@8~?UcqQlTwYu+`$?mKe(AJNnyiRF6Cu`^{w9pp68x0Jh7qGdw$v)j7k5$ zmqyq~pczTVB2>d4gPnMz0%~3KA_69L{R+fV=8`WGFzV-7hOw8+w!`e_(NP~5+@KnW zX|XVG%K^urFoRuoeU3Rf#DI919p^Q&BJWR&70XL1Xn8)v5f_!S+Cs*vMGY~{$rzQ5 zp6;|8wbb{gcd^nNz8QEbuzZUw%Ev4X*~5k^>|&Tvj%~mydQ|~29=HEIF2f(~)s#b! zKLjF?07=shCL8d*Bio-Qkh+sqYo$(R^vFbn{trp9&bpG}P}5cqVzouFwhZM|zDhRM zt<TWCTGZnrxESJW0oe!g?K0nT82Z2p*(d}!M$WeoLg)NT7HpgiXkTT zX4)ln#-NZStO)k&moe@m^Vj%`{DHR8>nG|gIz z$PDygY)<)A_?0l1sFgjRCfwjRVWA~_Rer**BQcCwq|O*HYM7mKtwG;Z!ZE1tI|$u^ z%4%YctR;|qu!!GV#3oT5@efr45dFNohC%1&<>tufmiWPNp?q7t>!fli1{7tg#}`lx zjEU6-uDVi|=jr+y(*Xk*@kG+L@8+spT5Wq3E4Ym^8WqeuHV*>RsRRmVP?%oBT7iiH zZ616*G{t7*Q#KYV*WvJzd-aN9n;b@3H%QZAVQIwCqR2pUV8oHf6C*T#`C_C+=!F-- z5RLYrnrkH*#h4=<`4$Qw&DYf`aHw^rHDFx6+*-1zx78)o4b$k!Xd$+OA!iyg2A885 zuJJrG0}jtRjK$c~)Zc!sHr^UMFBxD(fkb(8a2C-+lU}a5GGk4iBa8HqdF*E79Z#n= z(Xlkoqe`C7K_&f|cb=EdRw!rO$TW^1ZFQ3k4Q4MvBZLBvP09wZh)T$f#c50&d{e>K z4Z~@r=XEe@sI-LP(WLpCR7XQ+)~%o(v$RrXsb^k-%d{!;BxO=KzWym zIsaiA>OnPq!2@5w$I40F+Wa3qh0oqn8%NN@*6@T647*4_eL$S3)KFW}(SvV5Aytm*wq@m<^Si(A{Fd1zqfp4#81F7 zBh-&Wwz3iO9J9NVmzvA(np}PtokucF6mhZ}F@_&Sjk5w_^IXd=^^1l;I<>Hr!ZgHM z?H5)kivL8ltgFQ0(AI-L$FgOV?~%VkU#)ep55m9x2S7gV|B<0Y|0>d+g++|Ib23`U zv+WB!XY6_zIcyDHwdWi5tlV7C)7S#^fH!$P%5FL@QiL|WlBdYl;Z*EU|7e$awp z^dxz$++hZ6%9l~ihI-5tc)Y4{%`es2gxu$_PFl9GZs&C%*lCTNBr7S_i-^TIB%VB{ zP-`&AtR>%PET@ObCT$MB?`;HcG5ay0|3fM_RB#eJMlh<&jAtw>ISe#4ulZb7VXF09 zi9B2VzaL{BV5-SX-Q^#|aAu>-g!(g0k-aFTH^Jl*8k4J_H;33ZF4kS#1_anKNkqA|ncdR4RybOFdh zlODPCEomyfGr1vIrx~$j?~65*o-%C?fLIBp1)gnEMyw|I+EUb?0Uf+g7CZn!!Idj~nwa%!}) zS(fZ6FRf4ZC{42>rmEuO4`VU%KuV16^S7G8DrpNgA)|RHHC0#miN)CTQAk#ksRX;G zElCooHn^L+RmPxJFD8s`YMBrI{zEhOF=63LGdh*{KMdWBT6r-(nH6Z+i=Ut6UG!7W zi+2mD z#H|OBU&U5pFN{ao*XSIiE;aq}k{5VsHL8P}gG>sDsjpF4WEVusx;VDArBXqt9U5d~p zWqrx(sY{79>QZ7YxukV!#aW#%C05Z(C{6=fl`d&QCX`UPJXW4OOQYIqwhUGq889>T zwXj8mYgJopc zPNNZOuwu`D%Kqy2r+)t3PyOJx%lc?bIng84gMrOG7_+Dhkx}7OxO0(|9`#$ zlm4bFi;ZP87AAonnI2s|KBq^Y2i)c3lJu|&GxQru)n;3(LqFAI7s1T|oK$~fi`YAL z?@V~7p-yPq#6FyBMjtnd3;ue+KT+^Eq$vVEy)>=XSuZZJ&eB>`HQu*sFbAvvK}LD@ zUsJ@(X|*9M=V==~HOWz$9*J`e4sU?j9K0mV|E%G#Xre3G%a-4(_7pCiPPp&r@f|4? zzbKIk_wV%hZ_4#26y}$!!5d6MuP-XWiW!48{@_#J!%~+mgpV9rga07qVL6_o5lUih zcuClPS|`}6LcO5E&MJ6G!8i2yYqP7cNCmdq+%E8CJ^EInbz=pU`QV=`Fx2t+L-AJJ zWer81iG^iA1*q{ONGLzACx7jY0Y*EQxV#rCCm`T=OZLe8S zeqSr#el?i(dYgH7K7_%}*6tfw*Yzj_*J8=0xr2d{@vRM3AqZY!Ntt;h6{|T$P4+D? zFK}~KI7yl-`)lk~2)PGW*rACGVu{ykre)H$ncGY(wXw@;rk-Xcmt-nMbD7?t810m! zmDw{k1GoPzI#lzdXx2O_@}-$-#G?EA5QnAr*ht&R0KAH97dKK@J%zOHpk%w7tQ9D^ zcHM2MHEr1P1naPd!D59LF+-@eTX`9_a+oC20v692XY0z`Si_B=qBmy>-eE9W?Z}7A z|EvWyafb_#%;JWvpraTSRvWZg7Oh`|41%F`+OVj|LNCBND+;Sx!uAWlOdwT+NT|Xx z7Bj4IjV-JY17PW|o@F`Y_JbQB%)DSJrEKabJ%ohpt;H~zd!NS37&=B)el>?pKztrR zTBF*?iiA2W5_{Tdorx_6+rl`9)B`;W@1o~@>PhbkD=F-G4OZ4j{#mUFMn;=Np3QB2 z%O?4l2uUi<6+!*ijC5!9qzfzW=N0b->SfzS#S9f`sk1E&5h7nL%902bQKO1Tw9n$Q zFCKl3+3QLA<~S=waa95kn|xC-kInEdKXV?@Lf&t zF<{@tL8ZN1)3j)gaX|I0WGq0@O|&eB(^ih8V!KBKML6gNn(;I5w^ma(3>8r03=FKm z&w8D0E2SC=eADOBksal`K-nd>0mH0K?eG62kP;t~mR2QMn$;j_5+9Se;5LFgAs5Mk zgaHCgR&Ad^n%a_S(?EfGF~$M?X zJ?59`Y(rHN;Egnhj4$^@lr&w|&S4m2jP1d1Nq7(DoQal+5-k<$fQd%NO$J2|x}*-; zHUWG!Fb$RW>YB+&r?NI!8n>eTTT+&EMRbSkEIi^OQK<S0>)5#L=^8^Az09=< zj4@(f5c4gCIPDE&rHw8xZ{%eLJXy9;WJ32=fS_zQqHKYu7F;cF)CLm|C16$+keOv| zgbm86Ufl@QRKwZU}Ob0te$W&`U6 z4ZQo)8-IsSadC(5@Qx)raI%nqXCtz^k0!9yzvj)J%oimpIkiW^TG?fo!x+BTc#;_W_pWrckwB2AKG-+ zwryKx?%aC#?mKtP?AUtu%;9YZx7^KFjCLG8c#vCxw%@&d$6dW`2e&(iZXYjD%en2m zcFleKy6cNWCtp5w>=REeE}mStXY*#x2tT=WaQe`R`OPBSNi}k_PwU*hiMu=Gv-XO# zD=z@q@O#I|Yvtcf5OK$*@j&WFRHSx!+3MoyCS;ePz(K3f$(dO6ZS`>a3uz?$@?n zDh38_vfKd2yF>(|n`8Sd1rzh``~bwe;hYoNim< zwiMB?alMu&->?k68D>4Bn9A2{Q#gTpt)l2oI}^8~n21yHS6%P5DRRx{VOKKv@4cyS zYR1U+QehgQ8AO;fq?$j3IYWZ<2e6c=(&4tg6pa6?#(El~YKmSMP zAAICH-{^gLH(ySVe~-)GjiI&f-U6O;T-kYQH{WC7xSyL};3KEAv(viTRewLfojk0W zNm}^RJTWPk%Mqk-nhb-f!sYTPi4T{D7$H2wh~bDa3fXG#ZC@r~BPGx>dp!Jj*KaKoj{Pgi`Y;OB{eFIl% zbKGD3{lB6>V#0Z|bN#hBnwsJq&((0@J;?8OzmvGXEr`M2meAksD{h~Ag69M7OZfJ< zM>zEK1n$F}*?B}s-P`5=`G3TH@m`#bE=QH@PqN@)0f4icUqY@roTrmBI>o57I(FKW zxZ6yEbiPo>?iPsG!7G0{(C6|-c{_DYsMF|-=+!y33}*}N_W$nU6c03T|K8nA+IS|% zAI8H{oNC?Ay%>M=hnOf0FvC)<>b$B4wPXr8977hJW1;Y5jv%51md@ zI#FEph`d+Gj^zEq`uvvBa4-4j(4{|pJZjB{({6?OCGew|?n(+4>9>hWP25;MoEg^FWW8 kg#JtQm^R55Cx7+#uZjY1BsQL&{LH_qR{g3mACUt87u%JB2LJ#7 literal 0 HcmV?d00001 diff --git a/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll.meta b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll.meta new file mode 100644 index 0000000..9e6a716 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.dll.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: db224db50577cda49a385cc4b80c9fdd +labels: +- NuGetForUnity +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml new file mode 100644 index 0000000..7ae7701 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml @@ -0,0 +1,1237 @@ + + + + Sylvan.Data + + + +

+ An interface that defines the ability to bind a DbDataReader to an object. + + + + + Binds a data record to an object. + + The data reader. + The item to bind to. + + + + An interface that defines the ability to bind a DbDataReader to an object. + + + + + Binds a data record to an object. + + The data reader. + The item to bind to. + + + + Defines methods to create a general purpose data binder. + + + + + Creates a data binder. + + The type of record to bind to. + The schema of incoming data. + The binding options. + An IDataBinder{T} instance. + + + + Creates a data binder. + + The type of record to bind to. + A data reader. + The binding options. + An IDataBinder{T} instance. + + + + Creates a data binder. + + The type of record to bind to. + A data reader. + The schema of the incoming data. + The binding options. + An IDataBinder{T} instance. + + + + Binds the current record to a new object instance. + + + + + Binds the current record to a new object instance. + + + + + An exception thrown when a data binder encounters an invalid enum value. + + + + + The invalid string value. + + + + + The type of enum being bound. + + + + + A base type for exceptions thrown when binding data. + + + + + Gets the ordinal of the column that encountered an exception. + + + + + An exception thrown when a data binder encounters unbound columns or properties and is configured + to require them to be bound. + + + + + The names of the unbound properties. + + + + + The names of the unbound columns. + + + + + Options for configuring a data binder. + + + + + The culture to use when converting string values during binding. + + + + + Indicates how the data source will bind to the target type. + Defaults to which requires that + the datasource have column that binds to each property, but would allow unbound columns. + + + + + Indicates that the target member type is used to indicate + how to access the data source. This can be used when + the data reader might not have a schema, and allows + accessing fields using multiple accessors. + + + This is primarily to support the Sylvan CSV, which allows + accessing CSV (string) fields using any DbDataReader accessor. + + + + + Creates a new DataBinderOptions instance. + + + + + Extension methods for DbDataReader. + + + + + Converts an IDataReader to a DbDataReader. + This conversion might be a no-op if the IDataReader is already + a DbDataReader, or it might adapt the reader using a wrapper. + + + + + Creates a DataTable that specifies the schema. + + + + + Creates a DbDataReader by attaching additional columns to an existing DbDataReader. + + The base data reader. + The extra columns to attach. + A Db + + + + Binds the DbDataReader data to produce a sequence of T. + + The type of record to bind to. + The data reader. + + + + Binds the DbDataReader data to produce a sequence of T. + + The type of record to bind to. + The data reader. + The options to configure the data binder. + + + + Creates a DbDataReader that reads until a certain condition is met. + + The base DbDataReader + The predicate, which once false will end the reader. + A DbDataReader + + + + Binds the DbDataReader data to produce a sequence of T. + + The type of record to bind to. + The data reader. + + + + Binds the DbDataReader data to produce a sequence of T. + + The type of record to bind to. + The data reader. + The options to configure the data binder. + + + + var reader = seq.AsDataReader() + + + + + var reader = seq.AsDataReader() + + + + + Selects a subset of columns for a DbDataReader. + + The DbDataReader to select columns from. + A function to select the column ordinals. + Returns a new DbDataReader containing just the selected columns. + + + + Selects a subset of columns for a DbDataReader. + + The DbDataReader to select columns from. + A column ordinals to select. + Returns a new DbDataReader containing just the selected columns. + + + + Selects a subset of columns for a DbDataReader. + + The DbDataReader to select columns from. + The names of the columns to select. + Returns a new DbDataReader containing just the selected columns. + + + + Applies a filter predicate to the rows of a DbDataReader. + + A DbDataReader. + A filter predicate to filter the rows. + A new DbDataReader that produces the filtered rows. + + + + Creates a DbDataReader that reads the first number of rows. + + The base data reader. + The maximum number of rows to read. + A DbDataReader. + + + + Creates a DbDataReader that skips the first number of rows. + + The base data reader. + The number of rows to skip. + A DbDataReader. + + + + Creates a DbDataReader where FieldCount can return different values for each row. + + + Most DbDataReader implementations work on purely rectangular data. However, some implementations + might operate file formats that support variable fields. This allows accessing those extra columns + using the standard DbDataReader base type APIs only. + Specifically, this is to support the Sylvan CSV and Excel data readers. + + A DbDataReader implementation. + A function that returns the number of + Gets the type of the extra fields + + + + Creates a DbDataReader that validates data against a schema as it reads. + + A DbDataReader + A DataValidationHandler callback. + A DbDataReader. + + + + Creates a DbDataReader that validates data against a schema as it reads. + The validationHandler method will be called for every row. + + A DbDataReader + A DataValidationHandler callback. + A DbDataReader. + + + + A base class for DbDataReaders that wrap and modify other DbDataReaders. + + + + + Gets the inner data reader. + + + + + Creates a new DataReaderAdapter. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A column in a . + + The type of column key. + + + + Constructs a new DataSeriesColumn. + + + + + The physical column name. + + + + + The key value of the column. + + + + + The physical column ordinal. + + + + + Allows access to the range and values of keys in a data series. + + + + + + Gets the keys of the series. + + + + + Gets the minimum key value. + + + + + Gets the maximum key value. + + + + + Reads a series of columns from a DbDataReader that all have the same type. + + + + + Gets an ordered list of the series column keys. + + + + + + + + + + + Gets the number of elements in the series. + + + + + Gets the key at the given index. + + + + + Creates a new DataSeriesAccessor. + + + + + Reads the column values from the data record. + + The record to read the values from. + The sequence of values ordered by corresponding series column key. + + + + Enumerates the the keys in the series. + + + + + + A Stream implementation over DbDataReader.GetBytes + + + + + A TextReader implementation over DbDataReader.GetChars + + + + + Specifies how columns are bound to properties. + + + + + Allows any combination of unbound properties and columns. + + + + + Requires all properties be bound to a column. + + + + + Requires all columns be bound to a property. + + + + + Requires that all columns and all properties be bound. + + + + + Defines a data column. + + + + + The column name. + + + + + The column data type. + + + + + Indicates if the column allows null values. + + + + + Determines if the column value is null. + + + + + Gets the object value of the column. + + + + + + + Gets the value of the column. + + + + + Gets a range of data from the column. + + + + + Defines a custom data column. + + + + + + + + + + + + + + + + + + + + + + + + + + + Creates a new CustomDataColumn instance. + + + + + Provides methods for constructing DbDataReader instances + over object collections. + + + + + Creates a DbDataReader over a sequence of objects. + + + + + Creates a DbDataReader over a sequence of objects. + + + + + Creates an ObjectDataReader.Builder for the provided data. + + + This overload is useful when the type T is an anonymous type. + + + + + Creates an ObjectDataReader.Builder for reading data from the type T. + + + + + A builder for constructing DbDataReader over object data. + + + + + + Creates a new ObjectDataReader.Builder{T}. + + + + + Adds a column to the DbDataReader. + + + + + Adds a column to the DbDataReader. + + + + + Adds all public properties to the DbDataReader. + + + + + Builds a DbDataReader over the data that will read the columns defined by the builder. + + + + + Provides schema information for data. + + + + + Builder for creating Schema. + + + + + Creates a new Builder. + + + + + Gets the number of columns the builder defines. + + + + + Gets the builder at the given ordinal. + + + + + Creates a new Builder. + + + + + Adds a column to the schema. + + + + + Adds a column to the schema. + + + + + Builds an immutable Schema instance. + + + + + Gets the columns in the schema. + + + + + + A column in the schema. + + + + + A builder for a . + + + + + Creates a new column builder. + + + + + Creates a new column builder. + + + + + Creates a new column builder. + + + + + Sets the column type. + + + + + Creates a new column builder, copying an existing DbColumn. + + + + + Gets or sets a value indicating if the column allows nulls. + + + + + Gets or sets the base catalog name. + + + + + Gets or sets the base column name. + + + + + Gets or sets the base schema name. + + + + + Gets or sets the base server name. + + + + + Gets or sets the base table name. + + + + + Gets or sets the column ordinal. + + + + + Gets or sets the column name. + + + + + Gets or sets the column size. + + + + + Gets or sets the data type. + + + + + Gets or sets the data type name. + + + + + Gets or sets a value indicating if the column is aliased. + + + + + Gets or sets a value indicating if the column is auto-increment. + + + + + Gets or sets a value indicating if the column is an expression. + + + + + Gets or sets a value indicating if the column is hidden. + + + + + Gets or sets a value indicating if the column is an identity column. + + + + + Gets or sets a value indicating if the column is a key column. + + + + + Gets or sets a value indicating if the column is long. + + + + + Gets or sets a value indicating if the column is read-only. + + + + + Gets or sets a value indicating if the column is unique. + + + + + Gets or sets the numeric precision of the column. + + + + + Gets or sets the scale precision of the column. + + + + + Gets or sets user-defined assembly qualified name. + + + + + Gets or sets the base column ordinal. + + + + + Gets or sets the column data type. + + + + + Builds the immutable Schema.Column. + + + + + Gets the ordinal of the column in the base data source. + + + + + Gets the data type of the column. + + + + + Gets the preferred format string for the column data. + + + + + Gets the metadata property value with the given name. + + + + + Gets a Schema instance defining the schema from schemaTable. + + A DataTable returned from a + A schema instance. + + + + Gets the number of columns in the schema. + + + + + Gets the column at the given index. + + + + + Converts the schema to a . + + + + + + Creates a Schema from the schema of an existing data reader. + + The data reader to use as a schema template. + + + + Creates a Schema from an existing schema. + + The schema to use as a template. + + + + + + + Parses the specification string into a Schema object. + + + + + Gets a column schema representing the current schema. + + + + + Gets an enumerator of the schema column. + + + + + The result of a data analysis process. + + + + + Enumerates the columns in the analysis result. + + + + + + Gets a schema representing the analysis result. + + + + + + Gets the schema builder for the analysis result. + + + + + Options for a data schema analysis operation. + + + + + Creates a new SchemaAnalyzerOptions with the default values. + + + + + The number of rows to analyze. + + + + + Indicates if series detection should be enabled. + + + + + Analyzes weakly-typed string data to determine schema information. + + + + + Creates a new SchemaAnalyzer. + + + + + Analyzes a data set. + + + + + Analyzes a data set. + + + + + Schema analysis information for a data column. + + + + + Indicates if the column allows null values. + + + + + Gets the column oridnal. + + + + + Gets the column name. + + + + + Attempts to parse a schema specification. + + The schema specification string. + A Schema, or null if it failed to parse. + + + + Gets the specification string for this schema. + + A string. + + + + Defines a method for handling schema violations. + + + + + Provides contextual information about records that violate schema requirements. + + + + + The data reader being validated. + + + + + Gets the ordinals that contained errors. + + + + + Gets the exception that was thrown when processing the column. + + The column ordinal. + An exception or null. + + + + Sets the value for a field. + + + + + Sets the value for a field. + + + + + Gets the value of a field. + + + + + Gets the value of a field. + + + + + A data series. + + The series key type. + The series value type. + + + + Gets the minimum key value in the range. + + + + + Gets the maximum key value in the range. + + + + + Gets the keys of the range. + + + + + Gets the values over the range. + + + + + A simple data series. + + + + + + + + + + + + + + + + + Creates a new Series instance. + + + + + + + + Provides conversions between different styles of identifiers. + + + + + A "PascalCase" identifier style. + + + + + Converts a string to the given identifier style. + + + + + The pascale identifier style. + + + + + + + + The casing style used within segments. + + + + + Use the casing of the original identifier. + + + + + UpperCase every character. + + + + + LowerCase every character. + + + + + UpperCase first character, and lowercase the rest. + + + + diff --git a/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml.meta b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml.meta new file mode 100644 index 0000000..0504d77 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/lib/netstandard2.1/Sylvan.Data.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8bee6721097b3a34695b6177d1edec46 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/license.txt b/Assets/Packages/Sylvan.Data.0.2.12/license.txt new file mode 100644 index 0000000..ff7b563 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Mark Pflug + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/Packages/Sylvan.Data.0.2.12/license.txt.meta b/Assets/Packages/Sylvan.Data.0.2.12/license.txt.meta new file mode 100644 index 0000000..3a62e58 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/license.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 42e3966fc93f9b840b73239f2a04b93f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.0.2.12/readme.md b/Assets/Packages/Sylvan.Data.0.2.12/readme.md new file mode 100644 index 0000000..5374267 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/readme.md @@ -0,0 +1,94 @@ +# Sylvan.Data + +A .NET library for working with data. Provides implementations of, and extensions for, `DbDataReader`. +All of the data operations are designed to support streaming, so large data sets don't need to fit in memory. + +## DataBinder + +Contains a general purpose data binder that can bind `DbDataReader` records to object instances. +The following example binds CSV data using Sylvan.Data.Csv library to strongly-typed C# `Record` instances. + +``` +using Sylvan.Data; +using Sylvan.Data.Csv; +using System.Linq; + +using var dr = CsvDataReader.Create("data.csv"); +IEnumerable records = dr.GetRecords(); +Record[] allRecords = records.ToArray(); + +class Record { + public int Id { get; set; } + public string Name { get; set; } + public DateTime Date { get; set; } + public decimal Amount { get; set; } +} +``` + +## Object data reader + +The `IEnumerable.AsDataReader` extension method provides the inverse of the databinder, +exposing object instances as a `DbDataReader`. + +This example demonstrates using the Sylvan.Data.Csv library to write object data. + +``` +IEnumerable records = GetRecords(); +DbDataReader reader = records.AsDataReader(); +CsvDataWriter csvWriter = CsvDataWriter.Create("records.csv"); +csvWriter.Write(reader); +``` + +## Extension methods + +The library includes various LINQ-like extension methods for `DbDataReader`. + +_Select_ + +Creates a DbDataReader that exposes a subset of the columns. + +_Where_ + +Creates a DbDataReader that filters rows. + +_Skip/Take_ + +Creates a DbDataReader that skips rows, or limits the rows read. + +_WithColumns_ + +Creates a DbDataReader with additional columns attached. + + +This example shows how to use some of these methods in a CSV data loading operation. + +```C# +using Sylvan.Data; + +string csvFile = "data.csv"; +var importDate = DateTime.UtcNow; +var csv = CsvDataReader.Create(csvFile); + +DbDataReader dr = + csv + // select some of the columns from the csv file + .Select("Id", "Name", "Date", "Value") + // filter to just records from the last week + .Where(d => d.GetDateTime(2) >= importDate.AddDays(-7)) + // add columns with information about the data source + .WithColumns( + new CustomDataColumn("SourceFile", r => csvFile), + new CustomDataColumn("ImportDate", r => importDate), + new CustomDataColumn("RowNum", r => csv.RowNumber) + ) + // limit to 10k records + .Take(10000); + +LoadData(dr); +``` + +## Schema + +The `Schema` type provides methods to building and de/serializing data schema information. +This can be used to attach schema information to weakly typed data files, like CSV and Excel data, +using the Sylvan.Data.Csv and Sylvan.Data.Excel package. diff --git a/Assets/Packages/Sylvan.Data.0.2.12/readme.md.meta b/Assets/Packages/Sylvan.Data.0.2.12/readme.md.meta new file mode 100644 index 0000000..4b3c228 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.0.2.12/readme.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5f356ee766450e2448a55bfa5b1c6969 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5.meta new file mode 100644 index 0000000..20819e9 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8311108d3bb36bd46bf6593774168465 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/.signature.p7s b/Assets/Packages/Sylvan.Data.Csv.1.3.5/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..143cc0c45a79c9d1ae50a32ad8e73819f7fe9d30 GIT binary patch literal 11514 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 et|Wsf*Mm8N_|wy@h&I%Lj~&V3s%FhC&i@a(E + + + Sylvan.Data.Csv + 1.3.5 + Mark Pflug + license.txt + https://aka.ms/deprecateLicenseUrl + Sylvan.png + readme.md + https://github.com/MarkPflug/Sylvan + https://markpflug.github.io/Sylvan.png + A .NET library for reading and writing delimited CSV data. + © 2023 Mark Pflug + csv delimited data datareader datawriter simd .NET Sylvan + + + + + + + + \ No newline at end of file diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.Data.Csv.nuspec.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.Data.Csv.nuspec.meta new file mode 100644 index 0000000..0c6c594 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.Data.Csv.nuspec.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: e4147e720247bb5438ddd32a44943e49 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png b/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png new file mode 100644 index 0000000000000000000000000000000000000000..e603bc83bd24432a229575642cf9caa8702d02db GIT binary patch literal 5233 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 literal 0 HcmV?d00001 diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png.meta new file mode 100644 index 0000000..a99d28c --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/Sylvan.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: efe302b3c46026a4d8bedaf9406701d5 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib.meta new file mode 100644 index 0000000..000b594 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a4b03d3228a2a774b8e7c448aad6ef01 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1.meta new file mode 100644 index 0000000..b32d2cf --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4235c65106421284f97ae6dd680b8cc4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.dll b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.dll new file mode 100644 index 0000000000000000000000000000000000000000..7a6fdef78848f5cd5e3e341c47f3616ccd1268f4 GIT binary patch literal 87040 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

Af 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 J`u|-G{J( + + + Sylvan.Data.Csv + + + +

+ A data reader for delimited text data. + + + + + Creates a new CsvDataReader asynchronously. + + The name of a file containing CSV data. + The options to configure the reader, or null to use the default options. + A task representing the asynchronous creation of a CsvDataReader instance. + + + + Creates a new CsvDataReader asynchronously. + + The name of a file containing CSV data. + The options to configure the reader, or null to use the default options. + The optional cancellation token to be used for cancelling the initialization sequence. + A task representing the asynchronous creation of a CsvDataReader instance. + + + + Creates a new CsvDataReader asynchronously. + + The TextReader for the delimited data. + The options to configure the reader, or null to use the default options. + A task representing the asynchronous creation of a CsvDataReader instance. + + + + Creates a new CsvDataReader asynchronously. + + The TextReader for the delimited data. + The options to configure the reader, or null to use the default options. + The optional cancellation token to be used for cancelling the initialization sequence. + A task representing the asynchronous creation of a CsvDataReader instance. + + + + Creates a new CsvDataReader asynchronously. + + The TextReader for the delimited data. + A buffer to use for internal processing. + The options to configure the reader, or null to use the default options. + A task representing the asynchronous creation of a CsvDataReader instance. + + + + Creates a new CsvDataReader asynchronously. + + The TextReader for the delimited data. + A buffer to use for internal processing. + The options to configure the reader, or null to use the default options. + The optional cancellation token to be used for cancelling the initialization sequence. + A task representing the asynchronous creation of a CsvDataReader instance. + + + + + + + + + + + + + Creates a new CsvDataReader. + + The name of a file containing CSV data. + The options to configure the reader, or null to use the default options. + A CsvDataReader instance. + + + + Creates a new CsvDataReader. + + The TextReader for the delimited data. + The options to configure the reader, or null to use the default options. + A CsvDataReader instance. + + + + Creates a new CsvDataReader. + + The TextReader for the delimited data. + A buffer to use for internal processing. + The options to configure the reader, or null to use the default options. + A CsvDataReader instance. + + + + + + + + + + + + + Initializes the schema starting with the current row. + + + + + + + + + + + + + + Gets the number of fields in the current row. + This may be different than FieldCount. + + + + + + + + + + Gets the current 1-based row number of the data reader. + + + + + + + + + + + + + + + + + + + + + + + + + Gets the value of the field as a . + + + + + Gets the value of the field as a . + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets a collection of DbColumns describing the schema of the data reader. + + A collection of DbColumn. + + + + + + + + + + Gets a span containing the characters of a field. + + The contents of the returned span will have any quotes removed and be fully unescaped. + The field ordinal. + A span containing the characters of the field. + + + + Gets a span containing the current record data, including the line ending. + + + + + Copies the raw record data from the buffer. + + The buffer to receive the data, or null to query the required size. + The offset into the buffer to start writing. + The length of the record data. + + + + + + + A function that can be used to de-dupe strings during construction directly from internal buffers. + + + The Sylvan.Common library can provide an implementation of this method via the Sylvan.StringPool type. + + + + + A function that can be used to de-dupe strings during construction directly from internal buffers. + + + The Sylvan.Common library can provide an implementation of this method via the Sylvan.StringPool type. + + + + + A callback handler to receive comments read from a CSV file. + + + + + The method that is called when comments are read. + + The CsvDataReader. + The comment string. + + + + Implicitly casts an Action to a CommentHandler. + + The method to receive the comment. + + + + Implicitly casts an Action to a CommentHandler. + + The method to receive the comment. + + + + Gets the binary encoding used when reading fields with GetBytes. + + + + + Reads values as base64, does not support whitespace in values. + + + + + Read values as hexadecimal, allows optional "0x" prefix. + + + + + Specifies how result sets are interpreted within a CSV file. + + + + + The entire file is interpreted as a single result set. + + + + + In multi result mode a new result set is identified by a change in column count. + Empty lines are skipped between result sets. + + + + + Options for configuring a CsvDataReader. + + + + + Creates a CsvDataReaderOptions with the default values. + + + + + Indicates the behavior of result transitions. + + + + + Indicates the binary encoding that should be used when writing binary columns. + + + + + A string factory function which can de-dupe strings on construction. Defaults to null. + + + + + A string factory function which can de-dupe strings on construction. Defaults to null. + + + + + A callback method which will be called when a comment is found in the CSV. + + + + + The string which represents true values when reading boolean. Defaults to null. + + + + + The string which represents false values when reading boolean. Defaults to null. + + + + + The format string to use to parse dates. Defaults to null, in which case standard date parsing rules apply. + + + + + The format string to use to parse DateTime values. Defaults to null, in which case standard date parsing rules apply. + + + + + Specifies if the CSV data contains a header row with column names. Defaults to true. + + + + + Specifies the field delimiter. By default, uses autodetect. + + + Setting the delimiter will disable auto-detection. + + + + + Specifies the character used for quoting fields. Defaults to '"'. + + + + + Specifies the character used to indicate a comment. Defaults to '#'. + + + + + Indicates the CSV parsing style, defaults to Standard. + + + + + Specifies the character used for escaping characters in quoted fields. Defaults to '"'. + + + + + The size of buffer to use when reading records. + A record must fit within a single buffer, otherwise an exception is thrown. + + + + + The maximum size the internal buffer will be allowed to grow. + + + + + The buffer to use when reading records. + The default is null, in which case the reader will allocate the buffer. + + + + + The StringComparer to use when looking up header values. + Can be used to allow case-insensitive column lookup. + The default is Ordinal. + + + + + The CultureInfo to use when parsing values in the CSV data. + Defaults to the InvariantCulture. + + + + + Indicates if the TextReader should be closed when the CsvDataReader is closed. The default is true. + + + + + Allows specifying a strongly-typed schema for the CSV data. + + + + + Writes data from a DbDataReader as delimited values to a TextWriter. + + + + + Asynchronously writes delimited data. + + The DbDataReader to be written. + A cancellation token to cancel the asynchronous operation. + A task representing the asynchronous write operation. + + + + Synchronously writes delimited data. + + The DbDataReader to be written. + A task representing the asynchronous write operation. + + + + Creates a new CsvDataWriter. + + The path of the file to write. + The options used to configure the writer, or null to use the defaults. + + + + Creates a new CsvDataWriter. + + The TextWriter to receive the delimited data. + The options used to configure the writer, or null to use the defaults. + + + + Creates a new CsvDataWriter. + + The TextWriter to receive the delimited data. + A buffer to use for internal processing. + The options used to configure the writer, or null to use the defaults. + + + + Options for configuring a CsvWriter. + + + + + Creates a CsvWriterOptions with the default values. + + + + + Indicates the encoding format to use when writing binary columns. + + + + + Indicates if the header row should be written. + + + + + The string to write for boolean true values. The default is "True". + + + + + The string to write for boolean false values. The default is "False". + + + + + The format string used when writing DateTime values. The default is \"O\". + + + + + The format string used when writing DateTimeOffset values. The default is \"O\". + + + + + The format string used when writing DateTime values, or DateOnly values on supported frameworks, that have a time component. The default is \"O\". + + + + + The format string used when writing TimeSpan values that have to time component. The default is \"c\". + + + + + The style of the CSV file to be written, defaults to . + + + + + The delimiter to use between fields. The default is ','. + + + + + Empty strings will be written as empty quotes in the CSV. + This allows distinguishing empty strings from null. + + + + + The character to use for quoting fields. The default is '"'. + + + + + The character to use for escaping in quoted fields fields. The default is '"'. + + + + + The character used to indicate a comment line. The default is '#'. + + + + + The string to use for line breaks separating records. The default is Environment.NewLine. + Must be one of "\r", "\n", or "\r\n". + + + + + The buffer size to use for writing values. + + + + + The maximum size the internal buffer can grow to. + + + + + The buffer to use when writing records. + The default is null, in which case the writer will allocate a buffer of BufferSize. + + + + + The CultureInfo to use when writing values. The default is the InvariantCulture. + + + + + An ICsvSchemaProvider implementation based on an existing schema. + + + + + Gets a ICsvSchemaProvider that treats empty strings as null. + + + + + Gets a ICsvSchemaProvider that treats fields as "dynamic", where + the data type can change from row to row. + + + + + Creates a new CsvSchemaProvider. + + An DbColumn schema. + + + + Creates a new CsvSchemaProvider. + + An DbColumn schema. + A StringComparer used to match header names to the provided schema. + + + + + + + The CSV quoting and escaping styles. + + + + + Parses using the standard RFC4180 mode. + + + + + Interprets fields as if they are implicitly quoted. Delimiters and new lines within fields are preceded by an escape character. + + + + + Interprets fields as if they are implicitly quoted. Delimiters and new lines within fields are preceded by an escape character. + + + + + The exception that is thrown when CSV data is malformed. + + + + + The row number containing the malformed data. + + + + + The ordinal of the field containing the malformed data. + + + + + The exception that is thrown when the configuration options specify invalid options. + + + + + The exception that is thrown when a single CSV record is too large to fit in the read buffer. + + + CsvRecordTooLargeException is typically an indication of a incorrectly formatted CSV file. + Most CSV files should easily fit the constraints of the default buffer size. It is possible + to increase the buffer size for exceptional cases + + + + + The exception that is thrown when reading an empty CSV when headers are expected. + + + + + The exception thrown when trying to get the ordinal for a column + name that appears more than once. + + + + + Gets the the ambiguous column name. + + + + + A base implementation of ICsvSchemaProvider. + + + + + + + + + + + Provides the ability to specify a schema for a CsvDataReader. + + + + + Gets the schema for a column with the given name and/or ordinal. + + The name of the column, or null if the data contains no headers. + The zero-based ordinal of the column. + A DbColumn for the given column, or null to use the default. + + + + Gets the number of fields in the schema. + + The data reader being initialized. + The number of fields. + + + + Provides ISO 8601 date parsing and formatting. + + + + + Parse the given as extended ISO 8601 format. + + The source to parse. + The parsed if successful. + "true" if successfully parsed. + + + + Parse the given as extended ISO 8601 format. + + The source to parse. + The parsed if successful. + "true" if successfully parsed. + + + + ISO 8601 date time parser (ISO 8601-1:2019). + + The date/time to parse in UTF-8 format. + The parsed for the given . + + Supports extended calendar date (5.2.2.1) and complete (5.4.2.1) calendar date/time of day + representations with optional specification of seconds and fractional seconds. + + Times can be explicitly specified as UTC ("Z" - 5.3.3) or offsets from UTC ("+/-hh:mm" 5.3.4.2). + If unspecified they are considered to be local per spec. + + Examples: (TZD is either "Z" or hh:mm offset from UTC) + + YYYY-MM-DD (eg 1997-07-16) + YYYY-MM-DDThh:mm (eg 1997-07-16T19:20) + YYYY-MM-DDThh:mm:ss (eg 1997-07-16T19:20:30) + YYYY-MM-DDThh:mm:ss.s (eg 1997-07-16T19:20:30.45) + YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00) + YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:3001:00) + YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45Z) + + Generally speaking we always require the "extended" option when one exists (3.1.3.5). + The extended variants have separator characters between components ('-', ':', '.', etc.). + Spaces are not permitted. + + "true" if successfully parsed. + + + + Overflow-safe DateTimeOffset factory. + + + + + Overflow-safe DateTimeOffset factory. + + + + + Overflow-safe DateTimeOffset/Local time conversion factory. + + + + + Gets a DateTime value as an ISO 8601 formatted string. + + + + + Tries to write the Datetime value as an ISO 8601 formatted string. + + + + + Gets the DateTimeOffset as an ISO 8601 string. + + + + + Tries to write a DateTimeOffSet as an ISO 8601 formatted string. + + + + + Writes a value [ 0000 .. 9999 ] to the buffer starting at the specified offset. + This method performs best when the starting index is a constant literal. + + + + diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.xml.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.xml.meta new file mode 100644 index 0000000..6ddfba5 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/lib/netstandard2.1/Sylvan.Data.Csv.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: abc06e95e2996e44cb80e531926f53d2 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt b/Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt new file mode 100644 index 0000000..ff7b563 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Mark Pflug + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt.meta new file mode 100644 index 0000000..19257d1 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/license.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ad141ad7661fc914694f7e4cba2f5c5f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md b/Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md new file mode 100644 index 0000000..22e4fd2 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md @@ -0,0 +1,81 @@ +# Sylvan.Data.Csv + +A cross-platform .NET library for reading and writing CSV data files. +The `CsvDataReader` provides readonly, row by row, forward-only access to the data. +Exposes a familiar API via `DbDataReader`, which is ideal for accessing rectangular, tabular data sets. +Sylvan.Data.Csv is currently the [fastest library for reading CSV data](https://github.com/MarkPflug/Benchmarks/blob/main/docs/CsvReaderBenchmarks.md) + in the .NET ecosystem. + +## Features + +- Auto detect delimiters. +- Supports asynchronous IO. +- Strongly-typed accessors that avoid allocations. + - Supported types includes all standard .NET primitive types, `DateOnly` and `TimeOnly` on .NET 6, + - Binary data encoded with either base64 or hexadecimal. +- Schema information to support database bulk-load operations. + +## Usage Examples + +### Basic + +```C# +using Sylvan.Data.Csv; + +// CsvDataReader derives from System.Data.DbDataReader +using CsvDataReader dr = CsvDataReader.Create("data.csv"); + +// iterate over the rows in the file. +while(dr.Read()) +{ + // iterate fields in row. + for(int i = 0; i < dr.FieldCount; i++) + { + var value = dr.GetString(i); + } + // Can use other strongly-typed accessors + // bool flag = edr.GetBoolean(0); + // DateTime date = edr.GetDateTime(1); + // decimal amt = edr.GetDecimal(2); +} +``` + +### Bind CSV data to objects using Sylvan.Data. + +```C# +using Sylvan.Data; +using Sylvan.Data.Csv; +using System.Linq; + +using var dr = CsvDataReader.Create("data.csv"); +IEnumerable records = dr.GetRecords(); +Record[] allRecords = records.ToArray(); + +class Record { + public int Id { get; set; } + public string Name { get; set; } + public DateTime Date { get; set; } + public decimal Amount { get; set; } +} +``` + +### Convert Excel data to CSV using Sylvan.Data and Sylvan.Data.Excel + +```C# +using Sylvan.Data; +using Sylvan.Data.Csv; +using Sylvan.Data.Excel; +using System.Data.Common; + +// create reader for excel data file +ExcelDataReader edr = ExcelDataReader.Create("example.xlsx"); + +// (optional) create data reader which allows variable-length rows +DbDataReader reader = edr.AsVariableField(edr => edr.RowFieldCount); + +// create CSV writer to standard out +var csvWriter = CsvDataWriter.Create(Console.Out); + +// write excel data as csv +csvWriter.Write(reader); +``` \ No newline at end of file diff --git a/Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md.meta b/Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md.meta new file mode 100644 index 0000000..228df03 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Csv.1.3.5/readme.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 30f1d204dba08a845b66537f020b3cba +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17.meta new file mode 100644 index 0000000..d60ceea --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a54dacefe9c49c843bc594caba07e089 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/.signature.p7s b/Assets/Packages/Sylvan.Data.Excel.0.4.17/.signature.p7s new file mode 100644 index 0000000000000000000000000000000000000000..1bacdffcb2b13255437cd7840da183fab828bb83 GIT binary patch literal 11515 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 jYgfZvJ+BU_%hES&ky + + + Sylvan.Data.Excel + 0.4.17 + Mark Pflug + license.txt + https://aka.ms/deprecateLicenseUrl + Sylvan.png + readme.md + https://github.com/MarkPflug/Sylvan.Data.Excel + https://markpflug.github.io/Sylvan.png + A cross-platform .NET library for reading Excel data files. + © 2022 Mark Pflug + excel xls xlsx xlsb datareader .NET Sylvan + + + + + + + + \ No newline at end of file diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.Data.Excel.nuspec.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.Data.Excel.nuspec.meta new file mode 100644 index 0000000..a1d7788 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.Data.Excel.nuspec.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2432fbc6f4e81cb47bf6bcdb8eecd32d +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png b/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png new file mode 100644 index 0000000000000000000000000000000000000000..e603bc83bd24432a229575642cf9caa8702d02db GIT binary patch literal 5233 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 literal 0 HcmV?d00001 diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png.meta new file mode 100644 index 0000000..d4dbbbc --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/Sylvan.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: 97e7269befa8ea642b2d8395f47578a7 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 12 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib.meta new file mode 100644 index 0000000..1afefa6 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 95f8a75a36fd5f1479e347fa329ff689 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1.meta new file mode 100644 index 0000000..567e519 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e9e650275c9f8d24fbc765d5f04966e8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll new file mode 100644 index 0000000000000000000000000000000000000000..e39fad42c3fe1f178a8340314426cc9514b7548d GIT binary patch literal 122880 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 literal 0 HcmV?d00001 diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll.meta new file mode 100644 index 0000000..986911e --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.dll.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: 6c94a6cc635aad34c8867a6763405bb3 +labels: +- NuGetForUnity +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml new file mode 100644 index 0000000..a22db5f --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml @@ -0,0 +1,933 @@ + + + + Sylvan.Data.Excel + + + + + A memory-backed implementation using pooled buffers. + + + This class uses pooled buffers to reduce allocations, and memory clearing + that are present with . + + + + + Creates a PooledMemoryStream. + + + + + Creates a PooledMemoryStream. + + The to use. + The size of the buffer to use expressed 1 << blockShift. (Valid values 6 - 24) + A boolean indicating whether to clear the buffers after use. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A DbDataReader implementation that reads data from an Excel file. + + + + + + + + + + + Asynchronously creates a new ExcelDataReader. + + The name of the file to open. + An optional ExcelDataReaderOptions instance. + A CancellationToken. + The ExcelDataReader. + If the filename refers to a file of an unknown type. + + + + Creates a new ExcelDataReader instance. + + A stream containing the Excel file contents. + The type of file represented by the stream. + An optional ExcelDataReaderOptions instance. + + The ExcelDataReader. + + + + Creates a new ExcelDataReader. + + The name of the file to open. + An optional ExcelDataReaderOptions instance. + The ExcelDataReader. + If the filename refers to a file of an unknown type. + + + + Creates a new ExcelDataReader instance. + + A stream containing the Excel file contents. + The type of file represented by the stream. + An optional ExcelDataReaderOptions instance. + The ExcelDataReader. + + + + + + + + + + Gets the number of fields in the current row. + This may be different than FieldCount. + + + + + Gets the maximum number of fields supported by the + file. + + + + + Gets the type of an Excel workbook from the file name. + + + + + Tries to open a worksheet. + + The name of the worksheet to open. + True if the sheet was opened, otherwise false. + + + + Gets the names of the worksheets in the workbook. + + + + + Gets the number of worksheets in the workbook. + + + + + Gets the name of the current worksheet. + + + + + Gets the type of workbook being read. + + + + + Gets the number of rows in the current sheet. + + + Can return -1 to indicate that the number of rows is unknown. + + + + + + + + + + + + + + Gets the type of data in the given cell. + + + Excel only explicitly supports storing either string or numeric (double) values. + Date and Time values are represented by formatting applied to numeric values. + Formulas can produce string, numeric, boolean or error values. + Boolean and error values are only produced as formula results. + The Null type represents missing rows or cells. + + The zero-based column ordinal. + An ExcelDataType. + + + + Gets the value as represented in Excel. + + + Formula errors are returned as ExcelErrorCode values, rather than throwing an exception. + + The column ordinal to retrieve. + The value. + + + + Gets the column schema of the current worksheet. + + + + + Initializes the schema starting with the current row. + + + This can be used when a worksheet has "header" rows with non-data content. + Read past the header, and call Initialize when the row of tabular data is found. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Gets the of the error in the given cell. + + + + + Gets the of the format for the given cell. + + + + + Gets the number of the current row, as would be reported in Excel. + + + + + Gets the value of the column as a DateTime. + + + When called on cells containing a string value, will attempt to parse the string as a DateTime. + When called on a cell containing a number value, will convert the numeric value to a DateTime. + + + + + Gets the value of the column as a TimeSpan. + + + When called on cells containing a string value, will attempt to parse the string as a TimeSpan. + When called on a cell containing a number value, will convert the numeric value to a DateTime and return the Time component. + + + + + + + + Gets the value of the column as a string. + + + With the default configuration, this method is safe to call on all cells. + For cells with missing/null data or a formula error, it will produce an empty string. + + The zero-based column ordinal. + A string representing the value of the column. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Options for controlling the behavior of an . + + + + + Creates a new ExcelDataReaderOptions with the default values. + + + + + Gets or sets the schema for the data in the workbook. + + + + + Indicates if a cell will appear null or throw an ExcelFormulaException when accesing a cell containing a formula error. + Defaults to false, which causes errors to be thrown. + + + + + Indicates if hidden worksheets should be read, or skipped. + Defaults to false, which skips hidden sheets. + + + + + The string which represents true values when reading boolean. Defaults to null. + + + + + The string which represents false values when reading boolean. Defaults to null. + + + + + A format string used to parse DateTime values. + + + This is only used in the very rare case that a date value is stored as a string + in Excel, and is being accessed with GetDateTime() accessor. + + + + + The culture to use when parsing values. + This is only used when accessing and converting values stored as a string. + + + + + Indicates that the data stream should be disposed when the reader is disposed. + + + + + Represents in internal data types supported by Excel. + + + + + A cell that contains no value. + + + + + A numeric value. This is also used to represent DateTime values. + + + + + A DateTime value. This is an uncommonly used representation in .xlsx files. + + + + + A text field. + + + + + A formula cell that contains a boolean. + + + + + A formula cell that contains an error. + + + + + Writes data to Excel files. + + + + + Creates a new ExcelDataWriter. + + + + + Creates a new ExcelDataWriter. + + + + + Creates a new ExcelDataWriter. + + + + + Creates a new ExcelDataWriter. + + + + + + + + + + + Writes data to a new worksheet with the given name. + + The number of rows written. + + + + Writes data to a new worksheet with the given name. + + The number of rows written. + + + + A value indicating the result of the write operation. + + + + + Gets the number of rows written. + + + + + Indicates if all rows from the + + + + + Options for controlling the behavior of an . + + + + + Creates a new ExcelDataWriterOptions instance when the default settings. + + + + + Indicates if the ExcelDataWriter owns the output stream and handle disposal. + + + + + Indicates if string values should be truncated to the limit of Excel, which allows a maximum of 32k characters. + + When false, an exception will be thrown if a string values exceeds the limit. + + + + The compression level to use. + + + + + Exposes information about the supported Excel file types. + + + + + The file extension for .xls files. + + + + + The content type for .xls files. + + + + + The file extension for .xlsx files. + + + + + The content type for .xlsx files. + + + + + The file extension for .xlsm files. + + + + + The content type for .xlsx files. + + + + + The file extension for .xlsb files. + + + + + The content type for .xlsx files. + + + + + The .xls file type. + + + + + The .xlsx file type. + + + + + The .xlsm file type. + + + + + The .xlsb file type. + + + + + Enumerates all the file types exposed by the Sylvan library. + + + + + Enumerates all file types supported by the ExcelDataReader. + + + + + Enumerates all file types supported by the ExcelDataWriter. + + + + + Gets the ExcelFileType for a given filename. + + An ExcelFileType or null. + + + + Gets the ExcelFileType for a given file extension. + + An ExcelFileType or null. + + + + Gets the ExcelFileType for a given content type. + + An ExcelFileType or null. + + + + Gets the ExcelFileType for a ExcelWorkbookType. + + + + + Determines if the string defines a known Excel ContentType. + + + + + Gets the file extension. + + + + + Gets the Content-Type. + + + + + Gets the ExcelWorkbookType. + + + + + Indicates the kind of data the format string represents. + + + + + Format produces a string. + + + + + The format produces a number. + + + + + The format produces a date and possibly time. + + + + + The format produces a time with no date. + + + + + Indicates the kind of error a formula produced. + + + + + A null reference error. + + + + + A division by zero error. + + + + + A value error indicating a function requires a numeric but was given a string. + + + + + A reference error indicating a function references a location that doesn't exist. + + + + + A name error indicating the function references an unknown operation. + + + + + A number error indicating the function expected a number in a certain range. + + + + + An error indicating the function attempted to lookup a value that isn't available. + + + + + An exception that is thrown when attempting to access a value in a cell that contains a function error. + + + + + The row containing the error. + + + + + The column containing the error. + + + + + The error code indicating the kind of error. + + + + + An Excel format object indicating how a cell value is displayed. + + + + + Gets the format string. + + + + + Gets the kind of value the format string specifies. + + + + + + + + An implementation of IExcelSchemaProvider that allows defining per-column types. + + + + + A schema that expects each sheet to have a header row, and describes + each column as being a nullable string. + + + + + A schema that expects each sheet to have a header row, and describes + each column as being a nullable object. This causes each cell to be interpreted + dynamically when accessed using . + + + + + A schema that does not expect each sheet to have a header row, and describes + each column as being a nullable string. Column names are exposed as the Excel column header "A", "B", etc. + + + + + Creates a new ExcelSchema instance. + + Indicates if the sheet contains a header row. + The schema column definitions for the sheet. + + + + Creates a new ExcelSchema instance. + + + + + Adds a schema for a specific sheet. + + The name of the sheet the schema applies to. + Incidates if the sheet has a header row. + The schema column definitions for the sheet. + If the sheet name is null. + + + + + + + + + + The type of workbook. + + + + + Represents an unknown workbook type. + + + + + An .xls file. + + + + + An .xlsx file. + + + + + An .xslb file. + + + + + A base implementation of IExcelSchemaProvider + + + + + + + + + + + + + + Provides schema information for an Excel data file. + + + + + Called to determine if a worksheet contains a header row. + + The name of the worksheet. + True if the first row should be interpreted as column headers. + + + + Called to get the number of fields in the worksheet. + + The reader being initialized. + The number of fields. + + + + Called to determine the schema for a column in a worksheet. + + The name of the worksheet. + The name of the column + The ordinal position of the column. + A DbColumn that defines the schema for the column. + + + + Provides ISO 8601 date parsing. + + + + + Parse the given as extended ISO 8601 format. + + The source to parse. + The parsed if successful. + "true" if successfully parsed. + + + + Parse the given as extended ISO 8601 format. + + The source to parse. + The parsed if successful. + "true" if successfully parsed. + + + + ISO 8601 date time parser (ISO 8601-1:2019). + + The date/time to parse in UTF-8 format. + The parsed for the given . + + Supports extended calendar date (5.2.2.1) and complete (5.4.2.1) calendar date/time of day + representations with optional specification of seconds and fractional seconds. + + Times can be explicitly specified as UTC ("Z" - 5.3.3) or offsets from UTC ("+/-hh:mm" 5.3.4.2). + If unspecified they are considered to be local per spec. + + Examples: (TZD is either "Z" or hh:mm offset from UTC) + + YYYY-MM-DD (eg 1997-07-16) + YYYY-MM-DDThh:mm (eg 1997-07-16T19:20) + YYYY-MM-DDThh:mm:ss (eg 1997-07-16T19:20:30) + YYYY-MM-DDThh:mm:ss.s (eg 1997-07-16T19:20:30.45) + YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00) + YYYY-MM-DDThh:mm:ssTZD (eg 1997-07-16T19:20:3001:00) + YYYY-MM-DDThh:mm:ss.sTZD (eg 1997-07-16T19:20:30.45Z) + + Generally speaking we always require the "extended" option when one exists (3.1.3.5). + The extended variants have separator characters between components ('-', ':', '.', etc.). + Spaces are not permitted. + + "true" if successfully parsed. + + + + Overflow-safe DateTimeOffset factory. + + + + + Overflow-safe DateTimeOffset factory. + + + + + Overflow-safe DateTimeOffset/Local time conversion factory. + + + + + Writes a value [ 0000 .. 9999 ] to the buffer starting at the specified offset. + This method performs best when the starting index is a constant literal. + + + + diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml.meta new file mode 100644 index 0000000..29ac5fe --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/lib/netstandard2.1/Sylvan.Data.Excel.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2568c0e9e43396d498d2e0bcc00b8015 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt b/Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt new file mode 100644 index 0000000..24252b9 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Mark Pflug + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt.meta new file mode 100644 index 0000000..b6419f4 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/license.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9ee7f1fe6fc41104f933f91a7038d19a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md b/Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md new file mode 100644 index 0000000..a798a27 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md @@ -0,0 +1,115 @@ +# Sylvan.Data.Excel + +A cross-platform .NET library for reading and writing Excel data files. The most commonly used formats: .xlsx, .xlsb and .xls, are supported for reading, while .xlsx and .xlsb formats are supported for writing. + +ExcelDataReader provides readonly, row by row, forward-only access to the data. It provides a familiar API via `DbDataReader`, which is ideal for accessing rectangular, tabular data sets. It exposes a single, unified API for accessing all supported file formats. + +ExcelDataWriter supports writing data from a `DbDataReader` to an Excel worksheet in .xlsx and .xlsb formats. ExcelDataWriter can only write a new Excel, it cannot be used to edit or append to existing files. It does not support custom formatting, charts, or other common features. It is meant only to export raw, flat data to Excel. + +The library is a purely managed implementation with no external dependencies. + +This library is currently the [fastest and lowest allocating](https://github.com/MarkPflug/Benchmarks/blob/main/docs/ExcelReaderBenchmarks.md) +library for reading Excel data files in the .NET ecosystem, for all supported formats. + +If you encounter any issues while using this library, please report an issue in the github repository. +Be aware that I will be unlikely to investigate any issue unless an example file can be provided reproducing the issue. + +## Installing + +[Sylvan.Data.Excel Nuget Package](https://www.nuget.org/packages/Sylvan.Data.Excel/) + +`Install-Package Sylvan.Data.Excel` + +## ExcelDataReader + +ExcelDataReader derives from DbDataReader, so it exposes an API that should be familiar for anyone who has worked with ADO.NET before. The field accessors allow reading data in an efficient, strongly-typed manner: `GetString`, `GetInt32`, `GetDateTime`, `GetBoolean`, etc. + +The `GetExcelDataType` method allows inspecting the native Excel data type of a cell, which may vary from row to row. `FieldCount`, returns the number of columns in the header row, and doesn't change while processing each row in a sheet. `RowFieldCount` returns the number of fields in the current row, which might vary from row to row, and can be used to access cells in a "jagged", non-rectangular file. + +### Reading Raw Data + +The ExcelDataReader provides a forward only, row by row access to the data in a worksheet. It allows iterating over sheets using the `NextResult()` method, and iterating over rows using the `Read()` method. Fields are accessed using standard accessors, most commonly `GetString()`. `GetString()` is designed to not throw an exception, except in the case that a cell contains a formula error. The `TryOpenWorksheet(string name)` method can be used to open a specific, known worksheet. + +```C# +using Sylvan.Data.Excel; + +// ExcelDataReader derives from System.Data.DbDataReader +// The Create method can open .xls, .xlsx or .xlsb files. +using ExcelDataReader edr = ExcelDataReader.Create("data.xls"); + +do +{ + var sheetName = edr.WorksheetName; + // enumerate rows in current sheet. + while(edr.Read()) + { + // iterate cells in row. + // can use edr.RowFieldCount when sheet contains jagged, non-rectangular data + for(int i = 0; i < edr.FieldCount; i++) + { + var value = edr.GetString(i); + } + // Can use other strongly-typed accessors + // bool flag = edr.GetBoolean(0); + // DateTime date = edr.GetDateTime(1); + // decimal amt = edr.GetDecimal(2); + } + // iterates sheets +} while(edr.NextResult()); +``` + +### Bind Excel data to objects using Sylvan.Data + +The Sylvan.Data library includes a general-purpose data binder that can bind a DbDataReader to objects. +This can be used to easily read an Excel file as a series of strongly typed objects. + +```C# +using Sylvan.Data; +using Sylvan.Data.Excel; + +using var edr = ExcelDataReader.Create("data.xlsx"); +foreach (MyRecord item in edr.GetRecords()) +{ + Console.WriteLine($"{item.Name} {item.Quantity}"); +} + +class MyRecord +{ + public int Id { get; set; } + public string Name { get; set; } + public int? Quantity { get; set; } + public DateTime Date { get; set; } +} +``` + +### Converting Excel data to CSV(s) + +The Sylvan.Data.Csv library can be used to convert Excel worksheet data to CSV. + +```C# +using Sylvan.Data.Excel; +using Sylvan.Data.Csv; + +using var edr = ExcelDataReader.Create("data.xlsx"); + +do +{ + var sheetName = edr.WorksheetName; + using CsvDataWriter cdw = CsvDataWriter.Create("data-" + sheetName + ".csv") + cdw.Write(edr); +} while(edr.NextResult()); +``` + +## ExcelDataWriter + +The `ExcelDataWriter` type is used to create Excel workbooks and write `DbDataReader` data as worksheets. + +```C# +// *critical* to dispose (using) ExcelDataWriter. +using var edw = ExcelDataWriter.Create("data.xlsx"); +DbDataReader dr; +dr = GetQueryResults("UserReport"); +edw.Write(dr, "UserReport"); +dr = GetQueryResults("SecurityAudit"); +edw.Write(dr, "SecurityAudit"); +``` diff --git a/Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md.meta b/Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md.meta new file mode 100644 index 0000000..1edaa01 --- /dev/null +++ b/Assets/Packages/Sylvan.Data.Excel.0.4.17/readme.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 30c451c3f2ca3d843ac320a7488f3fc7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins.meta b/Assets/Plugins.meta new file mode 100644 index 0000000..031a6f5 --- /dev/null +++ b/Assets/Plugins.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: daf77f83065d3044f94d7468b8b1eb1e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder.meta b/Assets/Plugins/ExcelExtruder.meta new file mode 100644 index 0000000..b4feb6c --- /dev/null +++ b/Assets/Plugins/ExcelExtruder.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 93dd6eae45db8d644a9d45a1f426dc67 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder/Editor.meta b/Assets/Plugins/ExcelExtruder/Editor.meta new file mode 100644 index 0000000..e6f09de --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 45683e94c559e2c4db0bd29b5bee58b9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs b/Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs new file mode 100644 index 0000000..4c25fed --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs @@ -0,0 +1,29 @@ +using UnityEditor; +using UnityEngine; +using ExcelExtruder; + +public class EditorUI : EditorWindow +{ + [MenuItem("Tools/Excel/Serialize Excels", false, 0)] + static void OpenLoadingScene() + { + var typeConvert = new TypeConvert(EVENT_ERROR_LOG); + var excelSerialize = new ExcelSerialize(); + excelSerialize.Init(typeConvert, EVENT_PROGRESS, EVENT_ERROR_LOG, EVENT_LOG); + excelSerialize.SerializeAllExcel(); + EditorUtility.ClearProgressBar(); + } + + [MenuItem("Tools/Excel/Generate StaticDataModel", false, 1)] + static void GenerateStaticDataModel() + { + var dataModelGenerate = new DataModelGenerate(); + dataModelGenerate.Init(EVENT_PROGRESS, EVENT_ERROR_LOG, EVENT_LOG); + dataModelGenerate.GenerateStaticDataModel(); + EditorUtility.ClearProgressBar(); + } + private static void EVENT_LOG(string log) => Debug.Log(log); + private static void EVENT_ERROR_LOG(string error) => Debug.LogError(error); + private static void EVENT_PROGRESS(string title, float p, string a, string n) => + EditorUtility.DisplayProgressBar(title, $"{p * 100f}%, {a} => {n}", p); +} diff --git a/Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs.meta b/Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs.meta new file mode 100644 index 0000000..2afced5 --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor/EditorUI.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 072dd798b13a97f46af875f1930b843b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs b/Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs new file mode 100644 index 0000000..296fa72 --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs @@ -0,0 +1,252 @@ +using UnityEngine; +using Sylvan.Data; +using Sylvan.Data.Excel; +using Sylvan.Data.Csv; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Data.Common; +using System; +using System.Reflection; +using MemoryPack; + +namespace ExcelExtruder +{ + public class ExcelSerialize + { + protected virtual string EXCEL_SKIP => "#"; + protected virtual string EXCEL_FIELDNAME => "@"; + protected virtual string EXCELRES_PATH => "./Documents/Excel/"; + protected virtual string CSV_PATH => "./Documents/CSV/"; + protected virtual string BIN_PATH => Application.dataPath + "/Resources/StaticData/"; + protected virtual string CONFIG_PATH => "./excelconfig"; + private TypeConvert m_typeConvert; + private Action _EVENT_PROGRESS; + private Action _EVENT_LOG; + private Action _EVENT_ERROR_LOG; + private void Progress(float progress, string action, string name) => _EVENT_PROGRESS?.Invoke("Excels 序列化", progress, action, name); + private void LogError(string error) => _EVENT_LOG?.Invoke(error); + private void Log(string log) => _EVENT_LOG?.Invoke(log); + public void Init(TypeConvert typeConvert, + Action EVENT_PROGRESS, + Action EVENT_ERROR_LOG, + Action EVENT_LOG) + { + Assembly assembly = null; + if (File.Exists("./Library/ScriptAssemblies/Assembly-CSharp.dll")) + assembly = Assembly.LoadFile(System.Environment.CurrentDirectory + "\\Library\\ScriptAssemblies\\Assembly-CSharp.dll"); + + m_typeConvert = typeConvert; + m_typeConvert.Init(assembly); + + if (!Directory.Exists(EXCELRES_PATH)) Directory.CreateDirectory(EXCELRES_PATH); + if (!Directory.Exists(CSV_PATH)) Directory.CreateDirectory(CSV_PATH); + if (!Directory.Exists(BIN_PATH)) Directory.CreateDirectory(BIN_PATH); + + _EVENT_PROGRESS += EVENT_PROGRESS; + _EVENT_LOG += EVENT_LOG; + _EVENT_ERROR_LOG += EVENT_ERROR_LOG; + } + private Dictionary> ExcelInfos; + public void SerializeAllExcel() + { + Progress(0, "SerializeExcels", "Start"); + DirectoryInfo folder = new DirectoryInfo(EXCELRES_PATH); + var files = folder.GetFiles("*.xlsx", SearchOption.AllDirectories); + var count = files.Length; + var index = 0; + ExcelInfos = new Dictionary>(); + foreach (FileInfo file in files) + { + Progress(index / count, "SerializeExcel", file.Name); + var info = ConverOneExcel(file.Name); + ExcelInfos[info.Item1] = info.Item2; + index += 1; + } + SaveExcelInfos(); + Progress(1, "SerializeExcels", "End"); + } + + private void SaveExcelInfos() + { + var bin = MemoryPackSerializer.Serialize(ExcelInfos); + File.WriteAllBytes(CONFIG_PATH, bin); + } + + public (string, List) ConverOneExcel(string fileName) + { + ExcelWorkbookType workbooktype = ExcelDataReader.GetWorkbookType(EXCELRES_PATH + fileName); + var sheets = new List(); + + using var fs = new FileInfo(EXCELRES_PATH + fileName).Open(FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + using var edr = ExcelDataReader.Create(fs, workbooktype, new ExcelDataReaderOptions() + { + Schema = ExcelSchema.NoHeaders, + Culture = CultureInfo.InvariantCulture, + }); + + do + { + var sheetName = edr.WorksheetName; + sheets.Add(sheetName); + var heads = new List(); + var headNames = new List(); + Type classType = m_typeConvert.TryGetType(sheetName); + object genericList = TypeConvert.CreateGeneric(typeof(List<>), classType); + Type listType = genericList.GetType(); + MethodInfo mi = listType.GetMethod("Add"); + + using var cdw = new StreamWriter(CSV_PATH + sheetName + ".csv", false); + while(edr.Read()) + { + if (edr.GetString(0) == EXCEL_SKIP) continue; + if (edr.GetString(0) == EXCEL_FIELDNAME) + { + for (int i = 0; i < edr.FieldCount; i++) + { + if (edr.GetString(i) != null + && edr.GetString(i) != "" + && edr.GetString(i) != EXCEL_SKIP + && edr.GetString(i) != EXCEL_FIELDNAME) + { + heads.Add(i); + headNames.Add(edr.GetString(i)); + } + } + } + var row = edr.Select(heads.ToArray()); + Write2Csv(cdw, row); + if (edr.GetString(0) == EXCEL_FIELDNAME) continue; + var obj = Convert2Object(classType, row, headNames); + mi.Invoke(genericList, new object[] { obj }); + } + MemoryPackSerializeAndSave(genericList, classType); + + } while(edr.NextResult()); + + return (fileName, sheets); + } + + protected void Write2Csv(StreamWriter ws, DbDataReader row) + { + var data = new List(); + for (var i = 0; i < row.FieldCount; i++) + { + data.Add(row.GetString(i)); + } + ws.WriteLine(string.Join(",", data.ToArray())); + } + + protected object Convert2Object(Type classType, DbDataReader row, List headNames) + { + object obj = Activator.CreateInstance(classType); + for (int columnID = 0; columnID < row.FieldCount; columnID ++) + { + var fieldInfo = classType.GetField(headNames[columnID]); + if (fieldInfo == null) + { + LogError("Can't find the field \"" + headNames[columnID] + "\" in the type \"" + classType.ToString()); + return null; + } + string value = row.GetString(columnID); + object o; + if (m_typeConvert.TryParse(fieldInfo.FieldType, value, -1 , out o)) + { + fieldInfo.SetValue(obj, o); + } + } + return obj; + } + + protected void MemoryPackSerializeAndSave(object obj, Type type) + { + var Serializer = typeof(MemoryPack.MemoryPackSerializer); + var methods = Serializer.GetMethods(); + MethodInfo methodInfo = null; + foreach (var m in methods) + { + if (m.Name == "Serialize" && m.ReturnParameter.ParameterType == typeof(byte[])) + { + methodInfo = m; + break; + } + } + if (methodInfo == null) + { + Debug.Log(type.ToString()); + return; + } + var bit = methodInfo.Invoke(null, new object[] { obj.GetType(), obj, default}); + byte[] buff = bit as byte[]; + File.WriteAllBytes(BIN_PATH + type.ToString() + ".bytes", buff); + } + } + public class DataModelGenerate + { + protected virtual string staticdatamodel_path => "Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs"; + protected virtual string bin_path => "StaticData/"; + protected virtual string config_path => "./excelconfig"; + private const string STATICDATAMODEL_CONST= +@"using System.Collections.Generic; +using UnityEngine; +using MemoryPack; + +public class StaticDataModel +{ + // @Dont delete - for Gen property@ + + public void Init() + { + // @Dont delete - for Gen Init Func@ + } + private T MemoryPackDeserialize(string filename) + { + var bin = Resources.Load(""@bin_path@"" + filename).bytes; + return MemoryPackSerializer.Deserialize(bin); + } +} +"; + protected Action _EVENT_PROGRESS; + protected Action _EVENT_LOG; + protected Action _EVENT_ERROR_LOG; + private void Progress(float progress, string action, string name) => _EVENT_PROGRESS?.Invoke("DataModel 自动生成",progress, action, name); + private void LogError(string error) => _EVENT_LOG?.Invoke(error); + private void Log(string log) => _EVENT_LOG?.Invoke(log); + public void Init(Action EVENT_PROGRESS, + Action EVENT_ERROR_LOG, + Action EVENT_LOG) + { + _EVENT_PROGRESS += EVENT_PROGRESS; + _EVENT_LOG += EVENT_LOG; + _EVENT_ERROR_LOG += EVENT_ERROR_LOG; + } + public void GenerateStaticDataModel() + { + if (!File.Exists(config_path)) + { + LogError("Excel config is not found! Please load excels first!"); + return; + } + var bin = File.ReadAllBytes(config_path); + var excelInfos = MemoryPackSerializer.Deserialize>>(bin); + + Progress(0, "GenerateStaticDataModel", "Start"); + var i = 0; + var text = STATICDATAMODEL_CONST.Replace("@bin_path@", bin_path); + foreach (var item in excelInfos) + { + Progress(i / excelInfos.Count, "ReadExcel", $"{item.Key}"); + var ii = 0; + foreach (var sheet in item.Value) + { + Progress(ii / item.Value.Count, "ReadSheet", $"{sheet}"); + text = text.Insert(text.IndexOf("// @Dont delete - for Gen property@"), $"public List<{sheet}> {sheet}s {{ set; get; }}\r\n "); + text = text.Insert(text.IndexOf("// @Dont delete - for Gen Init Func@"), $"{sheet}s = MemoryPackDeserialize>(\"{sheet}\");\r\n "); + } + Progress(1, "ReadSheets", "End"); + } + System.IO.File.WriteAllText(staticdatamodel_path, text); + Progress(1, "GenerateStaticDataModel", "End"); + } + } +} diff --git a/Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs.meta b/Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs.meta new file mode 100644 index 0000000..ce37d8a --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor/ExcelExtruder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6849902092c796b45868792611ceb88e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs b/Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs new file mode 100644 index 0000000..f73cc0d --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs @@ -0,0 +1,520 @@ +using System; +using System.Collections.Generic; +using System.Reflection; + +namespace ExcelExtruder +{ + public class TypeConvert + { + public Action _EVENT_ERROR_LOG; + private Assembly m_assembly; + private Dictionary m_tryParseMethodInfos; + private Dictionary m_foundType; + + public static Dictionary TryParseDelegates = new Dictionary(); + + public string m_currentPlacement; + public uint m_currentPlacementId; + public int m_currentArrayIndex = 0; + + public string m_extraInfo = ""; + + public TypeConvert(Action EVENT_ERROR_LOG) + { + _EVENT_ERROR_LOG = EVENT_ERROR_LOG; + } + + public void Init(Assembly assembly) + { + m_assembly = assembly; + m_tryParseMethodInfos = new Dictionary(); + m_foundType = new Dictionary(); + } + + private void Error(string str) + { + _EVENT_ERROR_LOG?.Invoke(str + "; " + m_extraInfo); + } + + public Type TryGetType(string typeName) + { + if (string.IsNullOrEmpty(typeName)) + return null; + + Type t = null; + + // 尝试从动态程序集中获取类型 + if (m_assembly != null) + t = FindTypeInCustomAssembly(typeName); + + // 尝试从默认程序集中获取类型 + if (t == null) + t = Assembly.GetExecutingAssembly().GetType(typeName); + + // 尝试从系统库中获取类型 + if (t == null) + t = Type.GetType(typeName); + + // 如果是枚举,需要获取+后面的类型名称 + if (t == null) + t = TryGetEnumType(typeName); + + if (t == null) + { + Error("[TryGetType] Can't find the type: " + typeName); + return null; + } + else + { + return t; + } + } + + private Type FindTypeInCustomAssembly(string typename) + { + Type t; + + if (!m_foundType.TryGetValue(typename, out t)) + { + if (Environment.OSVersion.Platform == PlatformID.MacOSX) + { + foreach (Type type in m_assembly.GetTypes()) + { + if (string.Compare(type.Name, typename, false) != 0) + continue; + + t = type; + m_foundType.Add(typename, t); + break; + } + } + else + { + t = m_assembly.GetType(typename); + if (t != null) + m_foundType.Add(typename, t); + } + } + + return t; + } + + private Type TryGetEnumType(string typeName) + { + // aaaa+bbbb + var index = typeName.IndexOf('+'); + if (index != -1) + { + var subName = typeName.Substring(index + 1); + return TryGetType(subName); + } + else + { + return null; + } + } + + /// + /// 动态创建Array + /// + /// + /// + /// + public static object CreateArray(Type innerType, params object[] args) + { + Type specificType = innerType.MakeArrayType(); + return Activator.CreateInstance(specificType, args); + } + + /// + /// 动态创建Generic + /// 创建Dictionary请使用CreateDictionary + /// + /// + /// + /// + /// + public static object CreateGeneric(Type generic, Type innerType, params object[] args) + { + System.Type specificType = generic.MakeGenericType(new Type[] { innerType }); + return Activator.CreateInstance(specificType, args); + } + + /// + /// 动态创建Dictionary + /// + /// + /// + /// + /// + public static object CreateDictionary(Type keyType, Type valueType, params object[] args) + { + Type genericType = typeof(Dictionary<,>); + Type specificType = genericType.MakeGenericType(new Type[] { keyType, valueType }); + return Activator.CreateInstance(specificType, args); + } + + public bool TryParse(Type type, string value, out object result) + { + return TryParse(type, value, -1, out result); + } + + /// + /// 将字符串转换为真实的类型 + /// + /// + /// + /// + public bool TryParse(Type type, string value, int arraySize, out object result) + { + if (string.IsNullOrEmpty(value)) + { + // value为空,直接返回空值 + result = null; + return true; + } + else if (type == typeof(string)) + { + // 是字符串,直接返回 + result = Trim(value); + return true; + } + else if (type.IsEnum) + { + // 枚举的情况 + return TryParse2Enum(type, value, out result); + } + else if (type.IsArray) + { + // 数组的情况 + var ret = TryParse2Array(type, value, out result); + if (ret && arraySize != -1) + { + Array ar = result as Array; + if (ar.Length != arraySize) + { + Error($"The size of the array dose not meet the definition length {arraySize}: {value}"); + return false; + } + } + return ret; + } + else if (type.IsGenericType) + { + // 是GenericType的情况 + return TryParse2Generic(type, value, out result); + } + else if (TryParse2Custom(type, value, out var flag, out result)) + { + return flag; + } + else + { + try + { + return TryParse2Object(type, value, out result); + } + catch (Exception ex) + { + Error("[TryParse] " + ex.Message); + UnityEngine.Debug.LogException(ex); + result = null; + return true; + } + } + } + + protected virtual bool TryParse2Custom(Type type, string value, out bool flag, out object result) + { + result = default; + flag = false; + return false; + } + + private bool TryParse2Object(Type type, string value, out object result) + { + MethodInfo mi = GetMethodInfo(type, "TryParse"); + if (mi != null) + { + // 有TryParse方法,直接调用 + var parameters = new object[] { Trim(value), Activator.CreateInstance(type) }; + if ((bool)mi.Invoke(null, parameters) == true) + { + // 返回成功 + result = parameters[1]; + return true; + } + else + { + // 返回失败 + Error(string.Format("[TryParse2Object] TryParse method return fail: [{1}] => {0}", type.FullName, value)); + result = null; + return false; + } + } + else if (TryParseDelegates.TryGetValue(type, out var del)) + { + var parameters = new object[] { Trim(value), Activator.CreateInstance(type) }; + if ((bool)del.DynamicInvoke(parameters) == true) + { + // 返回成功 + result = parameters[1]; + return true; + } + else + { + // 返回失败 + Error(string.Format("[TryParse2Object] TryParse method return fail: [{1}] => {0}", type.FullName, value)); + result = null; + return false; + } + } + else + { + // 没有TryParse方法 + Error("[TryParse2Object] Can't find the TryParse method of type: " + type.FullName); + result = null; + return false; + } + } + + /// + /// 获取某个type的方法 + /// + /// + /// + private MethodInfo GetMethodInfo(Type type, string methodName) + { + MethodInfo result; + if (!m_tryParseMethodInfos.TryGetValue(type, out result)) + { + MethodInfo mi = type.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy, Type.DefaultBinder, + new Type[] { typeof(string), type.MakeByRefType() }, + new ParameterModifier[] { new ParameterModifier(2) }); + if (mi != null) + m_tryParseMethodInfos.Add(type, mi); + + return mi; + } + else + { + return result; + } + } + + private bool TryParse2Generic(Type type, string value, out object result) + { + var cutName = GetGenericTypeRealName(type); + + switch (cutName) + { + case "List": return Parse2Generic(type, typeof(List<>), "Add", value, out result); + case "HashSet": return Parse2Generic(type, typeof(HashSet<>), "Add", value, out result); + case "Queue": return Parse2Generic(type, typeof(Queue<>), "Enqueue", value, out result); + case "Stack": return Parse2Generic(type, typeof(Stack<>), "Push", value, out result); + case "LinkedList": return Parse2LinkedList(type, value, out result); + case "Dictionary": return Parse2Dictionary(type, value, out result); + default: + // 暂不支持其他Generic类型 + Error("[TryParse2Generic] Don't support the generic type: " + type.FullName); + result = null; + return false; + } + } + + private bool Parse2Generic(Type type, Type genericType, string addMethodName, string value, out object result) + { + var innerType = type.GenericTypeArguments[0]; + result = CreateGeneric(genericType, innerType); + var addMethodInfo = result.GetType().GetMethod(addMethodName); + return PushInner(value, innerType, result, addMethodInfo); + } + + private bool Parse2LinkedList(Type type, string value, out object result) + { + var innerType = type.GenericTypeArguments[0]; + result = CreateGeneric(typeof(LinkedList<>), innerType); + + var allMethod = result.GetType().GetMethods(); + foreach (var method in allMethod) + { + if (method.Name == "AddLast" && method.ReturnType.FullName.IndexOf("LinkedListNode") != -1) + return PushInner(value, innerType, result, method); + } + + result = null; + return false; + } + + private bool PushInner(string str, Type innerType, object generic, MethodInfo method) + { + bool allSuccess = true; + + var tempstring = Trim(str); + string[] strs = CutStringByGroup(tempstring); + for (int i = 0; i < strs.Length; i++) + { + m_currentArrayIndex = i; + object innerResult = null; + if (TryParse(innerType, strs[i], out innerResult)) + method.Invoke(generic, new object[] { innerResult }); + else + allSuccess = false; + } + + return allSuccess; + } + + private bool Parse2Dictionary(Type type, string value, out object result) + { + var keyType = type.GenericTypeArguments[0]; + var valueType = type.GenericTypeArguments[1]; + + object generic = CreateDictionary(keyType, valueType); + var addMethodInfo = generic.GetType().GetMethod("Add"); + + var groups = CutStringByGroup(Trim(value)); + bool allSuccess = true; + for (int i = 0; i < groups.Length; i++) + { + var str = groups[i]; + + int index = str.IndexOf(":"); + if (index == -1) + { + Error("[TryParse2Dictionary] Can't convert value to dictionary group: " + str); + allSuccess = false; + continue; + } + + string keyStr = str.Substring(0, index); + string valueStr = str.Substring(index + 1); + + if ((valueType.IsGenericType || valueType.IsArray) && valueStr.StartsWith("[") && valueStr.EndsWith("]")) + valueStr = valueStr.Substring(1, valueStr.Length - 2); + + object keyResult = null; + object valueResult = null; + + if (TryParse(keyType, keyStr, out keyResult) && TryParse(valueType, valueStr, out valueResult)) + addMethodInfo.Invoke(generic, new object[] { keyResult, valueResult }); + else + allSuccess = false; + } + + result = generic; + return allSuccess; + } + + private bool TryParse2Array(Type type, string value, out object result) + { + var innerType = type.GetElementType(); + + string[] strs = CutStringByGroup(value); + object array = CreateArray(innerType, new object[] { strs.Length }); + MethodInfo setValueMethodInfo = array.GetType().GetMethod("SetValue", new Type[] { typeof(object), typeof(int) }); + + bool allSuccess = true; + for (int i = 0; i < strs.Length; i++) + { + m_currentArrayIndex = i; + object innerResult = null; + if (TryParse(innerType, strs[i], out innerResult)) + setValueMethodInfo.Invoke(array, new object[] { innerResult, i }); + else + allSuccess = false; + } + + result = array; + return allSuccess; + } + + protected virtual char SplitChar => ';'; + protected virtual string[] CutStringByGroup(string str) + { + List result = new List(); + + int bracketsDeep = 0; + int startIndex = 0; + int length = 0; + + for (int i = 0; i < str.Length; i++) + { + var cha = str[i]; + if (cha == ' ') continue; + + if (cha == '[') + bracketsDeep += 1; + + if (cha == ']') + bracketsDeep -= 1; + + if ((cha == SplitChar || i == str.Length - 1) && bracketsDeep == 0) + { + if (cha != SplitChar) + length += 1; + + var buff = str.Substring(startIndex, length); + if (buff.StartsWith("[") && buff.EndsWith("]")) + buff = buff.Substring(1, buff.Length - 2); + + result.Add(buff); + startIndex = i + 1; + length = 0; + } + else + { + length += 1; + } + } + + return result.ToArray(); + } + + private bool TryParse2Enum(Type type, string value, out object result) + { + try + { + result = Enum.Parse(type, value); + return true; + } + catch (Exception ex) + { + UnityEngine.Debug.LogError($"解析失败。请检查Excel表{m_extraInfo}"); + result = default; + Error("[TryParse2Enum] " + ex.Message); + return true; + } + } + + /// + /// 获取真实字符串 + /// Excel保存为Uncode文本时有可能在字符串首位加入引号,需要手动去除 + /// + /// + /// + public static string Trim(string value) + { + string str = value.Trim(); + if (str.Length > 2 + && str.Split('\"').Length == 3 + && str.StartsWith("\"") + && str.EndsWith("\"")) + str = str.Substring(1, str.Length - 2); + + return str; + } + + public static string GetGenericTypeRealName(Type type) + { + var fullName = type.Name; + const string head = "System.Collections.Generic."; + var cutName = fullName.Substring(head.Length); + + int index = cutName.IndexOf('`'); + cutName = cutName.Substring(0, index); + + return cutName; + } + } +} diff --git a/Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs.meta b/Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs.meta new file mode 100644 index 0000000..a85b1b7 --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Editor/TypeConvert.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 29f92cb05d48439438f593e0cd1bc878 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder/Runtime.meta b/Assets/Plugins/ExcelExtruder/Runtime.meta new file mode 100644 index 0000000..dd9d121 --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cc8d6e4f837cb3847b3f014237fcd353 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs b/Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs new file mode 100644 index 0000000..c05c3d6 --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using UnityEngine; +using MemoryPack; + +public class StaticDataModel +{ + // @Dont delete - for Gen property@ + + public void Init() + { + // @Dont delete - for Gen Init Func@ + } + private T MemoryPackDeserialize(string filename) + { + var bin = Resources.Load("StaticData/" + filename).bytes; + return MemoryPackSerializer.Deserialize(bin); + } +} diff --git a/Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs.meta b/Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs.meta new file mode 100644 index 0000000..bbf90bb --- /dev/null +++ b/Assets/Plugins/ExcelExtruder/Runtime/StaticDataModel.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6ea209cf93d96fc4095108362f101ce8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack.meta b/Assets/Plugins/MemoryPack.meta new file mode 100644 index 0000000..7cf1987 --- /dev/null +++ b/Assets/Plugins/MemoryPack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a65912e77b79d104f9fee8402e44bf32 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime.meta b/Assets/Plugins/MemoryPack/Runtime.meta new file mode 100644 index 0000000..404db29 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa0b294eae93e3b4db979ec26e5a4470 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core.meta new file mode 100644 index 0000000..18c8654 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a5e395e05d754ca40b7178b9b8af5e59 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs new file mode 100644 index 0000000..8ca56e5 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack { + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackableAttribute : Attribute +{ + public GenerateType GenerateType { get; } + public SerializeLayout SerializeLayout { get; } + + // ctor parameter is parsed in MemoryPackGenerator.Parser TypeMeta for detect which ctor used in MemoryPack.Generator. + // if modify ctor, be careful. + + /// + /// [generateType, (VersionTolerant or CircularReference) ? SerializeLayout.Explicit : SerializeLayout.Sequential] + /// + /// + public MemoryPackableAttribute(GenerateType generateType = GenerateType.Object) + { + this.GenerateType = generateType; + this.SerializeLayout = (generateType == GenerateType.VersionTolerant || generateType == GenerateType.CircularReference) + ? SerializeLayout.Explicit + : SerializeLayout.Sequential; + } + + /// + /// [GenerateType.Object, serializeLayout] + /// + public MemoryPackableAttribute(SerializeLayout serializeLayout) + { + this.GenerateType = GenerateType.Object; + this.SerializeLayout = serializeLayout; + } + + public MemoryPackableAttribute(GenerateType generateType, SerializeLayout serializeLayout) + { + this.GenerateType = generateType; + this.SerializeLayout = serializeLayout; + } +} + +public enum GenerateType +{ + Object, + VersionTolerant, + CircularReference, + Collection, + NoGenerate +} + +public enum SerializeLayout +{ + Sequential, // default + Explicit +} + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = true, Inherited = false)] +public sealed class MemoryPackUnionAttribute : Attribute +{ + public ushort Tag { get; } + public Type Type { get; } + + public MemoryPackUnionAttribute(ushort tag, Type type) + { + this.Tag = tag; + this.Type = type; + } +} + +[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackUnionFormatterAttribute : Attribute +{ + public Type Type { get; } + + public MemoryPackUnionFormatterAttribute(Type type) + { + this.Type = type; + } +} + +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackAllowSerializeAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackOrderAttribute : Attribute +{ + public int Order { get; } + + public MemoryPackOrderAttribute(int order) + { + this.Order = order; + } +} + +#if !UNITY_2021_2_OR_NEWER + +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public abstract class MemoryPackCustomFormatterAttribute : Attribute +{ + public abstract IMemoryPackFormatter GetFormatter(); +} + +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public abstract class MemoryPackCustomFormatterAttribute : Attribute + where TFormatter : IMemoryPackFormatter +{ + public abstract TFormatter GetFormatter(); +} + +#endif + +// similar naming as System.Text.Json attribtues +// https://docs.microsoft.com/en-us/dotnet/api/system.text.json.serialization.jsonattribute + +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackIgnoreAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackIncludeAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Constructor, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackConstructorAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackOnSerializingAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackOnSerializedAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackOnDeserializingAttribute : Attribute +{ +} + +[AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] +public sealed class MemoryPackOnDeserializedAttribute : Attribute +{ +} + +// Others + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, AllowMultiple = false, Inherited = false)] +public sealed class GenerateTypeScriptAttribute : Attribute +{ +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs.meta new file mode 100644 index 0000000..3c7ab82 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Attributes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e370fb1f0283f164ba65d0874cbef7f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression.meta new file mode 100644 index 0000000..03b13c2 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fd052f2443b7d0f4cb63c15ff5b3c8af +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs new file mode 100644 index 0000000..adc90d0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs @@ -0,0 +1,181 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Runtime.CompilerServices; + +#if NET7_0_OR_GREATER +using System.Runtime.InteropServices; +using System.Runtime.Intrinsics; +#endif + +namespace MemoryPack.Compression { + +[Preserve] +public sealed class BitPackFormatter : MemoryPackFormatter +{ + public static readonly BitPackFormatter Default = new BitPackFormatter(); + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref bool[]? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + writer.WriteCollectionHeader(value.Length); + if (value.Length == 0) + { + return; + } + + var data = 0; +#if NET7_0_OR_GREATER + ref var item = ref MemoryMarshal.GetArrayDataReference(value); +#else + ref var item = ref value[0]; +#endif + ref var end = ref Unsafe.Add(ref item, value.Length); + +#if NET7_0_OR_GREATER + if (value.Length >= 32) + { + ref var loopEnd = ref Unsafe.Subtract(ref end, 32); + if (Vector256.IsHardwareAccelerated) + { + while (!Unsafe.IsAddressGreaterThan(ref item, ref loopEnd)) + { + var vector = Vector256.LoadUnsafe(ref Unsafe.As(ref item)); + // false -> 1 true -> 0 + data = (int)Vector256.Equals(vector, Vector256.Zero).ExtractMostSignificantBits(); + writer.WriteUnmanaged(~data); + item = ref Unsafe.Add(ref item, 32); + } + } + else if (Vector128.IsHardwareAccelerated) + { + while (!Unsafe.IsAddressGreaterThan(ref item, ref loopEnd)) + { + var bits0 = (ushort)Vector128.Equals(Vector128.LoadUnsafe(ref Unsafe.As(ref item)), Vector128.Zero).ExtractMostSignificantBits(); + var bits1 = (ushort)Vector128.Equals(Vector128.LoadUnsafe(ref Unsafe.As(ref item), 16), Vector128.Zero).ExtractMostSignificantBits(); + data = bits0 | (bits1 << 16); + writer.WriteUnmanaged(~data); + item = ref Unsafe.Add(ref item, 32); + } + } + else if (Vector64.IsHardwareAccelerated) + { + while (!Unsafe.IsAddressGreaterThan(ref item, ref loopEnd)) + { + var bits0 = (byte)Vector64.Equals(Vector64.LoadUnsafe(ref Unsafe.As(ref item)), Vector64.Zero).ExtractMostSignificantBits(); + var bits1 = (byte)Vector64.Equals(Vector64.LoadUnsafe(ref Unsafe.As(ref item), 8), Vector64.Zero).ExtractMostSignificantBits(); + var bits2 = (byte)Vector64.Equals(Vector64.LoadUnsafe(ref Unsafe.As(ref item), 16), Vector64.Zero).ExtractMostSignificantBits(); + var bits3 = (byte)Vector64.Equals(Vector64.LoadUnsafe(ref Unsafe.As(ref item), 24), Vector64.Zero).ExtractMostSignificantBits(); + data = bits0 | (bits1 << 8) | (bits2 << 16) | (bits3 << 24); + writer.WriteUnmanaged(~data); + item = ref Unsafe.Add(ref item, 32); + } + } + + data = 0; + } +#endif + var bit = 0; + while (Unsafe.IsAddressLessThan(ref item, ref end)) + { + Set(ref data, bit, item); + + item = ref Unsafe.Add(ref item, 1); + bit += 1; + + if (bit == 32) + { + writer.WriteUnmanaged(data); + data = 0; + bit = 0; + } + } + + if (bit != 0) + { + writer.WriteUnmanaged(data); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref bool[]? value) + { + if (!reader.DangerousTryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + var readCount = ((length - 1) / 32) + 1; + var requireSize = readCount * 4; + if (reader.Remaining < requireSize) + { + MemoryPackSerializationException.ThrowInsufficientBufferUnless(length); + } + + if (value == null || value.Length != length) + { + value = new bool[length]; + } + + var bit = 0; + var data = 0; + for (int i = 0; i < value.Length; i++) + { + if (bit == 0) + { + reader.ReadUnmanaged(out data); + } + + value[i] = Get(data, bit); + + bit += 1; + + if (bit == 32) + { + data = 0; + bit = 0; + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Get(int data, int index) + { + return (data & (1 << index)) != 0; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Set(ref int data, int index, bool value) + { + int bitMask = 1 << index; + if (value) + { + data |= bitMask; + } + else + { + data &= ~bitMask; + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs.meta new file mode 100644 index 0000000..63d4d5f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BitPackFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61f1625193facbe4abecb4f90defa276 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs new file mode 100644 index 0000000..fbb12d5 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs @@ -0,0 +1,338 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.Diagnostics.CodeAnalysis; +using System.IO.Compression; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack.Compression { + +#if !NET7_0_OR_GREATER +#pragma warning disable CS8602 +#endif + +public +#if NET7_0_OR_GREATER + struct +#else + class +#endif + BrotliCompressor : IBufferWriter, IDisposable +{ + ReusableLinkedArrayBufferWriter? bufferWriter; + readonly int quality; + readonly int window; + +#if NET7_0_OR_GREATER + + public BrotliCompressor() + : this(CompressionLevel.Fastest) + { + + } + +#endif + + public BrotliCompressor(CompressionLevel compressionLevel) + : this(BrotliUtils.GetQualityFromCompressionLevel(compressionLevel), BrotliUtils.WindowBits_Default) + { + + } + + public BrotliCompressor(CompressionLevel compressionLevel, int window) + : this(BrotliUtils.GetQualityFromCompressionLevel(compressionLevel), window) + { + + } + + public BrotliCompressor(int quality = 1, int window = 22) + { + this.bufferWriter = ReusableLinkedArrayBufferWriterPool.Rent(); + this.quality = quality; + this.window = window; + } + + void IBufferWriter.Advance(int count) + { + ThrowIfDisposed(); + bufferWriter.Advance(count); + } + + Memory IBufferWriter.GetMemory(int sizeHint) + { + ThrowIfDisposed(); + return bufferWriter.GetMemory(sizeHint); + } + + Span IBufferWriter.GetSpan(int sizeHint) + { + ThrowIfDisposed(); + return bufferWriter.GetSpan(sizeHint); + } + + public byte[] ToArray() + { + ThrowIfDisposed(); + + using var encoder = new BrotliEncoder(quality, window); + + var maxLength = BrotliUtils.BrotliEncoderMaxCompressedSize(bufferWriter.TotalWritten); + + var finalBuffer = ArrayPool.Shared.Rent(maxLength); + try + { + var writtenCount = 0; + var destination = finalBuffer.AsSpan(0, maxLength); + foreach (var source in bufferWriter) + { + var status = encoder.Compress(source.Span, destination, out var bytesConsumed, out var bytesWritten, isFinalBlock: false); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + + if (bytesConsumed != source.Span.Length) + { + MemoryPackSerializationException.ThrowCompressionFailed(); + } + + if (bytesWritten > 0) + { + destination = destination.Slice(bytesWritten); + writtenCount += bytesWritten; + } + } + + // call BrotliEncoderOperation.Finish + var finalStatus = encoder.Compress(ReadOnlySpan.Empty, destination, out var consumed, out var written, isFinalBlock: true); + writtenCount += written; + + return finalBuffer.AsSpan(0, writtenCount).ToArray(); + } + finally + { + ArrayPool.Shared.Return(finalBuffer); + } + } + + public void CopyTo(in IBufferWriter destBufferWriter) + + { + ThrowIfDisposed(); + + var encoder = new BrotliEncoder(quality, window); + try + { + var writtenNotAdvanced = 0; + foreach (var item in bufferWriter) + { + writtenNotAdvanced = CompressCore(ref encoder, item.Span, ref Unsafe.AsRef(destBufferWriter), initialLength: null, isFinalBlock: false); + } + + // call BrotliEncoderOperation.Finish + var finalBlockLength = (writtenNotAdvanced == 0) ? null : (int?)(writtenNotAdvanced + 10); + CompressCore(ref encoder, ReadOnlySpan.Empty, ref Unsafe.AsRef(destBufferWriter), initialLength: finalBlockLength, isFinalBlock: true); + } + finally + { + encoder.Dispose(); + } + } + + public async ValueTask CopyToAsync(Stream stream, int bufferSize = 65535, CancellationToken cancellationToken = default) + { + ThrowIfDisposed(); + + using var encoder = new BrotliEncoder(quality, window); + + var buffer = ArrayPool.Shared.Rent(bufferSize); + try + { + foreach (var item in bufferWriter) + { + var source = item; + var lastResult = OperationStatus.DestinationTooSmall; + while (lastResult == OperationStatus.DestinationTooSmall) + { + lastResult = encoder.Compress(source.Span, buffer, out int bytesConsumed, out int bytesWritten, isFinalBlock: false); + if (lastResult == OperationStatus.InvalidData) MemoryPackSerializationException.ThrowCompressionFailed(); + if (bytesWritten > 0) + { + await stream.WriteAsync(buffer.AsMemory(0, bytesWritten), cancellationToken).ConfigureAwait(false); + } + if (bytesConsumed > 0) + { + source = source.Slice(bytesConsumed); + } + } + } + + // call BrotliEncoderOperation.Finish + var finalStatus = encoder.Compress(ReadOnlySpan.Empty, buffer, out var consumed, out var written, isFinalBlock: true); + if (written > 0) + { + await stream.WriteAsync(buffer.AsMemory(0, written), cancellationToken).ConfigureAwait(false); + } + } + finally + { + ArrayPool.Shared.Return(buffer); + } + } + + public void CopyTo(ref MemoryPackWriter memoryPackWriter) +#if NET7_0_OR_GREATER + +#else + +#endif + { + ThrowIfDisposed(); + + var encoder = new BrotliEncoder(quality, window); + try + { + var writtenNotAdvanced = 0; + foreach (var item in bufferWriter) + { + writtenNotAdvanced = CompressCore(ref encoder, item.Span, ref memoryPackWriter, initialLength: null, isFinalBlock: false); + } + + // call BrotliEncoderOperation.Finish + var finalBlockLength = (writtenNotAdvanced == 0) ? null : (int?)(writtenNotAdvanced + 10); + CompressCore(ref encoder, ReadOnlySpan.Empty, ref memoryPackWriter, initialLength: finalBlockLength, isFinalBlock: true); + } + finally + { + encoder.Dispose(); + } + } + + static int CompressCore(ref BrotliEncoder encoder, ReadOnlySpan source, ref IBufferWriter destBufferWriter, int? initialLength, bool isFinalBlock) + + { + var writtenNotAdvanced = 0; + + var lastResult = OperationStatus.DestinationTooSmall; + while (lastResult == OperationStatus.DestinationTooSmall) + { + var dest = destBufferWriter.GetSpan(initialLength ?? source.Length); + + lastResult = encoder.Compress(source, dest, out int bytesConsumed, out int bytesWritten, isFinalBlock: isFinalBlock); + writtenNotAdvanced += bytesConsumed; + + if (lastResult == OperationStatus.InvalidData) MemoryPackSerializationException.ThrowCompressionFailed(); + if (bytesWritten > 0) + { + destBufferWriter.Advance(bytesWritten); + writtenNotAdvanced = 0; + } + if (bytesConsumed > 0) + { + source = source.Slice(bytesConsumed); + } + } + + return writtenNotAdvanced; + } + + static int CompressCore(ref BrotliEncoder encoder, ReadOnlySpan source, ref MemoryPackWriter destBufferWriter, int? initialLength, bool isFinalBlock) +#if NET7_0_OR_GREATER + +#else + +#endif + { + var writtenNotAdvanced = 0; + + var lastResult = OperationStatus.DestinationTooSmall; + while (lastResult == OperationStatus.DestinationTooSmall) + { + ref var spanRef = ref destBufferWriter.GetSpanReference(initialLength ?? source.Length); + var dest = MemoryMarshal.CreateSpan(ref spanRef, destBufferWriter.BufferLength); + + lastResult = encoder.Compress(source, dest, out int bytesConsumed, out int bytesWritten, isFinalBlock: isFinalBlock); + writtenNotAdvanced += bytesConsumed; + + if (lastResult == OperationStatus.InvalidData) MemoryPackSerializationException.ThrowCompressionFailed(); + if (bytesWritten > 0) + { + destBufferWriter.Advance(bytesWritten); + writtenNotAdvanced = 0; + } + if (bytesConsumed > 0) + { + source = source.Slice(bytesConsumed); + } + } + + return writtenNotAdvanced; + } + + public void Dispose() + { + if (bufferWriter == null) return; + + bufferWriter.Reset(); + ReusableLinkedArrayBufferWriterPool.Return(bufferWriter); + bufferWriter = null!; + } + +#if NET7_0_OR_GREATER + [MemberNotNull(nameof(bufferWriter))] +#endif + void ThrowIfDisposed() + { + if (bufferWriter == null) + { + throw new ObjectDisposedException(null); + } + } +} + +internal static partial class BrotliUtils +{ + public const int WindowBits_Min = 10; + public const int WindowBits_Default = 22; + public const int WindowBits_Max = 24; + public const int Quality_Min = 0; + public const int Quality_Default = 4; + public const int Quality_Max = 11; + public const int MaxInputSize = int.MaxValue - 515; // 515 is the max compressed extra bytes + + internal static int GetQualityFromCompressionLevel(CompressionLevel compressionLevel) => + compressionLevel switch + { + CompressionLevel.NoCompression => Quality_Min, + CompressionLevel.Fastest => 1, + CompressionLevel.Optimal => Quality_Default, +#if NET7_0_OR_GREATER + CompressionLevel.SmallestSize => Quality_Max, +#endif + _ => throw new ArgumentException() + }; + + + // https://github.com/dotnet/runtime/issues/35142 + // BrotliEncoder.GetMaxCompressedLength is broken in .NET 7 + // port from encode.c https://github.com/google/brotli/blob/3914999fcc1fda92e750ef9190aa6db9bf7bdb07/c/enc/encode.c#L1200 + internal static int BrotliEncoderMaxCompressedSize(int input_size) + { + var num_large_blocks = input_size >> 14; + var overhead = 2 + (4 * num_large_blocks) + 3 + 1; + var result = input_size + overhead; + if (input_size == 0) return 2; + return (result < input_size) ? 0 : result; + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs.meta new file mode 100644 index 0000000..fa308e9 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliCompressor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 62473f8441644d1479405f2eb8f863c9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs new file mode 100644 index 0000000..c1f5b24 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.Diagnostics; +using System.IO.Compression; + +namespace MemoryPack.Compression { + +public struct BrotliDecompressor : IDisposable +{ + ReusableReadOnlySequenceBuilder? sequenceBuilder; + + public ReadOnlySequence Decompress(ReadOnlySpan compressedSpan) + { + return Decompress(compressedSpan, out _); + } + + public ReadOnlySequence Decompress(ReadOnlySpan compressedSpan, out int consumed) + { + if (sequenceBuilder != null) + { + MemoryPackSerializationException.ThrowAlreadyDecompressed(); + } + + sequenceBuilder = ReusableReadOnlySequenceBuilderPool.Rent(); + var decoder = new BrotliDecoder(); + try + { + var status = OperationStatus.DestinationTooSmall; + DecompressCore(ref status, ref decoder, compressedSpan, out consumed); + if (status == OperationStatus.NeedMoreData) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + } + finally + { + decoder.Dispose(); + } + + return sequenceBuilder.Build(); + } + + public ReadOnlySequence Decompress(ReadOnlySequence compressedSequence) + { + return Decompress(compressedSequence, out _); + } + + public ReadOnlySequence Decompress(ReadOnlySequence compressedSequence, out int consumed) + { + if (sequenceBuilder != null) + { + MemoryPackSerializationException.ThrowAlreadyDecompressed(); + } + + sequenceBuilder = ReusableReadOnlySequenceBuilderPool.Rent(); + var decoder = new BrotliDecoder(); + try + { + var status = OperationStatus.DestinationTooSmall; + consumed = 0; + foreach (var item in compressedSequence) + { + DecompressCore(ref status, ref decoder, item.Span, out var bytesConsumed); + consumed += bytesConsumed; + } + + if (status == OperationStatus.NeedMoreData) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + } + finally + { + decoder.Dispose(); + } + + return sequenceBuilder.Build(); + } + + void DecompressCore(ref OperationStatus status, ref BrotliDecoder decoder, ReadOnlySpan source, out int consumed) + { + Debug.Assert(sequenceBuilder != null); + consumed = 0; + + byte[]? buffer = null; + status = OperationStatus.DestinationTooSmall; + var nextCapacity = source.Length; + while (status == OperationStatus.DestinationTooSmall) + { + if (buffer == null) + { + nextCapacity = GetDoubleCapacity(nextCapacity); + buffer = ArrayPool.Shared.Rent(nextCapacity); + } + + status = decoder.Decompress(source, buffer, out var bytesConsumed, out var bytesWritten); + consumed += bytesConsumed; + + if (status == OperationStatus.InvalidData) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + + if (status == OperationStatus.NeedMoreData) + { + if (bytesWritten > 0) + { + sequenceBuilder.Add(buffer.AsMemory(0, bytesWritten), true); + } + if (bytesConsumed > 0) + { + source = source.Slice(bytesConsumed); + } + if (source.Length != 0) + { + // not consumed source fully + MemoryPackSerializationException.ThrowCompressionFailed(); + } + + // continue for next sequence. + return; + } + + if (bytesConsumed > 0) + { + source = source.Slice(bytesConsumed); + } + if (bytesWritten > 0) + { + sequenceBuilder.Add(buffer.AsMemory(0, bytesWritten), true); + buffer = null; + } + } + } + + public void Dispose() + { + if (sequenceBuilder != null) + { + ReusableReadOnlySequenceBuilderPool.Return(sequenceBuilder); + sequenceBuilder = null; + } + } + + int GetDoubleCapacity(int length) + { + var newCapacity = unchecked(length * 2); + if ((uint)newCapacity > int.MaxValue) newCapacity = int.MaxValue; + return Math.Max(newCapacity, 4096); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs.meta new file mode 100644 index 0000000..b35a9a1 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliDecompressor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fe3786d11daa23f4488fa639754af3a7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs new file mode 100644 index 0000000..b23285f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.IO.Compression; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack.Compression { + +// serialize as (uncompressedLength, compressedLength, values...) + +[Preserve] +public sealed class BrotliFormatter : MemoryPackFormatter +{ + internal const int DefaultDecompssionSizeLimit = 1024 * 1024 * 128; // 128MB + + public static readonly BrotliFormatter Default = new BrotliFormatter(); + + readonly System.IO.Compression.CompressionLevel compressionLevel; + readonly int window; + readonly int decompressionSizeLimit; + + public BrotliFormatter() + : this(System.IO.Compression.CompressionLevel.Fastest) + { + + } + + public BrotliFormatter(System.IO.Compression.CompressionLevel compressionLevel) + : this(compressionLevel, BrotliUtils.WindowBits_Default) + { + } + + public BrotliFormatter(System.IO.Compression.CompressionLevel compressionLevel, int window) + : this(compressionLevel, window, DefaultDecompssionSizeLimit) + { + } + + public BrotliFormatter(System.IO.Compression.CompressionLevel compressionLevel, int window, int decompressionSizeLimit) + { + this.compressionLevel = compressionLevel; + this.window = window; + this.decompressionSizeLimit = decompressionSizeLimit; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref byte[]? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + if (value.Length == 0) + { + writer.WriteCollectionHeader(0); + return; + } + + var quality = BrotliUtils.GetQualityFromCompressionLevel(compressionLevel); + + using var encoder = new BrotliEncoder(quality, window); + + var maxLength = BrotliUtils.BrotliEncoderMaxCompressedSize(value.Length); + + ref var head = ref writer.GetSpanReference(maxLength + 8); + + var dest = MemoryMarshal.CreateSpan(ref Unsafe.Add(ref head, 8), maxLength); + var status = encoder.Compress(value.AsSpan(), dest, out var bytesConsumed, out var bytesWritten, isFinalBlock: true); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + + if (bytesConsumed != value.Length) + { + MemoryPackSerializationException.ThrowCompressionFailed(); + } + + // write to buffer header (uncompressedLength, compressedLength, values...) + Unsafe.WriteUnaligned(ref head, value.Length); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref head, 4), bytesWritten); + + writer.Advance(bytesWritten + 8); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref byte[]? value) + { + var uncompressedLength = reader.ReadUnmanaged(); + + reader.DangerousReadUnmanagedSpanView(out var isNull, out var compressedBuffer); + + if (isNull) + { + value = null; + return; + } + + if (compressedBuffer.Length == 0) + { + value = Array.Empty(); + return; + } + + // security, require to check length + if (decompressionSizeLimit < uncompressedLength) + { + MemoryPackSerializationException.ThrowDecompressionSizeLimitExceeded(decompressionSizeLimit, uncompressedLength); + } + + if (value == null || value.Length != uncompressedLength) + { + value = new byte[uncompressedLength]; + } + + using var decoder = new BrotliDecoder(); + + var status = decoder.Decompress(compressedBuffer, value, out var bytesConsumed, out var bytesWritten); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + + if (bytesConsumed != compressedBuffer.Length || bytesWritten != value.Length) + { + MemoryPackSerializationException.ThrowCompressionFailed(); + } + } +} + + +[Preserve] +public sealed class BrotliFormatter : MemoryPackFormatter +{ + internal const int DefaultDecompssionSizeLimit = 1024 * 1024 * 128; // 128MB + + public static readonly BrotliFormatter Default = new BrotliFormatter(); + + readonly System.IO.Compression.CompressionLevel compressionLevel; + readonly int window; + + public BrotliFormatter() + : this(System.IO.Compression.CompressionLevel.Fastest) + { + + } + + public BrotliFormatter(System.IO.Compression.CompressionLevel compressionLevel) + : this(compressionLevel, BrotliUtils.WindowBits_Default) + { + } + + public BrotliFormatter(System.IO.Compression.CompressionLevel compressionLevel, int window) + { + this.compressionLevel = compressionLevel; + this.window = window; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T? value) + { + var compressor = new BrotliCompressor(compressionLevel, window); + try + { + var coWriter = new MemoryPackWriter(ref Unsafe.As>(ref compressor), writer.OptionalState); + + coWriter.WriteValue(value); + coWriter.Flush(); + + compressor.CopyTo(ref writer); + } + finally + { + compressor.Dispose(); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T? value) + { + using var decompressor = new BrotliDecompressor(); + + reader.GetRemainingSource(out var singleSource, out var remainingSource); + + int consumed; + ReadOnlySequence decompressedSource; + if (singleSource.Length != 0) + { + decompressedSource = decompressor.Decompress(singleSource, out consumed); + } + else + { + decompressedSource = decompressor.Decompress(remainingSource, out consumed); + } + + using var coReader = new MemoryPackReader(decompressedSource, reader.OptionalState); + coReader.ReadValue(ref value); + + reader.Advance(consumed); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs.meta new file mode 100644 index 0000000..1de7fcc --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Compression/BrotliFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 45b39997d100c0848bcdb691400b2c1f +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs new file mode 100644 index 0000000..6c52ac8 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Compression; +using MemoryPack.Formatters; + +namespace MemoryPack { + +#if !UNITY_2021_2_OR_NEWER + +public sealed class Utf8StringFormatterAttribute : MemoryPackCustomFormatterAttribute +{ + public override Utf8StringFormatter GetFormatter() + { + return Utf8StringFormatter.Default; + } +} + +public sealed class Utf16StringFormatterAttribute : MemoryPackCustomFormatterAttribute +{ + public override Utf16StringFormatter GetFormatter() + { + return Utf16StringFormatter.Default; + } +} + +public sealed class OrdinalIgnoreCaseStringDictionaryFormatter : MemoryPackCustomFormatterAttribute, Dictionary> +{ + static readonly DictionaryFormatter formatter = new DictionaryFormatter(StringComparer.OrdinalIgnoreCase); + + public override DictionaryFormatter GetFormatter() + { + return formatter; + } +} + +public sealed class InternStringFormatterAttribute : MemoryPackCustomFormatterAttribute +{ + public override InternStringFormatter GetFormatter() + { + return InternStringFormatter.Default; + } +} + +public sealed class BitPackFormatterAttribute : MemoryPackCustomFormatterAttribute +{ + public override BitPackFormatter GetFormatter() + { + return BitPackFormatter.Default; + } +} + +public sealed class BrotliFormatterAttribute : MemoryPackCustomFormatterAttribute +{ + public System.IO.Compression.CompressionLevel CompressionLevel { get; } + public int Window { get; } + public int DecompressionSizeLimit { get; } + + public BrotliFormatterAttribute(System.IO.Compression.CompressionLevel compressionLevel = System.IO.Compression.CompressionLevel.Fastest, int window = BrotliUtils.WindowBits_Default, int decompressionSizeLimit = BrotliFormatter.DefaultDecompssionSizeLimit) + { + this.CompressionLevel = compressionLevel; + this.Window = window; + this.DecompressionSizeLimit = decompressionSizeLimit; + } + + public override BrotliFormatter GetFormatter() + { + return new BrotliFormatter(CompressionLevel, Window, DecompressionSizeLimit); + } +} + +public sealed class BrotliFormatterAttribute : MemoryPackCustomFormatterAttribute, T> +{ + public System.IO.Compression.CompressionLevel CompressionLevel { get; } + public int Window { get; } + + public BrotliFormatterAttribute(System.IO.Compression.CompressionLevel compressionLevel = System.IO.Compression.CompressionLevel.Fastest, int window = BrotliUtils.WindowBits_Default) + { + this.CompressionLevel = compressionLevel; + this.Window = window; + } + + public override BrotliFormatter GetFormatter() + { + return new BrotliFormatter(CompressionLevel, Window); + } +} + +public sealed class BrotliStringFormatterAttribute : MemoryPackCustomFormatterAttribute +{ + public System.IO.Compression.CompressionLevel CompressionLevel { get; } + public int Window { get; } + public int DecompressionSizeLimit { get; } + + public BrotliStringFormatterAttribute(System.IO.Compression.CompressionLevel compressionLevel = System.IO.Compression.CompressionLevel.Fastest, int window = BrotliUtils.WindowBits_Default, int decompressionSizeLimit = BrotliFormatter.DefaultDecompssionSizeLimit) + { + this.CompressionLevel = compressionLevel; + this.Window = window; + this.DecompressionSizeLimit = decompressionSizeLimit; + } + + public override BrotliStringFormatter GetFormatter() + { + return new BrotliStringFormatter(CompressionLevel, Window, DecompressionSizeLimit); + } +} + +public sealed class MemoryPoolFormatterAttribute : MemoryPackCustomFormatterAttribute, Memory> +{ + static readonly MemoryPoolFormatter formatter = new MemoryPoolFormatter(); + + public override MemoryPoolFormatter GetFormatter() + { + return formatter; + } +} + +public sealed class ReadOnlyMemoryPoolFormatterAttribute : MemoryPackCustomFormatterAttribute, ReadOnlyMemory> +{ + static readonly ReadOnlyMemoryPoolFormatter formatter = new ReadOnlyMemoryPoolFormatter(); + + public override ReadOnlyMemoryPoolFormatter GetFormatter() + { + return formatter; + } +} + +#endif + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs.meta new file mode 100644 index 0000000..c308553 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/CustomFormatterAttributes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1cc6f8595850d1c41ba61d06616f2d67 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters.meta new file mode 100644 index 0000000..950e865 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a0a5b1b5dbda76d4cb24f36a176f4456 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs new file mode 100644 index 0000000..820e214 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs @@ -0,0 +1,228 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Formatters; +using MemoryPack.Internal; +using System.Buffers; +using System.Collections.Concurrent; +using System.Collections.ObjectModel; +using System.Runtime.CompilerServices; + +// Array and Array-like type formatters +// T[] +// T[] where T: unmnaged +// Memory +// ReadOnlyMemory +// ArraySegment +// ReadOnlySequence + +namespace MemoryPack +{ + public static partial class MemoryPackFormatterProvider + { + static readonly Dictionary ArrayLikeFormatters = new Dictionary(4) + { + // If T[], choose UnmanagedArrayFormatter or DangerousUnmanagedTypeArrayFormatter or ArrayFormatter + { typeof(ArraySegment<>), typeof(ArraySegmentFormatter<>) }, + { typeof(Memory<>), typeof(MemoryFormatter<>) }, + { typeof(ReadOnlyMemory<>), typeof(ReadOnlyMemoryFormatter<>) }, + { typeof(ReadOnlySequence<>), typeof(ReadOnlySequenceFormatter<>) }, + }; + } +} + +namespace MemoryPack.Formatters +{ + [Preserve] + public sealed class UnmanagedArrayFormatter : MemoryPackFormatter + where T : unmanaged + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T[]? value) + { + writer.WriteUnmanagedArray(value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T[]? value) + { + reader.ReadUnmanagedArray(ref value); + } + } + + [Preserve] + public sealed class DangerousUnmanagedArrayFormatter : MemoryPackFormatter + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T[]? value) + { + writer.DangerousWriteUnmanagedArray(value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T[]? value) + { + reader.DangerousReadUnmanagedArray(ref value); + } + } + + [Preserve] + public sealed class ArrayFormatter : MemoryPackFormatter + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T?[]? value) + { + writer.WriteArray(value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T?[]? value) + { + reader.ReadArray(ref value); + } + } + + [Preserve] + public sealed class ArraySegmentFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ArraySegment value) + { + writer.WriteSpan(value.AsMemory().Span); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ArraySegment value) + { + var array = reader.ReadArray(); + value = (array == null) ? default : (ArraySegment)array; + } + } + + [Preserve] + public sealed class MemoryFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Memory value) + { + writer.WriteSpan(value.Span); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Memory value) + { + value = reader.ReadArray(); + } + } + + [Preserve] + public sealed class ReadOnlyMemoryFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ReadOnlyMemory value) + { + writer.WriteSpan(value.Span); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ReadOnlyMemory value) + { + value = reader.ReadArray(); + } + } + + [Preserve] + public sealed class ReadOnlySequenceFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ReadOnlySequence value) + { + if (value.IsSingleSegment) + { + writer.WriteSpan(value.FirstSpan); + return; + } + + writer.WriteCollectionHeader(checked((int)value.Length)); + foreach (var memory in value) + { + writer.WriteSpanWithoutLengthHeader(memory.Span); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ReadOnlySequence value) + { + var array = reader.ReadArray(); + value = (array == null) ? default : new ReadOnlySequence(array); + } + } + + [Preserve] + public sealed class MemoryPoolFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Memory value) + { + writer.WriteSpan(value.Span); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Memory value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = Memory.Empty; + return; + } + + var memory = ArrayPool.Shared.Rent(length).AsMemory(0, length); + var span = memory.Span; + reader.ReadSpanWithoutReadLengthHeader(length, ref span); + value = memory; + } + } + + [Preserve] + public sealed class ReadOnlyMemoryPoolFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ReadOnlyMemory value) + { + writer.WriteSpan(value.Span); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ReadOnlyMemory value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = Memory.Empty; + return; + } + + var memory = ArrayPool.Shared.Rent(length).AsMemory(0, length); + var span = memory.Span; + reader.ReadSpanWithoutReadLengthHeader(length, ref span); + value = memory; + } + } +} diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs.meta new file mode 100644 index 0000000..3af1b7e --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/ArrayFormatters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8ea47c22508b03445aabd57919531dc4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs new file mode 100644 index 0000000..adebc99 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Numerics; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class BigIntegerFormatter : MemoryPackFormatter +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref BigInteger value) + { +#if !UNITY_2021_2_OR_NEWER + Span temp = stackalloc byte[255]; + if (value.TryWriteBytes(temp, out var written)) + { + writer.WriteUnmanagedSpan(temp.Slice(written)); + return; + } + else +#endif + { + var byteArray = value.ToByteArray(); + writer.WriteUnmanagedArray(byteArray); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref BigInteger value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + ref var src = ref reader.GetSpanReference(length); + value = new BigInteger(MemoryMarshal.CreateReadOnlySpan(ref src, length)); + + reader.Advance(length); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs.meta new file mode 100644 index 0000000..0f2809c --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BigIntegerFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 85c3a3fc180ed724798da6a6bd7c8635 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs new file mode 100644 index 0000000..2c1393f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs @@ -0,0 +1,67 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Collections; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class BitArrayFormatter : MemoryPackFormatter +{ + // serialize [m_length, m_array] + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref BitArray? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + ref var view = ref Unsafe.As(ref value); + + writer.WriteUnmanagedWithObjectHeader(2, view.m_length); + writer.WriteUnmanagedArray(view.m_array); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref BitArray? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 2) MemoryPackSerializationException.ThrowInvalidPropertyCount(2, count); + + reader.ReadUnmanaged(out int length); + + var bitArray = new BitArray(length, false); // create internal int[] and set m_length to length + + ref var view = ref Unsafe.As(ref bitArray); + reader.ReadUnmanagedArray(ref view.m_array!); + + value = bitArray; + } +} + +#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. +[Preserve] +internal class BitArrayView +{ + public int[] m_array; + public int m_length; + public int _version; +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs.meta new file mode 100644 index 0000000..caa1796 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/BitArrayFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c7910d03f8a5023479d0bf2968f56267 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs new file mode 100644 index 0000000..111988e --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs @@ -0,0 +1,1201 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Formatters; +using MemoryPack.Internal; +using System.Buffers; +using System.Collections.Concurrent; +using System.Collections.ObjectModel; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Clear support collection formatters +// List, Stack, Queue, LinkedList, HashSet, PriorityQueue, +// ObservableCollection, Collection +// ConcurrentQueue, ConcurrentStack, ConcurrentBag +// Dictionary, SortedDictionary, SortedList, ConcurrentDictionary + +// Not supported clear +// ReadOnlyCollection, ReadOnlyObservableCollection, BlockingCollection + +namespace MemoryPack +{ + public static partial class MemoryPackFormatterProvider + { + static readonly Dictionary CollectionFormatters = new Dictionary(18) + { + { typeof(List<>), typeof(ListFormatter<>) }, + { typeof(Stack<>), typeof(StackFormatter<>) }, + { typeof(Queue<>), typeof(QueueFormatter<>) }, + { typeof(LinkedList<>), typeof(LinkedListFormatter<>) }, + { typeof(HashSet<>), typeof(HashSetFormatter<>) }, + { typeof(SortedSet<>), typeof(SortedSetFormatter<>) }, +#if NET7_0_OR_GREATER + { typeof(PriorityQueue<,>), typeof(PriorityQueueFormatter<,>) }, +#endif + { typeof(ObservableCollection<>), typeof(ObservableCollectionFormatter<>) }, + { typeof(Collection<>), typeof(CollectionFormatter<>) }, + { typeof(ConcurrentQueue<>), typeof(ConcurrentQueueFormatter<>) }, + { typeof(ConcurrentStack<>), typeof(ConcurrentStackFormatter<>) }, + { typeof(ConcurrentBag<>), typeof(ConcurrentBagFormatter<>) }, + { typeof(Dictionary<,>), typeof(DictionaryFormatter<,>) }, + { typeof(SortedDictionary<,>), typeof(SortedDictionaryFormatter<,>) }, + { typeof(SortedList<,>), typeof(SortedListFormatter<,>) }, + { typeof(ConcurrentDictionary<,>), typeof(ConcurrentDictionaryFormatter<,>) }, + { typeof(ReadOnlyCollection<>), typeof(ReadOnlyCollectionFormatter<>) }, + { typeof(ReadOnlyObservableCollection<>), typeof(ReadOnlyObservableCollectionFormatter<>) }, + { typeof(BlockingCollection<>), typeof(BlockingCollectionFormatter<>) }, + }; + } +} + +namespace MemoryPack.Formatters +{ + [Preserve] + public static class ListFormatter + { + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void SerializePackable(ref MemoryPackWriter writer, ref List? value) + where T : IMemoryPackable +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + +#if NET7_0_OR_GREATER + writer.WritePackableSpan(CollectionsMarshal.AsSpan(value)); +#else + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } +#endif + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static List? DeserializePackable(ref MemoryPackReader reader) + where T : IMemoryPackable + { + List? value = default; + DeserializePackable(ref reader, ref value); + return value; + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void DeserializePackable(ref MemoryPackReader reader, ref List? value) + where T : IMemoryPackable + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new List(length); + } +#if NET7_0_OR_GREATER + else if (value.Count == length) + { + value.Clear(); + } + + var span = CollectionsMarshalEx.CreateSpan(value, length); + reader.ReadPackableSpanWithoutReadLengthHeader(length, ref span); +#else + else + { + value.Clear(); + } + var formatter = reader.GetFormatter(); + for (var i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } +#endif + } + } + + [Preserve] + public sealed class ListFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref List? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } +#if NET7_0_OR_GREATER + writer.WriteSpan(CollectionsMarshal.AsSpan(value)); +#else + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } +#endif + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref List? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new List(length); + } +#if NET7_0_OR_GREATER + else if (value.Count == length) + { + value.Clear(); + } + + var span = CollectionsMarshalEx.CreateSpan(value, length); + reader.ReadSpanWithoutReadLengthHeader(length, ref span); +#else + else + { + value.Clear(); + } + var formatter = reader.GetFormatter(); + for (var i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } +#endif + } + } + + [Preserve] + public sealed class StackFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Stack? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + +#if NET7_0_OR_GREATER + writer.WriteSpan(CollectionsMarshalEx.AsSpan(value)); +#else + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value.Reverse()) // serialize reverse order + { + var v = item; + formatter.Serialize(ref writer, ref v); + } +#endif + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Stack? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new Stack(length); + } +#if NET7_0_OR_GREATER + else if (value.Count != length) + { + value.Clear(); + } + + var span = CollectionsMarshalEx.CreateSpan(value, length); + reader.ReadSpanWithoutReadLengthHeader(length, ref span); +#else + else + { + value.Clear(); + } + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Push(v); + } +#endif + } + } + + [Preserve] + public sealed class QueueFormatter : MemoryPackFormatter> + { + // Queue is circular buffer, can't optimize like List, Stack. + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Queue? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Queue? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new Queue(length); + } + else + { + value.Clear(); +#if NET7_0_OR_GREATER + value.EnsureCapacity(length); +#endif + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Enqueue(v); + } + } + } + + [Preserve] + public sealed class LinkedListFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref LinkedList? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref LinkedList? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new LinkedList(); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.AddLast(v); + } + } + } + + [Preserve] + public sealed class HashSetFormatter : MemoryPackFormatter> + { + readonly IEqualityComparer? equalityComparer; + + public HashSetFormatter() + : this(null) + { + } + + public HashSetFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref HashSet? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref HashSet? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new HashSet(length, equalityComparer); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } + } + } + + [Preserve] + public sealed class SortedSetFormatter : MemoryPackFormatter> + { + readonly IComparer? comparer; + + public SortedSetFormatter() + : this(null) + { + } + + public SortedSetFormatter(IComparer? comparer) + { + this.comparer = comparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref SortedSet? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref SortedSet? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new SortedSet(comparer); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } + } + } + +#if NET7_0_OR_GREATER + + [Preserve] + public sealed class PriorityQueueFormatter : MemoryPackFormatter> + { + static PriorityQueueFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered<(TElement?, TPriority?)>()) + { + MemoryPackFormatterProvider.Register(new ValueTupleFormatter()); + } + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref PriorityQueue? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter<(TElement?, TPriority?)>(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value.UnorderedItems) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref PriorityQueue? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new PriorityQueue(length); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter<(TElement?, TPriority?)>(); + for (int i = 0; i < length; i++) + { + (TElement?, TPriority?) v = default; + formatter.Deserialize(ref reader, ref v); + value.Enqueue(v.Item1, v.Item2); + } + } + } + +#endif + + [Preserve] + public sealed class CollectionFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Collection? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Collection? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new Collection(); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } + } + } + + [Preserve] + public sealed class ObservableCollectionFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ObservableCollection? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ObservableCollection? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new ObservableCollection(); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } + } + } + + [Preserve] + public sealed class ConcurrentQueueFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ConcurrentQueue? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + // note: serializing ConcurretnCollection(Queue/Stack/Bag/Dictionary) is not thread-safe. + // operate Add/Remove in iterating in other thread, not guranteed correct result + + var formatter = writer.GetFormatter(); + var count = value.Count; + writer.WriteCollectionHeader(count); + var i = 0; + foreach (var item in value) + { + i++; + var v = item; + formatter.Serialize(ref writer, ref v); + } + + if (i != count) MemoryPackSerializationException.ThrowInvalidConcurrrentCollectionOperation(); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ConcurrentQueue? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new ConcurrentQueue(); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Enqueue(v); + } + } + } + + [Preserve] + public sealed class ConcurrentStackFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ConcurrentStack? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + // reverse order in serialize + var count = value.Count; + T?[] rentArray = ArrayPool.Shared.Rent(count); + try + { + var i = 0; + foreach (var item in value) + { + rentArray[i++] = item; + } + if (i != count) MemoryPackSerializationException.ThrowInvalidConcurrrentCollectionOperation(); + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(count); + for (i = i - 1; i >= 0; i--) + { + formatter.Serialize(ref writer, ref rentArray[i]); + } + } + finally + { + ArrayPool.Shared.Return(rentArray, clearArray: RuntimeHelpers.IsReferenceOrContainsReferences()); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ConcurrentStack? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new ConcurrentStack(); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Push(v); + } + } + } + + [Preserve] + public sealed class ConcurrentBagFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ConcurrentBag? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + var count = value.Count; + writer.WriteCollectionHeader(count); + var i = 0; + foreach (var item in value) + { + i++; + var v = item; + formatter.Serialize(ref writer, ref v); + } + + if (i != count) MemoryPackSerializationException.ThrowInvalidConcurrrentCollectionOperation(); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ConcurrentBag? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new ConcurrentBag(); + } + else + { + value.Clear(); + } + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } + } + } + + [Preserve] + public sealed class DictionaryFormatter : MemoryPackFormatter> + where TKey : notnull + { + readonly IEqualityComparer? equalityComparer; + + public DictionaryFormatter() + : this(null) + { + + } + + public DictionaryFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Dictionary? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Dictionary? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new Dictionary(length, equalityComparer); + } + else + { + value.Clear(); + } + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + value.Add(k!, v); + } + } + } + + [Preserve] + public sealed class SortedDictionaryFormatter : MemoryPackFormatter> + where TKey : notnull + { + readonly IComparer? comparer; + + public SortedDictionaryFormatter() + : this(null) + { + + } + + public SortedDictionaryFormatter(IComparer? comparer) + { + this.comparer = comparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref SortedDictionary? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref SortedDictionary? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new SortedDictionary(comparer); + } + else + { + value.Clear(); + } + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + value.Add(k!, v); + } + } + } + + [Preserve] + public sealed class SortedListFormatter : MemoryPackFormatter> + where TKey : notnull + { + readonly IComparer? comparer; + + public SortedListFormatter() + : this(null) + { + + } + + public SortedListFormatter(IComparer? comparer) + { + this.comparer = comparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref SortedList? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref SortedList? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new SortedList(length, comparer); + } + else + { + value.Clear(); + } + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + value.Add(k!, v); + } + } + } + + [Preserve] + public sealed class ConcurrentDictionaryFormatter : MemoryPackFormatter> + where TKey : notnull + { + readonly IEqualityComparer? equalityComparer; + + public ConcurrentDictionaryFormatter() + : this(null) + { + + } + + public ConcurrentDictionaryFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ConcurrentDictionary? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + var count = value.Count; + writer.WriteCollectionHeader(count); + var i = 0; + foreach (var item in value) + { + i++; + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + + if (i != count) MemoryPackSerializationException.ThrowInvalidConcurrrentCollectionOperation(); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ConcurrentDictionary? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new ConcurrentDictionary(equalityComparer); + } + else + { + value.Clear(); + } + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + value.TryAdd(k!, v); + } + } + } + + [Preserve] + public sealed class ReadOnlyCollectionFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ReadOnlyCollection? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ReadOnlyCollection? value) + { + var array = reader.ReadArray(); + + if (array == null) + { + value = null; + } + else + { + value = new ReadOnlyCollection(array); + } + } + } + + [Preserve] + public sealed class ReadOnlyObservableCollectionFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ReadOnlyObservableCollection? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ReadOnlyObservableCollection? value) + { + var array = reader.ReadArray(); + + if (array == null) + { + value = null; + } + else + { + value = new ReadOnlyObservableCollection(new ObservableCollection(array)); + } + } + } + + [Preserve] + public sealed class BlockingCollectionFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref BlockingCollection? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref BlockingCollection? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + value = new BlockingCollection(); + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? v = default; + formatter.Deserialize(ref reader, ref v); + value.Add(v); + } + } + } +} diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs.meta new file mode 100644 index 0000000..2917aec --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CollectionFormatters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e648f2f021a720e45a7fda5bddd7aae9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs new file mode 100644 index 0000000..684dcbe --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Globalization; +using MemoryPack.Internal; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class CultureInfoFormatter : MemoryPackFormatter +{ + // treat as a string(Name). + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref CultureInfo? value) + { + writer.WriteString(value?.Name); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref CultureInfo? value) + { + var str = reader.ReadString(); + if (str == null) + { + value = null; + } + else + { + value = CultureInfo.GetCultureInfo(str); + } + } +} +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs.meta new file mode 100644 index 0000000..9a10651 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/CultureInfoFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 20da488211e109640859d46ab47e442d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs new file mode 100644 index 0000000..f1fab23 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack.Formatters { + +public sealed class DynamicUnionFormatter : MemoryPackFormatter + where T : class +{ + readonly Dictionary typeToTag; + readonly Dictionary tagToType; + + public DynamicUnionFormatter(params (ushort Tag, Type Type)[] memoryPackUnions) + { + typeToTag = memoryPackUnions.ToDictionary(x => x.Type, x => x.Tag); + tagToType = memoryPackUnions.ToDictionary(x => x.Tag, x => x.Type); + } + + public override void Serialize(ref MemoryPackWriter writer, ref T? value) + { + if (value == null) + { + writer.WriteNullUnionHeader(); + return; + } + + var type = value.GetType(); + if (typeToTag.TryGetValue(type, out var tag)) + { + writer.WriteUnionHeader(tag); + writer.WriteValue(type, value); + } + else + { + MemoryPackSerializationException.ThrowNotFoundInUnionType(type, typeof(T)); + } + } + + public override void Deserialize(ref MemoryPackReader reader, ref T? value) + { + if (!reader.TryReadUnionHeader(out var tag)) + { + value = default; + return; + } + + if (tagToType.TryGetValue(tag, out var type)) + { + object? v = value; + reader.ReadValue(type, ref v); + value = (T?)v; + } + else + { + MemoryPackSerializationException.ThrowInvalidTag(tag, typeof(T)); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs.meta new file mode 100644 index 0000000..b7d1040 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/DynamicUnionFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6edda14b6f541844284c998396cafa2a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs new file mode 100644 index 0000000..fa95e09 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs @@ -0,0 +1,182 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class GenericCollectionFormatter : MemoryPackFormatter + where TCollection : ICollection, new() +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref TCollection? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref TCollection? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + var formatter = reader.GetFormatter(); + + var collection = new TCollection(); + for (int i = 0; i < length; i++) + { + TElement? v = default; + formatter.Deserialize(ref reader, ref v); + collection.Add(v); + } + + value = collection; + } +} + +[Preserve] +public abstract class GenericSetFormatterBase : MemoryPackFormatter + where TSet : ISet +{ + [Preserve] + protected abstract TSet CreateSet(); + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref TSet? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref TSet? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + var formatter = reader.GetFormatter(); + + var collection = CreateSet(); + for (int i = 0; i < length; i++) + { + TElement? v = default; + formatter.Deserialize(ref reader, ref v); + collection.Add(v); + } + + value = collection; + } +} + +[Preserve] +public sealed class GenericSetFormatter : GenericSetFormatterBase + where TSet : ISet, new() +{ + protected override TSet CreateSet() + { + return new(); + } +} + +[Preserve] +public abstract class GenericDictionaryFormatterBase : MemoryPackFormatter + where TKey : notnull + where TDictionary : IDictionary +{ + [Preserve] + protected abstract TDictionary CreateDictionary(); + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref TDictionary? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref TDictionary? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + + var dict = CreateDictionary(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + dict.Add(k!, v); + } + + value = dict; + } +} + +[Preserve] +public sealed class GenericDictionaryFormatter : GenericDictionaryFormatterBase + where TKey : notnull + where TDictionary : IDictionary, new() +{ + [Preserve] + protected override TDictionary CreateDictionary() + { + return new(); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs.meta new file mode 100644 index 0000000..ad0f0fc --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/GenericCollectionFormatters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b0ee256b8ba5bf44904e20cbfd830e6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs new file mode 100644 index 0000000..284eceb --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs @@ -0,0 +1,725 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Formatters; +using MemoryPack.Internal; +using System.Buffers; +using System.Collections; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// interface collection formatters +// IEnumerable, ICollection, IReadOnlyCollection, IList, IReadOnlyList +// IDictionary, IReadOnlyDictionary, ILookup, IGrouping, ISet, IReadOnlySet + +namespace MemoryPack +{ + public static partial class MemoryPackFormatterProvider + { + static readonly Dictionary InterfaceCollectionFormatters = new(11) + { + { typeof(IEnumerable<>), typeof(InterfaceEnumerableFormatter<>) }, + { typeof(ICollection<>), typeof(InterfaceCollectionFormatter<>) }, + { typeof(IReadOnlyCollection<>), typeof(InterfaceReadOnlyCollectionFormatter<>) }, + { typeof(IList<>), typeof(InterfaceListFormatter<>) }, + { typeof(IReadOnlyList<>), typeof(InterfaceReadOnlyListFormatter<>) }, + { typeof(IDictionary<,>), typeof(InterfaceDictionaryFormatter<,>) }, + { typeof(IReadOnlyDictionary<,>), typeof(InterfaceReadOnlyDictionaryFormatter<,>) }, + { typeof(ILookup<,>), typeof(InterfaceLookupFormatter<,>) }, + { typeof(IGrouping<,>), typeof(InterfaceGroupingFormatter<,>) }, + { typeof(ISet<>), typeof(InterfaceSetFormatter<>) }, +#if NET7_0_OR_GREATER + { typeof(IReadOnlySet<>), typeof(InterfaceReadOnlySetFormatter<>) }, +#endif + }; + } +} + +namespace MemoryPack.Formatters +{ + using static InterfaceCollectionFormatterUtils; + + internal static class InterfaceCollectionFormatterUtils + { + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool TrySerializeOptimized(ref MemoryPackWriter writer, [NotNullWhen(false)] ref TCollection? value) + where TCollection : IEnumerable +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return true; + } + + // optimize for list or array + + if (value is TElement?[] array) + { + writer.WriteArray(array); + return true; + } + +#if NET7_0_OR_GREATER + if (value is List list) + { + writer.WriteSpan(CollectionsMarshal.AsSpan(list)); + return true; + } +#endif + + return false; + } + + public static void SerializeCollection(ref MemoryPackWriter writer, ref TCollection? value) + where TCollection : ICollection +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (TrySerializeOptimized(ref writer, ref value)) return; + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v!); + } + } + + public static void SerializeReadOnlyCollection(ref MemoryPackWriter writer, ref TCollection? value) + where TCollection : IReadOnlyCollection +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (TrySerializeOptimized(ref writer, ref value)) return; + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v!); + } + } + + public static List? ReadList(ref MemoryPackReader reader) + { + var formatter = reader.GetFormatter>(); + List? v = default; + formatter.Deserialize(ref reader, ref v); + return v; + } + } + + [Preserve] + public sealed class InterfaceEnumerableFormatter : MemoryPackFormatter> + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IEnumerable? value) + { + if (TrySerializeOptimized, T?>(ref writer, ref value)) return; + + if (value.TryGetNonEnumeratedCountEx(out var count)) + { + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + else + { + // write to tempbuffer(because we don't know length so can't write header) + var tempBuffer = ReusableLinkedArrayBufferWriterPool.Rent(); + try + { + var tempWriter = new MemoryPackWriter(ref Unsafe.As>(ref tempBuffer), writer.OptionalState); + + count = 0; + var formatter = writer.GetFormatter(); + foreach (var item in value) + { + count++; + var v = item; + formatter.Serialize(ref tempWriter, ref v); + } + + tempWriter.Flush(); + + // write to parameter writer. + writer.WriteCollectionHeader(count); + tempBuffer.WriteToAndReset(ref writer); + } + finally + { + ReusableLinkedArrayBufferWriterPool.Return(tempBuffer); + } + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IEnumerable? value) + { + value = reader.ReadArray(); + } + } + + [Preserve] + public sealed class InterfaceCollectionFormatter : MemoryPackFormatter> + { + static InterfaceCollectionFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new ListFormatter()); + } + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ICollection? value) + { + SerializeCollection, T?>(ref writer, ref value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ICollection? value) + { + value = ReadList(ref reader); + } + } + + [Preserve] + public sealed class InterfaceReadOnlyCollectionFormatter : MemoryPackFormatter> + { + static InterfaceReadOnlyCollectionFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new ListFormatter()); + } + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IReadOnlyCollection? value) + { + SerializeReadOnlyCollection, T?>(ref writer, ref value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IReadOnlyCollection? value) + { + value = ReadList(ref reader); + } + } + + [Preserve] + public sealed class InterfaceListFormatter : MemoryPackFormatter> + { + static InterfaceListFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new ListFormatter()); + } + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IList? value) + { + SerializeCollection, T?>(ref writer, ref value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IList? value) + { + value = ReadList(ref reader); + } + } + + [Preserve] + public sealed class InterfaceReadOnlyListFormatter : MemoryPackFormatter> + { + static InterfaceReadOnlyListFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new ListFormatter()); + } + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IReadOnlyList? value) + { + SerializeReadOnlyCollection, T?>(ref writer, ref value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IReadOnlyList? value) + { + value = ReadList(ref reader); + } + } + + [Preserve] + public sealed class InterfaceDictionaryFormatter : MemoryPackFormatter> + where TKey : notnull + { + readonly IEqualityComparer? equalityComparer; + + public InterfaceDictionaryFormatter() + : this(null) + { + + } + + public InterfaceDictionaryFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IDictionary? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IDictionary? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + var dict = new Dictionary(equalityComparer); + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + dict.Add(k!, v); + } + + value = dict; + } + } + + [Preserve] + public sealed class InterfaceReadOnlyDictionaryFormatter : MemoryPackFormatter> + where TKey : notnull + { + readonly IEqualityComparer? equalityComparer; + + public InterfaceReadOnlyDictionaryFormatter() + : this(null) + { + + } + + public InterfaceReadOnlyDictionaryFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IReadOnlyDictionary? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var keyFormatter = writer.GetFormatter(); + var valueFormatter = writer.GetFormatter(); + + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + KeyValuePairFormatter.Serialize(keyFormatter, valueFormatter, ref writer, item!); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IReadOnlyDictionary? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + var dict = new Dictionary(equalityComparer); + + var keyFormatter = reader.GetFormatter(); + var valueFormatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + KeyValuePairFormatter.Deserialize(keyFormatter, valueFormatter, ref reader, out var k, out var v); + dict.Add(k!, v); + } + + value = dict; + } + } + + [Preserve] + public sealed class InterfaceLookupFormatter : MemoryPackFormatter> + where TKey : notnull + { + static InterfaceLookupFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new InterfaceGroupingFormatter()); + } + } + + readonly IEqualityComparer? equalityComparer; + + public InterfaceLookupFormatter() + : this(null) + { + + } + + public InterfaceLookupFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ILookup? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter>(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ILookup? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + var dict = new Dictionary>(equalityComparer); + + var formatter = reader.GetFormatter>(); + for (int i = 0; i < length; i++) + { + IGrouping? item = default; + formatter.Deserialize(ref reader, ref item); + if (item != null) + { + dict.Add(item.Key, item); + } + } + value = new Lookup(dict); + } + } + + [Preserve] + public sealed class InterfaceGroupingFormatter : MemoryPackFormatter> + where TKey : notnull + { + // serialize as {key, [collection]} + + static InterfaceGroupingFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new InterfaceEnumerableFormatter()); + } + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IGrouping? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(2); + writer.WriteValue(value.Key); + writer.WriteValue>(value); // write as IEnumerable + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IGrouping? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 2) MemoryPackSerializationException.ThrowInvalidPropertyCount(2, count); + + var key = reader.ReadValue(); + var values = reader.ReadArray() as IEnumerable; + + if (key == null) MemoryPackSerializationException.ThrowDeserializeObjectIsNull(nameof(key)); + if (values == null) MemoryPackSerializationException.ThrowDeserializeObjectIsNull(nameof(values)); + + value = new Grouping(key, values); + + } + } + + [Preserve] + public sealed class InterfaceSetFormatter : MemoryPackFormatter> + { + static InterfaceSetFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new HashSetFormatter()); + } + } + + readonly IEqualityComparer? equalityComparer; + + public InterfaceSetFormatter() + : this(null) + { + } + + public InterfaceSetFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ISet? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ISet? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + var set = new HashSet(length, equalityComparer); + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? item = default; + formatter.Deserialize(ref reader, ref item); + set.Add(item); + } + + value = set; + } + } + +#if NET7_0_OR_GREATER + + [Preserve] + public sealed class InterfaceReadOnlySetFormatter : MemoryPackFormatter> + { + static InterfaceReadOnlySetFormatter() + { + if (!MemoryPackFormatterProvider.IsRegistered>()) + { + MemoryPackFormatterProvider.Register(new HashSetFormatter()); + } + } + + readonly IEqualityComparer? equalityComparer; + + public InterfaceReadOnlySetFormatter() + : this(null) + { + } + + public InterfaceReadOnlySetFormatter(IEqualityComparer? equalityComparer) + { + this.equalityComparer = equalityComparer; + } + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref IReadOnlySet? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var formatter = writer.GetFormatter(); + writer.WriteCollectionHeader(value.Count); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref IReadOnlySet? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + var set = new HashSet(length, equalityComparer); + + var formatter = reader.GetFormatter(); + for (int i = 0; i < length; i++) + { + T? item = default; + formatter.Deserialize(ref reader, ref item); + set.Add(item); + } + + value = set; + } + } + +#endif + + [Preserve] + internal sealed class Grouping : IGrouping + { + readonly TKey key; + readonly IEnumerable elements; + + public Grouping(TKey key, IEnumerable elements) + { + this.key = key; + this.elements = elements; + } + + public TKey Key + { + get + { + return this.key; + } + } + + public IEnumerator GetEnumerator() + { + return this.elements.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this.elements.GetEnumerator(); + } + } + + [Preserve] + internal sealed class Lookup : ILookup + where TKey : notnull + { + readonly Dictionary> groupings; + + public Lookup(Dictionary> groupings) + { + this.groupings = groupings; + } + + public IEnumerable this[TKey key] + { + get + { + return this.groupings[key]; + } + } + + public int Count + { + get + { + return this.groupings.Count; + } + } + + public bool Contains(TKey key) + { + return this.groupings.ContainsKey(key); + } + + public IEnumerator> GetEnumerator() + { + return this.groupings.Values.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return this.groupings.Values.GetEnumerator(); + } + } +} diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs.meta new file mode 100644 index 0000000..77b222a --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/InterfaceCollectionFormatters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 92a5c3e606f68e940a5504e80e372051 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs new file mode 100644 index 0000000..4bacaec --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs @@ -0,0 +1,92 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Formatters { + +[Preserve] +public static class KeyValuePairFormatter +{ + // for Dictionary serialization + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Serialize(IMemoryPackFormatter keyFormatter, IMemoryPackFormatter valueFormatter, ref MemoryPackWriter writer, KeyValuePair value) +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + value.Deconstruct(out var k, out var v); + keyFormatter.Serialize(ref writer, ref k); + valueFormatter.Serialize(ref writer, ref v); + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Deserialize(IMemoryPackFormatter keyFormatter, IMemoryPackFormatter valueFormatter, ref MemoryPackReader reader, out TKey? key, out TValue? value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out KeyValuePair kvp); + key = kvp.Key; + value = kvp.Value; + return; + } + + key = default; + value = default; + keyFormatter.Deserialize(ref reader, ref key); + valueFormatter.Deserialize(ref reader, ref value); + } +} + +[Preserve] +public sealed class KeyValuePairFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref KeyValuePair value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Key); + writer.WriteValue(value.Value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref KeyValuePair value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new KeyValuePair( + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs.meta new file mode 100644 index 0000000..0b72b41 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/KeyValuePairFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f407ce074ce08af448c71d52ab5ef2c4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs new file mode 100644 index 0000000..f329a67 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class LazyFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Lazy? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(1); + writer.WriteValue(value.Value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Lazy? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 1) MemoryPackSerializationException.ThrowInvalidPropertyCount(1, count); + + var v = reader.ReadValue(); + value = new Lazy(v); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs.meta new file mode 100644 index 0000000..bcdbcf9 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/LazyFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 435e06feb1c6e99469622c788eb68163 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs new file mode 100644 index 0000000..d929307 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Formatters { + +#if NET7_0_OR_GREATER + +[Preserve] +public sealed class MemoryPackableFormatter : MemoryPackFormatter + where T : IMemoryPackable +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T? value) + { + T.Serialize(ref writer, ref Unsafe.AsRef(value)); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T? value) + { + T.Deserialize(ref reader, ref value); + } +} + +#endif + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs.meta new file mode 100644 index 0000000..0f54bac --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MemoryPackableFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 86918186878d8454db7dc10ffc57057d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs new file mode 100644 index 0000000..488173a --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs @@ -0,0 +1,373 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Runtime.Serialization; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class TwoDimensionalArrayFormatter : MemoryPackFormatter +{ + // {i-length, j-length, [total-length, values]} + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T?[,]? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(3); + + var i = value.GetLength(0); + var j = value.GetLength(1); + writer.WriteUnmanaged(i, j); + +#if NET7_0_OR_GREATER + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var byteCount = Unsafe.SizeOf() * i * j; + ref var src = ref MemoryMarshal.GetArrayDataReference(value); + ref var dest = ref writer.GetSpanReference(byteCount + 4); + + Unsafe.WriteUnaligned(ref dest, value.Length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)byteCount); + writer.Advance(byteCount + 4); + } + else +#endif + { + + writer.WriteCollectionHeader(value.Length); + var formatter = writer.GetFormatter(); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T?[,]? value) + { + if (!reader.TryReadObjectHeader(out var propertyCount)) + { + value = null; + return; + } + + if (propertyCount != 3) + { + MemoryPackSerializationException.ThrowInvalidPropertyCount(3, propertyCount); + } + + reader.ReadUnmanaged(out int iLength, out int jLength); + + if (!reader.TryReadCollectionHeader(out var length)) + { + MemoryPackSerializationException.ThrowInvalidCollection(); + } + + if (value != null && value.GetLength(0) == iLength && value.GetLength(1) == jLength && value.Length == length) + { + // allow overwrite + } + else + { + value = new T[iLength, jLength]; + } + +#if NET7_0_OR_GREATER + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var byteCount = Unsafe.SizeOf() * iLength * jLength; + ref var dest = ref MemoryMarshal.GetArrayDataReference(value); + ref var src = ref reader.GetSpanReference(byteCount); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + reader.Advance(byteCount); + } + else +#endif + { + var formatter = reader.GetFormatter(); + + var i = 0; + var j = -1; + var count = 0; + while (count++ < length) + { + if (j < jLength - 1) + { + j++; + } + else + { + j = 0; + i++; + } + + formatter.Deserialize(ref reader, ref value[i, j]); + } + } + } +} + +[Preserve] +public sealed class ThreeDimensionalArrayFormatter : MemoryPackFormatter +{ + // {i-length, j-length, k-length, [total-length, values]} + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T?[,,]? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(4); + + var i = value.GetLength(0); + var j = value.GetLength(1); + var k = value.GetLength(2); + writer.WriteUnmanaged(i, j, k); + +#if NET7_0_OR_GREATER + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var byteCount = Unsafe.SizeOf() * i * j * k; + ref var src = ref MemoryMarshal.GetArrayDataReference(value); + ref var dest = ref writer.GetSpanReference(byteCount + 4); + + Unsafe.WriteUnaligned(ref dest, value.Length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)byteCount); + writer.Advance(byteCount + 4); + } + else +#endif + { + writer.WriteCollectionHeader(value.Length); + var formatter = writer.GetFormatter(); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T?[,,]? value) + { + if (!reader.TryReadObjectHeader(out var propertyCount)) + { + value = null; + return; + } + + if (propertyCount != 4) + { + MemoryPackSerializationException.ThrowInvalidPropertyCount(4, propertyCount); + } + + reader.ReadUnmanaged(out int iLength, out int jLength, out int kLength); + + if (!reader.TryReadCollectionHeader(out var length)) + { + MemoryPackSerializationException.ThrowInvalidCollection(); + } + + if (value != null && value.GetLength(0) == iLength && value.GetLength(1) == jLength && value.GetLength(2) == kLength && value.Length == length) + { + // allow overwrite + } + else + { + value = new T[iLength, jLength, kLength]; + } + +#if NET7_0_OR_GREATER + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var byteCount = Unsafe.SizeOf() * iLength * jLength * kLength; + ref var dest = ref MemoryMarshal.GetArrayDataReference(value); + ref var src = ref reader.GetSpanReference(byteCount); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + reader.Advance(byteCount); + } + else +#endif + { + var formatter = reader.GetFormatter(); + + var i = 0; + var j = 0; + var k = -1; + var count = 0; + while (count++ < length) + { + if (k < kLength - 1) + { + k++; + } + else if (j < jLength - 1) + { + k = 0; + j++; + } + else + { + k = 0; + j = 0; + i++; + } + + formatter.Deserialize(ref reader, ref value[i, j, k]); + } + } + } +} + +[Preserve] +public sealed class FourDimensionalArrayFormatter : MemoryPackFormatter +{ + // {i-length, j-length, k-length, l-length, [total-length, values]} + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T?[,,,]? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(5); + + var i = value.GetLength(0); + var j = value.GetLength(1); + var k = value.GetLength(2); + var l = value.GetLength(3); + writer.WriteUnmanaged(i, j, k, l); + +#if NET7_0_OR_GREATER + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var byteCount = Unsafe.SizeOf() * i * j * k * l; + ref var src = ref MemoryMarshal.GetArrayDataReference(value); + ref var dest = ref writer.GetSpanReference(byteCount + 4); + + Unsafe.WriteUnaligned(ref dest, value.Length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)byteCount); + writer.Advance(byteCount + 4); + } + else +#endif + { + writer.WriteCollectionHeader(value.Length); + var formatter = writer.GetFormatter(); + foreach (var item in value) + { + var v = item; + formatter.Serialize(ref writer, ref v); + } + } + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T?[,,,]? value) + { + if (!reader.TryReadObjectHeader(out var propertyCount)) + { + value = null; + return; + } + + if (propertyCount != 5) + { + MemoryPackSerializationException.ThrowInvalidPropertyCount(5, propertyCount); + } + + reader.ReadUnmanaged(out int iLength, out int jLength, out int kLength, out int lLength); + + if (!reader.TryReadCollectionHeader(out var length)) + { + MemoryPackSerializationException.ThrowInvalidCollection(); + } + + if (value != null && value.GetLength(0) == iLength && value.GetLength(1) == jLength && value.GetLength(2) == kLength && value.GetLength(3) == lLength && value.Length == length) + { + // allow overwrite + } + else + { + value = new T[iLength, jLength, kLength, lLength]; + } + +#if NET7_0_OR_GREATER + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var byteCount = Unsafe.SizeOf() * iLength * jLength * kLength * lLength; + ref var dest = ref MemoryMarshal.GetArrayDataReference(value); + ref var src = ref reader.GetSpanReference(byteCount); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + reader.Advance(byteCount); + } + else +#endif + { + var formatter = reader.GetFormatter(); + + var i = 0; + var j = 0; + var k = 0; + var l = -1; + var count = 0; + while (count++ < length) + { + if (l < lLength - 1) + { + l++; + } + else if (k < kLength - 1) + { + l = 0; + k++; + } + else if (j < jLength - 1) + { + l = 0; + k = 0; + j++; + } + else + { + l = 0; + k = 0; + j = 0; + i++; + } + + formatter.Deserialize(ref reader, ref value[i, j, k, l]); + } + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs.meta new file mode 100644 index 0000000..ef83c6c --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/MultiDimensionalArrayFormatters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 31ec28888c1521f45a5e0eb1ca226149 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs new file mode 100644 index 0000000..3ce657f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class NullableFormatter : MemoryPackFormatter + where T : struct +{ + // Nullable is sometimes serialized on UnmanagedFormatter. + // to keep same result, check if type is unmanaged. + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T? value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + if (!value.HasValue) + { + writer.WriteNullObjectHeader(); + return; + } + else + { + writer.WriteObjectHeader(1); + } + + writer.WriteValue(value.Value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T? value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 1) MemoryPackSerializationException.ThrowInvalidPropertyCount(1, count); + + value = reader.ReadValue(); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs.meta new file mode 100644 index 0000000..e2362a0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/NullableFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5cbe20000eeecfe429b3f80fca2ba176 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs new file mode 100644 index 0000000..9368ea9 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class StringBuilderFormatter : MemoryPackFormatter +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref StringBuilder? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + +#if NET7_0_OR_GREATER + + // for performance reason, currently StringBuilder encode as Utf16, however try to write Utf8? + // if (writer.Options.StringEncoding == StringEncoding.Utf16) + { + writer.WriteCollectionHeader(value.Length); + + foreach (var chunk in value.GetChunks()) + { + ref var p = ref writer.GetSpanReference(checked(chunk.Length * 2)); + ref var src = ref Unsafe.As(ref MemoryMarshal.GetReference(chunk.Span)); + Unsafe.CopyBlockUnaligned(ref p, ref src, (uint)chunk.Length * 2); + + writer.Advance(chunk.Length * 2); + } + return; + } + +#else + // write as utf16 + writer.WriteUtf16(value.ToString()); +#endif + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref StringBuilder? value) + { + if (!reader.TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (value == null) + { + value = new StringBuilder(length); + } + else + { + value.Clear(); + value.EnsureCapacity(length); + } + + // note: require to check is Utf8 + // note: to improvement append as chunk(per 64K?) + var size = checked(length * 2); + ref var p = ref reader.GetSpanReference(size); + var src = MemoryMarshal.CreateSpan(ref Unsafe.As(ref p), length); + value.Append(src); + + reader.Advance(size); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs.meta new file mode 100644 index 0000000..f364294 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringBuilderFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 78f865f986bf7a844bcb6d3474b401a6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs new file mode 100644 index 0000000..cae15c6 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs @@ -0,0 +1,279 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Compression; +using MemoryPack.Internal; +using System.Buffers; +using System.IO.Compression; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class StringFormatter : MemoryPackFormatter +{ + public static readonly StringFormatter Default = new StringFormatter(); + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref string? value) + { + writer.WriteString(value); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref string? value) + { + value = reader.ReadString(); + } +} + +[Preserve] +public sealed class Utf8StringFormatter : MemoryPackFormatter +{ + public static readonly Utf8StringFormatter Default = new Utf8StringFormatter(); + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Serialize(ref MemoryPackWriter writer, ref string? value) + { + writer.WriteUtf8(value); + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Deserialize(ref MemoryPackReader reader, ref string? value) + { + value = reader.ReadString(); + } +} + +[Preserve] +public sealed class Utf16StringFormatter : MemoryPackFormatter +{ + public static readonly Utf16StringFormatter Default = new Utf16StringFormatter(); + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Serialize(ref MemoryPackWriter writer, ref string? value) + { + writer.WriteUtf16(value); + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Deserialize(ref MemoryPackReader reader, ref string? value) + { + value = reader.ReadString(); + } +} + +[Preserve] +public sealed class InternStringFormatter : MemoryPackFormatter +{ + public static readonly InternStringFormatter Default = new InternStringFormatter(); + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Serialize(ref MemoryPackWriter writer, ref string? value) + { + writer.WriteString(value); + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Deserialize(ref MemoryPackReader reader, ref string? value) + { + var str = reader.ReadString(); + if (str == null) + { + value = null; + return; + } + + value = string.Intern(str); + } +} + +[Preserve] +public sealed class BrotliStringFormatter : MemoryPackFormatter +{ + [ThreadStatic] + static StrongBox? threadStaticConsumedBox; + + internal const int DefaultDecompssionSizeLimit = 1024 * 1024 * 128; // 128MB + + public static readonly BrotliStringFormatter Default = new BrotliStringFormatter(); + + readonly System.IO.Compression.CompressionLevel compressionLevel; + readonly int window; + readonly int decompressionSizeLimit; + + public BrotliStringFormatter() + : this(System.IO.Compression.CompressionLevel.Fastest) + { + + } + + public BrotliStringFormatter(System.IO.Compression.CompressionLevel compressionLevel) + : this(compressionLevel, BrotliUtils.WindowBits_Default) + { + this.compressionLevel = compressionLevel; + } + + public BrotliStringFormatter(System.IO.Compression.CompressionLevel compressionLevel, int window) + : this(compressionLevel, window, DefaultDecompssionSizeLimit) + { + } + + public BrotliStringFormatter(System.IO.Compression.CompressionLevel compressionLevel, int window, int decompressionSizeLimit) + { + this.compressionLevel = compressionLevel; + this.window = window; + this.decompressionSizeLimit = decompressionSizeLimit; + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Serialize(ref MemoryPackWriter writer, ref string? value) + { + if (value == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + if (value.Length == 0) + { + writer.WriteCollectionHeader(0); + return; + } + + var quality = BrotliUtils.GetQualityFromCompressionLevel(compressionLevel); + using var encoder = new BrotliEncoder(quality, window); + + var srcLength = value.Length * 2; + var maxLength = BrotliUtils.BrotliEncoderMaxCompressedSize(srcLength); + + ref var spanRef = ref writer.GetSpanReference(maxLength + 4); + var dest = MemoryMarshal.CreateSpan(ref Unsafe.Add(ref spanRef, 4), maxLength); + + var status = encoder.Compress(MemoryMarshal.AsBytes(value.AsSpan()), dest, out var bytesConsumed, out var bytesWritten, isFinalBlock: true); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + + if (bytesConsumed != srcLength) + { + MemoryPackSerializationException.ThrowCompressionFailed(); + } + + Unsafe.WriteUnaligned(ref spanRef, value.Length); + writer.Advance(bytesWritten + 4); + } + + [Preserve] + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override void Deserialize(ref MemoryPackReader reader, ref string? value) + { + if (!reader.DangerousTryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = ""; + return; + } + + var byteLength = length * 2; + + // security, require to check length + if (decompressionSizeLimit < byteLength) + { + MemoryPackSerializationException.ThrowDecompressionSizeLimitExceeded(decompressionSizeLimit, byteLength); + } + + reader.GetRemainingSource(out var singleSource, out var remainingSource); + + var consumedBox = threadStaticConsumedBox; + if (consumedBox == null) + { + consumedBox = threadStaticConsumedBox = new StrongBox(); + } + else + { + consumedBox.Value = 0; + } + + if (singleSource.Length != 0) + { + unsafe + { + fixed (byte* p = singleSource) + { + value = string.Create(length, ((IntPtr)p, singleSource.Length, byteLength, consumedBox), static (stringSpan, state) => + { + var src = MemoryMarshal.CreateSpan(ref Unsafe.AsRef((byte*)state.Item1), state.Item2); + var destination = MemoryMarshal.AsBytes(stringSpan); + + using var decoder = new BrotliDecoder(); + var status = decoder.Decompress(src, destination, out var bytesConsumed, out var bytesWritten); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + if (bytesWritten != state.byteLength) + { + MemoryPackSerializationException.ThrowCompressionFailed(); + } + + state.consumedBox.Value = bytesConsumed; + }); + reader.Advance(consumedBox.Value); + } + } + } + else + { + value = string.Create(length, (remainingSource, remainingSource.Length, byteLength, consumedBox), static (stringSpan, state) => + { + var destination = MemoryMarshal.AsBytes(stringSpan); + + using var decoder = new BrotliDecoder(); + + var consumed = 0; + OperationStatus status = OperationStatus.DestinationTooSmall; + foreach (var item in state.remainingSource) + { + status = decoder.Decompress(item.Span, destination, out var bytesConsumed, out var bytesWritten); + consumed += bytesConsumed; + + destination = destination.Slice(bytesWritten); + if (status == OperationStatus.Done) + { + break; + } + } + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowCompressionFailed(status); + } + + state.consumedBox.Value = consumed; + }); + reader.Advance(consumedBox.Value); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs.meta new file mode 100644 index 0000000..69b1196 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/StringFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 07af9b01eb2a94d439eba905a7b72deb +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs new file mode 100644 index 0000000..8538d10 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class TimeZoneInfoFormatter : MemoryPackFormatter +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref TimeZoneInfo? value) + { + writer.WriteString(value?.ToSerializedString()); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref TimeZoneInfo? value) + { + var source = reader.ReadString(); + if (source == null) + { + value = null; + return; + } + + value = TimeZoneInfo.FromSerializedString(source); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs.meta new file mode 100644 index 0000000..3ab0233 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TimeZoneInfoFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2ec2daec89486cc439549ac3139a872a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs new file mode 100644 index 0000000..3834c2a --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs @@ -0,0 +1,657 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; + +namespace MemoryPack.Formatters { + +internal static class TupleFormatterTypes +{ + public static readonly Dictionary TupleFormatters = new Dictionary(16) + { + { typeof(Tuple<>), typeof(TupleFormatter<>) }, + { typeof(ValueTuple<>), typeof(ValueTupleFormatter<>) }, + { typeof(Tuple<,>), typeof(TupleFormatter<,>) }, + { typeof(ValueTuple<,>), typeof(ValueTupleFormatter<,>) }, + { typeof(Tuple<,,>), typeof(TupleFormatter<,,>) }, + { typeof(ValueTuple<,,>), typeof(ValueTupleFormatter<,,>) }, + { typeof(Tuple<,,,>), typeof(TupleFormatter<,,,>) }, + { typeof(ValueTuple<,,,>), typeof(ValueTupleFormatter<,,,>) }, + { typeof(Tuple<,,,,>), typeof(TupleFormatter<,,,,>) }, + { typeof(ValueTuple<,,,,>), typeof(ValueTupleFormatter<,,,,>) }, + { typeof(Tuple<,,,,,>), typeof(TupleFormatter<,,,,,>) }, + { typeof(ValueTuple<,,,,,>), typeof(ValueTupleFormatter<,,,,,>) }, + { typeof(Tuple<,,,,,,>), typeof(TupleFormatter<,,,,,,>) }, + { typeof(ValueTuple<,,,,,,>), typeof(ValueTupleFormatter<,,,,,,>) }, + { typeof(Tuple<,,,,,,,>), typeof(TupleFormatter<,,,,,,,>) }, + { typeof(ValueTuple<,,,,,,,>), typeof(ValueTupleFormatter<,,,,,,,>) }, + }; +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(1); + writer.WriteValue(value.Item1); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 1) MemoryPackSerializationException.ThrowInvalidPropertyCount(1, count); + + value = new Tuple( + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(2); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 2) MemoryPackSerializationException.ThrowInvalidPropertyCount(2, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(3); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 3) MemoryPackSerializationException.ThrowInvalidPropertyCount(3, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(4); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 4) MemoryPackSerializationException.ThrowInvalidPropertyCount(4, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(5); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 5) MemoryPackSerializationException.ThrowInvalidPropertyCount(5, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(6); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + writer.WriteValue(value.Item6); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 6) MemoryPackSerializationException.ThrowInvalidPropertyCount(6, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(7); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + writer.WriteValue(value.Item6); + writer.WriteValue(value.Item7); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 7) MemoryPackSerializationException.ThrowInvalidPropertyCount(7, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class TupleFormatter : MemoryPackFormatter> + where TRest : notnull +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Tuple? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(8); + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + writer.WriteValue(value.Item6); + writer.WriteValue(value.Item7); + writer.WriteValue(value.Rest); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Tuple? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 8) MemoryPackSerializationException.ThrowInvalidPropertyCount(8, count); + + value = new Tuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue()! + ); + } +} + + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + writer.WriteValue(value.Item6); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + writer.WriteValue(value.Item6); + writer.WriteValue(value.Item7); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue() + ); + } +} + +[Preserve] +public sealed class ValueTupleFormatter : MemoryPackFormatter> + where TRest : struct +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + writer.DangerousWriteUnmanaged(value); + return; + } + + writer.WriteValue(value.Item1); + writer.WriteValue(value.Item2); + writer.WriteValue(value.Item3); + writer.WriteValue(value.Item4); + writer.WriteValue(value.Item5); + writer.WriteValue(value.Item6); + writer.WriteValue(value.Item7); + writer.WriteValue(value.Rest); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref ValueTuple value) + { + if (!System.Runtime.CompilerServices.RuntimeHelpers.IsReferenceOrContainsReferences>()) + { + reader.DangerousReadUnmanaged(out value); + return; + } + + value = new ValueTuple( + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue(), + reader.ReadValue()! + ); + } +} + + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs.meta new file mode 100644 index 0000000..bc6b642 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TupleFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 82746260603df5a45a8369e256a78e75 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs new file mode 100644 index 0000000..f5df976 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Text.RegularExpressions; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed partial class TypeFormatter : MemoryPackFormatter +{ + // Remove Version, Culture, PublicKeyToken from AssemblyQualifiedName. + // Result will be "TypeName, Assembly" + // see:http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx + +#if NET7_0_OR_GREATER + + [GeneratedRegex(@", Version=\d+.\d+.\d+.\d+, Culture=[\w-]+, PublicKeyToken=(?:null|[a-f0-9]{16})")] + private static partial Regex ShortTypeNameRegex(); + +#else + + static readonly Regex _shortTypeNameRegex = new Regex(@", Version=\d+.\d+.\d+.\d+, Culture=[\w-]+, PublicKeyToken=(?:null|[a-f0-9]{16})", RegexOptions.Compiled); + static Regex ShortTypeNameRegex() => _shortTypeNameRegex; + +#endif + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Type? value) + { + var full = value?.AssemblyQualifiedName; + if (full == null) + { + writer.WriteNullCollectionHeader(); + return; + } + + var shortName = ShortTypeNameRegex().Replace(full, ""); + writer.WriteString(shortName); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Type? value) + { + var typeName = reader.ReadString(); + if (typeName == null) + { + value = null; + return; + } + + value = Type.GetType(typeName, throwOnError: true); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs.meta new file mode 100644 index 0000000..8b0ab0f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/TypeFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1f7f7bddb1670c4ea52c7efc399000a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs new file mode 100644 index 0000000..a471c0b --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Formatters { + +// for unamanged types( https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/builtin-types/unmanaged-types ) +// * sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, or bool +// * Any enum type +// * Any pointer type +// * Any user-defined struct type that contains fields of unmanaged types only +[Preserve] +public sealed class UnmanagedFormatter : MemoryPackFormatter +where T : unmanaged +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T value) + { + Unsafe.WriteUnaligned(ref writer.GetSpanReference(Unsafe.SizeOf()), value); + writer.Advance(Unsafe.SizeOf()); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T value) + { + value = Unsafe.ReadUnaligned(ref reader.GetSpanReference(Unsafe.SizeOf())); + reader.Advance(Unsafe.SizeOf()); + } +} + +[Preserve] +public sealed class DangerousUnmanagedFormatter : MemoryPackFormatter +{ + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref T? value) + { + Unsafe.WriteUnaligned(ref writer.GetSpanReference(Unsafe.SizeOf()), value); + writer.Advance(Unsafe.SizeOf()); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref T? value) + { + value = Unsafe.ReadUnaligned(ref reader.GetSpanReference(Unsafe.SizeOf())); + reader.Advance(Unsafe.SizeOf()); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs.meta new file mode 100644 index 0000000..1ec7077 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UnmanagedFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 87c49cf15480faa4aa13b0027ba10b2b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs new file mode 100644 index 0000000..a0c6bcb --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs @@ -0,0 +1,41 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class UriFormatter : MemoryPackFormatter +{ + // treat as a string(OriginalString). + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Uri? value) + { + writer.WriteString(value?.OriginalString); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Uri? value) + { + var str = reader.ReadString(); + if (str == null) + { + value = null; + } + else + { + value = new Uri(str, UriKind.RelativeOrAbsolute); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs.meta new file mode 100644 index 0000000..634652f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/UriFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 815be7f2c6d469548b382f4531c8d4d4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs new file mode 100644 index 0000000..c65d4c0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; + +namespace MemoryPack.Formatters { + +[Preserve] +public sealed class VersionFormatter : MemoryPackFormatter +{ + // Serialize as [Major, Minor, Build, Revision] + + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Version? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteUnmanagedWithObjectHeader(4, value.Major, value.Minor, value.Build, value.Revision); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Version? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 4) MemoryPackSerializationException.ThrowInvalidPropertyCount(4, count); + + reader.ReadUnmanaged(out int major, out int minor, out int build, out int revision); + + // when use new Version(major, minor), build and revision will be -1, it can not use constructor. + if (revision == -1) + { + if (build == -1) + { + value = new Version(major, minor); + } + else + { + value = new Version(major, minor, build); + } + } + else + { + value = new Version(major, minor, build, revision); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs.meta new file mode 100644 index 0000000..692b7d7 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Formatters/VersionFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 65775f54fba192b47a6014ccdccf27ed +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs new file mode 100644 index 0000000..b3cebea --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; + +namespace MemoryPack { + +[Preserve] +public interface IMemoryPackFormatter +{ + [Preserve] + void Serialize(ref MemoryPackWriter writer, ref object? value) +#if NET7_0_OR_GREATER + ; +#else + ; +#endif + [Preserve] + void Deserialize(ref MemoryPackReader reader, ref object? value); +} + +[Preserve] +public interface IMemoryPackFormatter +{ + [Preserve] + void Serialize(ref MemoryPackWriter writer, ref T? value) +#if NET7_0_OR_GREATER + ; +#else + ; +#endif + [Preserve] + void Deserialize(ref MemoryPackReader reader, ref T? value); +} + +[Preserve] +public abstract class MemoryPackFormatter : IMemoryPackFormatter, IMemoryPackFormatter +{ + [Preserve] + public abstract void Serialize(ref MemoryPackWriter writer, ref T? value) +#if NET7_0_OR_GREATER + ; +#else + ; +#endif + [Preserve] + public abstract void Deserialize(ref MemoryPackReader reader, ref T? value); + + [Preserve] + void IMemoryPackFormatter.Serialize(ref MemoryPackWriter writer, ref object? value) + { + var v = (value == null) + ? default(T?) + : (T?)value; + Serialize(ref writer, ref v); + } + + [Preserve] + void IMemoryPackFormatter.Deserialize(ref MemoryPackReader reader, ref object? value) + { + var v = (value == null) + ? default(T?) + : (T?)value; + Deserialize(ref reader, ref v); + value = v; + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs.meta new file mode 100644 index 0000000..a54d98f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackFormatter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b17111635233244459e4c2668df6e763 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs new file mode 100644 index 0000000..e249891 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs @@ -0,0 +1,42 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; + +namespace MemoryPack { + +#if NET7_0_OR_GREATER + +public interface IFixedSizeMemoryPackable +{ + static abstract int Size { get; } +} + +#endif + +public interface IMemoryPackFormatterRegister +{ +#if NET7_0_OR_GREATER + static abstract void RegisterFormatter(); +#endif +} + +public interface IMemoryPackable : IMemoryPackFormatterRegister +{ + // note: serialize parameter should be `ref readonly` but current lang spec can not. + // see proposal https://github.com/dotnet/csharplang/issues/6010 + +#if NET7_0_OR_GREATER + static abstract void Serialize(ref MemoryPackWriter writer, ref T? value) + ; + static abstract void Deserialize(ref MemoryPackReader reader, ref T? value); +#endif +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs.meta new file mode 100644 index 0000000..deec564 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/IMemoryPackable.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 53c6fb0170766704aa3ec4b1aedf050d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal.meta new file mode 100644 index 0000000..267b8b0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a63b83acc2fae3b4f95fcba25c14086a +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs new file mode 100644 index 0000000..c2f3346 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack.Internal { + +internal static class EnumerableExtensions +{ + public static bool TryGetNonEnumeratedCountEx(this IEnumerable value, out int count) + { + // TryGetNonEnumeratedCount is not check IReadOnlyCollection so add check manually. + // https://github.com/dotnet/runtime/issues/54764 + +#if NET7_0_OR_GREATER + if (value.TryGetNonEnumeratedCount(out count)) + { + return true; + } +#else + count = 0; + if (value is ICollection collection) + { + count = collection.Count; + return true; + } +#endif + + if (value is IReadOnlyCollection readOnlyCollection) + { + count = readOnlyCollection.Count; + return true; + } + + return false; + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs.meta new file mode 100644 index 0000000..e514c18 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/EnumerableExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b7de601a63709940b09c18eb34cf772 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs new file mode 100644 index 0000000..95d3e86 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs @@ -0,0 +1,69 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Runtime.CompilerServices; + +namespace MemoryPack.Internal { + +internal struct FixedArrayBufferWriter : IBufferWriter +{ + byte[] buffer; + int written; + + public FixedArrayBufferWriter(byte[] buffer) + { + this.buffer = buffer; + this.written = 0; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Advance(int count) + { + this.written += count; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Memory GetMemory(int sizeHint = 0) + { + var memory = buffer.AsMemory(written); + if (memory.Length >= sizeHint) + { + return memory; + } + + MemoryPackSerializationException.ThrowMessage("Requested invalid sizeHint."); + return memory; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public Span GetSpan(int sizeHint = 0) + { + var span = buffer.AsSpan(written); + if (span.Length >= sizeHint) + { + return span; + } + + MemoryPackSerializationException.ThrowMessage("Requested invalid sizeHint."); + return span; + } + + public byte[] GetFilledBuffer() + { + if (written != buffer.Length) + { + MemoryPackSerializationException.ThrowMessage("Not filled buffer."); + } + + return buffer; + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs.meta new file mode 100644 index 0000000..5f0e2e0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/FixedArrayBufferWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 61f475a704e250d4ab0dd882130e9fdd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs new file mode 100644 index 0000000..6593417 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Runtime.CompilerServices; + +namespace MemoryPack.Internal { + +internal static class MathEx +{ + const int ArrayMexLength = 0x7FFFFFC7; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int NewArrayCapacity(int size) + { + var newSize = unchecked(size * 2); + if ((uint)newSize > ArrayMexLength) + { + newSize = ArrayMexLength; + } + return newSize; + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs.meta new file mode 100644 index 0000000..c928f0d --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MathEx.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 927c0eadb944275499836693dc80f88b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs new file mode 100644 index 0000000..91c24ae --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +#if !NET7_0_OR_GREATER + +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack.Internal { + +internal static class MemoryMarshalEx +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref T GetArrayDataReference(T[] array) + { + return ref MemoryMarshal.GetReference(array.AsSpan()); + } + + // GC + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static T[] AllocateUninitializedArray(int length, bool pinned = false) + { + return new T[length]; + } +} + +#endif + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs.meta new file mode 100644 index 0000000..da0f3e2 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/MemoryMarshalEx.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2909cb9ffb605ae47b659f8140c62ca9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs new file mode 100644 index 0000000..49d779e --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack.Internal { + +// Preserve for Unity IL2CPP(internal but used for code generator) + +public sealed class PreserveAttribute : System.Attribute +{ +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs.meta new file mode 100644 index 0000000..3dd47e0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/PreserveAttribute.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d985418ff3c30b2429f7cdc878e0ddf9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs new file mode 100644 index 0000000..85427c1 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs @@ -0,0 +1,395 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Collections; +using System.Collections.Concurrent; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack.Internal { + +#if NET7_0_OR_GREATER +using static GC; +using static MemoryMarshal; +#else +using static MemoryPack.Internal.MemoryMarshalEx; +#endif + +// internal but used by generator code + +public static class ReusableLinkedArrayBufferWriterPool +{ + static readonly ConcurrentQueue queue = new ConcurrentQueue(); + + public static ReusableLinkedArrayBufferWriter Rent() + { + if (queue.TryDequeue(out var writer)) + { + return writer; + } + return new ReusableLinkedArrayBufferWriter(useFirstBuffer: false, pinned: false); // does not cache firstBuffer + } + + public static void Return(ReusableLinkedArrayBufferWriter writer) + { + writer.Reset(); + queue.Enqueue(writer); + } +} + +// This class has large buffer so should cache [ThreadStatic] or Pool. +public sealed class ReusableLinkedArrayBufferWriter : IBufferWriter +{ + const int InitialBufferSize = 262144; // 256K(32768, 65536, 131072, 262144) + static readonly byte[] noUseFirstBufferSentinel = new byte[0]; + + List buffers; // add freezed buffer. + + byte[] firstBuffer; // cache firstBuffer to avoid call ArrayPoo.Rent/Return + int firstBufferWritten; + + BufferSegment current; + int nextBufferSize; + + int totalWritten; + + public int TotalWritten => totalWritten; + bool UseFirstBuffer => firstBuffer != noUseFirstBufferSentinel; + + public ReusableLinkedArrayBufferWriter(bool useFirstBuffer, bool pinned) + { + this.buffers = new List(); + this.firstBuffer = useFirstBuffer + ? AllocateUninitializedArray(InitialBufferSize, pinned) + : noUseFirstBufferSentinel; + this.firstBufferWritten = 0; + this.current = default; + this.nextBufferSize = InitialBufferSize; + this.totalWritten = 0; + } + + public byte[] DangerousGetFirstBuffer() => firstBuffer; + + public Memory GetMemory(int sizeHint = 0) + { + // MemoryPack don't use GetMemory. + throw new NotSupportedException(); + } + + public Span GetSpan(int sizeHint = 0) + { + if (current.IsNull) + { + // use firstBuffer + var free = firstBuffer.Length - firstBufferWritten; + if (free != 0 && sizeHint <= free) + { + return firstBuffer.AsSpan(firstBufferWritten); + } + } + else + { + var buffer = current.FreeBuffer; + if (buffer.Length > sizeHint) + { + return buffer; + } + } + + BufferSegment next; + if (sizeHint <= nextBufferSize) + { + next = new BufferSegment(nextBufferSize); + nextBufferSize = MathEx.NewArrayCapacity(nextBufferSize); + } + else + { + next = new BufferSegment(sizeHint); + } + + if (current.WrittenCount != 0) + { + buffers.Add(current); + } + current = next; + return next.FreeBuffer; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Advance(int count) + { + if (current.IsNull) + { + firstBufferWritten += count; + } + else + { + current.Advance(count); + } + totalWritten += count; + } + + public byte[] ToArrayAndReset() + { + if (totalWritten == 0) return Array.Empty(); + + var result = AllocateUninitializedArray(totalWritten); + var dest = result.AsSpan(); + + if (UseFirstBuffer) + { + firstBuffer.AsSpan(0, firstBufferWritten).CopyTo(dest); + dest = dest.Slice(firstBufferWritten); + } + + if (buffers.Count > 0) + { +#if NET7_0_OR_GREATER + foreach (ref var item in CollectionsMarshal.AsSpan(buffers)) +#else + foreach (var item in buffers) +#endif + { + item.WrittenBuffer.CopyTo(dest); + dest = dest.Slice(item.WrittenCount); + item.Clear(); // reset buffer-segment in this loop to avoid iterate twice for Reset + } + } + + if (!current.IsNull) + { + current.WrittenBuffer.CopyTo(dest); + current.Clear(); + } + + ResetCore(); + return result; + } + + public void WriteToAndReset(ref MemoryPackWriter writer) +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (totalWritten == 0) return; + + if (UseFirstBuffer) + { + ref var spanRef = ref writer.GetSpanReference(firstBufferWritten); + firstBuffer.AsSpan(0, firstBufferWritten).CopyTo(MemoryMarshal.CreateSpan(ref spanRef, firstBufferWritten)); + writer.Advance(firstBufferWritten); + } + + if (buffers.Count > 0) + { +#if NET7_0_OR_GREATER + foreach (ref var item in CollectionsMarshal.AsSpan(buffers)) +#else + foreach (var item in buffers) +#endif + { + ref var spanRef = ref writer.GetSpanReference(item.WrittenCount); + item.WrittenBuffer.CopyTo(MemoryMarshal.CreateSpan(ref spanRef, item.WrittenCount)); + writer.Advance(item.WrittenCount); + item.Clear(); // reset + } + } + + if (!current.IsNull) + { + ref var spanRef = ref writer.GetSpanReference(current.WrittenCount); + current.WrittenBuffer.CopyTo(MemoryMarshal.CreateSpan(ref spanRef, current.WrittenCount)); + writer.Advance(current.WrittenCount); + current.Clear(); + } + + ResetCore(); + } + + public async ValueTask WriteToAndResetAsync(Stream stream, CancellationToken cancellationToken) + { + if (totalWritten == 0) return; + + if (UseFirstBuffer) + { + await stream.WriteAsync(firstBuffer.AsMemory(0, firstBufferWritten), cancellationToken).ConfigureAwait(false); + } + + if (buffers.Count > 0) + { + foreach (var item in buffers) + { + await stream.WriteAsync(item.WrittenMemory, cancellationToken).ConfigureAwait(false); + item.Clear(); // reset + } + } + + if (!current.IsNull) + { + await stream.WriteAsync(current.WrittenMemory, cancellationToken).ConfigureAwait(false); + current.Clear(); + } + + ResetCore(); + } + + public Enumerator GetEnumerator() + { + return new Enumerator(this); + } + + // reset without list's BufferSegment element + [MethodImpl(MethodImplOptions.AggressiveInlining)] + void ResetCore() + { + firstBufferWritten = 0; + buffers.Clear(); + totalWritten = 0; + current = default; + nextBufferSize = InitialBufferSize; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Reset() + { + if (totalWritten == 0) return; +#if NET7_0_OR_GREATER + foreach (ref var item in CollectionsMarshal.AsSpan(buffers)) +#else + foreach (var item in buffers) +#endif + { + item.Clear(); + } + current.Clear(); + ResetCore(); + } + + public struct Enumerator : IEnumerator> + { + ReusableLinkedArrayBufferWriter parent; + State state; + Memory current; + List.Enumerator buffersEnumerator; + + public Enumerator(ReusableLinkedArrayBufferWriter parent) + { + this.parent = parent; + this.state = default; + this.current = default; + this.buffersEnumerator = default; + } + + public Memory Current => current; + + object IEnumerator.Current => throw new NotSupportedException(); + + public void Dispose() + { + } + + public bool MoveNext() + { + if (state == State.FirstBuffer) + { + state = State.BuffersInit; + + if (parent.UseFirstBuffer) + { + current = parent.firstBuffer.AsMemory(0, parent.firstBufferWritten); + return true; + } + } + + if (state == State.BuffersInit) + { + state = State.BuffersIterate; + + buffersEnumerator = parent.buffers.GetEnumerator(); + } + + if (state == State.BuffersIterate) + { + if (buffersEnumerator.MoveNext()) + { + current = buffersEnumerator.Current.WrittenMemory; + return true; + } + + buffersEnumerator.Dispose(); + state = State.Current; + } + + if (state == State.Current) + { + state = State.End; + + current = parent.current.WrittenMemory; + return true; + } + + return false; + } + + public void Reset() + { + throw new NotSupportedException(); + } + + enum State + { + FirstBuffer, + BuffersInit, + BuffersIterate, + Current, + End + } + } +} + +internal struct BufferSegment +{ + byte[] buffer; + int written; + + public bool IsNull => buffer == null; + + public int WrittenCount => written; + public Span WrittenBuffer => buffer.AsSpan(0, written); + public Memory WrittenMemory => buffer.AsMemory(0, written); + public Span FreeBuffer => buffer.AsSpan(written); + + public BufferSegment(int size) + { + buffer = ArrayPool.Shared.Rent(size); + written = 0; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Advance(int count) + { + written += count; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Clear() + { + if (buffer != null) + { + ArrayPool.Shared.Return(buffer); + } + buffer = null!; + written = 0; + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs.meta new file mode 100644 index 0000000..ffd7feb --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableLinkedArrayBufferWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 42122ccd6d229c5478197bd7fbce99d0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs new file mode 100644 index 0000000..766e6c4 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Collections.Concurrent; +using System.Runtime.InteropServices; + +namespace MemoryPack.Internal { + +internal static class ReusableReadOnlySequenceBuilderPool +{ + static readonly ConcurrentQueue queue = new(); + + public static ReusableReadOnlySequenceBuilder Rent() + { + if (queue.TryDequeue(out var builder)) + { + return builder; + } + return new ReusableReadOnlySequenceBuilder(); + } + + public static void Return(ReusableReadOnlySequenceBuilder builder) + { + builder.Reset(); + queue.Enqueue(builder); + } +} + +internal sealed class ReusableReadOnlySequenceBuilder +{ + readonly Stack segmentPool; + readonly List list; + + public ReusableReadOnlySequenceBuilder() + { + list = new(); + segmentPool = new Stack(); + } + + public void Add(ReadOnlyMemory buffer, bool returnToPool) + { + if (!segmentPool.TryPop(out var segment)) + { + segment = new Segment(); + } + + segment.SetBuffer(buffer, returnToPool); + list.Add(segment); + } + + public bool TryGetSingleMemory(out ReadOnlyMemory memory) + { + if (list.Count == 1) + { + memory = list[0].Memory; + return true; + } + memory = default; + return false; + } + + public ReadOnlySequence Build() + { + if (list.Count == 0) + { + return ReadOnlySequence.Empty; + } + + if (list.Count == 1) + { + return new ReadOnlySequence(list[0].Memory); + } + + long running = 0; +#if NET7_0_OR_GREATER + var span = CollectionsMarshal.AsSpan(list); + for (int i = 0; i < span.Length; i++) + { + var next = i < span.Length - 1 ? span[i + 1] : null; + span[i].SetRunningIndexAndNext(running, next); + running += span[i].Memory.Length; + } + var firstSegment = span[0]; + var lastSegment = span[span.Length - 1]; +#else + var span = list; + for (int i = 0; i < span.Count; i++) + { + var next = i < span.Count - 1 ? span[i + 1] : null; + span[i].SetRunningIndexAndNext(running, next); + running += span[i].Memory.Length; + } + var firstSegment = span[0]; + var lastSegment = span[span.Count - 1]; +#endif + return new ReadOnlySequence(firstSegment, 0, lastSegment, lastSegment.Memory.Length); + } + + public void Reset() + { +#if NET7_0_OR_GREATER + var span = CollectionsMarshal.AsSpan(list); +#else + var span = list; +#endif + foreach (var item in span) + { + item.Reset(); + segmentPool.Push(item); + } + list.Clear(); + } + + class Segment : ReadOnlySequenceSegment + { + bool returnToPool; + + public Segment() + { + returnToPool = false; + } + + public void SetBuffer(ReadOnlyMemory buffer, bool returnToPool) + { + Memory = buffer; + this.returnToPool = returnToPool; + } + + public void Reset() + { + if (returnToPool) + { + if (MemoryMarshal.TryGetArray(Memory, out var segment) && segment.Array != null) + { + ArrayPool.Shared.Return(segment.Array, clearArray: false); + } + } + Memory = default; + RunningIndex = 0; + Next = null; + } + + public void SetRunningIndexAndNext(long runningIndex, Segment? nextSegment) + { + RunningIndex = runningIndex; + Next = nextSegment; + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs.meta new file mode 100644 index 0000000..0dbbbde --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/ReusableReadOnlySequenceBuilder.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b700925f1ee40614ca7c44623074da57 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs new file mode 100644 index 0000000..9561588 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs @@ -0,0 +1,114 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack.Internal { + +internal static class TypeHelpers +{ + static readonly MethodInfo isReferenceOrContainsReferences = typeof(RuntimeHelpers).GetMethod("IsReferenceOrContainsReferences")!; + static readonly MethodInfo unsafeSizeOf = typeof(Unsafe).GetMethod("SizeOf")!; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool IsReferenceOrNullable() + { + return Cache.IsReferenceOrNullable; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static TypeKind TryGetUnmanagedSZArrayElementSizeOrMemoryPackableFixedSize(out int size) + { + if (Cache.IsUnmanagedSZArray) + { + size = Cache.UnmanagedSZArrayElementSize; + return TypeKind.UnmanagedSZArray; + } + else + { + if (Cache.IsFixedSizeMemoryPackable) + { + size = Cache.MemoryPackableFixedSize; + return TypeKind.FixedSizeMemoryPackable; + } + } + + size = 0; + return TypeKind.None; + } + + public static bool IsAnonymous(Type type) + { + return type.Namespace == null + && type.IsSealed + && (type.Name.StartsWith("<>f__AnonymousType", StringComparison.Ordinal) + || type.Name.StartsWith("<>__AnonType", StringComparison.Ordinal) + || type.Name.StartsWith("VB$AnonymousType_", StringComparison.Ordinal)) + && type.IsDefined(typeof(CompilerGeneratedAttribute), false); + } + + static class Cache + { + public static bool IsReferenceOrNullable; + public static bool IsUnmanagedSZArray; + public static int UnmanagedSZArrayElementSize; + public static bool IsFixedSizeMemoryPackable = false; + public static int MemoryPackableFixedSize = 0; + + static Cache() + { + try + { + var type = typeof(T); + IsReferenceOrNullable = !type.IsValueType || Nullable.GetUnderlyingType(type) != null; + + if (type.IsSZArray) + { + var elementType = type.GetElementType(); + bool containsReference = (bool)(isReferenceOrContainsReferences.MakeGenericMethod(elementType!).Invoke(null, null)!); + if (!containsReference) + { + IsUnmanagedSZArray = true; + UnmanagedSZArrayElementSize = (int)unsafeSizeOf.MakeGenericMethod(elementType!).Invoke(null, null)!; + } + } +#if NET7_0_OR_GREATER + else + { + if (typeof(IFixedSizeMemoryPackable).IsAssignableFrom(type)) + { + var prop = type.GetProperty("global::MemoryPack.IFixedSizeMemoryPackable.Size", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + if (prop != null) + { + IsFixedSizeMemoryPackable = true; + MemoryPackableFixedSize = (int)prop.GetValue(null)!; + } + } + } +#endif + } + catch + { + IsUnmanagedSZArray = false; + IsFixedSizeMemoryPackable = false; + } + } + } + + internal enum TypeKind : byte + { + None, + UnmanagedSZArray, + FixedSizeMemoryPackable + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs.meta new file mode 100644 index 0000000..9bac052 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/Internal/TypeHelpers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 329bffde10972564f8819da18337cbc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs new file mode 100644 index 0000000..a82b5b7 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack { + +public static class MemoryPackCode +{ + // Collection Header + // 0~* is length, -1 is null + public const int NullCollection = -1; + + // Object/Union Header + // 0~249 is member count or tag, 250~254 is unused, 255 is null + public const byte WideTag = 250; // for Union, 250 is wide tag + public const byte ReferenceId = 250; // for CircularReference, 250 is referenceId marker, next VarInt id reference. + + public const byte Reserved1 = 250; + public const byte Reserved2 = 251; + public const byte Reserved3 = 252; + public const byte Reserved4 = 253; + public const byte Reserved5 = 254; + public const byte NullObject = 255; + + // predefined, C# compiler optimize byte[] as ReadOnlySpan property + internal static ReadOnlySpan NullCollectionData => new byte[] { 255, 255, 255, 255 }; // -1 + internal static ReadOnlySpan ZeroCollectionData => new byte[] { 0, 0, 0, 0 }; // 0 +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs.meta new file mode 100644 index 0000000..b18e486 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackCode.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 47fb89e30884e9940988b0d3021773f0 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs new file mode 100644 index 0000000..d34cf93 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Formatters; +using System.Collections; +using System.Globalization; +using System.Text; +using System.Numerics; + +namespace MemoryPack { + +public static partial class MemoryPackFormatterProvider +{ + internal static void RegisterWellKnownTypesFormatters() + { + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); +#if NET7_0_OR_GREATER + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new NullableFormatter()); +#endif + Register(new StringFormatter()); + Register(new ArrayFormatter()); + Register(new VersionFormatter()); + Register(new ArrayFormatter()); + Register(new UriFormatter()); + Register(new ArrayFormatter()); + Register(new TimeZoneInfoFormatter()); + Register(new ArrayFormatter()); + Register(new BigIntegerFormatter()); + Register(new ArrayFormatter()); + Register(new BitArrayFormatter()); + Register(new ArrayFormatter()); + Register(new StringBuilderFormatter()); + Register(new ArrayFormatter()); + Register(new TypeFormatter()); + Register(new ArrayFormatter()); + Register(new CultureInfoFormatter()); + Register(new ArrayFormatter()); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs.meta new file mode 100644 index 0000000..f3896db --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.WellknownTypes.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8c06329799b27a34abe37d38dac0a197 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs new file mode 100644 index 0000000..9dec50f --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs @@ -0,0 +1,458 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Formatters; +using MemoryPack.Internal; +using System.Buffers; +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization; + +namespace MemoryPack { + +// This service provider is not extension point, for wellknown types +// and fallback if can't resolve in compile time(like generics). +// Therefore, unlike MessagePack for C#, it is static and not extensible. + +public static partial class MemoryPackFormatterProvider +{ + // for nongenerics methods + static readonly ConcurrentDictionary formatters = new ConcurrentDictionary(Environment.ProcessorCount, 150); + + // custom generic formatters + static readonly ConcurrentDictionary genericFormatterFactory = new ConcurrentDictionary(); + + // custom generic collection formatters + static readonly ConcurrentDictionary genericCollectionFormatterFactory = new ConcurrentDictionary(); + + // generics known types + static readonly Dictionary KnownGenericTypeFormatters = new Dictionary(3) + { + { typeof(KeyValuePair<,>), typeof(KeyValuePairFormatter<,>) }, + { typeof(Lazy<>), typeof(LazyFormatter<>) }, + { typeof(Nullable<>), typeof(NullableFormatter<>) }, + }; + + static partial void RegisterInitialFormatters(); + + static MemoryPackFormatterProvider() + { + // Initialize on startup + RegisterWellKnownTypesFormatters(); + // Extension for Unity or others + RegisterInitialFormatters(); + } + + public static bool IsRegistered() => Check.registered; + + public static void Register(MemoryPackFormatter formatter) + { + Check.registered = true; // avoid to call Cache() constructor called. + formatters[typeof(T)] = formatter; + Cache.formatter = formatter; + } + +#if NET7_0_OR_GREATER + + public static void Register() + where T : IMemoryPackFormatterRegister + { + T.RegisterFormatter(); + } + +#endif + + public static void RegisterGenericType(Type genericType, Type genericFormatterType) + { + if (genericType.IsGenericType && genericFormatterType.IsGenericType) + { + genericFormatterFactory[genericType] = genericFormatterType; + } + else + { + MemoryPackSerializationException.ThrowMessage($"Registered type is not generic type. genericType:{genericType.FullName}, formatterType:{genericFormatterType.FullName}"); + } + } + + public static void RegisterCollection() + where TCollection : ICollection, new() + { + Register(new GenericCollectionFormatter()); + } + + public static void RegisterCollection(Type genericCollectionType) + { + if (genericCollectionType.IsGenericType && genericCollectionType.GetGenericArguments().Length == 1) + { + genericCollectionFormatterFactory[genericCollectionType] = typeof(GenericCollectionFormatter<,>); + } + else + { + MemoryPackSerializationException.ThrowMessage($"Registered generic collection is not filled generic formatter constraint. type: {genericCollectionType.FullName}"); + } + } + + public static void RegisterSet() + where TSet : ISet, new() + { + Register(new GenericSetFormatter()); + } + + public static void RegisterSet(Type genericSetType) + { + if (genericSetType.IsGenericType && genericSetType.GetGenericArguments().Length == 1) + { + genericCollectionFormatterFactory[genericSetType] = typeof(GenericSetFormatter<,>); + } + else + { + MemoryPackSerializationException.ThrowMessage($"Registered generic set is not filled generic formatter constraint. type: {genericSetType.FullName}"); + } + } + + public static void RegisterDictionary() + where TKey : notnull + where TDictionary : IDictionary, new() + { + Register(new GenericDictionaryFormatter()); + } + + public static void RegisterDictionary(Type genericDictionaryType) + { + if (genericDictionaryType.IsGenericType && genericDictionaryType.GetGenericArguments().Length == 2) + { + genericCollectionFormatterFactory[genericDictionaryType] = typeof(GenericDictionaryFormatter<,,>); + } + else + { + MemoryPackSerializationException.ThrowMessage($"Registered generic collection is not filled generic formatter constraint. type: {genericDictionaryType.FullName}"); + } + } + + // almostly get from Writer/Reader + // in future, will change static provider to instance provider. + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static MemoryPackFormatter GetFormatter() + { + return Cache.formatter; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static IMemoryPackFormatter GetFormatter(Type type) + { + if (formatters.TryGetValue(type, out var formatter)) + { + return formatter; + } + + if (TryInvokeRegisterFormatter(type)) + { + // try again + if (formatters.TryGetValue(type, out formatter)) + { + return formatter; + } + } + + if (TypeHelpers.IsAnonymous(type)) + { + formatter = new ErrorMemoryPackFormatter(type, "Serialize anonymous type is not supported, use record or tuple instead."); + goto END; + } + + // non registered, try to create generic formatter + // can not detect IsReferenceOrContainsReference but it only uses array type select so safe). + var formatter2 = CreateGenericFormatter(type, typeIsReferenceOrContainsReferences: true) as IMemoryPackFormatter; + if (formatter2 == null) + { + formatter2 = new ErrorMemoryPackFormatter(type); + } + formatter = formatter2; + + END: + formatters[type] = formatter; + return formatter; + } + + static bool TryInvokeRegisterFormatter(Type type) + { + if (typeof(IMemoryPackFormatterRegister).IsAssignableFrom(type)) + { + // currently C# can not call like `if (T is IMemoryPackFormatterRegister) T.RegisterFormatter()`, so use reflection instead. + var m = type.GetMethod("MemoryPack.IMemoryPackFormatterRegister.RegisterFormatter", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + if (m == null) + { + // Roslyn3.11 generator generate public static method + m = type.GetMethod("RegisterFormatter", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); + } + if (m == null) + { + throw new InvalidOperationException("Type implements IMemoryPackFormatterRegister but can not found RegisterFormatter. Type: " + type.FullName); + } + m!.Invoke(null, null); // Cache.formatter will set from method + return true; + } + + return false; + } + + static class Check + { + public static bool registered; + } + + static class Cache + { + public static MemoryPackFormatter formatter = default!; + + static Cache() + { + if (Check.registered) return; + + try + { + var type = typeof(T); + if (TryInvokeRegisterFormatter(type)) + { + return; + } + + if (TypeHelpers.IsAnonymous(type)) + { + formatter = new ErrorMemoryPackFormatter("Serialize anonymous type is not supported, use record or tuple instead."); + goto END; + } + + var typeIsReferenceOrContainsReferences = RuntimeHelpers.IsReferenceOrContainsReferences(); + var f = CreateGenericFormatter(type, typeIsReferenceOrContainsReferences) as MemoryPackFormatter; + + formatter = f ?? new ErrorMemoryPackFormatter(); + } + catch (Exception ex) + { + formatter = new ErrorMemoryPackFormatter(ex); + } + + END: + formatters[typeof(T)] = formatter; + Check.registered = true; + } + } + + internal static object? CreateGenericFormatter(Type type, bool typeIsReferenceOrContainsReferences) + { + Type? formatterType = null; + + if (type.IsArray) + { + if (type.IsSZArray) + { + if (!typeIsReferenceOrContainsReferences) + { + formatterType = typeof(DangerousUnmanagedArrayFormatter<>).MakeGenericType(type.GetElementType()!); + goto CREATE; + } + else + { + formatterType = typeof(ArrayFormatter<>).MakeGenericType(type.GetElementType()!); + goto CREATE; + } + } + else + { + var rank = type.GetArrayRank(); + switch (rank) + { + case 2: + formatterType = typeof(TwoDimensionalArrayFormatter<>).MakeGenericType(type.GetElementType()!); + goto CREATE; + case 3: + formatterType = typeof(ThreeDimensionalArrayFormatter<>).MakeGenericType(type.GetElementType()!); + goto CREATE; + case 4: + formatterType = typeof(FourDimensionalArrayFormatter<>).MakeGenericType(type.GetElementType()!); + goto CREATE; + default: + return null; // not supported + } + } + } + + if (type.IsEnum || !typeIsReferenceOrContainsReferences) + { + formatterType = typeof(DangerousUnmanagedFormatter<>).MakeGenericType(type); + goto CREATE; + } + + formatterType = TryCreateGenericFormatterType(type, TupleFormatterTypes.TupleFormatters); + if (formatterType != null) goto CREATE; + + formatterType = TryCreateGenericFormatterType(type, KnownGenericTypeFormatters); + if (formatterType != null) goto CREATE; + + formatterType = TryCreateGenericFormatterType(type, ArrayLikeFormatters); + if (formatterType != null) goto CREATE; + + formatterType = TryCreateGenericFormatterType(type, CollectionFormatters); + if (formatterType != null) goto CREATE; + +#if !UNITY_2021_2_OR_NEWER + formatterType = TryCreateGenericFormatterType(type, ImmutableCollectionFormatters); + if (formatterType != null) goto CREATE; +#endif + + formatterType = TryCreateGenericFormatterType(type, InterfaceCollectionFormatters); + if (formatterType != null) goto CREATE; + + // finally custom generated + formatterType = TryCreateGenericFormatterType(type, genericFormatterFactory); + if (formatterType != null) goto CREATE; + + // genericCollectionFormatterFactory + formatterType = TryCreateGenericCollectionFormatterType(type); + if (formatterType != null) goto CREATE; + + // Can't resolve formatter, return null(will create ErrorMemoryPackFormatter). + return null; + + CREATE: + return Activator.CreateInstance(formatterType); + } + + static Type? TryCreateGenericFormatterType(Type type, IDictionary knownTypes) + { + if (type.IsGenericType) + { + var genericDefinition = type.GetGenericTypeDefinition(); + + if (knownTypes.TryGetValue(genericDefinition, out var formatterType)) + { + return formatterType.MakeGenericType(type.GetGenericArguments()); + } + } + + return null; + } + + static Type? TryCreateGenericCollectionFormatterType(Type type) + { + if (type.IsGenericType && genericCollectionFormatterFactory.TryGetValue(type, out var formatterType)) + { + var genericDefinition = type.GetGenericTypeDefinition(); + var elementTypes = genericDefinition.GetGenericArguments(); + + // formatterType is so concat type at first + return formatterType.MakeGenericType(elementTypes.Prepend(type).ToArray()); + } + + return null; + } +} + +internal sealed class ErrorMemoryPackFormatter : IMemoryPackFormatter +{ + readonly Type type; + readonly string? message; + + public ErrorMemoryPackFormatter(Type type) + { + this.type = type; + this.message = null; + } + + public ErrorMemoryPackFormatter(Type type, string message) + { + this.type = type; + this.message = message; + } + + public void Serialize(ref MemoryPackWriter writer, ref object? value) +#if NET7_0_OR_GREATER + +#else + +#endif + { + Throw(); + } + + public void Deserialize(ref MemoryPackReader reader, ref object? value) + { + Throw(); + } + + [DoesNotReturn] + void Throw() + { + if (message != null) + { + MemoryPackSerializationException.ThrowMessage(message); + } + else + { + MemoryPackSerializationException.ThrowNotRegisteredInProvider(type); + } + } +} + +internal sealed class ErrorMemoryPackFormatter : MemoryPackFormatter +{ + readonly Exception? exception; + readonly string? message; + + public ErrorMemoryPackFormatter() + { + this.exception = null; + this.message = null; + } + + public ErrorMemoryPackFormatter(Exception exception) + { + this.exception = exception; + this.message = null; + } + + public ErrorMemoryPackFormatter(string message) + { + this.exception = null; + this.message = message; + } + + public override void Serialize(ref MemoryPackWriter writer, ref T? value) + { + Throw(); + } + + public override void Deserialize(ref MemoryPackReader reader, ref T? value) + { + Throw(); + } + + [DoesNotReturn] + void Throw() + { + if (exception != null) + { + MemoryPackSerializationException.ThrowRegisterInProviderFailed(typeof(T), exception); + } + else if (message != null) + { + MemoryPackSerializationException.ThrowMessage(message); + } + else + { + MemoryPackSerializationException.ThrowNotRegisteredInProvider(typeof(T)); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs.meta new file mode 100644 index 0000000..bbe7fff --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackFormatterProvider.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f1200521b3b3b7344a1cfe3b1b58439a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs new file mode 100644 index 0000000..ee0cc53 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs @@ -0,0 +1,620 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack { + +public ref partial struct MemoryPackReader +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1) + where T1 : unmanaged + { + var size = Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2) + where T1 : unmanaged + where T2 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12, out T13 value13) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value13 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12, out T13 value13, out T14 value14) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + where T14 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value13 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value14 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12, out T13 value13, out T14 value14, out T15 value15) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + where T14 : unmanaged + where T15 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value13 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value14 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value15 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1) + { + var size = Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12, out T13 value13) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value13 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12, out T13 value13, out T14 value14) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value13 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value14 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousReadUnmanaged(out T1 value1, out T2 value2, out T3 value3, out T4 value4, out T5 value5, out T6 value6, out T7 value7, out T8 value8, out T9 value9, out T10 value10, out T11 value11, out T12 value12, out T13 value13, out T14 value14, out T15 value15) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + value1 = Unsafe.ReadUnaligned(ref spanRef); + value2 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf())); + value3 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf())); + value4 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value5 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value6 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value7 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value8 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value9 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value10 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value11 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value12 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value13 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value14 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + value15 = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf())); + Advance(size); + } + +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs.meta new file mode 100644 index 0000000..2930e6a --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.Unmanaged.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5edf80b8ed9aae143b689d072859a209 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs new file mode 100644 index 0000000..9926b0c --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs @@ -0,0 +1,930 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +#if NET7_0_OR_GREATER +using System.Text.Unicode; +#endif + +namespace MemoryPack { + +#if NET7_0_OR_GREATER +using static GC; +using static MemoryMarshal; +#else +using static MemoryPack.Internal.MemoryMarshalEx; +#endif + +[StructLayout(LayoutKind.Auto)] +public ref partial struct MemoryPackReader +{ + ReadOnlySequence bufferSource; + readonly long totalLength; +#if NET7_0_OR_GREATER + ref byte bufferReference; +#else + ReadOnlySpan bufferReference; +#endif + int bufferLength; + byte[]? rentBuffer; + int advancedCount; + int consumed; // total length of consumed + readonly MemoryPackReaderOptionalState optionalState; + + public int Consumed => consumed; + public long Remaining => totalLength - consumed; + public MemoryPackReaderOptionalState OptionalState => optionalState; + public MemoryPackSerializerOptions Options => optionalState.Options; + + public MemoryPackReader(in ReadOnlySequence sequence, MemoryPackReaderOptionalState optionalState) + { + this.bufferSource = sequence.IsSingleSegment ? ReadOnlySequence.Empty : sequence; + var span = sequence.FirstSpan; +#if NET7_0_OR_GREATER + this.bufferReference = ref MemoryMarshal.GetReference(span); +#else + this.bufferReference = span; +#endif + this.bufferLength = span.Length; + this.advancedCount = 0; + this.consumed = 0; + this.rentBuffer = null; + this.totalLength = sequence.Length; + this.optionalState = optionalState; + } + + public MemoryPackReader(ReadOnlySpan buffer, MemoryPackReaderOptionalState optionalState) + { + this.bufferSource = ReadOnlySequence.Empty; +#if NET7_0_OR_GREATER + this.bufferReference = ref MemoryMarshal.GetReference(buffer); +#else + this.bufferReference = buffer; +#endif + this.bufferLength = buffer.Length; + this.advancedCount = 0; + this.consumed = 0; + this.rentBuffer = null; + this.totalLength = buffer.Length; + this.optionalState = optionalState; + } + + // buffer operations + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ref byte GetSpanReference(int sizeHint) + { + if (sizeHint <= bufferLength) + { +#if NET7_0_OR_GREATER + return ref bufferReference; +#else + return ref MemoryMarshal.GetReference(bufferReference); +#endif + } + + return ref GetNextSpan(sizeHint); + } + + [MethodImpl(MethodImplOptions.NoInlining)] + ref byte GetNextSpan(int sizeHint) + { + if (rentBuffer != null) + { + ArrayPool.Shared.Return(rentBuffer); + rentBuffer = null; + } + + if (Remaining == 0) + { + MemoryPackSerializationException.ThrowSequenceReachedEnd(); + } + + try + { + bufferSource = bufferSource.Slice(advancedCount); + } + catch (ArgumentOutOfRangeException) + { + MemoryPackSerializationException.ThrowSequenceReachedEnd(); + } + + advancedCount = 0; + + if (sizeHint <= Remaining) + { + if (sizeHint <= bufferSource.FirstSpan.Length) + { +#if NET7_0_OR_GREATER + bufferReference = ref MemoryMarshal.GetReference(bufferSource.FirstSpan); + bufferLength = bufferSource.FirstSpan.Length; + return ref bufferReference; +#else + bufferReference = bufferSource.FirstSpan; + bufferLength = bufferSource.FirstSpan.Length; + return ref MemoryMarshal.GetReference(bufferReference); +#endif + } + + rentBuffer = ArrayPool.Shared.Rent(sizeHint); + bufferSource.Slice(0, sizeHint).CopyTo(rentBuffer); + var span = rentBuffer.AsSpan(0, sizeHint); +#if NET7_0_OR_GREATER + bufferReference = ref MemoryMarshal.GetReference(span); + bufferLength = span.Length; + return ref bufferReference; +#else + bufferReference = span; + bufferLength = span.Length; + return ref MemoryMarshal.GetReference(bufferReference); +#endif + } + + MemoryPackSerializationException.ThrowSequenceReachedEnd(); +#if NET7_0_OR_GREATER + return ref bufferReference; // dummy. +#else + return ref MemoryMarshal.GetReference(bufferReference); +#endif + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Advance(int count) + { + if (count == 0) return; + + var rest = bufferLength - count; + if (rest < 0) + { + if (TryAdvanceSequence(count)) + { + return; + } + } + + bufferLength = rest; +#if NET7_0_OR_GREATER + bufferReference = ref Unsafe.Add(ref bufferReference, count); +#else + bufferReference = bufferReference.Slice(count); +#endif + advancedCount += count; + consumed += count; + } + + [MethodImpl(MethodImplOptions.NoInlining)] + bool TryAdvanceSequence(int count) + { + var rest = bufferSource.Length - count; + if (rest < 0) + { + MemoryPackSerializationException.ThrowInvalidAdvance(); + } + + bufferSource = bufferSource.Slice(advancedCount + count); +#if NET7_0_OR_GREATER + bufferReference = ref MemoryMarshal.GetReference(bufferSource.FirstSpan); +#else + bufferReference = bufferSource.FirstSpan; +#endif + bufferLength = bufferSource.FirstSpan.Length; + advancedCount = 0; + consumed += count; + return true; + } + + public void GetRemainingSource(out ReadOnlySpan singleSource, out ReadOnlySequence remainingSource) + { + if (bufferSource.IsEmpty) + { + remainingSource = ReadOnlySequence.Empty; +#if NET7_0_OR_GREATER + singleSource = MemoryMarshal.CreateReadOnlySpan(ref bufferReference, bufferLength); +#else + singleSource = bufferReference; +#endif + return; + } + else + { + if (bufferSource.IsSingleSegment) + { + remainingSource = ReadOnlySequence.Empty; + singleSource = bufferSource.FirstSpan.Slice(advancedCount); + return; + } + + singleSource = default; + remainingSource = bufferSource.Slice(advancedCount); + if (remainingSource.IsSingleSegment) + { + singleSource = remainingSource.FirstSpan; + remainingSource = ReadOnlySequence.Empty; + return; + } + return; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Dispose() + { + if (rentBuffer != null) + { + ArrayPool.Shared.Return(rentBuffer); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public IMemoryPackFormatter GetFormatter(Type type) + { + return MemoryPackFormatterProvider.GetFormatter(type); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public IMemoryPackFormatter GetFormatter() + { + return MemoryPackFormatterProvider.GetFormatter(); + } + + // read methods + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryReadObjectHeader(out byte memberCount) + { + memberCount = GetSpanReference(1); + Advance(1); + return memberCount != MemoryPackCode.NullObject; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryReadUnionHeader(out ushort tag) + { + var firstTag = GetSpanReference(1); + Advance(1); + if (firstTag < MemoryPackCode.WideTag) + { + tag = firstTag; + return true; + } + else if (firstTag == MemoryPackCode.WideTag) + { + ReadUnmanaged(out tag); + return true; + } + else + { + tag = 0; + return false; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryReadCollectionHeader(out int length) + { + length = Unsafe.ReadUnaligned(ref GetSpanReference(4)); + Advance(4); + + // If collection-length is larger than buffer-length, it is invalid data. + if (Remaining < length) + { + MemoryPackSerializationException.ThrowInsufficientBufferUnless(length); + } + + return length != MemoryPackCode.NullCollection; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool PeekIsNull() + { + var code = GetSpanReference(1); + return code == MemoryPackCode.NullObject; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryPeekObjectHeader(out byte memberCount) + { + memberCount = GetSpanReference(1); + return memberCount != MemoryPackCode.NullObject; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryPeekUnionHeader(out ushort tag) + { + var firstTag = GetSpanReference(1); + if (firstTag < MemoryPackCode.WideTag) + { + tag = firstTag; + return true; + } + else if (firstTag == MemoryPackCode.WideTag) + { + ref var spanRef = ref GetSpanReference(sizeof(ushort) + 1); // skip firstTag + tag = Unsafe.ReadUnaligned(ref Unsafe.Add(ref spanRef, 1)); + return true; + } + else + { + tag = 0; + return false; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool TryPeekCollectionHeader(out int length) + { + length = Unsafe.ReadUnaligned(ref GetSpanReference(4)); + + // If collection-length is larger than buffer-length, it is invalid data. + if (Remaining < length) + { + MemoryPackSerializationException.ThrowInsufficientBufferUnless(length); + } + + return length != MemoryPackCode.NullCollection; + } + + /// + /// no validate collection size, be careful to use. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool DangerousTryReadCollectionHeader(out int length) + { + length = Unsafe.ReadUnaligned(ref GetSpanReference(4)); + Advance(4); + + return length != MemoryPackCode.NullCollection; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public string? ReadString() + { + if (!TryReadCollectionHeader(out var length)) + { + return null; + } + if (length == 0) + { + return ""; + } + + if (length > 0) + { + return ReadUtf16(length); + } + else + { + return ReadUtf8(length); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + string ReadUtf16(int length) + { + var byteCount = checked(length * 2); + ref var src = ref GetSpanReference(byteCount); + + var str = new string(MemoryMarshal.CreateReadOnlySpan(ref Unsafe.As(ref src), length)); + + Advance(byteCount); + + return str; + } + + [MethodImpl(MethodImplOptions.NoInlining)] // non default, no inline + string ReadUtf8(int utf8Length) + { + // (int ~utf8-byte-count, int utf16-length, utf8-bytes) + // already read utf8 length, but it is complement. + + utf8Length = ~utf8Length; + + ref var spanRef = ref GetSpanReference(utf8Length + 4); // + read utf16 length + + string str; + var utf16Length = Unsafe.ReadUnaligned(ref spanRef); + + if (utf16Length <= 0) + { + var src = MemoryMarshal.CreateReadOnlySpan(ref Unsafe.Add(ref spanRef, 4), utf8Length); + str = Encoding.UTF8.GetString(src); + } + else + { + // check malformed utf16Length + var max = unchecked((Remaining + 1) * 3); + if (max < 0) max = int.MaxValue; + if (max < utf16Length) + { + MemoryPackSerializationException.ThrowInsufficientBufferUnless(utf8Length); + } + + +#if NET7_0_OR_GREATER + // regular path, know decoded UTF16 length will gets faster decode result + unsafe + { + fixed (byte* p = &Unsafe.Add(ref spanRef, 4)) + { + str = string.Create(utf16Length, ((IntPtr)p, utf8Length), static (dest, state) => + { + var src = MemoryMarshal.CreateSpan(ref Unsafe.AsRef((byte*)state.Item1), state.Item2); + var status = Utf8.ToUtf16(src, dest, out var bytesRead, out var charsWritten, replaceInvalidSequences: false); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowFailedEncoding(status); + } + }); + } + } +#else + var src = MemoryMarshal.CreateReadOnlySpan(ref Unsafe.Add(ref spanRef, 4), utf8Length); + str = Encoding.UTF8.GetString(src); +#endif + } + + Advance(utf8Length + 4); + + return str; + } + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T1 ReadUnmanaged() + where T1 : unmanaged + { + var size = Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + var value1 = Unsafe.ReadUnaligned(ref spanRef); + Advance(size); + return value1; + } + +#if NET7_0_OR_GREATER + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadPackable(ref T? value) + where T : IMemoryPackable + { + T.Deserialize(ref this, ref value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T? ReadPackable() + where T : IMemoryPackable + { + T? value = default; + T.Deserialize(ref this, ref value); + return value; + } + +#else + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadPackable(ref T? value) + where T : IMemoryPackable + { + ReadValue(ref value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T? ReadPackable() + where T : IMemoryPackable + { + return ReadValue(); + } + +#endif + + // non packable, get formatter dynamically. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadValue(ref T? value) + { + GetFormatter().Deserialize(ref this, ref value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T? ReadValue() + { + T? value = default; + GetFormatter().Deserialize(ref this, ref value); + return value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadValue(Type type, ref object? value) + { + GetFormatter(type).Deserialize(ref this, ref value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public object? ReadValue(Type type) + { + object? value = default; + GetFormatter(type).Deserialize(ref this, ref value); + return value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadValueWithFormatter(TFormatter formatter, ref T? value) + where TFormatter : IMemoryPackFormatter + { + formatter.Deserialize(ref this, ref value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T? ReadValueWithFormatter(TFormatter formatter) + where TFormatter : IMemoryPackFormatter + { + T? value = default; + formatter.Deserialize(ref this, ref value); + return value; + } + + #region ReadArray/Span + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T?[]? ReadArray() + { + T?[]? value = default; + ReadArray(ref value); + return value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadArray(ref T?[]? value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousReadUnmanagedArray(ref value); + return; + } + + if (!TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + // T[] support overwrite + if (value == null || value.Length != length) + { + value = new T[length]; + } + + var formatter = GetFormatter(); + for (int i = 0; i < length; i++) + { + formatter.Deserialize(ref this, ref value[i]); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadSpan(ref Span value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousReadUnmanagedSpan(ref value); + return; + } + + if (!TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + if (value.Length != length) + { + value = new T[length]; + } + + var formatter = GetFormatter(); + for (int i = 0; i < length; i++) + { + formatter.Deserialize(ref this, ref value[i]); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T?[]? ReadPackableArray() + where T : IMemoryPackable + { + T?[]? value = default; + ReadPackableArray(ref value); + return value; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadPackableArray(ref T?[]? value) + where T : IMemoryPackable + { +#if !NET7_0_OR_GREATER + ReadArray(ref value); + return; +#else + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousReadUnmanagedArray(ref value); + return; + } + + if (!TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + // T[] support overwrite + if (value == null || value.Length != length) + { + value = new T[length]; + } + + for (int i = 0; i < length; i++) + { + T.Deserialize(ref this, ref value[i]); + } +#endif + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadPackableSpan(ref Span value) + where T : IMemoryPackable + { +#if !NET7_0_OR_GREATER + ReadSpan(ref value); + return; +#else + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousReadUnmanagedSpan(ref value); + return; + } + + if (!TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + if (value.Length != length) + { + value = new T[length]; + } + + for (int i = 0; i < length; i++) + { + T.Deserialize(ref this, ref value[i]); + } +#endif + } + + #endregion + + #region UnmanagedArray/Span + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public T[]? ReadUnmanagedArray() + where T : unmanaged + { + return DangerousReadUnmanagedArray(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanagedArray(ref T[]? value) + where T : unmanaged + { + DangerousReadUnmanagedArray(ref value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadUnmanagedSpan(ref Span value) + where T : unmanaged + { + DangerousReadUnmanagedSpan(ref value); + } + + // T: should be unamanged type + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public unsafe T[]? DangerousReadUnmanagedArray() + { + if (!TryReadCollectionHeader(out var length)) + { + return null; + } + + if (length == 0) return Array.Empty(); + + var byteCount = length * Unsafe.SizeOf(); + ref var src = ref GetSpanReference(byteCount); + var dest = AllocateUninitializedArray(length); + Unsafe.CopyBlockUnaligned(ref Unsafe.As(ref GetArrayDataReference(dest)), ref src, (uint)byteCount); + Advance(byteCount); + + return dest; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public unsafe void DangerousReadUnmanagedArray(ref T[]? value) + { + if (!TryReadCollectionHeader(out var length)) + { + value = null; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + var byteCount = length * Unsafe.SizeOf(); + ref var src = ref GetSpanReference(byteCount); + + if (value == null || value.Length != length) + { + value = AllocateUninitializedArray(length); + } + + ref var dest = ref Unsafe.As(ref GetArrayDataReference(value)); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + Advance(byteCount); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public unsafe void DangerousReadUnmanagedSpan(ref Span value) + { + if (!TryReadCollectionHeader(out var length)) + { + value = default; + return; + } + + if (length == 0) + { + value = Array.Empty(); + return; + } + + var byteCount = length * Unsafe.SizeOf(); + ref var src = ref GetSpanReference(byteCount); + + if (value == null || value.Length != length) + { + value = AllocateUninitializedArray(length); + } + + ref var dest = ref Unsafe.As(ref MemoryMarshal.GetReference(value)); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + Advance(byteCount); + } + + #endregion + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadSpanWithoutReadLengthHeader(int length, ref Span value) + { + if (length == 0) + { + value = Array.Empty(); + return; + } + + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + if (value.Length != length) + { + value = AllocateUninitializedArray(length); + } + + var byteCount = length * Unsafe.SizeOf(); + ref var src = ref GetSpanReference(byteCount); + ref var dest = ref Unsafe.As(ref MemoryMarshal.GetReference(value)!); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + Advance(byteCount); + } + else + { + if (value.Length != length) + { + value = new T[length]; + } + + var formatter = GetFormatter(); + for (int i = 0; i < length; i++) + { + formatter.Deserialize(ref this, ref value[i]); + } + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void ReadPackableSpanWithoutReadLengthHeader(int length, ref Span value) + where T : IMemoryPackable + { +#if !NET7_0_OR_GREATER + ReadSpanWithoutReadLengthHeader(length, ref value); + return; +#else + if (length == 0) + { + value = Array.Empty(); + return; + } + + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + if (value.Length != length) + { + value = AllocateUninitializedArray(length); + } + + var byteCount = length * Unsafe.SizeOf(); + ref var src = ref GetSpanReference(byteCount); + ref var dest = ref Unsafe.As(ref MemoryMarshal.GetReference(value)!); + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)byteCount); + + Advance(byteCount); + } + else + { + if (value.Length != length) + { + value = new T[length]; + } + + for (int i = 0; i < length; i++) + { + T.Deserialize(ref this, ref value[i]); + } + } +#endif + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public unsafe void DangerousReadUnmanagedSpanView(out bool isNull, out ReadOnlySpan view) + { + if (!TryReadCollectionHeader(out var length)) + { + isNull = true; + view = default; + return; + } + + isNull = false; + + if (length == 0) + { + view = Array.Empty(); + return; + } + + var byteCount = length * Unsafe.SizeOf(); + ref var src = ref GetSpanReference(byteCount); + + var span = MemoryMarshal.CreateReadOnlySpan(ref src, byteCount); + + Advance(byteCount); + view = span; // safe until call next GetSpanReference + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs.meta new file mode 100644 index 0000000..6e5b625 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReader.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 27df744bfc004694c9598738f9d32cce +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs new file mode 100644 index 0000000..51826e2 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Collections.Concurrent; + +namespace MemoryPack { + +public static class MemoryPackReaderOptionalStatePool +{ + static readonly ConcurrentQueue queue = new ConcurrentQueue(); + + public static MemoryPackReaderOptionalState Rent(MemoryPackSerializerOptions? options) + { + if (!queue.TryDequeue(out var state)) + { + state = new MemoryPackReaderOptionalState(); + } + + state.Init(options); + return state; + } + + internal static void Return(MemoryPackReaderOptionalState state) + { + state.Reset(); + queue.Enqueue(state); + } +} + +public sealed class MemoryPackReaderOptionalState : IDisposable +{ + readonly Dictionary refToObject; + public MemoryPackSerializerOptions Options { get; private set; } + + internal MemoryPackReaderOptionalState() + { + refToObject = new Dictionary(); + Options = null!; + } + + internal void Init(MemoryPackSerializerOptions? options) + { + Options = options ?? MemoryPackSerializerOptions.Default; + } + + public object GetObjectReference(uint id) + { + if (refToObject.TryGetValue(id, out var value)) + { + return value; + } + MemoryPackSerializationException.ThrowMessage("Object is not found in this reference id:" + id); + return null!; + } + + public void AddObjectReference(uint id, object value) + { + if (!refToObject.TryAdd(id, value)) + { + MemoryPackSerializationException.ThrowMessage("Object is already added, id:" + id); + } + } + + public void Reset() + { + refToObject.Clear(); + Options = null!; + } + + void IDisposable.Dispose() + { + MemoryPackReaderOptionalStatePool.Return(this); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs.meta new file mode 100644 index 0000000..e215e4e --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderOptionalState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8a381067d43337845bd228a2207155da +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs new file mode 100644 index 0000000..a6fa7c2 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs @@ -0,0 +1,448 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack { + +// VarInt, first sbyte is value or typeCode + +// 0~127 = unsigned byte value +// -1~-120 = signed byte value +// -121 = byte +// -122 = sbyte +// -123 = ushort +// -124 = short +// -125 = uint +// -126 = int +// -127 = ulong +// -128 = long + +internal static class VarIntCodes +{ + public const byte MaxSingleValue = 127; + public const sbyte MinSingleValue = -120; + + public const sbyte Byte = -121; + public const sbyte SByte = -122; + public const sbyte UInt16 = -123; + public const sbyte Int16 = -124; + public const sbyte UInt32 = -125; + public const sbyte Int32 = -126; + public const sbyte UInt64 = -127; + public const sbyte Int64 = -128; +} + +public ref partial struct MemoryPackWriter +{ + public void WriteVarInt(byte x) + { + if (x <= VarIntCodes.MaxSingleValue) + { + WriteUnmanaged((sbyte)x); + } + else + { + WriteUnmanaged(VarIntCodes.Byte, x); + } + } + + public void WriteVarInt(sbyte x) + { + if (VarIntCodes.MinSingleValue <= x) + { + WriteUnmanaged(x); + } + else + { + WriteUnmanaged(VarIntCodes.SByte, x); + } + } + + public void WriteVarInt(ushort x) + { + if (x <= VarIntCodes.MaxSingleValue) + { + WriteUnmanaged((sbyte)x); + } + else + { + WriteUnmanaged(VarIntCodes.UInt16, (UInt16)x); + } + } + + public void WriteVarInt(short x) + { + if (0 <= x) + { + if (x <= VarIntCodes.MaxSingleValue) // same as sbyte.MaxValue + { + WriteUnmanaged((sbyte)x); + } + else + { + WriteUnmanaged(VarIntCodes.Int16, (Int16)x); + } + } + else + { + if (VarIntCodes.MinSingleValue <= x) + { + WriteUnmanaged((sbyte)x); + } + else if (sbyte.MinValue <= x) + { + WriteUnmanaged(VarIntCodes.SByte, (SByte)x); + } + else + { + WriteUnmanaged(VarIntCodes.Int16, (Int16)x); + } + } + } + + public void WriteVarInt(uint x) + { + if (x <= VarIntCodes.MaxSingleValue) + { + WriteUnmanaged((sbyte)x); + } + else if (x <= ushort.MaxValue) + { + WriteUnmanaged(VarIntCodes.UInt16, (UInt16)x); + } + else + { + WriteUnmanaged(VarIntCodes.UInt32, (UInt32)x); + } + } + + public void WriteVarInt(int x) + { + if (0 <= x) + { + if (x <= VarIntCodes.MaxSingleValue) // same as sbyte.MaxValue + { + WriteUnmanaged((sbyte)x); + } + else if (x <= short.MaxValue) + { + WriteUnmanaged(VarIntCodes.Int16, (Int16)x); + } + else + { + WriteUnmanaged(VarIntCodes.Int32, (Int32)x); + } + } + else + { + if (VarIntCodes.MinSingleValue <= x) + { + WriteUnmanaged((sbyte)x); + } + else if (sbyte.MinValue <= x) + { + WriteUnmanaged(VarIntCodes.SByte, (SByte)x); + } + else if (short.MinValue <= x) + { + WriteUnmanaged(VarIntCodes.Int16, (Int16)x); + } + else + { + WriteUnmanaged(VarIntCodes.Int32, (Int32)x); + } + } + } + + public void WriteVarInt(ulong x) + { + if (x <= VarIntCodes.MaxSingleValue) + { + WriteUnmanaged((sbyte)x); + } + else if (x <= ushort.MaxValue) + { + WriteUnmanaged(VarIntCodes.UInt16, (UInt16)x); + } + else if (x <= uint.MaxValue) + { + WriteUnmanaged(VarIntCodes.UInt32, (UInt32)x); + } + else + { + WriteUnmanaged(VarIntCodes.UInt64, (UInt64)x); + } + } + + public void WriteVarInt(long x) + { + if (0 <= x) + { + if (x <= VarIntCodes.MaxSingleValue) // same as sbyte.MaxValue + { + WriteUnmanaged((sbyte)x); + } + else if (x <= short.MaxValue) + { + WriteUnmanaged(VarIntCodes.Int16, (Int16)x); + } + else if (x <= int.MaxValue) + { + WriteUnmanaged(VarIntCodes.Int32, (Int32)x); + } + else + { + WriteUnmanaged(VarIntCodes.Int64, (Int64)x); + } + } + else + { + if (VarIntCodes.MinSingleValue <= x) + { + WriteUnmanaged((sbyte)x); + } + else if (sbyte.MinValue <= x) + { + WriteUnmanaged(VarIntCodes.SByte, (SByte)x); + } + else if (short.MinValue <= x) + { + WriteUnmanaged(VarIntCodes.Int16, (Int16)x); + } + else if (int.MinValue <= x) + { + WriteUnmanaged(VarIntCodes.Int32, (Int32)x); + } + else + { + WriteUnmanaged(VarIntCodes.Int64, (Int64)x); + } + } + } +} + +public ref partial struct MemoryPackReader +{ + public byte ReadVarIntByte() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return checked((byte)ReadUnmanaged()); + case VarIntCodes.UInt16: + return checked((byte)ReadUnmanaged()); + case VarIntCodes.Int16: + return checked((byte)ReadUnmanaged()); + case VarIntCodes.UInt32: + return checked((byte)ReadUnmanaged()); + case VarIntCodes.Int32: + return checked((byte)ReadUnmanaged()); + case VarIntCodes.UInt64: + return checked((byte)ReadUnmanaged()); + case VarIntCodes.Int64: + return checked((byte)ReadUnmanaged()); + default: + return checked((byte)typeCode); + } + } + + public sbyte ReadVarIntSByte() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return checked((sbyte)ReadUnmanaged()); + case VarIntCodes.SByte: + return ReadUnmanaged(); + case VarIntCodes.UInt16: + return checked((sbyte)ReadUnmanaged()); + case VarIntCodes.Int16: + return checked((sbyte)ReadUnmanaged()); + case VarIntCodes.UInt32: + return checked((sbyte)ReadUnmanaged()); + case VarIntCodes.Int32: + return checked((sbyte)ReadUnmanaged()); + case VarIntCodes.UInt64: + return checked((sbyte)ReadUnmanaged()); + case VarIntCodes.Int64: + return checked((sbyte)ReadUnmanaged()); + default: + return typeCode; + } + } + + public ushort ReadVarIntUInt16() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return checked((ushort)ReadUnmanaged()); + case VarIntCodes.UInt16: + return ReadUnmanaged(); + case VarIntCodes.Int16: + return checked((ushort)ReadUnmanaged()); + case VarIntCodes.UInt32: + return checked((ushort)ReadUnmanaged()); + case VarIntCodes.Int32: + return checked((ushort)ReadUnmanaged()); + case VarIntCodes.UInt64: + return checked((ushort)ReadUnmanaged()); + case VarIntCodes.Int64: + return checked((ushort)ReadUnmanaged()); + default: + return checked((ushort)typeCode); + } + } + + public short ReadVarIntInt16() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return ReadUnmanaged(); + case VarIntCodes.UInt16: + return checked((short)ReadUnmanaged()); + case VarIntCodes.Int16: + return ReadUnmanaged(); + case VarIntCodes.UInt32: + return checked((short)ReadUnmanaged()); + case VarIntCodes.Int32: + return checked((short)ReadUnmanaged()); + case VarIntCodes.UInt64: + return checked((short)ReadUnmanaged()); + case VarIntCodes.Int64: + return checked((short)ReadUnmanaged()); + default: + return typeCode; + } + } + + public uint ReadVarIntUInt32() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return checked((uint)ReadUnmanaged()); + case VarIntCodes.UInt16: + return ReadUnmanaged(); + case VarIntCodes.Int16: + return checked((uint)ReadUnmanaged()); + case VarIntCodes.UInt32: + return ReadUnmanaged(); + case VarIntCodes.Int32: + return checked((uint)ReadUnmanaged()); + case VarIntCodes.UInt64: + return checked((uint)ReadUnmanaged()); + case VarIntCodes.Int64: + return checked((uint)ReadUnmanaged()); + default: + return checked((uint)typeCode); + } + } + + public int ReadVarIntInt32() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return ReadUnmanaged(); + case VarIntCodes.UInt16: + return ReadUnmanaged(); + case VarIntCodes.Int16: + return ReadUnmanaged(); + case VarIntCodes.UInt32: + return checked((int)ReadUnmanaged()); + case VarIntCodes.Int32: + return ReadUnmanaged(); + case VarIntCodes.UInt64: + return checked((int)ReadUnmanaged()); + case VarIntCodes.Int64: + return checked((int)ReadUnmanaged()); + default: + return typeCode; + } + } + + public ulong ReadVarIntUInt64() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return checked((ulong)ReadUnmanaged()); + case VarIntCodes.UInt16: + return ReadUnmanaged(); + case VarIntCodes.Int16: + return checked((ulong)ReadUnmanaged()); + case VarIntCodes.UInt32: + return ReadUnmanaged(); + case VarIntCodes.Int32: + return checked((ulong)ReadUnmanaged()); + case VarIntCodes.UInt64: + return ReadUnmanaged(); + case VarIntCodes.Int64: + return checked((ulong)ReadUnmanaged()); + default: + return checked((ulong)typeCode); + } + } + + public long ReadVarIntInt64() + { + ReadUnmanaged(out sbyte typeCode); + + switch (typeCode) + { + case VarIntCodes.Byte: + return ReadUnmanaged(); + case VarIntCodes.SByte: + return ReadUnmanaged(); + case VarIntCodes.UInt16: + return ReadUnmanaged(); + case VarIntCodes.Int16: + return ReadUnmanaged(); + case VarIntCodes.UInt32: + return ReadUnmanaged(); + case VarIntCodes.Int32: + return ReadUnmanaged(); + case VarIntCodes.UInt64: + return checked((long)ReadUnmanaged()); + case VarIntCodes.Int64: + return ReadUnmanaged(); + default: + return typeCode; + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs.meta new file mode 100644 index 0000000..26bce1a --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackReaderWriter.VarInt.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 0a312341bf29b42429b858550384dd1a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs new file mode 100644 index 0000000..9acd411 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Diagnostics.CodeAnalysis; + +namespace MemoryPack { + +public class MemoryPackSerializationException : Exception +{ + public MemoryPackSerializationException(string message) + : base(message) + { + } + + public MemoryPackSerializationException(string message, Exception innerException) + : base(message, innerException) + { + } + + [DoesNotReturn] + public static void ThrowMessage(string message) + { + throw new MemoryPackSerializationException(message); + } + + [DoesNotReturn] + public static void ThrowInvalidPropertyCount(byte expected, byte actual) + { + throw new MemoryPackSerializationException($"Current object's property count is {expected} but binary's header maked as {actual}, can't deserialize about versioning."); + } + + [DoesNotReturn] + public static void ThrowInvalidPropertyCount(Type type, byte expected, byte actual) + { + throw new MemoryPackSerializationException($"{type.FullName} property count is {expected} but binary's header maked as {actual}, can't deserialize about versioning."); + } + + [DoesNotReturn] + public static void ThrowInvalidCollection() + { + throw new MemoryPackSerializationException($"Current read to collection, the buffer header is not collection."); + } + + [DoesNotReturn] + public static void ThrowInvalidRange(int expected, int actual) + { + throw new MemoryPackSerializationException($"Requires size is {expected} but buffer length is {actual}."); + } + + [DoesNotReturn] + public static void ThrowInvalidAdvance() + { + throw new MemoryPackSerializationException($"Cannot advance past the end of the buffer."); + } + + [DoesNotReturn] + public static void ThrowSequenceReachedEnd() + { + throw new MemoryPackSerializationException($"Sequence reached end, reader can not provide more buffer."); + } + + [DoesNotReturn] + public static void ThrowWriteInvalidMemberCount(byte memberCount) + { + throw new MemoryPackSerializationException($"MemberCount/Tag allows < 250 but try to write {memberCount}."); + } + + [DoesNotReturn] + public static void ThrowInsufficientBufferUnless(int length) + { + throw new MemoryPackSerializationException($"Length header size is larger than buffer size, length: {length}."); + } + + [DoesNotReturn] + public static void ThrowNotRegisteredInProvider(Type type) + { + throw new MemoryPackSerializationException($"{type.FullName} is not registered in this provider."); + } + + [DoesNotReturn] + public static void ThrowRegisterInProviderFailed(Type type, Exception innerException) + { + throw new MemoryPackSerializationException($"{type.FullName} is failed in provider at creating formatter.", innerException); + } + + [DoesNotReturn] + public static void ThrowNotFoundInUnionType(Type actualType, Type baseType) + { + throw new MemoryPackSerializationException($"Type {actualType.FullName} is not annotated in {baseType.FullName} MemoryPackUnion."); + } + + [DoesNotReturn] + public static void ThrowInvalidTag(ushort tag, Type baseType) + { + throw new MemoryPackSerializationException($"Data read tag: {tag} but not found in {baseType.FullName} MemoryPackUnion annotations."); + } + + [DoesNotReturn] + public static void ThrowReachedDepthLimit(Type type) + { + throw new MemoryPackSerializationException($"Serializing Type '{type}' reached depth limit, maybe detect circular reference."); + } + + [DoesNotReturn] + public static void ThrowInvalidConcurrrentCollectionOperation() + { + throw new MemoryPackSerializationException($"ConcurrentCollection is Added/Removed in serializing, however serialize concurrent collection is not thread-safe."); + } + + [DoesNotReturn] + public static void ThrowDeserializeObjectIsNull(string target) + { + throw new MemoryPackSerializationException($"Deserialized {target} is null."); + } + + [DoesNotReturn] + public static void ThrowFailedEncoding(OperationStatus status) + { + throw new MemoryPackSerializationException($"Failed in Utf8 encoding/decoding process, status: {status}."); + } + + [DoesNotReturn] + public static void ThrowCompressionFailed(OperationStatus status) + { + throw new MemoryPackSerializationException($"Failed in Brotli compression/decompression process, status: {status}."); + } + + [DoesNotReturn] + public static void ThrowCompressionFailed() + { + throw new MemoryPackSerializationException($"Failed in Brotli compression/decompression process."); + } + + [DoesNotReturn] + public static void ThrowAlreadyDecompressed() + { + throw new MemoryPackSerializationException($"BrotliDecompressor can not invoke Decompress twice, already invoked."); + } + + [DoesNotReturn] + public static void ThrowDecompressionSizeLimitExceeded(int limit, int size) + { + throw new MemoryPackSerializationException($"In decompress process, limit is {limit} but target size is {size}."); + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs.meta new file mode 100644 index 0000000..738f555 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializationException.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 8591f1e7c0c859a42910d40b48ed19c5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs new file mode 100644 index 0000000..64d9f81 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.Diagnostics.CodeAnalysis; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack { + +public static partial class MemoryPackSerializer +{ + [ThreadStatic] + static MemoryPackReaderOptionalState? threadStaticReaderOptionalState; + + public static T? Deserialize(ReadOnlySpan buffer, MemoryPackSerializerOptions? options = default) + { + T? value = default; + Deserialize(buffer, ref value, options); + return value; + } + + public static int Deserialize(ReadOnlySpan buffer, ref T? value, MemoryPackSerializerOptions? options = default) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + if (buffer.Length < Unsafe.SizeOf()) + { + MemoryPackSerializationException.ThrowInvalidRange(Unsafe.SizeOf(), buffer.Length); + } + value = Unsafe.ReadUnaligned(ref MemoryMarshal.GetReference(buffer)); + return Unsafe.SizeOf(); + } + + var state = threadStaticReaderOptionalState; + if (state == null) + { + state = threadStaticReaderOptionalState = new MemoryPackReaderOptionalState(); + } + state.Init(options); + + var reader = new MemoryPackReader(buffer, state); + try + { + reader.ReadValue(ref value); + return reader.Consumed; + } + finally + { + reader.Dispose(); + state.Reset(); + } + } + + public static T? Deserialize(in ReadOnlySequence buffer, MemoryPackSerializerOptions? options = default) + { + T? value = default; + Deserialize(buffer, ref value); + return value; + } + + public static int Deserialize(in ReadOnlySequence buffer, ref T? value, MemoryPackSerializerOptions? options = default) + { + var state = threadStaticReaderOptionalState; + if (state == null) + { + state = threadStaticReaderOptionalState = new MemoryPackReaderOptionalState(); + } + state.Init(options); + + var reader = new MemoryPackReader(buffer, state); + try + { + reader.ReadValue(ref value); + return reader.Consumed; + } + finally + { + reader.Dispose(); + state.Reset(); + } + } + + public static async ValueTask DeserializeAsync(Stream stream, MemoryPackSerializerOptions? options = default, CancellationToken cancellationToken = default) + { + if (stream is MemoryStream ms && ms.TryGetBuffer(out ArraySegment streamBuffer)) + { + cancellationToken.ThrowIfCancellationRequested(); + T? value = default; + var bytesRead = Deserialize(streamBuffer.AsSpan(checked((int)ms.Position)), ref value, options); + + // Emulate that we had actually "read" from the stream. + ms.Seek(bytesRead, SeekOrigin.Current); + + return value; + } + + var builder = ReusableReadOnlySequenceBuilderPool.Rent(); + try + { + var buffer = ArrayPool.Shared.Rent(65536); // initial 64K + var offset = 0; + do + { + if (offset == buffer.Length) + { + builder.Add(buffer, returnToPool: true); + buffer = ArrayPool.Shared.Rent(MathEx.NewArrayCapacity(buffer.Length)); + offset = 0; + } + + int read = 0; + try + { + read = await stream.ReadAsync(buffer.AsMemory(offset, buffer.Length - offset), cancellationToken).ConfigureAwait(false); + } + catch + { + // buffer is not added in builder, so return here. + ArrayPool.Shared.Return(buffer); + throw; + } + + offset += read; + + if (read == 0) + { + builder.Add(buffer.AsMemory(0, offset), returnToPool: true); + break; + + } + } while (true); + + // If single buffer, we can avoid ReadOnlySequence build cost. + if (builder.TryGetSingleMemory(out var memory)) + { + return Deserialize(memory.Span, options); + } + else + { + var seq = builder.Build(); + var result = Deserialize(seq, options); + return result; + } + } + finally + { + builder.Reset(); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs.meta new file mode 100644 index 0000000..bbeeb3d --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Deserialize.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e69bbb05f943a6b4281b6f289017c864 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs new file mode 100644 index 0000000..94a396e --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs @@ -0,0 +1,244 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack { + +public static partial class MemoryPackSerializer +{ + // Serialize + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static byte[] Serialize(Type type, object? value, MemoryPackSerializerOptions? options = default) + { + var state = threadStaticState; + if (state == null) + { + state = threadStaticState = new SerializerWriterThreadStaticState(); + } + state.Init(options); + + try + { + var writer = new MemoryPackWriter(ref Unsafe.As>(ref state.BufferWriter), state.BufferWriter.DangerousGetFirstBuffer(), state.OptionalState); + Serialize(type, ref writer, value); + return state.BufferWriter.ToArrayAndReset(); + } + finally + { + state.Reset(); + } + } + + public static unsafe void Serialize(Type type, in IBufferWriter bufferWriter, object? value, MemoryPackSerializerOptions? options = default) +#if NET7_0_OR_GREATER + +#else + +#endif + { + var state = threadStaticWriterOptionalState; + if (state == null) + { + state = threadStaticWriterOptionalState = new MemoryPackWriterOptionalState(); + } + state.Init(options); + + try + { + var writer = new MemoryPackWriter(ref Unsafe.AsRef(bufferWriter), state); + Serialize(type, ref writer, value); + } + finally + { + state.Reset(); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Serialize(Type type, ref MemoryPackWriter writer, object? value) +#if NET7_0_OR_GREATER + +#else + +#endif + { + writer.GetFormatter(type).Serialize(ref writer, ref value); + writer.Flush(); + } + + public static async ValueTask SerializeAsync(Type type, Stream stream, object? value, MemoryPackSerializerOptions? options = default, CancellationToken cancellationToken = default) + { + var tempWriter = ReusableLinkedArrayBufferWriterPool.Rent(); + try + { + SerializeToTempWriter(tempWriter, type, value, options); + await tempWriter.WriteToAndResetAsync(stream, cancellationToken).ConfigureAwait(false); + } + finally + { + ReusableLinkedArrayBufferWriterPool.Return(tempWriter); + } + } + + static void SerializeToTempWriter(ReusableLinkedArrayBufferWriter bufferWriter, Type type, object? value, MemoryPackSerializerOptions? options) + { + var state = threadStaticWriterOptionalState; + if (state == null) + { + state = threadStaticWriterOptionalState = new MemoryPackWriterOptionalState(); + } + state.Init(options); + + var writer = new MemoryPackWriter(ref Unsafe.As>(ref bufferWriter), state); + + try + { + Serialize(type, ref writer, value); + } + finally + { + state.Reset(); + } + } + + // Deserialize + + public static object? Deserialize(Type type, ReadOnlySpan buffer, MemoryPackSerializerOptions? options = default) + { + object? value = default; + Deserialize(type, buffer, ref value, options); + return value; + } + + public static int Deserialize(Type type, ReadOnlySpan buffer, ref object? value, MemoryPackSerializerOptions? options = default) + { + var state = threadStaticReaderOptionalState; + if (state == null) + { + state = threadStaticReaderOptionalState = new MemoryPackReaderOptionalState(); + } + state.Init(options); + + var reader = new MemoryPackReader(buffer, state); + try + { + reader.GetFormatter(type).Deserialize(ref reader, ref value); + return reader.Consumed; + } + finally + { + reader.Dispose(); + state.Reset(); + } + } + + public static object? Deserialize(Type type, in ReadOnlySequence buffer, MemoryPackSerializerOptions? options = default) + { + object? value = default; + Deserialize(type, buffer, ref value, options); + return value; + } + + public static int Deserialize(Type type, in ReadOnlySequence buffer, ref object? value, MemoryPackSerializerOptions? options = default) + { + var state = threadStaticReaderOptionalState; + if (state == null) + { + state = threadStaticReaderOptionalState = new MemoryPackReaderOptionalState(); + } + state.Init(options); + + var reader = new MemoryPackReader(buffer, state); + try + { + reader.GetFormatter(type).Deserialize(ref reader, ref value); + return reader.Consumed; + } + finally + { + reader.Dispose(); + state.Reset(); + } + } + + public static async ValueTask DeserializeAsync(Type type, Stream stream, MemoryPackSerializerOptions? options = default, CancellationToken cancellationToken = default) + { + if (stream is MemoryStream ms && ms.TryGetBuffer(out ArraySegment streamBuffer)) + { + cancellationToken.ThrowIfCancellationRequested(); + object? value = default; + var bytesRead = Deserialize(type, streamBuffer.AsSpan(checked((int)ms.Position)), ref value, options); + + // Emulate that we had actually "read" from the stream. + ms.Seek(bytesRead, SeekOrigin.Current); + + return value; + } + + var builder = ReusableReadOnlySequenceBuilderPool.Rent(); + try + { + var buffer = ArrayPool.Shared.Rent(65536); // initial 64K + var offset = 0; + do + { + if (offset == buffer.Length) + { + builder.Add(buffer, returnToPool: true); + buffer = ArrayPool.Shared.Rent(MathEx.NewArrayCapacity(buffer.Length)); + offset = 0; + } + + int read = 0; + try + { + read = await stream.ReadAsync(buffer.AsMemory(offset, buffer.Length - offset), cancellationToken).ConfigureAwait(false); + } + catch + { + // buffer is not added in builder, so return here. + ArrayPool.Shared.Return(buffer); + throw; + } + + offset += read; + + if (read == 0) + { + builder.Add(buffer.AsMemory(0, offset), returnToPool: true); + break; + + } + } while (true); + + // If single buffer, we can avoid ReadOnlySequence build cost. + if (builder.TryGetSingleMemory(out var memory)) + { + return Deserialize(type, memory.Span, options); + } + else + { + var seq = builder.Build(); + var result = Deserialize(type, seq, options); + return result; + } + } + finally + { + builder.Reset(); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs.meta new file mode 100644 index 0000000..89581e2 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.NonGenerics.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6b6c145f5b998ff40b7cf2ee834dba62 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs new file mode 100644 index 0000000..0f5b483 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs @@ -0,0 +1,213 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using MemoryPack.Internal; +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack { + +#if NET7_0_OR_GREATER +using static MemoryMarshal; +using static GC; +#else +using static MemoryPack.Internal.MemoryMarshalEx; +#endif + +public static partial class MemoryPackSerializer +{ + [ThreadStatic] + static SerializerWriterThreadStaticState? threadStaticState; + [ThreadStatic] + static MemoryPackWriterOptionalState? threadStaticWriterOptionalState; + + public static byte[] Serialize(in T? value, MemoryPackSerializerOptions? options = default) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var array = AllocateUninitializedArray(Unsafe.SizeOf()); + Unsafe.WriteUnaligned(ref GetArrayDataReference(array), value); + return array; + } +#if NET7_0_OR_GREATER + var typeKind = TypeHelpers.TryGetUnmanagedSZArrayElementSizeOrMemoryPackableFixedSize(out var elementSize); + if (typeKind == TypeHelpers.TypeKind.None) + { + // do nothing + } + else if (typeKind == TypeHelpers.TypeKind.UnmanagedSZArray) + { + if (value == null) + { + return MemoryPackCode.NullCollectionData.ToArray(); + } + + var srcArray = ((Array)(object)value!); + var length = srcArray.Length; + if (length == 0) + { + return new byte[4] { 0, 0, 0, 0 }; + } + + var dataSize = elementSize * length; + var destArray = AllocateUninitializedArray(dataSize + 4); + ref var head = ref MemoryMarshal.GetArrayDataReference(destArray); + + Unsafe.WriteUnaligned(ref head, length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref head, 4), ref MemoryMarshal.GetArrayDataReference(srcArray), (uint)dataSize); + + return destArray; + } + else if (typeKind == TypeHelpers.TypeKind.FixedSizeMemoryPackable) + { + var buffer = new byte[(value == null) ? 1 : elementSize]; + var bufferWriter = new FixedArrayBufferWriter(buffer); + var writer = new MemoryPackWriter(ref bufferWriter, buffer, MemoryPackWriterOptionalState.NullState); + Serialize(ref writer, value); + return bufferWriter.GetFilledBuffer(); + } +#endif + + var state = threadStaticState; + if (state == null) + { + state = threadStaticState = new SerializerWriterThreadStaticState(); + } + state.Init(options); + + try + { + var writer = new MemoryPackWriter(ref Unsafe.As>(ref state.BufferWriter), state.BufferWriter.DangerousGetFirstBuffer(), state.OptionalState); + Serialize(ref writer, value); + return state.BufferWriter.ToArrayAndReset(); + } + finally + { + state.Reset(); + } + } + + public static unsafe void Serialize(in IBufferWriter bufferWriter, in T? value, MemoryPackSerializerOptions? options = default) +#if NET7_0_OR_GREATER + +#else + +#endif + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var buffer = bufferWriter.GetSpan(Unsafe.SizeOf()); + Unsafe.WriteUnaligned(ref MemoryMarshal.GetReference(buffer), value); + bufferWriter.Advance(Unsafe.SizeOf()); + return; + } +#if NET7_0_OR_GREATER + var typeKind = TypeHelpers.TryGetUnmanagedSZArrayElementSizeOrMemoryPackableFixedSize(out var elementSize); + if (typeKind == TypeHelpers.TypeKind.UnmanagedSZArray) + { + if (value == null) + { + var span = bufferWriter.GetSpan(4); + MemoryPackCode.NullCollectionData.CopyTo(span); + bufferWriter.Advance(4); + return; + } + + var srcArray = ((Array)(object)value!); + var length = srcArray.Length; + if (length == 0) + { + var span = bufferWriter.GetSpan(4); + MemoryPackCode.ZeroCollectionData.CopyTo(span); + bufferWriter.Advance(4); + return; + } + var dataSize = elementSize * length; + var destSpan = bufferWriter.GetSpan(dataSize + 4); + ref var head = ref MemoryMarshal.GetReference(destSpan); + + Unsafe.WriteUnaligned(ref head, length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref head, 4), ref MemoryMarshal.GetArrayDataReference(srcArray), (uint)dataSize); + + bufferWriter.Advance(dataSize + 4); + return; + } +#endif + + var state = threadStaticWriterOptionalState; + if (state == null) + { + state = threadStaticWriterOptionalState = new MemoryPackWriterOptionalState(); + } + state.Init(options); + + try + { + var writer = new MemoryPackWriter(ref Unsafe.AsRef(bufferWriter), state); + Serialize(ref writer, value); + } + finally + { + state.Reset(); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static void Serialize(ref MemoryPackWriter writer, in T? value) +#if NET7_0_OR_GREATER + +#else + +#endif + { + writer.WriteValue(value); + writer.Flush(); + } + + public static async ValueTask SerializeAsync(Stream stream, T? value, MemoryPackSerializerOptions? options = default, CancellationToken cancellationToken = default) + { + var tempWriter = ReusableLinkedArrayBufferWriterPool.Rent(); + try + { + Serialize(tempWriter, value, options); + await tempWriter.WriteToAndResetAsync(stream, cancellationToken).ConfigureAwait(false); + await stream.FlushAsync(cancellationToken).ConfigureAwait(false); + } + finally + { + ReusableLinkedArrayBufferWriterPool.Return(tempWriter); + } + } + + sealed class SerializerWriterThreadStaticState + { + public ReusableLinkedArrayBufferWriter BufferWriter; + public MemoryPackWriterOptionalState OptionalState; + + public SerializerWriterThreadStaticState() + { + BufferWriter = new ReusableLinkedArrayBufferWriter(useFirstBuffer: true, pinned: true); + OptionalState = new MemoryPackWriterOptionalState(); + } + + public void Init(MemoryPackSerializerOptions? options) + { + OptionalState.Init(options); + } + + public void Reset() + { + BufferWriter.Reset(); + OptionalState.Reset(); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs.meta new file mode 100644 index 0000000..e79a9f7 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializer.Serialize.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 3a26d6b30a51949459998c7c3ce820c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs new file mode 100644 index 0000000..54514f1 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +namespace MemoryPack +{ + public record MemoryPackSerializerOptions + { + // Default is Utf8 + public static readonly MemoryPackSerializerOptions Default = new MemoryPackSerializerOptions { StringEncoding = StringEncoding.Utf8 }; + + public static readonly MemoryPackSerializerOptions Utf8 = Default with { StringEncoding = StringEncoding.Utf8 }; + public static readonly MemoryPackSerializerOptions Utf16 = Default with { StringEncoding = StringEncoding.Utf16 }; + + public StringEncoding StringEncoding { get; init; } + public IServiceProvider? ServiceProvider { get; init; } + } + + public enum StringEncoding : byte + { + Utf16, + Utf8, + } +} + +#if !NET5_0_OR_GREATER + +namespace System.Runtime.CompilerServices +{ + internal sealed class IsExternalInit + { + } +} + +#endif diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs.meta new file mode 100644 index 0000000..0b7b43c --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackSerializerOptions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d62e6c3f830e86d4d81a5c67669f2e0c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs new file mode 100644 index 0000000..af74520 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs @@ -0,0 +1,1250 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace MemoryPack { + +public ref partial struct MemoryPackWriter +{ + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1) + where T1 : unmanaged + { + var size = Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1) + where T1 : unmanaged + { + var size = Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2) + where T1 : unmanaged + where T2 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2) + where T1 : unmanaged + where T2 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value13); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + where T14 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value14); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + where T14 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value14); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14, in T15 value15) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + where T14 : unmanaged + where T15 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value14); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value15); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14, in T15 value15) + where T1 : unmanaged + where T2 : unmanaged + where T3 : unmanaged + where T4 : unmanaged + where T5 : unmanaged + where T6 : unmanaged + where T7 : unmanaged + where T8 : unmanaged + where T9 : unmanaged + where T10 : unmanaged + where T11 : unmanaged + where T12 : unmanaged + where T13 : unmanaged + where T14 : unmanaged + where T15 : unmanaged + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value14); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value15); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1) + { + var size = Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1) + { + var size = Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value13); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value14); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value14); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanaged(in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14, in T15 value15) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf(); + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf()), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf()), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value14); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf()), value15); + Advance(size); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedWithObjectHeader(byte propertyCount, in T1 value1, in T2 value2, in T3 value3, in T4 value4, in T5 value5, in T6 value6, in T7 value7, in T8 value8, in T9 value9, in T10 value10, in T11 value11, in T12 value12, in T13 value13, in T14 value14, in T15 value15) + { + var size = Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1; + ref var spanRef = ref GetSpanReference(size); + Unsafe.WriteUnaligned(ref spanRef, propertyCount); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), value1); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + 1), value2); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value3); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value4); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value5); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value6); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value7); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value8); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value9); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value10); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value11); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value12); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value13); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value14); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + Unsafe.SizeOf() + 1), value15); + Advance(size); + } + +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs.meta new file mode 100644 index 0000000..bceb91e --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.Unmanaged.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 6798d0fa4e0103a49a13a1ea087594d6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs new file mode 100644 index 0000000..ae7f1c0 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs @@ -0,0 +1,715 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Buffers; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +#if NET7_0_OR_GREATER +using System.Text.Unicode; +#endif + +namespace MemoryPack { + +#if NET7_0_OR_GREATER +using static MemoryMarshal; +#else +using static MemoryPack.Internal.MemoryMarshalEx; +#endif + +[StructLayout(LayoutKind.Auto)] +public ref partial struct MemoryPackWriter +#if NET7_0_OR_GREATER + +#else + +#endif +{ + const int DepthLimit = 1000; + +#if NET7_0_OR_GREATER + ref IBufferWriter bufferWriter; + ref byte bufferReference; +#else + IBufferWriter bufferWriter; + Span bufferReference; +#endif + int bufferLength; + int advancedCount; + int depth; // check recursive serialize + int writtenCount; + readonly bool serializeStringAsUtf8; + readonly MemoryPackWriterOptionalState optionalState; + + public int WrittenCount => writtenCount; + public int BufferLength => bufferLength; + public MemoryPackWriterOptionalState OptionalState => optionalState; + public MemoryPackSerializerOptions Options => optionalState.Options; + + public MemoryPackWriter(ref IBufferWriter writer, MemoryPackWriterOptionalState optionalState) + { +#if NET7_0_OR_GREATER + this.bufferWriter = ref writer; + this.bufferReference = ref Unsafe.NullRef(); +#else + this.bufferWriter = writer; + this.bufferReference = default; +#endif + this.bufferLength = 0; + this.advancedCount = 0; + this.writtenCount = 0; + this.depth = 0; + this.serializeStringAsUtf8 = optionalState.Options.StringEncoding == StringEncoding.Utf8; + this.optionalState = optionalState; + } + + // optimized ctor, avoid first GetSpan call if we can. + public MemoryPackWriter(ref IBufferWriter writer, byte[] firstBufferOfWriter, MemoryPackWriterOptionalState optionalState) + { +#if NET7_0_OR_GREATER + this.bufferWriter = ref writer; + this.bufferReference = ref GetArrayDataReference(firstBufferOfWriter); +#else + this.bufferWriter = writer; + this.bufferReference = firstBufferOfWriter.AsSpan(); +#endif + this.bufferLength = firstBufferOfWriter.Length; + this.advancedCount = 0; + this.writtenCount = 0; + this.depth = 0; + this.serializeStringAsUtf8 = optionalState.Options.StringEncoding == StringEncoding.Utf8; + this.optionalState = optionalState; + } + + public MemoryPackWriter(ref IBufferWriter writer, Span firstBufferOfWriter, MemoryPackWriterOptionalState optionalState) + { +#if NET7_0_OR_GREATER + this.bufferWriter = ref writer; + this.bufferReference = ref MemoryMarshal.GetReference(firstBufferOfWriter); +#else + this.bufferWriter = writer; + this.bufferReference = firstBufferOfWriter; +#endif + this.bufferLength = firstBufferOfWriter.Length; + this.advancedCount = 0; + this.writtenCount = 0; + this.depth = 0; + this.serializeStringAsUtf8 = optionalState.Options.StringEncoding == StringEncoding.Utf8; + this.optionalState = optionalState; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public ref byte GetSpanReference(int sizeHint) + { + if (bufferLength < sizeHint) + { + RequestNewBuffer(sizeHint); + } + +#if NET7_0_OR_GREATER + return ref bufferReference; +#else + return ref MemoryMarshal.GetReference(bufferReference); +#endif + } + + [MethodImpl(MethodImplOptions.NoInlining)] + void RequestNewBuffer(int sizeHint) + { + if (advancedCount != 0) + { + bufferWriter.Advance(advancedCount); + advancedCount = 0; + } + var span = bufferWriter.GetSpan(sizeHint); +#if NET7_0_OR_GREATER + bufferReference = ref MemoryMarshal.GetReference(span); +#else + bufferReference = span; +#endif + bufferLength = span.Length; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Advance(int count) + { + if (count == 0) return; + + var rest = bufferLength - count; + if (rest < 0) + { + MemoryPackSerializationException.ThrowInvalidAdvance(); + } + + bufferLength = rest; +#if NET7_0_OR_GREATER + bufferReference = ref Unsafe.Add(ref bufferReference, count); +#else + bufferReference = bufferReference.Slice(count); +#endif + advancedCount += count; + writtenCount += count; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Flush() + { + if (advancedCount != 0) + { + bufferWriter.Advance(advancedCount); + advancedCount = 0; + } +#if NET7_0_OR_GREATER + bufferReference = ref Unsafe.NullRef(); +#else + bufferReference = default; +#endif + bufferLength = 0; + writtenCount = 0; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public IMemoryPackFormatter GetFormatter(Type type) + { + return MemoryPackFormatterProvider.GetFormatter(type); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public IMemoryPackFormatter GetFormatter() + { + return MemoryPackFormatterProvider.GetFormatter(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int GetStringWriteLength(string? value) + { + if (value == null || value.Length == 0) + { + return 4; + } + + if (serializeStringAsUtf8) + { + return Encoding.UTF8.GetByteCount(value) + 8; + } + else + { + return checked(value.Length * 2) + 4; + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public int GetUnmanageArrayWriteLength(T[]? value) + where T : unmanaged + { + if (value == null || value.Length == 0) + { + return 4; + } + + return (Unsafe.SizeOf() * value.Length) + 4; + } + + // Write methods + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteObjectHeader(byte memberCount) + { + if (memberCount >= MemoryPackCode.Reserved1) + { + MemoryPackSerializationException.ThrowWriteInvalidMemberCount(memberCount); + } + GetSpanReference(1) = memberCount; + Advance(1); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteNullObjectHeader() + { + GetSpanReference(1) = MemoryPackCode.NullObject; + Advance(1); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteObjectReferenceId(uint referenceId) + { + GetSpanReference(1) = MemoryPackCode.ReferenceId; + Advance(1); + WriteVarInt(referenceId); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnionHeader(ushort tag) + { + if (tag < MemoryPackCode.WideTag) + { + GetSpanReference(1) = (byte)tag; + Advance(1); + } + else + { + ref var spanRef = ref GetSpanReference(3); + Unsafe.WriteUnaligned(ref spanRef, MemoryPackCode.WideTag); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref spanRef, 1), tag); + Advance(3); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteNullUnionHeader() + { + WriteNullObjectHeader(); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteCollectionHeader(int length) + { + Unsafe.WriteUnaligned(ref GetSpanReference(4), length); + Advance(4); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteNullCollectionHeader() + { + Unsafe.WriteUnaligned(ref GetSpanReference(4), MemoryPackCode.NullCollection); + Advance(4); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteString(string? value) + { + if (serializeStringAsUtf8) + { + WriteUtf8(value); + } + else + { + WriteUtf16(value); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUtf16(string? value) + { + if (value == null) + { + WriteNullCollectionHeader(); + return; + } + + if (value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + var copyByteCount = checked(value.Length * 2); + + ref var dest = ref GetSpanReference(copyByteCount + 4); + Unsafe.WriteUnaligned(ref dest, value.Length); + +#if NET7_0_OR_GREATER + ref var src = ref Unsafe.As(ref Unsafe.AsRef(value.GetPinnableReference())); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)copyByteCount); +#else + MemoryMarshal.AsBytes(value.AsSpan()).CopyTo(MemoryMarshal.CreateSpan(ref Unsafe.Add(ref dest, 4), copyByteCount)); +#endif + + Advance(copyByteCount + 4); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUtf16(ReadOnlySpan value) + { + if (value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + var copyByteCount = checked(value.Length * 2); + + ref var dest = ref GetSpanReference(copyByteCount + 4); + Unsafe.WriteUnaligned(ref dest, value.Length); + MemoryMarshal.AsBytes(value).CopyTo(MemoryMarshal.CreateSpan(ref Unsafe.Add(ref dest, 4), copyByteCount)); + Advance(copyByteCount + 4); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUtf8(string? value) + { + if (value == null) + { + WriteNullCollectionHeader(); + return; + } + + if (value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + // (int ~utf8-byte-count, int utf16-length, utf8-bytes) + + var source = value.AsSpan(); + + // UTF8.GetMaxByteCount -> (length + 1) * 3 + var maxByteCount = (source.Length + 1) * 3; + + ref var destPointer = ref GetSpanReference(maxByteCount + 8); // header + + // write utf16-length + Unsafe.WriteUnaligned(ref Unsafe.Add(ref destPointer, 4), source.Length); + + var dest = MemoryMarshal.CreateSpan(ref Unsafe.Add(ref destPointer, 8), maxByteCount); +#if NET7_0_OR_GREATER + var status = Utf8.FromUtf16(source, dest, out var _, out var bytesWritten, replaceInvalidSequences: false); + if (status != OperationStatus.Done) + { + MemoryPackSerializationException.ThrowFailedEncoding(status); + } +#else + var bytesWritten = Encoding.UTF8.GetBytes(value, dest); +#endif + + // write written utf8-length in header, that is ~length + Unsafe.WriteUnaligned(ref destPointer, ~bytesWritten); + Advance(bytesWritten + 8); // + header + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUtf8(ReadOnlySpan utf8Value, int utf16Length = -1) + { + if (utf8Value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + // (int ~utf8-byte-count, int utf16-length, utf8-bytes) + + ref var destPointer = ref GetSpanReference(utf8Value.Length + 8); // header + + Unsafe.WriteUnaligned(ref destPointer, ~utf8Value.Length); + Unsafe.WriteUnaligned(ref Unsafe.Add(ref destPointer, 4), utf16Length); + + var dest = MemoryMarshal.CreateSpan(ref Unsafe.Add(ref destPointer, 8), utf8Value.Length); + utf8Value.CopyTo(dest); + + Advance(utf8Value.Length + 8); + } + +#if NET7_0_OR_GREATER + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WritePackable(in T? value) + where T : IMemoryPackable + { + depth++; + if (depth == DepthLimit) MemoryPackSerializationException.ThrowReachedDepthLimit(typeof(T)); + T.Serialize(ref this, ref Unsafe.AsRef(value)); + depth--; + } + +#else + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WritePackable(in T? value) + where T : IMemoryPackable + { + WriteValue(value); + } + +#endif + + // non packable, get formatter dynamically. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteValue(in T? value) + { + depth++; + if (depth == DepthLimit) MemoryPackSerializationException.ThrowReachedDepthLimit(typeof(T)); + GetFormatter().Serialize(ref this, ref Unsafe.AsRef(value)); + depth--; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteValue(Type type, object? value) + { + depth++; + if (depth == DepthLimit) MemoryPackSerializationException.ThrowReachedDepthLimit(type); + GetFormatter(type).Serialize(ref this, ref value); + depth--; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteValueWithFormatter(TFormatter formatter, in T? value) + where TFormatter : IMemoryPackFormatter + { + depth++; + formatter.Serialize(ref this, ref Unsafe.AsRef(value)); + depth--; + } + + #region WriteArray/Span + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteArray(T?[]? value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousWriteUnmanagedArray(value); + return; + } + + if (value == null) + { + WriteNullCollectionHeader(); + return; + } + + var formatter = GetFormatter(); + WriteCollectionHeader(value.Length); + for (int i = 0; i < value.Length; i++) + { + formatter.Serialize(ref this, ref value[i]); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteSpan(Span value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousWriteUnmanagedSpan(value); + return; + } + + var formatter = GetFormatter(); + WriteCollectionHeader(value.Length); + for (int i = 0; i < value.Length; i++) + { + formatter.Serialize(ref this, ref value[i]); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteSpan(ReadOnlySpan value) + { + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousWriteUnmanagedSpan(value); + return; + } + + var formatter = GetFormatter(); + WriteCollectionHeader(value.Length); + for (int i = 0; i < value.Length; i++) + { + formatter.Serialize(ref this, ref Unsafe.AsRef(value[i])); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WritePackableArray(T?[]? value) + where T : IMemoryPackable + { +#if !NET7_0_OR_GREATER + WriteArray(value); + return; +#else + + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousWriteUnmanagedArray(value); + return; + } + + if (value == null) + { + WriteNullCollectionHeader(); + return; + } + + WriteCollectionHeader(value.Length); + for (int i = 0; i < value.Length; i++) + { + T.Serialize(ref this, ref value[i]); + } +#endif + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WritePackableSpan(Span value) + where T : IMemoryPackable + { +#if !NET7_0_OR_GREATER + WriteSpan(value); + return; +#else + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousWriteUnmanagedSpan(value); + return; + } + + WriteCollectionHeader(value.Length); + for (int i = 0; i < value.Length; i++) + { + T.Serialize(ref this, ref value[i]); + } +#endif + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WritePackableSpan(ReadOnlySpan value) + where T : IMemoryPackable + { +#if !NET7_0_OR_GREATER + WriteSpan(value); + return; +#else + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + DangerousWriteUnmanagedSpan(value); + return; + } + + WriteCollectionHeader(value.Length); + for (int i = 0; i < value.Length; i++) + { + T.Serialize(ref this, ref Unsafe.AsRef(value[i])); + } +#endif + } + + #endregion + + #region WriteUnmanagedArray/Span + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedArray(T[]? value) + where T : unmanaged + { + DangerousWriteUnmanagedArray(value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedSpan(Span value) + where T : unmanaged + { + DangerousWriteUnmanagedSpan(value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteUnmanagedSpan(ReadOnlySpan value) + where T : unmanaged + { + DangerousWriteUnmanagedSpan(value); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedArray(T[]? value) + { + if (value == null) + { + WriteNullCollectionHeader(); + return; + } + if (value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + var srcLength = Unsafe.SizeOf() * value.Length; + var allocSize = srcLength + 4; + + ref var dest = ref GetSpanReference(allocSize); + ref var src = ref Unsafe.As(ref GetArrayDataReference(value)); + + Unsafe.WriteUnaligned(ref dest, value.Length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)srcLength); + + Advance(allocSize); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedSpan(Span value) + { + if (value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + var srcLength = Unsafe.SizeOf() * value.Length; + var allocSize = srcLength + 4; + + ref var dest = ref GetSpanReference(allocSize); + ref var src = ref Unsafe.As(ref MemoryMarshal.GetReference(value)); + + Unsafe.WriteUnaligned(ref dest, value.Length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)srcLength); + + Advance(allocSize); + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void DangerousWriteUnmanagedSpan(ReadOnlySpan value) + { + if (value.Length == 0) + { + WriteCollectionHeader(0); + return; + } + + var srcLength = Unsafe.SizeOf() * value.Length; + var allocSize = srcLength + 4; + + ref var dest = ref GetSpanReference(allocSize); + ref var src = ref Unsafe.As(ref MemoryMarshal.GetReference(value)); + + Unsafe.WriteUnaligned(ref dest, value.Length); + Unsafe.CopyBlockUnaligned(ref Unsafe.Add(ref dest, 4), ref src, (uint)srcLength); + + Advance(allocSize); + } + + #endregion + + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void WriteSpanWithoutLengthHeader(ReadOnlySpan value) + { + if (value.Length == 0) return; + + if (!RuntimeHelpers.IsReferenceOrContainsReferences()) + { + var srcLength = Unsafe.SizeOf() * value.Length; + ref var dest = ref GetSpanReference(srcLength); + ref var src = ref Unsafe.As(ref MemoryMarshal.GetReference(value)!); + + Unsafe.CopyBlockUnaligned(ref dest, ref src, (uint)srcLength); + + Advance(srcLength); + return; + } + else + { + var formatter = GetFormatter(); + for (int i = 0; i < value.Length; i++) + { + formatter.Serialize(ref this, ref Unsafe.AsRef(value[i])); + } + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs.meta new file mode 100644 index 0000000..4617f29 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriter.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 694e1cfc99967af499c579224bd74f41 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs new file mode 100644 index 0000000..b7cb713 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs @@ -0,0 +1,122 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; + +#nullable enable +using System.Collections.Concurrent; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Security; + +namespace MemoryPack { + +public static class MemoryPackWriterOptionalStatePool +{ + static readonly ConcurrentQueue queue = new ConcurrentQueue(); + + public static MemoryPackWriterOptionalState Rent(MemoryPackSerializerOptions? options) + { + if (!queue.TryDequeue(out var state)) + { + state = new MemoryPackWriterOptionalState(); + } + + state.Init(options); + return state; + } + + internal static void Return(MemoryPackWriterOptionalState state) + { + state.Reset(); + queue.Enqueue(state); + } +} + +public sealed class MemoryPackWriterOptionalState : IDisposable +{ + internal static readonly MemoryPackWriterOptionalState NullState = new MemoryPackWriterOptionalState(true); + + uint nextId; + readonly Dictionary objectToRef; + + public MemoryPackSerializerOptions Options { get; private set; } + + internal MemoryPackWriterOptionalState() + { + objectToRef = new Dictionary(ReferenceEqualityComparer.Instance); + Options = null!; + nextId = 0; + } + + MemoryPackWriterOptionalState(bool _) + { + objectToRef = null!; + Options = MemoryPackSerializerOptions.Default; + nextId = 0; + } + + internal void Init(MemoryPackSerializerOptions? options) + { + Options = options ?? MemoryPackSerializerOptions.Default; + } + + public void Reset() + { + objectToRef.Clear(); + Options = null!; + nextId = 0; + } + + public (bool existsReference, uint id) GetOrAddReference(object value) + { +#if NET7_0_OR_GREATER + ref var id = ref CollectionsMarshal.GetValueRefOrAddDefault(objectToRef, value, out var exists); + if (exists) + { + return (true, id); + } + else + { + id = nextId++; + return (false, id); + } +#else + if (objectToRef.TryGetValue(value, out var id)) + { + return (true, id); + } + else + { + id = nextId++; + objectToRef.Add(value, id); + return (false, id); + } +#endif + } + + void IDisposable.Dispose() + { + MemoryPackWriterOptionalStatePool.Return(this); + } + + // ReferenceEqualityComparer is exsits in .NET 6 but NetStandard 2.1 does not. + sealed class ReferenceEqualityComparer : IEqualityComparer + { + ReferenceEqualityComparer() { } + + public static ReferenceEqualityComparer Instance { get; } = new ReferenceEqualityComparer(); + + public new bool Equals(object? x, object? y) => ReferenceEquals(x, y); + + public int GetHashCode(object obj) + { + return RuntimeHelpers.GetHashCode(obj); + } + } +} + +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs.meta new file mode 100644 index 0000000..e7e2e00 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Core/MemoryPackWriterOptionalState.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: b9d13eff4e4acac42a411940227fc067 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator.meta new file mode 100644 index 0000000..e7f255b --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 69d1b7132416057419b14c9a822367f1 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Generator/MemoryPack.Generator.Roslyn3.dll new file mode 100644 index 0000000000000000000000000000000000000000..50a20fe20734143b7bbdc20f247ddf9ff1b97835 GIT binary patch literal 122368 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%0A`CkdW|(J*%O`NhZPmja0V_wg0n4; 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 f() + where T : unmanaged + { + Register(new UnmanagedFormatter()); + Register(new UnmanagedArrayFormatter()); + Register(new ListFormatter()); + Register(new NullableFormatter()); + } + + static partial void RegisterInitialFormatters() + { + // struct + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + Register(new UnmanagedFormatter()); + UnityRegister(); + UnityRegister(); + UnityRegister(); + Register(new UnmanagedFormatter()); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + UnityRegister(); + + // class + if (!IsRegistered()) + { + Register(new AnimationCurveFormatter()); + Register(new ArrayFormatter()); + Register(new ListFormatter()); + } + if (!IsRegistered()) + { + Register(new GradientFormatter()); + Register(new ArrayFormatter()); + Register(new ListFormatter()); + } + if (!IsRegistered()) + { + Register(new RectOffsetFormatter()); + Register(new ArrayFormatter()); + Register(new ListFormatter()); + } + } + } +} diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/ProviderInitializer.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/ProviderInitializer.cs.meta new file mode 100644 index 0000000..4cf5ad5 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/ProviderInitializer.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 031150f227b81a94a8fd30bb205ab850 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs new file mode 100644 index 0000000..d7045a3 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs @@ -0,0 +1,134 @@ +#nullable enable + +using MemoryPack.Internal; +using UnityEngine; + +namespace MemoryPack +{ + [Preserve] + internal sealed class AnimationCurveFormatter : MemoryPackFormatter + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref AnimationCurve? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteUnmanagedWithObjectHeader(3, value.@preWrapMode, value.@postWrapMode); + writer.WriteUnmanagedArray(value.@keys); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref AnimationCurve? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 3) MemoryPackSerializationException.ThrowInvalidPropertyCount(3, count); + + reader.ReadUnmanaged(out WrapMode preWrapMode, out WrapMode postWrapMode); + var keys = reader.ReadUnmanagedArray(); + + if (value == null) + { + value = new AnimationCurve(); + } + + value.preWrapMode = preWrapMode; + value.postWrapMode = postWrapMode; + value.keys = keys; + } + } + + [Preserve] + internal sealed class GradientFormatter : MemoryPackFormatter + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref Gradient? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteObjectHeader(3); + writer.WriteUnmanagedArray(value.@colorKeys); + writer.WriteUnmanagedArray(value.@alphaKeys); + writer.WriteUnmanaged(value.@mode); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref Gradient? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 3) MemoryPackSerializationException.ThrowInvalidPropertyCount(3, count); + + var colorKeys = reader.ReadUnmanagedArray(); + var alphaKeys = reader.ReadUnmanagedArray(); + reader.ReadUnmanaged(out GradientMode mode); + + if (value == null) + { + value = new Gradient(); + } + + value.colorKeys = colorKeys; + value.alphaKeys = alphaKeys; + value.mode = mode; + } + } + + [Preserve] + internal sealed class RectOffsetFormatter : MemoryPackFormatter + { + [Preserve] + public override void Serialize(ref MemoryPackWriter writer, ref RectOffset? value) + { + if (value == null) + { + writer.WriteNullObjectHeader(); + return; + } + + writer.WriteUnmanagedWithObjectHeader(4, value.@left, value.@right, value.@top, value.@bottom); + } + + [Preserve] + public override void Deserialize(ref MemoryPackReader reader, ref RectOffset? value) + { + if (!reader.TryReadObjectHeader(out var count)) + { + value = null; + return; + } + + if (count != 4) MemoryPackSerializationException.ThrowInvalidPropertyCount(4, count); + + reader.ReadUnmanaged(out int left, out int right, out int top, out int bottom); + + if (value == null) + { + value = new RectOffset(left, right, top, bottom); + } + else + { + value.left = left; + value.right = right; + value.top = top; + value.bottom = bottom; + } + } + } +} diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs.meta new file mode 100644 index 0000000..f884cff --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.Unity/UnityFormatters.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4e8b601bad4e9394baceb6c8449f22c8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef new file mode 100644 index 0000000..0ea9c23 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef @@ -0,0 +1,16 @@ +{ + "name": "MemoryPack", + "rootNamespace": "MemoryPack", + "references": [], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": true, + "overrideReferences": true, + "precompiledReferences": [ + "System.Runtime.CompilerServices.Unsafe.dll" + ], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef.meta b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef.meta new file mode 100644 index 0000000..ceff0c3 --- /dev/null +++ b/Assets/Plugins/MemoryPack/Runtime/MemoryPack.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 756335c0388f7114790e504ed368ae1d +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/MemoryPack/package.json b/Assets/Plugins/MemoryPack/package.json new file mode 100644 index 0000000..a9701ae --- /dev/null +++ b/Assets/Plugins/MemoryPack/package.json @@ -0,0 +1,12 @@ +{ + "name": "com.cysharp.memorypack", + "displayName": "MemoryPack", + "author": { "name": "Cysharp, Inc.", "url": "https://cysharp.co.jp/en/" }, + "version": "1.10.0", + "unity": "2021.3", + "description": "Zero encoding extreme performance binary serializer for C#.", + "keywords": [ "Serialization" ], + "license": "MIT", + "category": "Scripting", + "dependencies": {} +} diff --git a/Assets/Plugins/MemoryPack/package.json.meta b/Assets/Plugins/MemoryPack/package.json.meta new file mode 100644 index 0000000..dcc74f5 --- /dev/null +++ b/Assets/Plugins/MemoryPack/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6e9131239c37ee8479af2a3e1f79f5d0 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll new file mode 100644 index 0000000000000000000000000000000000000000..491a80a97880de93aa893f6974c5f76891d2de73 GIT binary patch literal 18024 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 + + + + + \ No newline at end of file diff --git a/Assets/packages.config.meta b/Assets/packages.config.meta new file mode 100644 index 0000000..dbfc527 --- /dev/null +++ b/Assets/packages.config.meta @@ -0,0 +1,23 @@ +fileFormatVersion: 2 +guid: bfc17941767c2f84e8d0ba0336841d08 +labels: +- NuGetForUnity +PluginImporter: + externalObjects: {} + serializedVersion: 2 + iconMap: {} + executionOrder: {} + defineConstraints: [] + isPreloaded: 0 + isOverridable: 0 + isExplicitlyReferenced: 0 + validateReferences: 1 + platformData: + - first: + Any: + second: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/manifest.json b/Packages/manifest.json new file mode 100644 index 0000000..9956248 --- /dev/null +++ b/Packages/manifest.json @@ -0,0 +1,41 @@ +{ + "dependencies": { + "com.unity.collab-proxy": "2.2.0", + "com.unity.feature.development": "1.0.1", + "com.unity.textmeshpro": "3.0.6", + "com.unity.timeline": "1.7.6", + "com.unity.ugui": "1.0.0", + "com.unity.visualscripting": "1.9.1", + "com.unity.modules.ai": "1.0.0", + "com.unity.modules.androidjni": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.cloth": "1.0.0", + "com.unity.modules.director": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.physics2d": "1.0.0", + "com.unity.modules.screencapture": "1.0.0", + "com.unity.modules.terrain": "1.0.0", + "com.unity.modules.terrainphysics": "1.0.0", + "com.unity.modules.tilemap": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.uielements": "1.0.0", + "com.unity.modules.umbra": "1.0.0", + "com.unity.modules.unityanalytics": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.unitywebrequesttexture": "1.0.0", + "com.unity.modules.unitywebrequestwww": "1.0.0", + "com.unity.modules.vehicles": "1.0.0", + "com.unity.modules.video": "1.0.0", + "com.unity.modules.vr": "1.0.0", + "com.unity.modules.wind": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } +} diff --git a/Packages/packages-lock.json b/Packages/packages-lock.json new file mode 100644 index 0000000..30e3238 --- /dev/null +++ b/Packages/packages-lock.json @@ -0,0 +1,382 @@ +{ + "dependencies": { + "com.unity.collab-proxy": { + "version": "2.2.0", + "depth": 0, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.cn" + }, + "com.unity.editorcoroutines": { + "version": "1.0.0", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.cn" + }, + "com.unity.ext.nunit": { + "version": "1.0.6", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.cn" + }, + "com.unity.feature.development": { + "version": "1.0.1", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.ide.visualstudio": "2.0.21", + "com.unity.ide.rider": "3.0.25", + "com.unity.ide.vscode": "1.2.5", + "com.unity.editorcoroutines": "1.0.0", + "com.unity.performance.profile-analyzer": "1.2.2", + "com.unity.test-framework": "1.1.33", + "com.unity.testtools.codecoverage": "1.2.4" + } + }, + "com.unity.ide.rider": { + "version": "3.0.25", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.ide.visualstudio": { + "version": "2.0.21", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.1.9" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.ide.vscode": { + "version": "1.2.5", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.cn" + }, + "com.unity.performance.profile-analyzer": { + "version": "1.2.2", + "depth": 1, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.cn" + }, + "com.unity.settings-manager": { + "version": "2.0.1", + "depth": 2, + "source": "registry", + "dependencies": {}, + "url": "https://packages.unity.cn" + }, + "com.unity.test-framework": { + "version": "1.1.33", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.ext.nunit": "1.0.6", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.testtools.codecoverage": { + "version": "1.2.4", + "depth": 1, + "source": "registry", + "dependencies": { + "com.unity.test-framework": "1.0.16", + "com.unity.settings-manager": "1.0.1" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.textmeshpro": { + "version": "3.0.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.timeline": { + "version": "1.7.6", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.modules.director": "1.0.0", + "com.unity.modules.animation": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.particlesystem": "1.0.0" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.ugui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0" + } + }, + "com.unity.visualscripting": { + "version": "1.9.1", + "depth": 0, + "source": "registry", + "dependencies": { + "com.unity.ugui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + }, + "url": "https://packages.unity.cn" + }, + "com.unity.modules.ai": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.androidjni": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.animation": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.assetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.audio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.cloth": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.director": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.animation": "1.0.0" + } + }, + "com.unity.modules.imageconversion": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.imgui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.jsonserialize": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.particlesystem": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.physics2d": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.screencapture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.subsystems": { + "version": "1.0.0", + "depth": 1, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.terrain": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.terrainphysics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.terrain": "1.0.0" + } + }, + "com.unity.modules.tilemap": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics2d": "1.0.0" + } + }, + "com.unity.modules.ui": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.uielements": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.imgui": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.umbra": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unityanalytics": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0" + } + }, + "com.unity.modules.unitywebrequest": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.unitywebrequestassetbundle": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestaudio": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.audio": "1.0.0" + } + }, + "com.unity.modules.unitywebrequesttexture": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.unitywebrequestwww": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.unitywebrequest": "1.0.0", + "com.unity.modules.unitywebrequestassetbundle": "1.0.0", + "com.unity.modules.unitywebrequestaudio": "1.0.0", + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.assetbundle": "1.0.0", + "com.unity.modules.imageconversion": "1.0.0" + } + }, + "com.unity.modules.vehicles": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0" + } + }, + "com.unity.modules.video": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.audio": "1.0.0", + "com.unity.modules.ui": "1.0.0", + "com.unity.modules.unitywebrequest": "1.0.0" + } + }, + "com.unity.modules.vr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.xr": "1.0.0" + } + }, + "com.unity.modules.wind": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": {} + }, + "com.unity.modules.xr": { + "version": "1.0.0", + "depth": 0, + "source": "builtin", + "dependencies": { + "com.unity.modules.physics": "1.0.0", + "com.unity.modules.jsonserialize": "1.0.0", + "com.unity.modules.subsystems": "1.0.0" + } + } + } +} diff --git a/ProjectSettings/AudioManager.asset b/ProjectSettings/AudioManager.asset new file mode 100644 index 0000000..07ebfb0 --- /dev/null +++ b/ProjectSettings/AudioManager.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!11 &1 +AudioManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Volume: 1 + Rolloff Scale: 1 + Doppler Factor: 1 + Default Speaker Mode: 2 + m_SampleRate: 0 + m_DSPBufferSize: 1024 + m_VirtualVoiceCount: 512 + m_RealVoiceCount: 32 + m_SpatializerPlugin: + m_AmbisonicDecoderPlugin: + m_DisableAudio: 0 + m_VirtualizeEffects: 1 + m_RequestedDSPBufferSize: 1024 diff --git a/ProjectSettings/ClusterInputManager.asset b/ProjectSettings/ClusterInputManager.asset new file mode 100644 index 0000000..e7886b2 --- /dev/null +++ b/ProjectSettings/ClusterInputManager.asset @@ -0,0 +1,6 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!236 &1 +ClusterInputManager: + m_ObjectHideFlags: 0 + m_Inputs: [] diff --git a/ProjectSettings/DynamicsManager.asset b/ProjectSettings/DynamicsManager.asset new file mode 100644 index 0000000..cdc1f3e --- /dev/null +++ b/ProjectSettings/DynamicsManager.asset @@ -0,0 +1,34 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!55 &1 +PhysicsManager: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_Gravity: {x: 0, y: -9.81, z: 0} + m_DefaultMaterial: {fileID: 0} + m_BounceThreshold: 2 + m_SleepThreshold: 0.005 + m_DefaultContactOffset: 0.01 + m_DefaultSolverIterations: 6 + m_DefaultSolverVelocityIterations: 1 + m_QueriesHitBackfaces: 0 + m_QueriesHitTriggers: 1 + m_EnableAdaptiveForce: 0 + m_ClothInterCollisionDistance: 0 + m_ClothInterCollisionStiffness: 0 + m_ContactsGeneration: 1 + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff + m_AutoSimulation: 1 + m_AutoSyncTransforms: 0 + m_ReuseCollisionCallbacks: 1 + m_ClothInterCollisionSettingsToggle: 0 + m_ContactPairsMode: 0 + m_BroadphaseType: 0 + m_WorldBounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 250, y: 250, z: 250} + m_WorldSubdivisions: 8 + m_FrictionType: 0 + m_EnableEnhancedDeterminism: 0 + m_EnableUnifiedHeightmaps: 1 + m_DefaultMaxAngluarSpeed: 7 diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset new file mode 100644 index 0000000..0147887 --- /dev/null +++ b/ProjectSettings/EditorBuildSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: [] + m_configObjects: {} diff --git a/ProjectSettings/EditorSettings.asset b/ProjectSettings/EditorSettings.asset new file mode 100644 index 0000000..1e44a0a --- /dev/null +++ b/ProjectSettings/EditorSettings.asset @@ -0,0 +1,30 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!159 &1 +EditorSettings: + m_ObjectHideFlags: 0 + serializedVersion: 11 + m_ExternalVersionControlSupport: Visible Meta Files + m_SerializationMode: 2 + m_LineEndingsForNewScripts: 0 + m_DefaultBehaviorMode: 0 + m_PrefabRegularEnvironment: {fileID: 0} + m_PrefabUIEnvironment: {fileID: 0} + m_SpritePackerMode: 0 + m_SpritePackerPaddingPower: 1 + m_EtcTextureCompressorBehavior: 1 + m_EtcTextureFastCompressor: 1 + m_EtcTextureNormalCompressor: 2 + m_EtcTextureBestCompressor: 4 + m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;rsp;asmref + m_ProjectGenerationRootNamespace: + m_CollabEditorSettings: + inProgressEnabled: 1 + m_EnableTextureStreamingInEditMode: 1 + m_EnableTextureStreamingInPlayMode: 1 + m_AsyncShaderCompilation: 1 + m_EnterPlayModeOptionsEnabled: 0 + m_EnterPlayModeOptions: 3 + m_ShowLightmapResolutionOverlay: 1 + m_UseLegacyProbeSampleCount: 0 + m_SerializeInlineMappingsOnOneLine: 1 diff --git a/ProjectSettings/GraphicsSettings.asset b/ProjectSettings/GraphicsSettings.asset new file mode 100644 index 0000000..43369e3 --- /dev/null +++ b/ProjectSettings/GraphicsSettings.asset @@ -0,0 +1,63 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!30 &1 +GraphicsSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_Deferred: + m_Mode: 1 + m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0} + m_DeferredReflections: + m_Mode: 1 + m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0} + m_ScreenSpaceShadows: + m_Mode: 1 + m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0} + m_LegacyDeferred: + m_Mode: 1 + m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0} + m_DepthNormals: + m_Mode: 1 + m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0} + m_MotionVectors: + m_Mode: 1 + m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0} + m_LightHalo: + m_Mode: 1 + m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0} + m_LensFlare: + m_Mode: 1 + m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0} + m_AlwaysIncludedShaders: + - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0} + m_PreloadedShaders: [] + m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, + type: 0} + m_CustomRenderPipeline: {fileID: 0} + m_TransparencySortMode: 0 + m_TransparencySortAxis: {x: 0, y: 0, z: 1} + m_DefaultRenderingPath: 1 + m_DefaultMobileRenderingPath: 1 + m_TierSettings: [] + m_LightmapStripping: 0 + m_FogStripping: 0 + m_InstancingStripping: 0 + m_LightmapKeepPlain: 1 + m_LightmapKeepDirCombined: 1 + m_LightmapKeepDynamicPlain: 1 + m_LightmapKeepDynamicDirCombined: 1 + m_LightmapKeepShadowMask: 1 + m_LightmapKeepSubtractive: 1 + m_FogKeepLinear: 1 + m_FogKeepExp: 1 + m_FogKeepExp2: 1 + m_AlbedoSwatchInfos: [] + m_LightsUseLinearIntensity: 0 + m_LightsUseColorTemperature: 0 + m_LogWhenShaderIsCompiled: 0 + m_AllowEnlightenSupportForUpgradedProject: 0 diff --git a/ProjectSettings/InputManager.asset b/ProjectSettings/InputManager.asset new file mode 100644 index 0000000..17c8f53 --- /dev/null +++ b/ProjectSettings/InputManager.asset @@ -0,0 +1,295 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!13 &1 +InputManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Axes: + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: left + positiveButton: right + altNegativeButton: a + altPositiveButton: d + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: down + positiveButton: up + altNegativeButton: s + altPositiveButton: w + gravity: 3 + dead: 0.001 + sensitivity: 3 + snap: 1 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left ctrl + altNegativeButton: + altPositiveButton: mouse 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left alt + altNegativeButton: + altPositiveButton: mouse 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: left shift + altNegativeButton: + altPositiveButton: mouse 2 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: space + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse X + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse Y + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Mouse ScrollWheel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0 + sensitivity: 0.1 + snap: 0 + invert: 0 + type: 1 + axis: 2 + joyNum: 0 + - serializedVersion: 3 + m_Name: Horizontal + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 0 + type: 2 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Vertical + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: + altNegativeButton: + altPositiveButton: + gravity: 0 + dead: 0.19 + sensitivity: 1 + snap: 0 + invert: 1 + type: 2 + axis: 1 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire1 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 0 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire2 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 1 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Fire3 + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 2 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Jump + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: joystick button 3 + altNegativeButton: + altPositiveButton: + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: return + altNegativeButton: + altPositiveButton: joystick button 0 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Submit + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: enter + altNegativeButton: + altPositiveButton: space + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 + - serializedVersion: 3 + m_Name: Cancel + descriptiveName: + descriptiveNegativeName: + negativeButton: + positiveButton: escape + altNegativeButton: + altPositiveButton: joystick button 1 + gravity: 1000 + dead: 0.001 + sensitivity: 1000 + snap: 0 + invert: 0 + type: 0 + axis: 0 + joyNum: 0 diff --git a/ProjectSettings/MemorySettings.asset b/ProjectSettings/MemorySettings.asset new file mode 100644 index 0000000..5b5face --- /dev/null +++ b/ProjectSettings/MemorySettings.asset @@ -0,0 +1,35 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!387306366 &1 +MemorySettings: + m_ObjectHideFlags: 0 + m_EditorMemorySettings: + m_MainAllocatorBlockSize: -1 + m_ThreadAllocatorBlockSize: -1 + m_MainGfxBlockSize: -1 + m_ThreadGfxBlockSize: -1 + m_CacheBlockSize: -1 + m_TypetreeBlockSize: -1 + m_ProfilerBlockSize: -1 + m_ProfilerEditorBlockSize: -1 + m_BucketAllocatorGranularity: -1 + m_BucketAllocatorBucketsCount: -1 + m_BucketAllocatorBlockSize: -1 + m_BucketAllocatorBlockCount: -1 + m_ProfilerBucketAllocatorGranularity: -1 + m_ProfilerBucketAllocatorBucketsCount: -1 + m_ProfilerBucketAllocatorBlockSize: -1 + m_ProfilerBucketAllocatorBlockCount: -1 + m_TempAllocatorSizeMain: -1 + m_JobTempAllocatorBlockSize: -1 + m_BackgroundJobTempAllocatorBlockSize: -1 + m_JobTempAllocatorReducedBlockSize: -1 + m_TempAllocatorSizeGIBakingWorker: -1 + m_TempAllocatorSizeNavMeshWorker: -1 + m_TempAllocatorSizeAudioWorker: -1 + m_TempAllocatorSizeCloudWorker: -1 + m_TempAllocatorSizeGfx: -1 + m_TempAllocatorSizeJobWorker: -1 + m_TempAllocatorSizeBackgroundWorker: -1 + m_TempAllocatorSizePreloadManager: -1 + m_PlatformMemorySettings: {} diff --git a/ProjectSettings/NavMeshAreas.asset b/ProjectSettings/NavMeshAreas.asset new file mode 100644 index 0000000..3b0b7c3 --- /dev/null +++ b/ProjectSettings/NavMeshAreas.asset @@ -0,0 +1,91 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!126 &1 +NavMeshProjectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + areas: + - name: Walkable + cost: 1 + - name: Not Walkable + cost: 1 + - name: Jump + cost: 2 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + - name: + cost: 1 + m_LastAgentTypeID: -887442657 + m_Settings: + - serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.75 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + debug: + m_Flags: 0 + m_SettingNames: + - Humanoid diff --git a/ProjectSettings/PackageManagerSettings.asset b/ProjectSettings/PackageManagerSettings.asset new file mode 100644 index 0000000..302f2ec --- /dev/null +++ b/ProjectSettings/PackageManagerSettings.asset @@ -0,0 +1,36 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &1 +MonoBehaviour: + m_ObjectHideFlags: 61 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_EnablePreReleasePackages: 0 + m_AdvancedSettingsExpanded: 1 + m_ScopedRegistriesSettingsExpanded: 1 + m_SeeAllPackageVersions: 0 + m_DismissPreviewPackagesInUse: 0 + oneTimeWarningShown: 0 + m_Registries: + - m_Id: main + m_Name: + m_Url: https://packages.unity.cn + m_Scopes: [] + m_IsDefault: 1 + m_Capabilities: 7 + m_ConfigSource: 0 + m_UserSelectedRegistryName: + m_UserAddingNewScopedRegistry: 0 + m_RegistryInfoDraft: + m_Modified: 0 + m_ErrorMessage: + m_UserModificationsInstanceId: -832 + m_OriginalInstanceId: -834 + m_LoadAssets: 0 diff --git a/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json new file mode 100644 index 0000000..3c7b4c1 --- /dev/null +++ b/ProjectSettings/Packages/com.unity.testtools.codecoverage/Settings.json @@ -0,0 +1,5 @@ +{ + "m_Dictionary": { + "m_DictionaryValues": [] + } +} \ No newline at end of file diff --git a/ProjectSettings/Physics2DSettings.asset b/ProjectSettings/Physics2DSettings.asset new file mode 100644 index 0000000..47880b1 --- /dev/null +++ b/ProjectSettings/Physics2DSettings.asset @@ -0,0 +1,56 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!19 &1 +Physics2DSettings: + m_ObjectHideFlags: 0 + serializedVersion: 4 + m_Gravity: {x: 0, y: -9.81} + m_DefaultMaterial: {fileID: 0} + m_VelocityIterations: 8 + m_PositionIterations: 3 + m_VelocityThreshold: 1 + m_MaxLinearCorrection: 0.2 + m_MaxAngularCorrection: 8 + m_MaxTranslationSpeed: 100 + m_MaxRotationSpeed: 360 + m_BaumgarteScale: 0.2 + m_BaumgarteTimeOfImpactScale: 0.75 + m_TimeToSleep: 0.5 + m_LinearSleepTolerance: 0.01 + m_AngularSleepTolerance: 2 + m_DefaultContactOffset: 0.01 + m_JobOptions: + serializedVersion: 2 + useMultithreading: 0 + useConsistencySorting: 0 + m_InterpolationPosesPerJob: 100 + m_NewContactsPerJob: 30 + m_CollideContactsPerJob: 100 + m_ClearFlagsPerJob: 200 + m_ClearBodyForcesPerJob: 200 + m_SyncDiscreteFixturesPerJob: 50 + m_SyncContinuousFixturesPerJob: 50 + m_FindNearestContactsPerJob: 100 + m_UpdateTriggerContactsPerJob: 100 + m_IslandSolverCostThreshold: 100 + m_IslandSolverBodyCostScale: 1 + m_IslandSolverContactCostScale: 10 + m_IslandSolverJointCostScale: 10 + m_IslandSolverBodiesPerJob: 50 + m_IslandSolverContactsPerJob: 50 + m_AutoSimulation: 1 + m_QueriesHitTriggers: 1 + m_QueriesStartInColliders: 1 + m_CallbacksOnDisable: 1 + m_ReuseCollisionCallbacks: 1 + m_AutoSyncTransforms: 0 + m_AlwaysShowColliders: 0 + m_ShowColliderSleep: 1 + m_ShowColliderContacts: 0 + m_ShowColliderAABB: 0 + m_ContactArrowScale: 0.2 + m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412} + m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432} + m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745} + m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804} + m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff diff --git a/ProjectSettings/PresetManager.asset b/ProjectSettings/PresetManager.asset new file mode 100644 index 0000000..67a94da --- /dev/null +++ b/ProjectSettings/PresetManager.asset @@ -0,0 +1,7 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1386491679 &1 +PresetManager: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_DefaultPresets: {} diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset new file mode 100644 index 0000000..5c464b3 --- /dev/null +++ b/ProjectSettings/ProjectSettings.asset @@ -0,0 +1,763 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!129 &1 +PlayerSettings: + m_ObjectHideFlags: 0 + serializedVersion: 26 + productGUID: 53294bbe8e566784e84fb4aceb84bf5b + AndroidProfiler: 0 + AndroidFilterTouchesWhenObscured: 0 + AndroidEnableSustainedPerformanceMode: 0 + defaultScreenOrientation: 4 + targetDevice: 2 + useOnDemandResources: 0 + accelerometerFrequency: 60 + companyName: DefaultCompany + productName: PackageBuild + defaultCursor: {fileID: 0} + cursorHotspot: {x: 0, y: 0} + m_SplashScreenBackgroundColor: {r: 0.13725491, g: 0.12156863, b: 0.1254902, a: 1} + m_ShowUnitySplashScreen: 1 + m_ShowUnitySplashLogo: 1 + m_SplashScreenOverlayOpacity: 1 + m_SplashScreenAnimation: 1 + m_SplashScreenLogoStyle: 1 + m_SplashScreenDrawMode: 0 + m_SplashScreenBackgroundAnimationZoom: 1 + m_SplashScreenLogoAnimationZoom: 1 + m_SplashScreenBackgroundLandscapeAspect: 1 + m_SplashScreenBackgroundPortraitAspect: 1 + m_SplashScreenBackgroundLandscapeUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenBackgroundPortraitUvs: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + m_SplashScreenLogos: [] + m_VirtualRealitySplashScreen: {fileID: 0} + m_HolographicTrackingLossScreen: {fileID: 0} + defaultScreenWidth: 1920 + defaultScreenHeight: 1080 + defaultScreenWidthWeb: 960 + defaultScreenHeightWeb: 600 + m_StereoRenderingPath: 0 + m_ActiveColorSpace: 0 + unsupportedMSAAFallback: 0 + m_SpriteBatchVertexThreshold: 300 + m_MTRendering: 1 + mipStripping: 0 + numberOfMipsStripped: 0 + numberOfMipsStrippedPerMipmapLimitGroup: {} + m_StackTraceTypes: 010000000100000001000000010000000100000001000000 + iosShowActivityIndicatorOnLoading: -1 + androidShowActivityIndicatorOnLoading: -1 + iosUseCustomAppBackgroundBehavior: 0 + allowedAutorotateToPortrait: 1 + allowedAutorotateToPortraitUpsideDown: 1 + allowedAutorotateToLandscapeRight: 1 + allowedAutorotateToLandscapeLeft: 1 + useOSAutorotation: 1 + use32BitDisplayBuffer: 1 + preserveFramebufferAlpha: 0 + disableDepthAndStencilBuffers: 0 + androidStartInFullscreen: 1 + androidRenderOutsideSafeArea: 1 + androidUseSwappy: 1 + androidBlitType: 0 + androidResizableWindow: 0 + androidDefaultWindowWidth: 1920 + androidDefaultWindowHeight: 1080 + androidMinimumWindowWidth: 400 + androidMinimumWindowHeight: 300 + androidFullscreenMode: 1 + defaultIsNativeResolution: 1 + macRetinaSupport: 1 + runInBackground: 1 + captureSingleScreen: 0 + muteOtherAudioSources: 0 + Prepare IOS For Recording: 0 + Force IOS Speakers When Recording: 0 + deferSystemGesturesMode: 0 + hideHomeButton: 0 + submitAnalytics: 1 + usePlayerLog: 1 + dedicatedServerOptimizations: 0 + bakeCollisionMeshes: 0 + forceSingleInstance: 0 + useFlipModelSwapchain: 1 + resizableWindow: 0 + useMacAppStoreValidation: 0 + macAppStoreCategory: public.app-category.games + gpuSkinning: 1 + xboxPIXTextureCapture: 0 + xboxEnableAvatar: 0 + xboxEnableKinect: 0 + xboxEnableKinectAutoTracking: 0 + xboxEnableFitness: 0 + visibleInBackground: 1 + allowFullscreenSwitch: 1 + fullscreenMode: 1 + xboxSpeechDB: 0 + xboxEnableHeadOrientation: 0 + xboxEnableGuest: 0 + xboxEnablePIXSampling: 0 + metalFramebufferOnly: 0 + xboxOneResolution: 0 + xboxOneSResolution: 0 + xboxOneXResolution: 3 + xboxOneMonoLoggingLevel: 0 + xboxOneLoggingLevel: 1 + xboxOneDisableEsram: 0 + xboxOneEnableTypeOptimization: 0 + xboxOnePresentImmediateThreshold: 0 + switchQueueCommandMemory: 0 + switchQueueControlMemory: 16384 + switchQueueComputeMemory: 262144 + switchNVNShaderPoolsGranularity: 33554432 + switchNVNDefaultPoolsGranularity: 16777216 + switchNVNOtherPoolsGranularity: 16777216 + switchGpuScratchPoolGranularity: 2097152 + switchAllowGpuScratchShrinking: 0 + switchNVNMaxPublicTextureIDCount: 0 + switchNVNMaxPublicSamplerIDCount: 0 + switchNVNGraphicsFirmwareMemory: 32 + switchMaxWorkerMultiple: 8 + stadiaPresentMode: 0 + stadiaTargetFramerate: 0 + vulkanNumSwapchainBuffers: 3 + vulkanEnableSetSRGBWrite: 0 + vulkanEnablePreTransform: 1 + vulkanEnableLateAcquireNextImage: 0 + vulkanEnableCommandBufferRecycling: 1 + loadStoreDebugModeEnabled: 0 + bundleVersion: 0.1 + preloadedAssets: [] + metroInputSource: 0 + wsaTransparentSwapchain: 0 + m_HolographicPauseOnTrackingLoss: 1 + xboxOneDisableKinectGpuReservation: 1 + xboxOneEnable7thCore: 1 + vrSettings: + enable360StereoCapture: 0 + isWsaHolographicRemotingEnabled: 0 + enableFrameTimingStats: 0 + enableOpenGLProfilerGPURecorders: 1 + allowHDRDisplaySupport: 0 + useHDRDisplay: 0 + hdrBitDepth: 0 + m_ColorGamuts: 00000000 + targetPixelDensity: 30 + resolutionScalingMode: 0 + resetResolutionOnWindowResize: 0 + androidSupportedAspectRatio: 1 + androidMaxAspectRatio: 2.1 + applicationIdentifier: {} + buildNumber: + Standalone: 0 + VisionOS: 0 + iPhone: 0 + tvOS: 0 + overrideDefaultApplicationIdentifier: 0 + AndroidBundleVersionCode: 1 + AndroidMinSdkVersion: 22 + AndroidTargetSdkVersion: 0 + AndroidPreferredInstallLocation: 1 + aotOptions: + stripEngineCode: 1 + iPhoneStrippingLevel: 0 + iPhoneScriptCallOptimization: 0 + ForceInternetPermission: 0 + ForceSDCardPermission: 0 + CreateWallpaper: 0 + APKExpansionFiles: 0 + keepLoadedShadersAlive: 0 + StripUnusedMeshComponents: 1 + strictShaderVariantMatching: 0 + VertexChannelCompressionMask: 4054 + iPhoneSdkVersion: 988 + iOSTargetOSVersionString: 12.0 + tvOSSdkVersion: 0 + tvOSRequireExtendedGameController: 0 + tvOSTargetOSVersionString: 12.0 + VisionOSSdkVersion: 0 + VisionOSTargetOSVersionString: 1.0 + uIPrerenderedIcon: 0 + uIRequiresPersistentWiFi: 0 + uIRequiresFullScreen: 1 + uIStatusBarHidden: 1 + uIExitOnSuspend: 0 + uIStatusBarStyle: 0 + appleTVSplashScreen: {fileID: 0} + appleTVSplashScreen2x: {fileID: 0} + tvOSSmallIconLayers: [] + tvOSSmallIconLayers2x: [] + tvOSLargeIconLayers: [] + tvOSLargeIconLayers2x: [] + tvOSTopShelfImageLayers: [] + tvOSTopShelfImageLayers2x: [] + tvOSTopShelfImageWideLayers: [] + tvOSTopShelfImageWideLayers2x: [] + iOSLaunchScreenType: 0 + iOSLaunchScreenPortrait: {fileID: 0} + iOSLaunchScreenLandscape: {fileID: 0} + iOSLaunchScreenBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreenFillPct: 100 + iOSLaunchScreenSize: 100 + iOSLaunchScreenCustomXibPath: + iOSLaunchScreeniPadType: 0 + iOSLaunchScreeniPadImage: {fileID: 0} + iOSLaunchScreeniPadBackgroundColor: + serializedVersion: 2 + rgba: 0 + iOSLaunchScreeniPadFillPct: 100 + iOSLaunchScreeniPadSize: 100 + iOSLaunchScreeniPadCustomXibPath: + iOSLaunchScreenCustomStoryboardPath: + iOSLaunchScreeniPadCustomStoryboardPath: + iOSDeviceRequirements: [] + iOSURLSchemes: [] + macOSURLSchemes: [] + iOSBackgroundModes: 0 + iOSMetalForceHardShadows: 0 + metalEditorSupport: 1 + metalAPIValidation: 1 + iOSRenderExtraFrameOnPause: 0 + iosCopyPluginsCodeInsteadOfSymlink: 0 + appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + VisionOSManualSigningProvisioningProfileID: + iOSManualSigningProvisioningProfileType: 0 + tvOSManualSigningProvisioningProfileType: 0 + VisionOSManualSigningProvisioningProfileType: 0 + appleEnableAutomaticSigning: 0 + iOSRequireARKit: 0 + iOSAutomaticallyDetectAndAddCapabilities: 1 + appleEnableProMotion: 0 + shaderPrecisionModel: 0 + clonedFromGUID: c0afd0d1d80e3634a9dac47e8a0426ea + templatePackageId: com.unity.template.3d@8.1.1 + templateDefaultScene: Assets/Scenes/SampleScene.unity + useCustomMainManifest: 0 + useCustomLauncherManifest: 0 + useCustomMainGradleTemplate: 0 + useCustomLauncherGradleManifest: 0 + useCustomBaseGradleTemplate: 0 + useCustomGradlePropertiesTemplate: 0 + useCustomGradleSettingsTemplate: 0 + useCustomProguardFile: 0 + AndroidTargetArchitectures: 1 + AndroidTargetDevices: 0 + AndroidSplashScreenScale: 0 + androidSplashScreen: {fileID: 0} + AndroidKeystoreName: + AndroidKeyaliasName: + AndroidEnableArmv9SecurityFeatures: 0 + AndroidBuildApkPerCpuArchitecture: 0 + AndroidTVCompatibility: 0 + AndroidIsGame: 1 + AndroidEnableTango: 0 + androidEnableBanner: 1 + androidUseLowAccuracyLocation: 0 + androidUseCustomKeystore: 0 + m_AndroidBanners: + - width: 320 + height: 180 + banner: {fileID: 0} + androidGamepadSupportLevel: 0 + chromeosInputEmulation: 1 + AndroidMinifyRelease: 0 + AndroidMinifyDebug: 0 + AndroidValidateAppBundleSize: 1 + AndroidAppBundleSizeToValidate: 150 + m_BuildTargetIcons: [] + m_BuildTargetPlatformIcons: [] + m_BuildTargetBatching: + - m_BuildTarget: Standalone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: tvOS + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: Android + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: iPhone + m_StaticBatching: 1 + m_DynamicBatching: 0 + - m_BuildTarget: WebGL + m_StaticBatching: 0 + m_DynamicBatching: 0 + m_BuildTargetShaderSettings: [] + m_BuildTargetGraphicsJobs: + - m_BuildTarget: MacStandaloneSupport + m_GraphicsJobs: 0 + - m_BuildTarget: Switch + m_GraphicsJobs: 1 + - m_BuildTarget: MetroSupport + m_GraphicsJobs: 1 + - m_BuildTarget: AppleTVSupport + m_GraphicsJobs: 0 + - m_BuildTarget: BJMSupport + m_GraphicsJobs: 1 + - m_BuildTarget: LinuxStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: PS4Player + m_GraphicsJobs: 1 + - m_BuildTarget: iOSSupport + m_GraphicsJobs: 0 + - m_BuildTarget: WindowsStandaloneSupport + m_GraphicsJobs: 1 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobs: 1 + - m_BuildTarget: LuminSupport + m_GraphicsJobs: 0 + - m_BuildTarget: AndroidPlayer + m_GraphicsJobs: 0 + - m_BuildTarget: WebGLSupport + m_GraphicsJobs: 0 + m_BuildTargetGraphicsJobMode: + - m_BuildTarget: PS4Player + m_GraphicsJobMode: 0 + - m_BuildTarget: XboxOnePlayer + m_GraphicsJobMode: 0 + m_BuildTargetGraphicsAPIs: + - m_BuildTarget: AndroidPlayer + m_APIs: 150000000b000000 + m_Automatic: 1 + - m_BuildTarget: iOSSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: AppleTVSupport + m_APIs: 10000000 + m_Automatic: 1 + - m_BuildTarget: WebGLSupport + m_APIs: 0b000000 + m_Automatic: 1 + m_BuildTargetVRSettings: + - m_BuildTarget: Standalone + m_Enabled: 0 + m_Devices: + - Oculus + - OpenVR + m_DefaultShaderChunkSizeInMB: 16 + m_DefaultShaderChunkCount: 0 + openGLRequireES31: 0 + openGLRequireES31AEP: 0 + openGLRequireES32: 0 + m_TemplateCustomTags: {} + mobileMTRendering: + Android: 1 + iPhone: 1 + tvOS: 1 + m_BuildTargetGroupLightmapEncodingQuality: + - m_BuildTarget: Android + m_EncodingQuality: 1 + - m_BuildTarget: iPhone + m_EncodingQuality: 1 + - m_BuildTarget: tvOS + m_EncodingQuality: 1 + m_BuildTargetGroupHDRCubemapEncodingQuality: + - m_BuildTarget: Android + m_EncodingQuality: 1 + - m_BuildTarget: iPhone + m_EncodingQuality: 1 + - m_BuildTarget: tvOS + m_EncodingQuality: 1 + m_BuildTargetGroupLightmapSettings: [] + m_BuildTargetGroupLoadStoreDebugModeSettings: [] + m_BuildTargetNormalMapEncoding: + - m_BuildTarget: Android + m_Encoding: 1 + - m_BuildTarget: iPhone + m_Encoding: 1 + - m_BuildTarget: tvOS + m_Encoding: 1 + m_BuildTargetDefaultTextureCompressionFormat: + - m_BuildTarget: Android + m_Format: 3 + playModeTestRunnerEnabled: 0 + runPlayModeTestAsEditModeTest: 0 + actionOnDotNetUnhandledException: 1 + enableInternalProfiler: 0 + logObjCUncaughtExceptions: 1 + enableCrashReportAPI: 0 + cameraUsageDescription: + locationUsageDescription: + microphoneUsageDescription: + bluetoothUsageDescription: + macOSTargetOSVersion: 10.13.0 + switchNMETAOverride: + switchNetLibKey: + switchSocketMemoryPoolSize: 6144 + switchSocketAllocatorPoolSize: 128 + switchSocketConcurrencyLimit: 14 + switchScreenResolutionBehavior: 2 + switchUseCPUProfiler: 0 + switchEnableFileSystemTrace: 0 + switchUseGOLDLinker: 0 + switchLTOSetting: 0 + switchApplicationID: 0x01004b9000490000 + switchNSODependencies: + switchCompilerFlags: + switchTitleNames_0: + switchTitleNames_1: + switchTitleNames_2: + switchTitleNames_3: + switchTitleNames_4: + switchTitleNames_5: + switchTitleNames_6: + switchTitleNames_7: + switchTitleNames_8: + switchTitleNames_9: + switchTitleNames_10: + switchTitleNames_11: + switchTitleNames_12: + switchTitleNames_13: + switchTitleNames_14: + switchTitleNames_15: + switchPublisherNames_0: + switchPublisherNames_1: + switchPublisherNames_2: + switchPublisherNames_3: + switchPublisherNames_4: + switchPublisherNames_5: + switchPublisherNames_6: + switchPublisherNames_7: + switchPublisherNames_8: + switchPublisherNames_9: + switchPublisherNames_10: + switchPublisherNames_11: + switchPublisherNames_12: + switchPublisherNames_13: + switchPublisherNames_14: + switchPublisherNames_15: + switchIcons_0: {fileID: 0} + switchIcons_1: {fileID: 0} + switchIcons_2: {fileID: 0} + switchIcons_3: {fileID: 0} + switchIcons_4: {fileID: 0} + switchIcons_5: {fileID: 0} + switchIcons_6: {fileID: 0} + switchIcons_7: {fileID: 0} + switchIcons_8: {fileID: 0} + switchIcons_9: {fileID: 0} + switchIcons_10: {fileID: 0} + switchIcons_11: {fileID: 0} + switchIcons_12: {fileID: 0} + switchIcons_13: {fileID: 0} + switchIcons_14: {fileID: 0} + switchIcons_15: {fileID: 0} + switchSmallIcons_0: {fileID: 0} + switchSmallIcons_1: {fileID: 0} + switchSmallIcons_2: {fileID: 0} + switchSmallIcons_3: {fileID: 0} + switchSmallIcons_4: {fileID: 0} + switchSmallIcons_5: {fileID: 0} + switchSmallIcons_6: {fileID: 0} + switchSmallIcons_7: {fileID: 0} + switchSmallIcons_8: {fileID: 0} + switchSmallIcons_9: {fileID: 0} + switchSmallIcons_10: {fileID: 0} + switchSmallIcons_11: {fileID: 0} + switchSmallIcons_12: {fileID: 0} + switchSmallIcons_13: {fileID: 0} + switchSmallIcons_14: {fileID: 0} + switchSmallIcons_15: {fileID: 0} + switchManualHTML: + switchAccessibleURLs: + switchLegalInformation: + switchMainThreadStackSize: 1048576 + switchPresenceGroupId: + switchLogoHandling: 0 + switchReleaseVersion: 0 + switchDisplayVersion: 1.0.0 + switchStartupUserAccount: 0 + switchSupportedLanguagesMask: 0 + switchLogoType: 0 + switchApplicationErrorCodeCategory: + switchUserAccountSaveDataSize: 0 + switchUserAccountSaveDataJournalSize: 0 + switchApplicationAttribute: 0 + switchCardSpecSize: -1 + switchCardSpecClock: -1 + switchRatingsMask: 0 + switchRatingsInt_0: 0 + switchRatingsInt_1: 0 + switchRatingsInt_2: 0 + switchRatingsInt_3: 0 + switchRatingsInt_4: 0 + switchRatingsInt_5: 0 + switchRatingsInt_6: 0 + switchRatingsInt_7: 0 + switchRatingsInt_8: 0 + switchRatingsInt_9: 0 + switchRatingsInt_10: 0 + switchRatingsInt_11: 0 + switchRatingsInt_12: 0 + switchLocalCommunicationIds_0: + switchLocalCommunicationIds_1: + switchLocalCommunicationIds_2: + switchLocalCommunicationIds_3: + switchLocalCommunicationIds_4: + switchLocalCommunicationIds_5: + switchLocalCommunicationIds_6: + switchLocalCommunicationIds_7: + switchParentalControl: 0 + switchAllowsScreenshot: 1 + switchAllowsVideoCapturing: 1 + switchAllowsRuntimeAddOnContentInstall: 0 + switchDataLossConfirmation: 0 + switchUserAccountLockEnabled: 0 + switchSystemResourceMemory: 16777216 + switchSupportedNpadStyles: 22 + switchNativeFsCacheSize: 32 + switchIsHoldTypeHorizontal: 0 + switchSupportedNpadCount: 8 + switchEnableTouchScreen: 1 + switchSocketConfigEnabled: 0 + switchTcpInitialSendBufferSize: 32 + switchTcpInitialReceiveBufferSize: 64 + switchTcpAutoSendBufferSizeMax: 256 + switchTcpAutoReceiveBufferSizeMax: 256 + switchUdpSendBufferSize: 9 + switchUdpReceiveBufferSize: 42 + switchSocketBufferEfficiency: 4 + switchSocketInitializeEnabled: 1 + switchNetworkInterfaceManagerInitializeEnabled: 1 + switchUseNewStyleFilepaths: 1 + switchUseLegacyFmodPriorities: 0 + switchUseMicroSleepForYield: 1 + switchEnableRamDiskSupport: 0 + switchMicroSleepForYieldTime: 25 + switchRamDiskSpaceSize: 12 + ps4NPAgeRating: 12 + ps4NPTitleSecret: + ps4NPTrophyPackPath: + ps4ParentalLevel: 11 + ps4ContentID: ED1633-NPXX51362_00-0000000000000000 + ps4Category: 0 + ps4MasterVersion: 01.00 + ps4AppVersion: 01.00 + ps4AppType: 0 + ps4ParamSfxPath: + ps4VideoOutPixelFormat: 0 + ps4VideoOutInitialWidth: 1920 + ps4VideoOutBaseModeInitialWidth: 1920 + ps4VideoOutReprojectionRate: 60 + ps4PronunciationXMLPath: + ps4PronunciationSIGPath: + ps4BackgroundImagePath: + ps4StartupImagePath: + ps4StartupImagesFolder: + ps4IconImagesFolder: + ps4SaveDataImagePath: + ps4SdkOverride: + ps4BGMPath: + ps4ShareFilePath: + ps4ShareOverlayImagePath: + ps4PrivacyGuardImagePath: + ps4ExtraSceSysFile: + ps4NPtitleDatPath: + ps4RemotePlayKeyAssignment: -1 + ps4RemotePlayKeyMappingDir: + ps4PlayTogetherPlayerCount: 0 + ps4EnterButtonAssignment: 1 + ps4ApplicationParam1: 0 + ps4ApplicationParam2: 0 + ps4ApplicationParam3: 0 + ps4ApplicationParam4: 0 + ps4DownloadDataSize: 0 + ps4GarlicHeapSize: 2048 + ps4ProGarlicHeapSize: 2560 + playerPrefsMaxSize: 32768 + ps4Passcode: frAQBc8Wsa1xVPfvJcrgRYwTiizs2trQ + ps4pnSessions: 1 + ps4pnPresence: 1 + ps4pnFriends: 1 + ps4pnGameCustomData: 1 + playerPrefsSupport: 0 + enableApplicationExit: 0 + resetTempFolder: 1 + restrictedAudioUsageRights: 0 + ps4UseResolutionFallback: 0 + ps4ReprojectionSupport: 0 + ps4UseAudio3dBackend: 0 + ps4UseLowGarlicFragmentationMode: 1 + ps4SocialScreenEnabled: 0 + ps4ScriptOptimizationLevel: 0 + ps4Audio3dVirtualSpeakerCount: 14 + ps4attribCpuUsage: 0 + ps4PatchPkgPath: + ps4PatchLatestPkgPath: + ps4PatchChangeinfoPath: + ps4PatchDayOne: 0 + ps4attribUserManagement: 0 + ps4attribMoveSupport: 0 + ps4attrib3DSupport: 0 + ps4attribShareSupport: 0 + ps4attribExclusiveVR: 0 + ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4CompatibilityPS5: 0 + ps4AllowPS5Detection: 0 + ps4GPU800MHz: 1 + ps4attribEyeToEyeDistanceSettingVR: 0 + ps4IncludedModules: [] + ps4attribVROutputEnabled: 0 + monoEnv: + splashScreenBackgroundSourceLandscape: {fileID: 0} + splashScreenBackgroundSourcePortrait: {fileID: 0} + blurSplashScreenBackground: 1 + spritePackerPolicy: + webGLMemorySize: 16 + webGLExceptionSupport: 1 + webGLNameFilesAsHashes: 0 + webGLShowDiagnostics: 0 + webGLDataCaching: 1 + webGLDebugSymbols: 0 + webGLEmscriptenArgs: + webGLModulesDirectory: + webGLTemplate: APPLICATION:Default + webGLAnalyzeBuildSize: 0 + webGLUseEmbeddedResources: 0 + webGLCompressionFormat: 1 + webGLWasmArithmeticExceptions: 0 + webGLLinkerTarget: 1 + webGLThreadsSupport: 0 + webGLDecompressionFallback: 0 + webGLInitialMemorySize: 32 + webGLMaximumMemorySize: 2048 + webGLMemoryGrowthMode: 2 + webGLMemoryLinearGrowthStep: 16 + webGLMemoryGeometricGrowthStep: 0.2 + webGLMemoryGeometricGrowthCap: 96 + webGLPowerPreference: 2 + scriptingDefineSymbols: {} + additionalCompilerArguments: {} + platformArchitecture: {} + scriptingBackend: {} + il2cppCompilerConfiguration: {} + il2cppCodeGeneration: {} + managedStrippingLevel: + EmbeddedLinux: 1 + GameCoreScarlett: 1 + GameCoreXboxOne: 1 + Nintendo Switch: 1 + PS4: 1 + PS5: 1 + QNX: 1 + Stadia: 1 + VisionOS: 1 + WebGL: 1 + Windows Store Apps: 1 + XboxOne: 1 + iPhone: 1 + tvOS: 1 + incrementalIl2cppBuild: {} + suppressCommonWarnings: 1 + allowUnsafeCode: 0 + useDeterministicCompilation: 1 + additionalIl2CppArgs: + scriptingRuntimeVersion: 1 + gcIncremental: 1 + gcWBarrierValidation: 0 + apiCompatibilityLevelPerPlatform: {} + m_RenderingPath: 1 + m_MobileRenderingPath: 1 + metroPackageName: PackageBuild + metroPackageVersion: + metroCertificatePath: + metroCertificatePassword: + metroCertificateSubject: + metroCertificateIssuer: + metroCertificateNotAfter: 0000000000000000 + metroApplicationDescription: PackageBuild + wsaImages: {} + metroTileShortName: + metroTileShowName: 0 + metroMediumTileShowName: 0 + metroLargeTileShowName: 0 + metroWideTileShowName: 0 + metroSupportStreamingInstall: 0 + metroLastRequiredScene: 0 + metroDefaultTileSize: 1 + metroTileForegroundText: 2 + metroTileBackgroundColor: {r: 0.13333334, g: 0.17254902, b: 0.21568628, a: 0} + metroSplashScreenBackgroundColor: {r: 0.12941177, g: 0.17254902, b: 0.21568628, a: 1} + metroSplashScreenUseBackgroundColor: 0 + platformCapabilities: {} + metroTargetDeviceFamilies: {} + metroFTAName: + metroFTAFileTypes: [] + metroProtocolName: + vcxProjDefaultLanguage: + XboxOneProductId: + XboxOneUpdateKey: + XboxOneSandboxId: + XboxOneContentId: + XboxOneTitleId: + XboxOneSCId: + XboxOneGameOsOverridePath: + XboxOnePackagingOverridePath: + XboxOneAppManifestOverridePath: + XboxOneVersion: 1.0.0.0 + XboxOnePackageEncryption: 0 + XboxOnePackageUpdateGranularity: 2 + XboxOneDescription: + XboxOneLanguage: + - enus + XboxOneCapability: [] + XboxOneGameRating: {} + XboxOneIsContentPackage: 0 + XboxOneEnhancedXboxCompatibilityMode: 0 + XboxOneEnableGPUVariability: 1 + XboxOneSockets: {} + XboxOneSplashScreen: {fileID: 0} + XboxOneAllowedProductIds: [] + XboxOnePersistentLocalStorageSize: 0 + XboxOneXTitleMemory: 8 + XboxOneOverrideIdentityName: + XboxOneOverrideIdentityPublisher: + vrEditorSettings: {} + cloudServicesEnabled: + UNet: 1 + luminIcon: + m_Name: + m_ModelFolderPath: + m_PortalFolderPath: + luminCert: + m_CertPath: + m_SignPackage: 1 + luminIsChannelApp: 0 + luminVersion: + m_VersionCode: 1 + m_VersionName: + hmiPlayerDataPath: + hmiForceSRGBBlit: 1 + embeddedLinuxEnableGamepadInput: 1 + hmiLogStartupTiming: 0 + hmiCpuConfiguration: + apiCompatibilityLevel: 6 + activeInputHandler: 0 + windowsGamepadBackendHint: 0 + cloudProjectId: + framebufferDepthMemorylessMode: 0 + qualitySettingsNames: [] + projectName: + organizationId: + cloudEnabled: 0 + legacyClampBlendShapeWeights: 0 + hmiLoadingImage: {fileID: 0} + platformRequiresReadableAssets: 0 + virtualTexturingSupportEnabled: 0 + insecureHttpOption: 0 diff --git a/ProjectSettings/ProjectVersion.txt b/ProjectSettings/ProjectVersion.txt new file mode 100644 index 0000000..a8e1242 --- /dev/null +++ b/ProjectSettings/ProjectVersion.txt @@ -0,0 +1,2 @@ +m_EditorVersion: 2022.3.12f1c1 +m_EditorVersionWithRevision: 2022.3.12f1c1 (46170ec42421) diff --git a/ProjectSettings/QualitySettings.asset b/ProjectSettings/QualitySettings.asset new file mode 100644 index 0000000..7b7658d --- /dev/null +++ b/ProjectSettings/QualitySettings.asset @@ -0,0 +1,232 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!47 &1 +QualitySettings: + m_ObjectHideFlags: 0 + serializedVersion: 5 + m_CurrentQuality: 5 + m_QualitySettings: + - serializedVersion: 2 + name: Very Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 15 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 1 + textureQuality: 1 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.3 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Low + pixelLightCount: 0 + shadows: 0 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 0 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 0 + lodBias: 0.4 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 16 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Medium + pixelLightCount: 1 + shadows: 1 + shadowResolution: 0 + shadowProjection: 1 + shadowCascades: 1 + shadowDistance: 20 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 0 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 0 + realtimeReflectionProbes: 0 + billboardsFaceCameraPosition: 0 + vSyncCount: 1 + lodBias: 0.7 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 64 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: High + pixelLightCount: 2 + shadows: 2 + shadowResolution: 1 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 40 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 2 + textureQuality: 0 + anisotropicTextures: 1 + antiAliasing: 0 + softParticles: 0 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 256 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Very High + pixelLightCount: 3 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 2 + shadowDistance: 70 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 1.5 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 1024 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + - serializedVersion: 2 + name: Ultra + pixelLightCount: 4 + shadows: 2 + shadowResolution: 2 + shadowProjection: 1 + shadowCascades: 4 + shadowDistance: 150 + shadowNearPlaneOffset: 3 + shadowCascade2Split: 0.33333334 + shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667} + shadowmaskMode: 1 + blendWeights: 4 + textureQuality: 0 + anisotropicTextures: 2 + antiAliasing: 2 + softParticles: 1 + softVegetation: 1 + realtimeReflectionProbes: 1 + billboardsFaceCameraPosition: 1 + vSyncCount: 1 + lodBias: 2 + maximumLODLevel: 0 + streamingMipmapsActive: 0 + streamingMipmapsAddAllCameras: 1 + streamingMipmapsMemoryBudget: 512 + streamingMipmapsRenderersPerFrame: 512 + streamingMipmapsMaxLevelReduction: 2 + streamingMipmapsMaxFileIORequests: 1024 + particleRaycastBudget: 4096 + asyncUploadTimeSlice: 2 + asyncUploadBufferSize: 16 + asyncUploadPersistentBuffer: 1 + resolutionScalingFixedDPIFactor: 1 + excludedTargetPlatforms: [] + m_PerPlatformDefaultQuality: + Android: 2 + Lumin: 5 + Nintendo 3DS: 5 + Nintendo Switch: 5 + PS4: 5 + PSP2: 2 + Stadia: 5 + Standalone: 5 + WebGL: 3 + Windows Store Apps: 5 + XboxOne: 5 + iPhone: 2 + tvOS: 2 diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset new file mode 100644 index 0000000..1c92a78 --- /dev/null +++ b/ProjectSettings/TagManager.asset @@ -0,0 +1,43 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!78 &1 +TagManager: + serializedVersion: 2 + tags: [] + layers: + - Default + - TransparentFX + - Ignore Raycast + - + - Water + - UI + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + m_SortingLayers: + - name: Default + uniqueID: 0 + locked: 0 diff --git a/ProjectSettings/TimeManager.asset b/ProjectSettings/TimeManager.asset new file mode 100644 index 0000000..558a017 --- /dev/null +++ b/ProjectSettings/TimeManager.asset @@ -0,0 +1,9 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!5 &1 +TimeManager: + m_ObjectHideFlags: 0 + Fixed Timestep: 0.02 + Maximum Allowed Timestep: 0.33333334 + m_TimeScale: 1 + Maximum Particle Timestep: 0.03 diff --git a/ProjectSettings/UnityConnectSettings.asset b/ProjectSettings/UnityConnectSettings.asset new file mode 100644 index 0000000..4c136ae --- /dev/null +++ b/ProjectSettings/UnityConnectSettings.asset @@ -0,0 +1,38 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!310 &1 +UnityConnectSettings: + m_ObjectHideFlags: 0 + serializedVersion: 1 + m_Enabled: 0 + m_TestMode: 0 + m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events + m_EventUrl: https://cdp.cloud.unity3d.com/v1/events + m_ConfigUrl: https://config.uca.cloud.unity3d.com + m_DashboardUrl: https://dashboard.unity3d.com + m_CNEventUrl: https://cdp.cloud.unity.cn/v1/events + m_CNConfigUrl: https://cdp.cloud.unity.cn/config + m_TestInitMode: 0 + CrashReportingSettings: + m_EventUrl: https://perf-events.cloud.unity.cn + m_Enabled: 0 + m_LogBufferSize: 10 + m_CaptureEditorExceptions: 1 + UnityPurchasingSettings: + m_Enabled: 0 + m_TestMode: 0 + UnityAnalyticsSettings: + m_Enabled: 1 + m_TestMode: 0 + m_InitializeOnStartup: 1 + m_PackageRequiringCoreStatsPresent: 0 + UnityAdsSettings: + m_Enabled: 0 + m_InitializeOnStartup: 1 + m_TestMode: 0 + m_IosGameId: + m_AndroidGameId: + m_GameIds: {} + m_GameId: + PerformanceReportingSettings: + m_Enabled: 0 diff --git a/ProjectSettings/VFXManager.asset b/ProjectSettings/VFXManager.asset new file mode 100644 index 0000000..3a95c98 --- /dev/null +++ b/ProjectSettings/VFXManager.asset @@ -0,0 +1,12 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!937362698 &1 +VFXManager: + m_ObjectHideFlags: 0 + m_IndirectShader: {fileID: 0} + m_CopyBufferShader: {fileID: 0} + m_SortShader: {fileID: 0} + m_StripUpdateShader: {fileID: 0} + m_RenderPipeSettingsPath: + m_FixedTimeStep: 0.016666668 + m_MaxDeltaTime: 0.05 diff --git a/ProjectSettings/VersionControlSettings.asset b/ProjectSettings/VersionControlSettings.asset new file mode 100644 index 0000000..dca2881 --- /dev/null +++ b/ProjectSettings/VersionControlSettings.asset @@ -0,0 +1,8 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!890905787 &1 +VersionControlSettings: + m_ObjectHideFlags: 0 + m_Mode: Visible Meta Files + m_CollabEditorSettings: + inProgressEnabled: 1 diff --git a/ProjectSettings/XRSettings.asset b/ProjectSettings/XRSettings.asset new file mode 100644 index 0000000..482590c --- /dev/null +++ b/ProjectSettings/XRSettings.asset @@ -0,0 +1,10 @@ +{ + "m_SettingKeys": [ + "VR Device Disabled", + "VR Device User Alert" + ], + "m_SettingValues": [ + "False", + "False" + ] +} \ No newline at end of file