From bf5ec9ac89c5279316322d25cf28c0aae2319ece Mon Sep 17 00:00:00 2001 From: Mitchell Rysavy Date: Sat, 9 Aug 2025 23:02:47 -0400 Subject: [PATCH 1/3] Make configuration changes to work with Apache 2.4, MySQL 5.7 and PHP 7 --- Assets/Templates/httpd.conf.liquid | 30 +++++++++++++----------------- Assets/Templates/my.ini.liquid | 10 +++++----- Assets/Templates/php.ini.liquid | 14 ++++++++------ 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Assets/Templates/httpd.conf.liquid b/Assets/Templates/httpd.conf.liquid index f6ce50a..4d5c2e1 100644 --- a/Assets/Templates/httpd.conf.liquid +++ b/Assets/Templates/httpd.conf.liquid @@ -26,9 +26,9 @@ # # ThreadsPerChild: constant number of worker threads in the server process -# MaxRequestsPerChild: maximum number of requests a server process serves +# MaxConnectionsPerChild: maximum number of requests a server process serves ThreadsPerChild 250 -MaxRequestsPerChild 0 +MaxConnectionsPerChild 0 # # ServerRoot: The top of the directory tree under which the server's @@ -89,11 +89,13 @@ LoadModule asis_module modules/mod_asis.so LoadModule auth_basic_module modules/mod_auth_basic.so #LoadModule auth_digest_module modules/mod_auth_digest.so #LoadModule authn_anon_module modules/mod_authn_anon.so +LoadModule authn_core_module modules/mod_authn_core.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so -LoadModule authn_default_module modules/mod_authn_default.so +#LoadModule authn_default_module modules/mod_authn_default.so LoadModule authn_file_module modules/mod_authn_file.so +LoadModule authz_core_module modules/mod_authz_core.so #LoadModule authz_dbm_module modules/mod_authz_dbm.so -LoadModule authz_default_module modules/mod_authz_default.so +#LoadModule authz_default_module modules/mod_authz_default.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_user_module modules/mod_authz_user.so @@ -131,7 +133,7 @@ LoadModule userdir_module modules/mod_userdir.so #LoadModule usertrack_module modules/mod_usertrack.so #LoadModule vhost_alias_module modules/mod_vhost_alias.so #LoadModule ssl_module modules/mod_ssl.so -LoadModule php5_module "{{ server_dir }}/php/php5apache2_2.dll" +LoadModule php7_module "{{ server_dir }}/php/php7apache2_4.dll" # 'Main' server configuration # @@ -180,9 +182,7 @@ DocumentRoot "{{ apache_docroot }}" Options FollowSymLinks AllowOverride All - Order deny,allow - Deny from all - Satisfy all + Require all denied # @@ -223,8 +223,7 @@ DocumentRoot "{{ apache_docroot }}" # # Controls who can get stuff from this server. # - Order allow,deny - Allow from all + Require all granted @@ -241,8 +240,7 @@ DocumentRoot "{{ apache_docroot }}" # viewed by Web clients. # - Order allow,deny - Deny from all + Require all denied # @@ -331,15 +329,13 @@ LogLevel warn Options Includes ExecCGI AddHandler server-parsed .shtml AddHandler cgi-script .cgi .pl - Order allow,deny - Allow from all + Require all granted Options Indexes MultiViews AllowOverride All - Order allow,deny - Allow from all + Require all granted # @@ -389,7 +385,7 @@ LogLevel warn # keep browsers from trying to display binary files as though they are # text. # -DefaultType text/plain +# DefaultType text/plain # diff --git a/Assets/Templates/my.ini.liquid b/Assets/Templates/my.ini.liquid index 5c3d738..c1d848f 100644 --- a/Assets/Templates/my.ini.liquid +++ b/Assets/Templates/my.ini.liquid @@ -2,8 +2,8 @@ basedir="{{ server_dir }}\\MySQL" bind-address={{ mysql_ip }} datadir="{{ mysql_datadir }}" -default-character-set=latin1 -default-collation=latin1_general_ci +#default-character-set=latin1 +#default-collation=latin1_general_ci log-error="{{ tmp_dir }}\\log.err" pid-file="{{ tmp_dir }}\\mysql.pid" #slow query log#= @@ -15,10 +15,10 @@ port={{ mysql_port }} innodb_data_home_dir = "{{ mysql_datadir }}" innodb_data_file_path = ibdata1:10M:autoextend innodb_log_group_home_dir = "{{ mysql_datadir }}" -innodb_log_arch_dir = "{{ mysql_datadir }}" +#innodb_log_arch_dir = "{{ mysql_datadir }}" innodb_buffer_pool_size = 256M -innodb_additional_mem_pool_size = 20M -innodb_log_file_size = 64M +#innodb_additional_mem_pool_size = 20M +#innodb_log_file_size = 64M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 diff --git a/Assets/Templates/php.ini.liquid b/Assets/Templates/php.ini.liquid index e143b85..c9d267f 100644 --- a/Assets/Templates/php.ini.liquid +++ b/Assets/Templates/php.ini.liquid @@ -127,7 +127,8 @@ implicit_flush = Off ; with future versions of the language (you will receive a warning each time ; you use this feature, and the argument will be passed by value instead of by ; reference). -allow_call_time_pass_reference = On +;; TODO: Make sure functions work, I guess... +; allow_call_time_pass_reference = On ; Safe Mode ; @@ -307,7 +308,7 @@ variables_order = "EGPCS" ; You should do your best to write your scripts so that they do not require ; register_globals to be on; Using form variables as globals can easily lead ; to possible security problems, if the code is not very well thought of. -register_globals = On +; register_globals = On ; This directive tells PHP whether to declare the argv&argc variables (that ; would contain the GET information). If you don't use these variables, you @@ -324,7 +325,7 @@ gpc_order = "GPC" ; ; Magic quotes for incoming GET/POST/Cookie data. -magic_quotes_gpc = On +; magic_quotes_gpc = On ; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. magic_quotes_runtime = Off @@ -473,7 +474,7 @@ extension=php_mbstring.dll ;extension=php_oci8.dll extension=php_openssl.dll ;extension=php_oracle.dll -extension=php_pdflib.dll +;extension=php_pdflib.dll ;extension=php_pgsql.dll ;extension=php_printer.dll ;extension=php_shmop.dll @@ -488,11 +489,12 @@ extension=php_pdflib.dll ;extension=php_pdo.dll ;extension=php_sqlite.dll ;extension=php_mysql_libmysql.dll -extension=php_mysqli_libmysql.dll +;extension=php_mysqli_libmysql.dll +extension=php_mysqli.dll ;extension=php_pdo_sqlite.dll ;extension=php_pdo_pgsql.dll ;extension=php_pdo_mysql.dll -extension=ixed.5.3ts.win +;extension=ixed.5.3ts.win ;;;;;;;;;;;;;;;;;;; From 2cd28fe4d47909345ab2923fcb7e0872c8c2fe6c Mon Sep 17 00:00:00 2001 From: Mitchell Rysavy Date: Sun, 10 Aug 2025 09:43:10 -0400 Subject: [PATCH 2/3] Implement database upgrade process and various fixes for running servers --- App.axaml.cs | 1 + Server/MysqlAdmin.cs | 4 +- Server/MysqlServer.cs | 55 +- Server/MysqlUpgrade.cs | 28 + Server/Process.cs | 7 +- ServiceCollectionExtensions.cs | 1 + ViewModels/MainWindowViewModel.cs | 12 +- ViewModels/ServerControlViewModel.cs | 9 +- Views/MainWindow.axaml.cs | 11 + packages.lock.json | 740 +++++++++++++-------------- 10 files changed, 488 insertions(+), 380 deletions(-) create mode 100644 Server/MysqlUpgrade.cs diff --git a/App.axaml.cs b/App.axaml.cs index 8168fa9..5d3ea4d 100644 --- a/App.axaml.cs +++ b/App.axaml.cs @@ -33,6 +33,7 @@ public override void OnFrameworkInitializationCompleted() var services = collection.BuildServiceProvider(); var vm = services.GetRequiredService(); + var serverControl = services.GetRequiredService(); if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) { diff --git a/Server/MysqlAdmin.cs b/Server/MysqlAdmin.cs index 2875479..7269caa 100644 --- a/Server/MysqlAdmin.cs +++ b/Server/MysqlAdmin.cs @@ -7,10 +7,10 @@ namespace BLIS_NG.Server; /// Process wrapper class for running mysqladmin.exe. /// Does not run like other processes since it will not continually operate. /// -public class MySqlAdmin(ILogger logger) : BaseProcess(nameof(MySqlAdmin), logger) +public class MySqlAdmin(ILogger logger) : BaseProcess(nameof(MySqlAdmin), logger, singleton: false) { private static readonly string MysqlAdminPath = Path.Combine( - ConfigurationFile.SERVER_BASE_DIR, "mysql", "bin", "mysqladmin.exe" + ConfigurationFile.SERVER_BASE_DIR, "mysql", "bin", "mysqladmin.exe" ); private readonly ILogger logger = logger; diff --git a/Server/MysqlServer.cs b/Server/MysqlServer.cs index 3d4bafb..1500f7c 100644 --- a/Server/MysqlServer.cs +++ b/Server/MysqlServer.cs @@ -3,7 +3,7 @@ namespace BLIS_NG.Server; -public class MySqlServer(ILogger logger, MySqlIni mySqlIni, MySqlAdmin mySqlAdmin) : BaseProcess(nameof(MySqlServer), logger) +public class MySqlServer(ILogger logger, MySqlIni mySqlIni, MySqlAdmin mySqlAdmin, MySqlUpgrade mySqlUpgrade) : BaseProcess(nameof(MySqlServer), logger) { private static readonly string MysqldPath = Path.Combine( ConfigurationFile.SERVER_BASE_DIR, "mysql", "bin", "mysqld.exe"); @@ -18,10 +18,22 @@ public class MySqlServer(ILogger logger, MySqlIni mySqlIni, MySqlAd private readonly ILogger logger = logger; private readonly MySqlIni mySqlIni = mySqlIni; private readonly MySqlAdmin mySqlAdmin = mySqlAdmin; + private readonly MySqlUpgrade mySqlUpgrade = mySqlUpgrade; public async Task Run(CancellationToken cancellationToken = default) { mySqlIni.Write(); + + if (UpgradeRequired()) + { + var result = await PerformUpgrade(cancellationToken); + if (!result) + { + logger.LogError("MySQL upgrade is required but it could not be completed. Check the logs for details."); + return new ProcessResult(-1); + } + } + return await Execute(MysqldPath, Arguments, null, (stdout) => logger.LogInformation("{StdOut}", stdout), (stderr) => logger.LogWarning("{StdErr}", stderr), cancellationToken); } @@ -29,4 +41,45 @@ public override async void Stop() { await mySqlAdmin.Shutdown(); } + + private bool UpgradeRequired() + { + if (!File.Exists(Path.Combine(DataDir, "mysql", "plugin.frm"))) + { + logger.LogWarning("mysql/plugin.frm (mysql.plugin table) does not exist. Attempting to upgrade MySQL database."); + return true; + } + + return false; + } + + private async Task PerformUpgrade(CancellationToken cancellationToken) + { + // Start MySQL server with the --skip-grant-tables option to disable password authentication to enable upgrading + var args = $"{Arguments} --skip-grant-tables"; + var serverTask = Execute(MysqldPath, args, null, (stdout) => logger.LogInformation("{StdOut}", stdout), (stderr) => logger.LogWarning("{StdErr}", stderr), cancellationToken); + + bool awake = false; + for (int i = 0; !awake && i < 15; i++) + { + // Give the server a second to wake up... + Thread.Sleep(1000); + + awake = await mySqlAdmin.Ping(); + if (awake) break; + } + + if (!awake) + { + logger.LogError("Could not start MySQL for upgrading."); + return false; + } + + await mySqlUpgrade.Run(); + + await mySqlAdmin.Shutdown(); + await serverTask; + + return true; + } } diff --git a/Server/MysqlUpgrade.cs b/Server/MysqlUpgrade.cs new file mode 100644 index 0000000..ac80980 --- /dev/null +++ b/Server/MysqlUpgrade.cs @@ -0,0 +1,28 @@ +using BLIS_NG.Config; +using Microsoft.Extensions.Logging; + +namespace BLIS_NG.Server; + +/// +/// Process wrapper class for running mysql_upgrade.exe. +/// Does not run like other processes since it will not continually operate. +/// +public class MySqlUpgrade(ILogger logger) : BaseProcess(nameof(MySqlUpgrade), logger, singleton: false) +{ + private static readonly string MysqlUpgradePath = Path.Combine( + ConfigurationFile.SERVER_BASE_DIR, "mysql", "bin", "mysql_upgrade.exe"); + + private readonly ILogger logger = logger; + private readonly string Arguments = $"-h {MySqlIni.MYSQL_BIND_ADDRESS} --port {MySqlIni.MYSQL_PORT}"; + + public override void Stop() + { + // No-op since this process is not long-running. + return; + } + + public async Task Run() + { + await Execute(MysqlUpgradePath, Arguments, null, (stdout) => logger.LogInformation("{Message}", stdout), (stderr) => logger.LogWarning("{Message}", stderr)); + } +} diff --git a/Server/Process.cs b/Server/Process.cs index a603eb5..ac0e094 100644 --- a/Server/Process.cs +++ b/Server/Process.cs @@ -11,12 +11,13 @@ public record ProcessResult(int ExitCode) // The initial code for this class was adapted from: // https://gist.github.com/AlexMAS/276eed492bc989e13dcce7c78b9e179d -public abstract class BaseProcess(string ProcessName, ILogger logger) : IDisposable +public abstract class BaseProcess(string ProcessName, ILogger logger, bool singleton = true) : IDisposable { private const int FAILED_TO_LAUNCH = -1; private readonly ILogger logger = logger; private readonly string ProcessName = ProcessName; + private readonly bool singleton = singleton; private Process? process; public bool IsRunning { get => process != null; } @@ -25,7 +26,7 @@ protected async Task Execute(string exePath, string arguments, ID { var result = new ProcessResult(FAILED_TO_LAUNCH); - if (IsRunning) + if (singleton && IsRunning) { logger.LogWarning("Attempted to start {ProcessName} when it is already running.", ProcessName); return result; @@ -105,7 +106,7 @@ protected async Task Execute(string exePath, string arguments, ID var exitWaiter = Task.Run(process.WaitForExit, cancellationToken); await Task.WhenAll(exitWaiter, outputCloseEvent.Task, errorCloseEvent.Task); - result = new ProcessResult(ExitCode: process.ExitCode); + result = new ProcessResult(ExitCode: process?.ExitCode != null ? process.ExitCode : 1); } process = null; diff --git a/ServiceCollectionExtensions.cs b/ServiceCollectionExtensions.cs index 1441410..f7a4220 100644 --- a/ServiceCollectionExtensions.cs +++ b/ServiceCollectionExtensions.cs @@ -18,6 +18,7 @@ public static IServiceCollection AddDependencies(this IServiceCollection service // Server & utility processes .AddSingleton() + .AddSingleton() .AddSingleton() .AddSingleton() .AddSingleton() diff --git a/ViewModels/MainWindowViewModel.cs b/ViewModels/MainWindowViewModel.cs index af7458f..2af364d 100644 --- a/ViewModels/MainWindowViewModel.cs +++ b/ViewModels/MainWindowViewModel.cs @@ -16,9 +16,15 @@ public MainWindowViewModel(ServerControlViewModel serverControlViewModel) // Start BLIS on app start ServerControlViewModel.HandleStartButtonClick(); - - Thread.Sleep(3000); - WindowState = WindowState.Minimized; } + + public void Shutdown() + { + // Run method synchronously and wait for result. + var awaiter = Task.Run(ServerControlViewModel.HandleStopButtonClick).GetAwaiter(); + // Wait a little while for things to shutdown cleanly + Thread.Sleep(5000); + awaiter.GetResult(); + } } diff --git a/ViewModels/ServerControlViewModel.cs b/ViewModels/ServerControlViewModel.cs index da4b8dd..a923578 100644 --- a/ViewModels/ServerControlViewModel.cs +++ b/ViewModels/ServerControlViewModel.cs @@ -1,5 +1,6 @@ using System.Diagnostics; using System.Reactive; +using Avalonia.Controls.ApplicationLifetimes; using BLIS_NG.Config; using BLIS_NG.Lib; using BLIS_NG.Server; @@ -145,10 +146,16 @@ private void OpenUrl(Uri url) { Process.Start(new ProcessStartInfo { FileName = url.ToString(), UseShellExecute = true }); } - catch(Exception e) + catch (Exception e) { logger.LogError(e, "Could not open URL in browser: {Url}", url); } } + + public void OnExit(object? sender, ControlledApplicationLifetimeExitEventArgs e) + { + // Shutdown server when closing + HandleStopButtonClick(); + } } diff --git a/Views/MainWindow.axaml.cs b/Views/MainWindow.axaml.cs index 1e8a1b5..809f372 100644 --- a/Views/MainWindow.axaml.cs +++ b/Views/MainWindow.axaml.cs @@ -1,4 +1,5 @@ using Avalonia.Controls; +using BLIS_NG.ViewModels; namespace BLIS_NG.Views; @@ -8,5 +9,15 @@ public MainWindow() { InitializeComponent(); } + + protected override void OnClosing(WindowClosingEventArgs e) + { + if (DataContext is MainWindowViewModel vm) + { + vm.Shutdown(); + } + + base.OnClosing(e); + } } diff --git a/packages.lock.json b/packages.lock.json index 3c8d208..4b6ca20 100644 --- a/packages.lock.json +++ b/packages.lock.json @@ -1,371 +1,371 @@ -{ - "version": 1, - "dependencies": { - "net9.0": { - "Avalonia": { - "type": "Direct", - "requested": "[11.3.2, )", - "resolved": "11.3.2", - "contentHash": "3w1v4/wEpHFq6WWVNyyrne2Jyz5bdQvnK3AW36rCto42L+AtdbnO/SG2SIqJ7ObXJl+Y3LXz2XDGx9Blzqduow==", - "dependencies": { - "Avalonia.BuildServices": "0.0.31", - "Avalonia.Remote.Protocol": "11.3.2", - "MicroCom.Runtime": "0.11.0" - } - }, - "Avalonia.Desktop": { - "type": "Direct", - "requested": "[11.3.2, )", - "resolved": "11.3.2", - "contentHash": "b2ZPZ60UN0Uib3ZxFrf+ixYiJTBFaXrpQAcXTSUKTDw0nAU29sbfjvdtpBkBd6+idWpNtI+GhOjf0Mw0v1ncQg==", - "dependencies": { - "Avalonia": "11.3.2", - "Avalonia.Native": "11.3.2", - "Avalonia.Skia": "11.3.2", - "Avalonia.Win32": "11.3.2", - "Avalonia.X11": "11.3.2" - } - }, - "Avalonia.Diagnostics": { - "type": "Direct", - "requested": "[11.3.2, )", - "resolved": "11.3.2", - "contentHash": "3f4+uGJTrBCY9mxMy7690s8WKqyF4I29VFEUSASV5nVX6kyv/d1+OHBNd0GMyuyPOf+eEEA1ylNSHhRCw3jsvw==", - "dependencies": { - "Avalonia": "11.3.2", - "Avalonia.Controls.ColorPicker": "11.3.2", - "Avalonia.Themes.Simple": "11.3.2" - } - }, - "Avalonia.ReactiveUI": { - "type": "Direct", - "requested": "[11.3.2, )", - "resolved": "11.3.2", - "contentHash": "UbqzcqhCKN10jaRtCqb2Y/gV17lsRAnqwwwBiJWIoH1prPZq/PgbV/87h/KJsCkLLuTl1rqBU37vR84KLfjDhw==", - "dependencies": { - "Avalonia": "11.3.2", - "ReactiveUI": "20.1.1", - "System.Reactive": "6.0.1" - } - }, - "Avalonia.Themes.Fluent": { - "type": "Direct", - "requested": "[11.3.2, )", - "resolved": "11.3.2", - "contentHash": "aRCCmFSumpHJOxsXbdUUc/AaJ/O1HLggfvSxtXYm84QCutuP4OCqgxP9Pka1hb1+2e/TQxfNqM/6KRKPt4SaRg==", - "dependencies": { - "Avalonia": "11.3.2" - } - }, - "Fluid.Core": { - "type": "Direct", - "requested": "[2.25.0, )", - "resolved": "2.25.0", - "contentHash": "6fTSIHXgC+7fxFE4b3YADi0M4DmuWGDD8GUtZTqIXCcdqazbI1ve68EnpVQkgW6LbLkXL2Wo3s1aGT6vbmRsiA==", - "dependencies": { - "Microsoft.Extensions.FileProviders.Abstractions": "9.0.0", - "Parlot": "1.4.0", - "TimeZoneConverter": "7.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Direct", - "requested": "[9.0.7, )", - "resolved": "9.0.7", - "contentHash": "i05AYA91vgq0as84ROVCyltD2gnxaba/f1Qw2rG7mUsS0gv8cPTr1Gm7jPQHq7JTr4MJoQUcanLVs16tIOUJaQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Direct", - "requested": "[9.0.7, )", - "resolved": "9.0.7", - "contentHash": "fdIeQpXYV8yxSWG03cCbU2Otdrq4NWuhnQLXokWLv3L9YcK055E7u8WFJvP+uuP4CFeCEoqZQL4yPcjuXhCZrg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "9.0.7", - "Microsoft.Extensions.Logging.Abstractions": "9.0.7", - "Microsoft.Extensions.Options": "9.0.7" - } - }, - "Microsoft.NET.ILLink.Tasks": { - "type": "Direct", - "requested": "[9.0.7, )", - "resolved": "9.0.7", - "contentHash": "SZ1brSGoLnhLbE8QUZrtN6YwzN2gDT1wbx9qDBEfFFJcstiDTjJ6ygNuTPBV/K7SjGfx2YNbcJi5+ygbPOZpDg==" - }, - "Serilog.Extensions.Logging": { - "type": "Direct", - "requested": "[9.0.2, )", - "resolved": "9.0.2", - "contentHash": "p8kk2McN6LxuQfLyCoOkL7+nJIhVKnV1WFUxAaGTQTQk0wySbgmCHe98j+xSQvIbYHtzKXROOE2G2R0TLwBfig==", - "dependencies": { - "Microsoft.Extensions.Logging": "9.0.0", - "Serilog": "4.2.0" - } - }, - "Serilog.Sinks.Debug": { - "type": "Direct", - "requested": "[3.0.0, )", - "resolved": "3.0.0", - "contentHash": "4BzXcdrgRX7wde9PmHuYd9U6YqycCC28hhpKonK7hx0wb19eiuRj16fPcPSVp0o/Y1ipJuNLYQ00R3q2Zs8FDA==", - "dependencies": { - "Serilog": "4.0.0" - } - }, - "Serilog.Sinks.File": { - "type": "Direct", - "requested": "[7.0.0, )", - "resolved": "7.0.0", - "contentHash": "fKL7mXv7qaiNBUC71ssvn/dU0k9t0o45+qm2XgKAlSt19xF+ijjxyA3R6HmCgfKEKwfcfkwWjayuQtRueZFkYw==", - "dependencies": { - "Serilog": "4.2.0" - } - }, - "Avalonia.Angle.Windows.Natives": { - "type": "Transitive", - "resolved": "2.1.25547.20250602", - "contentHash": "ZL0VLc4s9rvNNFt19Pxm5UNAkmKNylugAwJPX9ulXZ6JWs/l6XZihPWWTyezaoNOVyEPU8YbURtW7XMAtqXH5A==" - }, - "Avalonia.BuildServices": { - "type": "Transitive", - "resolved": "0.0.31", - "contentHash": "KmCN6Hc+45q4OnF10ge450yVUvWuxU6bdQiyKqiSvrHKpahNrEdk0kG6Ip6GHk2SKOCttGQuA206JVdkldEENg==" - }, - "Avalonia.Controls.ColorPicker": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "K72rpZb6nSDuKZtcj1cfIAqpTkduff3Ng3+O22MxKhmmRDcFO0GAz7kwEArbtJTC4SNlSezaCyx6XMdNvaMcPA==", - "dependencies": { - "Avalonia": "11.3.2", - "Avalonia.Remote.Protocol": "11.3.2" - } - }, - "Avalonia.FreeDesktop": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "8laGOvPM83kB4xUqXGIRxN61Q5Ux/97URL7CU2Dizh4Nm7Ydj9+urKLTylk6dxWG7kZlo4e4k9G2aVUPkxTBGA==", - "dependencies": { - "Avalonia": "11.3.2", - "Tmds.DBus.Protocol": "0.21.2" - } - }, - "Avalonia.Native": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "dv3PVUcClxeDlNSoBjTdNuRYXdbzT3BgtpjEX/fv3pVreKfbh39wWQ+n4ecGh0FUKIlcj0X8BEaQ83t5eRsLnA==", - "dependencies": { - "Avalonia": "11.3.2" - } - }, - "Avalonia.Remote.Protocol": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "my6aXePR+N7tl3xDKdYNH2ZFZWUSNmyeU37HIgYJX2fQ4IOBv7SeaWBEd1F/qVsIbOlYxaqE7qOPfeFFtdYq/A==" - }, - "Avalonia.Skia": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "PJIPSqkWbQpKyWPMEIDAWYQaJ8xpJASg2H75sGWCkthLj+mCG/DZxdHI6UsDAcxKu/ppSRkX88RGo117bRYfFg==", - "dependencies": { - "Avalonia": "11.3.2", - "HarfBuzzSharp": "8.3.1.1", - "HarfBuzzSharp.NativeAssets.Linux": "8.3.1.1", - "HarfBuzzSharp.NativeAssets.WebAssembly": "8.3.1.1", - "SkiaSharp": "2.88.9", - "SkiaSharp.NativeAssets.Linux": "2.88.9", - "SkiaSharp.NativeAssets.WebAssembly": "2.88.9" - } - }, - "Avalonia.Themes.Simple": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "0TnR6vVS5qStClhG0T9i5Q7jSlZxqrpBxzBb7HPzNqe8dkNfM6VTN38J82sggvZAVddqSc3XRrB+VgheChxKQw==", - "dependencies": { - "Avalonia": "11.3.2" - } - }, - "Avalonia.Win32": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "CpM6zBwDwMFKw9/iyj0d8jxXKLZena/HFblS9Oc7BmLH8qxe8icr7ZBI5rElebrxDA5O590dAtfWdtOvB1/AZQ==", - "dependencies": { - "Avalonia": "11.3.2", - "Avalonia.Angle.Windows.Natives": "2.1.25547.20250602" - } - }, - "Avalonia.X11": { - "type": "Transitive", - "resolved": "11.3.2", - "contentHash": "MEMXOIaAr6jMtl9BhJ8sj7Vz+z19dWfcryWksV35LsolQhQmjmzJPVcCppdnvm5HxkohUXB1qN1RqWN1cqRwBQ==", - "dependencies": { - "Avalonia": "11.3.2", - "Avalonia.FreeDesktop": "11.3.2", - "Avalonia.Skia": "11.3.2" - } - }, - "DynamicData": { - "type": "Transitive", - "resolved": "8.4.1", - "contentHash": "Mn1+fU/jqxgONEJq8KLQPGWEi7g/hUVTbjZyn4QM0sWWDAVOHPO9WjXWORSykwdfg/6S3GM15qsfz+2EvO+QAQ==", - "dependencies": { - "System.Reactive": "6.0.0" - } - }, - "HarfBuzzSharp": { - "type": "Transitive", - "resolved": "8.3.1.1", - "contentHash": "tLZN66oe/uiRPTZfrCU4i8ScVGwqHNh5MHrXj0yVf4l7Mz0FhTGnQ71RGySROTmdognAs0JtluHkL41pIabWuQ==", - "dependencies": { - "HarfBuzzSharp.NativeAssets.Win32": "8.3.1.1", - "HarfBuzzSharp.NativeAssets.macOS": "8.3.1.1" - } - }, - "HarfBuzzSharp.NativeAssets.Linux": { - "type": "Transitive", - "resolved": "8.3.1.1", - "contentHash": "3EZ1mpIiKWRLL5hUYA82ZHteeDIVaEA/Z0rA/wU6tjx6crcAkJnBPwDXZugBSfo8+J3EznvRJf49uMsqYfKrHg==" - }, - "HarfBuzzSharp.NativeAssets.macOS": { - "type": "Transitive", - "resolved": "8.3.1.1", - "contentHash": "jbtCsgftcaFLCA13tVKo5iWdElJScrulLTKJre36O4YQTIlwDtPPqhRZNk+Y0vv4D1gxbscasGRucUDfS44ofQ==" - }, - "HarfBuzzSharp.NativeAssets.WebAssembly": { - "type": "Transitive", - "resolved": "8.3.1.1", - "contentHash": "loJweK2u/mH/3C2zBa0ggJlITIszOkK64HLAZB7FUT670dTg965whLFYHDQo69NmC4+d9UN0icLC9VHidXaVCA==" - }, - "HarfBuzzSharp.NativeAssets.Win32": { - "type": "Transitive", - "resolved": "8.3.1.1", - "contentHash": "UsJtQsfAJoFDZrXc4hCUfRPMqccfKZ0iumJ/upcUjz/cmsTgVFGNEL5yaJWmkqsuFYdMWbj/En5/kS4PFl9hBA==" - }, - "MicroCom.Runtime": { - "type": "Transitive", - "resolved": "0.11.0", - "contentHash": "MEnrZ3UIiH40hjzMDsxrTyi8dtqB5ziv3iBeeU4bXsL/7NLSal9F1lZKpK+tfBRnUoDSdtcW3KufE4yhATOMCA==" - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "iPK1FxbGFr2Xb+4Y+dTYI8Gupu9pOi8I3JPuPsrogUmEhe2hzZ9LpCmolMEBhVDo2ikcSr7G5zYiwaapHSQTew==" - }, - "Microsoft.Extensions.FileProviders.Abstractions": { - "type": "Transitive", - "resolved": "9.0.0", - "contentHash": "uK439QzYR0q2emLVtYzwyK3x+T5bTY4yWsd/k/ZUS9LR6Sflp8MIdhGXW8kQCd86dQD4tLqvcbLkku8qHY263Q==", - "dependencies": { - "Microsoft.Extensions.Primitives": "9.0.0" - } - }, - "Microsoft.Extensions.Logging.Abstractions": { - "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "sMM6NEAdUTE/elJ2wqjOi0iBWqZmSyaTByLF9e8XHv6DRJFFnOe0N+s8Uc6C91E4SboQCfLswaBIZ+9ZXA98AA==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7" - } - }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "trJnF6cRWgR5uMmHpGoHmM1wOVFdIYlELlkO9zX+RfieK0321Y55zrcs4AaEymKup7dxgEN/uJU25CAcMNQRXw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7", - "Microsoft.Extensions.Primitives": "9.0.7" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "9.0.7", - "contentHash": "ti/zD9BuuO50IqlvhWQs9GHxkCmoph5BHjGiWKdg2t6Or8XoyAfRJiKag+uvd/fpASnNklfsB01WpZ4fhAe0VQ==" - }, - "Parlot": { - "type": "Transitive", - "resolved": "1.4.0", - "contentHash": "oMftmeCsDPXbBgYQsVG4yuedvTVwSkZZHkKH1F4CpBkS9O99GrAV2sA8t7cC5CoVFPprmAFZThJMXjwu3ybgNg==" - }, - "ReactiveUI": { - "type": "Transitive", - "resolved": "20.1.1", - "contentHash": "9hNPknWjijnaSWs6auypoXqUptPZcRpUypF+cf1zD50fgW+SEoQda502N3fVZ2eWPcaiUad+z6GaLwOWmUVHNw==", - "dependencies": { - "DynamicData": "8.4.1", - "Splat": "15.1.1", - "System.ComponentModel.Annotations": "5.0.0" - } - }, - "Serilog": { - "type": "Transitive", - "resolved": "4.2.0", - "contentHash": "gmoWVOvKgbME8TYR+gwMf7osROiWAURterc6Rt2dQyX7wtjZYpqFiA/pY6ztjGQKKV62GGCyOcmtP1UKMHgSmA==" - }, - "SkiaSharp": { - "type": "Transitive", - "resolved": "2.88.9", - "contentHash": "3MD5VHjXXieSHCleRLuaTXmL2pD0mB7CcOB1x2kA1I4bhptf4e3R27iM93264ZYuAq6mkUyX5XbcxnZvMJYc1Q==", - "dependencies": { - "SkiaSharp.NativeAssets.Win32": "2.88.9", - "SkiaSharp.NativeAssets.macOS": "2.88.9" - } - }, - "SkiaSharp.NativeAssets.Linux": { - "type": "Transitive", - "resolved": "2.88.9", - "contentHash": "cWSaJKVPWAaT/WIn9c8T5uT/l4ETwHxNJTkEOtNKjphNo8AW6TF9O32aRkxqw3l8GUdUo66Bu7EiqtFh/XG0Zg==", - "dependencies": { - "SkiaSharp": "2.88.9" - } - }, - "SkiaSharp.NativeAssets.macOS": { - "type": "Transitive", - "resolved": "2.88.9", - "contentHash": "Nv5spmKc4505Ep7oUoJ5vp3KweFpeNqxpyGDWyeEPTX2uR6S6syXIm3gj75dM0YJz7NPvcix48mR5laqs8dPuA==" - }, - "SkiaSharp.NativeAssets.WebAssembly": { - "type": "Transitive", - "resolved": "2.88.9", - "contentHash": "kt06RccBHSnAs2wDYdBSfsjIDbY3EpsOVqnlDgKdgvyuRA8ZFDaHRdWNx1VHjGgYzmnFCGiTJBnXFl5BqGwGnA==" - }, - "SkiaSharp.NativeAssets.Win32": { - "type": "Transitive", - "resolved": "2.88.9", - "contentHash": "wb2kYgU7iy84nQLYZwMeJXixvK++GoIuECjU4ECaUKNuflyRlJKyiRhN1MAHswvlvzuvkrjRWlK0Za6+kYQK7w==" - }, - "Splat": { - "type": "Transitive", - "resolved": "15.1.1", - "contentHash": "RHDTdF90FwVbRia2cmuIzkiVoETqnXSB2dDBBi/I35HWXqv4OKGqoMcfcd6obMvO2OmmY5PjU1M62K8LkJafAA==" - }, - "System.ComponentModel.Annotations": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" - }, - "System.IO.Pipelines": { - "type": "Transitive", - "resolved": "8.0.0", - "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" - }, - "System.Reactive": { - "type": "Transitive", - "resolved": "6.0.1", - "contentHash": "rHaWtKDwCi9qJ3ObKo8LHPMuuwv33YbmQi7TcUK1C264V3MFnOr5Im7QgCTdLniztP3GJyeiSg5x8NqYJFqRmg==" - }, - "TimeZoneConverter": { - "type": "Transitive", - "resolved": "7.0.0", - "contentHash": "sFbY65N/5GdsHx7nkdHFHUG+5Ar4W0w6Aks7Y2X+Q4NOTw6XyX2Il7jm+4tPkc//4mA3nG0RdxI8gKgoJitdLw==" - }, - "Tmds.DBus.Protocol": { - "type": "Transitive", - "resolved": "0.21.2", - "contentHash": "ScSMrUrrw8px4kK1Glh0fZv/HQUlg1078bNXNPfRPKQ3WbRzV9HpsydYEOgSoMK5LWICMf2bMwIFH0pGjxjcMA==", - "dependencies": { - "System.IO.Pipelines": "8.0.0" - } - } - } - } +{ + "version": 1, + "dependencies": { + "net9.0": { + "Avalonia": { + "type": "Direct", + "requested": "[11.3.2, )", + "resolved": "11.3.2", + "contentHash": "3w1v4/wEpHFq6WWVNyyrne2Jyz5bdQvnK3AW36rCto42L+AtdbnO/SG2SIqJ7ObXJl+Y3LXz2XDGx9Blzqduow==", + "dependencies": { + "Avalonia.BuildServices": "0.0.31", + "Avalonia.Remote.Protocol": "11.3.2", + "MicroCom.Runtime": "0.11.0" + } + }, + "Avalonia.Desktop": { + "type": "Direct", + "requested": "[11.3.2, )", + "resolved": "11.3.2", + "contentHash": "b2ZPZ60UN0Uib3ZxFrf+ixYiJTBFaXrpQAcXTSUKTDw0nAU29sbfjvdtpBkBd6+idWpNtI+GhOjf0Mw0v1ncQg==", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Native": "11.3.2", + "Avalonia.Skia": "11.3.2", + "Avalonia.Win32": "11.3.2", + "Avalonia.X11": "11.3.2" + } + }, + "Avalonia.Diagnostics": { + "type": "Direct", + "requested": "[11.3.2, )", + "resolved": "11.3.2", + "contentHash": "3f4+uGJTrBCY9mxMy7690s8WKqyF4I29VFEUSASV5nVX6kyv/d1+OHBNd0GMyuyPOf+eEEA1ylNSHhRCw3jsvw==", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Controls.ColorPicker": "11.3.2", + "Avalonia.Themes.Simple": "11.3.2" + } + }, + "Avalonia.ReactiveUI": { + "type": "Direct", + "requested": "[11.3.2, )", + "resolved": "11.3.2", + "contentHash": "UbqzcqhCKN10jaRtCqb2Y/gV17lsRAnqwwwBiJWIoH1prPZq/PgbV/87h/KJsCkLLuTl1rqBU37vR84KLfjDhw==", + "dependencies": { + "Avalonia": "11.3.2", + "ReactiveUI": "20.1.1", + "System.Reactive": "6.0.1" + } + }, + "Avalonia.Themes.Fluent": { + "type": "Direct", + "requested": "[11.3.2, )", + "resolved": "11.3.2", + "contentHash": "aRCCmFSumpHJOxsXbdUUc/AaJ/O1HLggfvSxtXYm84QCutuP4OCqgxP9Pka1hb1+2e/TQxfNqM/6KRKPt4SaRg==", + "dependencies": { + "Avalonia": "11.3.2" + } + }, + "Fluid.Core": { + "type": "Direct", + "requested": "[2.25.0, )", + "resolved": "2.25.0", + "contentHash": "6fTSIHXgC+7fxFE4b3YADi0M4DmuWGDD8GUtZTqIXCcdqazbI1ve68EnpVQkgW6LbLkXL2Wo3s1aGT6vbmRsiA==", + "dependencies": { + "Microsoft.Extensions.FileProviders.Abstractions": "9.0.0", + "Parlot": "1.4.0", + "TimeZoneConverter": "7.0.0" + } + }, + "Microsoft.Extensions.DependencyInjection": { + "type": "Direct", + "requested": "[9.0.7, )", + "resolved": "9.0.7", + "contentHash": "i05AYA91vgq0as84ROVCyltD2gnxaba/f1Qw2rG7mUsS0gv8cPTr1Gm7jPQHq7JTr4MJoQUcanLVs16tIOUJaQ==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7" + } + }, + "Microsoft.Extensions.Logging": { + "type": "Direct", + "requested": "[9.0.7, )", + "resolved": "9.0.7", + "contentHash": "fdIeQpXYV8yxSWG03cCbU2Otdrq4NWuhnQLXokWLv3L9YcK055E7u8WFJvP+uuP4CFeCEoqZQL4yPcjuXhCZrg==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection": "9.0.7", + "Microsoft.Extensions.Logging.Abstractions": "9.0.7", + "Microsoft.Extensions.Options": "9.0.7" + } + }, + "Microsoft.NET.ILLink.Tasks": { + "type": "Direct", + "requested": "[9.0.8, )", + "resolved": "9.0.8", + "contentHash": "rd1CbIsMtVPtZNTIVD6Xydue//klYOOQIDpRgu3BHtv17AlpRs74/6QFbcYgMm/jL+naVU2T3OFLxVSLV5lQLQ==" + }, + "Serilog.Extensions.Logging": { + "type": "Direct", + "requested": "[9.0.2, )", + "resolved": "9.0.2", + "contentHash": "p8kk2McN6LxuQfLyCoOkL7+nJIhVKnV1WFUxAaGTQTQk0wySbgmCHe98j+xSQvIbYHtzKXROOE2G2R0TLwBfig==", + "dependencies": { + "Microsoft.Extensions.Logging": "9.0.0", + "Serilog": "4.2.0" + } + }, + "Serilog.Sinks.Debug": { + "type": "Direct", + "requested": "[3.0.0, )", + "resolved": "3.0.0", + "contentHash": "4BzXcdrgRX7wde9PmHuYd9U6YqycCC28hhpKonK7hx0wb19eiuRj16fPcPSVp0o/Y1ipJuNLYQ00R3q2Zs8FDA==", + "dependencies": { + "Serilog": "4.0.0" + } + }, + "Serilog.Sinks.File": { + "type": "Direct", + "requested": "[7.0.0, )", + "resolved": "7.0.0", + "contentHash": "fKL7mXv7qaiNBUC71ssvn/dU0k9t0o45+qm2XgKAlSt19xF+ijjxyA3R6HmCgfKEKwfcfkwWjayuQtRueZFkYw==", + "dependencies": { + "Serilog": "4.2.0" + } + }, + "Avalonia.Angle.Windows.Natives": { + "type": "Transitive", + "resolved": "2.1.25547.20250602", + "contentHash": "ZL0VLc4s9rvNNFt19Pxm5UNAkmKNylugAwJPX9ulXZ6JWs/l6XZihPWWTyezaoNOVyEPU8YbURtW7XMAtqXH5A==" + }, + "Avalonia.BuildServices": { + "type": "Transitive", + "resolved": "0.0.31", + "contentHash": "KmCN6Hc+45q4OnF10ge450yVUvWuxU6bdQiyKqiSvrHKpahNrEdk0kG6Ip6GHk2SKOCttGQuA206JVdkldEENg==" + }, + "Avalonia.Controls.ColorPicker": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "K72rpZb6nSDuKZtcj1cfIAqpTkduff3Ng3+O22MxKhmmRDcFO0GAz7kwEArbtJTC4SNlSezaCyx6XMdNvaMcPA==", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Remote.Protocol": "11.3.2" + } + }, + "Avalonia.FreeDesktop": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "8laGOvPM83kB4xUqXGIRxN61Q5Ux/97URL7CU2Dizh4Nm7Ydj9+urKLTylk6dxWG7kZlo4e4k9G2aVUPkxTBGA==", + "dependencies": { + "Avalonia": "11.3.2", + "Tmds.DBus.Protocol": "0.21.2" + } + }, + "Avalonia.Native": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "dv3PVUcClxeDlNSoBjTdNuRYXdbzT3BgtpjEX/fv3pVreKfbh39wWQ+n4ecGh0FUKIlcj0X8BEaQ83t5eRsLnA==", + "dependencies": { + "Avalonia": "11.3.2" + } + }, + "Avalonia.Remote.Protocol": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "my6aXePR+N7tl3xDKdYNH2ZFZWUSNmyeU37HIgYJX2fQ4IOBv7SeaWBEd1F/qVsIbOlYxaqE7qOPfeFFtdYq/A==" + }, + "Avalonia.Skia": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "PJIPSqkWbQpKyWPMEIDAWYQaJ8xpJASg2H75sGWCkthLj+mCG/DZxdHI6UsDAcxKu/ppSRkX88RGo117bRYfFg==", + "dependencies": { + "Avalonia": "11.3.2", + "HarfBuzzSharp": "8.3.1.1", + "HarfBuzzSharp.NativeAssets.Linux": "8.3.1.1", + "HarfBuzzSharp.NativeAssets.WebAssembly": "8.3.1.1", + "SkiaSharp": "2.88.9", + "SkiaSharp.NativeAssets.Linux": "2.88.9", + "SkiaSharp.NativeAssets.WebAssembly": "2.88.9" + } + }, + "Avalonia.Themes.Simple": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "0TnR6vVS5qStClhG0T9i5Q7jSlZxqrpBxzBb7HPzNqe8dkNfM6VTN38J82sggvZAVddqSc3XRrB+VgheChxKQw==", + "dependencies": { + "Avalonia": "11.3.2" + } + }, + "Avalonia.Win32": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "CpM6zBwDwMFKw9/iyj0d8jxXKLZena/HFblS9Oc7BmLH8qxe8icr7ZBI5rElebrxDA5O590dAtfWdtOvB1/AZQ==", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.Angle.Windows.Natives": "2.1.25547.20250602" + } + }, + "Avalonia.X11": { + "type": "Transitive", + "resolved": "11.3.2", + "contentHash": "MEMXOIaAr6jMtl9BhJ8sj7Vz+z19dWfcryWksV35LsolQhQmjmzJPVcCppdnvm5HxkohUXB1qN1RqWN1cqRwBQ==", + "dependencies": { + "Avalonia": "11.3.2", + "Avalonia.FreeDesktop": "11.3.2", + "Avalonia.Skia": "11.3.2" + } + }, + "DynamicData": { + "type": "Transitive", + "resolved": "8.4.1", + "contentHash": "Mn1+fU/jqxgONEJq8KLQPGWEi7g/hUVTbjZyn4QM0sWWDAVOHPO9WjXWORSykwdfg/6S3GM15qsfz+2EvO+QAQ==", + "dependencies": { + "System.Reactive": "6.0.0" + } + }, + "HarfBuzzSharp": { + "type": "Transitive", + "resolved": "8.3.1.1", + "contentHash": "tLZN66oe/uiRPTZfrCU4i8ScVGwqHNh5MHrXj0yVf4l7Mz0FhTGnQ71RGySROTmdognAs0JtluHkL41pIabWuQ==", + "dependencies": { + "HarfBuzzSharp.NativeAssets.Win32": "8.3.1.1", + "HarfBuzzSharp.NativeAssets.macOS": "8.3.1.1" + } + }, + "HarfBuzzSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "8.3.1.1", + "contentHash": "3EZ1mpIiKWRLL5hUYA82ZHteeDIVaEA/Z0rA/wU6tjx6crcAkJnBPwDXZugBSfo8+J3EznvRJf49uMsqYfKrHg==" + }, + "HarfBuzzSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "8.3.1.1", + "contentHash": "jbtCsgftcaFLCA13tVKo5iWdElJScrulLTKJre36O4YQTIlwDtPPqhRZNk+Y0vv4D1gxbscasGRucUDfS44ofQ==" + }, + "HarfBuzzSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "8.3.1.1", + "contentHash": "loJweK2u/mH/3C2zBa0ggJlITIszOkK64HLAZB7FUT670dTg965whLFYHDQo69NmC4+d9UN0icLC9VHidXaVCA==" + }, + "HarfBuzzSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "8.3.1.1", + "contentHash": "UsJtQsfAJoFDZrXc4hCUfRPMqccfKZ0iumJ/upcUjz/cmsTgVFGNEL5yaJWmkqsuFYdMWbj/En5/kS4PFl9hBA==" + }, + "MicroCom.Runtime": { + "type": "Transitive", + "resolved": "0.11.0", + "contentHash": "MEnrZ3UIiH40hjzMDsxrTyi8dtqB5ziv3iBeeU4bXsL/7NLSal9F1lZKpK+tfBRnUoDSdtcW3KufE4yhATOMCA==" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions": { + "type": "Transitive", + "resolved": "9.0.7", + "contentHash": "iPK1FxbGFr2Xb+4Y+dTYI8Gupu9pOi8I3JPuPsrogUmEhe2hzZ9LpCmolMEBhVDo2ikcSr7G5zYiwaapHSQTew==" + }, + "Microsoft.Extensions.FileProviders.Abstractions": { + "type": "Transitive", + "resolved": "9.0.0", + "contentHash": "uK439QzYR0q2emLVtYzwyK3x+T5bTY4yWsd/k/ZUS9LR6Sflp8MIdhGXW8kQCd86dQD4tLqvcbLkku8qHY263Q==", + "dependencies": { + "Microsoft.Extensions.Primitives": "9.0.0" + } + }, + "Microsoft.Extensions.Logging.Abstractions": { + "type": "Transitive", + "resolved": "9.0.7", + "contentHash": "sMM6NEAdUTE/elJ2wqjOi0iBWqZmSyaTByLF9e8XHv6DRJFFnOe0N+s8Uc6C91E4SboQCfLswaBIZ+9ZXA98AA==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7" + } + }, + "Microsoft.Extensions.Options": { + "type": "Transitive", + "resolved": "9.0.7", + "contentHash": "trJnF6cRWgR5uMmHpGoHmM1wOVFdIYlELlkO9zX+RfieK0321Y55zrcs4AaEymKup7dxgEN/uJU25CAcMNQRXw==", + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "9.0.7", + "Microsoft.Extensions.Primitives": "9.0.7" + } + }, + "Microsoft.Extensions.Primitives": { + "type": "Transitive", + "resolved": "9.0.7", + "contentHash": "ti/zD9BuuO50IqlvhWQs9GHxkCmoph5BHjGiWKdg2t6Or8XoyAfRJiKag+uvd/fpASnNklfsB01WpZ4fhAe0VQ==" + }, + "Parlot": { + "type": "Transitive", + "resolved": "1.4.0", + "contentHash": "oMftmeCsDPXbBgYQsVG4yuedvTVwSkZZHkKH1F4CpBkS9O99GrAV2sA8t7cC5CoVFPprmAFZThJMXjwu3ybgNg==" + }, + "ReactiveUI": { + "type": "Transitive", + "resolved": "20.1.1", + "contentHash": "9hNPknWjijnaSWs6auypoXqUptPZcRpUypF+cf1zD50fgW+SEoQda502N3fVZ2eWPcaiUad+z6GaLwOWmUVHNw==", + "dependencies": { + "DynamicData": "8.4.1", + "Splat": "15.1.1", + "System.ComponentModel.Annotations": "5.0.0" + } + }, + "Serilog": { + "type": "Transitive", + "resolved": "4.2.0", + "contentHash": "gmoWVOvKgbME8TYR+gwMf7osROiWAURterc6Rt2dQyX7wtjZYpqFiA/pY6ztjGQKKV62GGCyOcmtP1UKMHgSmA==" + }, + "SkiaSharp": { + "type": "Transitive", + "resolved": "2.88.9", + "contentHash": "3MD5VHjXXieSHCleRLuaTXmL2pD0mB7CcOB1x2kA1I4bhptf4e3R27iM93264ZYuAq6mkUyX5XbcxnZvMJYc1Q==", + "dependencies": { + "SkiaSharp.NativeAssets.Win32": "2.88.9", + "SkiaSharp.NativeAssets.macOS": "2.88.9" + } + }, + "SkiaSharp.NativeAssets.Linux": { + "type": "Transitive", + "resolved": "2.88.9", + "contentHash": "cWSaJKVPWAaT/WIn9c8T5uT/l4ETwHxNJTkEOtNKjphNo8AW6TF9O32aRkxqw3l8GUdUo66Bu7EiqtFh/XG0Zg==", + "dependencies": { + "SkiaSharp": "2.88.9" + } + }, + "SkiaSharp.NativeAssets.macOS": { + "type": "Transitive", + "resolved": "2.88.9", + "contentHash": "Nv5spmKc4505Ep7oUoJ5vp3KweFpeNqxpyGDWyeEPTX2uR6S6syXIm3gj75dM0YJz7NPvcix48mR5laqs8dPuA==" + }, + "SkiaSharp.NativeAssets.WebAssembly": { + "type": "Transitive", + "resolved": "2.88.9", + "contentHash": "kt06RccBHSnAs2wDYdBSfsjIDbY3EpsOVqnlDgKdgvyuRA8ZFDaHRdWNx1VHjGgYzmnFCGiTJBnXFl5BqGwGnA==" + }, + "SkiaSharp.NativeAssets.Win32": { + "type": "Transitive", + "resolved": "2.88.9", + "contentHash": "wb2kYgU7iy84nQLYZwMeJXixvK++GoIuECjU4ECaUKNuflyRlJKyiRhN1MAHswvlvzuvkrjRWlK0Za6+kYQK7w==" + }, + "Splat": { + "type": "Transitive", + "resolved": "15.1.1", + "contentHash": "RHDTdF90FwVbRia2cmuIzkiVoETqnXSB2dDBBi/I35HWXqv4OKGqoMcfcd6obMvO2OmmY5PjU1M62K8LkJafAA==" + }, + "System.ComponentModel.Annotations": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "dMkqfy2el8A8/I76n2Hi1oBFEbG1SfxD2l5nhwXV3XjlnOmwxJlQbYpJH4W51odnU9sARCSAgv7S3CyAFMkpYg==" + }, + "System.IO.Pipelines": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "FHNOatmUq0sqJOkTx+UF/9YK1f180cnW5FVqnQMvYUN0elp6wFzbtPSiqbo1/ru8ICp43JM1i7kKkk6GsNGHlA==" + }, + "System.Reactive": { + "type": "Transitive", + "resolved": "6.0.1", + "contentHash": "rHaWtKDwCi9qJ3ObKo8LHPMuuwv33YbmQi7TcUK1C264V3MFnOr5Im7QgCTdLniztP3GJyeiSg5x8NqYJFqRmg==" + }, + "TimeZoneConverter": { + "type": "Transitive", + "resolved": "7.0.0", + "contentHash": "sFbY65N/5GdsHx7nkdHFHUG+5Ar4W0w6Aks7Y2X+Q4NOTw6XyX2Il7jm+4tPkc//4mA3nG0RdxI8gKgoJitdLw==" + }, + "Tmds.DBus.Protocol": { + "type": "Transitive", + "resolved": "0.21.2", + "contentHash": "ScSMrUrrw8px4kK1Glh0fZv/HQUlg1078bNXNPfRPKQ3WbRzV9HpsydYEOgSoMK5LWICMf2bMwIFH0pGjxjcMA==", + "dependencies": { + "System.IO.Pipelines": "8.0.0" + } + } + } + } } \ No newline at end of file From 5de1884165e0e9e6b019ff947b114db5d8c41090 Mon Sep 17 00:00:00 2001 From: Mitchell Rysavy Date: Tue, 7 Oct 2025 21:02:04 -0400 Subject: [PATCH 3/3] Enable php_sodium --- Assets/Templates/php.ini.liquid | 1 + packages.lock.json | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Assets/Templates/php.ini.liquid b/Assets/Templates/php.ini.liquid index c9d267f..f1a80ed 100644 --- a/Assets/Templates/php.ini.liquid +++ b/Assets/Templates/php.ini.liquid @@ -480,6 +480,7 @@ extension=php_openssl.dll ;extension=php_shmop.dll ;extension=php_snmp.dll ;extension=php_sockets.dll +extension=php_sodium.dll ;extension=php_sybase_ct.dll ;extension=php_tokenizer.dll ;extension=php_w32api.dll diff --git a/packages.lock.json b/packages.lock.json index 4b6ca20..f934c0e 100644 --- a/packages.lock.json +++ b/packages.lock.json @@ -90,9 +90,9 @@ }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[9.0.8, )", - "resolved": "9.0.8", - "contentHash": "rd1CbIsMtVPtZNTIVD6Xydue//klYOOQIDpRgu3BHtv17AlpRs74/6QFbcYgMm/jL+naVU2T3OFLxVSLV5lQLQ==" + "requested": "[9.0.9, )", + "resolved": "9.0.9", + "contentHash": "cHi1os/s6aobEgNkbOh/jW+ru//rHuedvj4PmTh2mMY7et/mJjqphBeXeKCesDvMd0+E2JyX9EPZZC4VRKslXg==" }, "Serilog.Extensions.Logging": { "type": "Direct",