.containerfile
+8
-2
diff --git a/.containerfile b/.containerfile
index 2625a0e..e979309 100644
@@ -5,23 +5,29 @@ WORKDIR /app
COPY ./MMirror.slnx ./global.json ./dotnet-tools.json ./Directory.Packages.props ./Directory.Build.props ./.gitignore ./.editorconfig ./
COPY ./src/Integrations/Vasttrafik/Vasttrafik.csproj ./src/Integrations/Vasttrafik/packages.lock.json ./src/Integrations/Vasttrafik/
COPY ./src/Integrations/FaceCamera/FaceCamera.csproj ./src/Integrations/FaceCamera/packages.lock.json ./src/Integrations/FaceCamera/
COPY ./src/App/App.csproj ./src/App/packages.lock.json ./src/App/
RUN dotnet restore --locked-mode ./src/App/App.csproj
COPY ./src/Integrations/Vasttrafik/ ./src/Integrations/Vasttrafik/
COPY ./src/Integrations/FaceCamera/ ./src/Integrations/FaceCamera/
COPY ./src/App/ ./src/App/
RUN dotnet build ./src/App/App.csproj --no-restore --configuration Release
RUN dotnet build ./src/App/App.csproj --no-restore --configuration Release --runtime linux-arm64
RUN dotnet publish ./src/App/App.csproj --no-build --configuration Release --output /output
RUN dotnet publish ./src/App/App.csproj --no-build --configuration Release --runtime linux-arm64 --output /output
FROM mcr.microsoft.com/dotnet/runtime:11.0.0-preview.4 AS release
WORKDIR /app
# Install DRM/KMS dependencies
RUN apt-get update && apt-get install -y kmscube libinput-tools
# Install OpenCV dependencies
RUN apt-get update && apt-get install -y build-essential libtiff-dev libgeotiff-dev libgtk-4-dev libgstreamer1.0-dev libavcodec-dev libswscale-dev libavformat-dev libopenexr-dev libdc1394-dev libv4l-dev libeigen3-dev libopengl-dev cmake-curses-gui freeglut3-dev git libvtk9-dev qt6-base-dev
COPY --from=build /output ./
ENTRYPOINT ["dotnet", "./MMirror.App.dll"]
Directory.Packages.props
+8
-0
diff --git a/Directory.Packages.props b/Directory.Packages.props
index cd86271..c1413d0 100644
@@ -15,8 +15,15 @@
<PackageVersion Include="Avalonia.Fonts.Inter" Version="12.0.4" />
<PackageVersion Include="AvaloniaUI.DiagnosticsSupport" Version="2.2.2" />
<PackageVersion Include="CommunityToolkit.Mvvm" Version="8.4.2" />
<PackageVersion Include="Emgu.CV" Version="4.13.0.5924" />
<PackageVersion Include="Emgu.CV.runtime.mini.debian-arm64" Version="4.12.0.5764" />
<PackageVersion Include="Emgu.CV.runtime.windows" Version="4.13.0.5924" />
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="11.0.0-preview.4.26230.115" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.6.0" />
<PackageVersion
Include="Microsoft.Extensions.Options.ConfigurationExtensions"
Version="11.0.0-preview.4.26230.115"
/>
<PackageVersion Include="MSTest" Version="4.2.3" />
<PackageVersion
Include="Microsoft.Extensions.DependencyInjection"
@@ -27,6 +34,7 @@
Include="Microsoft.Extensions.Caching.Memory"
Version="11.0.0-preview.4.26230.115"
/>
<PackageVersion Include="OpenCvSharp4" Version="4.13.0.20260602" />
<PackageVersion Include="Shouldly" Version="4.3.0" />
<PackageVersion Include="System.IdentityModel.Tokens.Jwt" Version="8.19.1" />
</ItemGroup>
MMirror.slnx
+2
-0
diff --git a/MMirror.slnx b/MMirror.slnx
index d8a9d94..c997e5d 100644
@@ -3,9 +3,11 @@
<Project Path="src/App/App.csproj" />
</Folder>
<Folder Name="/src/Integrations/">
<Project Path="src/Integrations/FaceCamera/FaceCamera.csproj" />
<Project Path="src/Integrations/Vasttrafik/Vasttrafik.csproj" />
</Folder>
<Folder Name="/tests/Integrations/">
<Project Path="tests/Integrations/FaceCamera/FaceCamera.csproj" />
<Project Path="tests/Integrations/Vasttrafik/Vasttrafik.csproj" />
</Folder>
</Solution>
src/App/App.axaml.cs
+2
-1
diff --git a/src/App/App.axaml.cs b/src/App/App.axaml.cs
index ce09514..2b8b7e3 100644
@@ -6,6 +6,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MMirror.App.ViewModels;
using MMirror.App.Views;
using MMirror.Integrations.FaceCamera;
using MMirror.Integrations.Vasttrafik;
namespace MMirror.App;
@@ -25,7 +26,7 @@ public partial class App : Application
#if DEBUG
builder.Configuration.AddUserSecrets<App>();
#endif
builder.Services.AddViews().AddViewModels().AddVasttrafikServices();
builder.Services.AddViews().AddViewModels().AddVasttrafikServices().AddFaceCameraServices();
host = builder.Build();
src/App/App.csproj
+3
-0
diff --git a/src/App/App.csproj b/src/App/App.csproj
index 6eddacb..02f39b2 100644
@@ -11,6 +11,7 @@
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Integrations\Vasttrafik\Vasttrafik.csproj" />
<ProjectReference Include="..\Integrations\FaceCamera\FaceCamera.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Avalonia" />
@@ -26,6 +27,8 @@
<PrivateAssets Condition="'$(Configuration)' != 'Debug'">All</PrivateAssets>
</PackageReference>
<PackageReference Include="CommunityToolkit.Mvvm" />
<PackageReference Include="Emgu.CV.runtime.mini.debian-arm64" />
<PackageReference Include="Emgu.CV.runtime.windows" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
</ItemGroup>
</Project>
src/App/ViewModels/MainViewModel.cs
+22
-0
diff --git a/src/App/ViewModels/MainViewModel.cs b/src/App/ViewModels/MainViewModel.cs
index b1b9ad0..076b296 100644
@@ -1,22 +1,32 @@
using System;
using CommunityToolkit.Mvvm.ComponentModel;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using MMirror.App.ViewModels.Panels;
using MMirror.Integrations.FaceCamera;
namespace MMirror.App.ViewModels;
public partial class MainViewModel : ViewModelBase
{
private readonly FaceDetectionService faceDetectionService;
[ObservableProperty]
public partial bool FaceNear { get; set; }
public ViewModelBase Olskrokstorget { get; }
public ViewModelBase Svingeln { get; }
public ViewModelBase UpperRight { get; }
public MainViewModel(
FaceDetectionService faceDetectionService,
VasttrafikPanelViewModel olskrokstorget,
VasttrafikPanelViewModel svingeln,
DateTimePanelViewModel dateTimePanelViewModel
)
{
this.faceDetectionService = faceDetectionService;
olskrokstorget.StopName = "Olskrokstorget";
olskrokstorget.StopId = "9021014005160000";
Olskrokstorget = olskrokstorget;
@@ -28,6 +38,18 @@ public partial class MainViewModel : ViewModelBase
UpperRight = dateTimePanelViewModel;
}
public void Watch()
{
faceDetectionService.FaceDetected += OnFaceDetected;
}
private void OnFaceDetected(ReadOnlySpan<FaceDetection> faces) => FaceNear = faces.Length > 0;
public void UnWatch()
{
faceDetectionService.FaceDetected -= OnFaceDetected;
}
}
internal static class MainViewModelServiceCollectionExtensions
src/App/Views/MainView.axaml
+1
-1
diff --git a/src/App/Views/MainView.axaml b/src/App/Views/MainView.axaml
index b3f0181..876ec85 100644
@@ -10,7 +10,7 @@
<vm:MainViewModel />
</Design.DataContext>
<Grid RowDefinitions="*,*,*" ColumnDefinitions="*,*,*" Margin="64">
<Grid Classes.active="{Binding FaceNear}" RowDefinitions="*,*,*" ColumnDefinitions="*,*,*" Margin="64">
<StackPanel Classes="fade" Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" Grid.IsSharedSizeScope="True" Spacing="8">
<ContentControl Content="{Binding Olskrokstorget}" />
<ContentControl Content="{Binding Svingeln}" />
src/App/Views/MainView.axaml.cs
+22
-0
diff --git a/src/App/Views/MainView.axaml.cs b/src/App/Views/MainView.axaml.cs
index 44f20ae..c25ba41 100644
@@ -1,4 +1,6 @@
using Avalonia;
using Avalonia.Controls;
using MMirror.App.ViewModels;
namespace MMirror.App.Views;
@@ -8,4 +10,24 @@ public partial class MainView : UserControl
{
InitializeComponent();
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
if (DataContext is MainViewModel vm)
{
vm.Watch();
}
}
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
if (DataContext is MainViewModel vm)
{
vm.UnWatch();
}
base.OnDetachedFromVisualTree(e);
}
}
src/App/Views/MainWindow.axaml.cs
+0
-15
diff --git a/src/App/Views/MainWindow.axaml.cs b/src/App/Views/MainWindow.axaml.cs
index 19b9147..e964cb1 100644
@@ -1,5 +1,4 @@
using Avalonia.Controls;
using Avalonia.Input;
namespace MMirror.App.Views;
@@ -9,18 +8,4 @@ public partial class MainWindow : Window
{
InitializeComponent();
}
protected override void OnPointerEntered(PointerEventArgs e)
{
base.OnPointerEntered(e);
Classes.Add("active");
}
protected override void OnPointerExited(PointerEventArgs e)
{
Classes.Remove("active");
base.OnPointerExited(e);
}
}
src/App/packages.lock.json
+274
-8
diff --git a/src/App/packages.lock.json b/src/App/packages.lock.json
index 1e23847..7870687 100644
@@ -76,6 +76,27 @@
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Microsoft.Extensions.Hosting": {
"type": "Direct",
"requested": "[11.0.0-preview.4.26230.115, )",
@@ -185,6 +206,21 @@
"Avalonia.Skia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp": {
"type": "Transitive",
"resolved": "8.3.1.3",
@@ -397,14 +433,6 @@
"resolved": "10.0.8",
"contentHash": "aQBFbY8i/dacE0fP+ZJ8Lhx/unYRnGHhtM+tHb46GLkeNjBdOzgFk88sX6BVZBhoa6JrYIOBGYTc5K4WItBsag=="
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Resilience": {
"type": "Transitive",
"resolved": "10.6.0",
@@ -540,6 +568,13 @@
"resolved": "0.92.0",
"contentHash": "h7IMakm0PF2jxiagoysoAjrzzLQ0UBdnSXQL5kb17YW0Fvyo12Tg96A99QkzwktWRrd7H+Uw9EzjasNLUfGYlA=="
},
"MMirror.Integrations.FaceCamera": {
"type": "Project",
"dependencies": {
"Emgu.CV": "[4.13.0.5924, )",
"Microsoft.Extensions.Options.ConfigurationExtensions": "[11.0.0-preview.4.26230.115, )"
}
},
"MMirror.Integrations.Vasttrafik": {
"type": "Project",
"dependencies": {
@@ -549,6 +584,12 @@
"System.IdentityModel.Tokens.Jwt": "[8.19.1, )"
}
},
"Emgu.CV": {
"type": "CentralTransitive",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "st6Jux7EAlK2/LvG/aPaRLElFf54o0UrtCXU5ZEhGLRGeF8W/NW0j1x6MuRXur0DWJni++LsWInUDC6e4MtG5Q=="
},
"Microsoft.Extensions.Caching.Memory": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
@@ -582,6 +623,15 @@
"Microsoft.Extensions.Resilience": "10.6.0"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"System.IdentityModel.Tokens.Jwt": {
"type": "CentralTransitive",
"requested": "[8.19.1, )",
@@ -594,6 +644,27 @@
}
},
"net11.0/linux-arm64": {
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -607,6 +678,21 @@
"Avalonia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp.NativeAssets.Linux": {
"type": "Transitive",
"resolved": "8.3.1.3",
@@ -644,6 +730,27 @@
}
},
"net11.0/linux-x64": {
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -657,6 +764,21 @@
"Avalonia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp.NativeAssets.Linux": {
"type": "Transitive",
"resolved": "8.3.1.3",
@@ -694,6 +816,27 @@
}
},
"net11.0/osx-arm64": {
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -707,6 +850,21 @@
"Avalonia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp.NativeAssets.Linux": {
"type": "Transitive",
"resolved": "8.3.1.3",
@@ -744,6 +902,27 @@
}
},
"net11.0/osx-x64": {
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -757,6 +936,21 @@
"Avalonia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp.NativeAssets.Linux": {
"type": "Transitive",
"resolved": "8.3.1.3",
@@ -794,6 +988,27 @@
}
},
"net11.0/win-arm64": {
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -807,6 +1022,21 @@
"Avalonia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp.NativeAssets.Linux": {
"type": "Transitive",
"resolved": "8.3.1.3",
@@ -844,6 +1074,27 @@
}
},
"net11.0/win-x64": {
"Emgu.CV.runtime.mini.debian-arm64": {
"type": "Direct",
"requested": "[4.12.0.5764, )",
"resolved": "4.12.0.5764",
"contentHash": "bE7RsR4BMiu3vOIF1aex6+GgIA2taXUYN7Wqo/5l2QUr9sSGal6kxc2ypLVFJxy0YxJXxWRbFtJtuk02e1wCeQ==",
"dependencies": {
"Emgu.CV": "4.12.0.5764"
}
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Avalonia.Angle.Windows.Natives": {
"type": "Transitive",
"resolved": "2.1.27548.20260419",
@@ -857,6 +1108,21 @@
"Avalonia": "12.0.4"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"HarfBuzzSharp.NativeAssets.Linux": {
"type": "Transitive",
"resolved": "8.3.1.3",
src/Integrations/FaceCamera/CameraOptions.cs
+17
-0
diff --git a/src/Integrations/FaceCamera/CameraOptions.cs b/src/Integrations/FaceCamera/CameraOptions.cs
new file mode 100644
index 0000000..277e7b3
@@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using Microsoft.Extensions.Options;
namespace MMirror.Integrations.FaceCamera;
public sealed class CameraOptions
{
public int Index { get; set; } = 0;
[Required]
public required string Model { get; set; }
public string Config { get; set; } = "";
}
[OptionsValidator]
internal sealed partial class CameraOptionsValidator : IValidateOptions<CameraOptions>;
src/Integrations/FaceCamera/FaceCamera.csproj
+10
-0
diff --git a/src/Integrations/FaceCamera/FaceCamera.csproj b/src/Integrations/FaceCamera/FaceCamera.csproj
new file mode 100644
index 0000000..7202818
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>MMirror.Integrations.FaceCamera</RootNamespace>
<AssemblyName>MMirror.Integrations.FaceCamera</AssemblyName>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Emgu.CV" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" />
</ItemGroup>
</Project>
src/Integrations/FaceCamera/FaceDetection.cs
+21
-0
diff --git a/src/Integrations/FaceCamera/FaceDetection.cs b/src/Integrations/FaceCamera/FaceDetection.cs
new file mode 100644
index 0000000..e99c953
@@ -0,0 +1,21 @@
using System.Runtime.InteropServices;
namespace MMirror.Integrations.FaceCamera;
[StructLayout(LayoutKind.Sequential)]
public readonly record struct FaceDetection(
float X,
float Y,
float Width,
float Height,
float LeftEyeX,
float LeftEyeY,
float RightEyeX,
float RightEyeY,
float NoseX,
float NoseY,
float LeftMouthCornerX,
float LeftMouthCornerY,
float RightMouthCornerX,
float RightMouthCornerY
);
src/Integrations/FaceCamera/FaceDetectionService.cs
+78
-0
diff --git a/src/Integrations/FaceCamera/FaceDetectionService.cs b/src/Integrations/FaceCamera/FaceDetectionService.cs
new file mode 100644
index 0000000..1dd7534
@@ -0,0 +1,78 @@
using System;
using System.Threading;
using Emgu.CV;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace MMirror.Integrations.FaceCamera;
public sealed class FaceDetectionService : IDisposable
{
private readonly ILogger<FaceDetectionService> logger;
private readonly VideoCapture videoCapture;
private readonly FaceDetectorYN faceDetector;
private readonly Lock watchLock = new();
private Action<ReadOnlySpan<FaceDetection>>? faceDetected;
public event Action<ReadOnlySpan<FaceDetection>> FaceDetected
{
add
{
using var scope = watchLock.EnterScope();
if (faceDetected is null)
{
videoCapture.Start();
}
faceDetected += value;
}
remove
{
using var scope = watchLock.EnterScope();
faceDetected -= value;
if (faceDetected is null)
{
videoCapture.Stop();
}
}
}
public FaceDetectionService(ILogger<FaceDetectionService> logger, IOptions<CameraOptions> options)
{
this.logger = logger;
videoCapture = new(options.Value.Index);
videoCapture.ImageGrabbed += OnImageGrabbed;
faceDetector = new FaceDetectorYN(
model: options.Value.Model,
config: options.Value.Config,
inputSize: new(videoCapture.Width, videoCapture.Height)
);
}
private void OnImageGrabbed(object? sender, EventArgs e)
{
using var frame = new Mat();
if (!videoCapture.Retrieve(frame))
{
logger.LogError("Could not retrieve frame on frame event.");
return;
}
using var detections = new Mat();
if (faceDetector.Detect(frame, detections) is not 1)
{
logger.LogError("Facial detection failed.");
return;
}
var faces = detections.GetSpan<FaceDetection>();
faceDetected?.Invoke(faces);
}
public void Dispose()
{
videoCapture.Dispose();
faceDetector.Dispose();
}
}
src/Integrations/FaceCamera/ServiceCollectionExtensions.cs
+20
-0
diff --git a/src/Integrations/FaceCamera/ServiceCollectionExtensions.cs b/src/Integrations/FaceCamera/ServiceCollectionExtensions.cs
new file mode 100644
index 0000000..fc27fad
@@ -0,0 +1,20 @@
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace MMirror.Integrations.FaceCamera;
public static class ServiceCollectionExtensions
{
extension(IServiceCollection services)
{
public IServiceCollection AddFaceCameraServices()
{
services.AddOptions<CameraOptions>().BindConfiguration("Camera").ValidateOnStart();
services.AddTransient<IValidateOptions<CameraOptions>, CameraOptionsValidator>();
services.AddSingleton<FaceDetectionService>();
return services;
}
}
}
src/Integrations/FaceCamera/packages.lock.json
+47
-0
diff --git a/src/Integrations/FaceCamera/packages.lock.json b/src/Integrations/FaceCamera/packages.lock.json
new file mode 100644
index 0000000..44af7f7
@@ -0,0 +1,47 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Emgu.CV": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "st6Jux7EAlK2/LvG/aPaRLElFf54o0UrtCXU5ZEhGLRGeF8W/NW0j1x6MuRXur0DWJni++LsWInUDC6e4MtG5Q=="
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Direct",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "CPb3DPC6kcgx+kuSTJ55H/A6Z+IZeW++VM+UiFpiwq6eQC2Mk3gHcFpqdQoK2MjWovWYN4Sz6n1RXhLWHVB35w=="
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "IOkgB4CnLUlKH+l0slH5Q+6m9pWfcCBocFPHc7czATwIx5jnVPgUMRj2gGhZtvGs1PKpeoZv7PCGK5cYIwlZzw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
}
},
"net11.0/linux-arm64": {},
"net11.0/linux-x64": {},
"net11.0/osx-arm64": {},
"net11.0/osx-x64": {},
"net11.0/win-arm64": {},
"net11.0/win-x64": {}
}
}
\ No newline at end of file
src/Integrations/Vasttrafik/packages.lock.json
+9
-8
diff --git a/src/Integrations/Vasttrafik/packages.lock.json b/src/Integrations/Vasttrafik/packages.lock.json
index 237af56..dc78293 100644
@@ -132,14 +132,6 @@
"resolved": "10.0.8",
"contentHash": "aQBFbY8i/dacE0fP+ZJ8Lhx/unYRnGHhtM+tHb46GLkeNjBdOzgFk88sX6BVZBhoa6JrYIOBGYTc5K4WItBsag=="
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Resilience": {
"type": "Transitive",
"resolved": "10.6.0",
@@ -236,6 +228,15 @@
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "v+F34r5W5XgR95xG0Te2KyYmCDnkc4kljLMGEZ30WKQjAzuXz/pLTEvsRNYxNJUzfKPI0H4oqLglyHZkCe1lYw=="
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
}
},
"net11.0/linux-arm64": {},
tests/Integrations/FaceCamera/FaceCamera.csproj
+20
-0
diff --git a/tests/Integrations/FaceCamera/FaceCamera.csproj b/tests/Integrations/FaceCamera/FaceCamera.csproj
new file mode 100644
index 0000000..28e7f93
@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<RootNamespace>MMirror.Integrations.FaceCamera.Tests</RootNamespace>
<AssemblyName>MMirror.Integrations.FaceCamera.Tests</AssemblyName>
<UserSecretsId>38c4e93b-9698-4cef-96b9-c7c8cb627d18</UserSecretsId>
<EnableMSTestRunner>true</EnableMSTestRunner>
<OutputType>Exe</OutputType>
<TestingPlatformDotnetTestSupport>true</TestingPlatformDotnetTestSupport>
<TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\src\Integrations\FaceCamera\FaceCamera.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Emgu.CV.runtime.windows" />
<PackageReference Include="Microsoft.Extensions.Hosting" />
<PackageReference Include="MSTest" />
<PackageReference Include="Shouldly" />
</ItemGroup>
</Project>
tests/Integrations/FaceCamera/FaceDetectionServiceTests/IntegrationTests.cs
+33
-0
diff --git a/tests/Integrations/FaceCamera/FaceDetectionServiceTests/IntegrationTests.cs b/tests/Integrations/FaceCamera/FaceDetectionServiceTests/IntegrationTests.cs
new file mode 100644
index 0000000..2b960aa
@@ -0,0 +1,33 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Shouldly;
namespace MMirror.Integrations.FaceCamera.Tests.FaceDetectionServiceTests;
[TestClass]
public sealed class IntegrationTests
{
[TestMethod]
public async Task IntegrationTest()
{
var host = Host.CreateApplicationBuilder();
host.Configuration.AddUserSecrets<IntegrationTests>();
host.Services.AddFaceCameraServices();
var app = host.Build();
var faceDetectionService = app.Services.GetRequiredService<FaceDetectionService>();
var tcs = new TaskCompletionSource<FaceDetection[]>();
faceDetectionService.FaceDetected += OnFaceDetected;
var faces = await tcs.Task;
faces.Length.ShouldBeGreaterThan(0);
void OnFaceDetected(ReadOnlySpan<FaceDetection> faces)
{
faceDetectionService.FaceDetected -= OnFaceDetected;
tcs.SetResult(faces.ToArray());
}
}
}
tests/Integrations/FaceCamera/MSTestSettings.cs
+3
-0
diff --git a/tests/Integrations/FaceCamera/MSTestSettings.cs b/tests/Integrations/FaceCamera/MSTestSettings.cs
new file mode 100644
index 0000000..285afd4
@@ -0,0 +1,3 @@
using Microsoft.VisualStudio.TestTools.UnitTesting;
[assembly: Parallelize(Scope = ExecutionScope.ClassLevel)]
tests/Integrations/FaceCamera/README.md
+11
-0
diff --git a/tests/Integrations/FaceCamera/README.md b/tests/Integrations/FaceCamera/README.md
new file mode 100644
index 0000000..91bc0d9
@@ -0,0 +1,11 @@
# Face detection tests
These are integration tests for the face detection service.
## Setup
If no setup is performed the "default" camera will be used. To specify which camera to use, set the `Camera.Index` value as a User Secret before running the tests.
You also need to download the facial detection model [face_detection_yunet_2026may.onnx](https://github.com/opencv/opencv_zoo/blob/47534e27c9851bb1128ccc0102f1145e27f23f98/models/face_detection_yunet/face_detection_yunet_2026may.onnx) and reference to it from `Camera.Model` in the User Secrets.
You have to sit in front of the camera with your face visible.
tests/Integrations/FaceCamera/packages.lock.json
+722
-0
diff --git a/tests/Integrations/FaceCamera/packages.lock.json b/tests/Integrations/FaceCamera/packages.lock.json
new file mode 100644
index 0000000..d4e12aa
@@ -0,0 +1,722 @@
{
"version": 2,
"dependencies": {
"net11.0": {
"CSharpier.MsBuild": {
"type": "Direct",
"requested": "[1.2.6, )",
"resolved": "1.2.6",
"contentHash": "KMSJG+jfk7vjP52QkWB99qWespXCPAzG/IaMCMRHYWumJEAGKQYm2HtyWG6eqnOwDitH96i1cqq5EVesyOtPmg=="
},
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Microsoft.Extensions.Hosting": {
"type": "Direct",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "JabRZnPjt57VHxcOm7G7runakIkv3PunM2GTJF32KF5hJChgpUh2gnuL4VQ0GsVtHXGsbefj9tddYs2K0YJmpA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.CommandLine": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.EnvironmentVariables": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.FileExtensions": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.Json": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.UserSecrets": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Diagnostics": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Console": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Debug": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.EventLog": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.EventSource": "11.0.0-preview.4.26230.115"
}
},
"MSTest": {
"type": "Direct",
"requested": "[4.2.3, )",
"resolved": "4.2.3",
"contentHash": "fUaw2rGyhaSMRuAibJo+1PQkI4PHS1FZx/tASq1Lr3eZk5NlshQRyBBdUkhnvfvOG+tCKKy3T/BnMiI47qeZrw==",
"dependencies": {
"MSTest.TestAdapter": "4.2.3",
"MSTest.TestFramework": "4.2.3",
"Microsoft.NET.Test.Sdk": "18.3.0",
"Microsoft.Testing.Extensions.CodeCoverage": "18.5.2",
"Microsoft.Testing.Extensions.TrxReport": "2.2.3"
}
},
"Shouldly": {
"type": "Direct",
"requested": "[4.3.0, )",
"resolved": "4.3.0",
"contentHash": "sDetrWXrl6YXZ4HeLsdBoNk3uIa7K+V4uvIJ+cqdRa5DrFxeTED7VkjoxCuU1kJWpUuBDZz2QXFzSxBtVXLwRQ==",
"dependencies": {
"DiffEngine": "11.3.0",
"EmptyFiles": "4.4.0"
}
},
"DiffEngine": {
"type": "Transitive",
"resolved": "11.3.0",
"contentHash": "k0ZgZqd09jLZQjR8FyQbSQE86Q7QZnjEzq1LPHtj1R2AoWO8sjV5x+jlSisL7NZAbUOI4y+7Bog8gkr9WIRBGw==",
"dependencies": {
"EmptyFiles": "4.4.0",
"System.Management": "6.0.1"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"EmptyFiles": {
"type": "Transitive",
"resolved": "4.4.0",
"contentHash": "gwJEfIGS7FhykvtZoscwXj/XwW+mJY6UbAZk+qtLKFUGWC95kfKXnj8VkxsZQnWBxJemM/q664rGLN5nf+OHZw=="
},
"Microsoft.ApplicationInsights": {
"type": "Transitive",
"resolved": "2.23.0",
"contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw=="
},
"Microsoft.CodeCoverage": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "23BNy/vziREC20Wwhb50K7+kZe0m07KlLWDQv4qjJ9tt3QjpDpDIqJFrhYHmMEo9xDkuSp55U/8h4bMF7MiB+g=="
},
"Microsoft.DiaSymReader": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "bhwzJfzyiJM0nXJyNB7Y9OfsEXyxLdDBHG99soIp5JjnPydwkOaBdRCtRtWgQh3noSLi2cSIZ/wpbHNNE9knxQ=="
},
"Microsoft.Extensions.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "CPb3DPC6kcgx+kuSTJ55H/A6Z+IZeW++VM+UiFpiwq6eQC2Mk3gHcFpqdQoK2MjWovWYN4Sz6n1RXhLWHVB35w=="
},
"Microsoft.Extensions.Configuration.Binder": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "IOkgB4CnLUlKH+l0slH5Q+6m9pWfcCBocFPHc7czATwIx5jnVPgUMRj2gGhZtvGs1PKpeoZv7PCGK5cYIwlZzw==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.CommandLine": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "AWgDyrMol+ywzG0MAAk+TkLIy4fMEsOCG1E/zb1kHE3Lp81GNNEMU+jOJTF1gEsLkDajY5AouNAWx3cvi+pxzg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.EnvironmentVariables": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "7vBrAODuFr5u548MNTaUybxQ+Hw/x9boZ2rWQynOS/KJkZhrriUFtgbQTeRamQFVna1eh78WjVAqEKm8GpQXBg==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.FileExtensions": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "//7zz5cgmkd/cfgKanPna9CHJ4o9Wp9JPpr+3rmSa7vd/+Wwxjb9Z9sUKvH0LsJl72LnUYWKJ7Ah02nr2yLsYA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.Json": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "cXhGyFCd2LnPAMu5pVxf3CeIqYJ+wy866tNKjaAvLFQsJ1QDB4Xfmiy+6q0Zm8DvjektmB/IoDBl5F/0AKEBOA==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.FileExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Configuration.UserSecrets": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "GnJpXFEumu46mGMU++s54qgRwlkGhCP05xHOSgaAK/lLTUOt2mAMaIwFqrLFKfUFtkByjxSe/1FtzXx2zrIv9w==",
"dependencies": {
"Microsoft.Extensions.Configuration.Json": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.FileProviders.Physical": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.DependencyModel": {
"type": "Transitive",
"resolved": "8.0.2",
"contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
},
"Microsoft.Extensions.Diagnostics": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "L1+sxK5JT7X5jvZ0RInbDnyJZG9rkp4cbgzoL0aGRUOOMp3PkgCcUjAUhAprxBu9LgGdeqZg7JratDMHS1YN/Q==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.FileProviders.Physical": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "L/+w2lo0fV2hcQuAe3YIBwXl4YP16c/xFUCHXjhzidByFbyECb2H8hJ5EEeszihGcT69nd+gJqrZyzyp1bObig==",
"dependencies": {
"Microsoft.Extensions.FileSystemGlobbing": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.FileSystemGlobbing": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "y8hEW4rVMESwL9iMfc0PICy0ScXzj4MMXclEjf5AXZKOFrJe6nu8iU7K9VVZenNweXdLYvlcs2ZSnhVz7h8oYg=="
},
"Microsoft.Extensions.Logging": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "EpZS5qqhsNXwgeSCl2m1VkysA+pTh3qlhyjkjiu0peZt/V7IyANJXQQUuv3y2kp/jzd9XdfzuUJU0Fgp7rcDGg==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Configuration": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "YkVeVCrOfKdYghClaYH/jcC2Irx6gtrWPAOjNkOeITQVQ41vvhPVp7EcXYD8IcfYH58YIS5WiX1ZJu6uLEVrAQ==",
"dependencies": {
"Microsoft.Extensions.Configuration": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Options.ConfigurationExtensions": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Console": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "1ATxqXTZnR5M4tOeCtZjA+fw1b+jWPsmUAp3PUCCvndV5ghIcSvnwZ5RiQFoTtYFSdNP+pMoxCtviI71/xyRCw==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.Debug": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "kD1p/UZ/NqHTLt1iLjtkJpPtPWWziLkV6kG3TxLi67gWasixyvH1grMfkd14XR24RIooTkavxGZJV+xjeSSsiA==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "DOtIsmOENF8xmQi0uw0sx4/1aDHDgj1PuGmlom2zobrqbJp2b5fkZPCIOTmPZsXbk78nxVnPH7/NTbR1cYRnsA==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115",
"Microsoft.Extensions.Logging.Configuration": "11.0.0-preview.4.26230.115",
"System.Diagnostics.EventLog": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Logging.EventSource": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "koDYnhbSTo+di3NMq13c0jhYFTIc7XUgnevONLwDpzR2GbbXfUR+dN5GuMeAVR4EQljUw5OYllrYflPNb0zoZA==",
"dependencies": {
"Microsoft.Extensions.Logging": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.NET.Test.Sdk": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "xW3kXuWRQtgoxJp4J+gdhHSQyK+6Wb/AZDSd7lMvuMRYlZ1tnpkojyfZlWilB5G4dmZ0Y0ZxU/M23TlubndNkw==",
"dependencies": {
"Microsoft.CodeCoverage": "18.3.0",
"Microsoft.TestPlatform.TestHost": "18.3.0"
}
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"Microsoft.Testing.Extensions.Telemetry": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "mLdW+JOR3kXYGTdgR/qc/UZBA0r+eCR2k6bUxTcuDj5w9WdIQ7Lol5MBUU7YOSGd9bs9bvhSYWAptgz0YtQqCA==",
"dependencies": {
"Microsoft.ApplicationInsights": "2.23.0",
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Extensions.TrxReport": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "9Hot3ty5ZVWHrW40k2NPfD0dCaPwIxj7j7VjujNYwpYkYw9AdbejPHjGNkL/gvUWorauJf5IkeDoUeIbS7LuUg==",
"dependencies": {
"Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3",
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Extensions.TrxReport.Abstractions": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "hntvxJEkmUAx6C2xXc/PO38DqEQl4rimzOgSvTR1hAMruMid7R4RcXOrzzF33J66gKaN7jRaQ0TMW/nNfaV9jw==",
"dependencies": {
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Extensions.VSTestBridge": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "7WlJISO8QKUK+d+WhgnANwy4ACwUrvICnviY/mthPwjZ2gVeDaSUAeBnMy2cxfzZgm8VATtGUDbYzUxsgV2CyQ==",
"dependencies": {
"Microsoft.TestPlatform.ObjectModel": "18.3.0",
"Microsoft.Testing.Extensions.Telemetry": "2.2.3",
"Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.2.3",
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.Testing.Platform": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "LhM1/Qoi8Ams5QcD4r3f09CSOono9iQr3NEJQItFtyzWB55nWTgEOsVqXqMWWWIwk3nkPqc+XfnlJmp8xUI5fg=="
},
"Microsoft.Testing.Platform.MSBuild": {
"type": "Transitive",
"resolved": "2.2.3",
"contentHash": "Q22jJYJLx4srTinsAuoCskqmzjrBJC8YeGJMHHIcrf1dQeHoEZ7wsqDzTlENkMoke2qfufF7U+9u58nlZunH/Q==",
"dependencies": {
"Microsoft.Testing.Platform": "2.2.3"
}
},
"Microsoft.TestPlatform.ObjectModel": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "AEIEX2aWdPO9XbtR96eBaJxmXRD9vaI9uQ1T/JbPEKlTAZwYx0ZrMzKyULMdh/HH9Sg03kXCoN7LszQ90o6nPQ=="
},
"Microsoft.TestPlatform.TestHost": {
"type": "Transitive",
"resolved": "18.3.0",
"contentHash": "twmsoelXnp1uWMU3VGip9f0Jr1mZ0PZqgJdF35CIrdYgYrkHIJMV1m8uKyhcdjLdsQDESHAgkR7KhS9i1qpJag==",
"dependencies": {
"Microsoft.TestPlatform.ObjectModel": "18.3.0",
"Newtonsoft.Json": "13.0.3"
}
},
"MSTest.Analyzers": {
"type": "Transitive",
"resolved": "4.2.3",
"contentHash": "dxOZt8/LWuiox7rugInJoIa5Mmu3pBmXdfaoZOx/mxx8+sUFFpjBXPlWXQXGeWzpkVPNC3x1Jf7rt2h2Zjyvvg=="
},
"MSTest.TestAdapter": {
"type": "Transitive",
"resolved": "4.2.3",
"contentHash": "oVV/luk0bBghnVvLaw8MwFlD7It0Cx9P2nKobeqIafmTQqFFWY69Wo801dxjeNaLzO/o9WQ84WSK84gXJuubhg==",
"dependencies": {
"MSTest.TestFramework": "4.2.3",
"Microsoft.Testing.Extensions.VSTestBridge": "2.2.3",
"Microsoft.Testing.Platform.MSBuild": "2.2.3"
}
},
"MSTest.TestFramework": {
"type": "Transitive",
"resolved": "4.2.3",
"contentHash": "9zzij59YLh+tf+FRLNqhzHjmdspR91bol+jdQxLlxxTGMAML6LDbvuyXKMGdcrE84+QpKkk6KjTVBC5PBGrDeA==",
"dependencies": {
"MSTest.Analyzers": "4.2.3"
}
},
"Newtonsoft.Json": {
"type": "Transitive",
"resolved": "13.0.3",
"contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
},
"System.CodeDom": {
"type": "Transitive",
"resolved": "6.0.0",
"contentHash": "CPc6tWO1LAer3IzfZufDBRL+UZQcj5uS207NHALQzP84Vp/z6wF0Aa0YZImOQY8iStY0A2zI/e3ihKNPfUm8XA=="
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
},
"MMirror.Integrations.FaceCamera": {
"type": "Project",
"dependencies": {
"Emgu.CV": "[4.13.0.5924, )",
"Microsoft.Extensions.Options.ConfigurationExtensions": "[11.0.0-preview.4.26230.115, )"
}
},
"Emgu.CV": {
"type": "CentralTransitive",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "st6Jux7EAlK2/LvG/aPaRLElFf54o0UrtCXU5ZEhGLRGeF8W/NW0j1x6MuRXur0DWJni++LsWInUDC6e4MtG5Q=="
},
"Microsoft.Extensions.DependencyInjection": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "v+F34r5W5XgR95xG0Te2KyYmCDnkc4kljLMGEZ30WKQjAzuXz/pLTEvsRNYxNJUzfKPI0H4oqLglyHZkCe1lYw=="
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
}
},
"net11.0/linux-arm64": {
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/linux-x64": {
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/osx-arm64": {
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/osx-x64": {
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/win-arm64": {
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
},
"net11.0/win-x64": {
"Emgu.CV.runtime.windows": {
"type": "Direct",
"requested": "[4.13.0.5924, )",
"resolved": "4.13.0.5924",
"contentHash": "J072mACLTy3R1Y5kqit4IM3LqMoz1g0szIr/MT+qJVOA3RTvwnfyCTTZ6tQnvZLfbvk58PoxZmaU1J6MraeKoQ==",
"dependencies": {
"Emgu.CV": "4.13.0",
"Emgu.runtime.windows.msvc.rt.arm64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x64": "19.44.35224",
"Emgu.runtime.windows.msvc.rt.x86": "19.44.35224"
}
},
"Emgu.runtime.windows.msvc.rt.arm64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "+805ha7RSJDZ437VekFsju55p4onRbT7as9nT6KHQdR72AQQ8rj3uFzMYu36zDB8hyq2xBWEXCTk4KJuO+rBug=="
},
"Emgu.runtime.windows.msvc.rt.x64": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "IMJsBnqobR4UM21vLNayY+8GlVRpgQHlRC1q6/iI1wbyejrEfWeWUyNVILj/tgmo8r0CgzOAJgR0jZcZGsPuNw=="
},
"Emgu.runtime.windows.msvc.rt.x86": {
"type": "Transitive",
"resolved": "19.44.35224",
"contentHash": "h8WzBTKDC3k34LOO4wkeHhq3ltpE3sbpk/2lOoKvTLKROJ/EcNqsYuGSwum8aYCeoMabucMqlbC/mV49uPng5Q=="
},
"Microsoft.Testing.Extensions.CodeCoverage": {
"type": "Transitive",
"resolved": "18.5.2",
"contentHash": "UNcGLx9pVtlXF8MPDR8KDp+/OKKNIJjpzwRyZSt609TSGvaD8mtuQMb5GKZvhMucPp0a5Juvn3kxXDceQZWmAg==",
"dependencies": {
"Microsoft.DiaSymReader": "2.2.3",
"Microsoft.Extensions.DependencyModel": "8.0.2",
"Microsoft.Testing.Platform": "2.1.0"
}
},
"System.Diagnostics.EventLog": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "/o76q92uK1eaosCQrIjp/V4OBHs9zIXxH+8ZEMFZg1GVH7fI24GUPx1BLawLCmdq/U1AdGeoto716k4BJEhi2g=="
},
"System.Management": {
"type": "Transitive",
"resolved": "6.0.1",
"contentHash": "10J1D0h/lioojphfJ4Fuh5ZUThT/xOVHdV9roGBittKKNP2PMjrvibEdbVTGZcPra1399Ja3tqIJLyQrc5Wmhg==",
"dependencies": {
"System.CodeDom": "6.0.0"
}
}
}
}
}
\ No newline at end of file
tests/Integrations/Vasttrafik/packages.lock.json
+9
-8
diff --git a/tests/Integrations/Vasttrafik/packages.lock.json b/tests/Integrations/Vasttrafik/packages.lock.json
index b557c66..f75d094 100644
@@ -267,14 +267,6 @@
"resolved": "10.0.8",
"contentHash": "aQBFbY8i/dacE0fP+ZJ8Lhx/unYRnGHhtM+tHb46GLkeNjBdOzgFk88sX6BVZBhoa6JrYIOBGYTc5K4WItBsag=="
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "Transitive",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"Microsoft.Extensions.Resilience": {
"type": "Transitive",
"resolved": "10.6.0",
@@ -537,6 +529,15 @@
"Microsoft.Extensions.Resilience": "10.6.0"
}
},
"Microsoft.Extensions.Options.ConfigurationExtensions": {
"type": "CentralTransitive",
"requested": "[11.0.0-preview.4.26230.115, )",
"resolved": "11.0.0-preview.4.26230.115",
"contentHash": "9QNxho6sxC4RXafVZGWzYq6KcYVpp1FkHtL+HJ967UNyUjhOWnGKMM0dPXkHKtlZ/0GGEDqnBDun0kuF633a6g==",
"dependencies": {
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.4.26230.115"
}
},
"System.IdentityModel.Tokens.Jwt": {
"type": "CentralTransitive",
"requested": "[8.19.1, )",