From 749c90e4087f847f745a13f1d5260a7eb1150328 Mon Sep 17 00:00:00 2001 From: BRUNER Patrick Date: Wed, 4 Mar 2026 13:27:41 +0100 Subject: [PATCH 1/4] fix that sftp could not be loaded if rollingfile has been activated --- .../Classes/Log/RolloverFilenameHandler.cs | 18 ++- .../RolloverFilenameHandlerNullTests.cs | 136 ++++++++++++++++++ .../Controls/LogWindow/LogWindow.cs | 2 +- src/SftpFileSystemx64/SftpLogFileInfo.cs | 25 +++- src/setup/LogExpertInstaller.iss | 14 +- 5 files changed, 186 insertions(+), 9 deletions(-) create mode 100644 src/LogExpert.Tests/RolloverFilenameHandlerNullTests.cs diff --git a/src/LogExpert.Core/Classes/Log/RolloverFilenameHandler.cs b/src/LogExpert.Core/Classes/Log/RolloverFilenameHandler.cs index eaf6f2db..9bd42d9a 100644 --- a/src/LogExpert.Core/Classes/Log/RolloverFilenameHandler.cs +++ b/src/LogExpert.Core/Classes/Log/RolloverFilenameHandler.cs @@ -52,10 +52,13 @@ public RolloverFilenameHandler(ILogFileInfo logFileInfo, MultiFileOptions option public LinkedList GetNameList(IPluginRegistry pluginRegistry) { LinkedList fileList = new(); + var fileName = _filenameBuilder.BuildFileName(); var filePath = _logFileInfo.DirectoryName + _logFileInfo.DirectorySeparatorChar + fileName; - fileList.AddFirst(filePath); + _ = fileList.AddFirst(filePath); + var found = true; + while (found) { found = false; @@ -67,11 +70,12 @@ public LinkedList GetNameList(IPluginRegistry pluginRegistry) filePath = _logFileInfo.DirectoryName + _logFileInfo.DirectorySeparatorChar + fileName;//TODO: Change to Directory.Combine if (FileExists(filePath, pluginRegistry)) { - fileList.AddFirst(filePath); + _ = fileList.AddFirst(filePath); found = true; continue; } } + // if file with index isn't found or no index is in format pattern, decrement the current date if (_filenameBuilder.IsDatePattern) { @@ -84,7 +88,7 @@ public LinkedList GetNameList(IPluginRegistry pluginRegistry) filePath = _logFileInfo.DirectoryName + _logFileInfo.DirectorySeparatorChar + fileName;//TODO: Change to Directory.Combine if (FileExists(filePath, pluginRegistry)) { - fileList.AddFirst(filePath); + _ = fileList.AddFirst(filePath); found = true; break; } @@ -104,8 +108,14 @@ public LinkedList GetNameList(IPluginRegistry pluginRegistry) private bool FileExists(string filePath, IPluginRegistry pluginRegistry) { var fs = pluginRegistry.FindFileSystemForUri(filePath); + + if(fs == null) + { + return false; + } + var info = fs.GetLogfileInfo(filePath); - return info.FileExists; + return info is not null && info.FileExists; } #endregion diff --git a/src/LogExpert.Tests/RolloverFilenameHandlerNullTests.cs b/src/LogExpert.Tests/RolloverFilenameHandlerNullTests.cs new file mode 100644 index 00000000..30cf3a0c --- /dev/null +++ b/src/LogExpert.Tests/RolloverFilenameHandlerNullTests.cs @@ -0,0 +1,136 @@ +using ColumnizerLib; + +using LogExpert.Core.Classes.Log; +using LogExpert.Core.Entities; +using LogExpert.Core.Interface; + +using Moq; + +using NUnit.Framework; + +namespace LogExpert.Tests; + +[TestFixture] +internal class RolloverFilenameHandlerNullTests +{ + /// + /// Verifies that GetNameList does not throw when GetLogfileInfo returns null + /// for rollover file candidates. This simulates the SFTP scenario where + /// constructing SftpLogFileInfo fails for non-existent files. + /// + [Test] + public void GetNameList_WhenGetLogfileInfoReturnsNull_DoesNotThrow () + { + // Arrange: Create a mock ILogFileInfo for the "base" file + var baseFileInfo = new Mock(); + _ = baseFileInfo.Setup(f => f.FileName).Returns("app.log"); + _ = baseFileInfo.Setup(f => f.DirectoryName).Returns("sftp://host/var/log"); + _ = baseFileInfo.Setup(f => f.DirectorySeparatorChar).Returns('/'); + _ = baseFileInfo.Setup(f => f.FileExists).Returns(true); + + // Arrange: Create a mock IFileSystemPlugin that returns null for rollover files + var mockFs = new Mock(); + _ = mockFs.Setup(fs => fs.CanHandleUri(It.IsAny())).Returns(true); + // Return null for any GetLogfileInfo call — simulates constructor failure + _ = mockFs.Setup(fs => fs.GetLogfileInfo(It.IsAny())).Returns((ILogFileInfo)null); + + // Arrange: Create a mock IPluginRegistry + var mockRegistry = new Mock(); + _ = mockRegistry.Setup(r => r.FindFileSystemForUri(It.IsAny())).Returns(mockFs.Object); + + MultiFileOptions options = new() + { + FormatPattern = "*$J(.)", + MaxDayTry = 5 + }; + + RolloverFilenameHandler handler = new(baseFileInfo.Object, options); + + // Act & Assert: Should not throw NullReferenceException + LinkedList result = null; + Assert.DoesNotThrow(() => result = handler.GetNameList(mockRegistry.Object)); + + // The list should contain only the base file + Assert.That(result, Is.Not.Null); + Assert.That(result.Count, Is.EqualTo(1)); + Assert.That(result.First.Value, Does.Contain("app.log")); + } + + /// + /// Verifies that GetNameList does not throw when FindFileSystemForUri returns null. + /// This could happen with an unrecognized URI scheme. + /// + [Test] + public void GetNameList_WhenFindFileSystemReturnsNull_DoesNotThrow () + { + // Arrange + var baseFileInfo = new Mock(); + _ = baseFileInfo.Setup(f => f.FileName).Returns("app.log"); + _ = baseFileInfo.Setup(f => f.DirectoryName).Returns("custom://host/logs"); + _ = baseFileInfo.Setup(f => f.DirectorySeparatorChar).Returns('/'); + _ = baseFileInfo.Setup(f => f.FileExists).Returns(true); + + var mockRegistry = new Mock(); + _ = mockRegistry.Setup(r => r.FindFileSystemForUri(It.IsAny())).Returns((IFileSystemPlugin)null); + + MultiFileOptions options = new() + { + FormatPattern = "*$J(.)", + MaxDayTry = 3 + }; + + RolloverFilenameHandler handler = new(baseFileInfo.Object, options); + + // Act & Assert + LinkedList result = null; + Assert.DoesNotThrow(() => result = handler.GetNameList(mockRegistry.Object)); + + Assert.That(result, Is.Not.Null); + Assert.That(result.Count, Is.EqualTo(1)); + } + + /// + /// Verifies that GetNameList correctly finds rollover files when GetLogfileInfo + /// returns a valid ILogFileInfo with FileExists = true. Ensures the null guard + /// does not break the normal happy path. + /// + [Test] + public void GetNameList_WhenRolloverFilesExist_ReturnsAllFiles () + { + // Arrange: base file + var baseFileInfo = new Mock(); + _ = baseFileInfo.Setup(f => f.FileName).Returns("app.log"); + _ = baseFileInfo.Setup(f => f.DirectoryName).Returns("/var/log"); + _ = baseFileInfo.Setup(f => f.DirectorySeparatorChar).Returns('/'); + + // Arrange: rollover file .log.1 exists, .log.2 does not + var rollover1Info = new Mock(); + _ = rollover1Info.Setup(f => f.FileExists).Returns(true); + + var mockFs = new Mock(); + _ = mockFs.Setup(fs => fs.CanHandleUri(It.IsAny())).Returns(true); + + // First call (for .log.1) returns a file that exists + // Second call (for .log.2) returns null (simulating constructor failure) + _ = mockFs.SetupSequence(fs => fs.GetLogfileInfo(It.IsAny())) + .Returns(rollover1Info.Object) + .Returns((ILogFileInfo)null); + + var mockRegistry = new Mock(); + _ = mockRegistry.Setup(r => r.FindFileSystemForUri(It.IsAny())).Returns(mockFs.Object); + + MultiFileOptions options = new() + { + FormatPattern = "*$J(.)", + MaxDayTry = 3 + }; + + RolloverFilenameHandler handler = new(baseFileInfo.Object, options); + + // Act + var result = handler.GetNameList(mockRegistry.Object); + + // Assert: base file + 1 rollover file + Assert.That(result.Count, Is.EqualTo(2)); + } +} \ No newline at end of file diff --git a/src/LogExpert.UI/Controls/LogWindow/LogWindow.cs b/src/LogExpert.UI/Controls/LogWindow/LogWindow.cs index 0c03c1af..13f1755d 100644 --- a/src/LogExpert.UI/Controls/LogWindow/LogWindow.cs +++ b/src/LogExpert.UI/Controls/LogWindow/LogWindow.cs @@ -6302,7 +6302,7 @@ public PersistenceData GetPersistenceData () TabName = Text, SessionFileName = SessionFileName, Columnizer = CurrentColumnizer, - LineCount = _logFileReader.LineCount + LineCount = _logFileReader != null ? _logFileReader.LineCount : 0 }; diff --git a/src/SftpFileSystemx64/SftpLogFileInfo.cs b/src/SftpFileSystemx64/SftpLogFileInfo.cs index 999b799f..cf734148 100644 --- a/src/SftpFileSystemx64/SftpLogFileInfo.cs +++ b/src/SftpFileSystemx64/SftpLogFileInfo.cs @@ -136,7 +136,17 @@ public SftpLogFileInfo (SftpFileSystem sftpFileSystem, Uri fileUri, ILogExpertLo return; } - OriginalLength = _lastLength = Length; + try + { + OriginalLength = _lastLength = Length; + } + catch (Exception e) when (e is SftpPathNotFoundException or + SftpPermissionDeniedException) + { + _logger.LogError(e.Message); + OriginalLength = _lastLength = -1; + } + } #endregion @@ -194,8 +204,17 @@ public long Length { get { - var file = (SftpFile)_sftp.Get(_remoteFileName); - return file.Attributes.Size; + try + { + var file = (SftpFile)_sftp.Get(_remoteFileName); + return file.Attributes.Size; + } + catch (Exception e) when (e is SftpPathNotFoundException or + SftpPermissionDeniedException) + { + _logger.LogError(e.Message); + return -1; + } } } diff --git a/src/setup/LogExpertInstaller.iss b/src/setup/LogExpertInstaller.iss index 257e3a5e..85f7f13a 100644 --- a/src/setup/LogExpertInstaller.iss +++ b/src/setup/LogExpertInstaller.iss @@ -4,7 +4,6 @@ #include "CodeDependencies.iss" #define AppName "LogExpert" -#define AppVersion "1.21.0" #define AppURL "https://github.com/LogExperts/LogExpert" #define AppExeName "LogExpert.exe" @@ -13,6 +12,13 @@ #define SetupName "LogExpert.Installer" #define ReleaseFolder = "..\..\bin\Release" +; AppVersion can be passed via command line (e.g., iscc /dAppVersion="1.21.0"). +; The Nuke build system does this automatically using GitVersion. +; If not provided, it is read from the built executable's file version. +#ifndef AppVersion + #define AppVersion GetFileVersion(AddBackslash(SourcePath) + ReleaseFolder + "\" + AppExeName) +#endif + [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. @@ -186,6 +192,12 @@ Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}" Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}" Name: "{autodesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon +[InstallDelete] +;DELETE ALL DLLs and PDBs and EXEs +Type: files; Name: "{app}\*.dll" +Type: files; Name: "{app}\*.pdb" +Type: files; Name: "{app}\*.exe" + [Run] Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent From b5616db23e773fbbf9fabfad3aceb38f51f1f060 Mon Sep 17 00:00:00 2001 From: BRUNER Patrick Date: Wed, 4 Mar 2026 13:38:41 +0100 Subject: [PATCH 2/4] AssemblyInfo problems fixed --- src/Directory.Build.props | 16 ++++++++-------- src/Solution Items/AssemblyInfo.cs | 8 -------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index c75f5e7a..7b83055f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,14 +1,14 @@ - 1.21.0.0 - 1.21.0.0 - 1.21.0.0 - 1.20.0.0 + 1.31.0.0 + 1.31.0.0 + 1.31.0.0 + 1.31.0.0 Hirogen, zarunbal, RandallFlagg, TheNicker - Log Expert + LogExperts enable enable - false + true false ..\Solution Items\Key.snk false @@ -21,8 +21,8 @@ https://github.com/LogExperts/LogExpert LogExpert, Columnizer, Logging, Windows, Winforms git - https://github.com/LogExperts/LogExpert/releases/tag/v.1.20.0 - 1.21.0.0 + https://github.com/LogExperts/LogExpert/releases/tag/v.1.31.0 + 1.31.0.0 true LogExpert Copyright © LogExpert 2025 diff --git a/src/Solution Items/AssemblyInfo.cs b/src/Solution Items/AssemblyInfo.cs index 29fecd23..8f9e69cf 100644 --- a/src/Solution Items/AssemblyInfo.cs +++ b/src/Solution Items/AssemblyInfo.cs @@ -1,13 +1,5 @@ using System.Reflection; using System.Runtime.InteropServices; -[assembly: AssemblyConfiguration("Release")] -[assembly: AssemblyProduct("LogExpert")] -[assembly: AssemblyCopyright("Original work Copyright (c) 2008-2011 Hagen Raab\r\nModified work Copyright (c) 2024-2026 Zarunbal|Hirogen and many others")] - -[assembly: AssemblyVersion("1.21.0")] -[assembly: AssemblyFileVersion("1.21.0")] -[assembly: AssemblyInformationalVersion("1.21.0 Release")] - [assembly: ComVisible(false)] //warning CA1824: Mark assemblies with NeutralResourcesLanguageAttribute From af3c1f046b410286964ec144844751224a628313 Mon Sep 17 00:00:00 2001 From: BRUNER Patrick Date: Wed, 4 Mar 2026 13:50:37 +0100 Subject: [PATCH 3/4] resources strings got mixed up --- src/LogExpert.Resources/Resources.Designer.cs | 8 ++++---- src/LogExpert.Resources/Resources.de.resx | 10 +++++----- src/LogExpert.Resources/Resources.resx | 8 ++++---- src/LogExpert.Resources/Resources.zh-CN.resx | 8 ++++---- src/LogExpert.UI/Dialogs/SettingsDialog.cs | 3 ++- 5 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/LogExpert.Resources/Resources.Designer.cs b/src/LogExpert.Resources/Resources.Designer.cs index 2d262139..66df7fb7 100644 --- a/src/LogExpert.Resources/Resources.Designer.cs +++ b/src/LogExpert.Resources/Resources.Designer.cs @@ -5691,7 +5691,7 @@ public static string SettingsDialog_UI_Label_labelWorkingDir { } /// - /// Looks up a localized string similar to Some files could not be migrated: {0}. + /// Looks up a localized string similar to Failed to activate portable mode: {0}. /// public static string SettingsDialog_UI_PortableMode_ActivationError { get { @@ -5700,7 +5700,7 @@ public static string SettingsDialog_UI_PortableMode_ActivationError { } /// - /// Looks up a localized string similar to Failed to activate portable mode: {0}. + /// Looks up a localized string similar to Do you want to copy your current settings to the portable configuration folder?. /// public static string SettingsDialog_UI_PortableMode_CopySettingsQuestion { get { @@ -5709,7 +5709,7 @@ public static string SettingsDialog_UI_PortableMode_CopySettingsQuestion { } /// - /// Looks up a localized string similar to Do you want to move the portable settings back to the default configuration folder (%APPDATA%\LogExpert)?. + /// Looks up a localized string similar to Some files could not be migrated: {0}. /// public static string SettingsDialog_UI_PortableMode_MigrationError { get { @@ -5718,7 +5718,7 @@ public static string SettingsDialog_UI_PortableMode_MigrationError { } /// - /// Looks up a localized string similar to Do you want to copy your current settings to the portable configuration folder?. + /// Looks up a localized string similar to Do you want to move the portable settings back to the default configuration folder (%APPDATA%\LogExpert)?. /// public static string SettingsDialog_UI_PortableMode_MoveSettingsQuestion { get { diff --git a/src/LogExpert.Resources/Resources.de.resx b/src/LogExpert.Resources/Resources.de.resx index 99cff1ac..cf75f9f4 100644 --- a/src/LogExpert.Resources/Resources.de.resx +++ b/src/LogExpert.Resources/Resources.de.resx @@ -2134,18 +2134,18 @@ LogExpert neu starten, um die Änderungen zu übernehmen? TabController ist bereits mit einem DockPanel initialisiert - Tragbarer Modus + Portable Modus - Der tragbare Modus konnte nicht aktiviert werden: {0} + Möchten Sie Ihre aktuellen Einstellungen in den Portable-Modus Konfigurationsordner kopieren? - Möchten Sie Ihre aktuellen Einstellungen in den tragbaren Konfigurationsordner kopieren? + Möchten Sie die tragbaren Einstellungen zurück in den Standardkonfigurationsordner (%APPDATA%\LogExpert) verschieben? - Einige Dateien konnten nicht migriert werden: {0} + Der Portable Modus konnte nicht aktiviert werden: {0} - Möchten Sie die tragbaren Einstellungen zurück in den Standardkonfigurationsordner (%APPDATA%\LogExpert) verschieben? + Einige Dateien konnten nicht migriert werden: {0} \ No newline at end of file diff --git a/src/LogExpert.Resources/Resources.resx b/src/LogExpert.Resources/Resources.resx index 862e7fea..b7026d5f 100644 --- a/src/LogExpert.Resources/Resources.resx +++ b/src/LogExpert.Resources/Resources.resx @@ -2146,15 +2146,15 @@ Restart LogExpert to apply changes? Portable Mode - Failed to activate portable mode: {0} + Do you want to copy your current settings to the portable configuration folder? - Do you want to copy your current settings to the portable configuration folder? + Do you want to move the portable settings back to the default configuration folder (%APPDATA%\LogExpert)? - Some files could not be migrated: {0} + Failed to activate portable mode: {0} - Do you want to move the portable settings back to the default configuration folder (%APPDATA%\LogExpert)? + Some files could not be migrated: {0} \ No newline at end of file diff --git a/src/LogExpert.Resources/Resources.zh-CN.resx b/src/LogExpert.Resources/Resources.zh-CN.resx index 426c4786..9206232a 100644 --- a/src/LogExpert.Resources/Resources.zh-CN.resx +++ b/src/LogExpert.Resources/Resources.zh-CN.resx @@ -2054,15 +2054,15 @@ YY[YY] = 年 便携模式 - 无法激活便携模式:{0} + 您想将当前设置复制到便携式配置文件夹吗? - 您想将当前设置复制到便携式配置文件夹吗? + 您想要将可移植设置移回默认配置文件夹 (%APPDATA%\LogExpert) 吗? - 某些文件无法迁移:{0} + 无法激活便携模式:{0} - 您想要将可移植设置移回默认配置文件夹 (%APPDATA%\LogExpert) 吗? + 某些文件无法迁移:{0} \ No newline at end of file diff --git a/src/LogExpert.UI/Dialogs/SettingsDialog.cs b/src/LogExpert.UI/Dialogs/SettingsDialog.cs index 7e7e8867..6f24cc91 100644 --- a/src/LogExpert.UI/Dialogs/SettingsDialog.cs +++ b/src/LogExpert.UI/Dialogs/SettingsDialog.cs @@ -923,7 +923,8 @@ private void OnPortableModeCheckedChanged (object sender, EventArgs e) var markerPath = Path.Join(ConfigManager.PortableConfigDir, ConfigManager.PortableModeSettingsFileName); if (!File.Exists(markerPath)) { - using (File.Create(markerPath)) { } + using (File.Create(markerPath)) + { } } Preferences.PortableMode = true; From 9a7db603ac8bf967c77ab21c6eee8f7c51ce06d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 4 Mar 2026 15:54:59 +0000 Subject: [PATCH 4/4] chore: update plugin hashes [skip ci] --- .../PluginHashGenerator.Generated.cs | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/PluginRegistry/PluginHashGenerator.Generated.cs b/src/PluginRegistry/PluginHashGenerator.Generated.cs index 5e3cfc4c..e01c45ae 100644 --- a/src/PluginRegistry/PluginHashGenerator.Generated.cs +++ b/src/PluginRegistry/PluginHashGenerator.Generated.cs @@ -10,7 +10,7 @@ public static partial class PluginValidator { /// /// Gets pre-calculated SHA256 hashes for built-in plugins. - /// Generated: 2026-03-03 18:45:00 UTC + /// Generated: 2026-03-04 15:54:58 UTC /// Configuration: Release /// Plugin count: 22 /// @@ -18,28 +18,28 @@ public static Dictionary GetBuiltInPluginHashes() { return new Dictionary(StringComparer.OrdinalIgnoreCase) { - ["AutoColumnizer.dll"] = "FBF3B5F93E4D959B15FD70D535E598AD06712926FF02EB7EF39DE4C735E9F473", + ["AutoColumnizer.dll"] = "B0B1B60EC33F9C14F554A093805753CD1FC7C9689ABA78A18911301CE3D5407E", ["BouncyCastle.Cryptography.dll"] = "E5EEAF6D263C493619982FD3638E6135077311D08C961E1FE128F9107D29EBC6", ["BouncyCastle.Cryptography.dll (x86)"] = "E5EEAF6D263C493619982FD3638E6135077311D08C961E1FE128F9107D29EBC6", - ["CsvColumnizer.dll"] = "60F58D71B99CF57824FFF9A0123DA7AD6A4F7EEE6330A2407A0DDCEF8CCA001D", - ["CsvColumnizer.dll (x86)"] = "60F58D71B99CF57824FFF9A0123DA7AD6A4F7EEE6330A2407A0DDCEF8CCA001D", - ["DefaultPlugins.dll"] = "D4FF2FB546A517D68E5DD0BC93577D34AEF3D83DE90F171FEEFB0DCF73971F9D", - ["FlashIconHighlighter.dll"] = "C24A945933F3ADE2B4036EA4CF9D8A38F5851DD44EC2053806F79A8941831333", - ["GlassfishColumnizer.dll"] = "38D5F1AAFA7BC789F4AAFFE224CD4334661ECA9C42A4D9AEF4792C83B57E0518", - ["JsonColumnizer.dll"] = "BD595C314B242584BF7CB786D0879F4B3862897769DB3D4D7EBC14EF34ECF400", - ["JsonCompactColumnizer.dll"] = "37D34D58783F0F090B2048001BA61FBC15D1A3ABCB2703C405F8CEF6C66373BC", - ["Log4jXmlColumnizer.dll"] = "8596D815347363C48B2477ED9E7E0EC6209A6301493037FA096D614863E7A205", - ["LogExpert.Core.dll"] = "B1E4090DC98E18F9B6DD810A095B33CE0D41275164D0D33ED09AFD52A3CE6418", - ["LogExpert.Resources.dll"] = "697B248B748056D1D3CE59F1C24463575B80203C3979B5912A64201BE60336F5", + ["CsvColumnizer.dll"] = "1EC38C3AF3AF71D64F3223F08D0638BBF5565E468CC3FB6D3F3E244BDDA76E6E", + ["CsvColumnizer.dll (x86)"] = "1EC38C3AF3AF71D64F3223F08D0638BBF5565E468CC3FB6D3F3E244BDDA76E6E", + ["DefaultPlugins.dll"] = "7906B85F36FD3808332CD3E2B0D00AF464AC7E011703AAE3AD438E4D9E64482C", + ["FlashIconHighlighter.dll"] = "DBB83532F73E071A099E0357F61BB4BA54B0A7FD322BEC7533F1FCA77373915C", + ["GlassfishColumnizer.dll"] = "C5B3705FE463287FCEF238268CA42B4C1AB2E444AF3E8A0DE2145A68554E8F25", + ["JsonColumnizer.dll"] = "DDE69E8F5003D476918315BD3F1A7F2F919772DB93122F6033ED18CC0DBB022B", + ["JsonCompactColumnizer.dll"] = "D1A7C67B80CEDB21B5B8E4D0234A25BCC899C6216588BA81C3DFE8057F9EFBC8", + ["Log4jXmlColumnizer.dll"] = "04BF19BBC7BCFB6BD21DE44C332463D35207D1C54968B0A44F67A071E533574B", + ["LogExpert.Core.dll"] = "6AEC50B847303F59B22870ADEBE1CF74EB2705BAA5873F410EE61ACBD5463E33", + ["LogExpert.Resources.dll"] = "957BF2E2804899A3775592D0317FBA394ACF7D8D6AAFB63AFAF63251F903A587", ["Microsoft.Extensions.DependencyInjection.Abstractions.dll"] = "67FA4325000DB017DC0C35829B416F024F042D24EFB868BCF17A895EE6500A93", ["Microsoft.Extensions.DependencyInjection.Abstractions.dll (x86)"] = "67FA4325000DB017DC0C35829B416F024F042D24EFB868BCF17A895EE6500A93", ["Microsoft.Extensions.Logging.Abstractions.dll"] = "BB853130F5AFAF335BE7858D661F8212EC653835100F5A4E3AA2C66A4D4F685D", ["Microsoft.Extensions.Logging.Abstractions.dll (x86)"] = "BB853130F5AFAF335BE7858D661F8212EC653835100F5A4E3AA2C66A4D4F685D", - ["RegexColumnizer.dll"] = "1E5046D98B76090715AC2C6382E21B69C74C18EA117C51F7F22FB15852A5F526", - ["SftpFileSystem.dll"] = "56957CB833520F19FD9310ED48699611498D630E9D7A4AFC8D21CF5709E80E0A", - ["SftpFileSystem.dll (x86)"] = "5FA3AD93A01A0DBD934EA7176D1AA977DB9E302F75F03B487B758406A4F9D5F2", - ["SftpFileSystem.Resources.dll"] = "FA042E865EE587587B2C8D9D6AB53A296A24ABFA808606C4A0DE193C152C058E", - ["SftpFileSystem.Resources.dll (x86)"] = "FA042E865EE587587B2C8D9D6AB53A296A24ABFA808606C4A0DE193C152C058E", + ["RegexColumnizer.dll"] = "651ABE3BEA0919D0A3227285F7A2EBB3A15DC553E6086D99E67215E8CA961C38", + ["SftpFileSystem.dll"] = "66AAF4A5346BEB75CEA250A70B82B9242441132BFC706E22D248190960F3C9EB", + ["SftpFileSystem.dll (x86)"] = "D5FCC5BAD62CDA43A56E24464792C48AC9FCF68937CD5FCBAF41E5ED436F4394", + ["SftpFileSystem.Resources.dll"] = "DEABFE508023F01697DF2723F22E512DD53204856B89EF824E441A207B545933", + ["SftpFileSystem.Resources.dll (x86)"] = "DEABFE508023F01697DF2723F22E512DD53204856B89EF824E441A207B545933", }; }