From db4346aae0e4f6cb3f76f5be683c26f8a79adaca Mon Sep 17 00:00:00 2001
From: AurelienMIMT <73344115+AurelienMIMT@users.noreply.github.com>
Date: Mon, 20 Feb 2023 09:30:09 +0100
Subject: [PATCH 01/21] save
---
Psi.sln | 9 ++++++
.../Microsoft.Psi.Media.Native.x64.vcxproj | 6 ++--
...soft.Psi.Media_Interop.Windows.x64.vcxproj | 6 ++--
.../HoloLensCaptureApp.csproj | 5 +++-
.../HoloLensCaptureApp/Package.appxmanifest | 4 +--
....Psi.RealSense_Interop.Windows.x64.vcxproj | 6 ++--
.../Common/TypeResolutionHelper.cs | 8 +++--
.../Microsoft.Psi/Remoting/RemoteExporter.cs | 16 ++++++++--
TestConnection/Program.cs | 30 +++++++++++++++++++
TestConnection/TestConnection.csproj | 14 +++++++++
10 files changed, 87 insertions(+), 17 deletions(-)
create mode 100644 TestConnection/Program.cs
create mode 100644 TestConnection/TestConnection.csproj
diff --git a/Psi.sln b/Psi.sln
index 55b8270ae..b8aa79742 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -231,6 +231,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HoloLensCaptureInterop", "S
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Calibration", "Sources\Calibration\Test.Psi.Calibration\Test.Psi.Calibration.csproj", "{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestConnection", "TestConnection\TestConnection.csproj", "{E4D7E21F-8469-456F-828D-DE1D2590E4EA}"
+ ProjectSection(ProjectDependencies) = postProject
+ {04147400-0AB0-4F07-9975-D4B7E58150DB} = {04147400-0AB0-4F07-9975-D4B7E58150DB}
+ EndProjectSection
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -519,6 +524,10 @@ Global
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Sources/Media/Microsoft.Psi.Media.Native.x64/Microsoft.Psi.Media.Native.x64.vcxproj b/Sources/Media/Microsoft.Psi.Media.Native.x64/Microsoft.Psi.Media.Native.x64.vcxproj
index 8d8ce72d4..cd31eadb1 100644
--- a/Sources/Media/Microsoft.Psi.Media.Native.x64/Microsoft.Psi.Media.Native.x64.vcxproj
+++ b/Sources/Media/Microsoft.Psi.Media.Native.x64/Microsoft.Psi.Media.Native.x64.vcxproj
@@ -15,7 +15,7 @@
{C50F7F21-BEB0-4366-B73F-859EEBC3ED42}
Win32Proj
MicrosoftPsiMediaNativex64
- 10.0.19041.0
+ 10.0
4.7.2
@@ -32,14 +32,14 @@
DynamicLibrary
true
- v142
+ v143
Unicode
Spectre
DynamicLibrary
false
- v142
+ v143
true
Unicode
Spectre
diff --git a/Sources/Media/Microsoft.Psi.Media_Interop.Windows.x64/Microsoft.Psi.Media_Interop.Windows.x64.vcxproj b/Sources/Media/Microsoft.Psi.Media_Interop.Windows.x64/Microsoft.Psi.Media_Interop.Windows.x64.vcxproj
index 6d917eb5f..77e6684ab 100644
--- a/Sources/Media/Microsoft.Psi.Media_Interop.Windows.x64/Microsoft.Psi.Media_Interop.Windows.x64.vcxproj
+++ b/Sources/Media/Microsoft.Psi.Media_Interop.Windows.x64/Microsoft.Psi.Media_Interop.Windows.x64.vcxproj
@@ -16,7 +16,7 @@
ManagedCProj
VideoCapture
Microsoft.Psi.Media_Interop.Windows.x64
- 10.0.19041.0
+ 10.0
$(FFMPEGDir)\lib\avdevice.lib;$(FFMPEGDir)\lib\avfilter.lib;$(FFMPEGDir)\lib\postproc.lib;$(FFMPEGDir)\lib\swresample.lib;$(FFMPEGDir)\lib\avcodec.lib;$(FFMPEGDir)\lib\avformat.lib;$(FFMPEGDir)\lib\avutil.lib;$(FFMPEGDir)\lib\swscale.lib
@@ -34,7 +34,7 @@
true
true
Unicode
- v142
+ v143
Spectre
@@ -42,7 +42,7 @@
false
true
Unicode
- v142
+ v143
Spectre
diff --git a/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/HoloLensCaptureApp.csproj b/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/HoloLensCaptureApp.csproj
index 839801c5b..82bb340bb 100644
--- a/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/HoloLensCaptureApp.csproj
+++ b/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/HoloLensCaptureApp.csproj
@@ -17,7 +17,7 @@
512
{A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
true
- false
+ True
Language=en
..\..\..\..\Build\Microsoft.Psi.ruleset
true
@@ -27,6 +27,8 @@
arm
True
True
+ 225DDDE2A5679E6037540DA0ECCE5C3BE1EBB290
+ SHA256
ARM
@@ -143,6 +145,7 @@
+
diff --git a/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Package.appxmanifest b/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Package.appxmanifest
index 3779d06d2..d51836e87 100644
--- a/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Package.appxmanifest
+++ b/Sources/MixedReality/HoloLensCapture/HoloLensCaptureApp/Package.appxmanifest
@@ -9,8 +9,8 @@
+ Publisher="CN=AurélienM"
+ Version="1.0.2.0" />
diff --git a/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/Microsoft.Psi.RealSense_Interop.Windows.x64.vcxproj b/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/Microsoft.Psi.RealSense_Interop.Windows.x64.vcxproj
index 4c4e5a8b2..08e17298c 100644
--- a/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/Microsoft.Psi.RealSense_Interop.Windows.x64.vcxproj
+++ b/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/Microsoft.Psi.RealSense_Interop.Windows.x64.vcxproj
@@ -16,14 +16,14 @@
v4.7.2
ManagedCProj
MicrosoftPsiRealSenseWindows_InteropWindowsx64
- 10.0.19041.0
+ 10.0
Microsoft.Psi.RealSense_Interop.Windows.x64
DynamicLibrary
true
- v142
+ v143
true
Unicode
Spectre
@@ -31,7 +31,7 @@
DynamicLibrary
false
- v142
+ v143
true
Unicode
Spectre
diff --git a/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs b/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs
index 14cda5590..ef3126779 100644
--- a/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs
+++ b/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs
@@ -21,8 +21,8 @@ public static class TypeResolutionHelper
/// The requested type, or null if the type was not found.
public static Type GetVerifiedType(string typeName)
{
- var type = Type.GetType(typeName, AssemblyResolver, null);
-
+ // var type = Type.GetType(typeName, AssemblyResolver, null);
+ var type = Type.GetType(typeName);
if (type == null)
{
// Unable to resolve type. Attempt to resolve base class library types
@@ -30,7 +30,9 @@ public static Type GetVerifiedType(string typeName)
// Type.GetType will attempt to resolve types without assembly names from
// mscorlib/System.Private.CoreLib or the currently executing assembly.
typeName = RemoveCoreAssemblyName(typeName);
- type = Type.GetType(typeName, AssemblyResolver, null);
+
+ // type = Type.GetType(typeName, AssemblyResolver, null);
+ type = Type.GetType(typeName);
}
return type;
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs
index 0935318d6..a9e67db7a 100644
--- a/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs
@@ -10,6 +10,7 @@ namespace Microsoft.Psi.Remoting
using System.IO;
using System.Net;
using System.Net.Sockets;
+ using System.Numerics;
using System.Threading;
using Microsoft.Psi.Common;
using Microsoft.Psi.Data;
@@ -217,9 +218,9 @@ private void AcceptDataClientsBackground()
{
try
{
- this.dataTransport.StartListening();
while (!this.disposed)
{
+ this.dataTransport.StartListening();
var client = this.dataTransport.AcceptClient();
var guid = Guid.Empty;
try
@@ -229,7 +230,7 @@ private void AcceptDataClientsBackground()
if (this.connections.TryGetValue(guid, out Connection connection))
{
- connection.JoinBackground(client);
+ connection.JoinBackgroundThread(client);
}
else
{
@@ -265,6 +266,7 @@ private sealed class Connection : IDisposable
private Stream stream;
private PsiStoreReader storeReader;
private TimeInterval interval;
+ private Thread connectionThread;
public Connection(TcpClient client, ITransport dataTransport, string name, string path, Action onDisconnect, Exporter exporter, long maxBytesPerSecond, double bytesPerSecondSmoothingWindowSeconds)
{
@@ -278,6 +280,7 @@ public Connection(TcpClient client, ITransport dataTransport, string name, strin
this.exporter = exporter;
this.maxBytesPerSecond = maxBytesPerSecond;
this.bytesPerSecondSmoothingWindowSeconds = bytesPerSecondSmoothingWindowSeconds;
+ this.connectionThread = null;
}
public Guid Id => this.id;
@@ -332,6 +335,12 @@ public void Connect()
}
}
+ public void JoinBackgroundThread(ITransportClient client)
+ {
+ this.connectionThread = new Thread(() => this.JoinBackground(client));
+ this.connectionThread.Start();
+ }
+
public void JoinBackground(ITransportClient client)
{
double avgBytesPerSec = 0;
@@ -393,11 +402,14 @@ public void Dispose()
this.client = null;
this.stream.Dispose();
this.stream = null;
+ this.connectionThread.Abort();
+ this.connectionThread = null;
}
private void Disconnect()
{
this.onDisconnect(this.id);
+ this.connectionThread.Abort();
this.Dispose();
}
diff --git a/TestConnection/Program.cs b/TestConnection/Program.cs
new file mode 100644
index 000000000..65fe44b72
--- /dev/null
+++ b/TestConnection/Program.cs
@@ -0,0 +1,30 @@
+using Microsoft.Psi;
+using Microsoft.Psi.Remoting;
+
+namespace TestConnection
+{
+ internal class Program
+ {
+ static void Main(string[] args)
+ {
+ // Create the \psi pipeline
+ Pipeline pipeline = Pipeline.Create("TestConnection");
+
+ RemoteExporter exporter = new RemoteExporter(pipeline, 11411, TransportKind.Tcp);
+ // Create a timer component that produces a message every second
+ var timer = Timers.Timer(pipeline, TimeSpan.FromSeconds(1));
+
+ // For each message created by the timer
+ exporter.Exporter.Write(timer.Out, "Test");
+
+ // Start the pipeline running
+ pipeline.RunAsync();
+
+ // Wainting for an out key
+ Console.WriteLine("Press any key to stop the application.");
+ Console.ReadLine();
+ // Stop correctly the pipeline.
+ pipeline.Dispose();
+ }
+ }
+}
diff --git a/TestConnection/TestConnection.csproj b/TestConnection/TestConnection.csproj
new file mode 100644
index 000000000..84d39688d
--- /dev/null
+++ b/TestConnection/TestConnection.csproj
@@ -0,0 +1,14 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
From 2cde08b379006831ee8a94e75bf8b3ab9abb83d7 Mon Sep 17 00:00:00 2001
From: AurelienMIMT <73344115+AurelienMIMT@users.noreply.github.com>
Date: Mon, 20 Feb 2023 09:55:26 +0100
Subject: [PATCH 02/21] last version
---
Psi.sln | 293 +++++++++++++++++-
.../Common/TypeResolutionHelper.cs | 6 +-
2 files changed, 291 insertions(+), 8 deletions(-)
diff --git a/Psi.sln b/Psi.sln
index b8aa79742..4cc65e651 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -53,7 +53,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Speech.Windows", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Audio", "Sources\Audio\Test.Psi.Audio\Test.Psi.Audio.csproj", "{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Psi.Imaging.Windows", "Sources\Imaging\Test.Psi.Imaging.Windows\Test.Psi.Imaging.Windows.csproj", "{191DF615-3D8F-45A3-B763-DD4A604A712A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Imaging.Windows", "Sources\Imaging\Test.Psi.Imaging.Windows\Test.Psi.Imaging.Windows.csproj", "{191DF615-3D8F-45A3-B763-DD4A604A712A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Toolkits", "Toolkits", "{B592009C-5137-4D7F-8B50-C7D8500230D6}"
EndProject
@@ -232,302 +232,587 @@ EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Calibration", "Sources\Calibration\Test.Psi.Calibration\Test.Psi.Calibration.csproj", "{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestConnection", "TestConnection\TestConnection.csproj", "{E4D7E21F-8469-456F-828D-DE1D2590E4EA}"
- ProjectSection(ProjectDependencies) = postProject
- {04147400-0AB0-4F07-9975-D4B7E58150DB} = {04147400-0AB0-4F07-9975-D4B7E58150DB}
- EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|x64.Build.0 = Debug|Any CPU
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|x64.ActiveCfg = Release|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|x64.Build.0 = Release|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|x64.Build.0 = Debug|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|x64.ActiveCfg = Release|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|x64.Build.0 = Release|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|x64.Build.0 = Debug|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|Any CPU.ActiveCfg = Release|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|Any CPU.Build.0 = Release|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|x64.ActiveCfg = Release|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|x64.Build.0 = Release|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|x64.Build.0 = Debug|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|x64.ActiveCfg = Release|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|x64.Build.0 = Release|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|x64.Build.0 = Debug|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|x64.ActiveCfg = Release|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|x64.Build.0 = Release|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|x64.Build.0 = Debug|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|x64.ActiveCfg = Release|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|x64.Build.0 = Release|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Debug|x64.Build.0 = Debug|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Release|x64.ActiveCfg = Release|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Release|x64.Build.0 = Release|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|x64.Build.0 = Debug|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|x64.ActiveCfg = Release|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|x64.Build.0 = Release|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|x64.Build.0 = Debug|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|x64.ActiveCfg = Release|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|x64.Build.0 = Release|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|x64.Build.0 = Debug|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Release|x64.ActiveCfg = Release|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Release|x64.Build.0 = Release|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|x64.Build.0 = Debug|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|x64.ActiveCfg = Release|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|x64.Build.0 = Release|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|x64.Build.0 = Debug|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|x64.ActiveCfg = Release|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|x64.Build.0 = Release|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|x64.Build.0 = Debug|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Release|Any CPU.Build.0 = Release|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Release|x64.ActiveCfg = Release|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Release|x64.Build.0 = Release|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|x64.Build.0 = Debug|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Release|x64.ActiveCfg = Release|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Release|x64.Build.0 = Release|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|x64.Build.0 = Debug|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|x64.ActiveCfg = Release|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|x64.Build.0 = Release|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|x64.Build.0 = Debug|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|x64.ActiveCfg = Release|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|x64.Build.0 = Release|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|x64.Build.0 = Debug|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|x64.ActiveCfg = Release|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|x64.Build.0 = Release|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|x64.Build.0 = Debug|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|x64.ActiveCfg = Release|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|x64.Build.0 = Release|Any CPU
{5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|Any CPU.ActiveCfg = Debug|x64
{5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|Any CPU.Build.0 = Debug|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|x64.ActiveCfg = Debug|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|x64.Build.0 = Debug|x64
{5348A94F-7B3A-4B42-8555-2A1491971090}.Release|Any CPU.ActiveCfg = Release|x64
{5348A94F-7B3A-4B42-8555-2A1491971090}.Release|Any CPU.Build.0 = Release|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Release|x64.ActiveCfg = Release|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Release|x64.Build.0 = Release|x64
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|x64.Build.0 = Debug|Any CPU
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|x64.ActiveCfg = Release|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|x64.Build.0 = Release|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|x64.Build.0 = Debug|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Release|Any CPU.Build.0 = Release|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Release|x64.ActiveCfg = Release|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Release|x64.Build.0 = Release|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|x64.Build.0 = Debug|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|Any CPU.ActiveCfg = Release|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|Any CPU.Build.0 = Release|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|x64.ActiveCfg = Release|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|x64.Build.0 = Release|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|x64.Build.0 = Debug|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Release|x64.Build.0 = Release|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|x64.Build.0 = Debug|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|x64.ActiveCfg = Release|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|x64.Build.0 = Release|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|x64.Build.0 = Debug|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Release|x64.ActiveCfg = Release|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Release|x64.Build.0 = Release|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|x64.Build.0 = Debug|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|x64.ActiveCfg = Release|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|x64.Build.0 = Release|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|x64.Build.0 = Debug|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|x64.ActiveCfg = Release|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|x64.Build.0 = Release|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|x64.Build.0 = Debug|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|x64.ActiveCfg = Release|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|x64.Build.0 = Release|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|x64.Build.0 = Debug|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|x64.ActiveCfg = Release|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|x64.Build.0 = Release|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|x64.Build.0 = Debug|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|x64.ActiveCfg = Release|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|x64.Build.0 = Release|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|x64.Build.0 = Debug|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|x64.ActiveCfg = Release|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|x64.Build.0 = Release|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|x64.Build.0 = Debug|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|x64.ActiveCfg = Release|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|x64.Build.0 = Release|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|x64.Build.0 = Debug|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|x64.ActiveCfg = Release|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|x64.Build.0 = Release|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|x64.Build.0 = Debug|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|x64.ActiveCfg = Release|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|x64.Build.0 = Release|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|x64.Build.0 = Debug|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|x64.ActiveCfg = Release|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|x64.Build.0 = Release|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|x64.Build.0 = Debug|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|x64.ActiveCfg = Release|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|x64.Build.0 = Release|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|x64.Build.0 = Debug|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|x64.ActiveCfg = Release|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|x64.Build.0 = Release|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|x64.Build.0 = Debug|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|x64.ActiveCfg = Release|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|x64.Build.0 = Release|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|x64.Build.0 = Debug|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Release|x64.ActiveCfg = Release|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Release|x64.Build.0 = Release|Any CPU
{C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|Any CPU.ActiveCfg = Debug|x64
{C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|Any CPU.Build.0 = Debug|x64
+ {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|x64.ActiveCfg = Debug|x64
+ {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|x64.Build.0 = Debug|x64
{C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|Any CPU.ActiveCfg = Release|x64
{C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|Any CPU.Build.0 = Release|x64
+ {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|x64.ActiveCfg = Release|x64
+ {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|x64.Build.0 = Release|x64
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|x64.Build.0 = Debug|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Release|x64.ActiveCfg = Release|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Release|x64.Build.0 = Release|Any CPU
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|Any CPU.ActiveCfg = Debug|x64
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|Any CPU.Build.0 = Debug|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|x64.ActiveCfg = Debug|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|x64.Build.0 = Debug|x64
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|Any CPU.ActiveCfg = Release|x64
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|Any CPU.Build.0 = Release|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|x64.ActiveCfg = Release|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|x64.Build.0 = Release|x64
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|x64.Build.0 = Debug|Any CPU
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|x64.ActiveCfg = Release|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|x64.Build.0 = Release|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|x64.Build.0 = Debug|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|x64.ActiveCfg = Release|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|x64.Build.0 = Release|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|x64.Build.0 = Debug|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|x64.ActiveCfg = Release|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|x64.Build.0 = Release|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|x64.Build.0 = Debug|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|x64.ActiveCfg = Release|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|x64.Build.0 = Release|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|x64.Build.0 = Debug|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|x64.ActiveCfg = Release|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|x64.Build.0 = Release|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|x64.Build.0 = Debug|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Release|Any CPU.ActiveCfg = Release|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Release|x64.ActiveCfg = Release|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Release|x64.Build.0 = Release|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Debug|x64.Build.0 = Debug|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Release|x64.ActiveCfg = Release|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Release|x64.Build.0 = Release|Any CPU
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|Any CPU.ActiveCfg = Debug|x64
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|Any CPU.Build.0 = Debug|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|x64.ActiveCfg = Debug|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|x64.Build.0 = Debug|x64
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|Any CPU.ActiveCfg = Release|x64
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|Any CPU.Build.0 = Release|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|x64.ActiveCfg = Release|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|x64.Build.0 = Release|x64
{F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|x64.Build.0 = Debug|Any CPU
{F31606FF-3737-45DC-8E89-6256AACD841F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F31606FF-3737-45DC-8E89-6256AACD841F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Release|x64.ActiveCfg = Release|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Release|x64.Build.0 = Release|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|x64.Build.0 = Debug|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|x64.ActiveCfg = Release|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|x64.Build.0 = Release|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|x64.Build.0 = Debug|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|x64.ActiveCfg = Release|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|x64.Build.0 = Release|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|x64.Build.0 = Debug|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|x64.ActiveCfg = Release|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|x64.Build.0 = Release|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Debug|x64.Build.0 = Debug|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Release|x64.ActiveCfg = Release|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Release|x64.Build.0 = Release|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|x64.Build.0 = Debug|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|x64.ActiveCfg = Release|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|x64.Build.0 = Release|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|x64.Build.0 = Debug|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|x64.ActiveCfg = Release|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|x64.Build.0 = Release|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|x64.Build.0 = Debug|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|x64.ActiveCfg = Release|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|x64.Build.0 = Release|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|x64.Build.0 = Debug|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|x64.ActiveCfg = Release|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|x64.Build.0 = Release|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|x64.Build.0 = Debug|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|x64.ActiveCfg = Release|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|x64.Build.0 = Release|Any CPU
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|Any CPU.ActiveCfg = Debug|ARM
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|Any CPU.Build.0 = Debug|ARM
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|x64.ActiveCfg = Debug|x64
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|x64.Build.0 = Debug|x64
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|Any CPU.ActiveCfg = Release|ARM
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|Any CPU.Build.0 = Release|ARM
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|x64.ActiveCfg = Release|x64
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|x64.Build.0 = Release|x64
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|x64.Build.0 = Debug|Any CPU
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|x64.ActiveCfg = Release|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|x64.Build.0 = Release|Any CPU
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|Any CPU.ActiveCfg = Debug|ARM
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|Any CPU.Build.0 = Debug|ARM
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|x64.ActiveCfg = Debug|Win32
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|x64.Build.0 = Debug|Win32
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|Any CPU.ActiveCfg = Release|ARM
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|Any CPU.Build.0 = Release|ARM
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|x64.ActiveCfg = Release|Win32
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|x64.Build.0 = Release|Win32
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|x64.Build.0 = Debug|Any CPU
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|x64.ActiveCfg = Release|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|x64.Build.0 = Release|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|x64.Build.0 = Debug|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|x64.ActiveCfg = Release|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|x64.Build.0 = Release|Any CPU
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|Any CPU.ActiveCfg = Debug|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|Any CPU.Build.0 = Debug|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|Any CPU.Deploy.0 = Debug|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|x64.ActiveCfg = Debug|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|x64.Build.0 = Debug|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|x64.Deploy.0 = Debug|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|Any CPU.ActiveCfg = Release|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|Any CPU.Build.0 = Release|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|Any CPU.Deploy.0 = Release|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|x64.ActiveCfg = Release|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|x64.Build.0 = Release|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|x64.Deploy.0 = Release|ARM
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|x64.Build.0 = Debug|Any CPU
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|Any CPU.ActiveCfg = Release|Any CPU
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|Any CPU.Build.0 = Release|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|x64.ActiveCfg = Release|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|x64.Build.0 = Release|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|x64.Build.0 = Debug|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|x64.ActiveCfg = Release|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|x64.Build.0 = Release|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|x64.Build.0 = Debug|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|Any CPU.Build.0 = Release|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|x64.ActiveCfg = Release|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|x64.Build.0 = Release|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|x64.Build.0 = Debug|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.ActiveCfg = Release|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.Build.0 = Release|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|x64.Build.0 = Debug|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|x64.ActiveCfg = Release|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs b/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs
index ef3126779..8d54e1c8a 100644
--- a/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs
+++ b/Sources/Runtime/Microsoft.Psi/Common/TypeResolutionHelper.cs
@@ -21,8 +21,7 @@ public static class TypeResolutionHelper
/// The requested type, or null if the type was not found.
public static Type GetVerifiedType(string typeName)
{
- // var type = Type.GetType(typeName, AssemblyResolver, null);
- var type = Type.GetType(typeName);
+ var type = Type.GetType(typeName, AssemblyResolver, null);
if (type == null)
{
// Unable to resolve type. Attempt to resolve base class library types
@@ -31,8 +30,7 @@ public static Type GetVerifiedType(string typeName)
// mscorlib/System.Private.CoreLib or the currently executing assembly.
typeName = RemoveCoreAssemblyName(typeName);
- // type = Type.GetType(typeName, AssemblyResolver, null);
- type = Type.GetType(typeName);
+ type = Type.GetType(typeName, AssemblyResolver, null);
}
return type;
From 5385949d651f464f5d6d4948d66a16fbda144545 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Tue, 29 Aug 2023 17:31:09 +0200
Subject: [PATCH 03/21] Allowing Subpipline to stop. Unregestering from
parentPipeline.
---
.../Microsoft.Psi/Executive/Pipeline.cs | 49 ++++++++++++---
.../Microsoft.Psi/Executive/Subpipeline.cs | 12 ++++
.../Microsoft.Psi/Microsoft.Psi.csproj | 2 +
.../Microsoft.Psi/Remoting/RemoteExporter.cs | 59 +++++++++++--------
TestConnection/Program.cs | 52 +++++++++++++---
5 files changed, 133 insertions(+), 41 deletions(-)
diff --git a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
index 73d1c0513..eb855a492 100644
--- a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
+++ b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
@@ -4,6 +4,7 @@
namespace Microsoft.Psi
{
using System;
+ using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
@@ -888,6 +889,33 @@ internal virtual void Stop(DateTime finalOriginatingTime, bool abandonPendingWor
this.completed.Set();
}
+ internal bool RemoveSubpipline(Subpipeline subpipeline)
+ {
+ PipelineElement node = this.components.FirstOrDefault(c => c.StateObject == subpipeline);
+ if (node == null)
+ {
+ return false;
+ }
+
+ if (!subpipeline.IsCompleted)
+ {
+ throw new InvalidOperationException($"Subpipeline is still running, it can't be removed from parent pipeline.");
+ }
+
+ List list = subpipeline.Components.ToList();
+ list.Add(node);
+ SynchronizationLock locker = new SynchronizationLock(this, true);
+ this.scheduler.Freeze(locker);
+ this.components = new ConcurrentQueue(this.components.Where(x => !list.Contains(x)));
+ foreach (PipelineElement child in list)
+ {
+ this.DiagnosticsCollector?.PipelineElementDisposed(this, child);
+ }
+
+ locker.Release();
+ return true;
+ }
+
///
/// Run pipeline (asynchronously).
///
@@ -964,6 +992,18 @@ protected virtual IDisposable RunAsync(ReplayDescriptor descriptor, Clock clock,
return this;
}
+ ///
+ /// Dispose components within pipeline and recursively within subpipelines.
+ ///
+ protected void DisposeComponents()
+ {
+ foreach (var component in this.components)
+ {
+ this.DiagnosticsCollector?.PipelineElementDisposed(this, component);
+ component.Dispose();
+ }
+ }
+
///
/// Gather all nodes within this pipeline and recursively within subpipelines.
///
@@ -1389,15 +1429,6 @@ private void NotifyPipelineFinalizing(DateTime finalOriginatingTime)
}
}
- private void DisposeComponents()
- {
- foreach (var component in this.components)
- {
- this.DiagnosticsCollector?.PipelineElementDisposed(this, component);
- component.Dispose();
- }
- }
-
private void ThrowIfError()
{
if (this.PipelineExceptionNotHandled != null)
diff --git a/Sources/Runtime/Microsoft.Psi/Executive/Subpipeline.cs b/Sources/Runtime/Microsoft.Psi/Executive/Subpipeline.cs
index aaa5c0a92..c78c863d7 100644
--- a/Sources/Runtime/Microsoft.Psi/Executive/Subpipeline.cs
+++ b/Sources/Runtime/Microsoft.Psi/Executive/Subpipeline.cs
@@ -4,6 +4,7 @@
namespace Microsoft.Psi
{
using System;
+ using System.Collections.Concurrent;
using System.Linq;
using Microsoft.Psi.Components;
using Microsoft.Psi.Executive;
@@ -102,6 +103,17 @@ public void Stop(DateTime finalOriginatingTime, Action notifyCompleted)
}
}
+ ///
+ /// Remove subpipline from parent.
+ ///
+ public override void Dispose()
+ {
+ this.Stop(this.parentPipeline.GetCurrentTime(), true);
+ this.DisposeComponents();
+ this.parentPipeline.RemoveSubpipline(this);
+ this.SchedulerContext.Dispose();
+ }
+
///
public override void ProposeReplayTime(TimeInterval originatingTimeInterval)
{
diff --git a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
index f6627c071..4fc078b71 100644
--- a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
+++ b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
@@ -5,6 +5,8 @@
true
Microsoft.Psi.Runtime
Provides the core APIs and components for Platform for Situated Intelligence.
+ 0.18.72.1
+ $(AssemblyVersion)-modifiedPipeTest3
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs
index 8e3ec132f..8742d5a7d 100644
--- a/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemoteExporter.cs
@@ -8,6 +8,7 @@ namespace Microsoft.Psi.Remoting
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
+ using System.Linq.Expressions;
using System.Net;
using System.Net.Sockets;
using System.Numerics;
@@ -261,6 +262,7 @@ private sealed class Connection : IDisposable
private readonly string storeName;
private readonly string storePath;
+ private bool threadRunning;
private TcpClient client;
private Stream stream;
@@ -337,6 +339,7 @@ public void Connect()
public void JoinBackgroundThread(ITransportClient client)
{
+ this.threadRunning = true;
this.connectionThread = new Thread(() => this.JoinBackground(client));
this.connectionThread.Start();
}
@@ -354,48 +357,56 @@ public void JoinBackground(ITransportClient client)
this.storeReader.Seek(this.interval);
- while (true)
+ while (this.threadRunning)
{
- if (this.storeReader.MoveNext(out Envelope envelope))
+ try
{
- var length = this.storeReader.Read(ref buffer);
- this.exporter.Throttle.Reset();
- try
+ if (this.storeReader.MoveNext(out Envelope envelope))
{
- client.WriteMessage(envelope, buffer);
- if (lastTime > DateTime.MinValue /* at least second message */)
+ var length = this.storeReader.Read(ref buffer);
+ this.exporter.Throttle.Reset();
+ try
{
- if (this.maxBytesPerSecond < long.MaxValue)
+ client.WriteMessage(envelope, buffer);
+ if (lastTime > DateTime.MinValue /* at least second message */)
{
- // throttle to arbitrary max BPS
- var elapsed = (envelope.OriginatingTime - lastTime).TotalSeconds;
- var bytesPerSec = (envelopeSize + length) / elapsed;
- double smoothingFactor = 1.0 / (this.bytesPerSecondSmoothingWindowSeconds / elapsed);
- avgBytesPerSec = (bytesPerSec * smoothingFactor) + (avgBytesPerSec * (1.0 - smoothingFactor));
- if (bytesPerSec > this.maxBytesPerSecond)
+ if (this.maxBytesPerSecond < long.MaxValue)
{
- var wait = (int)(((avgBytesPerSec / this.maxBytesPerSecond) - elapsed) * 1000.0);
- if (wait > 0)
+ // throttle to arbitrary max BPS
+ var elapsed = (envelope.OriginatingTime - lastTime).TotalSeconds;
+ var bytesPerSec = (envelopeSize + length) / elapsed;
+ double smoothingFactor = 1.0 / (this.bytesPerSecondSmoothingWindowSeconds / elapsed);
+ avgBytesPerSec = (bytesPerSec * smoothingFactor) + (avgBytesPerSec * (1.0 - smoothingFactor));
+ if (bytesPerSec > this.maxBytesPerSecond)
{
- Thread.Sleep(wait);
+ var wait = (int)(((avgBytesPerSec / this.maxBytesPerSecond) - elapsed) * 1000.0);
+ if (wait > 0)
+ {
+ Thread.Sleep(wait);
+ }
}
}
}
- }
- lastTime = envelope.OriginatingTime;
- }
- finally
- {
- // writers continue upon failure - meanwhile, remote client may reconnect and resume based on replay interval
- this.exporter.Throttle.Set();
+ lastTime = envelope.OriginatingTime;
+ }
+ finally
+ {
+ // writers continue upon failure - meanwhile, remote client may reconnect and resume based on replay interval
+ this.exporter.Throttle.Set();
+ }
}
}
+ catch (Exception)
+ {
+ this.threadRunning = false;
+ }
}
}
public void Dispose()
{
+ this.threadRunning = false;
this.storeReader.Dispose();
this.storeReader = null;
this.client.Dispose();
diff --git a/TestConnection/Program.cs b/TestConnection/Program.cs
index 65fe44b72..948f46d11 100644
--- a/TestConnection/Program.cs
+++ b/TestConnection/Program.cs
@@ -8,18 +8,54 @@ internal class Program
static void Main(string[] args)
{
// Create the \psi pipeline
- Pipeline pipeline = Pipeline.Create("TestConnection");
-
- RemoteExporter exporter = new RemoteExporter(pipeline, 11411, TransportKind.Tcp);
- // Create a timer component that produces a message every second
+ Pipeline pipeline = Pipeline.Create("Subpipline Removal");
var timer = Timers.Timer(pipeline, TimeSpan.FromSeconds(1));
-
- // For each message created by the timer
- exporter.Exporter.Write(timer.Out, "Test");
-
+ timer.Out.Do(t =>
+ {
+ Console.WriteLine($"\tPipeline timer.");
+ });
// Start the pipeline running
pipeline.RunAsync();
+ Console.WriteLine("Pipeline Run Asynch.");
+ Subpipeline sub1 = new Subpipeline(pipeline);
+ var subtimer1 = Timers.Timer(sub1, TimeSpan.FromSeconds(1));
+ subtimer1.Out.Do(t =>
+ {
+ Console.WriteLine($"\tSubpipeline 1 timer.");
+ });
+ RemoteExporter exporter1 = new RemoteExporter(sub1, 11511, TransportKind.Tcp);
+ exporter1.Exporter.Write(subtimer1.Out, "SubExporter1");
+ sub1.RunAsync();
+ Console.WriteLine("Subpipeline 1 Run Asynch.");
+ Thread.Sleep(3000);
+ Subpipeline sub2 = new Subpipeline(pipeline);
+ var subtimer2 = Timers.Timer(sub2, TimeSpan.FromSeconds(1));
+ subtimer2.Out.Do(t =>
+ {
+ Console.WriteLine($"\tSubpipeline 2 timer.");
+ });
+ RemoteExporter exporter2 = new RemoteExporter(sub2, 11512, TransportKind.Tcp);
+ exporter2.Exporter.Write(subtimer2.Out, "SubExporter2");
+ sub2.RunAsync();
+ Console.WriteLine("Subpipeline 2 Run Asynch.");
+ Thread.Sleep(5000);
+ Console.WriteLine("Dispose Subpipeline 1.");
+ sub1.Dispose();
+ Thread.Sleep(5000);
+ Console.WriteLine("Dispose Subpipeline 2.");
+ sub2.Dispose();
+ Thread.Sleep(5000);
+ Subpipeline sub3 = new Subpipeline(pipeline);
+ var subtimer3 = Timers.Timer(sub3, TimeSpan.FromSeconds(1));
+ subtimer3.Out.Do(t =>
+ {
+ Console.WriteLine($"\tSubpipeline 3 timer.");
+ });
+ RemoteExporter exporter3 = new RemoteExporter(sub3, 11513, TransportKind.Tcp);
+ exporter3.Exporter.Write(subtimer3.Out, "SubExporter3");
+ sub3.RunAsync();
+ Console.WriteLine("Subpipeline 3 Run Asynch.");
// Wainting for an out key
Console.WriteLine("Press any key to stop the application.");
Console.ReadLine();
From 2bd8c07f85fc826e942f850dc17c736566aa0d36 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Wed, 6 Dec 2023 08:33:43 +0100
Subject: [PATCH 04/21] packages update
---
.../Microsoft.Psi.Audio.Windows.csproj | 4 ++--
.../Microsoft.Psi.Audio.csproj | 4 ++--
.../Microsoft.Psi.Calibration.csproj | 6 ++---
.../Test.Psi.Common/Test.Psi.Common.csproj | 6 ++---
.../Microsoft.Psi.Data.csproj | 6 ++---
.../Microsoft.Psi.Imaging.Windows.csproj | 4 ++--
.../Microsoft.Psi.Imaging.csproj | 6 ++---
.../HoloLens2ResearchMode.vcxproj | 8 +++----
.../HoloLens2ResearchMode/packages.config | 2 +-
.../packages.config | 3 ++-
.../Microsoft.Psi/Executive/Pipeline.cs | 23 +++++++++++++++++++
.../Microsoft.Psi/Microsoft.Psi.csproj | 8 +++----
.../Microsoft.Psi.Speech.csproj | 4 ++--
.../Microsoft.Psi.PsiStudio.csproj | 4 ++--
.../Test.Psi.PsiStudio.csproj | 4 ++--
.../Microsoft.Msagl.WpfGraphControl.csproj | 6 ++---
...si.LiveCharts.Visualization.Windows.csproj | 4 ++--
...Microsoft.Psi.Visualization.Windows.csproj | 14 +++++------
.../Test.Psi.Visualization.csproj | 8 +++----
19 files changed, 74 insertions(+), 50 deletions(-)
diff --git a/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj b/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj
index c0c73b894..0f4dd95bc 100644
--- a/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj
+++ b/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj
@@ -30,10 +30,10 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
\ No newline at end of file
diff --git a/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj b/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj
index 2ff943680..e4a072ad1 100644
--- a/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj
+++ b/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj
@@ -36,11 +36,11 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
diff --git a/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj b/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj
index 6137dab33..1850480d1 100644
--- a/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj
+++ b/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj
@@ -25,12 +25,12 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
-
+
+
diff --git a/Sources/Common/Test.Psi.Common/Test.Psi.Common.csproj b/Sources/Common/Test.Psi.Common/Test.Psi.Common.csproj
index e33166bcf..c3d73966d 100644
--- a/Sources/Common/Test.Psi.Common/Test.Psi.Common.csproj
+++ b/Sources/Common/Test.Psi.Common/Test.Psi.Common.csproj
@@ -29,12 +29,12 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
-
+
+
diff --git a/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj b/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj
index 680e691cf..9c61595bf 100644
--- a/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj
+++ b/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj
@@ -29,12 +29,12 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
-
+
+
diff --git a/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj b/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj
index 43258eb31..4c12e4fb5 100644
--- a/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj
+++ b/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj
@@ -26,11 +26,11 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
diff --git a/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj b/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj
index 03d8e1111..f8d13b91e 100644
--- a/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj
+++ b/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj
@@ -31,13 +31,13 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
-
+
diff --git a/Sources/MixedReality/HoloLens2ResearchMode/HoloLens2ResearchMode.vcxproj b/Sources/MixedReality/HoloLens2ResearchMode/HoloLens2ResearchMode.vcxproj
index 0a92bd96e..6ef6be832 100644
--- a/Sources/MixedReality/HoloLens2ResearchMode/HoloLens2ResearchMode.vcxproj
+++ b/Sources/MixedReality/HoloLens2ResearchMode/HoloLens2ResearchMode.vcxproj
@@ -1,6 +1,6 @@
-
+
true
true
@@ -161,13 +161,13 @@
-
+
This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
+
+
\ No newline at end of file
diff --git a/Sources/MixedReality/HoloLens2ResearchMode/packages.config b/Sources/MixedReality/HoloLens2ResearchMode/packages.config
index 70bf1926d..1b8cfbd96 100644
--- a/Sources/MixedReality/HoloLens2ResearchMode/packages.config
+++ b/Sources/MixedReality/HoloLens2ResearchMode/packages.config
@@ -1,4 +1,4 @@
-
+
\ No newline at end of file
diff --git a/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/packages.config b/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/packages.config
index 0f77b525b..750d2262e 100644
--- a/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/packages.config
+++ b/Sources/RealSense/Microsoft.Psi.RealSense_Interop.Windows.x64/packages.config
@@ -1,4 +1,5 @@
-
+
+
\ No newline at end of file
diff --git a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
index eb855a492..423b84393 100644
--- a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
+++ b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
@@ -307,6 +307,29 @@ public static Pipeline Create(
return new Pipeline(name, deliveryPolicy, threadCount, allowSchedulingOnExternalThreads, enableDiagnostics, diagnosticsConfiguration);
}
+ ///
+ /// Create new pipeline setting time offset and diagnostics collector from given pipeline.
+ ///
+ /// Pipeline to retrieve time offset and diagonistic configuration.
+ /// Pipeline name.
+ /// Number of threads.
+ /// Whether to allow scheduling on external threads.
+ /// Indicates whether to enable collecting and publishing diagnostics information on the Pipeline.Diagnostics stream.
+ /// Created pipeline.
+ public static Pipeline CreateSynchedPipeline(
+ Pipeline pipeline,
+ string name = null,
+ int threadCount = 0,
+ bool allowSchedulingOnExternalThreads = false,
+ bool enableDiagnostics = false)
+ {
+ Pipeline newPipeline = new Pipeline(name == null ? $"Synched|{pipeline.Name}" : name, pipeline.defaultDeliveryPolicy, threadCount, allowSchedulingOnExternalThreads);
+ newPipeline.VirtualTimeOffset = pipeline.VirtualTimeOffset;
+ newPipeline.DiagnosticsCollector = enableDiagnostics ? pipeline.DiagnosticsCollector : null;
+ newPipeline.DiagnosticsConfiguration = pipeline.DiagnosticsConfiguration;
+ return newPipeline;
+ }
+
///
/// Propose replay time.
///
diff --git a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
index 4fc078b71..6fae60e9f 100644
--- a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
+++ b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
@@ -6,7 +6,7 @@
Microsoft.Psi.Runtime
Provides the core APIs and components for Platform for Situated Intelligence.
0.18.72.1
- $(AssemblyVersion)-modifiedPipeTest3
+ $(AssemblyVersion)-modifiedPipeTest5
@@ -52,14 +52,14 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
- 1.7.0
+ 8.0.0
diff --git a/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj b/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj
index 8b96f796c..5a2d9cf26 100644
--- a/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj
+++ b/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj
@@ -33,11 +33,11 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
diff --git a/Sources/Tools/PsiStudio/Microsoft.Psi.PsiStudio/Microsoft.Psi.PsiStudio.csproj b/Sources/Tools/PsiStudio/Microsoft.Psi.PsiStudio/Microsoft.Psi.PsiStudio.csproj
index 82e5aa62a..0c4ed2c3a 100644
--- a/Sources/Tools/PsiStudio/Microsoft.Psi.PsiStudio/Microsoft.Psi.PsiStudio.csproj
+++ b/Sources/Tools/PsiStudio/Microsoft.Psi.PsiStudio/Microsoft.Psi.PsiStudio.csproj
@@ -57,11 +57,11 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Sources/Tools/PsiStudio/Test.Psi.PsiStudio/Test.Psi.PsiStudio.csproj b/Sources/Tools/PsiStudio/Test.Psi.PsiStudio/Test.Psi.PsiStudio.csproj
index ddb860122..17740c65e 100644
--- a/Sources/Tools/PsiStudio/Test.Psi.PsiStudio/Test.Psi.PsiStudio.csproj
+++ b/Sources/Tools/PsiStudio/Test.Psi.PsiStudio/Test.Psi.PsiStudio.csproj
@@ -26,11 +26,11 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj b/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj
index 3b5f61845..98cd2689f 100644
--- a/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj
+++ b/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj
@@ -21,13 +21,13 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
- 1.1.3
+ 1.1.6
diff --git a/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj b/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj
index 18ec1331d..33df3b4fe 100644
--- a/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj
+++ b/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj
@@ -30,11 +30,11 @@
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
diff --git a/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj b/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj
index f302bc3cd..eb7bf4752 100644
--- a/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj
+++ b/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj
@@ -248,17 +248,17 @@
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers
-
-
-
-
+
+
+
+
diff --git a/Sources/Visualization/Test.Psi.Visualization/Test.Psi.Visualization.csproj b/Sources/Visualization/Test.Psi.Visualization/Test.Psi.Visualization.csproj
index dd0a7de75..194e935dd 100644
--- a/Sources/Visualization/Test.Psi.Visualization/Test.Psi.Visualization.csproj
+++ b/Sources/Visualization/Test.Psi.Visualization/Test.Psi.Visualization.csproj
@@ -74,18 +74,18 @@
- 2.9.8
+ 3.3.2
runtime; build; native; contentfiles; analyzers
all
- 2.1.1
+ 3.1.1
- 2.1.1
+ 3.1.1
- 1.1.118
+ 1.2.0-beta.507
runtime; build; native; contentfiles; analyzers
all
From 446a0fa7f3d1f4b43b2d0f763e0e879ac7f48ca5 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Tue, 13 Feb 2024 09:56:21 +0100
Subject: [PATCH 05/21] \psi + unity in quest progress
---
.../Rendezvous/Operators.cs | 12 ++++++++++
.../Runtime/Microsoft.Psi/Data/PsiImporter.cs | 17 +++++++++++++-
.../Runtime/Microsoft.Psi/Data/PsiStore.cs | 23 +++++++++++++++++++
.../Data/PsiStoreStreamReader.cs | 12 ++++++++++
.../Persistence/InfiniteFileReader.cs | 9 +++++---
.../Persistence/InfiniteFileWriter.cs | 23 +++++++++++--------
.../Microsoft.Psi/Remoting/RemoteImporter.cs | 15 ++++++++++++
7 files changed, 97 insertions(+), 14 deletions(-)
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
index 7a1608399..7d73d900a 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
@@ -7,6 +7,7 @@ namespace Microsoft.Psi.Interop.Rendezvous
using Microsoft.Psi.Interop.Serialization;
using Microsoft.Psi.Interop.Transport;
using Microsoft.Psi.Remoting;
+ using Microsoft.Psi.Serialization;
///
/// Rendezvous related operators.
@@ -101,6 +102,17 @@ public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemoteExporter expor
return endpoint;
}
+ ///
+ /// Create a from a .
+ ///
+ /// from which to create .
+ /// The pipeline to add the component to.
+ /// Path for PsiStore.
+ /// Custom known serializers.
+ /// .
+ public static RemoteImporter ToRemoteImporter(this Rendezvous.RemoteExporterEndpoint endpoint, Pipeline pipeline, string storePath, KnownSerializers knownSerializers)
+ => new (pipeline, storePath, endpoint.Host, endpoint.Port, knownSerializers);
+
///
/// Create a from a .
///
diff --git a/Sources/Runtime/Microsoft.Psi/Data/PsiImporter.cs b/Sources/Runtime/Microsoft.Psi/Data/PsiImporter.cs
index 33677089c..bd01d996f 100644
--- a/Sources/Runtime/Microsoft.Psi/Data/PsiImporter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Data/PsiImporter.cs
@@ -4,7 +4,8 @@
namespace Microsoft.Psi.Data
{
using Microsoft.Psi;
-
+ using Microsoft.Psi.Serialization;
+#pragma warning disable CS0419 // Ambiguous reference in cref attribute
///
/// Component that reads messages from a \psi store and publishes them on streams.
///
@@ -14,6 +15,7 @@ namespace Microsoft.Psi.Data
/// method. The store metadata is available immediately after open
/// (before the pipeline is running) via the property.
///
+#pragma warning restore CS0419 // Ambiguous reference in cref attribute
public sealed class PsiImporter : Importer
{
///
@@ -27,5 +29,18 @@ public PsiImporter(Pipeline pipeline, string name, string path, bool usePerStrea
: base(pipeline, new PsiStoreStreamReader(name, path), usePerStreamReaders)
{
}
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The pipeline to add the component to.
+ /// Custom known serializers.
+ /// The name of the application that generated the persisted files, or the root name of the files.
+ /// The directory in which the main persisted file resides or will reside, or null to open a volatile data store.
+ /// Flag indicating whether to use per-stream readers.
+ public PsiImporter(Pipeline pipeline, KnownSerializers serializers, string name, string path, bool usePerStreamReaders)
+ : base(pipeline, new PsiStoreStreamReader(name, path, serializers), usePerStreamReaders)
+ {
+ }
}
}
diff --git a/Sources/Runtime/Microsoft.Psi/Data/PsiStore.cs b/Sources/Runtime/Microsoft.Psi/Data/PsiStore.cs
index c91e30985..8d7979206 100644
--- a/Sources/Runtime/Microsoft.Psi/Data/PsiStore.cs
+++ b/Sources/Runtime/Microsoft.Psi/Data/PsiStore.cs
@@ -90,6 +90,29 @@ public static PsiImporter Open(Pipeline pipeline, string name, string rootPath,
return new PsiImporter(pipeline, name, rootPath, usePerStreamReaders);
}
+ ///
+ /// Opens a \psi store for read and returns a instance
+ /// which can be used to inspect the store and open the streams.
+ /// The store metadata is available immediately after this call (before the pipeline is running) via the property.
+ ///
+ /// The pipeline to add the component to.
+ /// Custom known serializers.
+ /// The name of the store to open (the same as the catalog file name).
+ ///
+ /// The path to the store.
+ /// This can be one of:
+ /// - a full path to a directory containing the store
+ /// - a root path containing one or more versions of the store, each in its own subdirectory,
+ /// in which case the latest store is opened.
+ /// - a null string, in which case an in-memory store is opened.
+ ///
+ /// Optional flag indicating whether to use per-stream readers (see remarks).
+ /// A instance that can be used to open streams and read messages.
+ public static PsiImporter Open(Pipeline pipeline, KnownSerializers serializers, string name, string rootPath, bool usePerStreamReaders = true)
+ {
+ return new PsiImporter(pipeline, serializers, name, rootPath, usePerStreamReaders);
+ }
+
///
/// Writes the specified stream to a multi-stream \psi store.
///
diff --git a/Sources/Runtime/Microsoft.Psi/Data/PsiStoreStreamReader.cs b/Sources/Runtime/Microsoft.Psi/Data/PsiStoreStreamReader.cs
index 882c909fb..27558a538 100644
--- a/Sources/Runtime/Microsoft.Psi/Data/PsiStoreStreamReader.cs
+++ b/Sources/Runtime/Microsoft.Psi/Data/PsiStoreStreamReader.cs
@@ -35,6 +35,18 @@ public PsiStoreStreamReader(string name, string path)
this.PsiStoreReader = new PsiStoreReader(name, path, this.LoadMetadata);
}
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The name of the application that generated the persisted files, or the root name of the files.
+ /// The directory in which the main persisted file resides or will reside, or null to create a volatile data store.
+ /// Custom known serializers.
+ public PsiStoreStreamReader(string name, string path, KnownSerializers serializers)
+ {
+ this.PsiStoreReader = new PsiStoreReader(name, path, this.LoadMetadata);
+ this.context = new SerializationContext(serializers);
+ }
+
///
/// Initializes a new instance of the class.
///
diff --git a/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileReader.cs b/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileReader.cs
index c8d5ee7da..a2a58f6bc 100644
--- a/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileReader.cs
+++ b/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileReader.cs
@@ -28,9 +28,12 @@ public InfiniteFileReader(string path, string fileName, int fileId = 0)
this.path = path;
this.fileName = fileName;
this.fileId = fileId;
- Mutex pulse;
- Mutex.TryOpenExisting(InfiniteFileWriter.PulseEventName(path, fileName), out pulse);
- this.writePulse = pulse ?? new Mutex(false);
+
+ // Mutex pulse;
+ // Mutex.TryOpenExisting(InfiniteFileWriter.PulseEventName(path, fileName), out pulse);
+ // this.writePulse = pulse ?? new Mutex(false);
+ InfiniteFileWriter.PulseEventName(path, fileName);
+ this.writePulse = new Mutex(false);
}
public InfiniteFileReader(string name, int fileId = 0)
diff --git a/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs b/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs
index 3d6d35668..0c967c67c 100644
--- a/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs
@@ -52,7 +52,8 @@ public InfiniteFileWriter(string path, string fileName, int extentSize)
{
try
{
- this.globalWritePulse = new Mutex(true, PulseEventName(path, fileName));
+ // this.globalWritePulse = new Mutex(true, PulseEventName(path, fileName));
+ this.globalWritePulse = new Mutex(true);
}
catch (UnauthorizedAccessException)
{
@@ -64,9 +65,9 @@ public InfiniteFileWriter(string path, string fileName, int extentSize)
{
while (!this.disposed)
{
- this.localWritePulse?.WaitOne();
- this.globalWritePulse?.ReleaseMutex();
- this.globalWritePulse?.WaitOne();
+ this.localWritePulse.WaitOne();
+ this.globalWritePulse.ReleaseMutex();
+ this.globalWritePulse.WaitOne();
}
}
catch (ObjectDisposedException)
@@ -109,7 +110,7 @@ public void Dispose()
this.localWritePulse.Set();
this.localWritePulse.Dispose();
this.localWritePulse = null;
- this.globalWritePulse?.Dispose();
+ this.globalWritePulse.Dispose();
this.globalWritePulse = null;
// may have already been disposed in CloseCurrent
@@ -218,11 +219,11 @@ internal static string PulseEventName(string path, string fileName)
private static string MakeHandleName(string format, string path, string fileName)
{
- var name = string.Format(format, path?.ToLower().GetDeterministicHashCode(), fileName.ToLower());
+ var name = string.Format(format, path.ToLower().GetDeterministicHashCode(), fileName.ToLower());
if (name.Length > 260)
{
// exceeded the name length limit
- return string.Format(format, path?.ToLower().GetDeterministicHashCode(), fileName.ToLower().GetDeterministicHashCode());
+ return string.Format(format, path.ToLower().GetDeterministicHashCode(), fileName.ToLower().GetDeterministicHashCode());
}
return name;
@@ -239,14 +240,16 @@ private void CreateNewExtent()
if (!this.IsVolatile)
{
this.extentName = System.IO.Path.Combine(this.Path, this.extentName);
- var file = File.Open(this.extentName, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
+
+ // var file = File.Open(this.extentName, FileMode.Create, FileAccess.ReadWrite, FileShare.Read);
try
{
- newMMF = MemoryMappedFile.CreateFromFile(file, null, this.extentSize, MemoryMappedFileAccess.ReadWrite, HandleInheritability.Inheritable, false);
+ // newMMF = MemoryMappedFile.CreateFromFile(file, null, this.extentSize, MemoryMappedFileAccess.ReadWrite, HandleInheritability.Inheritable, false);
+ newMMF = MemoryMappedFile.CreateFromFile(this.extentName, FileMode.Create, null, this.extentSize);
}
catch (IOException)
{
- file.Dispose();
+ // file.Dispose();
throw;
}
}
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemoteImporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemoteImporter.cs
index b452d693f..6d406a31e 100644
--- a/Sources/Runtime/Microsoft.Psi/Remoting/RemoteImporter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemoteImporter.cs
@@ -72,6 +72,21 @@ public RemoteImporter(Pipeline pipeline, string host, int port = RemoteExporter.
{
}
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The pipeline to add the component to.
+ /// Path for PsiStore.
+ /// Remote host name.
+ /// TCP port on which to connect (default 11411).
+ /// Custom known serializers.
+ /// Whether to allow sequence ID restarts upon connection loss/reacquire.
+ /// In this case the start is a special behavior that is `DateTime.UtcNow` _at the sending `RemoteExporter`_.
+ public RemoteImporter(Pipeline pipeline, string storePath, string host, int port = RemoteExporter.DefaultPort, KnownSerializers serializers = null, bool allowSequenceRestart = true)
+ : this(name => PsiStore.Open(pipeline, serializers, name, storePath), new TimeInterval(DateTime.MinValue, DateTime.MaxValue), true, host, port, $"RemoteImporter_{Guid.NewGuid()}", storePath, allowSequenceRestart)
+ {
+ }
+
///
/// Initializes a new instance of the class.
///
From 1c596c2782d8186804dea82d499396734c09ea0e Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Mon, 4 Mar 2024 16:35:31 +0100
Subject: [PATCH 06/21] Unity work for Quest
---
Psi.sln | 288 +++++++++++++++++-
.../Microsoft.Psi/Common/PsiStreamMetadata.cs | 2 +-
.../Runtime/Microsoft.Psi/Data/Importer.cs | 2 +-
.../Serialization/KnownSerializers.cs | 35 ++-
.../Serialization/SerializationContext.cs | 4 +-
.../Microsoft.Psi/Serialization/Serializer.cs | 2 +-
.../Serialization/StructHandler.cs | 14 +-
.../Microsoft.Psi/Streams/Receiver{T}.cs | 2 +-
8 files changed, 324 insertions(+), 25 deletions(-)
diff --git a/Psi.sln b/Psi.sln
index 97e27cad4..8f804972d 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -53,7 +53,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Speech.Windows", "
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Audio", "Sources\Audio\Test.Psi.Audio\Test.Psi.Audio.csproj", "{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test.Psi.Imaging.Windows", "Sources\Imaging\Test.Psi.Imaging.Windows\Test.Psi.Imaging.Windows.csproj", "{191DF615-3D8F-45A3-B763-DD4A604A712A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Imaging.Windows", "Sources\Imaging\Test.Psi.Imaging.Windows\Test.Psi.Imaging.Windows.csproj", "{191DF615-3D8F-45A3-B763-DD4A604A712A}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Toolkits", "Toolkits", "{B592009C-5137-4D7F-8B50-C7D8500230D6}"
EndProject
@@ -229,7 +229,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "HoloLensCaptureInterop", "S
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Test.Psi.Calibration", "Sources\Calibration\Test.Psi.Calibration\Test.Psi.Calibration.csproj", "{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestConnection", "TestConnection\TestConnection.csproj", "{E4D7E21F-8469-456F-828D-DE1D2590E4EA}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestConnection", "TestConnection\TestConnection.csproj", "{E4D7E21F-8469-456F-828D-DE1D2590E4EA}"
ProjectSection(ProjectDependencies) = postProject
{04147400-0AB0-4F07-9975-D4B7E58150DB} = {04147400-0AB0-4F07-9975-D4B7E58150DB}
EndProjectSection
@@ -237,291 +237,575 @@ EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Debug|x64.Build.0 = Debug|Any CPU
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|x64.ActiveCfg = Release|Any CPU
+ {04147400-0AB0-4F07-9975-D4B7E58150DB}.Release|x64.Build.0 = Release|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Debug|x64.Build.0 = Debug|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|x64.ActiveCfg = Release|Any CPU
+ {2CC39BCB-7798-474C-AC97-1C5F664101E2}.Release|x64.Build.0 = Release|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Debug|x64.Build.0 = Debug|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|Any CPU.ActiveCfg = Release|Any CPU
{855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|Any CPU.Build.0 = Release|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|x64.ActiveCfg = Release|Any CPU
+ {855FD8BE-6938-4784-B1EE-D90A8B5B2496}.Release|x64.Build.0 = Release|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Debug|x64.Build.0 = Debug|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|Any CPU.Build.0 = Release|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|x64.ActiveCfg = Release|Any CPU
+ {9BF2E5EF-186A-4179-B753-AE11EE90E026}.Release|x64.Build.0 = Release|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Debug|x64.Build.0 = Debug|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|x64.ActiveCfg = Release|Any CPU
+ {AC5745DA-570C-4E57-9AE4-D1974F629428}.Release|x64.Build.0 = Release|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Debug|x64.Build.0 = Debug|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|x64.ActiveCfg = Release|Any CPU
+ {C048E3FB-CDC4-4577-A40E-8C9B1B7CEDF1}.Release|x64.Build.0 = Release|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Debug|x64.Build.0 = Debug|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{80C75A20-920A-4B30-B05E-970BE844456A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Release|x64.ActiveCfg = Release|Any CPU
+ {80C75A20-920A-4B30-B05E-970BE844456A}.Release|x64.Build.0 = Release|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Debug|x64.Build.0 = Debug|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|x64.ActiveCfg = Release|Any CPU
+ {3FB6CD31-0941-4372-9BDB-9E6830385DD4}.Release|x64.Build.0 = Release|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Debug|x64.Build.0 = Debug|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|x64.ActiveCfg = Release|Any CPU
+ {8AC7DE3C-DF3C-44A8-9E69-E1F21BF3E564}.Release|x64.Build.0 = Release|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Debug|x64.Build.0 = Debug|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FFFD905A-1672-4920-B790-EEA6A961383C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Release|x64.ActiveCfg = Release|Any CPU
+ {FFFD905A-1672-4920-B790-EEA6A961383C}.Release|x64.Build.0 = Release|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Debug|x64.Build.0 = Debug|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|x64.ActiveCfg = Release|Any CPU
+ {7D481D0D-75C2-4E9F-9FE3-43EB63403F2B}.Release|x64.Build.0 = Release|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Debug|x64.Build.0 = Debug|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|x64.ActiveCfg = Release|Any CPU
+ {191DF615-3D8F-45A3-B763-DD4A604A712A}.Release|x64.Build.0 = Release|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Debug|x64.Build.0 = Debug|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{57B57050-5044-4EA9-AC08-030F49E69D62}.Release|Any CPU.Build.0 = Release|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Release|x64.ActiveCfg = Release|Any CPU
+ {57B57050-5044-4EA9-AC08-030F49E69D62}.Release|x64.Build.0 = Release|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Debug|x64.Build.0 = Debug|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F843DAFA-A02B-4B63-8985-6890E513312E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Release|x64.ActiveCfg = Release|Any CPU
+ {F843DAFA-A02B-4B63-8985-6890E513312E}.Release|x64.Build.0 = Release|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Debug|x64.Build.0 = Debug|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|x64.ActiveCfg = Release|Any CPU
+ {D9EB512A-9F4F-4D46-86F1-57065CCC933D}.Release|x64.Build.0 = Release|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Debug|x64.Build.0 = Debug|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|x64.ActiveCfg = Release|Any CPU
+ {91184A9B-5AB9-4715-B853-8E95E5065AA3}.Release|x64.Build.0 = Release|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Debug|x64.Build.0 = Debug|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|x64.ActiveCfg = Release|Any CPU
+ {3A3F1C2C-A805-4EA2-B5AE-80371B565A15}.Release|x64.Build.0 = Release|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Debug|x64.Build.0 = Debug|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|x64.ActiveCfg = Release|Any CPU
+ {84CE1FE5-8141-4C2A-AC30-21BDC87F5D0A}.Release|x64.Build.0 = Release|Any CPU
{5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|Any CPU.ActiveCfg = Debug|x64
{5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|Any CPU.Build.0 = Debug|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|x64.ActiveCfg = Debug|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Debug|x64.Build.0 = Debug|x64
{5348A94F-7B3A-4B42-8555-2A1491971090}.Release|Any CPU.ActiveCfg = Release|x64
{5348A94F-7B3A-4B42-8555-2A1491971090}.Release|Any CPU.Build.0 = Release|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Release|x64.ActiveCfg = Release|x64
+ {5348A94F-7B3A-4B42-8555-2A1491971090}.Release|x64.Build.0 = Release|x64
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Debug|x64.Build.0 = Debug|Any CPU
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|x64.ActiveCfg = Release|Any CPU
+ {16B58AE0-0E00-46FB-B114-72600DF6A78A}.Release|x64.Build.0 = Release|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Debug|x64.Build.0 = Debug|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Release|Any CPU.ActiveCfg = Release|Any CPU
{02A92F0E-98F1-4B42-883A-761272BAC185}.Release|Any CPU.Build.0 = Release|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Release|x64.ActiveCfg = Release|Any CPU
+ {02A92F0E-98F1-4B42-883A-761272BAC185}.Release|x64.Build.0 = Release|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Debug|x64.Build.0 = Debug|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|Any CPU.ActiveCfg = Release|Any CPU
{808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|Any CPU.Build.0 = Release|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|x64.ActiveCfg = Release|Any CPU
+ {808E6F51-9810-4461-AF4E-EF42EE47C806}.Release|x64.Build.0 = Release|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Debug|x64.Build.0 = Debug|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7F967CC6-905A-4198-A667-F9953C8A2139}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Release|x64.ActiveCfg = Release|Any CPU
+ {7F967CC6-905A-4198-A667-F9953C8A2139}.Release|x64.Build.0 = Release|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Debug|x64.Build.0 = Debug|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|x64.ActiveCfg = Release|Any CPU
+ {CFB5E6D3-C2FD-4D46-B8AC-7E39634E2CA9}.Release|x64.Build.0 = Release|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Debug|x64.Build.0 = Debug|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{334726D9-6524-4318-82F1-4B72A1027E6E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Release|x64.ActiveCfg = Release|Any CPU
+ {334726D9-6524-4318-82F1-4B72A1027E6E}.Release|x64.Build.0 = Release|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Debug|x64.Build.0 = Debug|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|x64.ActiveCfg = Release|Any CPU
+ {2AE339CD-1D81-46F4-AA19-703EB0CF86FB}.Release|x64.Build.0 = Release|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Debug|x64.Build.0 = Debug|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|x64.ActiveCfg = Release|Any CPU
+ {BE4A63D6-8153-458C-AC0E-744C320AA521}.Release|x64.Build.0 = Release|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Debug|x64.Build.0 = Debug|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|x64.ActiveCfg = Release|Any CPU
+ {E2810FAA-8EB3-4B3B-8667-C3C586137D28}.Release|x64.Build.0 = Release|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Debug|x64.Build.0 = Debug|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|x64.ActiveCfg = Release|Any CPU
+ {C8E18D2B-A445-42C4-B6C6-D6CAC51065DC}.Release|x64.Build.0 = Release|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Debug|x64.Build.0 = Debug|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|x64.ActiveCfg = Release|Any CPU
+ {C52E282C-FA0A-4847-8D28-E9C4FDD8B729}.Release|x64.Build.0 = Release|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Debug|x64.Build.0 = Debug|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|x64.ActiveCfg = Release|Any CPU
+ {C72AED47-F5FF-4B7B-BD11-62149542FB22}.Release|x64.Build.0 = Release|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Debug|x64.Build.0 = Debug|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|x64.ActiveCfg = Release|Any CPU
+ {5600A9AF-934C-4225-B05D-F11DBC29E0FF}.Release|x64.Build.0 = Release|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Debug|x64.Build.0 = Debug|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|x64.ActiveCfg = Release|Any CPU
+ {D69636BA-CCE9-4A85-845E-A378A2B03D62}.Release|x64.Build.0 = Release|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Debug|x64.Build.0 = Debug|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|x64.ActiveCfg = Release|Any CPU
+ {B7C52FC7-9678-442B-9B1E-F19F09B05606}.Release|x64.Build.0 = Release|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Debug|x64.Build.0 = Debug|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|x64.ActiveCfg = Release|Any CPU
+ {3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|x64.Build.0 = Release|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|x64.Build.0 = Debug|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|x64.ActiveCfg = Release|Any CPU
+ {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|x64.Build.0 = Release|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|x64.Build.0 = Debug|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|x64.ActiveCfg = Release|Any CPU
+ {B9F00634-88A1-40EF-9DAD-814A307AD81F}.Release|x64.Build.0 = Release|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Debug|x64.Build.0 = Debug|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|x64.ActiveCfg = Release|Any CPU
+ {BE194924-7162-405D-BF6E-E6086BAA12F1}.Release|x64.Build.0 = Release|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Debug|x64.Build.0 = Debug|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Release|x64.ActiveCfg = Release|Any CPU
+ {4478A162-4FE9-4737-A630-3899DC5935C6}.Release|x64.Build.0 = Release|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|x64.Build.0 = Debug|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Release|x64.ActiveCfg = Release|Any CPU
+ {7B73D864-9997-4637-8765-44C17FD09CE1}.Release|x64.Build.0 = Release|Any CPU
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|Any CPU.ActiveCfg = Debug|x64
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|Any CPU.Build.0 = Debug|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|x64.ActiveCfg = Debug|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Debug|x64.Build.0 = Debug|x64
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|Any CPU.ActiveCfg = Release|x64
{DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|Any CPU.Build.0 = Release|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|x64.ActiveCfg = Release|x64
+ {DAB8847B-DE0A-45E2-A7DA-30432A36525B}.Release|x64.Build.0 = Release|x64
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Debug|x64.Build.0 = Debug|Any CPU
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|x64.ActiveCfg = Release|Any CPU
+ {825B11E7-9BF3-43B7-9BCE-4309EE404AEE}.Release|x64.Build.0 = Release|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Debug|x64.Build.0 = Debug|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|Any CPU.ActiveCfg = Release|Any CPU
{896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|x64.ActiveCfg = Release|Any CPU
+ {896CE6A5-59AA-4F7B-90EB-562F47D3C49E}.Release|x64.Build.0 = Release|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Debug|x64.Build.0 = Debug|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|x64.ActiveCfg = Release|Any CPU
+ {FE571017-BC81-4B70-A876-58A52CAB40B4}.Release|x64.Build.0 = Release|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Debug|x64.Build.0 = Debug|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|x64.ActiveCfg = Release|Any CPU
+ {F1D041E0-DDB2-41B8-97EE-5539B10D91BE}.Release|x64.Build.0 = Release|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Debug|x64.Build.0 = Debug|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|x64.ActiveCfg = Release|Any CPU
+ {6B572F54-0E2F-4223-8283-14B3BAB7534A}.Release|x64.Build.0 = Release|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Debug|x64.Build.0 = Debug|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Release|Any CPU.ActiveCfg = Release|Any CPU
{084FB05C-4022-40FD-B00B-E3229B882F08}.Release|Any CPU.Build.0 = Release|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Release|x64.ActiveCfg = Release|Any CPU
+ {084FB05C-4022-40FD-B00B-E3229B882F08}.Release|x64.Build.0 = Release|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Debug|x64.Build.0 = Debug|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8D33307F-0E96-491A-9D31-9025709310F6}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Release|x64.ActiveCfg = Release|Any CPU
+ {8D33307F-0E96-491A-9D31-9025709310F6}.Release|x64.Build.0 = Release|Any CPU
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|Any CPU.ActiveCfg = Debug|x64
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|Any CPU.Build.0 = Debug|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|x64.ActiveCfg = Debug|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Debug|x64.Build.0 = Debug|x64
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|Any CPU.ActiveCfg = Release|x64
{C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|Any CPU.Build.0 = Release|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|x64.ActiveCfg = Release|x64
+ {C91D0412-1BB2-40D2-8DCA-A48B6C5B7E67}.Release|x64.Build.0 = Release|x64
{F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Debug|x64.Build.0 = Debug|Any CPU
{F31606FF-3737-45DC-8E89-6256AACD841F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F31606FF-3737-45DC-8E89-6256AACD841F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Release|x64.ActiveCfg = Release|Any CPU
+ {F31606FF-3737-45DC-8E89-6256AACD841F}.Release|x64.Build.0 = Release|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Debug|x64.Build.0 = Debug|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|x64.ActiveCfg = Release|Any CPU
+ {5AC206E0-6B2E-4DBC-9B8A-74A47C907C6A}.Release|x64.Build.0 = Release|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Debug|x64.Build.0 = Debug|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|x64.ActiveCfg = Release|Any CPU
+ {D18F494B-3639-4094-BD5E-BE8D81D5CD39}.Release|x64.Build.0 = Release|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Debug|x64.Build.0 = Debug|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|x64.ActiveCfg = Release|Any CPU
+ {CAE417E8-0E2D-499D-B11D-78A95155AF8A}.Release|x64.Build.0 = Release|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Debug|x64.Build.0 = Debug|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D649D56B-777C-4246-8D59-C32749D94D39}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Release|x64.ActiveCfg = Release|Any CPU
+ {D649D56B-777C-4246-8D59-C32749D94D39}.Release|x64.Build.0 = Release|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Debug|x64.Build.0 = Debug|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|x64.ActiveCfg = Release|Any CPU
+ {8B4F93E0-86D7-474C-8DD5-14E0AAD8BF91}.Release|x64.Build.0 = Release|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Debug|x64.Build.0 = Debug|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|x64.ActiveCfg = Release|Any CPU
+ {A0677BEA-ADB1-4950-89E6-89483D621A52}.Release|x64.Build.0 = Release|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Debug|x64.Build.0 = Debug|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|x64.ActiveCfg = Release|Any CPU
+ {E0621435-AF35-4CFA-BE9E-3781AF6E161F}.Release|x64.Build.0 = Release|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Debug|x64.Build.0 = Debug|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|Any CPU.ActiveCfg = Release|Any CPU
{C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|Any CPU.Build.0 = Release|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|x64.ActiveCfg = Release|Any CPU
+ {C3114338-AD22-4EBC-85C3-EE06045CDD78}.Release|x64.Build.0 = Release|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Debug|x64.Build.0 = Debug|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|x64.ActiveCfg = Release|Any CPU
+ {A1429F96-C7F8-49D8-ADB8-73A1A4DAA70F}.Release|x64.Build.0 = Release|Any CPU
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|Any CPU.ActiveCfg = Debug|ARM
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|Any CPU.Build.0 = Debug|ARM
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|x64.ActiveCfg = Debug|x64
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Debug|x64.Build.0 = Debug|x64
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|Any CPU.ActiveCfg = Release|ARM
{F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|Any CPU.Build.0 = Release|ARM
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|x64.ActiveCfg = Release|x64
+ {F50194C0-9561-40C7-B9CB-B977E3B3D76D}.Release|x64.Build.0 = Release|x64
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Debug|x64.Build.0 = Debug|Any CPU
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|x64.ActiveCfg = Release|Any CPU
+ {3434D5B2-B06F-4356-9E9B-90171CEF482B}.Release|x64.Build.0 = Release|Any CPU
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|Any CPU.ActiveCfg = Debug|ARM
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|Any CPU.Build.0 = Debug|ARM
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|x64.ActiveCfg = Debug|Win32
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Debug|x64.Build.0 = Debug|Win32
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|Any CPU.ActiveCfg = Release|ARM
{ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|Any CPU.Build.0 = Release|ARM
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|x64.ActiveCfg = Release|Win32
+ {ECD9E150-8104-4DA3-B807-A6A4392A67C6}.Release|x64.Build.0 = Release|Win32
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Debug|x64.Build.0 = Debug|Any CPU
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|Any CPU.Build.0 = Release|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|x64.ActiveCfg = Release|Any CPU
+ {BE95524A-F9C2-4D0D-8F7E-1C7019B5A114}.Release|x64.Build.0 = Release|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Debug|x64.Build.0 = Debug|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|x64.ActiveCfg = Release|Any CPU
+ {74504D41-B716-4B0B-B265-ED2A91A2A5C2}.Release|x64.Build.0 = Release|Any CPU
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|Any CPU.ActiveCfg = Debug|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|Any CPU.Build.0 = Debug|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|Any CPU.Deploy.0 = Debug|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|x64.ActiveCfg = Debug|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|x64.Build.0 = Debug|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Debug|x64.Deploy.0 = Debug|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|Any CPU.ActiveCfg = Release|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|Any CPU.Build.0 = Release|ARM
{D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|Any CPU.Deploy.0 = Release|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|x64.ActiveCfg = Release|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|x64.Build.0 = Release|ARM
+ {D318834B-5A27-4EAC-B17D-A9BD7A2DCA0D}.Release|x64.Deploy.0 = Release|ARM
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Debug|x64.Build.0 = Debug|Any CPU
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|Any CPU.ActiveCfg = Release|Any CPU
{272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|Any CPU.Build.0 = Release|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|x64.ActiveCfg = Release|Any CPU
+ {272CEB19-2B5A-49BC-B8EA-CBC79AA87C37}.Release|x64.Build.0 = Release|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Debug|x64.Build.0 = Debug|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|x64.ActiveCfg = Release|Any CPU
+ {1C844B9E-A51C-483C-A045-7AB8F2012581}.Release|x64.Build.0 = Release|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Debug|x64.Build.0 = Debug|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|Any CPU.ActiveCfg = Release|Any CPU
{76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|Any CPU.Build.0 = Release|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|x64.ActiveCfg = Release|Any CPU
+ {76E38559-0AF2-4AE3-BCE8-8653277A5B07}.Release|x64.Build.0 = Release|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|x64.Build.0 = Debug|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.ActiveCfg = Release|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.Build.0 = Release|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|x64.Build.0 = Debug|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|x64.ActiveCfg = Release|Any CPU
+ {E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Release|x64.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/Sources/Runtime/Microsoft.Psi/Common/PsiStreamMetadata.cs b/Sources/Runtime/Microsoft.Psi/Common/PsiStreamMetadata.cs
index ad981123d..9b2153e84 100644
--- a/Sources/Runtime/Microsoft.Psi/Common/PsiStreamMetadata.cs
+++ b/Sources/Runtime/Microsoft.Psi/Common/PsiStreamMetadata.cs
@@ -235,7 +235,7 @@ public T GetSupplementalMetadata(KnownSerializers serializers)
///
public T GetSupplementalMetadata()
{
- return this.GetSupplementalMetadata(KnownSerializers.Default);
+ return this.GetSupplementalMetadata(KnownSerializers.GetKnownSerializers());
}
///
diff --git a/Sources/Runtime/Microsoft.Psi/Data/Importer.cs b/Sources/Runtime/Microsoft.Psi/Data/Importer.cs
index 73ea3d68c..edbf03b95 100644
--- a/Sources/Runtime/Microsoft.Psi/Data/Importer.cs
+++ b/Sources/Runtime/Microsoft.Psi/Data/Importer.cs
@@ -69,7 +69,7 @@ public KnownSerializers Serializers
return storeStreamReader.GetSerializers();
}
- return KnownSerializers.Default;
+ return KnownSerializers.GetKnownSerializers();
}
}
diff --git a/Sources/Runtime/Microsoft.Psi/Serialization/KnownSerializers.cs b/Sources/Runtime/Microsoft.Psi/Serialization/KnownSerializers.cs
index 5252c78a0..edab4a0f0 100644
--- a/Sources/Runtime/Microsoft.Psi/Serialization/KnownSerializers.cs
+++ b/Sources/Runtime/Microsoft.Psi/Serialization/KnownSerializers.cs
@@ -15,7 +15,7 @@ namespace Microsoft.Psi.Serialization
///
/// Represents the registry of all serializers.
- /// The contains system-wide serializers for the current version of the type system.
+ /// The contains system-wide serializers for the current version of the type system.
/// Serializers explicitly registered with this instance are used by all other instances unless an override is specified.
/// When deserializing from a persisted file, the instance returned by
/// the will create its own KnownSerializer instance, and register serializers
@@ -65,14 +65,14 @@ public class KnownSerializers
// - there can be at most one schema for a type and at most one type for a schema,
// and they must have matching IDs (implicitly or because of a user-specified name mapping)
+ // the set of types we don't know how to serialize
+ private static readonly HashSet UnserializableTypes = new ();
+
///
/// The default set of types and serializer creation rules globally known to the serialization subsystem.
/// Custom serializers can be added directly to this set.
///
- public static readonly KnownSerializers Default;
-
- // the set of types we don't know how to serialize
- private static readonly HashSet UnserializableTypes = new ();
+ private static KnownSerializers defaultKnownSerializers;
// mapping from fully-qualified .NET type names to synonyms
private readonly Dictionary typeNameSynonyms = new ();
@@ -131,7 +131,7 @@ static KnownSerializers()
UnserializableTypes.Add(typeof(UIntPtr));
UnserializableTypes.Add(typeof(MemberInfo));
UnserializableTypes.Add(typeof(System.Diagnostics.StackTrace));
- Default = new KnownSerializers(true, RuntimeInfo.Latest);
+ defaultKnownSerializers = new KnownSerializers(true, RuntimeInfo.Latest);
}
///
@@ -177,13 +177,13 @@ private KnownSerializers(bool isDefault, RuntimeInfo runtimeInfo)
else
{
// all other instances start off with the Default rules
- this.templates = new Dictionary(Default.templates);
- this.serializers = new Dictionary(Default.serializers);
- this.knownTypes = new ConcurrentDictionary(Default.knownTypes);
- this.knownNames = new ConcurrentDictionary(Default.knownNames);
- this.schemas = new ConcurrentDictionary(Default.schemas);
- this.schemasById = new ConcurrentDictionary(Default.schemasById);
- this.cloningFlags = new ConcurrentDictionary(Default.cloningFlags);
+ this.templates = new Dictionary(defaultKnownSerializers.templates);
+ this.serializers = new Dictionary(defaultKnownSerializers.serializers);
+ this.knownTypes = new ConcurrentDictionary(defaultKnownSerializers.knownTypes);
+ this.knownNames = new ConcurrentDictionary(defaultKnownSerializers.knownNames);
+ this.schemas = new ConcurrentDictionary(defaultKnownSerializers.schemas);
+ this.schemasById = new ConcurrentDictionary(defaultKnownSerializers.schemasById);
+ this.cloningFlags = new ConcurrentDictionary(defaultKnownSerializers.cloningFlags);
}
}
@@ -207,6 +207,15 @@ private KnownSerializers(bool isDefault, RuntimeInfo runtimeInfo)
///
public IDictionary TypeNameSynonyms => this.typeNameSynonyms;
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// static class.
+ public static KnownSerializers GetKnownSerializers()
+ {
+ return defaultKnownSerializers;
+ }
+
///
/// Registers type T with the specified contract name.
/// Use this overload to deserialize data persisted before a type name change.
diff --git a/Sources/Runtime/Microsoft.Psi/Serialization/SerializationContext.cs b/Sources/Runtime/Microsoft.Psi/Serialization/SerializationContext.cs
index becb73803..e9b92fc47 100644
--- a/Sources/Runtime/Microsoft.Psi/Serialization/SerializationContext.cs
+++ b/Sources/Runtime/Microsoft.Psi/Serialization/SerializationContext.cs
@@ -27,7 +27,7 @@ public class SerializationContext
/// This will become internal. Use Serializer.Schema instead.
///
public SerializationContext()
- : this(KnownSerializers.Default)
+ : this(KnownSerializers.GetKnownSerializers())
{
}
@@ -37,7 +37,7 @@ public SerializationContext()
/// The set of custom serializers to use instead of the default ones.
public SerializationContext(KnownSerializers serializers)
{
- this.serializers = serializers ?? KnownSerializers.Default;
+ this.serializers = serializers ?? KnownSerializers.GetKnownSerializers();
}
internal KnownSerializers Serializers => this.serializers;
diff --git a/Sources/Runtime/Microsoft.Psi/Serialization/Serializer.cs b/Sources/Runtime/Microsoft.Psi/Serialization/Serializer.cs
index faf81af7d..29b6df56b 100644
--- a/Sources/Runtime/Microsoft.Psi/Serialization/Serializer.cs
+++ b/Sources/Runtime/Microsoft.Psi/Serialization/Serializer.cs
@@ -142,7 +142,7 @@ public static void Clear(ref T target, SerializationContext context)
/// True if the type is immutable.
public static bool IsImmutableType()
{
- return KnownSerializers.Default.GetHandler().IsImmutableType;
+ return KnownSerializers.GetKnownSerializers().GetHandler().IsImmutableType;
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
diff --git a/Sources/Runtime/Microsoft.Psi/Serialization/StructHandler.cs b/Sources/Runtime/Microsoft.Psi/Serialization/StructHandler.cs
index b262eca8b..cd8674a43 100644
--- a/Sources/Runtime/Microsoft.Psi/Serialization/StructHandler.cs
+++ b/Sources/Runtime/Microsoft.Psi/Serialization/StructHandler.cs
@@ -15,7 +15,7 @@ namespace Microsoft.Psi.Serialization
/// The type of objects the handler understands.
internal sealed class StructHandler : SerializationHandler
{
- private static readonly CloneDelegate
+ public abstract class RendezvousRelay
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Optional rendezvous instance to relay.
+ public RendezvousRelay(Rendezvous rendezvous = null)
+ {
+ this.Rendezvous = rendezvous ?? new Rendezvous();
+ }
+
+ ///
+ /// Event raised when errors occur.
+ ///
+ public event EventHandler Error;
+
+ ///
+ /// Gets the underlying rendezvous.
+ ///
+ public Rendezvous Rendezvous { get; private set; }
+
+ ///
+ /// Write update to add process.
+ ///
+ /// Process to add.
+ /// Writer to which to write update.
+ protected static void WriteAddProcess(Rendezvous.Process process, BinaryWriter writer)
+ {
+ writer.Write((byte)1); // add
+ writer.Write(process.Name);
+ writer.Write(process.Version);
+ writer.Write(process.Endpoints.Count());
+ foreach (var endpoint in process.Endpoints)
+ {
+ if (endpoint is Rendezvous.TcpSourceEndpoint tcpEndpoint)
+ {
+ writer.Write((byte)0); // TcpEndpoint
+ writer.Write(tcpEndpoint.Host);
+ writer.Write(tcpEndpoint.Port);
+ }
+ else if (endpoint is Rendezvous.NetMQSourceEndpoint netMQEndpoint)
+ {
+ writer.Write((byte)1); // NetMQEndpoint
+ writer.Write(netMQEndpoint.Address);
+ }
+ else if (endpoint is Rendezvous.RemoteExporterEndpoint remoteExporterEndpoint)
+ {
+ writer.Write((byte)2); // RemoteExporterEndpoint
+ writer.Write(remoteExporterEndpoint.Host);
+ writer.Write(remoteExporterEndpoint.Port);
+ writer.Write((int)remoteExporterEndpoint.Transport);
+ }
+ else if (endpoint is Rendezvous.RemoteClockExporterEndpoint remoteClockExporterEndpoint)
+ {
+ writer.Write((byte)3); // RemoteClockExporterEndpoint
+ writer.Write(remoteClockExporterEndpoint.Host);
+ writer.Write(remoteClockExporterEndpoint.Port);
+ }
+ else
+ {
+ throw new ArgumentException($"Unknown type of Endpoint ({endpoint.GetType().Name}).");
+ }
+
+ writer.Write(endpoint.Streams.Count());
+ foreach (var stream in endpoint.Streams)
+ {
+ writer.Write(stream.StreamName);
+ writer.Write(stream.TypeName);
+ }
+ }
+
+ writer.Flush();
+ }
+
+ ///
+ /// Write update to remove process.
+ ///
+ /// Process to remove.
+ /// Writer to which to write update.
+ protected static void WriteRemoveProcess(Rendezvous.Process process, BinaryWriter writer)
+ {
+ writer.Write((byte)2); // remove
+ writer.Write(process.Name);
+ writer.Flush();
+ }
+
+ ///
+ /// Write disconnection signal..
+ ///
+ /// Writer to which to write disconnection signal.
+ protected static void TryWriteDisconnect(BinaryWriter writer)
+ {
+ try
+ {
+ writer?.Write((byte)0); // disconnect
+ writer?.Flush();
+ }
+ catch
+ {
+ }
+ }
+
+ ///
+ /// Raise error event.
+ ///
+ /// Underlying exception.
+ protected void OnError(Exception ex)
+ {
+ this.Error?.Invoke(this, ex);
+ }
+
+ ///
+ /// Read process update record.
+ ///
+ /// Reader from which to read.
+ /// A value indicating whether an update was read, otherwise false indicated disconnection.
+ protected bool ReadProcessUpdate(BinaryReader reader)
+ {
+ try
+ {
+ switch (reader.ReadByte())
+ {
+ case 0: // disconnect
+ return false;
+ case 1: // add process
+ var process = ReadProcess(reader);
+ this.Rendezvous.TryAddProcess(process);
+ return true;
+ case 2: // remove process
+ var name = reader.ReadString();
+ this.Rendezvous.TryRemoveProcess(name);
+ return true;
+ default:
+ throw new Exception("Unexpected rendezvous action.");
+ }
+ }
+ catch (Exception ex)
+ {
+ this.OnError(ex);
+ return false;
+ }
+ }
+
+ ///
+ /// Read process.
+ ///
+ /// Reader from which to deserialize.
+ /// Process.
+ private static Rendezvous.Process ReadProcess(BinaryReader reader)
+ {
+ var processName = reader.ReadString();
+ var processVersion = reader.ReadString();
+ var process = new Rendezvous.Process(processName, processVersion);
+
+ // read endpoint info
+ var endpointCount = reader.ReadInt32();
+ for (var i = 0; i < endpointCount; i++)
+ {
+ Rendezvous.Endpoint endpoint;
+ switch (reader.ReadByte())
+ {
+ case 0: // TcpEndpoint
+ var address = reader.ReadString();
+ var port = reader.ReadInt32();
+ endpoint = new Rendezvous.TcpSourceEndpoint(address, port);
+ break;
+ case 1: // NetMQEndpoint
+ endpoint = new Rendezvous.NetMQSourceEndpoint(reader.ReadString());
+ break;
+ case 2: // RemoteExporterEndpoint
+ var host = reader.ReadString();
+ port = reader.ReadInt32();
+ var transport = (TransportKind)reader.ReadInt32();
+ endpoint = new Rendezvous.RemoteExporterEndpoint(host, port, transport);
+ break;
+ case 3: // RemoteClockExporerEndpoint
+ host = reader.ReadString();
+ port = reader.ReadInt32();
+ endpoint = new Rendezvous.RemoteClockExporterEndpoint(host, port);
+ break;
+ default:
+ throw new Exception("Unknown type of Endpoint.");
+ }
+
+ // read stream info
+ var streamCount = reader.ReadInt32();
+ for (var j = 0; j < streamCount; j++)
+ {
+ var name = reader.ReadString();
+ var typeName = reader.ReadString();
+ endpoint.AddStream(new Rendezvous.Stream(name, typeName));
+ }
+
+ process.AddEndpoint(endpoint);
+ }
+
+ return process;
+ }
+ }
+}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs
new file mode 100644
index 000000000..48bb9eacf
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs
@@ -0,0 +1,198 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.Psi.Interop.Rendezvous
+{
+ using System;
+ using System.Collections.Concurrent;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Linq;
+ using System.Net;
+ using System.Net.Sockets;
+ using System.Threading;
+
+ ///
+ /// Server which accepts one or more connections and relays information.
+ ///
+ public class RendezvousServer : RendezvousRelay, IDisposable
+ {
+ ///
+ /// Default TCP port on which to listen for clients.
+ ///
+ public const int DefaultPort = 13331;
+
+ ///
+ /// Protocol version.
+ ///
+ internal const short ProtocolVersion = 2;
+
+ private readonly int port;
+ private readonly ConcurrentDictionary writers = new ();
+
+ private TcpListener listener;
+ private bool active = false;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Optional TCP port on which to listen for clients.
+ /// Optional rendezvous instance to relay.
+ public RendezvousServer(int port = DefaultPort, Rendezvous rendezvous = null)
+ : base(rendezvous)
+ {
+ this.port = port;
+ }
+
+ ///
+ /// Gets a value indicating whether the server is active.
+ ///
+ public bool IsActive => this.active;
+
+ ///
+ /// Start rendezvous client (blocking until connection is established).
+ ///
+ public void Start()
+ {
+ if (this.active)
+ {
+ throw new Exception($"{nameof(RendezvousServer)} already started.");
+ }
+
+ this.Rendezvous.ProcessAdded += (_, process) => this.NotifyClients(process, WriteAddProcess);
+ this.Rendezvous.ProcessRemoved += (_, process) => this.NotifyClients(process, WriteRemoveProcess);
+ this.listener = new TcpListener(IPAddress.Any, this.port);
+ this.active = true;
+ new Thread(new ThreadStart(this.ListenForClients)) { IsBackground = true }.Start();
+ }
+
+ ///
+ /// Stop rendezvous client.
+ ///
+ public void Stop()
+ {
+ this.active = false;
+
+ foreach (var writer in this.writers.Values)
+ {
+ TryWriteDisconnect(writer);
+ writer.Dispose();
+ }
+
+ this.listener?.Stop();
+ this.listener = null;
+ }
+
+ ///
+ public void Dispose()
+ {
+ this.Stop();
+ }
+
+ private void ListenForClients()
+ {
+ this.listener.Start();
+ do
+ {
+ try
+ {
+ var client = this.listener.AcceptTcpClient();
+ var remoteAddress = client.Client.RemoteEndPoint.ToString().Split(':')[0];
+ var stream = client.GetStream();
+ var reader = new BinaryReader(stream);
+ var version = reader.ReadInt16();
+ if (version != ProtocolVersion)
+ {
+ var ex = new IOException($"{nameof(RendezvousClient)} protocol mismatch ({version})");
+ this.ClientError(ex);
+ continue;
+ }
+
+ var writer = new BinaryWriter(stream);
+ var guid = Guid.NewGuid();
+ this.writers.TryAdd(guid, writer);
+
+ writer.Write(ProtocolVersion);
+ writer.Write(remoteAddress);
+ writer.Write(this.Rendezvous.Processes.Count());
+ writer.Flush();
+
+ // notify client of curent process info
+ foreach (var process in this.Rendezvous.Processes)
+ {
+ WriteAddProcess(process, writer);
+ }
+
+ new Thread(new ParameterizedThreadStart(this.ReadFromClient)) { IsBackground = true }
+ .Start(Tuple.Create(reader, guid));
+ }
+ catch (Exception ex)
+ {
+ this.ClientError(ex);
+ }
+ }
+ while (this.active && this.listener != null);
+ }
+
+ private void ReadFromClient(object param)
+ {
+ var tuple = param as Tuple;
+ var reader = tuple.Item1;
+ var guid = tuple.Item2;
+ try
+ {
+ do
+ {
+ if (!this.ReadProcessUpdate(reader))
+ {
+ Trace.WriteLine($"{nameof(RendezvousClient)} disconnected.");
+ break;
+ }
+ }
+ while (this.active && this.listener != null);
+ }
+ catch (Exception ex)
+ {
+ this.ClientError(ex);
+ }
+
+ reader.Dispose();
+ if (this.writers.TryRemove(guid, out var writer))
+ {
+ writer.Dispose();
+ }
+ }
+
+ private void NotifyClients(Rendezvous.Process process, Action action)
+ {
+ foreach (var kv in this.writers)
+ {
+ var writer = kv.Value;
+ try
+ {
+ if (writer.BaseStream.CanWrite)
+ {
+ action(process, writer);
+ }
+ }
+ catch (Exception ex)
+ {
+ this.ClientError(ex);
+ if (this.writers.TryRemove(kv.Key, out _))
+ {
+ writer.Dispose();
+ }
+ }
+ }
+ }
+
+ private void ClientError(Exception ex)
+ {
+ Trace.WriteLine($"{nameof(RendezvousClient)} failed to connect: {ex.Message}");
+ if (this.active)
+ {
+ this.OnError(ex); // note: only invoked on first error
+ }
+ }
+ }
+}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
new file mode 100644
index 000000000..bd13414b9
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
@@ -0,0 +1,97 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.Psi.Interop.Serialization
+{
+ using System;
+ using System.IO;
+ using System.Text;
+
+ ///
+ /// Helper class for making new formats (implementations of /.
+ ///
+ /// Type which is serialized/deserialized.
+ public class Format : IFormatSerializer, IFormatDeserializer, IDisposable
+ {
+ private readonly Func serialize;
+ private readonly Func deserialize;
+ private readonly MemoryStream memoryStream = null;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Serialization function.
+ /// Deserialization function.
+ public Format(
+ Func serializeFunc,
+ Func deserializeFunc)
+ {
+ this.serialize = serializeFunc;
+ this.deserialize = deserializeFunc;
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Action to serialize using .
+ /// Function to deserialize using (also given raw payload, offset, length).
+ /// Serialization format.
+ public Format(
+ Action serializeAction,
+ Func deserializeFunc)
+ {
+ this.memoryStream = new MemoryStream();
+
+ this.serialize = (val, originatingTime) =>
+ {
+ this.memoryStream.Position = 0;
+ using var writer = new BinaryWriter(this.memoryStream, Encoding.UTF8, true);
+ writer.Write(originatingTime.ToFileTimeUtc());
+ serializeAction(val, writer);
+ return (this.memoryStream.GetBuffer(), 0, (int)this.memoryStream.Length);
+ };
+
+ this.deserialize = (payload, offset, length) =>
+ {
+ using var reader = new BinaryReader(new MemoryStream(payload, offset, length), Encoding.UTF8);
+ var originatingTime = DateTime.FromFileTimeUtc(reader.ReadInt64());
+ var val = deserializeFunc(reader, payload, offset, length);
+ return (val, originatingTime);
+ };
+ }
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Action to serialize using .
+ /// Function to deserialize using (also given raw payload, offset, length).
+ /// Serialization format.
+ public Format(
+ Action serializeAction,
+ Func deserializeFunc)
+ : this(serializeAction, (reader, _, _, _) => deserializeFunc(reader))
+ {
+ }
+
+ ///
+ public (byte[] Bytes, int Index, int Count) SerializeMessage(T message, DateTime originatingTime)
+ {
+ return this.serialize(message, originatingTime);
+ }
+
+ ///
+ public (T Message, DateTime OriginatingTime) DeserializeMessage(byte[] payload, int index, int count)
+ {
+ return this.deserialize(payload, index, count);
+ }
+
+ ///
+ public void Dispose()
+ {
+ if (this.memoryStream != null)
+ {
+ this.memoryStream.Dispose();
+ }
+ }
+ }
+}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs
new file mode 100644
index 000000000..502685840
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs
@@ -0,0 +1,23 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.Psi.Interop.Serialization
+{
+ using System;
+
+ ///
+ /// Format deserializer interface.
+ ///
+ /// Type which is deserialized.
+ public interface IFormatDeserializer
+ {
+ ///
+ /// Deserialize single message and originating time stamp payload.
+ ///
+ /// Payload bytes.
+ /// Starting index of message data.
+ /// Number of bytes constituting message data.
+ /// Dynamic of primitive or IEnumerable/ExpandoObject of primitive as well as originating time stamp.
+ (T Message, DateTime OriginatingTime) DeserializeMessage(byte[] payload, int index, int count);
+ }
+}
\ No newline at end of file
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs
new file mode 100644
index 000000000..270487513
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs
@@ -0,0 +1,22 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.Psi.Interop.Serialization
+{
+ using System;
+
+ ///
+ /// Format serializer interface.
+ ///
+ /// Type which is serialized.
+ public interface IFormatSerializer
+ {
+ ///
+ /// Serialize single message with originating time stamp.
+ ///
+ /// Message of any type.
+ /// Originating time of message.
+ /// Serialized bytes, index and count.
+ (byte[] Bytes, int Index, int Count) SerializeMessage(T message, DateTime originatingTime);
+ }
+}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Readme.md b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Readme.md
new file mode 100644
index 000000000..49c5be8d4
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Readme.md
@@ -0,0 +1,45 @@
+# Interop Serialization Interfaces
+
+Each [concrete format](../Format/Readme.md) is an implementation of several serialization interfaces. These interfaces are similar to `Microsoft.Psi.Serialization.ISerializer` but are specific to dynamic types and don't include cloning. An `IFormatSerializer` converts a message of any type, along with its originating time, to a simple `byte[]`, while an `IFormatDeserializer` reverses the process; taking a `byte[]` and returning a message and originating time.
+
+```csharp
+public interface IFormatSerializer
+{
+ (byte[], int, int) SerializeMessage(dynamic message, DateTime originatingTime);
+}
+
+public interface IFormatDeserializer
+{
+ (dynamic, DateTime) DeserializeMessage(byte[] payload, int index, int count);
+}
+```
+
+Versions of these intended for persistent storage, where a sequence of messages are persisted together, are provided as well.
+
+```csharp
+public interface IPersistentFormatSerializer
+{
+ dynamic PersistHeader(dynamic message, Stream stream);
+
+ void PersistRecord(dynamic message, DateTime originatingTime, bool first, Stream stream, dynamic state);
+
+ void PersistFooter(Stream stream, dynamic state);
+}
+
+public interface IPersistentFormatDeserializer
+{
+ IEnumerable<(dynamic, DateTime)> DeserializeRecords(Stream stream);
+}
+```
+
+`IPersistentFormatSerializer` writes a set of messages to a `Stream`. The header may be field names in the case of CSV, a simple array container in the case of JSON, etc. Similarly, the footer may close such constructs. The `PersistRecord` method is very similar to `SerializeMessage` above, but may include message framing or delimiting, such as `Environment.NewLine` delimiting records in CSV or a comma for JSON, or maybe a length-prefix for binary MessagePack. The `IPersistentFormatDeserializer` reverses the process; producing messages and timestamps from a previously serialized stream.
+
+Notice that messages lose their types at this point; generally becoming `dynamic` over `ExpandoObject` and primitives. This means that it may no longer be possible to reify as the original .NET types after serialization in this way (unlike with Psi Stores).
+
+Note also that, while `dynamic` may be any type, it is recommended that deserialization returns primitives or composites in the form of `ExpandoObject`. For example, the JSON implementation uses `Newtonsoft.Json.JsonConvert` under the covers but, rather than returning `JObject`, is careful to not expose dependencies on this library.
+
+## Note About `dynamic` and `ExpandoObject`
+
+A `dynamic` type may be *anything* in .NET and an `ExpandoObject` may have properties of *any* type. We are using these types to represent untyped values flowing through the system in various places above.
+
+Composite/structured values should be restricted to collections (arrays or `IEnumerable<_>`) of primitives or other composites or `ExpandoObject` of named properties of primitives or other composites. Any "shape" of data is representable this way.
\ No newline at end of file
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Transport/Readme.md b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Transport/Readme.md
new file mode 100644
index 000000000..ae0a50b4f
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Transport/Readme.md
@@ -0,0 +1,167 @@
+# Interop Transports
+
+Here we describe several ways of getting data in and out of Psi in order to interop with other languages and platforms.
+
+## Generic File Source/Writer Component
+
+The simplest transport is via the file system. This is most appropriate for offline/batch processing. A generic `FileWriter` component is provided that, when given an `IPersistentFormatSerializer`, will persist a message stream to disk. Similarly, a generic `FileSource` component is provided, taking an `IPersistentFormatDeserializer`, to reconstitute such a persisted file as a Psi stream.
+
+For example, a stream of messages of any type may be written using the `FileWriter`:
+
+```csharp
+using (var p = Pipeline.Create())
+{
+ var gen = Generators.Range(p, 0, 1000);
+ var sin = gen.Select(x => Math.Sin(x / 100.0));
+ var writer = new FileWriter(p, "TestFile.json", JsonFormat.Instance);
+ sin.PipeTo(writer);
+ p.Run();
+}
+```
+
+This produces a JSON file containing something like:
+
+```json
+[
+ {
+ "originatingTime": "2018-11-12T22:48:58.3770983Z",
+ "message": 0.0
+ },
+ {
+ "originatingTime": "2018-11-12T22:48:58.3770984Z",
+ "message": 0.0099998333341666645
+ },
+ {
+ "originatingTime": "2018-11-12T22:48:58.3770985Z",
+ "message": 0.01999866669333308
+ },
+ ...
+]
+```
+
+This may then be read back into a proper \\psi stream using a `FileSource`:
+
+```csharp
+using (var p = Pipeline.Create())
+{
+ var reader = new FileSource(p, "TestFile.json", JsonFormat.Instance);
+ reader.Do(Console.WriteLine);
+ p.Run();
+}
+```
+
+## Message Queue Components
+
+Message queues are most appropriate for live interop. Currently, only ZeroMQ is supported. In the future, Azure Storage Queue and/or Service Bus as well as Amazon SMQ may be supported. While the Psi `RemoteExporter`/`Importer` is an excellent, high performance means of remoting, it assumes .NET on both ends. To facilitate remoting to Python and others, we provide message queuing components. These components are `IConsumer` and simply push to a message queue or are `IProducer` and take messages from a queue. Given an `IFormatSerializer`/`Deserializer`, they handle packing/unpacking messages.
+
+### ZeroMQ/NetMQ
+
+An implementation for ZeroMQ (calleg NetMQ for .NET) is provided. These components are configured with a URI, a topic name and an `IFormatSerializer`.
+
+#### `NetMQWriter`
+
+A stream of messages of any type may be piped to a `NetMQWriter`. These will be serialized and sent to the queue for consumption outside of Psi.
+
+```csharp
+using (var p = Pipeline.Create())
+{
+ var gen = Generators.Range(p, 0, 1000);
+ var sin = gen.Select(x => Math.Sin(x / 100.0));
+ var mq = new NetMQWriter(p, "sin-topic", "tcp://localhost:12345", JsonFormat.Instance);
+ sin.PipeTo(mq);
+ p.Run();
+}
+```
+
+This component uses the [NetMQ Pub/Sub](https://netmq.readthedocs.io/en/latest/pub-sub/) pattern, in which messages convey _topic_ information (much like ROS). Subscribers may then subscribe by topic name.
+
+The generic `NetMQWriter` component has a single `In` receiver which sends to the topic specified at construction. This is the most common case. To facilitate multiple topics over one channel, the `AddTopic(...)` method may be called; returning an additional `IReceiver` to which to pipe.
+
+```csharp
+ var cos = gen.Select(x => Math.Cos(x / 100.0));
+ var topic = mq.AddTopic("cos-topic");
+ cos.PipeTo(topic);
+```
+
+Alternatively, the non-generic `NetMQWriter` may be used, which has _no_ receivers. Each must be created with `AddTopic(...)`.
+
+```csharp
+using (var p = Pipeline.Create())
+{
+ var gen = Generators.Range(p, 0, 1000);
+ var sin = gen.Select(x => Math.Sin(x / 100.0));
+ var cos = gen.Select(x => Math.Cos(x / 100.0));
+
+ var mq = new NetMQWriter(p, "sin-topic", "tcp://localhost:12345", JsonFormat.Instance);
+ sin.PipeTo(mq.AddTopic("sin-topic");
+ cos.PipeTo(mq.AddTopic("cos-topic");
+
+ p.Run();
+}
+```
+
+Then from Python, for example, messages may be consumed using `pyzmq` with something like:
+
+```python
+import zmq, json
+
+socket = zmq.Context().socket(zmq.SUB)
+socket.connect("tcp://localhost:12345")
+socket.setsockopt(zmq.SUBSCRIBE, '') # '' means all topics, otherwise 'sin-topic'/'cos-topic'
+
+while True:
+ [topic, message] = socket.recv_multipart()
+ j = json.loads(message)
+ print "Message: ", repr(j['message'])
+ print "Originating Time: ", repr(j['originatingTime'])
+```
+
+#### `NetMQSource`
+
+Psi may also consume message that have been produced from "outside." For example, the below Python code produces an infinite stream of random doubles:
+
+```python
+import zmq, random, datetime, json
+
+context = zmq.Context()
+socket = context.socket(zmq.PUB)
+socket.bind('tcp://127.0.0.1:45678')
+
+while True:
+ payload = {}
+ payload['message'] = random.uniform(0, 1)
+ payload['originatingTime'] = datetime.datetime.utcnow().isoformat()
+ socket.send_multipart(['test-topic'.encode(), json.dumps(payload).encode('utf-8')])
+```
+
+Notice that the [Pub/Sub](https://netmq.readthedocs.io/en/latest/pub-sub/) pattern is expected here as well; using `socket.send_multipart` with a topic name and the JSON-encoded data. Also notice that the schema must match that expected by the `JsonFormat` `IFormatDeserializer` described above:
+
+```json
+{ "message": , "originatingTime":
/// The binary reader.
- private (dynamic, DateTime) ReadNextFrame(BinaryReader binaryReader)
+ private (T, DateTime) ReadNextFrame(BinaryReader binaryReader)
{
int frameLength = binaryReader.ReadInt32();
From ef25ea6767a11b914c1573620bfc462485ab2d16 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Wed, 10 Apr 2024 10:44:57 +0200
Subject: [PATCH 09/21] Adding RebootableExtensions.cs
---
Psi.sln | 60 +++++++++++++------
.../Executive/RebootableExtensions.cs | 35 +++++++++++
2 files changed, 76 insertions(+), 19 deletions(-)
create mode 100644 Sources/Runtime/Microsoft.Psi/Executive/RebootableExtensions.cs
diff --git a/Psi.sln b/Psi.sln
index 3d8b0305d..dc70d28c5 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -259,7 +259,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SigmaApp", "Applications\Si
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SigmaComputeServer", "Applications\Sigma\SigmaComputeServer\SigmaComputeServer.csproj", "{365D836D-AD15-428C-96D1-6C4870525FEF}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TestConnection", "TestConnection\TestConnection.csproj", "{E4D7E21F-8469-456F-828D-DE1D2590E4EA}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestConnection", "TestConnection\TestConnection.csproj", "{E4D7E21F-8469-456F-828D-DE1D2590E4EA}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -549,14 +549,6 @@ Global
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|Any CPU.Build.0 = Release|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|x64.ActiveCfg = Release|Any CPU
{3F40EF71-126D-4D2B-84DB-37A574091B13}.Release|x64.Build.0 = Release|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Debug|x64.Build.0 = Debug|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|Any CPU.Build.0 = Release|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|x64.ActiveCfg = Release|Any CPU
- {E5E19772-C7DF-4586-AE35-3585AE28DBEB}.Release|x64.Build.0 = Release|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B9F00634-88A1-40EF-9DAD-814A307AD81F}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -581,14 +573,6 @@ Global
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|Any CPU.Build.0 = Release|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|x64.ActiveCfg = Release|Any CPU
{4478A162-4FE9-4737-A630-3899DC5935C6}.Release|x64.Build.0 = Release|Any CPU
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|Any CPU.ActiveCfg = Debug|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|Any CPU.Build.0 = Debug|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|x64.ActiveCfg = Debug|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Debug|x64.Build.0 = Debug|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|Any CPU.ActiveCfg = Release|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|Any CPU.Build.0 = Release|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|x64.ActiveCfg = Release|x64
- {C50F7F21-BEB0-4366-B73F-859EEBC3ED42}.Release|x64.Build.0 = Release|x64
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B73D864-9997-4637-8765-44C17FD09CE1}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -831,46 +815,84 @@ Global
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Debug|x64.Build.0 = Debug|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|Any CPU.Build.0 = Release|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.ActiveCfg = Release|Any CPU
+ {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.Build.0 = Release|Any CPU
{860DC343-4022-4A6B-9053-8729DFBD5C96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{860DC343-4022-4A6B-9053-8729DFBD5C96}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {860DC343-4022-4A6B-9053-8729DFBD5C96}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {860DC343-4022-4A6B-9053-8729DFBD5C96}.Debug|x64.Build.0 = Debug|Any CPU
{860DC343-4022-4A6B-9053-8729DFBD5C96}.Release|Any CPU.ActiveCfg = Release|Any CPU
{860DC343-4022-4A6B-9053-8729DFBD5C96}.Release|Any CPU.Build.0 = Release|Any CPU
+ {860DC343-4022-4A6B-9053-8729DFBD5C96}.Release|x64.ActiveCfg = Release|Any CPU
+ {860DC343-4022-4A6B-9053-8729DFBD5C96}.Release|x64.Build.0 = Release|Any CPU
{4C87BA2C-4EF4-447A-9409-4FD8CE9BC54D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {4C87BA2C-4EF4-447A-9409-4FD8CE9BC54D}.Debug|x64.ActiveCfg = Debug|Any CPU
{4C87BA2C-4EF4-447A-9409-4FD8CE9BC54D}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {4C87BA2C-4EF4-447A-9409-4FD8CE9BC54D}.Release|x64.ActiveCfg = Release|Any CPU
{F2A56B74-FA18-4CD8-B686-61235A2DDB8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {F2A56B74-FA18-4CD8-B686-61235A2DDB8C}.Debug|x64.ActiveCfg = Debug|Any CPU
{F2A56B74-FA18-4CD8-B686-61235A2DDB8C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {F2A56B74-FA18-4CD8-B686-61235A2DDB8C}.Release|x64.ActiveCfg = Release|Any CPU
{108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Debug|x64.Build.0 = Debug|Any CPU
{108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Release|x64.ActiveCfg = Release|Any CPU
+ {108D5CA8-8C44-4F7E-8C9F-02D6C1C6215F}.Release|x64.Build.0 = Release|Any CPU
{1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Debug|Any CPU.ActiveCfg = Debug|ARM
{1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Debug|Any CPU.Build.0 = Debug|ARM
+ {1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Debug|x64.ActiveCfg = Debug|Win32
+ {1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Debug|x64.Build.0 = Debug|Win32
{1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Release|Any CPU.ActiveCfg = Release|ARM
{1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Release|Any CPU.Build.0 = Release|ARM
+ {1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Release|x64.ActiveCfg = Release|Win32
+ {1AFBBD50-CE3A-4792-BE84-15E897D281DD}.Release|x64.Build.0 = Release|Win32
{632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Debug|x64.Build.0 = Debug|Any CPU
{632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Release|Any CPU.ActiveCfg = Release|Any CPU
{632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Release|Any CPU.Build.0 = Release|Any CPU
+ {632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Release|x64.ActiveCfg = Release|Any CPU
+ {632F209F-D0DD-4CE7-8975-C2D9F43EB964}.Release|x64.Build.0 = Release|Any CPU
{A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Debug|Any CPU.ActiveCfg = Debug|ARM
{A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Debug|Any CPU.Build.0 = Debug|ARM
+ {A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Debug|x64.ActiveCfg = Debug|ARM
+ {A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Debug|x64.Build.0 = Debug|ARM
{A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Release|Any CPU.ActiveCfg = Release|ARM
{A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Release|Any CPU.Build.0 = Release|ARM
+ {A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Release|x64.ActiveCfg = Release|ARM
+ {A94E45E7-5C81-4E7B-8500-F1C1B0DCB46E}.Release|x64.Build.0 = Release|ARM
{046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Debug|x64.Build.0 = Debug|Any CPU
{046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Release|x64.ActiveCfg = Release|Any CPU
+ {046DE977-8DFD-4847-A4D5-E65E3168E0CA}.Release|x64.Build.0 = Release|Any CPU
{82378A12-3492-457D-AF76-CBF08CCE9832}.Debug|Any CPU.ActiveCfg = Debug|ARM
{82378A12-3492-457D-AF76-CBF08CCE9832}.Debug|Any CPU.Build.0 = Debug|ARM
{82378A12-3492-457D-AF76-CBF08CCE9832}.Debug|Any CPU.Deploy.0 = Debug|ARM
+ {82378A12-3492-457D-AF76-CBF08CCE9832}.Debug|x64.ActiveCfg = Debug|ARM
+ {82378A12-3492-457D-AF76-CBF08CCE9832}.Debug|x64.Build.0 = Debug|ARM
+ {82378A12-3492-457D-AF76-CBF08CCE9832}.Debug|x64.Deploy.0 = Debug|ARM
{82378A12-3492-457D-AF76-CBF08CCE9832}.Release|Any CPU.ActiveCfg = Release|ARM
{82378A12-3492-457D-AF76-CBF08CCE9832}.Release|Any CPU.Build.0 = Release|ARM
{82378A12-3492-457D-AF76-CBF08CCE9832}.Release|Any CPU.Deploy.0 = Release|ARM
+ {82378A12-3492-457D-AF76-CBF08CCE9832}.Release|x64.ActiveCfg = Release|ARM
+ {82378A12-3492-457D-AF76-CBF08CCE9832}.Release|x64.Build.0 = Release|ARM
+ {82378A12-3492-457D-AF76-CBF08CCE9832}.Release|x64.Deploy.0 = Release|ARM
{365D836D-AD15-428C-96D1-6C4870525FEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {365D836D-AD15-428C-96D1-6C4870525FEF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {365D836D-AD15-428C-96D1-6C4870525FEF}.Debug|x64.Build.0 = Debug|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|Any CPU.Build.0 = Release|Any CPU
- {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.ActiveCfg = Release|Any CPU
- {41FBDC53-3167-4DEA-8B87-CFCCAFBCE7DD}.Release|x64.Build.0 = Release|Any CPU
+ {365D836D-AD15-428C-96D1-6C4870525FEF}.Release|x64.ActiveCfg = Release|Any CPU
+ {365D836D-AD15-428C-96D1-6C4870525FEF}.Release|x64.Build.0 = Release|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E4D7E21F-8469-456F-828D-DE1D2590E4EA}.Debug|x64.ActiveCfg = Debug|Any CPU
diff --git a/Sources/Runtime/Microsoft.Psi/Executive/RebootableExtensions.cs b/Sources/Runtime/Microsoft.Psi/Executive/RebootableExtensions.cs
new file mode 100644
index 000000000..b3b939e93
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi/Executive/RebootableExtensions.cs
@@ -0,0 +1,35 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+// Extensions for activating the possibility of rebooting and modifing pipeline structure.
+namespace Microsoft.Psi
+{
+ using System.Collections.Generic;
+ using System.Linq;
+
+ ///
+ /// Class containing rebootable extensions for the executive subsystem.
+ ///
+ public static class RebootableExtensions
+ {
+ ///
+ /// Retrieve the specified components from the given type.
+ ///
+ /// The type of component to retrieve.
+ /// The pipeline to get elements from.
+ /// The list of the components found inside the pipeline.
+ public static List GetElementsOfType(this Pipeline pipeline)
+ {
+ List components = new List();
+ foreach (var component in pipeline.Components)
+ {
+ if (component.StateObject is T element)
+ {
+ components.Add(element);
+ }
+ }
+
+ return components;
+ }
+ }
+}
From 174bce06b6c2e284a44435ddf31bef1df37adfdb Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Fri, 24 May 2024 11:48:14 +0200
Subject: [PATCH 10/21] Activate allowWhileRunning on BridgeTo
---
Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj | 3 +++
Sources/Runtime/Microsoft.Psi/Operators/Connectors.cs | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
index de3a346ed..7d59a30fa 100644
--- a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
+++ b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
@@ -5,6 +5,9 @@
true
Microsoft.Psi.Runtime
Provides the core APIs and components for Platform for Situated Intelligence.
+ 0.19.100.3
+ $(AssemblyVersion)-beta-mod
+ $(AssemblyVersion)
diff --git a/Sources/Runtime/Microsoft.Psi/Operators/Connectors.cs b/Sources/Runtime/Microsoft.Psi/Operators/Connectors.cs
index 18cd44273..cb34190cf 100644
--- a/Sources/Runtime/Microsoft.Psi/Operators/Connectors.cs
+++ b/Sources/Runtime/Microsoft.Psi/Operators/Connectors.cs
@@ -52,7 +52,7 @@ public static IProducer BridgeTo(this IProducer input, Pipeline targetP
else
{
var connector = new Connector(input.Out.Pipeline, targetPipeline, name ?? nameof(BridgeTo));
- return input.PipeTo(connector, deliveryPolicy);
+ return input.PipeTo(connector, true, deliveryPolicy);
}
}
From e31450e2eb0921fa84bc40dbdc2746702a1c5c64 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Tue, 2 Jul 2024 16:47:11 +0200
Subject: [PATCH 11/21] Update Format class for originatingTime serialisation
---
Psi.sln | 10 ++
...t.Psi.MixedReality.UniversalWindows.csproj | 2 +-
.../Serialization/Format{T}.cs | 6 +-
TestConnection/Program.cs | 146 ++++++++++++++++++
TestConnection/TestConnection.csproj | 16 ++
5 files changed, 176 insertions(+), 4 deletions(-)
create mode 100644 TestConnection/Program.cs
create mode 100644 TestConnection/TestConnection.csproj
diff --git a/Psi.sln b/Psi.sln
index cfd52ff5e..6ab520f3b 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -259,6 +259,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SigmaApp", "Applications\Si
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SigmaComputeServer", "Applications\Sigma\SigmaComputeServer\SigmaComputeServer.csproj", "{365D836D-AD15-428C-96D1-6C4870525FEF}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestConnection", "TestConnection\TestConnection.csproj", "{2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}"
+EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Psi.InteropAndroid", "Sources\Runtime\Microsoft.Psi.InteropAndroid\Microsoft.Psi.InteropAndroid.csproj", "{DF585F32-54AA-4553-AF91-6BBD1732E147}"
EndProject
Global
@@ -893,6 +895,14 @@ Global
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|Any CPU.Build.0 = Release|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|x64.ActiveCfg = Release|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|x64.Build.0 = Release|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|x64.Build.0 = Debug|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|x64.ActiveCfg = Release|Any CPU
+ {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|x64.Build.0 = Release|Any CPU
{DF585F32-54AA-4553-AF91-6BBD1732E147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF585F32-54AA-4553-AF91-6BBD1732E147}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF585F32-54AA-4553-AF91-6BBD1732E147}.Debug|x64.ActiveCfg = Debug|Any CPU
diff --git a/Sources/MixedReality/Microsoft.Psi.MixedReality.UniversalWindows/Microsoft.Psi.MixedReality.UniversalWindows.csproj b/Sources/MixedReality/Microsoft.Psi.MixedReality.UniversalWindows/Microsoft.Psi.MixedReality.UniversalWindows.csproj
index 402b8bcbe..a010e835d 100644
--- a/Sources/MixedReality/Microsoft.Psi.MixedReality.UniversalWindows/Microsoft.Psi.MixedReality.UniversalWindows.csproj
+++ b/Sources/MixedReality/Microsoft.Psi.MixedReality.UniversalWindows/Microsoft.Psi.MixedReality.UniversalWindows.csproj
@@ -115,7 +115,7 @@
runtime; build; native; contentfiles; analyzers; buildtransitive
all
-
+
1.1.118
runtime; build; native; contentfiles; analyzers; buildtransitive
all
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
index bd13414b9..1cfb09e27 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
@@ -46,15 +46,15 @@ public Format(
{
this.memoryStream.Position = 0;
using var writer = new BinaryWriter(this.memoryStream, Encoding.UTF8, true);
- writer.Write(originatingTime.ToFileTimeUtc());
+ writer.Write(originatingTime.ToBinary());
serializeAction(val, writer);
- return (this.memoryStream.GetBuffer(), 0, (int)this.memoryStream.Length);
+ return (this.memoryStream.GetBuffer(), 0, (int)this.memoryStream.Position);
};
this.deserialize = (payload, offset, length) =>
{
using var reader = new BinaryReader(new MemoryStream(payload, offset, length), Encoding.UTF8);
- var originatingTime = DateTime.FromFileTimeUtc(reader.ReadInt64());
+ var originatingTime = DateTime.FromBinary(reader.ReadInt64());
var val = deserializeFunc(reader, payload, offset, length);
return (val, originatingTime);
};
diff --git a/TestConnection/Program.cs b/TestConnection/Program.cs
new file mode 100644
index 000000000..ec5881cac
--- /dev/null
+++ b/TestConnection/Program.cs
@@ -0,0 +1,146 @@
+using Microsoft.Psi;
+using Microsoft.Psi.Remoting;
+using Microsoft.Psi.Interop.Serialization;
+using Microsoft.Psi.Interop.Rendezvous;
+
+namespace TestConnection
+{
+ public class PsiFormatMatrix4x4
+ {
+ public Format GetFormat()
+ {
+ return new Format(WriteMatrix4x4, ReadMatrix4x4);
+ }
+
+ public void WriteMatrix4x4(System.Numerics.Matrix4x4 matrix, BinaryWriter writer)
+ {
+ writer.Write((double)matrix.M11);
+ writer.Write((double)matrix.M12);
+ writer.Write((double)matrix.M13);
+ writer.Write((double)matrix.M14);
+ writer.Write((double)matrix.M21);
+ writer.Write((double)matrix.M22);
+ writer.Write((double)matrix.M23);
+ writer.Write((double)matrix.M24);
+ writer.Write((double)matrix.M31);
+ writer.Write((double)matrix.M32);
+ writer.Write((double)matrix.M33);
+ writer.Write((double)matrix.M34);
+ writer.Write((double)matrix.M41);
+ writer.Write((double)matrix.M42);
+ writer.Write((double)matrix.M43);
+ writer.Write((double)matrix.M44);
+ }
+
+ public System.Numerics.Matrix4x4 ReadMatrix4x4(BinaryReader reader)
+ {
+ System.Numerics.Matrix4x4 matrix = new System.Numerics.Matrix4x4();
+ matrix.M11 = (float)reader.ReadDouble();
+ matrix.M12 = (float)reader.ReadDouble();
+ matrix.M13 = (float)reader.ReadDouble();
+ matrix.M14 = (float)reader.ReadDouble();
+ matrix.M21 = (float)reader.ReadDouble();
+ matrix.M22 = (float)reader.ReadDouble();
+ matrix.M23 = (float)reader.ReadDouble();
+ matrix.M24 = (float)reader.ReadDouble();
+ matrix.M31 = (float)reader.ReadDouble();
+ matrix.M32 = (float)reader.ReadDouble();
+ matrix.M33 = (float)reader.ReadDouble();
+ matrix.M34 = (float)reader.ReadDouble();
+ matrix.M41 = (float)reader.ReadDouble();
+ matrix.M42 = (float)reader.ReadDouble();
+ matrix.M43 = (float)reader.ReadDouble();
+ matrix.M44 = (float)reader.ReadDouble();
+ return matrix;
+ }
+ }
+
+
+ public class PsiFormatDateTime
+ {
+ public Format GetFormat()
+ {
+ return new Format(WriteDateTime, ReadDateTime);
+ }
+
+ public void WriteDateTime(System.DateTime dateTime, BinaryWriter writer)
+ {
+ writer.Write(dateTime.ToBinary());
+ }
+
+ public System.DateTime ReadDateTime(BinaryReader reader)
+ {
+ return System.DateTime.FromBinary(reader.ReadInt64());
+ }
+ }
+
+ internal class Program
+ {
+ static private void Connection(string name, Rendezvous.TcpSourceEndpoint? source, Pipeline p, Format deserializer)
+ {
+ source?.ToTcpSource(p, deserializer, null, true, name).Do((d, e) => { Console.WriteLine($"Recieve {name} data @{e.OriginatingTime} : {d}"); });
+ }
+
+ static void Quest2Demo(Pipeline p)
+ {
+ var host = "192.168.56.1";
+ var remoteClock = new RemoteClockExporter(port: 11510);
+
+ bool canStart = false;
+ var process = new Rendezvous.Process("Server", new[] { remoteClock.ToRendezvousEndpoint(host) });
+ var server = new RendezvousServer();
+ server.Rendezvous.TryAddProcess(process);
+ server.Rendezvous.ProcessAdded += (_, pr) =>
+ {
+ Console.WriteLine($"Process {pr.Name}");
+ if (pr.Name == "Unity")
+ {
+ foreach (var endpoint in pr.Endpoints)
+ {
+ if (endpoint is Rendezvous.TcpSourceEndpoint)
+ {
+ Rendezvous.TcpSourceEndpoint? source = endpoint as Rendezvous.TcpSourceEndpoint;
+ foreach (var stream in endpoint.Streams)
+ {
+ Console.WriteLine($"\tStream {stream.StreamName}");
+ switch (stream.StreamName)
+ {
+ case "PositionLeft":
+ case "PositionRight":
+ case "Player":
+ Connection(stream.StreamName, source, p, new PsiFormatMatrix4x4().GetFormat());
+ break;
+ case "Time":
+ Connection(stream.StreamName, source, p, new PsiFormatDateTime().GetFormat());
+ break;
+ }
+ }
+ }
+ canStart = true;
+ }
+ }
+ };
+ server.Error += (s, e) => { Console.WriteLine(e.Message); Console.WriteLine(e.HResult); };
+ server.Start();
+ while (!canStart) Thread.Sleep(500);
+ Thread.Sleep(500);
+ }
+ static void Main(string[] args)
+ {
+ // Create the \psi pipeline
+ Pipeline pipeline = Pipeline.Create("Subpipline Removal", enableDiagnostics: false);
+ //var store = PsiStore.Create(pipeline, "Diagnostics", $"F:/Stores/Diagnostics/");
+ //store.Write(pipeline.Diagnostics, "Pipeline");
+ Quest2Demo(pipeline);
+
+
+ // Start the pipeline running
+ pipeline.RunAsync();
+ // Waiting for an out key
+ Console.WriteLine("Press any key to stop the application.");
+ Console.ReadLine();
+ // Stop correctly the pipeline.
+ pipeline.Dispose();
+ }
+ }
+}
diff --git a/TestConnection/TestConnection.csproj b/TestConnection/TestConnection.csproj
new file mode 100644
index 000000000..34c9eb08f
--- /dev/null
+++ b/TestConnection/TestConnection.csproj
@@ -0,0 +1,16 @@
+
+
+
+ Exe
+ net6.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
From d7e5a69a3b3b5d15a5aa5015bda9957dee2f8702 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Fri, 20 Sep 2024 15:05:10 +0200
Subject: [PATCH 12/21] Removing TestConnection project
---
Psi.sln | 10 --
TestConnection/Program.cs | 146 ---------------------------
TestConnection/TestConnection.csproj | 16 ---
3 files changed, 172 deletions(-)
delete mode 100644 TestConnection/Program.cs
delete mode 100644 TestConnection/TestConnection.csproj
diff --git a/Psi.sln b/Psi.sln
index 6ab520f3b..cfd52ff5e 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -259,8 +259,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SigmaApp", "Applications\Si
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SigmaComputeServer", "Applications\Sigma\SigmaComputeServer\SigmaComputeServer.csproj", "{365D836D-AD15-428C-96D1-6C4870525FEF}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestConnection", "TestConnection\TestConnection.csproj", "{2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}"
-EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Psi.InteropAndroid", "Sources\Runtime\Microsoft.Psi.InteropAndroid\Microsoft.Psi.InteropAndroid.csproj", "{DF585F32-54AA-4553-AF91-6BBD1732E147}"
EndProject
Global
@@ -895,14 +893,6 @@ Global
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|Any CPU.Build.0 = Release|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|x64.ActiveCfg = Release|Any CPU
{365D836D-AD15-428C-96D1-6C4870525FEF}.Release|x64.Build.0 = Release|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Debug|x64.Build.0 = Debug|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|Any CPU.Build.0 = Release|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|x64.ActiveCfg = Release|Any CPU
- {2D1CDFDE-31E9-45CC-98E9-E1E5716EFCC5}.Release|x64.Build.0 = Release|Any CPU
{DF585F32-54AA-4553-AF91-6BBD1732E147}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DF585F32-54AA-4553-AF91-6BBD1732E147}.Debug|Any CPU.Build.0 = Debug|Any CPU
{DF585F32-54AA-4553-AF91-6BBD1732E147}.Debug|x64.ActiveCfg = Debug|Any CPU
diff --git a/TestConnection/Program.cs b/TestConnection/Program.cs
deleted file mode 100644
index ec5881cac..000000000
--- a/TestConnection/Program.cs
+++ /dev/null
@@ -1,146 +0,0 @@
-using Microsoft.Psi;
-using Microsoft.Psi.Remoting;
-using Microsoft.Psi.Interop.Serialization;
-using Microsoft.Psi.Interop.Rendezvous;
-
-namespace TestConnection
-{
- public class PsiFormatMatrix4x4
- {
- public Format GetFormat()
- {
- return new Format(WriteMatrix4x4, ReadMatrix4x4);
- }
-
- public void WriteMatrix4x4(System.Numerics.Matrix4x4 matrix, BinaryWriter writer)
- {
- writer.Write((double)matrix.M11);
- writer.Write((double)matrix.M12);
- writer.Write((double)matrix.M13);
- writer.Write((double)matrix.M14);
- writer.Write((double)matrix.M21);
- writer.Write((double)matrix.M22);
- writer.Write((double)matrix.M23);
- writer.Write((double)matrix.M24);
- writer.Write((double)matrix.M31);
- writer.Write((double)matrix.M32);
- writer.Write((double)matrix.M33);
- writer.Write((double)matrix.M34);
- writer.Write((double)matrix.M41);
- writer.Write((double)matrix.M42);
- writer.Write((double)matrix.M43);
- writer.Write((double)matrix.M44);
- }
-
- public System.Numerics.Matrix4x4 ReadMatrix4x4(BinaryReader reader)
- {
- System.Numerics.Matrix4x4 matrix = new System.Numerics.Matrix4x4();
- matrix.M11 = (float)reader.ReadDouble();
- matrix.M12 = (float)reader.ReadDouble();
- matrix.M13 = (float)reader.ReadDouble();
- matrix.M14 = (float)reader.ReadDouble();
- matrix.M21 = (float)reader.ReadDouble();
- matrix.M22 = (float)reader.ReadDouble();
- matrix.M23 = (float)reader.ReadDouble();
- matrix.M24 = (float)reader.ReadDouble();
- matrix.M31 = (float)reader.ReadDouble();
- matrix.M32 = (float)reader.ReadDouble();
- matrix.M33 = (float)reader.ReadDouble();
- matrix.M34 = (float)reader.ReadDouble();
- matrix.M41 = (float)reader.ReadDouble();
- matrix.M42 = (float)reader.ReadDouble();
- matrix.M43 = (float)reader.ReadDouble();
- matrix.M44 = (float)reader.ReadDouble();
- return matrix;
- }
- }
-
-
- public class PsiFormatDateTime
- {
- public Format GetFormat()
- {
- return new Format(WriteDateTime, ReadDateTime);
- }
-
- public void WriteDateTime(System.DateTime dateTime, BinaryWriter writer)
- {
- writer.Write(dateTime.ToBinary());
- }
-
- public System.DateTime ReadDateTime(BinaryReader reader)
- {
- return System.DateTime.FromBinary(reader.ReadInt64());
- }
- }
-
- internal class Program
- {
- static private void Connection(string name, Rendezvous.TcpSourceEndpoint? source, Pipeline p, Format deserializer)
- {
- source?.ToTcpSource(p, deserializer, null, true, name).Do((d, e) => { Console.WriteLine($"Recieve {name} data @{e.OriginatingTime} : {d}"); });
- }
-
- static void Quest2Demo(Pipeline p)
- {
- var host = "192.168.56.1";
- var remoteClock = new RemoteClockExporter(port: 11510);
-
- bool canStart = false;
- var process = new Rendezvous.Process("Server", new[] { remoteClock.ToRendezvousEndpoint(host) });
- var server = new RendezvousServer();
- server.Rendezvous.TryAddProcess(process);
- server.Rendezvous.ProcessAdded += (_, pr) =>
- {
- Console.WriteLine($"Process {pr.Name}");
- if (pr.Name == "Unity")
- {
- foreach (var endpoint in pr.Endpoints)
- {
- if (endpoint is Rendezvous.TcpSourceEndpoint)
- {
- Rendezvous.TcpSourceEndpoint? source = endpoint as Rendezvous.TcpSourceEndpoint;
- foreach (var stream in endpoint.Streams)
- {
- Console.WriteLine($"\tStream {stream.StreamName}");
- switch (stream.StreamName)
- {
- case "PositionLeft":
- case "PositionRight":
- case "Player":
- Connection(stream.StreamName, source, p, new PsiFormatMatrix4x4().GetFormat());
- break;
- case "Time":
- Connection(stream.StreamName, source, p, new PsiFormatDateTime().GetFormat());
- break;
- }
- }
- }
- canStart = true;
- }
- }
- };
- server.Error += (s, e) => { Console.WriteLine(e.Message); Console.WriteLine(e.HResult); };
- server.Start();
- while (!canStart) Thread.Sleep(500);
- Thread.Sleep(500);
- }
- static void Main(string[] args)
- {
- // Create the \psi pipeline
- Pipeline pipeline = Pipeline.Create("Subpipline Removal", enableDiagnostics: false);
- //var store = PsiStore.Create(pipeline, "Diagnostics", $"F:/Stores/Diagnostics/");
- //store.Write(pipeline.Diagnostics, "Pipeline");
- Quest2Demo(pipeline);
-
-
- // Start the pipeline running
- pipeline.RunAsync();
- // Waiting for an out key
- Console.WriteLine("Press any key to stop the application.");
- Console.ReadLine();
- // Stop correctly the pipeline.
- pipeline.Dispose();
- }
- }
-}
diff --git a/TestConnection/TestConnection.csproj b/TestConnection/TestConnection.csproj
deleted file mode 100644
index 34c9eb08f..000000000
--- a/TestConnection/TestConnection.csproj
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
- Exe
- net6.0
- enable
- enable
-
-
-
-
-
-
-
-
-
From 195a12ef584054462986f36bcadf2f48faaecef4 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Fri, 20 Sep 2024 15:18:47 +0200
Subject: [PATCH 13/21] Renaming Microsoft.Psi.InteropAndroid to
Microsoft.Psi.Interop.Android
---
Psi.sln | 2 +-
...teropAndroid.csproj => Microsoft.Psi.Interop.Android.csproj} | 0
2 files changed, 1 insertion(+), 1 deletion(-)
rename Sources/Runtime/Microsoft.Psi.InteropAndroid/{Microsoft.Psi.InteropAndroid.csproj => Microsoft.Psi.Interop.Android.csproj} (100%)
diff --git a/Psi.sln b/Psi.sln
index cfd52ff5e..58f099f0b 100644
--- a/Psi.sln
+++ b/Psi.sln
@@ -259,7 +259,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SigmaApp", "Applications\Si
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SigmaComputeServer", "Applications\Sigma\SigmaComputeServer\SigmaComputeServer.csproj", "{365D836D-AD15-428C-96D1-6C4870525FEF}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Psi.InteropAndroid", "Sources\Runtime\Microsoft.Psi.InteropAndroid\Microsoft.Psi.InteropAndroid.csproj", "{DF585F32-54AA-4553-AF91-6BBD1732E147}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Psi.Interop.Android", "Sources\Runtime\Microsoft.Psi.InteropAndroid\Microsoft.Psi.Interop.Android.csproj", "{DF585F32-54AA-4553-AF91-6BBD1732E147}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Microsoft.Psi.InteropAndroid.csproj b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Microsoft.Psi.Interop.Android.csproj
similarity index 100%
rename from Sources/Runtime/Microsoft.Psi.InteropAndroid/Microsoft.Psi.InteropAndroid.csproj
rename to Sources/Runtime/Microsoft.Psi.InteropAndroid/Microsoft.Psi.Interop.Android.csproj
From 325fa7f53f4ff1e5cdd10faee2b8d0dff1cf568b Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Mon, 23 Sep 2024 09:21:51 +0200
Subject: [PATCH 14/21] Update Readme
---
Sources/Runtime/Microsoft.Psi.InteropAndroid/Readme.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Readme.md b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Readme.md
index b4ee22b5f..197a6a9c2 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Readme.md
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Readme.md
@@ -1,3 +1,4 @@
# Psi Interop Android
-Reduced version of `Microsoft.Psi.Interop` for using RendezVous system and TCPSource/Writer in Unity for Quest headset.
\ No newline at end of file
+Reduced version of `Microsoft.Psi.Interop` for using RendezVous system and TCPSource/Writer in Unity for Quest headset.
+Should be used with Microsoft.Psi dll from this branch to be compatible.
\ No newline at end of file
From 1ce1a5bc2287b93425f1f11c6df56d03440ae046 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Mon, 4 Nov 2024 08:25:02 +0100
Subject: [PATCH 15/21] Update MessagePack nuget for errors fixes
---
.../Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj b/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
index a222e4249..782bd3334 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
@@ -30,7 +30,7 @@
-
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
From 50ccc7f48a40ffeaee257c02dd1240453bba2f3a Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Wed, 15 Jan 2025 11:40:24 +0100
Subject: [PATCH 16/21] Adding RemotePipelineClockExporter/Importer
---
.../Microsoft.Psi.Interop.csproj | 1 +
.../Rendezvous/Operators.cs | 18 +++
.../Rendezvous/Rendezvous.cs | 36 +++++
.../Rendezvous/RendezvousRelay.cs | 11 ++
.../Microsoft.Psi/Executive/Pipeline.cs | 8 +-
.../Microsoft.Psi/Microsoft.Psi.csproj | 2 +-
.../Remoting/RemotePipelineClockExporter.cs | 127 ++++++++++++++++
.../Remoting/RemotePipelineClockImporter.cs | 138 ++++++++++++++++++
8 files changed, 336 insertions(+), 5 deletions(-)
create mode 100644 Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs
create mode 100644 Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj b/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
index a222e4249..fc5cbbeee 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
@@ -4,6 +4,7 @@
netstandard2.0
true
Provides APIs and components for interoperation with other data formats.
+ $(AssemblyVersion)-beta-modRPC3
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
index 7a1608399..e491a6a88 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
@@ -70,6 +70,15 @@ public static Rendezvous.Endpoint ToRendezvousEndpoint(this NetMQWriter writer)
public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemoteClockExporter exporter, string host)
=> new Rendezvous.RemoteClockExporterEndpoint(host, exporter.Port);
+ ///
+ /// Create a rendezvous endpoint from a .
+ ///
+ /// from which to create endpoint.
+ /// Host address with which to create endpoint.
+ /// Rendezvous endpoint.
+ public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemotePipelineClockExporter exporter, string host)
+ => new Rendezvous.RemotePipelineClockExporterEndpoint(host, exporter.Port);
+
///
/// Create a from a .
///
@@ -119,6 +128,15 @@ public static RemoteImporter ToRemoteImporter(this Rendezvous.RemoteExporterEndp
public static RemoteClockImporter ToRemoteClockImporter(this Rendezvous.RemoteClockExporterEndpoint endpoint, Pipeline pipeline)
=> new (pipeline, endpoint.Host, endpoint.Port);
+ ///
+ /// Create a from a .
+ ///
+ /// from which to create .
+ /// The pipeline to add the component to.
+ /// .
+ public static RemotePipelineClockImporter ToRemotePipelineClockImporter(this Rendezvous.RemotePipelineClockExporterEndpoint endpoint, Pipeline pipeline)
+ => new (pipeline, endpoint.Host, endpoint.Port);
+
///
/// Writes a stream to a specified rendezvous process.
///
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Rendezvous.cs b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Rendezvous.cs
index a910e257c..0e423250b 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Rendezvous.cs
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Rendezvous.cs
@@ -361,6 +361,42 @@ public override void AddStream(Stream stream)
}
}
+ ///
+ /// Represents a remote clock exporter endpoint providing clock information.
+ ///
+ ///
+ /// Endpoint does not provide any streams. Clock information is exchanged directly.
+ ///
+ public class RemotePipelineClockExporterEndpoint : Endpoint
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Host name used by the endpoint.
+ /// Port used by the endpoint.
+ public RemotePipelineClockExporterEndpoint(string host, int port)
+ {
+ this.Host = host;
+ this.Port = port;
+ }
+
+ ///
+ /// Gets the endpoint host name.
+ ///
+ public string Host { get; private set; }
+
+ ///
+ /// Gets the endpoint port.
+ ///
+ public int Port { get; private set; }
+
+ ///
+ public override void AddStream(Stream stream)
+ {
+ throw new InvalidOperationException($"Cannot add streams to a {nameof(RemotePipelineClockExporterEndpoint)}");
+ }
+ }
+
///
/// Represents an application process hosting endpoints.
///
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/RendezvousRelay.cs b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/RendezvousRelay.cs
index 04ffc8197..32ab98fa4 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/RendezvousRelay.cs
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/RendezvousRelay.cs
@@ -69,6 +69,12 @@ protected static void WriteAddProcess(Rendezvous.Process process, BinaryWriter w
writer.Write(remoteClockExporterEndpoint.Host);
writer.Write(remoteClockExporterEndpoint.Port);
}
+ else if (endpoint is Rendezvous.RemotePipelineClockExporterEndpoint remotePipelineClockExporterEndpoint)
+ {
+ writer.Write((byte)4); // RemotePipelineClockExporterEndpoint
+ writer.Write(remotePipelineClockExporterEndpoint.Host);
+ writer.Write(remotePipelineClockExporterEndpoint.Port);
+ }
else
{
throw new ArgumentException($"Unknown type of Endpoint ({endpoint.GetType().Name}).");
@@ -191,6 +197,11 @@ private static Rendezvous.Process ReadProcess(BinaryReader reader)
port = reader.ReadInt32();
endpoint = new Rendezvous.RemoteClockExporterEndpoint(host, port);
break;
+ case 4: // RemotePipelineClockExporerEndpoint
+ host = reader.ReadString();
+ port = reader.ReadInt32();
+ endpoint = new Rendezvous.RemotePipelineClockExporterEndpoint(host, port);
+ break;
default:
throw new Exception("Unknown type of Endpoint.");
}
diff --git a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
index c2e45ec4c..8f7faefe8 100644
--- a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
+++ b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
@@ -63,8 +63,6 @@ public class Pipeline : IDisposable
///
private ReplayDescriptor replayDescriptor;
- private TimeInterval proposedOriginatingTimeInterval;
-
private State state;
private bool enableExceptionHandling;
@@ -253,6 +251,8 @@ private set
internal Scheduler Scheduler => this.scheduler;
+ internal TimeInterval ProposedOriginatingTimeInterval { get; private set; }
+
internal SchedulerContext ActivationContext => this.activationContext;
internal SchedulerContext SchedulerContext => this.schedulerContext;
@@ -341,7 +341,7 @@ public virtual void ProposeReplayTime(TimeInterval originatingTimeInterval)
throw new ArgumentException(nameof(originatingTimeInterval), "Replay time intervals must have a valid start time.");
}
- this.proposedOriginatingTimeInterval = (this.proposedOriginatingTimeInterval == null) ? originatingTimeInterval : TimeInterval.Coverage(new[] { this.proposedOriginatingTimeInterval, originatingTimeInterval });
+ this.ProposedOriginatingTimeInterval = (this.ProposedOriginatingTimeInterval == null) ? originatingTimeInterval : TimeInterval.Coverage(new[] { this.ProposedOriginatingTimeInterval, originatingTimeInterval });
}
///
@@ -962,7 +962,7 @@ protected virtual IDisposable RunAsync(ReplayDescriptor descriptor, Clock clock,
{
this.state = State.Starting;
descriptor ??= ReplayDescriptor.ReplayAllRealTime;
- this.replayDescriptor = descriptor.Intersect(this.proposedOriginatingTimeInterval);
+ this.replayDescriptor = descriptor.Intersect(this.ProposedOriginatingTimeInterval);
this.completed.Reset();
if (clock == null)
diff --git a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
index 7d59a30fa..abcc4c86f 100644
--- a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
+++ b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
@@ -6,7 +6,7 @@
Microsoft.Psi.Runtime
Provides the core APIs and components for Platform for Situated Intelligence.
0.19.100.3
- $(AssemblyVersion)-beta-mod
+ $(AssemblyVersion)-beta-modRPC2
$(AssemblyVersion)
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs
new file mode 100644
index 000000000..216919882
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs
@@ -0,0 +1,127 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.Psi.Remoting
+{
+ using System;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Net;
+ using System.Net.Sockets;
+ using System.Threading;
+
+ ///
+ /// Component that exports pipeline clock information over TCP to enable synchronization.
+ ///
+ public class RemotePipelineClockExporter : IDisposable
+ {
+ ///
+ /// Default TCP port used to communicate with .
+ ///
+ public const int DefaultPort = 11511;
+
+ internal const short ProtocolVersion = 0;
+
+ private TcpListener listener;
+ private bool isDisposing;
+ private Pipeline pipeline;
+ private TimeInterval interval;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The pipeline sync master.
+ /// The connection port.
+ /// Optional for specific time interval.
+ public RemotePipelineClockExporter(Pipeline pipeline, int port = DefaultPort, TimeInterval interval = null)
+ {
+ this.pipeline = pipeline;
+ this.Port = port;
+ this.interval = interval ?? TimeInterval.Infinite;
+ this.listener = new TcpListener(IPAddress.Any, port);
+ this.Start();
+ }
+
+ ///
+ /// Gets the connection port.
+ ///
+ public int Port { get; }
+
+ ///
+ public void Dispose()
+ {
+ this.isDisposing = true;
+ this.listener.Stop();
+ this.listener = null;
+ }
+
+ private void Start()
+ {
+ new Thread(new ThreadStart(this.Listen)) { IsBackground = true }.Start();
+ }
+
+ private void Listen()
+ {
+ if (this.listener != null)
+ {
+ NetworkStream networkStream = null;
+ try
+ {
+ this.listener.Start();
+ networkStream = this.listener.AcceptTcpClient().GetStream();
+
+ // check protocol version
+ using var reader = new BinaryReader(networkStream);
+ var version = reader.ReadInt16();
+ if (version != ProtocolVersion)
+ {
+ throw new IOException($"Unsupported remote pipeline clock protocol version: {version}");
+ }
+
+ using var writer = new BinaryWriter(networkStream);
+
+ // current pipeline time, used by client to sync clocks
+ if (this.pipeline.IsRunning || this.pipeline.ReplayDescriptor.Start != DateTime.MinValue)
+ {
+ writer.Write(0);
+ if (this.pipeline.IsRunning)
+ {
+ writer.Write(this.pipeline.GetCurrentTime().Ticks);
+ }
+ else
+ {
+ writer.Write(DateTime.UtcNow.Ticks);
+ }
+ }
+ else if (this.pipeline.IsInitial || this.pipeline.IsStarting)
+ {
+ writer.Write(1);
+ writer.Write(Math.Max(this.pipeline.ProposedOriginatingTimeInterval.Left.Ticks, this.interval.Left.Ticks));
+ }
+ else
+ {
+ writer.Write(2);
+ writer.Write(this.pipeline.GetCurrentTime().Ticks);
+ }
+
+ // name of the pipeline
+ writer.Write(this.pipeline.Name);
+ writer.Flush();
+ }
+ catch (Exception ex)
+ {
+ Trace.WriteLine($"{nameof(RemotePipelineClockExporter)} Exception: {ex.Message}");
+ }
+ finally
+ {
+ networkStream?.Dispose();
+ if (!this.isDisposing)
+ {
+ this.listener.Stop();
+ this.Start();
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs
new file mode 100644
index 000000000..6dfbc8b31
--- /dev/null
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs
@@ -0,0 +1,138 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT license.
+
+namespace Microsoft.Psi.Remoting
+{
+ using System;
+ using System.Diagnostics;
+ using System.IO;
+ using System.Net.Sockets;
+ using System.Threading;
+ using Microsoft.Psi;
+
+ ///
+ /// Component that reads remote clock information over TCP and synchronizes the local pipeline clock.
+ ///
+ public class RemotePipelineClockImporter : IDisposable
+ {
+ private readonly Pipeline pipeline;
+ private readonly string name;
+ private readonly string host;
+ private readonly int port;
+ private readonly TcpClient client;
+ private readonly EventWaitHandle connected = new (false, EventResetMode.ManualReset);
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The pipeline to add the component to.
+ /// The host name of the remote clock exporter/server.
+ /// The port on which to connect.
+ /// An optional name for the component.
+ public RemotePipelineClockImporter(Pipeline pipeline, string host, int port = RemotePipelineClockExporter.DefaultPort, string name = nameof(RemotePipelineClockImporter))
+ {
+ this.pipeline = pipeline;
+ this.name = name;
+ this.client = new TcpClient();
+ this.host = host;
+ this.port = port;
+ this.connected.Reset();
+ new Thread(new ThreadStart(this.SynchronizeLocalPipelineClock)) { IsBackground = true }.Start();
+ }
+
+ ///
+ /// Gets wait handle for remote connection being established.
+ ///
+ /// This should be waited on prior to running the pipeline.
+ public EventWaitHandle Connected
+ {
+ get { return this.connected; }
+ }
+
+ ///
+ /// Gets or sets machine with which to synchronize pipeline clock.
+ ///
+ internal static string PrimaryClockSourceMachineName { get; set; } = string.Empty;
+
+ ///
+ public void Dispose()
+ {
+ this.client.Close();
+ this.connected.Dispose();
+ }
+
+ ///
+ public override string ToString() => this.name;
+
+ private void SynchronizeLocalPipelineClock()
+ {
+ var completed = false;
+ while (!completed)
+ {
+ NetworkStream networkStream = null;
+ try
+ {
+ Trace.WriteLine($"Attempting to connect to {this.host} on port {this.port} ...");
+ this.client.Connect(this.host, this.port);
+ networkStream = this.client.GetStream();
+ Trace.WriteLine($"Connected to {this.host} on port {this.port}.");
+
+ // send protocol version
+ using var writer = new BinaryWriter(networkStream);
+ var stopwatch = new Stopwatch();
+ stopwatch.Start();
+ writer.Write(RemotePipelineClockExporter.ProtocolVersion);
+
+ using var reader = new BinaryReader(networkStream);
+ int state = reader.ReadInt32();
+ var timeAtExporter = reader.ReadInt64();
+ stopwatch.Stop();
+ var timeAtImporter = DateTime.UtcNow.Ticks;
+ var elapsedTime = stopwatch.ElapsedTicks;
+ var pipelineName = reader.ReadString();
+ var timeOffset = TimeSpan.Zero;
+
+ if (pipelineName != this.pipeline.Name)
+ {
+ switch (state)
+ {
+ case 0:
+ // Elapsed time includes the complete round trip latency between writing the header and receiving the
+ // remote (exporter) machine's time. We assume that half of the time was from here to the exporter, meaning
+ // that subtracting elapsed / 2 from our current time gives the time as it was on our clock when the exporter
+ // sent it's time. The difference becomes an offset to apply to our pipeline clock to synchronize.
+ timeOffset = TimeSpan.FromTicks(timeAtExporter - (timeAtImporter - (elapsedTime / 2)));
+ Trace.WriteLine($"{nameof(RemotePipelineClockImporter)} clock sync: Local={timeAtImporter} Remote pipeline[{pipelineName}]={timeAtExporter} Latency={elapsedTime} Offset={timeOffset.Ticks}.");
+ break;
+ case 1:
+ this.pipeline.ProposeReplayTime(new TimeInterval(new DateTime(timeAtExporter), DateTime.MaxValue));
+ timeOffset = TimeSpan.FromTicks(elapsedTime / 2);
+ break;
+ case 2:
+ throw new Exception($"{nameof(RemotePipelineClockImporter)} clock sync with ({pipelineName}) that is stopped or complete");
+ }
+ }
+ else
+ {
+ // The "remote" pipeline is actually *this* pipeline. In this case, assume exactly zero offset.
+ Trace.WriteLine($"{nameof(RemotePipelineClockImporter)} clock sync with self ignored ({pipelineName}). Pipeline clock will remain unchanged.");
+ }
+
+ // synchronize pipeline clock
+ this.pipeline.VirtualTimeOffset = timeOffset;
+ this.connected.Set();
+ completed = true;
+ }
+ catch (Exception ex)
+ {
+ Trace.WriteLine($"{nameof(RemotePipelineClockImporter)} Exception: {ex.Message}");
+ }
+ finally
+ {
+ networkStream?.Dispose();
+ this.client.Close();
+ }
+ }
+ }
+ }
+}
From 9096d313c9a92a907682b1ff33c8a87b55551619 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Wed, 15 Jan 2025 15:46:00 +0100
Subject: [PATCH 17/21] Package Output Path to $(SolutionDir)\Build\PsiPackages
---
.gitignore | 3 +++
.../Microsoft.Psi.Audio.Linux/Microsoft.Psi.Audio.Linux.csproj | 1 +
.../Microsoft.Psi.Audio.Windows.csproj | 1 +
Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj | 1 +
.../Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj | 1 +
Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj | 3 ++-
.../Microsoft.Psi.DeviceManagement.csproj | 1 +
.../Filters/Microsoft.Psi.Filters/Microsoft.Psi.Filters.csproj | 1 +
.../Microsoft.Psi.Imaging.Linux.csproj | 1 +
.../Microsoft.Psi.Imaging.Windows.csproj | 1 +
.../Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj | 1 +
.../Microsoft.Psi.CognitiveServices.Face.csproj | 1 +
.../Microsoft.Psi.CognitiveServices.Language.Windows.csproj | 1 +
.../Microsoft.Psi.CognitiveServices.Language.csproj | 1 +
.../Microsoft.Psi.CognitiveServices.Speech.csproj | 1 +
.../Microsoft.Psi.CognitiveServices.Vision.csproj | 1 +
.../Onnx/Microsoft.Psi.Onnx.Cpu/Microsoft.Psi.Onnx.Cpu.csproj | 1 +
.../Onnx/Microsoft.Psi.Onnx.Gpu/Microsoft.Psi.Onnx.Gpu.csproj | 1 +
.../Microsoft.Psi.Onnx.ModelRunners.Cpu.csproj | 1 +
.../Microsoft.Psi.Onnx.ModelRunners.Gpu.csproj | 1 +
.../Microsoft.Psi.Onnx.Visualization.Windows.csproj | 1 +
.../Microsoft.Psi.AzureKinect.Visualization.Windows.x64.csproj | 3 ++-
.../Microsoft.Psi.AzureKinect.x64.csproj | 1 +
.../Microsoft.Psi.Kinect.Face.Windows.x64.csproj | 1 +
.../Microsoft.Psi.Kinect.Visualization.Windows.csproj | 3 ++-
.../Microsoft.Psi.Kinect.Windows.csproj | 1 +
.../Microsoft.Psi.Language/Microsoft.Psi.Language.csproj | 1 +
.../Microsoft.Psi.Media.Linux/Microsoft.Psi.Media.Linux.csproj | 1 +
.../Microsoft.Psi.Media.Windows.x64.csproj | 1 +
Sources/Media/Microsoft.Psi.Media/Microsoft.Psi.Media.csproj | 1 +
.../Microsoft.Psi.MixedReality.csproj | 1 +
.../Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj | 2 ++
.../Runtime/Microsoft.Psi.Windows/Microsoft.Psi.Windows.csproj | 1 +
Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj | 1 +
...icrosoft.Psi.Spatial.Euclidean.Visualization.Windows.csproj | 1 +
.../Microsoft.Psi.Spatial.Euclidean.csproj | 1 +
.../Microsoft.Psi.Speech.Windows.csproj | 1 +
.../Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj | 3 ++-
.../Microsoft.Msagl.WpfGraphControl.csproj | 3 ++-
.../Microsoft.Psi.LiveCharts.Visualization.Windows.csproj | 3 ++-
.../Microsoft.Psi.Visualization.Windows.csproj | 3 ++-
41 files changed, 51 insertions(+), 7 deletions(-)
diff --git a/.gitignore b/.gitignore
index d033613f3..9e80f1699 100644
--- a/.gitignore
+++ b/.gitignore
@@ -268,3 +268,6 @@ paket-files/
/_site/
/.sass-cache/
Gemfile.lock
+
+#nugetGenerated
+/Build/PsiPackages/
\ No newline at end of file
diff --git a/Sources/Audio/Microsoft.Psi.Audio.Linux/Microsoft.Psi.Audio.Linux.csproj b/Sources/Audio/Microsoft.Psi.Audio.Linux/Microsoft.Psi.Audio.Linux.csproj
index ede6f18d0..5a9a11e01 100644
--- a/Sources/Audio/Microsoft.Psi.Audio.Linux/Microsoft.Psi.Audio.Linux.csproj
+++ b/Sources/Audio/Microsoft.Psi.Audio.Linux/Microsoft.Psi.Audio.Linux.csproj
@@ -4,6 +4,7 @@
netstandard2.0
true
Provides Linux-specific APIs and components for audio capture and playback.
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj b/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj
index ddbda099f..d31ebbf9b 100644
--- a/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj
+++ b/Sources/Audio/Microsoft.Psi.Audio.Windows/Microsoft.Psi.Audio.Windows.csproj
@@ -4,6 +4,7 @@
Provides Windows-specific APIs and components for audio capture, processing and playback.
true
Microsoft.Psi.Audio
+ $(SolutionDir)\Build\PsiPackages
true
diff --git a/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj b/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj
index 7c3fd0d51..1254cb989 100644
--- a/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj
+++ b/Sources/Audio/Microsoft.Psi.Audio/Microsoft.Psi.Audio.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides data structures and APIs for audio processing.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj b/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj
index 7de76a6f3..f09429a45 100644
--- a/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj
+++ b/Sources/Calibration/Microsoft.Psi.Calibration/Microsoft.Psi.Calibration.csproj
@@ -5,6 +5,7 @@
true
Microsoft.Psi.Calibration
Microsoft.Psi.Calibration
+ $(SolutionDir)\Build\PsiPackages
bin\Release\netstandard2.0\Microsoft.Psi.Calibration.xml
diff --git a/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj b/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj
index e482e6aef..ca9f06b89 100644
--- a/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj
+++ b/Sources/Data/Microsoft.Psi.Data/Microsoft.Psi.Data.csproj
@@ -1,9 +1,10 @@
-
+
netstandard2.0
true
Provides APIs for manipulating datasets.
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Devices/Microsoft.Psi.DeviceManagement/Microsoft.Psi.DeviceManagement.csproj b/Sources/Devices/Microsoft.Psi.DeviceManagement/Microsoft.Psi.DeviceManagement.csproj
index 116b00ce9..d0ab771a8 100644
--- a/Sources/Devices/Microsoft.Psi.DeviceManagement/Microsoft.Psi.DeviceManagement.csproj
+++ b/Sources/Devices/Microsoft.Psi.DeviceManagement/Microsoft.Psi.DeviceManagement.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides data structures that support enumerating devices.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Filters/Microsoft.Psi.Filters/Microsoft.Psi.Filters.csproj b/Sources/Filters/Microsoft.Psi.Filters/Microsoft.Psi.Filters.csproj
index faa88e45a..07cc6608f 100644
--- a/Sources/Filters/Microsoft.Psi.Filters/Microsoft.Psi.Filters.csproj
+++ b/Sources/Filters/Microsoft.Psi.Filters/Microsoft.Psi.Filters.csproj
@@ -6,6 +6,7 @@
true
true
..\..\..\Build\Microsoft.Psi.ruleset
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Imaging/Microsoft.Psi.Imaging.Linux/Microsoft.Psi.Imaging.Linux.csproj b/Sources/Imaging/Microsoft.Psi.Imaging.Linux/Microsoft.Psi.Imaging.Linux.csproj
index d44512e58..54fe76cb5 100644
--- a/Sources/Imaging/Microsoft.Psi.Imaging.Linux/Microsoft.Psi.Imaging.Linux.csproj
+++ b/Sources/Imaging/Microsoft.Psi.Imaging.Linux/Microsoft.Psi.Imaging.Linux.csproj
@@ -4,6 +4,7 @@
netstandard2.0
true
Provides Linux-specific components for encoding and decoding images.
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj b/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj
index ba3f5fa23..b4b860827 100644
--- a/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj
+++ b/Sources/Imaging/Microsoft.Psi.Imaging.Windows/Microsoft.Psi.Imaging.Windows.csproj
@@ -4,6 +4,7 @@
Provides Windows-specific components for encoding and decoding images.
true
Microsoft.Psi.Imaging
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.Imaging.Windows.xml
diff --git a/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj b/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj
index 14f23672a..820954d7b 100644
--- a/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj
+++ b/Sources/Imaging/Microsoft.Psi.Imaging/Microsoft.Psi.Imaging.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides APIs and components for representing and manipulating images.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Face/Microsoft.Psi.CognitiveServices.Face.csproj b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Face/Microsoft.Psi.CognitiveServices.Face.csproj
index 7cffa8594..76dd951fa 100644
--- a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Face/Microsoft.Psi.CognitiveServices.Face.csproj
+++ b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Face/Microsoft.Psi.CognitiveServices.Face.csproj
@@ -5,6 +5,7 @@
true
../../../../Build/Microsoft.Psi.ruleset
Provides components for using Microsoft's Cognitive Services Face API.
+ $(SolutionDir)\Build\PsiPackages
bin\Debug\netstandard2.0\Microsoft.Psi.CognitiveServices.Face.xml
diff --git a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language.Windows/Microsoft.Psi.CognitiveServices.Language.Windows.csproj b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language.Windows/Microsoft.Psi.CognitiveServices.Language.Windows.csproj
index c575be6b0..b828d1521 100644
--- a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language.Windows/Microsoft.Psi.CognitiveServices.Language.Windows.csproj
+++ b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language.Windows/Microsoft.Psi.CognitiveServices.Language.Windows.csproj
@@ -4,6 +4,7 @@
true
Provides components for using Microsoft's Cognitive Services Language API.
Microsoft.Psi.CognitiveServices.Language
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.CognitiveServices.Language.Windows.xml
diff --git a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language/Microsoft.Psi.CognitiveServices.Language.csproj b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language/Microsoft.Psi.CognitiveServices.Language.csproj
index 26772ce17..0a7319098 100644
--- a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language/Microsoft.Psi.CognitiveServices.Language.csproj
+++ b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Language/Microsoft.Psi.CognitiveServices.Language.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides components for using Microsoft's Cognitive Services Language Understanding Service (LUIS).
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Speech/Microsoft.Psi.CognitiveServices.Speech.csproj b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Speech/Microsoft.Psi.CognitiveServices.Speech.csproj
index 1fb3db79a..84ef863f1 100644
--- a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Speech/Microsoft.Psi.CognitiveServices.Speech.csproj
+++ b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Speech/Microsoft.Psi.CognitiveServices.Speech.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides components for using Microsoft's Cognitive Services Speech API.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Vision/Microsoft.Psi.CognitiveServices.Vision.csproj b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Vision/Microsoft.Psi.CognitiveServices.Vision.csproj
index 1f2b8f4cc..1a7947289 100644
--- a/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Vision/Microsoft.Psi.CognitiveServices.Vision.csproj
+++ b/Sources/Integrations/CognitiveServices/Microsoft.Psi.CognitiveServices.Vision/Microsoft.Psi.CognitiveServices.Vision.csproj
@@ -7,6 +7,7 @@
Library
+ $(SolutionDir)\Build\PsiPackages
bin\Release\netstandard2.0\Microsoft.Psi.CognitiveServices.Vision.xml
diff --git a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Cpu/Microsoft.Psi.Onnx.Cpu.csproj b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Cpu/Microsoft.Psi.Onnx.Cpu.csproj
index 238738d91..3d40230ba 100644
--- a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Cpu/Microsoft.Psi.Onnx.Cpu.csproj
+++ b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Cpu/Microsoft.Psi.Onnx.Cpu.csproj
@@ -4,6 +4,7 @@
Provides components for running ONNX models.
true
Microsoft.Psi.Onnx
+ $(SolutionDir)\Build\PsiPackages
bin\Release\netstandard2.0\Microsoft.Psi.Onnx.Cpu.xml
diff --git a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Gpu/Microsoft.Psi.Onnx.Gpu.csproj b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Gpu/Microsoft.Psi.Onnx.Gpu.csproj
index 4291ddf8a..a81b64221 100644
--- a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Gpu/Microsoft.Psi.Onnx.Gpu.csproj
+++ b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Gpu/Microsoft.Psi.Onnx.Gpu.csproj
@@ -4,6 +4,7 @@
Provides components for running ONNX models.
true
Microsoft.Psi.Onnx
+ $(SolutionDir)\Build\PsiPackages
bin\Release\netstandard2.0\Microsoft.Psi.Onnx.Gpu.xml
diff --git a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Cpu/Microsoft.Psi.Onnx.ModelRunners.Cpu.csproj b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Cpu/Microsoft.Psi.Onnx.ModelRunners.Cpu.csproj
index 753390c42..dcaf954c5 100644
--- a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Cpu/Microsoft.Psi.Onnx.ModelRunners.Cpu.csproj
+++ b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Cpu/Microsoft.Psi.Onnx.ModelRunners.Cpu.csproj
@@ -8,6 +8,7 @@
true
true
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Gpu/Microsoft.Psi.Onnx.ModelRunners.Gpu.csproj b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Gpu/Microsoft.Psi.Onnx.ModelRunners.Gpu.csproj
index 668540868..7fc18ca71 100644
--- a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Gpu/Microsoft.Psi.Onnx.ModelRunners.Gpu.csproj
+++ b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.ModelRunners.Gpu/Microsoft.Psi.Onnx.ModelRunners.Gpu.csproj
@@ -8,6 +8,7 @@
true
true
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Visualization.Windows/Microsoft.Psi.Onnx.Visualization.Windows.csproj b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Visualization.Windows/Microsoft.Psi.Onnx.Visualization.Windows.csproj
index 552df04df..91d0be72b 100644
--- a/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Visualization.Windows/Microsoft.Psi.Onnx.Visualization.Windows.csproj
+++ b/Sources/Integrations/Onnx/Microsoft.Psi.Onnx.Visualization.Windows/Microsoft.Psi.Onnx.Visualization.Windows.csproj
@@ -4,6 +4,7 @@
net472
Microsoft.Psi.Onnx.Visualization
Provides visualizers for ONNX model runner output types defined in Microsoft.Psi.Onnx.ModelRunners.
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Kinect/Microsoft.Psi.AzureKinect.Visualization/Microsoft.Psi.AzureKinect.Visualization.Windows.x64.csproj b/Sources/Kinect/Microsoft.Psi.AzureKinect.Visualization/Microsoft.Psi.AzureKinect.Visualization.Windows.x64.csproj
index c78b0b2f4..529b7cc86 100644
--- a/Sources/Kinect/Microsoft.Psi.AzureKinect.Visualization/Microsoft.Psi.AzureKinect.Visualization.Windows.x64.csproj
+++ b/Sources/Kinect/Microsoft.Psi.AzureKinect.Visualization/Microsoft.Psi.AzureKinect.Visualization.Windows.x64.csproj
@@ -5,7 +5,8 @@
Microsoft.Psi.AzureKinect.Visualization
x64
../../../Build/Microsoft.Psi.ruleset
-
+ $(SolutionDir)\Build\PsiPackages
+
DEBUG;TRACE
bin\Debug\net472\Microsoft.Psi.AzureKinect.Visualization.Windows.x64.xml
diff --git a/Sources/Kinect/Microsoft.Psi.AzureKinect.x64/Microsoft.Psi.AzureKinect.x64.csproj b/Sources/Kinect/Microsoft.Psi.AzureKinect.x64/Microsoft.Psi.AzureKinect.x64.csproj
index cbf3743c2..44c5cd8e5 100644
--- a/Sources/Kinect/Microsoft.Psi.AzureKinect.x64/Microsoft.Psi.AzureKinect.x64.csproj
+++ b/Sources/Kinect/Microsoft.Psi.AzureKinect.x64/Microsoft.Psi.AzureKinect.x64.csproj
@@ -8,6 +8,7 @@
Microsoft.Psi.AzureKinect.x64.nuspec
configuration=$(Configuration);version=$(Version)
../../../Build/Microsoft.Psi.ruleset
+ $(SolutionDir)\Build\PsiPackages
x64
diff --git a/Sources/Kinect/Microsoft.Psi.Kinect.Face.Windows.x64/Microsoft.Psi.Kinect.Face.Windows.x64.csproj b/Sources/Kinect/Microsoft.Psi.Kinect.Face.Windows.x64/Microsoft.Psi.Kinect.Face.Windows.x64.csproj
index 3645d4726..034f64de8 100644
--- a/Sources/Kinect/Microsoft.Psi.Kinect.Face.Windows.x64/Microsoft.Psi.Kinect.Face.Windows.x64.csproj
+++ b/Sources/Kinect/Microsoft.Psi.Kinect.Face.Windows.x64/Microsoft.Psi.Kinect.Face.Windows.x64.csproj
@@ -4,6 +4,7 @@
Provides APIs and components for using Microsoft Kinect Face APIs.
true
Microsoft.Psi.Kinect.Face
+ $(SolutionDir)\Build\PsiPackages
true
diff --git a/Sources/Kinect/Microsoft.Psi.Kinect.Visualization.Windows/Microsoft.Psi.Kinect.Visualization.Windows.csproj b/Sources/Kinect/Microsoft.Psi.Kinect.Visualization.Windows/Microsoft.Psi.Kinect.Visualization.Windows.csproj
index a8e4000b3..037f9d8b0 100644
--- a/Sources/Kinect/Microsoft.Psi.Kinect.Visualization.Windows/Microsoft.Psi.Kinect.Visualization.Windows.csproj
+++ b/Sources/Kinect/Microsoft.Psi.Kinect.Visualization.Windows/Microsoft.Psi.Kinect.Visualization.Windows.csproj
@@ -6,7 +6,8 @@
AnyCPU
../../../Build/Microsoft.Psi.ruleset
Provides visualizers for Kinect v2.
-
+ $(SolutionDir)\Build\PsiPackages
+
DEBUG;TRACE
bin\Debug\net472\Microsoft.Psi.Kinect.Visualization.Windows.xml
diff --git a/Sources/Kinect/Microsoft.Psi.Kinect.Windows/Microsoft.Psi.Kinect.Windows.csproj b/Sources/Kinect/Microsoft.Psi.Kinect.Windows/Microsoft.Psi.Kinect.Windows.csproj
index 80bc592ae..1044c7ec8 100644
--- a/Sources/Kinect/Microsoft.Psi.Kinect.Windows/Microsoft.Psi.Kinect.Windows.csproj
+++ b/Sources/Kinect/Microsoft.Psi.Kinect.Windows/Microsoft.Psi.Kinect.Windows.csproj
@@ -4,6 +4,7 @@
Provides APIs and components for using Microsoft Kinect sensor.
true
Microsoft.Psi.Kinect
+ $(SolutionDir)\Build\PsiPackages
true
diff --git a/Sources/Language/Microsoft.Psi.Language/Microsoft.Psi.Language.csproj b/Sources/Language/Microsoft.Psi.Language/Microsoft.Psi.Language.csproj
index ee8444a80..fcb93d474 100644
--- a/Sources/Language/Microsoft.Psi.Language/Microsoft.Psi.Language.csproj
+++ b/Sources/Language/Microsoft.Psi.Language/Microsoft.Psi.Language.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides data structures for natural language processing.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Media/Microsoft.Psi.Media.Linux/Microsoft.Psi.Media.Linux.csproj b/Sources/Media/Microsoft.Psi.Media.Linux/Microsoft.Psi.Media.Linux.csproj
index 842ba428f..fae3d51be 100644
--- a/Sources/Media/Microsoft.Psi.Media.Linux/Microsoft.Psi.Media.Linux.csproj
+++ b/Sources/Media/Microsoft.Psi.Media.Linux/Microsoft.Psi.Media.Linux.csproj
@@ -9,6 +9,7 @@
true
Microsoft.Psi.Media
Provides Linux-specific APIs and components for audio-visual capture.
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Media/Microsoft.Psi.Media.Windows.x64/Microsoft.Psi.Media.Windows.x64.csproj b/Sources/Media/Microsoft.Psi.Media.Windows.x64/Microsoft.Psi.Media.Windows.x64.csproj
index 45ecc6892..786f9e13d 100644
--- a/Sources/Media/Microsoft.Psi.Media.Windows.x64/Microsoft.Psi.Media.Windows.x64.csproj
+++ b/Sources/Media/Microsoft.Psi.Media.Windows.x64/Microsoft.Psi.Media.Windows.x64.csproj
@@ -4,6 +4,7 @@
true
Microsoft.Psi.Media
Provides Windows-specific APIs and components for audio-visual capture and processing.
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.Media.Windows.x64.xml
diff --git a/Sources/Media/Microsoft.Psi.Media/Microsoft.Psi.Media.csproj b/Sources/Media/Microsoft.Psi.Media/Microsoft.Psi.Media.csproj
index 99a41bb01..150448bd9 100644
--- a/Sources/Media/Microsoft.Psi.Media/Microsoft.Psi.Media.csproj
+++ b/Sources/Media/Microsoft.Psi.Media/Microsoft.Psi.Media.csproj
@@ -5,6 +5,7 @@
Provides data structures and APIs for audio-visual media processing.
true
Microsoft.Psi.Media
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/MixedReality/Microsoft.Psi.MixedReality/Microsoft.Psi.MixedReality.csproj b/Sources/MixedReality/Microsoft.Psi.MixedReality/Microsoft.Psi.MixedReality.csproj
index 7e72da776..3d63f907f 100644
--- a/Sources/MixedReality/Microsoft.Psi.MixedReality/Microsoft.Psi.MixedReality.csproj
+++ b/Sources/MixedReality/Microsoft.Psi.MixedReality/Microsoft.Psi.MixedReality.csproj
@@ -5,6 +5,7 @@
netstandard2.0
../../../Build/Microsoft.Psi.ruleset
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj b/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
index 04cc299fe..b1b43a6fd 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Microsoft.Psi.Interop.csproj
@@ -4,6 +4,8 @@
netstandard2.0
true
Provides APIs and components for interoperation with other data formats.
+ $(SolutionDir)\Build\PsiPackages
+
diff --git a/Sources/Runtime/Microsoft.Psi.Windows/Microsoft.Psi.Windows.csproj b/Sources/Runtime/Microsoft.Psi.Windows/Microsoft.Psi.Windows.csproj
index f9fbdb7e5..2ec037ff4 100644
--- a/Sources/Runtime/Microsoft.Psi.Windows/Microsoft.Psi.Windows.csproj
+++ b/Sources/Runtime/Microsoft.Psi.Windows/Microsoft.Psi.Windows.csproj
@@ -8,6 +8,7 @@
Library
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.Windows.xml
diff --git a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
index de3a346ed..cf57890a5 100644
--- a/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
+++ b/Sources/Runtime/Microsoft.Psi/Microsoft.Psi.csproj
@@ -5,6 +5,7 @@
true
Microsoft.Psi.Runtime
Provides the core APIs and components for Platform for Situated Intelligence.
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows.csproj b/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows.csproj
index 215bf3465..c75e92668 100644
--- a/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows.csproj
+++ b/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows/Microsoft.Psi.Spatial.Euclidean.Visualization.Windows.csproj
@@ -5,6 +5,7 @@
Microsoft.Psi.Spatial.Euclidean.Visualization
Provides visualization objects and adapters for various types defined in Microsoft.Psi.Spatial.Euclidean.
True
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean/Microsoft.Psi.Spatial.Euclidean.csproj b/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean/Microsoft.Psi.Spatial.Euclidean.csproj
index 3a3a95de0..a228a0dfc 100644
--- a/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean/Microsoft.Psi.Spatial.Euclidean.csproj
+++ b/Sources/Spatial/Microsoft.Psi.Spatial.Euclidean/Microsoft.Psi.Spatial.Euclidean.csproj
@@ -4,6 +4,7 @@
netstandard2.0
Provides types and methods for representing various 3D shapes and spatial operations. This project extends what is already provided in MathNet.Spatial.Euclidean.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Speech/Microsoft.Psi.Speech.Windows/Microsoft.Psi.Speech.Windows.csproj b/Sources/Speech/Microsoft.Psi.Speech.Windows/Microsoft.Psi.Speech.Windows.csproj
index b9dcac8d3..6a1879be6 100644
--- a/Sources/Speech/Microsoft.Psi.Speech.Windows/Microsoft.Psi.Speech.Windows.csproj
+++ b/Sources/Speech/Microsoft.Psi.Speech.Windows/Microsoft.Psi.Speech.Windows.csproj
@@ -4,6 +4,7 @@
true
Microsoft.Psi.Speech
Provides Windows-specific components for speech processing.
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.Speech.Windows.xml
diff --git a/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj b/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj
index a8cefc179..f70538dbe 100644
--- a/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj
+++ b/Sources/Speech/Microsoft.Psi.Speech/Microsoft.Psi.Speech.csproj
@@ -1,9 +1,10 @@
-
+
netstandard2.0
Provides data structures, APIs and components for speech processing.
true
+ $(SolutionDir)\Build\PsiPackages
diff --git a/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj b/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj
index aa72588d8..0bbcdb1a9 100644
--- a/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj
+++ b/Sources/Visualization/Microsoft.Msagl.WpfGraphControl/Microsoft.Msagl.WpfGraphControl.csproj
@@ -1,9 +1,10 @@
net472
- false
+ True
Microsoft.Msagl.WpfGraphControl
WPF graph control for MSAGL.
+ $(SolutionDir)\Build\PsiPackages
bin\Release\Microsoft.Msagl.WpfGraphControl.xml
diff --git a/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj b/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj
index cab6ff50e..54cbc446c 100644
--- a/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj
+++ b/Sources/Visualization/Microsoft.Psi.LiveCharts.Visualization.Windows/Microsoft.Psi.LiveCharts.Visualization.Windows.csproj
@@ -1,9 +1,10 @@
net472
- false
+ True
Microsoft.Psi.LiveCharts.Visualization
Provides visualization objects and APIs for using LiveCharts with Platform for Situated Intelligence Studio.
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.LiveCharts.Visualization.Windows.xml
diff --git a/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj b/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj
index 3f283de20..0d7490307 100644
--- a/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj
+++ b/Sources/Visualization/Microsoft.Psi.Visualization.Windows/Microsoft.Psi.Visualization.Windows.csproj
@@ -1,9 +1,10 @@
net472
- false
+ True
Microsoft.Psi.Visualization
Provides base data structures for visualization APIs for Platform for Situated Intelligence.
+ $(SolutionDir)\Build\PsiPackages
bin\Release\net472\Microsoft.Psi.Visualization.Windows.xml
From d9b3d61c67747aa7d280964af2f3eb91f3cef037 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Thu, 16 Jan 2025 10:37:58 +0100
Subject: [PATCH 18/21] Merging changes in Interop.Android
---
.../Rendezvous/Operators.cs | 11 +-----
.../Rendezvous/Operators.cs | 30 ++++++++++++++++
.../Rendezvous/Rendezvous.cs | 36 +++++++++++++++++++
.../Rendezvous/RendezvousRelay.cs | 11 ++++++
.../Rendezvous/RendezvousServer.cs | 10 ++++++
.../Serialization/Format{T}.cs | 15 ++------
.../Serialization/IFormatDeserializer.cs | 2 +-
.../Serialization/IFormatSerializer.cs | 4 +--
8 files changed, 94 insertions(+), 25 deletions(-)
diff --git a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
index 3b79cdaa9..e8052c463 100644
--- a/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
+++ b/Sources/Runtime/Microsoft.Psi.Interop/Rendezvous/Operators.cs
@@ -122,15 +122,6 @@ public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemoteExporter expor
public static RemoteImporter ToRemoteImporter(this Rendezvous.RemoteExporterEndpoint endpoint, Pipeline pipeline, string storePath, KnownSerializers knownSerializers)
=> new (pipeline, storePath, endpoint.Host, endpoint.Port, knownSerializers);
- ///
- /// Create a from a .
- ///
- /// from which to create .
- /// The pipeline to add the component to.
- /// .
- public static RemoteImporter ToRemoteImporter(this Rendezvous.RemoteExporterEndpoint endpoint, Pipeline pipeline)
- => new (pipeline, endpoint.Host, endpoint.Port);
-
///
/// Create a from a .
///
@@ -145,7 +136,7 @@ public static RemoteClockImporter ToRemoteClockImporter(this Rendezvous.RemoteCl
///
/// from which to create .
/// The pipeline to add the component to.
- /// .
+ /// .
public static RemotePipelineClockImporter ToRemotePipelineClockImporter(this Rendezvous.RemotePipelineClockExporterEndpoint endpoint, Pipeline pipeline)
=> new (pipeline, endpoint.Host, endpoint.Port);
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Operators.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Operators.cs
index c3c1af9a6..31ba7bb93 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Operators.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Operators.cs
@@ -7,6 +7,7 @@ namespace Microsoft.Psi.Interop.Rendezvous
using Microsoft.Psi.Interop.Serialization;
using Microsoft.Psi.Interop.Transport;
using Microsoft.Psi.Remoting;
+ using Microsoft.Psi.Serialization;
///
/// Rendezvous related operators.
@@ -53,6 +54,15 @@ public static TcpSource ToTcpSource(
public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemoteClockExporter exporter, string host)
=> new Rendezvous.RemoteClockExporterEndpoint(host, exporter.Port);
+ ///
+ /// Create a rendezvous endpoint from a .
+ ///
+ /// from which to create endpoint.
+ /// Host address with which to create endpoint.
+ /// Rendezvous endpoint.
+ public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemotePipelineClockExporter exporter, string host)
+ => new Rendezvous.RemotePipelineClockExporterEndpoint(host, exporter.Port);
+
///
/// Create a rendezvous endpoint from a .
///
@@ -71,6 +81,17 @@ public static Rendezvous.Endpoint ToRendezvousEndpoint(this RemoteExporter expor
return endpoint;
}
+ ///
+ /// Create a from a .
+ ///
+ /// from which to create .
+ /// The pipeline to add the component to.
+ /// Path for PsiStore.
+ /// Custom known serializers.
+ /// .
+ public static RemoteImporter ToRemoteImporter(this Rendezvous.RemoteExporterEndpoint endpoint, Pipeline pipeline, string storePath, KnownSerializers knownSerializers)
+ => new (pipeline, storePath, endpoint.Host, endpoint.Port, knownSerializers);
+
///
/// Create a from a .
///
@@ -89,6 +110,15 @@ public static RemoteImporter ToRemoteImporter(this Rendezvous.RemoteExporterEndp
public static RemoteClockImporter ToRemoteClockImporter(this Rendezvous.RemoteClockExporterEndpoint endpoint, Pipeline pipeline)
=> new (pipeline, endpoint.Host, endpoint.Port);
+ ///
+ /// Create a from a .
+ ///
+ /// from which to create .
+ /// The pipeline to add the component to.
+ /// .
+ public static RemotePipelineClockImporter ToRemotePipelineClockImporter(this Rendezvous.RemotePipelineClockExporterEndpoint endpoint, Pipeline pipeline)
+ => new (pipeline, endpoint.Host, endpoint.Port);
+
///
/// Writes a stream to a specified rendezvous process.
///
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Rendezvous.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Rendezvous.cs
index a910e257c..0e423250b 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Rendezvous.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/Rendezvous.cs
@@ -361,6 +361,42 @@ public override void AddStream(Stream stream)
}
}
+ ///
+ /// Represents a remote clock exporter endpoint providing clock information.
+ ///
+ ///
+ /// Endpoint does not provide any streams. Clock information is exchanged directly.
+ ///
+ public class RemotePipelineClockExporterEndpoint : Endpoint
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// Host name used by the endpoint.
+ /// Port used by the endpoint.
+ public RemotePipelineClockExporterEndpoint(string host, int port)
+ {
+ this.Host = host;
+ this.Port = port;
+ }
+
+ ///
+ /// Gets the endpoint host name.
+ ///
+ public string Host { get; private set; }
+
+ ///
+ /// Gets the endpoint port.
+ ///
+ public int Port { get; private set; }
+
+ ///
+ public override void AddStream(Stream stream)
+ {
+ throw new InvalidOperationException($"Cannot add streams to a {nameof(RemotePipelineClockExporterEndpoint)}");
+ }
+ }
+
///
/// Represents an application process hosting endpoints.
///
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousRelay.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousRelay.cs
index 04ffc8197..32ab98fa4 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousRelay.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousRelay.cs
@@ -69,6 +69,12 @@ protected static void WriteAddProcess(Rendezvous.Process process, BinaryWriter w
writer.Write(remoteClockExporterEndpoint.Host);
writer.Write(remoteClockExporterEndpoint.Port);
}
+ else if (endpoint is Rendezvous.RemotePipelineClockExporterEndpoint remotePipelineClockExporterEndpoint)
+ {
+ writer.Write((byte)4); // RemotePipelineClockExporterEndpoint
+ writer.Write(remotePipelineClockExporterEndpoint.Host);
+ writer.Write(remotePipelineClockExporterEndpoint.Port);
+ }
else
{
throw new ArgumentException($"Unknown type of Endpoint ({endpoint.GetType().Name}).");
@@ -191,6 +197,11 @@ private static Rendezvous.Process ReadProcess(BinaryReader reader)
port = reader.ReadInt32();
endpoint = new Rendezvous.RemoteClockExporterEndpoint(host, port);
break;
+ case 4: // RemotePipelineClockExporerEndpoint
+ host = reader.ReadString();
+ port = reader.ReadInt32();
+ endpoint = new Rendezvous.RemotePipelineClockExporterEndpoint(host, port);
+ break;
default:
throw new Exception("Unknown type of Endpoint.");
}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs
index 48bb9eacf..38112f496 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Rendezvous/RendezvousServer.cs
@@ -32,6 +32,7 @@ public class RendezvousServer : RendezvousRelay, IDisposable
private TcpListener listener;
private bool active = false;
+ private string serverAddress;
///
/// Initializes a new instance of the class.
@@ -49,6 +50,11 @@ public RendezvousServer(int port = DefaultPort, Rendezvous rendezvous = null)
///
public bool IsActive => this.active;
+ ///
+ /// Gets the server address (on which the most recent client connection was received).
+ ///
+ public string ServerAddress => this.serverAddress;
+
///
/// Start rendezvous client (blocking until connection is established).
///
@@ -98,6 +104,7 @@ private void ListenForClients()
{
var client = this.listener.AcceptTcpClient();
var remoteAddress = client.Client.RemoteEndPoint.ToString().Split(':')[0];
+ var localAddress = client.Client.LocalEndPoint.ToString().Split(':')[0];
var stream = client.GetStream();
var reader = new BinaryReader(stream);
var version = reader.ReadInt16();
@@ -123,6 +130,9 @@ private void ListenForClients()
WriteAddProcess(process, writer);
}
+ // set the server address to the address of the local endpoint from which the client was received
+ this.serverAddress = localAddress;
+
new Thread(new ParameterizedThreadStart(this.ReadFromClient)) { IsBackground = true }
.Start(Tuple.Create(reader, guid));
}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
index 1cfb09e27..ae6b27e4d 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/Format{T}.cs
@@ -75,23 +75,14 @@ public Format(
///
public (byte[] Bytes, int Index, int Count) SerializeMessage(T message, DateTime originatingTime)
- {
- return this.serialize(message, originatingTime);
- }
+ => this.serialize(message, originatingTime);
///
public (T Message, DateTime OriginatingTime) DeserializeMessage(byte[] payload, int index, int count)
- {
- return this.deserialize(payload, index, count);
- }
+ => this.deserialize(payload, index, count);
///
public void Dispose()
- {
- if (this.memoryStream != null)
- {
- this.memoryStream.Dispose();
- }
- }
+ => this.memoryStream?.Dispose();
}
}
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs
index 502685840..2fc9cb0a9 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatDeserializer.cs
@@ -17,7 +17,7 @@ public interface IFormatDeserializer
/// Payload bytes.
/// Starting index of message data.
/// Number of bytes constituting message data.
- /// Dynamic of primitive or IEnumerable/ExpandoObject of primitive as well as originating time stamp.
+ /// Type of primitive or IEnumerable/ExpandoObject of primitive as well as originating time stamp.
(T Message, DateTime OriginatingTime) DeserializeMessage(byte[] payload, int index, int count);
}
}
\ No newline at end of file
diff --git a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs
index 270487513..0634d8db3 100644
--- a/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs
+++ b/Sources/Runtime/Microsoft.Psi.InteropAndroid/Serialization/IFormatSerializer.cs
@@ -8,13 +8,13 @@ namespace Microsoft.Psi.Interop.Serialization
///
/// Format serializer interface.
///
- /// Type which is serialized.
+ /// Type which is deserialized.
public interface IFormatSerializer
{
///
/// Serialize single message with originating time stamp.
///
- /// Message of any type.
+ /// Message of type.
/// Originating time of message.
/// Serialized bytes, index and count.
(byte[] Bytes, int Index, int Count) SerializeMessage(T message, DateTime originatingTime);
From fc28987981d8484f90b6780eefc1865f4cb841e1 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Wed, 5 Feb 2025 16:48:35 +0100
Subject: [PATCH 19/21] Fix null checks.
---
.../Persistence/InfiniteFileWriter.cs | 22 ++++++++++++++++---
1 file changed, 19 insertions(+), 3 deletions(-)
diff --git a/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs b/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs
index 0c967c67c..ec3e03635 100644
--- a/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Persistence/InfiniteFileWriter.cs
@@ -65,9 +65,20 @@ public InfiniteFileWriter(string path, string fileName, int extentSize)
{
while (!this.disposed)
{
- this.localWritePulse.WaitOne();
- this.globalWritePulse.ReleaseMutex();
- this.globalWritePulse.WaitOne();
+ if (this.localWritePulse != null)
+ {
+ this.localWritePulse.WaitOne();
+ }
+
+ if (this.globalWritePulse != null)
+ {
+ this.globalWritePulse.ReleaseMutex();
+ }
+
+ if (this.globalWritePulse != null)
+ {
+ this.globalWritePulse.WaitOne();
+ }
}
}
catch (ObjectDisposedException)
@@ -219,6 +230,11 @@ internal static string PulseEventName(string path, string fileName)
private static string MakeHandleName(string format, string path, string fileName)
{
+ if (path == null)
+ {
+ return default;
+ }
+
var name = string.Format(format, path.ToLower().GetDeterministicHashCode(), fileName.ToLower());
if (name.Length > 260)
{
From 0076cc1d40bc2fcca043d1e940423b45344bf126 Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Fri, 16 May 2025 17:22:57 +0200
Subject: [PATCH 20/21] Update of RemotePipelineClock components
---
.../Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs | 6 +++---
.../Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs | 3 +--
2 files changed, 4 insertions(+), 5 deletions(-)
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs
index 216919882..87e6a47df 100644
--- a/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockExporter.cs
@@ -90,7 +90,7 @@ private void Listen()
}
else
{
- writer.Write(DateTime.UtcNow.Ticks);
+ writer.Write(this.pipeline.ReplayDescriptor.Start.Ticks);
}
}
else if (this.pipeline.IsInitial || this.pipeline.IsStarting)
@@ -100,8 +100,8 @@ private void Listen()
}
else
{
- writer.Write(2);
- writer.Write(this.pipeline.GetCurrentTime().Ticks);
+ writer.Write(2);
+ writer.Write(DateTime.UtcNow.Ticks);
}
// name of the pipeline
diff --git a/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs
index 6dfbc8b31..dd459a2ee 100644
--- a/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs
+++ b/Sources/Runtime/Microsoft.Psi/Remoting/RemotePipelineClockImporter.cs
@@ -96,6 +96,7 @@ private void SynchronizeLocalPipelineClock()
{
switch (state)
{
+ case 2:
case 0:
// Elapsed time includes the complete round trip latency between writing the header and receiving the
// remote (exporter) machine's time. We assume that half of the time was from here to the exporter, meaning
@@ -108,8 +109,6 @@ private void SynchronizeLocalPipelineClock()
this.pipeline.ProposeReplayTime(new TimeInterval(new DateTime(timeAtExporter), DateTime.MaxValue));
timeOffset = TimeSpan.FromTicks(elapsedTime / 2);
break;
- case 2:
- throw new Exception($"{nameof(RemotePipelineClockImporter)} clock sync with ({pipelineName}) that is stopped or complete");
}
}
else
From 9a1e6fc533c15b1b88867e6242f8ad6e8094e26c Mon Sep 17 00:00:00 2001
From: AuMilliat
Date: Tue, 27 May 2025 16:28:40 +0200
Subject: [PATCH 21/21] Removing CreateSynchedPipeline
---
.../Microsoft.Psi/Executive/Pipeline.cs | 23 -------------------
1 file changed, 23 deletions(-)
diff --git a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
index 8f7faefe8..8f7abf8a3 100644
--- a/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
+++ b/Sources/Runtime/Microsoft.Psi/Executive/Pipeline.cs
@@ -307,29 +307,6 @@ public static Pipeline Create(
return new Pipeline(name, deliveryPolicy, threadCount, allowSchedulingOnExternalThreads, enableDiagnostics, diagnosticsConfiguration);
}
- ///
- /// Create new pipeline setting time offset and diagnostics collector from given pipeline.
- ///
- /// Pipeline to retrieve time offset and diagonistic configuration.
- /// Pipeline name.
- /// Number of threads.
- /// Whether to allow scheduling on external threads.
- /// Indicates whether to enable collecting and publishing diagnostics information on the Pipeline.Diagnostics stream.
- /// Created pipeline.
- public static Pipeline CreateSynchedPipeline(
- Pipeline pipeline,
- string name = null,
- int threadCount = 0,
- bool allowSchedulingOnExternalThreads = false,
- bool enableDiagnostics = false)
- {
- Pipeline newPipeline = new Pipeline(name == null ? $"Synched|{pipeline.Name}" : name, pipeline.defaultDeliveryPolicy, threadCount, allowSchedulingOnExternalThreads);
- newPipeline.VirtualTimeOffset = pipeline.VirtualTimeOffset;
- newPipeline.DiagnosticsCollector = enableDiagnostics ? pipeline.DiagnosticsCollector : null;
- newPipeline.DiagnosticsConfiguration = pipeline.DiagnosticsConfiguration;
- return newPipeline;
- }
-
///
/// Propose replay time.
///