diff --git a/SafeExamBrowser.ResetUtility/App.config b/SafeExamBrowser.ResetUtility/App.config new file mode 100644 index 00000000..56efbc7b --- /dev/null +++ b/SafeExamBrowser.ResetUtility/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.ResetUtility/App.cs b/SafeExamBrowser.ResetUtility/App.cs new file mode 100644 index 00000000..9dc818ca --- /dev/null +++ b/SafeExamBrowser.ResetUtility/App.cs @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using System; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using SafeExamBrowser.ResetUtility.Procedure; + +namespace SafeExamBrowser.ResetUtility +{ + public class App : Application + { + private static readonly Mutex Mutex = new Mutex(true, "safe_exam_browser_reset_mutex"); + private CompositionRoot instances = new CompositionRoot(); + + [STAThread] + public static void Main() + { + try + { + StartApplication(); + } + catch (Exception e) + { + MessageBox.Show(e.Message + "\n\n" + e.StackTrace, "Fatal Error", MessageBoxButton.OK, MessageBoxImage.Error); + } + finally + { + Mutex.Close(); + } + } + + private static void StartApplication() + { + if (NoInstanceRunning()) + { + new App().Run(); + } + else + { + MessageBox.Show("You can only run one instance of the Reset Utility at a time.", "Startup Not Allowed", MessageBoxButton.OK, MessageBoxImage.Information); + } + } + + private static bool NoInstanceRunning() + { + return Mutex.WaitOne(TimeSpan.Zero, true); + } + + protected override void OnStartup(StartupEventArgs e) + { + base.OnStartup(e); + + instances.BuildObjectGraph(); + instances.LogStartupInformation(); + + MainWindow = instances.MainWindow; + MainWindow.Show(); + + Task.Run(new Action(RunApplication)); + } + + private void RunApplication() + { + for (var step = instances.InitialStep; ; step = step.GetNextStep()) + { + var result = step.Execute(); + + if (result == ProcedureStepResult.Terminate) + { + break; + } + } + + Dispatcher.Invoke(Shutdown); + } + + protected override void OnExit(ExitEventArgs e) + { + instances.LogShutdownInformation(); + + base.OnExit(e); + } + } +} diff --git a/SafeExamBrowser.ResetUtility/AppContext.cs b/SafeExamBrowser.ResetUtility/AppContext.cs new file mode 100644 index 00000000..f376a932 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/AppContext.cs @@ -0,0 +1,18 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using SafeExamBrowser.Contracts.Logging; + +namespace SafeExamBrowser.ResetUtility +{ + internal class AppContext + { + internal ILogger Logger { get; set; } + internal IUserInterface UserInterface { get; set; } + } +} diff --git a/SafeExamBrowser.ResetUtility/CompositionRoot.cs b/SafeExamBrowser.ResetUtility/CompositionRoot.cs new file mode 100644 index 00000000..15a76f4b --- /dev/null +++ b/SafeExamBrowser.ResetUtility/CompositionRoot.cs @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using System; +using System.IO; +using System.Windows; +using SafeExamBrowser.Contracts.Logging; +using SafeExamBrowser.Logging; +using SafeExamBrowser.ResetUtility.Procedure; +using SafeExamBrowser.ResetUtility.UserInterface; + +namespace SafeExamBrowser.ResetUtility +{ + internal class CompositionRoot + { + private ILogger logger; + + internal Window MainWindow { get; private set; } + internal ProcedureStep InitialStep { get; private set; } + + internal void BuildObjectGraph() + { + InitializeLogging(); + + var context = new AppContext + { + Logger = logger, + UserInterface = new MainWindow() + }; + + MainWindow = context.UserInterface as Window; + InitialStep = new Initialization(context); + } + + internal void LogStartupInformation() + { + logger.Log($"# Application started at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); + logger.Log(string.Empty); + } + + internal void LogShutdownInformation() + { + logger?.Log($"# Application terminated at {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")}"); + } + + private void InitializeLogging() + { + var appDataFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), nameof(SafeExamBrowser)); + var logFolder = Path.Combine(appDataFolder, "Logs"); + var logFilePrefix = DateTime.Now.ToString("yyyy-MM-dd\\_HH\\hmm\\mss\\s"); + var logFilePath = Path.Combine(logFolder, $"{logFilePrefix}_{nameof(ResetUtility)}.log"); + var logFileWriter = new LogFileWriter(new DefaultLogFormatter(), logFilePath); + + logger = new Logger(); + logger.LogLevel = LogLevel.Debug; + logger.Subscribe(logFileWriter); + logFileWriter.Initialize(); + } + } +} diff --git a/SafeExamBrowser.ResetUtility/IUserInterface.cs b/SafeExamBrowser.ResetUtility/IUserInterface.cs new file mode 100644 index 00000000..0c922b2a --- /dev/null +++ b/SafeExamBrowser.ResetUtility/IUserInterface.cs @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +namespace SafeExamBrowser.ResetUtility +{ + internal interface IUserInterface + { + } +} diff --git a/SafeExamBrowser.ResetUtility/Images/SafeExamBrowser.ico b/SafeExamBrowser.ResetUtility/Images/SafeExamBrowser.ico new file mode 100644 index 00000000..abdc4635 Binary files /dev/null and b/SafeExamBrowser.ResetUtility/Images/SafeExamBrowser.ico differ diff --git a/SafeExamBrowser.ResetUtility/Images/SafeExamBrowser.png b/SafeExamBrowser.ResetUtility/Images/SafeExamBrowser.png new file mode 100644 index 00000000..c56dd2b0 Binary files /dev/null and b/SafeExamBrowser.ResetUtility/Images/SafeExamBrowser.png differ diff --git a/SafeExamBrowser.ResetUtility/Procedure/Initialization.cs b/SafeExamBrowser.ResetUtility/Procedure/Initialization.cs new file mode 100644 index 00000000..fb8b6065 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Procedure/Initialization.cs @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +namespace SafeExamBrowser.ResetUtility.Procedure +{ + internal class Initialization : ProcedureStep + { + public Initialization(AppContext context) : base(context) + { + } + + internal override ProcedureStepResult Execute() + { + System.Threading.Thread.Sleep(5000); + + if (SebNotRunning() && IsAdmin()) + { + return ProcedureStepResult.Continue; + } + else + { + return ProcedureStepResult.Terminate; + } + } + + internal override ProcedureStep GetNextStep() + { + return new MainMenu(Context); + } + + private bool IsAdmin() + { + return false; + } + + private bool SebNotRunning() + { + return false; + } + } +} diff --git a/SafeExamBrowser.ResetUtility/Procedure/MainMenu.cs b/SafeExamBrowser.ResetUtility/Procedure/MainMenu.cs new file mode 100644 index 00000000..209a0cf3 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Procedure/MainMenu.cs @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using System; + +namespace SafeExamBrowser.ResetUtility.Procedure +{ + internal class MainMenu : ProcedureStep + { + public MainMenu(AppContext context) : base(context) + { + } + + internal override ProcedureStepResult Execute() + { + throw new NotImplementedException(); + } + + internal override ProcedureStep GetNextStep() + { + throw new NotImplementedException(); + } + } +} diff --git a/SafeExamBrowser.ResetUtility/Procedure/ProcedureStep.cs b/SafeExamBrowser.ResetUtility/Procedure/ProcedureStep.cs new file mode 100644 index 00000000..d1e55b74 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Procedure/ProcedureStep.cs @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +namespace SafeExamBrowser.ResetUtility.Procedure +{ + internal abstract class ProcedureStep + { + protected AppContext Context { get; } + + internal ProcedureStep(AppContext context) + { + Context = context; + } + + internal abstract ProcedureStepResult Execute(); + internal abstract ProcedureStep GetNextStep(); + } +} diff --git a/SafeExamBrowser.ResetUtility/Procedure/ProcedureStepResult.cs b/SafeExamBrowser.ResetUtility/Procedure/ProcedureStepResult.cs new file mode 100644 index 00000000..0b50c157 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Procedure/ProcedureStepResult.cs @@ -0,0 +1,16 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +namespace SafeExamBrowser.ResetUtility.Procedure +{ + internal enum ProcedureStepResult + { + Continue, + Terminate + } +} diff --git a/SafeExamBrowser.ResetUtility/Properties/AssemblyInfo.cs b/SafeExamBrowser.ResetUtility/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..d1172a74 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Properties/AssemblyInfo.cs @@ -0,0 +1,51 @@ +using System.Reflection; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("SafeExamBrowser.ResetUtility")] +[assembly: AssemblyDescription("Safe Exam Browser")] +[assembly: AssemblyCompany("ETH Zürich")] +[assembly: AssemblyProduct("Safe Exam Browser")] +[assembly: AssemblyCopyright("Copyright © 2019 ETH Zürich, Educational Development and Technology (LET)")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: AssemblyInformationalVersion("1.0.0.0")] diff --git a/SafeExamBrowser.ResetUtility/Properties/Resources.Designer.cs b/SafeExamBrowser.ResetUtility/Properties/Resources.Designer.cs new file mode 100644 index 00000000..13bb97ed --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Properties/Resources.Designer.cs @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SafeExamBrowser.ResetUtility.Properties +{ + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources + { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() + { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager + { + get + { + if ((resourceMan == null)) + { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SafeExamBrowser.ResetUtility.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture + { + get + { + return resourceCulture; + } + set + { + resourceCulture = value; + } + } + } +} diff --git a/SafeExamBrowser.ResetUtility/Properties/Resources.resx b/SafeExamBrowser.ResetUtility/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SafeExamBrowser.ResetUtility/Properties/Settings.Designer.cs b/SafeExamBrowser.ResetUtility/Properties/Settings.Designer.cs new file mode 100644 index 00000000..cecbf05e --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Properties/Settings.Designer.cs @@ -0,0 +1,30 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SafeExamBrowser.ResetUtility.Properties +{ + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "11.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase + { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default + { + get + { + return defaultInstance; + } + } + } +} diff --git a/SafeExamBrowser.ResetUtility/Properties/Settings.settings b/SafeExamBrowser.ResetUtility/Properties/Settings.settings new file mode 100644 index 00000000..033d7a5e --- /dev/null +++ b/SafeExamBrowser.ResetUtility/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.ResetUtility/SafeExamBrowser.ResetUtility.csproj b/SafeExamBrowser.ResetUtility/SafeExamBrowser.ResetUtility.csproj new file mode 100644 index 00000000..fbca7ae6 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/SafeExamBrowser.ResetUtility.csproj @@ -0,0 +1,135 @@ + + + + + Debug + AnyCPU + {61167B0C-9C42-46AC-8C48-1EDC48C28D98} + WinExe + SafeExamBrowser.ResetUtility + SafeExamBrowser.ResetUtility + v4.7.2 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + true + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + true + bin\x86\Debug\ + DEBUG;TRACE + full + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + bin\x86\Release\ + TRACE + true + pdbonly + x86 + prompt + MinimumRecommendedRules.ruleset + true + + + Images\SafeExamBrowser.ico + + + + + + 4.0 + + + + + + + + MSBuild:Compile + Designer + + + + + + + MainWindow.xaml + Code + + + + + + + + + Code + + + True + True + Resources.resx + + + True + Settings.settings + True + + + ResXFileCodeGenerator + Resources.Designer.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + {47da5933-bef8-4729-94e6-abde2db12262} + SafeExamBrowser.Contracts + + + {386b6042-3e12-4753-9fc6-c88ea4f97030} + SafeExamBrowser.Lockdown + + + {e107026c-2011-4552-a7d8-3a0d37881df6} + SafeExamBrowser.Logging + + + + + + + + + + \ No newline at end of file diff --git a/SafeExamBrowser.ResetUtility/UserInterface/MainWindow.xaml b/SafeExamBrowser.ResetUtility/UserInterface/MainWindow.xaml new file mode 100644 index 00000000..3fe8f6b3 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/UserInterface/MainWindow.xaml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/SafeExamBrowser.ResetUtility/UserInterface/MainWindow.xaml.cs b/SafeExamBrowser.ResetUtility/UserInterface/MainWindow.xaml.cs new file mode 100644 index 00000000..b1ee6b03 --- /dev/null +++ b/SafeExamBrowser.ResetUtility/UserInterface/MainWindow.xaml.cs @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2019 ETH Zürich, Educational Development and Technology (LET) + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +using System.Windows; + +namespace SafeExamBrowser.ResetUtility.UserInterface +{ + public partial class MainWindow : Window, IUserInterface + { + public MainWindow() + { + InitializeComponent(); + } + } +} diff --git a/SafeExamBrowser.sln b/SafeExamBrowser.sln index b124b003..c4fbdfc5 100644 --- a/SafeExamBrowser.sln +++ b/SafeExamBrowser.sln @@ -66,6 +66,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeExamBrowser.Lockdown", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeExamBrowser.Lockdown.UnitTests", "SafeExamBrowser.Lockdown.UnitTests\SafeExamBrowser.Lockdown.UnitTests.csproj", "{90378E33-3898-4A7C-BE2D-2F3EFCFC4BB5}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SafeExamBrowser.ResetUtility", "SafeExamBrowser.ResetUtility\SafeExamBrowser.ResetUtility.csproj", "{61167B0C-9C42-46AC-8C48-1EDC48C28D98}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -282,6 +284,14 @@ Global {90378E33-3898-4A7C-BE2D-2F3EFCFC4BB5}.Release|Any CPU.Build.0 = Release|Any CPU {90378E33-3898-4A7C-BE2D-2F3EFCFC4BB5}.Release|x86.ActiveCfg = Release|x86 {90378E33-3898-4A7C-BE2D-2F3EFCFC4BB5}.Release|x86.Build.0 = Release|x86 + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Debug|x86.ActiveCfg = Debug|x86 + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Debug|x86.Build.0 = Debug|x86 + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Release|Any CPU.Build.0 = Release|Any CPU + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Release|x86.ActiveCfg = Release|x86 + {61167B0C-9C42-46AC-8C48-1EDC48C28D98}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE