From dc48fa1239f70f4b1d58a71151b9cc20c9372e4d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 11:29:03 -0500 Subject: [PATCH 001/230] Add DirecTV firmware filename parser helper Introduced a helper method to extract manufacturer, model, version, and tar metadata from DirecTV firmware filenames using regular expressions. --- MainWindow.xaml.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index d9042355..3cb9135c 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -8,6 +8,7 @@ using System; using System.Windows.Controls; using System.Collections.Generic; +using System.Text.RegularExpressions; namespace ProcessorEmulator { @@ -599,6 +600,14 @@ public static string AnalyzeFirmware(string filePath) } } + // Helper to parse DirecTV firmware filename metadata + private (string Manufacturer, string Model, string Version, string Tar)? ParseDirecTVFilename(string fileName) + { + var m = Regex.Match(fileName, @"image_mfr-(\d+)_mdl-([0-9a-z]+)_ver-(\d+)_tar-([0-9a-f]+)\\.csw", RegexOptions.IgnoreCase); + if (!m.Success) return null; + return (m.Groups[1].Value, m.Groups[2].Value, m.Groups[3].Value, m.Groups[4].Value); + } + /// /// Simulates DirecTV SWM switches and/or LNBs. /// Currently a stub; intended for future simulation and testing. From aaa290f2880963a8c1d6e98c1ed7763c22320f60 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:59:57 -0500 Subject: [PATCH 002/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 80 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 3cb9135c..bfbcfd9f 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -99,6 +99,7 @@ private async void StartEmulation_Click(object sender, "Emulate CMTS Head End", "Uverse Box Emulator", "DirecTV Box/Firmware Analysis", + "Executable Analysis", "Linux Filesystem Read/Write" }; string mainChoice = PromptUserForChoice("What would you like to do?", mainOptions); @@ -133,6 +134,9 @@ private async void StartEmulation_Click(object sender, case "DirecTV Box/Firmware Analysis": await HandleDirectvAnalysis(); break; + case "Executable Analysis": + await HandleExecutableAnalysis(); + break; case "Linux Filesystem Read/Write": await HandleLinuxFsReadWrite(); break; @@ -288,6 +292,81 @@ private async Task HandleDirectvAnalysis() await Task.CompletedTask; } + /// + /// Analyzes arbitrary executables or binaries to detect architecture and format. + /// + private async Task HandleExecutableAnalysis() + { + // Select executable file + var dlg = new OpenFileDialog + { + Filter = "Executables and Binaries (*.exe;*.dll;*.bin;*.so)|*.exe;*.dll;*.bin;*.so|All Files (*.*)|*.*" + }; + if (dlg.ShowDialog() != true) return; + string filePath = dlg.FileName; + StatusBarText($"Analyzing executable: {Path.GetFileName(filePath)}"); + byte[] data = File.ReadAllBytes(filePath); + // Determine format and architecture + string format = (data.Length > 4 && data[0] == 0x7F && data[1] == (byte)'E' && data[2] == (byte)'L' && data[3] == (byte)'F') ? "ELF" : "PE"; + string arch = ArchitectureDetector.Detect(data); + string bitness = "Unknown"; + if (format == "PE" && data.Length > 0x40) + { + int peOffset = BitConverter.ToInt32(data, 0x3C); + ushort machine = BitConverter.ToUInt16(data, peOffset + 4); + bitness = machine switch + { + 0x14c => "x86", + 0x8664 => "x64", + 0x1c0 => "ARM", + 0xaa64 => "ARM64", + _ => "Unknown" + }; + } + else if (format == "ELF" && data.Length > 5) + { + bitness = data[4] == 1 ? "32-bit" : data[4] == 2 ? "64-bit" : "Unknown"; + } + var output = new List + { + $"File: {Path.GetFileName(filePath)}", + $"Format: {format}", + $"Architecture: {arch}", + $"Bitness: {bitness}" + }; + ShowTextWindow("Executable Analysis", output); + StatusBarText("Executable analysis complete."); + // Prompt to launch emulator + var choice = PromptUserForChoice("Launch emulator for this executable?", new[] { "Homebrew", "QEMU", "No" }); + if (choice == "Homebrew") + { + try + { + var home = new HomebrewEmulator(arch); + home.LoadBinary(data); + home.Run(); + StatusBarText("Homebrew emulation complete."); + } + catch (NotImplementedException) + { + MessageBox.Show("Homebrew emulator not supported for this architecture.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); + } + } + else if (choice == "QEMU") + { + try + { + EmulatorLauncher.Launch(filePath, arch); + StatusBarText("QEMU emulation started."); + } + catch (Exception ex) + { + MessageBox.Show($"Emulation error: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + } + } + await Task.CompletedTask; + } + // Core feature handlers /// @@ -645,6 +724,7 @@ private async Task HandleSwmLnbSimulation() await Task.CompletedTask; } + // All duplicate methods/helpers have been removed for clarity. } } \ No newline at end of file From 01c75c85d307ffa2a27f081489ebfff0dcb4b87f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 19:59:59 -0500 Subject: [PATCH 003/230] Update ProcessorEmulator.exe --- .../net6.0-windows/ProcessorEmulator.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/Release/net6.0-windows/ProcessorEmulator.exe b/bin/Release/net6.0-windows/ProcessorEmulator.exe index 5a3576a5dde8049ae06b6ac806daaec45b491ecf..3d80cf54616aeec8b37007a9cdcbfa68329ae49b 100644 GIT binary patch delta 99 zcmWNHxeb6o5ChF+bi;iDY9Jtm@E)k+0?Ht#0VLXE(yuI@G4vQ`xZO*)li k<>WP!M-6yTrmKqViO!Hq)$ delta 99 zcmZpe!`T2tEsR^3BE0<*84MVb7|a<=fMha*ArM Date: Tue, 8 Jul 2025 20:00:04 -0500 Subject: [PATCH 004/230] Create .NETCoreApp,Version=v6.0.AssemblyAttributes.cs --- .../.NETCoreApp,Version=v6.0.AssemblyAttributes.cs | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 obj/Debug/net6.0-windows/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs diff --git a/obj/Debug/net6.0-windows/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs b/obj/Debug/net6.0-windows/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs new file mode 100644 index 00000000..ed926950 --- /dev/null +++ b/obj/Debug/net6.0-windows/.NETCoreApp,Version=v6.0.AssemblyAttributes.cs @@ -0,0 +1,4 @@ +// +using System; +using System.Reflection; +[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")] From c0483add339e85ce94bb10decf0cc9f21ef7f0e2 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:06 -0500 Subject: [PATCH 005/230] Create ProcessorEmulator.AssemblyInfo.cs --- .../ProcessorEmulator.AssemblyInfo.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs new file mode 100644 index 00000000..7c13fa20 --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -0,0 +1,24 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Reflection; + +[assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] +[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] +[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dc48fa1239f70f4b1d58a71151b9cc20c9372e4d")] +[assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] +[assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] +[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] +[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")] +[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")] + +// Generated by the MSBuild WriteCodeFragment class. + From f35589fff4acd2af075f8a8d33ff463f503cccbf Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:09 -0500 Subject: [PATCH 006/230] Create ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 1 + 1 file changed, 1 insertion(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache new file mode 100644 index 00000000..c06878c2 --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -0,0 +1 @@ +de610e942b4247181a2afb4fd75c6e80b66c8334f57bf0c13406769229df09fc From 17d85bef698960abff7e6394463c637286d9eeda Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:12 -0500 Subject: [PATCH 007/230] Create ProcessorEmulator.assets.cache --- .../net6.0-windows/ProcessorEmulator.assets.cache | Bin 0 -> 152 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache new file mode 100644 index 0000000000000000000000000000000000000000..2a7c798742856d17faed4620771b8f4e320c7d57 GIT binary patch literal 152 zcmWIWc6a1qU| Date: Tue, 8 Jul 2025 20:00:18 -0500 Subject: [PATCH 008/230] Create ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig --- ...tor.GeneratedMSBuildEditorConfig.editorconfig | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig new file mode 100644 index 00000000..c71f476c --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig @@ -0,0 +1,16 @@ +is_global = true +build_property.TargetFramework = net6.0-windows +build_property.TargetPlatformMinVersion = 7.0 +build_property.UsingMicrosoftNETSdkWeb = +build_property.ProjectTypeGuids = +build_property.InvariantGlobalization = +build_property.PlatformNeutralAssembly = +build_property.EnforceExtendedAnalyzerRules = +build_property._SupportedPlatformList = Linux,macOS,Windows +build_property.RootNamespace = ProcessorEmulator +build_property.ProjectDir = C:\Users\juler\Documents\GitHub\Processor-Emulator\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = +build_property.CsWinRTUseWindowsUIXamlProjections = false +build_property.EffectiveAnalysisLevelStyle = 6.0 +build_property.EnableCodeStyleSeverity = From 8d58667bbdfe0c96031c974618c3261acb37c34a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:21 -0500 Subject: [PATCH 009/230] Update apphost.exe --- obj/Release/net6.0-windows/apphost.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Release/net6.0-windows/apphost.exe b/obj/Release/net6.0-windows/apphost.exe index 5a3576a5dde8049ae06b6ac806daaec45b491ecf..3d80cf54616aeec8b37007a9cdcbfa68329ae49b 100644 GIT binary patch delta 99 zcmWNHxeb6o5ChF+bi;iDY9Jtm@E)k+0?Ht#0VLXE(yuI@G4vQ`xZO*)li k<>WP!M-6yTrmKqViO!Hq)$ delta 99 zcmZpe!`T2tEsR^3BE0<*84MVb7|a<=fMha*ArM Date: Tue, 8 Jul 2025 20:00:24 -0500 Subject: [PATCH 010/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 26c1fa8f..5f6b9208 100644 --- a/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Release")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f100914f286186c3193f9821cb303cb0af031da7")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dc48fa1239f70f4b1d58a71151b9cc20c9372e4d")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 775838248b91282ea3003e92dfa6f927d5cf1079 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:26 -0500 Subject: [PATCH 011/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index f176c71d..07222203 100644 --- a/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Release/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -9b723479abda447a05a0662a1058e6a83bcb5bb6fdf8e5c30003b43b95788a34 +71a6c17d2746c7e42b29215b40d8624f846ad96d1e7487c22c366ab5b731b5ec From 88a8a1f4551bdf06acbe8eb93dc54e671eb00388 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:29 -0500 Subject: [PATCH 012/230] Update ProcessorEmulator.csproj.CoreCompileInputs.cache --- .../ProcessorEmulator.csproj.CoreCompileInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache b/obj/Release/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache index 97b4e082..daf6d2da 100644 --- a/obj/Release/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache +++ b/obj/Release/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -0f619334f20bc2a4fa7948555fab2baacf7ec01f4e76635cd15fcebc33fa0c8d +45f5e5ef0fa86f600c253ae910c745656ae6d29590df0acdd8b231d6ced771c1 From a242c5445abc5c221bfffa95130546d7b4d60d6f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:31 -0500 Subject: [PATCH 013/230] Update ProcessorEmulator.dll --- .../net6.0-windows/ProcessorEmulator.dll | Bin 111616 -> 115712 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator.dll b/obj/Release/net6.0-windows/ProcessorEmulator.dll index ad24e0b4c885137810ca8a574227822ecc1d9f27..928d884a8a237813f170d5c32c9a38043bcb2e9c 100644 GIT binary patch literal 115712 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 Aq5uE@ literal 111616 zcmd4431C#!`96H+&g9NylE5S(lZ7Q=30yNtgoGs!mas3Pf}jT6P!Ts|@D6TF1_712 zqNt#v;!?HZR;BKBsY`KbYpq)Aing^%t!>q6Ypvq{dERsG%uNVtf8YQ2eP3YCd7t+^ z=RMnd*1PSy@DdeNN`>(I<{PCRgwMY=alhSJ4RMd^hkK}d^MBRk=>mJi`~Iam6vGuK|a6k%Da(bsydqVhRMe@2-rx+b>t{KAC@LLlW!u0?eHl=824O>1>MN44V34~=q8K2N ze>;Qf0{IBJVIfD5gi(Rp7fLhvB%OYq{zFVL{}=RI!3=6NRHs;uqy9J3aY|8nR!Aq; z&q}k5bpw#T5MZ#bgdqeNtPo)cfxNLD_koWb7pHomCZo2MIUS+wVCD>XmQ#%?OV+?? zsL;UPWtSmf3XK{~4q$~^P6;w%rx_tRkQ^kHtAhmeqXCOcl!M_Qnt|zsN|cq^CVpAw zZt*)b+krtOblr_YJY<~l1~c9jCf=1M-X9}urS^iia+$UM`0BR3 zt$3Xk-%!18bJ!~1P`$7bxV(<#w-oaSQ_AM=2PU0!O*-pzI-2dEB$B_7YCw{(yJ81= zqV7qsaR;iRrQwqBt~iV?kgNxE8sJ22rxD&@JLv399tOQ=K`>nI30DoL}f;kEpQ6K{$b}(gk3@v73Y_?m*yAe7f03~-*jE1KA7KdLf9D%1*HYf7BZ zh%=7Ld$|V&)N=PsIPvP3GakIbb@>c>0ay~WDBlZOW9=5yT?k&pT?*Hkz`W;K=`d zOEcu$>2oO#Oto$!A|)r19EfoEJEJW*DF=UcR9kW~VMTHZy?AmeJu5j4 zUS=&ylA2D2i9Dz+H3Kj?6HY-mISZbQg|$KHq+T$kO!(aiXxPWokem%_u$|f$-hUZ2 zvj$ny8L-o&wXW2DROQZQp)ogSwazz%E>F%Ow<0+gUZIX3G1*A7v|)*6_sXmWh+tgm z%W>%dgig+bV@seUrgP*w%`hBSLJE@%mm8S3*!aQZ(`dG+26iYf`AfFqU@I8nL}i;X zVk_e0Gmdj0)gJ^WYP$!pkq-vlP-MG@dZ6BRmw>Lb-42gM`8p5Oj|;9pzG_%`5aUsG zb1YcCq2>apZ?@e_7!AUTVZA7v(_92$^*)}&yE}$1rE~K|dJIz|I-(WLmBcqdpe7)m3+~ItKErj$ypEI2moiKi%1bof_c0&K-TNX@C^gDbZTp=R(Ot3Cfd) zY433D9ihEN@T5EFuB68VoeQ15r7&TL4a@Lt$>P$jQ{=qU2(K;M*n+-7v#s�#gBhCZ0-`QDdiZo)W^`O`bX=-+XtslKf;x!0=;-Ow zfle&>xX|c0U+d6p2O|!35OvXkolCYp?ld~?GCJpEvmYSk#$iKxJCI%e zbKQxVP5y%Ajdrl2u_`e%wBkgluy)x4F!Jhw{7Be!U1$YXq2zN!)_e}|+;A{~x@qom zBw@L?!IhaEoEN%q)?3a|h-0OWhMPeNurm-6=7?o3I)@(XL+Tt$=gUenlv|Yt)w^u0 zo$S(ekKZd?bYX$?qsGur*p><-d(5!&qBDl~OGxGVRdi&dD@rIBCP zv)$=xvZ`z1$rGS9zPYZ-{Rm;;*|vB!+MA@k#oAk?y-nJ?TYKBJ_m=iP)m|tpS}L?R zR(p%Iw@Q0AYVT?7?bKc*BJnWRGA}cw=zUUCOusu0iSOm#dlJ1pA zH#v@EY8ligCxA>QLD}W)QMGry5mV?!*?O-`+a~)~d^~T81AA@Kwr0d=S4bF1J zh}N8oj1=fhB(aW&CS5p%EpH=>C6_u&uAQ7hez>;0y&yS_WPWliJSnSQ z2#0Ih@|-{-uV!_0j+LCjFvX$D!|KEC3rH-H=e`0jISc&Ky!_;N_}F|+)ZXbx85`X8 zQfzapqZ69H`Q{rG?hJ6pl!M;Uqr}=3#~j!@2}_Q?#l8{1TnfsSSx^Hu|vMGiq6hO0H&1%Qow2mbH&BU$05}R_1l_ zgPAwP4`tpIzbx}R@jG-d2iloGqAq3a>(lwN#IZ8J6+f7HMf|eNOX7EEu>)(TE~2ci zpjw3d^@A>J)f(hGm|6=rgK7y`X}Za?fUyEYM$kQ~hm<=jz$j7fH8jstgbwOKMY(dK zqIojFh$&kR)>F3ZEfPozYdrS3K}_Z;QEFu{ph0GG~O0SL2Jf!^C^X z#KQoI_#K+%4}-kY-HEH z5dz&i?=lljb?hRH(}4_<3|YuwOkI>Dt{{$Q&`&~jZZLj=l_n>&47>gloO7TH=eZ)} zSZ496hU(8Ya85*3arwLye&XY`I-ZqgSZ5vMX}YT2i;nm~^%KM&fcU}cvc)yugq1oX zYS*-clp0ZG*Hpl7oMPADOhkP08>b{@*)?-WAw)ZU#5k9JNn)rKbTC!gb?}!NAEgq! z-1sQ9V3&SLpgL~sBH+HuN)j6g*zU&!D0-qK;Qliw5aTe56`s|weFsYZV~eYM9uW;z z7t${X)_j8wcSNC;W(9|}XK#$OZ_#Hw|82Yl5--THM-7tnB%P>92U9Q8vBL<4dj0S7 zb;SQLUyJ^S@s8Y5cRn^=1*qhMVH^!bA-A6g>ceP0nh}rbQDA*VKnO4}Qfh_}U|@*S z3?ab4_@Ws?;Hu40NTKdYWB9=g#*B~^@ zyS!M1anQXt7cw_k)va_N0Y8|_nU!W~Fy>#t@?(xcf8Buc)UrJPq>c;(I#lvPkkP~u z7~d`eRZu-pug?lgEVrr9E0k3daMnYt3uL*6camHT$@=5 zCAAC9zx!G#u9mJzDjqm&ta)oltwoK79CGAJr;=9>7>Q?Wzk6-0Ri!jdnvs~rY?9Lj~m9@!AU5X0IV8DfuvyN~r4x=|FOtM1B%UFFp zW`L~()CBm0VJlXeVUoXuHR^!L%MmV`C`4;+1eJUQ640AKH~dAnEE+Jo3f61ja#cB0 zx9b4Qc?&TTU-(OqYlcR57Ba4zveCWNNB`1CM|yZ+rn&op_St>5X&c?!vY{H?zxn7v zJ-yhC?x9(Fn!5#b_nQ8h4Tbe>EEju)kG?BQPjf#7-MyyS#kts*`{);ZG)4bTW`NL zF_>FQG)zD+jv5kdT+p47jnf)*=VZa?#H194GTXuUXxF8#CV8chH;~*SF(QAVJjr_fsyz4nY;H&9`N}aW&%Hb=smt?K1d`9LsT%qv>Z~*q4dx|hv;M3! z(*?p^JVZW{2=a3vBU|l;NS>g6%hVf?_f0pt0G5!SO zw;6w;@h8#W^S0%AnnK05Zd;^pLY*2SWkdnF`KqqQrllI2nCc@6gVhD}gMH{0S!p(7 zX{a>M9(^l{WLLCqqgP$CU}^+J9)6qg!)jZ6G@aVl&{$)r7IZA7m4r8HKeDmC)NVn~ z*^R#dd~~_p_(y<`L18!kqEb7tqO0;nOTazcODZ3QI0}q?{fxz6j4cUQSD4*j*nN>T zcM8Uxk}wV)v(*^(?f$~P-CuF2IIq~|c1!kKqv1PJpHh{mQmM)U?9aZzKJYkf1X+vR z0h$WMo{-jaRJ5O*(r*q~a*k zCH_Zx8oSdIR4*exs4w&@sTviWX($~=L<{YTo{%^W}F52$rE#EKR?&mGvFCNZY4hrR#5OT!AS+Q=vAg&$n z2P$<9sxt{2HrE+Ka{p`tY{W`)-hFWrtduLEXefCdTx?Nx#oNG>y9mpj>%qI3VUoBB zF1Nk*Hm#nIdZI0$jyXRx;qO402l0CvzZdbtPFU^4?=$>(0jLl^biio~WB?ohv=V}; z@NtNWZ0@^YDo#n&O#EuVHu~_f zjSPMGIFY2Yn9asMat+!QYsq4FJaTTO88g`qVQ$dE*<(e8clNlF<&y;rR!I_gAp@Te zlgF81r_)7|G7B}|_jJ){JREWAqwb|lD#O0C(tQ@RZ#!wFS&HnTBg=6b%7KL<`nrgc zHzQ(0-2Idh-N*o_LVnCSo)_j8aH8%Y2z|Qk_4Pw++;@0pbB&Gr4yQI(+7%nBXE&GF zl^d$3H5a(YQJLh+y(3F@KKI<=@pVf7e?0fx{aDO1BiI*4SZ#qqfHB!)2m!_vk0AsY zQ$2TpxnM4jTa<_+2PIR2Iq$U5$~RgqWty8S2m$ZF%X6F zsQgR@&57IIc4gcUtp+A$c311h>VNt##p!!f?GE)|c$#b&)!A&Azv4 zoXJ~Ll{(dQPm~2c^(5%XFqh{1nDdz>dqRe_Qnyo%?P2bOb(X}-pzCDzAsI}jK`<4N2URji(>ndXz>VXY{b$u~`toQx2;c*I7e%KPxSf zP64RTbJmi_e}<{*+ilN+{!6nR z-W-J_gV;-jGBA)(-D6goetmCqW_BBbxsTD=4o9CdIai=Yg3eW}mlxbGD2xq)Q%`3S z9Op`iwBV?$V6`VeEh62`2;y8#=Njti{O>k%)YDHN@f?60Sv9#+oq5FZ4BFc}sUfHH zNsS1#UBpml{n?kDn~)UGYHo%vXEmZJ&9L5C4QZU!nCP;O+=BScwAY$%KppWC4r}_4 zh+$(KYm%VylurDAMGSx@ooPLHU3BQ|(@kYHoC2g#9plpL`~$)fpaRhJnd}7jmdr&M6}V3-md5}G%VU3oEq5ohl{-I0G-zu%8)5XMhh0q+`u+_)yoXGl zgm50A_JtAmBSgYoZrQaEjuxD+5wbU*3QQy)Lol3HRN;2C$4TPOct-H81|j(wBn@xx zC@jva4+CQB5PfS$aPSW0WqU#jH>#mw0~mHJoB|BF*gUF*si#ODF62+4BXa~veGM|T z7Pr@B4iwqBByos}80$%5t_OJ~N$j*hUQcp?khhUsDCDCg4-xWdCUhuC=TRhtvT|Sl z+kjFd(N0#H*>PvpBLDY8ocuY08|HD{G1qm++|nKM{_dDBcE|j%J7#2XH(46o9dm4V z%!9gPuIR+9?&)<3UP@r6;Qbdj)>g>X1a^h<5&p*7D!F8GV{LEuO2K{Ho5b(yZWF(s z`;a`XDxtL$hf@!-nYM#hoQGR4^Kk4M!us<0NO^luaD%1ldF+XUF4Jt!Qlv3k3lS)T&I~hXR+9R^*xI7 z!p?R!>qT0!ffBpehQtm#zhH73wd8V2!o^`o!eQr^lx)$GD=3K+M|V+V6CN#ko*LnxLrPtNNw!xX2^K++ZUkAL{yTPS-Zk6@!-UboIvC1$N5oAjMpws-MMIy^6?{q}zmaUWSIKUFQ4_eCIW4 zE_UZbpFSB*y$;Swg)Z<0h#h6Nj`SwOg>C0|h&=eMI(>i3IF&z*w`JqnA+C`giOlMD z392-i__NaF*3Z;F49prFOnv|z^{7#b3~MJ?tHNj$p9!AIHhT-{)~=?+!9Fd4OW@}s ztH~YAPPrc2^uA5TJZyUrM!Qw+CWNeume=*Gk_`>S);8Rc->=3<$ zDNWMwvWwOCbK&%rlnmmS)u;P6FU6qqV-(z-Rp;dtCoR~)>5~>Az&P4t2muBbtU81c zU>xHygz!oM!4gj(1j@rck8zHD5Bv3hB5^#%-;As^6uWr9cDY^}>QNlI{TBih_}B2Z zUcZOG-`ZO*y}hw!#ebKsdn@vz*S7!9vp{=t0*d#i6^eaSw!<#Doox0$$> zdk0(hVAk6Rpj8{IMD4|Y!wzn^=l_;L3U@q4%*if`-q*wwpL_2_u+ z6u9~c#95ZeGPI`bQI_=8Uj;EdvTpGd`1r>F_+pAP+wLXBW7oFZNb%&g4G(-Pi-)gm zn@ClcIDbIh;D&5GV6G;yk?fkY;f^@Pu31EXZ@awp6Jg^f6t!R~f+hJh{DSQTN zCE3ynAvA#;(c7*$iu}LA(JUcbDkRA96#YX)Oiaj@uPp|}_^w8@+ch`B*H=!S1N91i z@8I_6%&=N-VGwLIft#SXb-R#EqxC6@uq=US@liT0XD;}d+!-3I zR_t_*v=v)y)uQplOLSU`*CEJ(5`?VQ0~iE{bBuBu@GK$!_A`*vDRSYsD`0sAEhmvY zUr08nd%2JYliVUC&BDD)$cZE$6LKWU7lcfZd_%|@k~@VgBl(q(SnVh`*1*)hfpxhR zLViYau#kTy$t_Gl3#Lxx4izpIUdn9|66;>&wh8$t$=O2UghIKCgv1%Ml73pyat+B7 zgo|~Ia#sn73PLeSCRVwZi+`$nllaTr2gP6FJ}ds=?u+6dB)hGG#D4Baf~UD(h(BJ& zhl0dN*J`A`MmH+{V7HI>{oF?JO;3_Y+$hI>{zB zE+G5(mN?nDSzyd%&=br}1Y^#k-cL{%-wlOhI2yIQCCuzxFlImCmS=>?owpQn%oB{h zO_k-CxFXNai7!n60%uSIO-Db!XnDL^-viz!c)aTV^owzVwTBFZJ7u7*y9_WfZW)<}buGBKf;>c!hltL@QprO^ z=OLeY=+j*t6i4=$2U9(!66SQ92PDQVsLsQ`(LC`|JVU|Min~oMx~J5v;^+o_w~=(4 zJa<*M=|yn>g10C!z0GnvT)ea(vAnoI$~-h}6&L6N7cvXIyUjwup0a?KANgB-Q@0sF zN~HzG1y9-Hv0QSo4$i(YU zIP8%>8JB8h(h&W%GHDo+lZGKVX&91|h9Nm=7?P8QAvtLn@_wXlNX{RILvji+Bxeyraw0J# z=MqD5Ix!^A?+nRF#gLp=49WY04awQXkepx)$vMW5oMsHknZ}TuY=m6RW|wP-ThM}& zF*f&>D@3&~o(h4p6HU#NzkS1zjYSwe?veL&PSaGN%FNyg%THoIa7Uwx( zYXH?If&|O$OTp~9GBbGqmsR_yg8>Z5>Nh(*~~}gBJup> z-vJ6Easxf`)f;O7PVCd6Q!Z)Ox)-9P?q)d2j}f%iy_I-d4nIOn$H=!6(=qr(;3Y6N5H$}n2;w)OYqZ(m92i5Qk{R~l`>@!5}PN?Oj zd2?<45H-&hSc2HmL@em! z3t=n=b2is~YK&J3sE3DH2+0KEqCGC;ufn4(_a@ z#ixTJPe-Xw2Tib(j`q$vrucMFy69kYEpDDrfa`E<~mY)5biz=9J^EhAQ(r?} zt-Boco7@EwBO5k*(IRwe^vmdI9^Is>&>uNGN0I^XGAtRcHHD;zjs=!Sly9c&TFt{as~yp)#y86A5Z?St1&ClU|BDDogPs%`UA{RAEhx zv-;?c(#~uLJ6>MT;yEY}0SC47*1FN<}#6_PXqNHdq&ZtQ4IJtw`n~dh!~v63gO?Q4>4% zx6o4m$mnps`m1VsE%7P9CWL?&v z!t}=nQD8soAwpSkRzdqgt9bTv9ZJ=m{nQWDHWPM>MtJ3Jf)$j)BxZtx$sTQLhh03V z)U{f=ngkQ4N#J+@6>~9Mn#2%R%mG%KT$%)ZU(GO*F$vEOM32OW9pvgJ$L?A;KY1c+ z2TXMjb#p01sGG~-b*`JAqiEk=H^0voeweA7qLIG383)kCWV+T36KCCQq%ZHUW8FBW zZpdZb(D&61BXy}8(IfFY)lH85Ep>zayuWTjYHPkc-vztb1QF`yN_Yi!`Q#}WkWz6B z0)-LH%y5`BLs1H)mFgChO-*P{@J-iQpq`farskn{~9xUTJB z_lNba76T3>49i{!`^>Pswo@OC48-EN2_sPh?g#PRMpB3k?E#~Z5gwUzia?3$lkioY zdL@J_tMXz_t(f7?&xVU6v24JbmECP%b$(Oq+inDXO9v=#?1fcV3)()C#EK`%Lj^m5 zopC%_3dr~LN^a}(-X4os${xMUhFjkH<1lpOOO_@1(f5My6%Ch(bjYPk^?P(H+&97OlC#&K6$cO*od09fF#3z2=p2bEDJ?24!bJk+0Xr1+SNs;^mxtet z_&tRmmQZR3jx<`HkZAg>sI*6MkLr0N%Hi(YinWd+Y~=xE%Vq}aQQh7;Q?pNR?M3!k zU1Lvd9q$F$hXIa~0OfK)Le$R@_06s4=wNeN=P(!#!J+RV|>{y27AvjXYot&LQF7|)qW}ki?BgfDmLj*22#X7Yk8TJj$<*hB6dl**u&`F4juq=1$+R)KM*0YVKayu;>D+Wv%9NFRk^Klgo1{XyCS5b9q|ba**bZ z&T1G-Zky)rljUMxrdsMW_rNR{n^Dz5n}gmXvfOvb#mb0W-ld~cdx_kgntOaU><#2n zB+o#X7PdS``bX?&g)NVgzFO1wkVa_oZzg@GrqR(<>L;4U6t7YbX?hLmcZE)z&TTg$ zCX%U7G_fRwJpwt0aR?L0j_niPrW-%SV zIF$SWGHdn9Y=%xN%`v9Fjk|v=b!@|=NDp{}-M=uk&&H_bRn;}JnCjD9Y=zyLRwNqSSp8JTznZSVUoV68lsSFt5++S<=((PyQ+3m*8FB5)bPo z0QZob0OO@$iWVJOU(Dv}R+sIR5XMcO?~O)Sg%_w7LR1?JDwMGd=Wl9%WHmN{p}TCPA&BD?JJ zZkFC9B_(?OIZ@W1oUEDWYYD^)m0)eT7uFJQvyWS83Q9|?4*I_31mi)ItiH3& z5FWRC-u5Oh&;0>B$(yl(mP%;HB*xiQdRcvQ*!`&&h&Q*%ZJed0VfSrti%WUSH_)z&965qNwPjRByAFW}f zuYm|_zb){vE`Aqr%$f8gAd@X>m)%*uezWj-UdY@Y zjURjP?@w7Ot2mswj=sDgxg=~ks3qBqkc&GnJLvm*2qQs_Y||=BBWxMbBk_wPzLv?c zP0LK|gDSuu>mM6ORfV6g{;!2*U;ShJfqY-7|LY+_{oe==^^eiftI2^AO-**$^Vd(( zdp7RTZa^66qwedVFgVM2F4e~Yv`h85!AT~#uj0CF?3o?zRDMXm;|93gsU%Frk;|P5 zeP6{fQkR{I=#luHb}Bixt~hTm|MQo#dpM@Khq}56BGlC_@H*GkR1~b+J)Ezup7ILs z{s+`|)>ZA~@2o3khjoP&1nLS41*xlgQ&;4&uIT&fijlh1mFSW9o$4yb-eX-c%}#aI z4|X+2?CMsCP*=CXLtQNCSX*Rnr!Vh_FTwd?gQ-b!OTnk_t4T(J8q;0#*j+`B#K&xu zJ3Gj+y@AxTyFY%CwY#lQ*QqXZee@29P?vYX>uh%$P`>Z7yFpXEKDq?dciP=%FSxI^ zy7W{M4baF71&cT4aq%Ey!Gck{CFc%8owR*O$;e@6Mg~2HFM4m6yDfoY+9CV%#pKmWJiwN zk|Uqbk)P(s#_2}c9wxAtkd6G&TjgT(xB+YC_L$ur@Ojeg>t|9XpVY1>h z^VeklK$xsT&8z}$ap8pdV4Tu-6hfI z+mpby`1_TDJu}Q{W%p9_{q`iDM$GS1QHkYY4#ZvckGJ}LtNtCwelO*v?h^FE&Z|1? zA;O&cq&rAYD-QcEpXAuyZ*Q)HS=2{Bw#>Pb`ec!eaU|=Dj8A5<@ zzsC>)46HSD2qD0D&|?UZyAYUu$P);GkPmwdA;9>l#}ERHM?8iQU_9zEgzzbU%o7NK zkdJ!|Azm;~2u8&XuC>B^=H(+(;b*a}B3^LDq1gxjH4fMQOgzlyY2cO5Pd@m;1bHQ%^yQ z?>byi?!A~V<=YNX6pw&ZH#vP+Bwkf4z&#OiQBfC(L9B4*IePL^`;vggEoNfJ@m8AL z0;_|bZ@yp@DB*nJzK0@N>1V;wuQ}%qNQ$_lypTOa)QevKRxZcwyfzH0)6dM7>lrBZ zt#^WohtRrQ&qEZoUdh!tjHpFmabL65G z==oZKQ9PS#nn9bxys`(I6ZN9kU&I{uTWs#vP}-?nZ=hTUN?&>jB9v=%_2O>&k~S~~ zLAhR~r#~-%a*d#Y;Zz9*Kmm$I&sQ|YGDX9Ur1Iqwz8U*elv1C(;x30*5Jn%eTJEKO z!EY%Ti6k(_oR;f*a=lx!Bl+-O@6K_%*2Aqo&i1{Rp|(>!V9CgLQew>f9Yh#2Ux$Y= zb52-33}K~FQ5ffveK9E1AC60yZvyiXY&|RU-U;8JLmgIr<}G^i6^D|b#gF?WcFeWX zS^nA6%D7>o*`Z4?B&7ZsEn-DrWHh8&>rzjV#rhwj){_)%XCO4y7R1N>Y1cR3;6$6%vZKO|?~SiEvB33s*q6S3mjD6~ zcxx+3S_;`|ZIxr^)>argEaavye$xU<=7|c>-XF)X4ESf`R|(pTVLOmmr+M>1$lApQ z-h&7>{ysd|_`#lye*kQycfw5$LdmRjj=@i3YE$oW=L%I}$?#`-`ZGCLGK`_AW6&lS zO9pzr=3*3dXEAks=ZYwi*#4fJ<7z|q?EK7&viLXzgd%(d4`poh z%J^4FT>9~7i~`CE%h#WhCu49)x^OaoM+iJudPK`=iaQA9BTVu^BP;zkDhMWPQ9<=b zM)I9Qy^1N#o8_mT{!EFTsM3zLH@$$%u>>EJ5I_QsDsw68X``3-)?h<`oQ$Gfs)$zPD4 zPIY`6Ld=&s{sf}$m+vg`Yztb76PuN<9}c2+H+udit|MDAzbP?vJ3xN>hNM z(eo9JvAnr3o|_A+X8PvBe<6%~HOre2>-^F$AT<-B@54L0PmYp5$(X-O<+xtk$B|7 z!@hXDb1AMc7lzZbfg|n=6i;3kRZ)WgDmfTEOZpPF;8A^3;c|9Pm|VA$EtO-k{f3@? zITa?`@w6~Zw&Y^6rRQq~M#)XK(pf}{MDNsDa_r7y(1z=>{o`vW>tsi_pcIElxpCUd za^rSMmV2r$v2!^}Z>4diF_c8GZbwx{#HfmS7-hocEsU2IFZ{`g|e;NFDUP|sDuA!6ei2Zv-lX*@c@g1 zrt@*})ljhIB?@)=zW!#^Q7P&O_w_qLYcpo2oO2LBo;R6n z;;kMN(H-s=~M$ z5w^kB^_1Eh09{N=h5{t9or@MEsxZtpfht5-V;Yep&H|&!;cy@s0T1tb>QNHd6-Tw1 z&#larRi*4?S{{voAa6U4V!J-s{2HiAP+M$~HXh|5rV?G0LEpwmi%yUMmua}Z{+4i%6& znz4bre!5sN-n4WwHsP6Lfbt9R;mbtdNSdHH6tw%b7l*1A>Q1{Q`#H&;O>g5H3GA?EzLyO)Dt0RQ^97NZ3)`cH#p3d*qoHBXcJt$5 zSf;I?A~H5S2%&I`>Ubs{ZkK10#C)IEeFF8#J0&p>GLOOJ1cdYK*W`k!f$6LhF$d$-~%6bQ~wY$9?kG9}R?I%}nNJRHF#IGP&#_Cl|= zV0KM+hw-Jm)Fed9P=%G6Op>`X#+w;q{5=U?D3ngRT{_dW16QUGVcV=v&^| zlZJlO;)A$;>gc& zEhM&t14XgTi#ypSmI^-G#Cid!hTB%Fx@-7SYg+omPq?zbO}||sMSj6;)FPic>|2OSL$Mv zDmewUY^5a-``IN@76~quZSsDCRC$StOP%ATD_V!te2MBMHLrDHGU2#i-zk00B~y`* zXJK}lO~+U6Y+}vY&K2}9Q?p@T5o7CuZnRR^W=1p2sId}^mmZ0+&a)Dv%d_h?`20ir zZ-(v+Y#HrOH;wTx)c=S{GY(iX?}&Y21HEQtCv^vRzoNOX5f?9n&}G4xp^i0eeW};h zxUndj83k2rk~T*mH50aLh~ZV>A`LO73Or6j44VR%Ylxu}ZKwYsJ=S3xe9SY&_zG6Ef(yp$J+K{Y~DcG{aZTLFYP_p`Td?qkG|kYBa;3R%#YW zbT_Z!wm>_?>|PMDd+kH72PPJKurm=;NM<$|b#I_be+adieJSpsn?_d+)l8Zq~C1x>QY8t>Oke0xgBOn)K6CqY)9%UrXegrpzco@)V)B{ zi%Sr=vMj8y^!&3dhLaF zuS+q>hv?&rMGV}BS8hPurc^W!*A>*0( z0$^xACSsvr3qc3Btm9>pKz3dBNyqbp**9GDz)NET%DmyC5f6Xfjqu1M^H_sCMv%w8 zQkAtYrm#VhXPEhl+ItW#zAF?*kr;Lq!cIll|H1RUO?bW+uM2Z<)tqC8txkomlc1~e zq9!zOZCt;ttMcYKRw47MHIzk+ST{VW3iNgHG8)3%Ua z02S;*XuoV93e`tYjSn&g{DI6L zZpn5n3-1E_DfA7-!@{&lEQ9qPB`C?U^&Vz&yvDd6WavLgi(MiKBf0}H>jUc?gPbm+gPko1!rRBwD5}6p<}&u zcu>9>yBz5{NEQnwd8t1?kIP01>D&hk{M{|=^*38pR_p%8_57Jg1onE9DC1N-b z;36Gw{opBedlXof<{u!Z!A?taZ;0@s_Vc3RUL3Bv^2`!nsP;ln(d%6mF>ffZg*TP= z9jwb};feZ0QqwP3DHuRB!x}d8FdNoNp%J4Q+J+_Dp9~w-3~hW)@h+4NYZA20p%7rc zIvgI(A7+Q0*=Rq!fe_e1jYZ>O2k%v}`9%eNKF-5ktdza$!Hkb%h(+}DHD??{OyV)b z9K2W&TpUBt^PP+{3X}|llELQ6uV|6z{&R>Nx9d5?DQ9KRAr6DK>^Z~}$m;4N!O5O1 zlwc`drzXvtg}D`@5&jDCJ9T*D(8lJW&BI2MlP6>5oJIJ?%qpcGfqyPK%D{Om+~b!W zi=hecFt|ynowL9@aGt8iT9tM`aQcBWr@$Wzd?*Izfs>XdF?YxxCW*ko*WEuMpL5rj zfo7hXGIfl{3OgKi3;?!;>fi8jBB)SOvD-I5gUz;)@QhP}Un73)_;KtYZv=i=!y@Mz z_b~o=_>=Hc>Yx1?4rfQIu=fMawmMwg=PQ>t_f&WQ75u%b7WK8&)ZV`wY^#^5=w2-D z9pcst|6i5lA0Z(p!Hue$2epm0)t%5|t4)YwuPn-tWwijKOWmp9n-MA^>MXhuu{KPmtb<}r|QOUZ|$e{ z9k;!;N_{#0W8~HeKG57x%^tvz3}dV5qUUq#*@Beed^~VE#<(X(B-#e3#z~1bTU7_A z4;-w%o;ZDAojT7NImuQdrCg5EQ!9qPCjpjGR=bu5D(>k7CmY4p7&P zwfYWFchp;GFRWe>a#S@#{$mo|clM(DSueVe_oa0DUUVD!Uf&i~r=u03Dlnez;=Sme zQA&5JaPC8EM%B?Jbemi0J|Ok~x500YEK#izrgi}9d@<+}^>sbNEUefyJgO?dM=O-x zHY%!~Zz5-HBSW4n(!(Z`enP^WE_q(k!dw;fqI*Mc*2(c@q~AmR*y>T#kFDa3bk9VX z5*2G;?d>n&udJ9puu(l*_(`88wRRwDW+Uo(q)N0dZyu>$*o*Bu)ai(h!Afybovqe1 z-8RZr>%pg{|A+j{__~R{ReeKn^aQrIR(;w>IWleMezwAk7b|S zilqWE?%X2oS>)s5LKxag6(=aVtC%H~T3)d$<5ZQA^cA=mz_tqgV(OQgblb{ij zdVhSGhdL)4bfci433;oa1B~o0L6rvGE2%Fm)~P=%vg?6ZhDQZmYS0scmKpSOLBkU| z_md z070|VDnW-!y#3WiLGvWnbJPt|+HFlwjhu^Xe0K^uxj~~J2X27Q=DnX9$?Jdj2)fds zZG!eqXxUFh=S;|`tS59!qFHF`wQ2g8VtQf~-)qE4fCBrjJqYV-$5 z?^T54dF&qrT`j2}g*Rie?BU5e9Si$EvRd zwMf~IRo_VJ*AJ)8W3k+3y!_??qvm1+u>^fpOLV*{5;Sly(TS>upizRBs-A*kf=*H~ zL5B!RVi`)EGX*VIC4!QIPFAHBj9zWSh&flKR4*$Ci^QQH(CG%fE@-8Siwv7g$U0Po zpfKXjRjX8$ps|8ht3HBmk$7jReu934rPM}zTcJkK`ABc0I-l>FMtV!3bE8_X1_?Sq zWS6SJIwY218`UP|2>M5m=o)+@j`98=Ig4d^ewmMwUiGto!iv$goTz{yJ5_E^e`$R1k zG*{~EbG1bBdBG6o`b%}3psTTVnybE2CrQYCBxhf#q@Z64Qh}4LVE>qU4D08)Dld={ z*(K6qk-%w!u;Ya+KX8UsfVy5ih;>#FNLx{$d$2*?sCoiX_7S$f8&xR~>+A!mvvMPQ zS7eoevqbiV$oc{?-t-#As}7teviyNeZy*q5Eg~BnxLD8~Sfp=MjX+G{dC}4wxI|=Y zCFH2URf76XV#sko3|TKa+l=f$2{}1%gM@rsbj}1~$k#>ZzJVJ>_AAuqMl~mJyU6gF zD&*{7pfc3S*U}D$1|Abssu+@p7CFJnqW)g(9vS$V=)7OjJ38Vg+&21qUkWW zUo{;G_m##aaDQEYBHYOh%i*3_e+t|O>Q}q++xq04(dQPf|3*ykB=bjTSkzW`k{@wae)-26J+ciMgr_cv|t!+ovoFGaRpRB%tx zL95>^_&eMo7Trc42UJH9>-j?PS&Ci=qf0STN^$ZY!q4x)x;i|cb#mNrmUrXuTSY@< zkN)cRf&JjV-a0U=?S|$dp#Ks5wi^Ddf!eSqM#yo^BjE1aJO=K_<_U18Hcx>&uX!fi z1xi7LfihH}kaeW|$f#O)#0vNC@YLS7@BTf|)lw>j{e$W=X>110(Q zfPN-K_v^eZ;M@xic7P*(*aP>Ov^|}rH}xa^ek0v=!5=|-r;k%Ip8RVk-U0qceeZ#* zITud6FUuKSNzM874}(Mf0rf}ganK(B>Hq8eJ|WskB#)N=zn#|i)8D!50d-js`|Kq# zx<~h|`xR0p*kdCcpos^7!6mDJ#-Hn6DnOyM%+zH~o z9+$cuNcTXD?bsprXUP9V={{M&klV`Xo>)!y^MM?ToC1z)e;ZwoRCJh)gDCCWhwfmw z0d>&GQONnQkrT6FhKh8CxUu03b7{?f2vaw59^9(ohau#W3Dn?B~YvW4~EZw4UthYm2wj$Pl zMzG$Fo48Fh{1onf(A?F2o7gX zrTqp$n^d1c*M|b?CM~PDqlq&8x4o#n?srJnLrd!3@}XNB|IibQ8u{B^^jPCgA6gRp zd(U82c53kR9LifU@~fU$%<6b~{Yws&vsA+Ed8_-q>O&v324Yy0%HQ_9k6N8PTisDZ zxK8pJQHA}pC>BvGvZyeYul^wD{d|_8Kz(Qs%TS>HVGzqusQzOR%TTC7SnnzIem=`k zqzVmU8H#Z7M%fzmSX&I20g?s{XzCT~sZKZO?dnRPyA7IOyHypde;Cv{u_jimz7(`U zZJtyYD^(R(LsI9bh}TQaF=%9I8IGY2&hr5Fz893y;a(v4M0QHT7woN zySlv#AseagFlaK+DD@MA-b5K%)WZgC z0UE8IFzA-if!G-JtU;eZ)~bGO&?Lyls#gs<7-*b&+n|$x#;f-XIuB@q`invLLQ9+a z)SxhA6V<;B8VEE=KlN_fVX_*E6H~Usxj2)ZtTqW+r*`2acCx~2mPPi+Xri4>L>tt& z)>*O1ich|=jb5ysADgN=1Z_|k4>&9~T|I8l%D&f!W~yHpw0sQFYX;?ySrVJ6`rra3 zb#58CBsNPeGU(sEmc;f^Hwjv&{xxA~Y_|Hs$R3`QitVQ+^CAvX&udu~o1+dBv_Vz3 ztc%T8M;O`2Xc?~iEH`LpZ6LN#U1HFS(0Pb@&%}GOczx_JH56w;)cIU2fP2@j5wu1< zinH)V>J>p7RBXr(u=*oR_QPHImWoD7DeZ(gU`{j#Bp; zw0NA5ndT#}~w}mOJQCkYP#*R@R8I&y88e5_U$#u6is(9ko z*s*H1LAS@Y#*R~G8`P(HYwURSh(W=b@Zl$6U48ppCUQ&e?m(HGp;M!3Lr>L7UXF z#_K~X)NC!26jrGDozS73(Be*rsd47Ib<%s*3Jrh)b+$Ssi`Zg0v|pJYwWH2XQAnCC>9O?;b)k__=NW3fLDacYU1AV*u2h#AM4cUx8yvqRlz5OsE_n+&4P4t0w`)Y+kK6{K}$)ZIo#of);wAnIJD?lp)ySE>6AqRv(7 zL4&Asm3ml^)_JCS(#WXuO!c%u)VW%1H;6h{t7i?O&eiI9gQ#=0`lTSPbB%h%$f$FT zdetE6T&rF)h&tD*Hw>cAwdyT{sB^8_AxP^yOTBMo)OnWLX%Kautv)n}I?q-g8AP3D ztG^jUooB0$1!&{^Mbp2 zKcM494ASwU2I+W(g1nsd>J%^DDPBdVcvYR^4G^?R@m`m6)F7V>H)YA6E?*9@2D7N> z28?d&RJ~3iU!!J?0?hR~HNqerZ&argCUlB7ty8=io#M^v6z_me@fLK7cSxsrhjof~ zOcp&8Tc<8CA!#A!s!M$F&Ql*5L<>1j;dOoZdp|%6IZyq|AX>feHNJDiVe**YY3 zp09!iQOgA?&mh*s1uAS1bzY$I4WiBqRDnU%a-k|Wh*~aE0}Y~gw!{I^;4HHbQ|R(lylomZ<722tnLYNA2R=hbSSAg%Knb%>EM zpVz2k4WiC#RmvdhyjGoQ5OrRwE-;8XuT|Fy(mJ=On~jV*x2SszqR#8oqXtpub?P~T zsPj7YTZ5?cI`x4dt@C>IcO#?D>(ze@qRtysc%s7J`vK~_L6sUroj0gzgQ)WcHB6A! zd7~O_WYl@1nraYr{!q;|h&q3$4l{^4f2fW(h&q3$(t@eAcNKM&?K=*1H)_fnveykExbUd!M?^ZJmVm`O2#e(!|dz(7fAg;Ez zsijjHZ;g5?zBTp}^~f}hKEsOoUKN_IQK)!p>^?QepgH}w#_m^F8gw+!1L|FaswZrX zJ*a**L&qC6WNYjpwG=m7G6fgtVfC&-Z(_asQ?+~+WgFB@xD5JJb+({2>V}G~u}9P+ z2HgkrsQS#H=YSql_4{a@Zvj27juxa>_dio-7}VA_Kk%fw#Dx62`Xu(0`i+*!I{D}7 z^-k#bozO=bMcyg=ckJhC&}^o+F7hv+?P`HWs(r7RdPXfZX#cig@w4hA-oA>tHCAJ* z=hRA#B)#XI?oeJ*g>#8EsiJY$hh9=W3>sGOMC>IM6Qp~< z%c{c23fi8Cy{xJX`V@PFS5zN^cJ?Of=Zp7>8mv(yA0>L_|1kG1@Nreu{`lT!W->EL z8ZwiXwzj1yEkfxtY0@^(mQG%6Xw!rweF>UQlW99N$)q!rJ^(c-h@dD|5UrvXc?gPL zR8&;F79R*+t{1$3a78VGUhsl~!ta95|M$E0K656ow$}gu|M?Zpnzi$>`DJ3YQ1)@9Gda_=LK^Qsm$hYOSTn!6#L#rO3f2)mBT9gFjVqOOb;=RhL>S zetM63N~JBe=k&|TyeLt}0dkrOs)SmZ_&FMj}5`HycXw z{aoFjqozcDu1edPa!5Th88;VItEG0~#^5hhw@`=R-#p^~h1y}MZ%-z*OQ@^W_g9r7 z5yOld2c$ zYW3^FyVP^)8XMPo{=b7dYU3W7H8b*@D%xmj=tA7{Dk>Bu>#WH0YK~B5P5q7Pa8oWh z;{R`Tjis)eF)#Ap>V1}aA9k((qi(j;PtJXy^d1 zw^@ps_GNX4rML#XtnRcF*MOJR=Y%pd;CJc?Ln-R(->KIu#Zq2TrJLA4qpx34RhFW@ zentJlQuL0zs@|{^y(526(ak1b349)ZRP!xG@5pPa(NY`Ey{q(fwarrWqx>J07Ru<) z|5YCo>L&H{v?Y-@)e>GG#+-gXzK{NARd1>Hoagxds_wPa?`s|3-2C^kwfdI`ZgA>{EcNij+Q1my&cKoUA$eDVz zrJ5$xMCRxrOC=Uv5;W<9SpSILv;MqKVx22A}buXyo$LIlgB7jHRx}^{)-OZ98i)DO>aey z@eYhldB>_b8n35V>bn=*7TKg9H}!=+ht+Gwpo=$9=uar(WW z{*R^B;xuWi{+p#PI-?X+u!~h(9lEsoNqkfNG)rZxOF>OBl&mWk>v9`6dFGSqVttOK z=FBVwRV5Vd&n1yd^xc-awfY;8cj)=utl^NFJQ4m~y)9v=|EPXhZP#g`36xpG_+v~;c(mxXFCbebK z6Omo|&v|jXwZD%k4^8=A*Z<24XLGb{~XEa4+(Why?#zXbU+`oRPo$`=w7`zV@f$Z zvmm-p@3quhW|c(u>p`JR-!IdD$TFo%{b?BG4CKcZ4x^&OsJ9HG&KyRaJB+Fn>Pp;r zgdbBk42x^FaSv(6bq_g))!o8kiN!Jj60~aS9x&<^;MQ)+?D#Z_jqwvYQH$mOgpdA#yvPpa$mi zgQfns^z`Tl^q(yC_oZio@*QH!j3j?h7a1zFvG_^#L0x94uHsTq(=B!F`HQ00>p7PC z)cMt*7Fg=@7hIw~q^m7;?*+K^qgPp~c&=$>EbRFY z>urV-U3Y`tW#i_rToJuN_X{-?TD`Is)Bzh8xS%O|qaLzx(Fh#vAJflRin9AL{Zd}sVSVon-uNBX-?tR=eO$MG#Ebj5-exJreL|mu zMUu0FWqv|0w-n=U){8&t#oeq|TZ(a?)TJNu;y$U%EycJ`>4_ir;y$J4Sc-9<)^Fs+ zeOiY;VNx>gh`!`zFW(W}V=2bnqN_gX#oeOoEycLc==GoS;y$C_Ce+oT1<@zft$Mqq zmPg@L(Yq~m<&w8YZ_^n|eQ3#cP*)gAM)P)kl~7onrtXT~uCL3ByF=e7l$oh_X#PPA zmxFic>nz2VeO9*~@!~$K-yxJ)JMPq%3T5Q_PMsF&O7$^kPxMZGnWY|7d!u*hgLx@G zr{8Deey!)|&*_il#eH5Mv2nYgF+Z>GF>z{b+4Iil^(#UhQhz=7ozc5>>n#fZus@2v zH~K~Wc}w+0A1M8j{(`0659-VM9-(mK1$N|D^y8NL#>8)y-m9N8l<@3p+W#4rd9~E{ zHN9M@L#lY*hofKD*9bMFE?oNY=zaPbo04UIQ*XP~v}MK8Tch97F9>D$a=$LP%`5YM zy;`V4Dqa4?=(qKUgc?%*s^^`5)r)Uu${|&>^m*qy`evcn>Xyh+U44g?BJF%Yx96y@ zMIX>t7)o0Gp#D#xOqoB_&j@u$b(J5DKBW0qDOkgQp7*@-u>O-!htz^u50w5$|3xTM z-@oaqJDKv3ny})b=p(w;Qj?cH6#aMIDwOHpkM$LXlG=Z)AF?UC${&sXhhBD-IuAxr(T=7G|m=_@TYtLlN$XY@5fnfiXNe{bVbD_)QOLjSL& z-VN%PI`DZ@W+$j)x=bk3_h)sLq11NlJD$}?ZOVT;``prB=@*0=Qd8#rHTs<1cDE@d zR9jH?Yn>EoNJYSaXY^it5exUUC`Vpbn+uF!0+W$pU%FoVeiTpu# zSSnuI68WRq|mx#&KC+r=PM^yG-duX@cMJv=1r^E zwms()zq)WN+{ETXN9{p>wWN1c_DqwDBlWHGOG|y~;aF*@U+rAzmG&)^&v3q3oge;9 z88z1Kw&C%JSMuYLQrxxq_5}>7l6KCP5q~dgbkr4+%W(B%p`*@{Q64QzCgiu$o|4m9 z{^}yuYsS~)GWh6_{Mb{&SI8{5YZmLheCgQrekSUL|KEvMpcjs6ok46$AsKuwg4vzWNo;rSy;@_|`;;uk7zZm<<6qf%z zNQHynHPM6wYAZ3q|V2 z>-9H;8(beX-tb{LzmX9iFFnTypCpko^W}duZbq|NdgtLjbr`+Ids8FAwR*d(d>5DEX(=-$eoq{4&}D>q2H0LmZVB&ETbR)F;In@j~)TaFm&e`I;mj|C-Fx ze+G``rcOxAj{k{Y@FXIf?Q=C?$NwC9)kE}5IgDl<6#q%p>YwZnc84Y>gFX6BL4 zhD?$)270s7ooikRZaFML<2@NEc`4z@G$tk9Yy=0i`mD^>tFg-a)B?!7U&YSjj3^WN zF?o+)!Y^eNHgLR@hQp@D(e-|41y@FsX1o$iuKc5#US7wpiJOGaW~@I`?#CCC0{HGvKyAerh3oM#xq5v6 zq8@KH)Z;ID)T=3YrsA1~H`=G;nSrMqH$7+JITO!p#LdBT7M{1_IUCP8c;@0c7tcIA z^YJXevk=cBJd5#E;ECZ`t0w9uHAP>Dv!V5Bh2Dw#M7!`L@mz{$H=Z6my?FZYr113P z*@I^Q&t5$H@a)HP0MBK3F2{2Po_FGT7oK`0lE|Bjoa#0lbgB6aLr3 z&Vw^10RPbJClUL-s;IupsVkfUc>jzu5I(eQ4&ai=pVXI}i(+$uZ&~qQ$dz3h&}b1( zh#qrdGh_NOXaC9=LcTPo5wJ7b40zpw4*jb1`bD&yY39#)n|{^#+w8bz$WHyHb9-@0 zPZdtSDJjFg`&RAMZ>k@!yd3Gbts2x*edN+C-_e=xMVW8R_#obfUpD6jv|;M1Cjlqb z9nrI-gt@-gBlqYU-zIpOW5@-m(Bx{9FI{`NZt`6*mvB+t*8y7qw@R6}NWBvUP6zDA z-1+R8RnA29*4h<-pE|SFnXZ0RR_nx3W+`g?#L6aTj-;P2uu9+xfpaA9wfg;2ZbF(r zR(;Z`S0AYSinCsQeAUCw9<=kvfVFrteUGl0@Hp^yo%^I(A-UG8kFM@fdwf?;!TnJE zXw@&BYmpvznSDd}@WXs*PnD#sQuj=&^IfZlYA^L2LYfrd?HAxqq{ip-)FIz{YOnVl z_WjCt#K&5`=J@2~&ZF|$#tzM3m_`B5|(;jv%k(MxhnZHN! z0+yW#`~#KCaEJfnt4aXb+QYtMRqyb##%@2`c@yCFsh<%1i2p7bJMH`M+}r#QsNRWR z^1rEHj(x-bD){pq|2KT^Km8g11HP}8y#U-l{TY8T`2072hxD{VI6u`nG-XoYVc*-% zm=-wf`wGs?4mJ-UA3lj<=U>&JXA!o&Bp;Llpf6U=9Qzc`=p1Jf?o&-$)d zO*nNC;W@F(_0ztibGHVb_T7F#k9yj73+@^Z$xIn?HdGxzU9%uvuljyac4goy^!=8= zb<+1YeeC;O%-jNXqqO8^fwu{~QFwc^z}p0Bzmc3OlIDKl;avYLgnZwYbI*!f3l2N!nRC#WgLOYBVDG30o~Zd%!C~L00xuOjA}xPJ z-Cq1RKj(fy@DVk%Y=uLe16}I>d~8|pajEwiq}&v|2vS$7?sAS*T^eliPnq+s;9=*J z)2{-2aK^R4DwI>@REcywFVgjrNY_guUC)c;JT5gpE-9e_RzIm;LkMbD&#e5n;9csS zm<2Vyd(M0UFGq1MU*vxgZ?5Y4wW* zZw8z6+zCCn)TLDQqm+PHYu@5(eRI`4LApS zM13pvkiK)Pptl6;kABhcxvo9 zx$cFOA?%SfJ(}97$F^`=;L}A}3CT*x z6#@@Y4vVgm@T(*w21$Fh=sIcPkpGkA{^BA3;o{=rn+;Nw3ZWegAzH;R?#b44T#UCk-!Y=r2aY(IJj{(-JCjr;0p8v;${s;dCM56vA`59w7C zqUsjsx7bzQ?rfUiV9sqq`fnp7gs(!@A>@#63*bk5j6LArg!HolzeTU(LFW2FaMOfx z*k8XdF2~n}x+gBgH`4~o7Q#xr7I2!n6L7Zr65u@bd%z{C0BO!wWq@_69B`e4w+p;j zbs(e*a5e0+-xsfzl2=Q~v-JBJ;t*~VxY~Dvx@Ka`Cn3NeoER5;NZ>63k0QKa(lP%H zs(F$M+@Rh!sT}Z!lU4%;Pu~XEc={mVm8Ty8{O;*T0rli#f!(O(Sb#lJ1;p_O2n5HS z^T|5M8fOWN35*LI5_pTi2L#4KOc@tAB=8o24+tDAyg^+!`3T@gCaal zP#~djg*m=qr)*0tW>i5qPV>qXNGt@R-2o z1gg`R%O|j0;B0}b1=b1NCa_E3l>%=S_&tHo39Kt+Ib8y;6nLw^@0pM?#@;G$=yc+@ z2z)@`vjX*GhR+fh6BrjbB=8o24+wl#U~DGS#|0jHD{*x;;nBH-tIs9eCQ!{IUM_I8 zz-c>}*V z3V7RF%2zUEwZLrx2L&DxcvRpqfohec6u3=bdHq+|BY{T*9urvJAmIX!2s|dRyivjh z9uau7k!2nesMbi^1g;jiP2ixwBLa^KJSMPwt+YqrHi3fzj|e;}@R&f=Bqa-6EpSla z5rIbq9uru8;SK7yZ`pPs+j&IbF@fdlq~!vS2s|dRe7%GVJRzHZ+>-<7_beV_Gx(|6SOW8VUQlYg^+kAI*4 zD*p%lpZEXJ?+;7}EDh8KHUzc>b_ISMcqZU0=qX4S94Htpc(mZB1q!MB8}LYIWT68deZB)mLaAAVo>tKrAOFNRkZwiUj+@RNmK zDf~v^!-fA*_}_(-i&~2|6%7{a* zsWR{sWU*=t!YhF9-Je?t@6C4?E(5&Gw-Ru4$gd{VA^Zmm2;ViCuz&g*!1~jPkA}-8 ztwXq$*!=W27hZ($CMjW>z|pY-r!!5t*{c#}MGm&OFAWjAJ zEZ|!K9o){G4g6w22bSMiz~2t&sCVeIfp-ErYMY)5JPzpKTa@#F_XEP8s22cF1LFKx zF9Mzgbku;Z0KON{QTsH%*t#Fk!8ahQ0iV;$0AJLU%HIMy>VNe4z+VD%)XRD$@ZSMC z>i2kcPpek|9enFC2K$2YeZzqn0}jz-s^cv4*m{8F_Z z_@!zC@ZG8v_-@q(yhn8a@4>g7=fRV<1$eJ|8}L4L3GhDk4&W)Z4R}gz2i~u`f%mH& z!1t(K!1t(2fe)zLfDfoUfbUgz0^h4X2YjEp8~8r;Md16@J;3*?F9ScI?gf58eGT|! z>OSC?sc!2dIb2p)sKPW zO>5u>)iK~#s$T)WQaum+W_3kiF5tTY^VEy8s`2g0`A(a2iL=8=J9jzXaem-?#TW2T z^T+%P10N53KJewh{ecGqlM0pQsL3(oY|M9EF1$hBqD{ecTB*PpV{+;4G z%ZcWPJycu_-|+CT?-ZBdG-YIYpIbIM3=A8U?m?VjjVv!QMtR$D0z9>z*>jD*W~% z(=8jL-YL0ynV$c?R$L4JzxhXQ{d5U5G3Lc~JY9IY@g(roj#+&-<@Yel0+)i7EFFS8h*WkGp9`*O(c|ZP&<8^pGfWK<^K|I&v zFYkQ_&mlY?#$U<10nd$iKBC@%cTnB|3*sI47Jer@yPdEuw!yO42C2^Cjn(V$ef$ri zhC^6UZ^iGu`2D_aQIFzz2G0w4Uc;lHhl=q`ab8wG!|yA2{(@(MuSHG8a~7ToJS*|E z;dzH|oq8vpYkjBbulZh9U-LES*ZnPOMW98k4VhEKFv8Z+@eOPpg+-$1S=~Ss}*bGece3?{PluFytgf}XCRTu zuIldW^rANIO{6o4hTef56q4#=WYyx~)l^niqoh?`ot^c`On*=OKwVEflc`+XIaX-p zSfNWyXbs91Y<)75ZA|tgGOM<`L8FRa!h-5jeSL|p?8c_1zW#wMQ!l9+tAfg<5{e20 zsY~^4PxdA1b`A9HmO4!I$Q~>ov#1(|whi=kq~m=Va3#?l>+9Z>OlJp#@7-(#QnaR1 zz5UsZnMArVm9E>BN_Hh|OvC=`M7$fkxAKfe z3L}?Ps^(-@I+aQ7$S&NR>;v7A+St^W6~z47VOXE+8`$5NX+t@i)99Cs1F}<0E^KUU zM@`8Lil}R7X1s?~~&%z8_ZtCgy8ps#CNrCOIbuqoa%kZ6r3(;(}U!nb((00<*9 zOWfgaPIV`sId+0c>70hB$VHDDL-slsJF3@g^^zs3s;0KFwxMG2(!~u8bq!V3wM*+7 z>T0VRYwD{S>noSXmMw3nuBoo6udAu7u3Owtu_RWxBvx0qq`q$1vika^D1TqFuPd<$ zs*5@c-9^y$fgL*%X+ucwItKb7KZpU>cO-WXq!ZE^wxOabr&~Hwbf^dyaVWVSX#qmbtV1=m z!>d`Us_HAMVvDO5SJqZGR#q%sy12TgvZA4;v3_aw(uSq6+S>ZX6%CaYHL->zwH3=_ ziz^l{sfsPFX^bsztculEFI72>)|~9mv=40WNNrg@GIUpRN471wb5}M7DcjYXz{)a4 zvRHTbSfPDmg|1IQWK-#}qS`Sd6XV6PCF>J-Qah8FXJgdYo@?y*X=~i@pK%VgtUt6EprFCzI{#pnw$%7 z-`BgoZ+m+(e^Fkt>^Lhua>jb7jk1Z2{bt%*sWLS#S1YV?N0se~^juac~XsoDTUe~a!VHpH_dEFAoct!o<`X#lonz|*G)in*vVs%x^ z7B8-dEpMo-hOE~wt*NMB>bjV!tXsCUv8JY?y0Rj+w6<>fl7`x4OO~O?n#Hx%6*bkB zH4RlLsj{-BYFSO=vSkg8i(|D*t726R%PN*Ht*uoJTRN&bn`3L5>Qr+>eN(KhrKQ=@ zTVqhH7O(AS%i;Ac?Kym74%?E$Hf`D5(zedcS+ls2jjpPXH7>5It7?obL+dd!8_>4e z*s`kH#Y+}L<1MdltX@_XYpkt|)if+$zI<7%v1;kk<%{c8%l1pL0yov?S!JT=Rqgtg zx^b*Z8(QicI@dPD>KocjKx?dST|yiql6%IkkqYsV(FmrGb@ zr|Ls<>f_nCO7_Ng8jOM}L5+z-ciliHo9Y#^AL}#>=v1Fj>G(eR?PlgoY9QT}SfAXk zu$aRFAl9%y(KV1wKvk-CV9 z02^90$Dz$!Ue=|0dN8y!2Nv3u)V6~QwQY!?T=!#{0|=DW-=MVSI#LEVW=2O>Kdem5 zG80Hc#wvoQZW$zx>N3j?!kG$_dnc5XP32Mjx$rJyilePawEaLf0X4@~8C)>SE-VhJ z6Unn^2bF)KTY)X<1O3^i9UCwnpkdl1(ok5tfu~?|_Qd=9fyTSLJKGYysjM}bThob5 z2H|Oh?M;jsC05?XzD#^aqNNXZKeP-ib}O159Ygtj-LTYq<5|WZ$G&G=p1H3!B=)Tt zNOr3gBH*ibcXrmog2rEiYfL735S(M_=%^eYM@O~v*FjK5hu7`G0+PrgrzqP|wNX)T zz-lr&Cykq)v7=hCjoE>|j~&~T*}N;&lUSP?w^VK^M_0(EWJD>99gjYAVf?UIj+q_P zoDwp2WNnh><`|W7XFIwn%@C0EfwAM(#xuJ{=eQ`*JJ1@>juBIfE%Ux)_gGOf`HdAk zYG88Pu+eoj$NL6$U`GfGG(9@Dr5`G!uRAk3rm-i!bBtiKTN@*yd7ua8T0E1*4CKri zU1BapJLg_@bb#3RD2 zrswR!TvZ#>$#vKWyGqzKBV8JW8rxBgX~C$r1Y8we3DuP0RhM@_lYvC-BY-bZJvrM}zQ3^A|Iwq(>&{1Rg39%-TrMwGHy>8Tu z6k$=;QJYF-d#IVyl8_Ub+C!4HB{G;|LfQ%3#07Q(<844bPWM1xRzgsBOMe&B^%8LR zBv}<~0E55=Fvx}I349}lXhUlZmSjx|=5ogPZaUHlOXleshM{b#4x$MUm5eM+A}BCT zvve!)8Jxr9r!sncW71%LrTGmb90Nd@@usrW1;)P3|=U7kRlKFoE{KZIO9?o zNdwMPpP4BqA&7*JF44;p`mpBW2g_PE*_)76%S;(Jh$`5I)b*q?E{;+e(}>w(W81On zu_P?}91t^E1glFYpsodFEPP+N&87s3)gsugTp~L$gvM4rx#NJKR>*2E6KcEp!D3;y z@ZLs5m_B^D6agL)#J%o_pnkKs(kj8wup@0b%v!mqFM~Bv3hYQ`fx&JBgs!$WpR5H; zkZ%`Co4Cpf!VU<*8Jr`))*QYQ5u9qWZcAkz#kl;1TcU>rK&p&2o2$`wROl{aNeGTQ zjUNxIqy+3h)B4y>+g~dj((F8YK97ml9!p3(Poym{1 z>p~kv3nKtKuoroZ!j!OXQMZCx|0&rev~lY&V~%kWPW}qxgn|HNQ(dVZA()W)JwrwM zG$LpRWL%PGQ@LDL4vqO@n4fRZD6@p-lINK-l6V-s3-ceQe?Rt0?tF()yJrB(Ge>)_ z{ajG4|3-JI9af2{&DeHu`Xw?@gQ76%uo^`v{2M;SPM%20ZOi*A6kkZQ-OWo70)#<3@{6B6Jq&d_~Ly}gO< zWPVuR=rAhV5y{|O@xrj`VHHQYIc=h3pTr=JtThvb;V$0Loy59bn?@I?3Plp(lc?zI z6gjl!!bpFryQL8USM43Kj$Ke`-LWkG@bh-;0Y!^Lj?!-Zc~Q9_uBKj&`o#8uojVih z4XHjJ6O0wf26`DrwA_n`8C8BjG*NyqHiY>z&5P=gJ!~WWPBc%vi1va0epqse?v{2} zmw1sT*XVG!Cu@`4@M3%E-F9&{S!e9%$fiDSJw!<3J>#Z==!$|jt6z@m;=^q)o+B!* zj8{IFRjiTRJ;MZw?-wjD-fbM_arXd@V{&D>5wb4#9q=No5|r?4a(l7|`+YCgZ0)hK zSq&yahktG;R}30CGjd6B{Uz2V68$kA z%2=}$t~9Py+zd-4-0(;<1ZjnVA_%P9w88La$h&siNV`@D1;LQ>4x@H?@;GrWd{`LnL|RY4P@5seKk*ABSsbmvs|Sd=wWiL9!|HBXeI+Dr=r%sh$1U z?PfCBUFp=oPLR-@+$YE&3qqlXniISk`(kC5VQ!I)UrjLdVYs0wp*zq6K{D=YBUIc7 zv*6tnUBNK0wB4}`3Ax=YNp2K$fS{b5A`UbeMGY5vI2D7n12{v%lG|N9s zwrd%DuGlc~beSeCTOjjZ$>L27AbT-r{zQ7akl2vrQP`E`Q8eH4NZBdn(Y4w14xAn3 zipqFsdm^!0b@9x7m}Qb%gs8-fL&$V8m0oD)qU(wtIY-@aHyOv7N4qjWlvr{0Nr>eW zbQz=?7??Q(bCyoXR)?*Te3C-_|u(@(ziH2e~IhdD>6(maB%?hEyMf(}XtF z^$!@V%S9k3UAtT3IN(zk#hR_J5V}LIVz?v@Z|qRQ9LHH#kJ_C`Bg>M?h20=V^Npd_ za^Di~?NQ<$fac7mQ$1n@qDd}E{Q|{<3m{fATf#EcQkZZS^L#`mQ^x$zendm)C070R z7ggjPtjegcB{G`?;efTnHtd4IApx$)i$qGx#DSeJa)+=bLL@Q zm`G|KowwaItTT%$Q<%*GOk|#*UJf%c4vT)n{~UAJ#g;z8GDu1 zDs&@m5#WL4kF8f?cS}0C6R2#8uoM8r;9`Cx`gmGSf?cFFMa7mH$cy8CtSc+0OLi4g z`|?iOmF1xuXOg?rUUMAJDF$66=9tyD+)r4ADLiH~x*(C%lw(M@JDQATpE0HE^(50N zj~qQSa{ALws9^``UYK`=Z^P{I%gF2_u1DF#!%jU%=xv*16j4HEeM379C5n*(|4Lg73d>auW(`7`M9qtjKa(H8RZSb<@ zZ9?f#qD;BA-*BIny`H1s2`3k<{%T9?uxDUO>}2muOl@qkmVaIt6nq|K_&4gBiQ2z> zX;U8*7wmpkWv%o2_SXDR*Eq@#YfQje$`7zvO=I&Tn$r0ckNxxMWM1w0?nf-A#$^M) zp5?9=WbSp`u1o*+$$!%1dj;#7hNFCoax)%P|M*_F~$pmfRN6?qGpd zCs{*=Z8cq7o5B%Z+Ox21Fy?JCQNK4oV*7!9n7X4<<^^D-gK5siJDyHvP=y>c8p}#~ zu3j5}?LV&XiRv+@thj{*pGhC3T`W4tWPNHM#Z0zDRv&WT%RPv-2!+g9jzU@OC7MwJ zay~kt-j+zGpwMw^Y?s^+!Y%{4CP9$urXbj;D7I^utzxKFPGgRRLqaUvaPJ zQFhkB{jtZL7AIho;yo%Xw{39~^}9%n zr~8{y$?oO^7Uk~R0j%?Aj0Drd9Ui=5RkpKpyG;WpAd@y_;>JgjR_us-^+3h*?ja~T zC}gXw%zZfsK?+0XjSHF_hto>!$ha6cQ!egW?q(N?WL%$JManjKdM_`u+ipXV0HK(i zaxj5EhL}&(Cw9akMzXr}r|9+THuKadl(cGtsRE_67q+b%gqb&tw$e>kTYai`A!j&L z3bMNX{WRRJU2doyNfDR6Zr%gseO!f06gj+B&V<^#I04h{cBEr~1m|+gK4M~{j zEc|MN?Tyjp*+XA9=5RwgjhH5iwvh|hu0*Ic_r{EKc{65Yo`B~S$BkbeX-gj-=oULX z6f1@t=Aun)$xPR#C6(?JQ|o*42p(hQk&S7Ige+zq9^JmAX7QF>Y^Qa6z1 znS3rA4k(AwP2$264>P(40f0p25~C0KB-@!!yLa(%!a{Xr&!b5}0;zVT>2U@u>>{Ka z60SdM8cDE(8?ON9rkoE2I*c!SxS8z9l(GI0NOxk6fW>Fc=Uk9g3@vG{LfO`AT3xzh zN2and!z%(+_&E>A@eaSbfEUU&ATGFT@wqU^<% zg=5gH0o=`zh$S+r7oOlmw-GvgWg>$!N@lDBLDZ-B z-VJ0)b`pth@$K4?wz#`@;#CbBB#zz;PKfv<6Z7ZWg*SZ zjB4QBc~_RjhRK&ILijB^KF?SZXg_Aq0~dPfR_=#JdT!Igo49SHZOnQl28hbUb* zn@yy}eUeeo&`2^$?=F<$7kZ01CaKs>vfIpv`!QGh*brNS0zF>^*fY+XK;GeYo^g@!LZN?$MYv{}b>Lze;KUoV8a2T4c3^a{?JpFE zF~}$u=0-tYP`?*z%EsdWpmj3(dW;k^g$h zsASLyV-yL~d5q8t2YUNOM8}D9UHD@}x1`4il$Se3wMbqy;oB%<UEHo6YZEa^4c3>x*#lj*1u6>%p7KyKWF|)UNY-*|JawT}AwtW^(@aPt|t6%_Nae?0Ae92(S(fw_4qZF}+bOYihjaB=3>onB5 z7+|Uc4zAr;uh<#*ocRh$Q>$Hc%r*e_9d0gpLD;qDs9q1v@Bq+F#Z@VHP~rx1e={mD zZq_%2o2R&OyFP`6oxtgt#72S#jNz@t~_OdpM-C!=t3r&Z8PabVbw*ls6huURcQIWer=A}s+ zV5~g1!>(>OeyW9ISbo^Ciw$U-hka% z4xkt=EonOoxKGYxJ(8v3r2^ykkhYmKezXWGg841hp2Ixnq>W0Ow00*>Un|Z&`?7Rm zm^VRGm%I?-In(J7G`E7RcO4!EJ29jUYjM(b8BD8q53ZiU}&C#+u zb=)~8Z;aD?;TFrjPjAbG2H2j0zr-ZLNO+gyO_1C~k$#MHv9yR=1}}K+P0(U@E9J!l z874tEM1p`Z-ka(w%S139u=T{=jyq@7Yj(xhh4*LLsunL^4ATcYNI1IS+S(r@Ww-xC zv5>glAT&V10h`3>6VDoryuoJ7;@-Lq;uRXU!jk(;LWWA}+$l9LF^SnM*O@RkNPE*x z%;*%ZM5->>(}J*62Czf?#bwC&fxJl~FPy_yW`5)RPJ^O*6K_ojlXCA+NJBh|5`?jl zQ2t`@cqf@?gYl4grwa^}jf+hv*FcHy#$(r;F^yYZQ^zFDG{$?A_&a>=nzDgc_IeP& z!E2J&&RhCG#`@Tf{sW>Bz{ zf5+Y?HH$oH`dvM$TfBP=cjr$7Hh>4Hk;MSSZ9UP>eV73_aRSB0L#6O&qQ^Kc@tK58 z$&9_*C-I)T8#{%$-i`j5*GL*LIq>HSXEx(|EJ=J{WwSuM#fI;wEW~$I;`r`Lk5cOv zsaAY#C55lG;D#RlOMz-Y+yG+Z___({^AVduSU+GN()A&H5n}uCUtU?WPh66U)Zt5= zO{lXSwR9+au0GfZ9KVz6q;%HERxDLZR0aN1lN&*$@a0O}??Qbw_)0ndQ$-i5M*P>V zDuHjrSKgY0QgJsW{3&Q>Ia-^N-)^B3=t~w@H(FkfcJu(pOO=4-c-XT9dR&fFrarF} zax8)Gr>VIkYe*tLzo3@Dw`&H_N@6Tu6*T}SchgD@-q46BRtFCc9#+(gY*|qKz)!WI z`1ts7OFai=FT}@p7UFa7<;r8)Ty~}AL~RS|`20&F zm}=V9EqzP@_8=|}#*AhzIgu}LH$7- zcJ|pQ$@Ih(26)v(d|8Vt4thotYUxJ|#ik9V=MSgCM|ajK6<&z&{j3>SH~NH0G^s&C zx+G^DA3x$KGd_uy?i6f0aPZ}{80s^kwU=okZ2hqQAXirU#{6C2=RV}xh`hV;aPp#* zY3<0%Iw;EJ_*_4Kalemo;cASuOpu_#RCsAF#9(UcsZaV|8P`6vgZ&w$PHHa3gv^2u z+wtL~a!kmvWV0VV#^=n?{=9LX?a4p6)-V0zgfml8rqjCNrPmAZ$b}BINy-||%W||8 z2j3`(^UaKZPOgHK#BQh`O2T%f0zKq(K=_R~_Duz3;s*DNEHb5xHh$B5_7gBJ}u@ufcN*L~iqAjX(6Y8#)7@7ps*EqjDPU-Gwn^L-=b-WrG z#?^$YKek#dzj+ht=jwxPg^Uf`V%CmwXb!f7CX10E=AyKlwW=Jw?L+A_$QXuoGR!~O zQU`vhMK0C}?$%+=IuCMP1Kuvg?^5Uy{&Iydzbf1TJ>9{a3tX%dJ!ih{!q+TXXI5@< zz+2Va5m3`ytP}P{3-s9rjF_og&D;oT9iA4LpbT$=;dhbR2-uEV)yjXA3mj+KOR^%I z)&iWyDLDl$1hznu)J$(J8Ec)#CneDe$X${7#TScU2{nz98CRM{t~1n`tgiFSmGuzt{G`rVjA)yp+Sb#qDAX1*WGrEw0$`KMkb7` zQzoQ@^V@UM;^rOMhkT36SPly@vXIJov?komfSY@qdLnFpyPaQB^MrE9%mI zlw+QlnMB)e0c2O7){2mQGLEf?RcMFdLKo&x)u=5Jd+&}{t@M^7Lk+-LO}oKLY|V+w zX@dlDc8|!3Q9V%$IPQ4&cXZx{6X&f*PR=CSUdC!0)q;ypTuR#sN+}o1F$?|1(#<>) z$-yU*dQkH&aH}D2yg4c-&D-kZmoW}smmNRXxIB#=Ki^64bMx^_IAva9w7I*X4qAKa z++22|QpVvYB>ecbkIT`z6XiS!o^Cx+8K=zEHEoy|I03<4V+mH%Q+_TiQ6Bjh$@%ak;$iWJ@>+j>k{7 ztW)NGtPY&#YIe#TUvj(>#^G}H@$!tz*$a-B>m<0j@p$=9orCLPrT$ZPz>?#YFdhew zmuGwq9xvC)aPWBfPo0C!;*D7MPsrf$N*IrW$ICN52alKQWH@-d{HM&phApz+qu2PK zSc#UMsFZOyS#zR%<8rg^L^)4_qgzi@#wl|ZACBeT39rprd;gSm0)&@ff%w|?inTx=p9x<8 zPXP~#>HA!Ou`)-!jN`61Ka8H>E`;a>3*aT%iJ4LkPwal!9Hwlpf;?@Ci?;?>WFiFTAV zqW^d&9sM?5JNO?f8qs3+XD0_B{;dWV^j`Z&6+a^rw!}+z33mWhcAsD^^tj` z1+&`0A#yx{m2Y$!v?O9uxPB{yOyU#JO+Q#5t9HYp(=rg4DanAz8&po#pWpm`+F&@|VJE>LVi0SfV zWSZv@rw7)QWId8~rlsbDnx`l9){efX;GQ^)>2a>3E^(#SoV7H7yNxK#l?#8HB;=gL_l9i<^ zK${CE^z2j9q!Gt?z|oFlzTp%%jPDSk>?C50F4`xtyCHSBWigxic?wej$nwvF<+uc} z3jduaXI`qzoTziI{~B5vj8Uo#&gQK&tC8<49}t#faZ+_qdj`%oM$QioGN{* zX{0na6c*ZFHI23~PnI}V`B#D<_mf=hNsX7wF>|~eoY}}VgW4ZosIr;jd5y zM6-m;k(2+a=CvXl-S9Y*k6b&rig+h(JQp-t(@3RzH-x7N=Jtv^2O(=SyqhzfGWMO& z95F~ZuOO)z9`43^>DAr-terf!#O<5lCgj?JJo#Q;bDoEiaAp%jDQ9GvF>*96K!by2EM%L%9e-bvd9EYs)?>hIF)1yt`DR%T>!Rf(_LyvPJIGisfxOSC4vQ!`jSf2$y}3&78$8*74ju z$j#My0r=(FoeOenpSx!01t&_$@^Y!q9xt_7Yjf!qjh~Jwd57=h%B79n<<&oKzml*B zxW~w~VBCJ0J&4hyxzyvf*ZBFmFn@-%cP=?u4(a4Q9J3ShW|cbwR&xDabS7>^8R_8d zzbr26Qo?xei94?pG!JQ>-EubTNgbf@X$6d57W&)l(rBxj{t>G(yD8{v>H*rRqMuJ| zLmG23kH2>VeeTiRA8>DwJGsZIVQ#UAZC17!HRH?0D2aB_CiF{{c`FHTqiliBGb;-A z2v|SXqAs)Fp~X)MHOPvCy#sEDh~-t(ftZab7xytx9>Y4&PqubD>j?Ay5^XtEHvGOo zBWuI`CEgv7zM$7J83A>gyAxy@>}bk{)4ZdjPU}EjYc@O?rjk2L|XW1jI_7cMydr&HGHIxQ|4r*HnY{c7lTsf zF+88w@02chte2CLQ~>>{wO{XQjD&?C#XeO(m=>viBOxBQRbbbum{g zvnume99M>sd%cmiitDj(*XOZY&ehNxFS94+4K&I+wM92-<;tbHMy{Eg!0XL2V|JrO zwD!4IOj1)P{@NSVVLQrkuY|hOV7NPj!fjj8 zd9r!jiD5Q1?zB9BR?~4f?)1b`#uq+;2IFMO zSSc7SA4XPoVA^`)&XSB1%g7GK`h3rXb;pe^Pfq#qUm~zPT{1G==$3k=Q{`lEWpHGk z9a5L4Uh*Z$t}zyG%31@ft^Mod05)yX4cj<$Bx&wk(_3U-k}iNtt$SpQjr77*HhE3bwY(o?(vl~ z+uqIjd>YMpV@>AgArDTX#Y_Ita?$2lV=W{`^sNMpxzu3eFmJ4!oTy{0)~7XKdQfZG z*Hs4pr%)9_x$O`Ub^YB&p>n=?tmnKk8I5W-s}_|m&({s}PUO3zk;x4KyT$#s(H2Gr zaH4SWVVtXrxS&u4(<|eyekPvUf;F3$(ns0_^bWgbp7EI*e-#X#hnhbQ73_Z#j`a=f0OXiuV-jkV{?Z&AJ$;w&|DUt^tc zug(m&FFfsL)*l@^QA(Fn>;p||)@aN8+biN-8r z8qd|%AeP<-zB$jWF?)+ISE0@2x(I_7+o{Sk}S1ym#m2yg0_2gLNpM z+i>?TocTbHaXhfkbVks+8ncbq@aJ<(%{X4G)YS3bpjQ=5;4(M!>+iK2P)mbA`nwvQzQY{*p%6OWpq*m7n>N)&Ix7fS8!;;6yv0!8k z=1$KzsYmrMiGI6p=$o;y{cAGk$n_$V++7S`hKvN76B2Xg#ge#~4*#wL=GC9)zww#( zKX`7#ZI2!a-k&RTFk-=|p&<1}{ zQUrEH2mc+Flxb%BcS*)jW-*~|X2=Iyy)V z&-fK3o{?`zz#D=;CHPZ<9~1nT;I9e(n&5vC{4eM^+ER+zS;z|#_=4ci3;sOu!Eg8r z$Otr$eU|9QCHir}UlRPKVikZKJY2}95Znr5DurhRLIpu5j507u9Q3RNT?+?-zHm6~ zM?^Se*gGRIDd+=hUUVR|_QqwNtnQgDXopnKOub5L5K!s;M15_ks(mN>Ct$JGZ7sZoslkp$U#me$Ley0muzB2W5z=!^-g#HsxT5 zLk38^Sny&D6B&--37AH|8Z>2>lm>%VNulNl^iNp%pn0H9UXPY)M;LqtrTtZmZwLjH zfc+p!$Z6)lL^C;a^JiiXn_}BF9fL5V#PlUpQZhLhE-9HFJ$O#^;Ns}P<n0~o*h5>p2mW8_e( zGIbObN{Yf#?N(n91Y1K`lrUTnwUUqzz4e7a2eA}5LCmG%pr4WrO^=}p2pTN+VT?ne zNkM2lM)^V%!w^I`6beVd#~DDwk%QAC2g^(FgcauT(8G~~v&am_LKJ7cO=juDYdX z=un}9fXL9zBDsTi6`_sMi6#>k)o8Dq;K-!mMVFW~ZuD&~a_92kWHw>w8ngnvCF6CJt^4aEOw+l(^!&AF_ExPHGJ9eUL*_U>uHFp4#0<@z_G z5%;*M?{$&;BEf=Ow&5+l-%WG0EEvkAVdKa!H}d<%7}UtYipat0$iW)ne80^4{!(&k z4!ZR$bo&#?Qph=ba3v|IW`h`w`7FESrkqgdxM*bPajfwnQzJAExb4>al#4v$BF7-X zObX`ZwU3Jp7tLS*jR7*e^)F0B*Ps))Alxpsh76;lgTD@y`=Y%Rf472{&{b(SgcQrE zK`CX=>QIqwbSN_Pl8DHh;T63id}ae=DbMHNYi{{(xX52hI4DDkqi5Q~`CwxYa;7qN zSOrkERJd~jK?h5VRe?eybUr6m2(89cm$pNRe4E&5Tp#ve0-_VI!$c^O2oXs3k1?VN zKuCfTsOUCKIxWGPu`a)&Uh$N_`B@D{iUx+kj88lYL!Kxw*0#w3&{BP|YQf8UP zay}s#1c~CPRm=jiLVC42r%hH1y%zl_Lb}4BFLH1_#_r(yLTR~BraZ(KK>y8v=}g9S zgqU^G5QVbQ<6gk)oCB6qawgt5J52f;8q4xgi*Dt$d)6}YC z*ZN^GC_fYyb~Xg11WJ_>0Mi5x0UD_M1q7R#+nW6$V(*y>P)w}7F}Bs;F;xTmJxJtN zq0ZX1Z9CdKoBg%zja!gnQv*Q#CjT51#q9FW|Dl;MSzx+21&*&ES`V{tXgxtIK?lJW zg82Z0k03>}tn{9hT?l!k(83zFC@pA8shH4CL5MjY_7%(s;|VwgVW*%3<;)M;B-l6< zM6U>nSVwm;@#Cy8gwS*R1(Cr=k*%1)PZ2yraE#!2W}#I?;st^?2>yb6bKL5uAmkuQ zfki>EoPb?C$lk%S0O)qpPR})eXrhO*grVsKD+pFQ1%(CD)DoM9OQ};(gq9ve<0A)q zQ2#_Gy#`?L1E4k%ImE7ff#7z6uX;5+!sw?7eh!vctxWO>f?uPTB74Y?+dH6i48@EP z5)45oq6bT*6WH{Gq+DZ&xK%*gSYAW6i!IkVmykblu*$|^p4$wZ`%VG+967kc3qsEW z3|d=cN{}gS^I}djs>7z{9A<-Lwz}*Mn-OM8%qKQFE4f8aLH47~SU@!)CSt2GM_Wk@ zK4Mn*M__k2+=X(hkCgS$14s{%MWXrw5YwZ{Fn-Lsja7+?pd1PSW(gD%7n4Go#gNP) z7^<+gq4XiD*bqf~MQ9Nuh^%NOC=z5zAw$jjz-@8Kgir`u4*3n)DDK+1da@DF@~~&Z zXeahOpu?uM^BG6O94RphAfi{GA+KU{62c}5O?0ri_8~daV+nbboyHG4IXyb~SFx5v z+$CZtY?$%_isiP+P;Y=SXfmsH9BCxVh0%uMv1n4EffLyH!ni>iumb7PUN#NG&#GwZ z+TSUKDmbMi9G-&z3su0Gf|R91g~POY{a~^6jjRS|r8}swsN5L7G={;7Lb9R|?hSS_ z47~}t;7}-J5Ud2dA~XZB$e6Q9(H>b8WpPCM5Nd!W$wg&)5SQGEB87BHHUm^Qm>0#U z&FCHwB0oPc%=v*3PaA^!F-$l^@P`%!1Zf8CUOj_m97>KJq`xTyo{=&25E;y+8G+JJ zAzEzFAlot@?F0ANxcP<5%C50}h^qqM$^*1lXM{}4S4a#Kua*>RAr>5nA_xay2vQa< z!d#Wej$Gm`sKP8>5I6Q4nb3bg3?3kIpoK6$XCW2RG6_0$4yP8tP%9yH_&L~+pQFN{ zs9euc4xU0hp`vqWBp5bI+8+pfTHw!75cs0)(s2gX4AtSBz8QbPc|+dcRK_3gO6|*N zq~ofk)Jm~y>L4;bWf+z(< zRjDsULW)o;MZ5%sJn(W}e&5XO{qfoEISss!vDe<6o%!aQZ@>Bf&HRG&!&pRNI)50= z26ORfE+5J#!o_GV7%dix@vKpZ7ZLy=jZGHwMkJO9=E-(iVS@sc!HyG+;|e=Uc+9{G z;Rw4N3712W?Mon)7==N$Cc7BZTL2KFNe;pxPz{ma%fLd(U!5sjz8nt2yjEdTyT=yz zvJ!@|NrlG;$MXuC-95gZA1V0r}(rs+O;616Z`0iu`8-TEvD4NI#@esjInmt55 z(~*G)Qtnj%TS4r3;xJF2QCOlE&N;duM_5DXoWY~R;=Nbi=KzY-$vaHwdri9?*i*_a z3eD*?x`3TnNu;gWUr)vAtFJ@fF)Vx6tERxdxhSfnRGYu7$*a@_`JgA zdu3!NtUyi+IfMd8=lYa$}m?tVcydJf_V7Kn&ol(-mX2Udx(e+Tv;s zO&}0~maVHsWjYs+XJh%;L?{u78o|lL@$STcEnX@cZkj0e)T5w`kXxKh(eI((UmN{v z=#?*?d*Rd7B)pICm$2?bCLVKvY;stKC0n5S8TeY#cNt#2N)8Ta%oSJ2sVT? zK1(Z^v?@tPKD4?k;C0*}U&TQDSUtPT#yeum}r0h`E9T`J{rR^j5)UY!aA z?EDp@oVE3G2|)9}%_w!SfP zz(db{9C(t{=OY#^nw+G<^#J97qN<2`;!jZ1lTS2ATj5Sxo9s*C?q-91lizufDIYdH zH1xxc7wq@%Q`ooI9jE`0huy(c%JKOi{iv;XA2@!z8%P@~mZ3er@RZZ`?tRBU;9;In z_(?}qC24DOC(>sl^wSJ@b4MOh(Nu75QdLpj;_63fdXQ5zFx^d0Yxw%81=_W<@~8#c zt#NE?fzUldx$9dl)lI|yDaH;rl};1=VXJnd;otv`YTvta{xlixhthzoC0hAN6}TcqotH?I(CK@V4U#2fxxFUa#SK z_I8_brEwQ&-o2 zyKkZz|EZW6p!an530x;}E&f4ai$80u>rap|jBFk907c+8lFH_$SMXxcjw3_p$d3y!JYT}y0?d#J)T((9DMGxe-rW=>!&M~lA3HO+ zqtEQVkzO#$C%+3AOxC!eI*l|JFrXxJS#o|xv6k_c%(~sf-=tAL5Ah52chDgW2Dw=? z4MtbCq4Yx@MjWw3f1?=91`$8S4kPXyQX>O)N@D~05(d>oUYPQeS@upCu?(YHqCp!v zh{@Ay z?;yA>z|5XD1GI9{3oXX3VRHg%V(>*q*Mi1Y3AW@n3O<9-f;iWOJS3avhlm!XZbYGj z1zd52BSZZ-t_1FA6GRM0Efo>oU=iFCv`8Lz| zRygkd`Zvi_>t$1ub5hejtlIcAOh;LTQe|b@_x$qw_@qy>>)A>nYg!d!+P7iYzEd*? z2M-P=F&H(%=-`7EDS!J^c(@0kru&R`OYuL|keYSkAI6za8AyH4|HJ@OOw@pwqvHUzx0 ze1?yNPd5sSwbB|oI4g$TBh`pYRfB8M5t#JoJDfMx3{x}d@3b##FI3hr6Ib(TtEE}Y zu-Xt~F>Bg}%oHaQ*oGUI^*{&j$v{&G2#^f8UucG_P3NE26+UnFXH@Es-2a~h{sUq_ B+?4 Date: Tue, 8 Jul 2025 20:00:34 -0500 Subject: [PATCH 014/230] Update ProcessorEmulator.dll --- .../refint/ProcessorEmulator.dll | Bin 30720 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Release/net6.0-windows/refint/ProcessorEmulator.dll b/obj/Release/net6.0-windows/refint/ProcessorEmulator.dll index 7626b716c201ec8b0f864fb9e6d157ddfd93f954..3ce7172dfe138944de8ad7a03a2981c75787195b 100644 GIT binary patch literal 32768 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 literal 30720 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 From a6b2141dc20284e518e9eca17f32d33fceeff21d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:36 -0500 Subject: [PATCH 015/230] Update ProcessorEmulator.dll --- .../net6.0-windows/ref/ProcessorEmulator.dll | Bin 30720 -> 32768 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Release/net6.0-windows/ref/ProcessorEmulator.dll b/obj/Release/net6.0-windows/ref/ProcessorEmulator.dll index 7626b716c201ec8b0f864fb9e6d157ddfd93f954..3ce7172dfe138944de8ad7a03a2981c75787195b 100644 GIT binary patch literal 32768 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 literal 30720 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 From 4aa430d15cd255ea8ef8d6ef3e2efd95e2d67027 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:40 -0500 Subject: [PATCH 016/230] Update ProcessorEmulator_MarkupCompile.cache --- .../net6.0-windows/ProcessorEmulator_MarkupCompile.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Release/net6.0-windows/ProcessorEmulator_MarkupCompile.cache index c4457734..ee886d30 100644 --- a/obj/Release/net6.0-windows/ProcessorEmulator_MarkupCompile.cache +++ b/obj/Release/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -12,7 +12,7 @@ TRACE;RELEASE;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_ C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml 2-826070488 -341258318617 +36-1622069342 1942128195826 ClassicStyle.xaml;MainWindow.xaml; From 0a11a70c534cd217d75f6e5f4ecef13a0b166b20 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:43 -0500 Subject: [PATCH 017/230] Update ProcessorEmulator.sourcelink.json --- obj/Release/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Release/net6.0-windows/ProcessorEmulator.sourcelink.json index 1330f1df..cd9106ce 100644 --- a/obj/Release/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Release/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/064b293d6850363c34afa0435720034d772e4ab7/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/dc48fa1239f70f4b1d58a71151b9cc20c9372e4d/*"}} \ No newline at end of file From ae96dab90a04a7c3bb175d20790933f1847d1a01 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 20:00:46 -0500 Subject: [PATCH 018/230] Update ProcessorEmulator.genruntimeconfig.cache --- .../net6.0-windows/ProcessorEmulator.genruntimeconfig.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Release/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache b/obj/Release/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache index 50de631e..a5ffc99a 100644 --- a/obj/Release/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache +++ b/obj/Release/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache @@ -1 +1 @@ -4a925fba5f6f7c769ea2e138682bda159a4768a7d67f28179ac24c0e6247a2da +c7a94a20f3992490a6e27dba2b1bf901560d0cff488f14b142569e3cc258c453 From f061a00394062fcb67fc1a84a4829d4d482ea371 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:37:50 -0500 Subject: [PATCH 019/230] Add drag-and-drop support and new emulation stubs Enabled drag-and-drop file support in MainWindow and added a handler to prompt users for unsupported file types. Introduced menu options and stub handlers for Firmadyne and Azeria ARM emulation. Improved Uverse configuration by prompting for hardware details, and enhanced executable analysis with chip contribution messaging. --- MainWindow.xaml.cs | 84 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 74 insertions(+), 10 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index bfbcfd9f..add51aaf 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -5,10 +5,12 @@ using Microsoft.Win32; using System.Threading.Tasks; using System.IO; +using System.Linq; using System; using System.Windows.Controls; using System.Collections.Generic; using System.Text.RegularExpressions; +using System.Diagnostics; namespace ProcessorEmulator { @@ -37,7 +39,9 @@ public partial class MainWindow : Window, IMainWindow // Add a default constructor for XAML public MainWindow() { - // Optionally initialize fields here + // Initialize drag-and-drop for file support + this.AllowDrop = true; + this.Drop += MainWindow_Drop; } public MainWindow(IEmulator currentEmulator) @@ -100,6 +104,8 @@ private async void StartEmulation_Click(object sender, "Uverse Box Emulator", "DirecTV Box/Firmware Analysis", "Executable Analysis", + "Firmadyne Emulation", + "Azeria ARM Emulation", "Linux Filesystem Read/Write" }; string mainChoice = PromptUserForChoice("What would you like to do?", mainOptions); @@ -137,8 +143,11 @@ private async void StartEmulation_Click(object sender, case "Executable Analysis": await HandleExecutableAnalysis(); break; - case "Linux Filesystem Read/Write": - await HandleLinuxFsReadWrite(); + case "Firmadyne Emulation": + await HandleFirmadyneEmulation(); + break; + case "Azeria ARM Emulation": + await HandleAzeriaEmulation(); break; default: MessageBox.Show("Not implemented yet.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); @@ -244,14 +253,23 @@ private async Task HandleUverseEmulation() string sigPath = openFileDialog.FileName; StatusBarText($"Loading Uverse configuration from {Path.GetFileName(sigPath)}..."); - // Example hardware config: adjust as needed or prompt user + // Prompt for hardware configuration + string model = PromptUserForInput("Enter model type (e.g. VIP2250):")?.Trim(); + if (string.IsNullOrWhiteSpace(model)) model = "VIP2250"; + string proc = PromptUserForInput("Enter processor type (e.g. ARM/x86):")?.Trim(); + if (string.IsNullOrWhiteSpace(proc)) proc = "ARM"; + string memInput = PromptUserForInput("Enter memory size in MB:")?.Trim(); + if (!int.TryParse(memInput, out int mb)) mb = 128; + long memBytes = mb * 1024L * 1024L; + bool isDVR = PromptUserForChoice("Is this device a DVR?", new[] { "Yes", "No" }) == "Yes"; + bool isWholeHome = PromptUserForChoice("Enable Whole Home network?", new[] { "Yes", "No" }) == "Yes"; var config = new UverseHardwareConfig { - ModelType = "VIP2250", - ProcessorType = "ARM", - MemorySize = 128 * 1024 * 1024, - IsDVR = true, - IsWholeHome = false + ModelType = model, + ProcessorType = proc, + MemorySize = (uint)memBytes, + IsDVR = isDVR, + IsWholeHome = isWholeHome }; var emulator = new UverseEmulator(config); emulator.LoadBootImage(sigPath); @@ -332,8 +350,14 @@ private async Task HandleExecutableAnalysis() $"File: {Path.GetFileName(filePath)}", $"Format: {format}", $"Architecture: {arch}", - $"Bitness: {bitness}" + $"Bitness: {bitness}" }; + // Encourage contribution for unsupported chips + var desc = ChipReferenceManager.GetInfo(arch); + if (!string.IsNullOrEmpty(desc)) + output.Add($"Description: {desc}"); + else + output.Add(ChipReferenceManager.GetContributionMessage(arch)); ShowTextWindow("Executable Analysis", output); StatusBarText("Executable analysis complete."); // Prompt to launch emulator @@ -366,6 +390,24 @@ private async Task HandleExecutableAnalysis() } await Task.CompletedTask; } + + private async Task HandleFirmadyneEmulation() + { + StatusBarText("Starting Firmadyne-based emulation..."); + // TODO: Integrate Firmadyne pipeline (extract rootfs, QEMU setup, network capture) + ShowTextWindow("Firmadyne Emulation", new List { "Firmadyne integration not implemented yet." }); + StatusBarText("Firmadyne emulation stub complete."); + await Task.CompletedTask; + } + + private async Task HandleAzeriaEmulation() + { + StatusBarText("Starting Azeria Labs ARM firmware emulation..."); + // TODO: Follow steps from https://azeria-labs.com/emulating-arm-firmware/ to setup QEMU and load firmware + ShowTextWindow("Azeria ARM Emulation", new List { "Azeria ARM firmware emulation not implemented yet." }); + StatusBarText("Azeria ARM emulation stub complete."); + await Task.CompletedTask; + } // Core feature handlers @@ -724,6 +766,28 @@ private async Task HandleSwmLnbSimulation() await Task.CompletedTask; } + // Handler for dropped files + private void MainWindow_Drop(object sender, DragEventArgs e) + { + if (!e.Data.GetDataPresent(DataFormats.FileDrop)) return; + var files = (string[])e.Data.GetData(DataFormats.FileDrop); + foreach (var file in files) + { + string ext = Path.GetExtension(file).ToLowerInvariant(); + // If unsupported extension, prompt to open GitHub issue + var supported = new[] { ".exe", ".dll", ".bin", ".csw", ".tar", ".img", ".fw" }; + if (!supported.Contains(ext)) + { + var ask = MessageBox.Show($"No handler for '{ext}'. Create an issue on GitHub?", "Unsupported File", MessageBoxButton.YesNo, MessageBoxImage.Question); + if (ask == MessageBoxResult.Yes) + Process.Start(new ProcessStartInfo("cmd", $"/c start https://github.com/julerobb1/Processor-Emulator/issues/new") { CreateNoWindow = true }); + } + else + { + StatusBarText($"File dropped: {Path.GetFileName(file)}. Use menu to analyze."); + } + } + } // All duplicate methods/helpers have been removed for clarity. } From 63d21b69e36fa90dbfe07a61e792c00739a42afd Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:37:53 -0500 Subject: [PATCH 020/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 7c13fa20..9cfe031b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dc48fa1239f70f4b1d58a71151b9cc20c9372e4d")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ae96dab90a04a7c3bb175d20790933f1847d1a01")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 64e7dbbc4992a5c657b69b27682dd00cc07a7543 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:38:06 -0500 Subject: [PATCH 021/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index c06878c2..450abae1 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -de610e942b4247181a2afb4fd75c6e80b66c8334f57bf0c13406769229df09fc +2e357e08697c7c8ab21a28e960f2f09eb8df37d15eadea8c3424ef82e9b597ff From 5946c93202c6898bf24d90e3d9cfd65615937096 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:38:11 -0500 Subject: [PATCH 022/230] Add ChipReferenceManager for chip info lookup Introduces a static ChipReferenceManager class that provides human-readable descriptions for known CPU/SoC identifiers and a method to encourage contributions for unknown chips. --- Tools/ChipReferenceManager.cs | 39 +++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Tools/ChipReferenceManager.cs diff --git a/Tools/ChipReferenceManager.cs b/Tools/ChipReferenceManager.cs new file mode 100644 index 00000000..f400bda2 --- /dev/null +++ b/Tools/ChipReferenceManager.cs @@ -0,0 +1,39 @@ +using System.Collections.Generic; + +namespace ProcessorEmulator.Tools +{ + public static class ChipReferenceManager + { + // Known CPU/SoC reference descriptions + private static readonly Dictionary ChipInfo = new() + { + { "x86", "Intel/AMD x86 32-bit architecture" }, + { "x64", "AMD64 / Intel 64-bit architecture" }, + { "ARM", "ARMv7 32-bit architecture (common in set-top boxes)" }, + { "ARM64", "ARMv8 64-bit architecture (modern ARM SoCs)" }, + { "MIPS", "MIPS architecture (often Broadcom SoCs)" }, + { "SPARC", "SPARC architecture" }, + { "ELF", "Generic ELF format (unknown CPU)" }, + { "PE", "Generic PE format (Windows/WinCE)" }, + // Humax HR44/HR54 Receiver SoCs and components + { "BCM7346DRKFEBB35G", "Broadcom BCM7346 SoC: main processor for Humax DIRECTV DVR" }, + { "BCM4506K0IE33G", "Broadcom BCM4506: satellite tuner and demodulator" }, + { "88W8801-NJR2", "Marvell 88W8801: Wi-Fi SoC for wireless connectivity" }, + { "MX65L1G80GAC1-10G", "Macronix MX65L1G80GAC1: 1Gb SPI NOR flash memory" }, + { "QL01GS1DHSSG", "Spansion QL01GS1DHSSG: 1Gb SPI NOR flash memory for firmware storage" } + }; + + // Retrieve human-friendly info for a given chip key + public static string GetInfo(string key) + { + if (string.IsNullOrWhiteSpace(key)) return null; + return ChipInfo.TryGetValue(key, out var info) ? info : null; + } + + // Encourage contributions for missing chips + public static string GetContributionMessage(string key) + { + return $"Chip '{key}' not in reference. Please research and open an issue or PR at https://github.com/julerobb1/Processor-Emulator"; + } + } +} From f88dd410af98eafd70b44c689f313c42e983bf72 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:43:18 -0500 Subject: [PATCH 023/230] Add STMicro SoCs to chip reference dictionary Added entries for STi7101, STi7200, and STi5500 SoCs from STMicroelectronics to the chip reference dictionary, providing descriptions for each. These chips are noted for running cooler than Broadcom equivalents. --- Tools/ChipReferenceManager.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Tools/ChipReferenceManager.cs b/Tools/ChipReferenceManager.cs index f400bda2..0f6806d0 100644 --- a/Tools/ChipReferenceManager.cs +++ b/Tools/ChipReferenceManager.cs @@ -20,7 +20,11 @@ public static class ChipReferenceManager { "BCM4506K0IE33G", "Broadcom BCM4506: satellite tuner and demodulator" }, { "88W8801-NJR2", "Marvell 88W8801: Wi-Fi SoC for wireless connectivity" }, { "MX65L1G80GAC1-10G", "Macronix MX65L1G80GAC1: 1Gb SPI NOR flash memory" }, - { "QL01GS1DHSSG", "Spansion QL01GS1DHSSG: 1Gb SPI NOR flash memory for firmware storage" } + { "QL01GS1DHSSG", "Spansion QL01GS1DHSSG: 1Gb SPI NOR flash memory for firmware storage" }, + // STMicroelectronics SoCs (cooler running than Broadcom) + { "STi7101", "STMicro STi7101 SoC: DVB multimedia decoder and processing unit" }, + { "STi7200", "STMicro STi7200 SoC: high-performance DVB multimedia processor" }, + { "STi5500", "STMicro STi5500 SoC: common DVB set-top box processor" } }; // Retrieve human-friendly info for a given chip key From 98122beca311c936226556c911ae86d7bd3b27ee Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:17:30 -0500 Subject: [PATCH 024/230] Add BinaryTranslator utility class Introduces a static BinaryTranslator class for cross-architecture binary translation. The Translate method is stubbed and not yet implemented. --- Tools/BinaryTranslator.cs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Tools/BinaryTranslator.cs diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs new file mode 100644 index 00000000..d21c0166 --- /dev/null +++ b/Tools/BinaryTranslator.cs @@ -0,0 +1,23 @@ +using System; + +namespace ProcessorEmulator.Tools +{ + /// + /// Provides cross-architecture binary translation (e.g. static recompilation) between supported ISAs. + /// + public static class BinaryTranslator + { + /// + /// Translates a raw binary image from one architecture to another. + /// + /// Source architecture (e.g. "x86", "ARM"). + /// Target architecture (e.g. "x64", "MIPS"). + /// Original binary data. + /// Translated binary data for the target ISA. + public static byte[] Translate(string fromArch, string toArch, byte[] input) + { + // TODO: integrate Unicorn.NET or QEMU TCG to perform actual cross-translation. + throw new NotImplementedException($"Binary translation from {fromArch} to {toArch} is not implemented."); + } + } +} From 607facd06864065de382ff43a2a2b6982aa02870 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:17:48 -0500 Subject: [PATCH 025/230] Add cross-compile binary feature to main menu Introduces a new 'Cross-Compile Binary' option to the main menu, allowing users to select a binary, detect its architecture, choose a target architecture, and perform cross-compilation using BinaryTranslator. Updates the ReadAndTranslateFile method to use BinaryTranslator and handle unimplemented translations gracefully. --- MainWindow.xaml.cs | 48 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index add51aaf..ea1fb771 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -106,7 +106,8 @@ private async void StartEmulation_Click(object sender, "Executable Analysis", "Firmadyne Emulation", "Azeria ARM Emulation", - "Linux Filesystem Read/Write" + "Linux Filesystem Read/Write", + "Cross-Compile Binary" }; string mainChoice = PromptUserForChoice("What would you like to do?", mainOptions); if (string.IsNullOrEmpty(mainChoice)) return; @@ -149,6 +150,9 @@ private async void StartEmulation_Click(object sender, case "Azeria ARM Emulation": await HandleAzeriaEmulation(); break; + case "Cross-Compile Binary": + await HandleCrossCompile(); + break; default: MessageBox.Show("Not implemented yet.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); break; @@ -460,6 +464,30 @@ private async Task HandleLinuxFsReadWrite() await Task.CompletedTask; } + /// + /// Cross-compiles a binary from one architecture to another. + /// + private async Task HandleCrossCompile() + { + var dlg = new OpenFileDialog { Filter = "Binaries (*.bin;*.exe;*.dll)|*.bin;*.exe;*.dll|All Files (*.*)|*.*" }; + if (dlg.ShowDialog() != true) return; + string inputPath = dlg.FileName; + StatusBarText($"Cross-compiling {Path.GetFileName(inputPath)}..."); + byte[] inputData = File.ReadAllBytes(inputPath); + string fromArch = ArchitectureDetector.Detect(inputData); + var targets = new[] { "x86", "x64", "ARM", "ARM64" }; + string toArch = PromptUserForChoice("Select target architecture:", targets); + if (string.IsNullOrEmpty(toArch)) return; + // perform translation/recompile + byte[] outputData = ReadAndTranslateFile(inputPath, fromArch, toArch); + var saveDlg = new SaveFileDialog { Filter = "Binary Output (*.bin)|*.bin|All Files (*.*)|*.*", FileName = Path.GetFileNameWithoutExtension(inputPath) + $"_{toArch}" }; + if (saveDlg.ShowDialog() != true) return; + File.WriteAllBytes(saveDlg.FileName, outputData); + ShowTextWindow("Cross-Compile Result", new List { $"Compiled from {fromArch} to {toArch} -> {Path.GetFileName(saveDlg.FileName)}" }); + StatusBarText("Cross-compilation complete."); + await Task.CompletedTask; + } + private void ShowTextWindow(string title, List lines) { var win = new Window @@ -638,12 +666,18 @@ private string PromptUserForInput(string message) private byte[] ReadAndTranslateFile(string filePath, string fromArch, string toArch) { - // Read a file and translate/virtualize (example) - byte[] fileData = fsManager.ReadFile(filePath); - - // Translate and Virtualize - byte[] result = fsManager.RunTranslatedAndVirtualized(fileData, fromArch, toArch); - return result; + // Load raw data + byte[] data = File.ReadAllBytes(filePath); + try + { + // Attempt static cross-translation via BinaryTranslator + return BinaryTranslator.Translate(fromArch, toArch, data); + } + catch (NotImplementedException) + { + MessageBox.Show($"Translation from {fromArch} to {toArch} not implemented.", "Cross-Compile Error", MessageBoxButton.OK, MessageBoxImage.Warning); + return data; + } } // Removed override of Equals(object) because DependencyObject.Equals(object) is sealed and cannot be overridden. From 4fea7b77dcb5a93edb32b6716e6c1f3ec5590e1d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:17:58 -0500 Subject: [PATCH 026/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 9cfe031b..23b1d205 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ae96dab90a04a7c3bb175d20790933f1847d1a01")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6a6242169287421a4b5b19c9f49c6ef4116fb397")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 3152eb6ce64bf2dd76a9cddc87fea6f50be2fc9e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:18:01 -0500 Subject: [PATCH 027/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 450abae1..360cb028 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -2e357e08697c7c8ab21a28e960f2f09eb8df37d15eadea8c3424ef82e9b597ff +e111d089c30eb25cca16116a41075767778978c70dd19805f88c30f66d8712f9 From b907a87693db7c2c945ae44eeaf838f03ef95ce8 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:17 -0500 Subject: [PATCH 028/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 23b1d205..322b8d32 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+6a6242169287421a4b5b19c9f49c6ef4116fb397")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3152eb6ce64bf2dd76a9cddc87fea6f50be2fc9e")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 52c5230e061dd8b8bd17e9c934600252fb59537c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:20 -0500 Subject: [PATCH 029/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 360cb028..c7bfbe7d 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -e111d089c30eb25cca16116a41075767778978c70dd19805f88c30f66d8712f9 +031fb3c573bb86f342ad250e7f632adcc59722383d8478af7d13b3ec91abdf42 From a8efcef93a11a049bee4729494ceb00bd0c04d80 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:23 -0500 Subject: [PATCH 030/230] Update ProcessorEmulator.assets.cache --- .../ProcessorEmulator.assets.cache | Bin 152 -> 429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index 2a7c798742856d17faed4620771b8f4e320c7d57..d91c012af91d91cddf4d4999114e3f0aa688ef76 100644 GIT binary patch literal 429 zcmWIWc6a1qU|=v)EZ&t?vasmidX{IjKc4dU>VksU8ZsrxQt=~N~DM8B_`#hDwO0aq-Ex% zC_ptSI42eqm*nTA>iMOX1eYY{r6d-m=qdQ+!xR)Nq*i1Wmnf8HmSiZDWMmdAWTq%& z<|!2Cmlh?bsv21os~TBaDS%y~mtT|)vI_)2?gg=#fjAzA-QKB{P`h12sBI?;&|W^5 n%*6D({Nj?#Was>pR5rg*Lqh{Yj^Na?)S}FiN>JcCg)z}wxChk=1X@a&JnaR+Bt9&#{Zv|O}t{_fm+bx)>mVbF?_&H5{nA~9v6 Oq4Gorj)@^QKoS6s8x~~% From 4b7f3147ed4dd36575115b8ac7ac387bd9a31c21 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:25 -0500 Subject: [PATCH 031/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index e39bb231..973a7a4a 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -43,6 +43,16 @@ "frameworks": { "net6.0-windows7.0": { "targetAlias": "net6.0-windows", + "dependencies": { + "Capstone.NetStandard": { + "target": "Package", + "version": "[4.0.0, )" + }, + "Keystone.NET": { + "target": "Package", + "version": "[0.9.1, )" + } + }, "imports": [ "net461", "net462", From a57c3a7cfe9fd71bab9492a43027f019a7a9ba4b Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:29 -0500 Subject: [PATCH 032/230] Update ProcessorEmulator.csproj.nuget.g.props --- obj/ProcessorEmulator.csproj.nuget.g.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.g.props b/obj/ProcessorEmulator.csproj.nuget.g.props index 4f31cb6c..538f8078 100644 --- a/obj/ProcessorEmulator.csproj.nuget.g.props +++ b/obj/ProcessorEmulator.csproj.nuget.g.props @@ -1,7 +1,7 @@  - True + False NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ From 6093c191974a9e82a969426e3b0cd5f5b3c91a0c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:32 -0500 Subject: [PATCH 033/230] Update project.assets.json --- obj/project.assets.json | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/obj/project.assets.json b/obj/project.assets.json index 1ef106b7..969fb2c1 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -5,7 +5,10 @@ }, "libraries": {}, "projectFileDependencyGroups": { - "net6.0-windows7.0": [] + "net6.0-windows7.0": [ + "Capstone.NetStandard >= 4.0.0", + "Keystone.NET >= 0.9.1" + ] }, "packageFolders": { "C:\\Users\\juler\\.nuget\\packages\\": {} @@ -49,6 +52,16 @@ "frameworks": { "net6.0-windows7.0": { "targetAlias": "net6.0-windows", + "dependencies": { + "Capstone.NetStandard": { + "target": "Package", + "version": "[4.0.0, )" + }, + "Keystone.NET": { + "target": "Package", + "version": "[0.9.1, )" + } + }, "imports": [ "net461", "net462", @@ -89,5 +102,25 @@ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.300\\RuntimeIdentifierGraph.json" } } - } + }, + "logs": [ + { + "code": "NU1101", + "level": "Error", + "message": "Unable to find package Capstone.NetStandard. No packages exist with this id in source(s): nuget.org", + "libraryId": "Capstone.NetStandard", + "targetGraphs": [ + "net6.0-windows7.0" + ] + }, + { + "code": "NU1101", + "level": "Error", + "message": "Unable to find package Keystone.NET. No packages exist with this id in source(s): nuget.org", + "libraryId": "Keystone.NET", + "targetGraphs": [ + "net6.0-windows7.0" + ] + } + ] } \ No newline at end of file From 8ccb86c4ebd4698961089fb9cd206fc9a46fcc55 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:35 -0500 Subject: [PATCH 034/230] Update project.nuget.cache --- obj/project.nuget.cache | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index f8e6d6c0..06f6efb6 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,7 +1,7 @@ { "version": 2, - "dgSpecHash": "npaWG5nq9uo=", - "success": true, + "dgSpecHash": "ceWpBiB5Odc=", + "success": false, "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512", @@ -9,5 +9,28 @@ "C:\\Users\\juler\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\6.0.36\\microsoft.netcore.app.host.win-x64.6.0.36.nupkg.sha512" ], - "logs": [] + "logs": [ + { + "code": "NU1101", + "level": "Error", + "message": "Unable to find package Capstone.NetStandard. No packages exist with this id in source(s): nuget.org", + "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "filePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "libraryId": "Capstone.NetStandard", + "targetGraphs": [ + "net6.0-windows7.0" + ] + }, + { + "code": "NU1101", + "level": "Error", + "message": "Unable to find package Keystone.NET. No packages exist with this id in source(s): nuget.org", + "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "filePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "libraryId": "Keystone.NET", + "targetGraphs": [ + "net6.0-windows7.0" + ] + } + ] } \ No newline at end of file From e26737aba3ca6e07010de00677764e0ae0902608 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:38 -0500 Subject: [PATCH 035/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index 4230a0af..2e76abc3 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -7,5 +7,10 @@ ProcessorEmulator ProcessorEmulator + + + + + From aa3bd83e21981a7465b1aac29ce0df5be6f331bd Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:42 -0500 Subject: [PATCH 036/230] Update README.md --- README.md | 31 ++++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index b2a99424..51ebfe67 100644 --- a/README.md +++ b/README.md @@ -5,33 +5,46 @@ Supports generic CPU/OS emulation, RDK-V/B, Uverse, DirecTV firmware analysis, f ## Features -- **Generic CPU/OS Emulation:** Load and emulate binaries for a wide range of architectures (MIPS, ARM, x86, PowerPC, SPARC, etc.) using QEMU or custom emulators. -- **RDK-V Emulator:** (Planned) Emulate RDK-V set-top box environments for research and reverse engineering. -- **RDK-B Emulator:** (Planned) Emulate RDK-B broadband gateway environments. -- **Simulate SWM Switch/LNB:** (Planned) Simulate DirecTV SWM switches and LNBs for testing and analysis. -- **Probe Filesystem:** Analyze and identify the type of filesystem in a given image or partition. -- **Emulate CMTS Head End:** (Planned) Simulate a Cable Modem Termination System (CMTS) head end for DOCSIS research. -- **Uverse Box Emulator:** (Planned) Emulate AT&T Uverse set-top boxes, including WinCE-based environments. -- **DirecTV Box/Firmware Analysis:** Analyze DirecTV firmware images for structure, content, and possible vulnerabilities. -- **Linux Filesystem Read/Write:** (Planned) Read and write to Linux filesystems (ext2/3/4, JFFS2, UBIFS, etc.) from Windows. + +## Cross-Compile Binary (RetDec Integration) + +This tool uses the [RetDec decompiler](https://github.com/avast/retdec) CLI to perform static cross-architecture translation of raw binaries. + +Prerequisites: +1. Install RetDec on your system and ensure `retdec-decompiler` is in your PATH. + - Windows: Download the latest [RetDec Windows release](https://github.com/avast/retdec/releases) and add its `bin` folder to your PATH. + - Linux/macOS: Follow RetDec build instructions or use package manager if available. +2. Supported source/target architectures: x86 (32-bit), x64 (64-bit), ARM, ARM64, MIPS. + +Usage: +1. In the app UI, select **Cross-Compile Binary**. +2. Choose an input file (`.bin`, `.exe`, etc.). +3. Pick the target architecture from the dropdown. +4. The tool will invoke: + ``` + retdec-decompiler --mode raw -e -t -o + ``` +5. The resulting file will be saved and opened in a result window. + +Note: Raw mode preserves only code sections. PE/ELF headers are not rebuilt. For full executable formats, integrate a header-rebuilder or patcher on the output. ## Getting Started 1. **Clone the repository:** From 80d07ed29a41dcbb0c22cbabfb0ccabc0315c3b2 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 11:01:44 -0500 Subject: [PATCH 037/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index d21c0166..c36c04ba 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -16,8 +16,37 @@ public static class BinaryTranslator /// Translated binary data for the target ISA. public static byte[] Translate(string fromArch, string toArch, byte[] input) { - // TODO: integrate Unicorn.NET or QEMU TCG to perform actual cross-translation. - throw new NotImplementedException($"Binary translation from {fromArch} to {toArch} is not implemented."); + // Bypass translation if arch matches + if (string.Equals(fromArch, toArch, StringComparison.OrdinalIgnoreCase)) + return input; + // Write input to temp file + string tempIn = Path.GetTempFileName(); + string tempOut = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + File.WriteAllBytes(tempIn, input); + // Build RetDec CLI arguments + string args = $"--mode raw -e {fromArch} -t {toArch} -o \"{tempOut}\" \"{tempIn}\""; + var psi = new ProcessStartInfo + { + FileName = "retdec-decompiler", // ensure in PATH + Arguments = args, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + using var proc = Process.Start(psi); + proc.WaitForExit(); + if (proc.ExitCode != 0) + { + string err = proc.StandardError.ReadToEnd(); + MessageBox.Show($"RetDec error: {err}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + return input; + } + // Read and clean up + var output = File.ReadAllBytes(tempOut); + File.Delete(tempIn); + File.Delete(tempOut); + return output; } } } From 214af3f8623512ec3e122fe5e97068016095ef51 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:16:50 -0500 Subject: [PATCH 038/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 322b8d32..0131e722 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3152eb6ce64bf2dd76a9cddc87fea6f50be2fc9e")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+80d07ed29a41dcbb0c22cbabfb0ccabc0315c3b2")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 6268ee4a0a519c0bac80731f291674d5b71192b9 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:16:53 -0500 Subject: [PATCH 039/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index c7bfbe7d..e9b91c8d 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -031fb3c573bb86f342ad250e7f632adcc59722383d8478af7d13b3ec91abdf42 +1bf3719360f9e78dea79467ee2ed59feba0919631cafadb9a9180d454702e955 From 0eb2a354eb949c83f3b1b101a948001f1ca835f0 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:16:56 -0500 Subject: [PATCH 040/230] Update ProcessorEmulator.assets.cache --- .../ProcessorEmulator.assets.cache | Bin 429 -> 429 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index d91c012af91d91cddf4d4999114e3f0aa688ef76..482d37b8c2a070df504be4aedcca0675f9ebba5e 100644 GIT binary patch delta 57 zcmV-90LK5V1FZupP)kQa3;+NC0``Ny&THjbThngN=)S{Fx1({L{!Ql9-+xoSk^E&A PgaMH;BauJ{u~b Date: Thu, 10 Jul 2025 19:17:00 -0500 Subject: [PATCH 041/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index 973a7a4a..570f214d 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -44,13 +44,9 @@ "net6.0-windows7.0": { "targetAlias": "net6.0-windows", "dependencies": { - "Capstone.NetStandard": { + "Unicorn.Net": { "target": "Package", - "version": "[4.0.0, )" - }, - "Keystone.NET": { - "target": "Package", - "version": "[0.9.1, )" + "version": "[1.0.4, )" } }, "imports": [ From fed1eda4db6f25cbfb26d86eb00c231c7ee213ed Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:17:02 -0500 Subject: [PATCH 042/230] Update project.assets.json --- obj/project.assets.json | 24 +++++------------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/obj/project.assets.json b/obj/project.assets.json index 969fb2c1..3a11266e 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -6,8 +6,7 @@ "libraries": {}, "projectFileDependencyGroups": { "net6.0-windows7.0": [ - "Capstone.NetStandard >= 4.0.0", - "Keystone.NET >= 0.9.1" + "Unicorn.Net >= 1.0.4" ] }, "packageFolders": { @@ -53,13 +52,9 @@ "net6.0-windows7.0": { "targetAlias": "net6.0-windows", "dependencies": { - "Capstone.NetStandard": { + "Unicorn.Net": { "target": "Package", - "version": "[4.0.0, )" - }, - "Keystone.NET": { - "target": "Package", - "version": "[0.9.1, )" + "version": "[1.0.4, )" } }, "imports": [ @@ -107,17 +102,8 @@ { "code": "NU1101", "level": "Error", - "message": "Unable to find package Capstone.NetStandard. No packages exist with this id in source(s): nuget.org", - "libraryId": "Capstone.NetStandard", - "targetGraphs": [ - "net6.0-windows7.0" - ] - }, - { - "code": "NU1101", - "level": "Error", - "message": "Unable to find package Keystone.NET. No packages exist with this id in source(s): nuget.org", - "libraryId": "Keystone.NET", + "message": "Unable to find package Unicorn.Net. No packages exist with this id in source(s): nuget.org", + "libraryId": "Unicorn.Net", "targetGraphs": [ "net6.0-windows7.0" ] From 9c1e18b09472e0e2e33032bf08527cc8c75186fb Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:17:06 -0500 Subject: [PATCH 043/230] Update project.nuget.cache --- obj/project.nuget.cache | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index 06f6efb6..7ef21098 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,6 +1,6 @@ { "version": 2, - "dgSpecHash": "ceWpBiB5Odc=", + "dgSpecHash": "qp/pzXdboGE=", "success": false, "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ @@ -13,21 +13,10 @@ { "code": "NU1101", "level": "Error", - "message": "Unable to find package Capstone.NetStandard. No packages exist with this id in source(s): nuget.org", + "message": "Unable to find package Unicorn.Net. No packages exist with this id in source(s): nuget.org", "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "filePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", - "libraryId": "Capstone.NetStandard", - "targetGraphs": [ - "net6.0-windows7.0" - ] - }, - { - "code": "NU1101", - "level": "Error", - "message": "Unable to find package Keystone.NET. No packages exist with this id in source(s): nuget.org", - "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", - "filePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", - "libraryId": "Keystone.NET", + "libraryId": "Unicorn.Net", "targetGraphs": [ "net6.0-windows7.0" ] From 01b1ee5f89d9294a7a7b7a179f0d3038c7bcf8d1 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:17:11 -0500 Subject: [PATCH 044/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index 2e76abc3..0c89908a 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -8,9 +8,9 @@ ProcessorEmulator - - - + + + + + - - From b419378d5167f584f245a1c4ba822cfdfa2b6123 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:17:40 -0500 Subject: [PATCH 045/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 104 ++++++++++++++++++++++++++++---------- 1 file changed, 78 insertions(+), 26 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index c36c04ba..b75693de 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -1,4 +1,15 @@ using System; +using System.IO; +using System.Windows; +using System.Collections.Generic; +using Unicorn; +using Unicorn.X86; +using Unicorn.ARM; +using Unicorn.ARM64; +using Unicorn.MIPS; +using Unicorn.PPC; +using Unicorn.SPARC; +using Unicorn.RISCV; namespace ProcessorEmulator.Tools { @@ -16,37 +27,78 @@ public static class BinaryTranslator /// Translated binary data for the target ISA. public static byte[] Translate(string fromArch, string toArch, byte[] input) { - // Bypass translation if arch matches + // If no translation needed if (string.Equals(fromArch, toArch, StringComparison.OrdinalIgnoreCase)) return input; - // Write input to temp file - string tempIn = Path.GetTempFileName(); - string tempOut = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - File.WriteAllBytes(tempIn, input); - // Build RetDec CLI arguments - string args = $"--mode raw -e {fromArch} -t {toArch} -o \"{tempOut}\" \"{tempIn}\""; - var psi = new ProcessStartInfo + // Determine Unicorn arch/mode + UnicornEngine uc; + switch (fromArch.ToLowerInvariant()) { - FileName = "retdec-decompiler", // ensure in PATH - Arguments = args, - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - CreateNoWindow = true - }; - using var proc = Process.Start(psi); - proc.WaitForExit(); - if (proc.ExitCode != 0) + case "x86": + uc = new UnicornEngine(UnicornArch.X86, UnicornMode.Bit32); + break; + case "x64": + case "x86_64": + uc = new UnicornEngine(UnicornArch.X86, UnicornMode.Bit64); + break; + case "arm": + uc = new UnicornEngine(UnicornArch.ARM, UnicornMode.Arm); + break; + case "arm64": + uc = new UnicornEngine(UnicornArch.ARM64, UnicornMode.LittleEndian); + break; + case "mips": + uc = new UnicornEngine(UnicornArch.MIPS, UnicornMode.Mips32LittleEndian); + break; + case "ppc": + case "ppc32": + uc = new UnicornEngine(UnicornArch.PPC, UnicornMode.PPC32); + break; + case "ppc64": + uc = new UnicornEngine(UnicornArch.PPC, UnicornMode.PPC64); + break; + case "sparc": + uc = new UnicornEngine(UnicornArch.SPARC, UnicornMode.Sparc32); + break; + case "sparc64": + uc = new UnicornEngine(UnicornArch.SPARC, UnicornMode.Sparc64); + break; + case "riscv": + case "riscv32": + uc = new UnicornEngine(UnicornArch.RISCV, UnicornMode.RiscV32); + break; + case "riscv64": + uc = new UnicornEngine(UnicornArch.RISCV, UnicornMode.RiscV64); + break; + default: + MessageBox.Show($"Unsupported ISA: {fromArch}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + return input; + } + const ulong BASE = 0x100000; + ulong size = (ulong)input.Length; + // Map memory and write code + uc.Memory.Map(BASE, size); + uc.Memory.Write(BASE, input); + // Initialize PC + uc.Registers.PC = BASE; + var output = new List(); + // Hook instructions to capture translated bytes + uc.Hooks.Add(HookType.Code, (ucEngine, address, length, user) => { - string err = proc.StandardError.ReadToEnd(); - MessageBox.Show($"RetDec error: {err}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); - return input; + var bytes = ucEngine.Memory.Read(address, length); + output.AddRange(bytes); + }); + try + { + // Run through the region once + uc.Start(BASE, BASE + size); + } + catch (Exception ex) + { + MessageBox.Show($"Emulation error: {ex.Message}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); } - // Read and clean up - var output = File.ReadAllBytes(tempOut); - File.Delete(tempIn); - File.Delete(tempOut); - return output; + uc.Dispose(); + return output.ToArray(); } } } From 4c2363280a94ad36baaaacc92e17203c781eed34 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:28:51 -0500 Subject: [PATCH 046/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 0131e722..ab5a7c7b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+80d07ed29a41dcbb0c22cbabfb0ccabc0315c3b2")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b419378d5167f584f245a1c4ba822cfdfa2b6123")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 86487c5b155913fcc7e0d2f0a22642ffd1194681 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:28:54 -0500 Subject: [PATCH 047/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index e9b91c8d..47322195 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -1bf3719360f9e78dea79467ee2ed59feba0919631cafadb9a9180d454702e955 +56e8b4ff37a0128746cac82a3f90ed3cc08e54a639c2c1c2244e2b5731105285 From dd7eee07f519a188592120086b369c2f18e88191 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:28:57 -0500 Subject: [PATCH 048/230] Update ProcessorEmulator.assets.cache --- .../ProcessorEmulator.assets.cache | Bin 429 -> 304 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index 482d37b8c2a070df504be4aedcca0675f9ebba5e..22c4b8f9857f58a8b0f4cb199a986a300776823a 100644 GIT binary patch delta 47 zcmZ3>yn$(g1`|8uL__6?4(t;{Y*-l?7#QLv3o?pxhvsD_=NIMa`K6XjJP Date: Thu, 10 Jul 2025 19:29:00 -0500 Subject: [PATCH 049/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index 0c89908a..3e0ec721 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -10,7 +10,6 @@ - - - + + From 8809e9bb6c02f728289bc507c7884ce9bd4fc9b3 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:06:45 -0500 Subject: [PATCH 050/230] Create App.g.cs --- obj/Debug/net6.0-windows/App.g.cs | 82 +++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 obj/Debug/net6.0-windows/App.g.cs diff --git a/obj/Debug/net6.0-windows/App.g.cs b/obj/Debug/net6.0-windows/App.g.cs new file mode 100644 index 00000000..816919ff --- /dev/null +++ b/obj/Debug/net6.0-windows/App.g.cs @@ -0,0 +1,82 @@ +#pragma checksum "..\..\..\App.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "7FED7A4CEAED95D4B0E8318FD8B40CE0B542D630" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace ProcessorEmulator { + + + /// + /// App + /// + public partial class App : System.Windows.Application { + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "9.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + + #line 4 "..\..\..\App.xaml" + this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative); + + #line default + #line hidden + System.Uri resourceLocater = new System.Uri("/ProcessorEmulator;component/app.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\App.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + /// + /// Application Entry Point. + /// + [System.STAThreadAttribute()] + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "9.0.5.0")] + public static void Main() { + ProcessorEmulator.App app = new ProcessorEmulator.App(); + app.InitializeComponent(); + app.Run(); + } + } +} + From c3016b3d757d32bd44e53c33217fb7459752ec3c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:06:47 -0500 Subject: [PATCH 051/230] Create App.baml --- obj/Debug/net6.0-windows/App.baml | Bin 0 -> 860 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 obj/Debug/net6.0-windows/App.baml diff --git a/obj/Debug/net6.0-windows/App.baml b/obj/Debug/net6.0-windows/App.baml new file mode 100644 index 0000000000000000000000000000000000000000..d67aefbc1a20d11edb5c99dbcfcc3d171e99836f GIT binary patch literal 860 zcmb_aQBT`25Wb`-8(TpGfzY&0^kI9eoIr4(NEL!^ylkMVnFbGgz)7zoB8e;8QQQB` zD}r+e2x(87YUzAufA;6|-PZtsGl<~?j>&(g)zz~(a8JW&ZUU_Jl}u4&}t)HkgExHj4*e(m&tzMOzN@2Ie z$|#YyTm34@v-BIze#jdvyWvhU3J-WBhGDdaA#eV2;qoQ#sS*WFq`FxIIo3eLGi|V7 z7g;%!6U}fWFZ=Z}TBr1J~- z^~RwyZU0M-f6}Vkw5+nMsJ7n$+}^|T0JW?XDRYGsS0`Y}g6|!;y@T~LRKIcfB}=X9 zgvwBFuecUjiszSV6momv4cS`<_$%_3eGa^)V4dvKmJ4gWTxgx8v6 Date: Fri, 11 Jul 2025 12:06:51 -0500 Subject: [PATCH 052/230] Create apphost.exe --- obj/Debug/net6.0-windows/apphost.exe | Bin 0 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 obj/Debug/net6.0-windows/apphost.exe diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe new file mode 100644 index 0000000000000000000000000000000000000000..0f9c1ac7e6c8ef0ba559bb71bdbb99f615200b08 GIT binary patch literal 151040 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 literal 0 HcmV?d00001 From d4cea895b4e1e07e916e780bd84f1ebe8a85cae5 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:06:56 -0500 Subject: [PATCH 053/230] Create ProcessorEmulator.runtimeconfig.json --- .../ProcessorEmulator.runtimeconfig.json | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 bin/Debug/net6.0-windows/ProcessorEmulator.runtimeconfig.json diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.runtimeconfig.json b/bin/Debug/net6.0-windows/ProcessorEmulator.runtimeconfig.json new file mode 100644 index 00000000..f9988b2c --- /dev/null +++ b/bin/Debug/net6.0-windows/ProcessorEmulator.runtimeconfig.json @@ -0,0 +1,15 @@ +{ + "runtimeOptions": { + "tfm": "net6.0", + "frameworks": [ + { + "name": "Microsoft.NETCore.App", + "version": "6.0.0" + }, + { + "name": "Microsoft.WindowsDesktop.App", + "version": "6.0.0" + } + ] + } +} \ No newline at end of file From b5c79df6c8ea42ddd6b9ae7741088f91cc8c913c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:14 -0500 Subject: [PATCH 054/230] Create ProcessorEmulator.deps.json --- .../ProcessorEmulator.deps.json | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 bin/Debug/net6.0-windows/ProcessorEmulator.deps.json diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.deps.json b/bin/Debug/net6.0-windows/ProcessorEmulator.deps.json new file mode 100644 index 00000000..e4d16dc0 --- /dev/null +++ b/bin/Debug/net6.0-windows/ProcessorEmulator.deps.json @@ -0,0 +1,23 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v6.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v6.0": { + "ProcessorEmulator/1.0.0": { + "runtime": { + "ProcessorEmulator.dll": {} + } + } + } + }, + "libraries": { + "ProcessorEmulator/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file From 588f2b44b6022a2898d1f42b3819656576ae7b9a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:25 -0500 Subject: [PATCH 055/230] Create ProcessorEmulator.exe --- bin/Debug/net6.0-windows/ProcessorEmulator.exe | Bin 0 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/Debug/net6.0-windows/ProcessorEmulator.exe diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe new file mode 100644 index 0000000000000000000000000000000000000000..0f9c1ac7e6c8ef0ba559bb71bdbb99f615200b08 GIT binary patch literal 151040 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 literal 0 HcmV?d00001 From 68e997e0703ba3c4a94e2b46643993be5b5441b1 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:31 -0500 Subject: [PATCH 056/230] Create ClassicStyle.baml --- obj/Debug/net6.0-windows/ClassicStyle.baml | Bin 0 -> 1041 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 obj/Debug/net6.0-windows/ClassicStyle.baml diff --git a/obj/Debug/net6.0-windows/ClassicStyle.baml b/obj/Debug/net6.0-windows/ClassicStyle.baml new file mode 100644 index 0000000000000000000000000000000000000000..c4d9e178a2d8181272447794193a2a2fef10e710 GIT binary patch literal 1041 zcmb_a-)|B@5T5%{pcUI_>KhG2+n@=#J2>_VO?a?W5~DT*koKVuE_7)xp2H!MH5YGx|_+&WWV|5o5`jD;2pGKA6}w=i`j=;lOV(+WsU&a zO~E|o`qa0%Tjzoma$P1oOlp>9XeG@kV+W&^8-TJ@@_5p00cSbLLP_bL_t0 z9v}ExpF8@*b_Y|vWEhq{MY;ND>7%GfAb|`DZ0!0MqE? z`3-zpL{|ZPn@0+cNutsO+Eak7z)EAJJr2nV`ZY8K=S(CexPn+a literal 0 HcmV?d00001 From 67535b71ab6c8f2aedf0021e0101408e55f5c921 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:40 -0500 Subject: [PATCH 057/230] Create MainWindow.baml --- obj/Debug/net6.0-windows/MainWindow.baml | Bin 0 -> 1445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 obj/Debug/net6.0-windows/MainWindow.baml diff --git a/obj/Debug/net6.0-windows/MainWindow.baml b/obj/Debug/net6.0-windows/MainWindow.baml new file mode 100644 index 0000000000000000000000000000000000000000..d598c8d7b45ba11daec2750bcd5b9ba4d398efbb GIT binary patch literal 1445 zcmb_cT~E_c7(Qz|93O%p;Ma%?S&Y%qbt|WQB#Sx%F+p(Ih!7*uZaajAwr93y0WS3? z7!$*_B>o0}f$@rP$=~399N)JqNc2iWo71=Nd7txsKJ5S@WQEj7nLGpe0+(IqmsEktWRpAQ?`%(Fw?a~c5;`IgWd+{^De{?=Z; zXc$(0&-UDW>(XR2k{}9EiAJb$KD}y^tj3Ml0Q?nHJvyJ*%l%7^-L#UJ7BUM-b$@`6 zi4IAwIl^Vx+k}i<@G)~v)PoMyVtBUqSgO<1I6Skmu$AroA=Oy})dHycsiaAeJ+RbG zN%Y5(;(H(J{0!hHQeES%lC*|kOMfcqHIRd7_Q2f#T_)cyIW9ZsShr$83gk!(n8Hti z!iugg{AG*zkRZbD!P2Zp@I-GE%fpjh+~S@iz-@%lC}xByM8JM{!5m^>GXi3KEiyxg zE}5S*w-u+SY4keS@VI)|AryU}?w00xCfPv!VXr7;i5{vb|BKJOjeoQ+y_@_ zFo3HYARW;9%-VDn;Xc$GQ_+Z-R{a^AW7+PjdWxYMJ;m%T#Qi zxpACq-)E_nx!atS);yfdroKp}U_F!;{1vP@GfAC*RZFlKOrA10;5bJoqtbY z>{JfbgdK>OEAStJSs)nGi`Y?!$YP?JI+luwTzP`pAF-BUPqQ}RseXW7!XL9cJY<*| mG3+j$LLWs6J{}-mqvIg3vl_*LVgED=EGEb+jbawabmbSZ=6+uQ literal 0 HcmV?d00001 From e8874963ac9f647cde432b48bd2f75a40eb62239 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:43 -0500 Subject: [PATCH 058/230] Create MainWindow.g.cs --- obj/Debug/net6.0-windows/MainWindow.g.cs | 93 ++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 obj/Debug/net6.0-windows/MainWindow.g.cs diff --git a/obj/Debug/net6.0-windows/MainWindow.g.cs b/obj/Debug/net6.0-windows/MainWindow.g.cs new file mode 100644 index 00000000..4e8d7d8d --- /dev/null +++ b/obj/Debug/net6.0-windows/MainWindow.g.cs @@ -0,0 +1,93 @@ +#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "8E7865B1E83B78CF7F091E13C196A7B020A4D492" +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +using System; +using System.Diagnostics; +using System.Windows; +using System.Windows.Automation; +using System.Windows.Controls; +using System.Windows.Controls.Primitives; +using System.Windows.Controls.Ribbon; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Ink; +using System.Windows.Input; +using System.Windows.Markup; +using System.Windows.Media; +using System.Windows.Media.Animation; +using System.Windows.Media.Effects; +using System.Windows.Media.Imaging; +using System.Windows.Media.Media3D; +using System.Windows.Media.TextFormatting; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Shell; + + +namespace ProcessorEmulator { + + + ///

+ /// MainWindow + /// + public partial class MainWindow : System.Windows.Window, System.Windows.Markup.IComponentConnector { + + private bool _contentLoaded; + + /// + /// InitializeComponent + /// + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "9.0.5.0")] + public void InitializeComponent() { + if (_contentLoaded) { + return; + } + _contentLoaded = true; + System.Uri resourceLocater = new System.Uri("/ProcessorEmulator;component/mainwindow.xaml", System.UriKind.Relative); + + #line 1 "..\..\..\MainWindow.xaml" + System.Windows.Application.LoadComponent(this, resourceLocater); + + #line default + #line hidden + } + + [System.Diagnostics.DebuggerNonUserCodeAttribute()] + [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "9.0.5.0")] + [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Design", "CA1033:InterfaceMethodsShouldBeCallableByChildTypes")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")] + [System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1800:DoNotCastUnnecessarily")] + void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object target) { + switch (connectionId) + { + case 1: + + #line 8 "..\..\..\MainWindow.xaml" + ((System.Windows.Controls.MenuItem)(target)).Click += new System.Windows.RoutedEventHandler(this.OpenMenuItem_Click); + + #line default + #line hidden + return; + case 2: + + #line 20 "..\..\..\MainWindow.xaml" + ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.StartEmulation_Click); + + #line default + #line hidden + return; + } + this._contentLoaded = true; + } + } +} + From 6c9a24c2d984fd67601aa89c7ee2269f8d813542 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:49 -0500 Subject: [PATCH 059/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index ab5a7c7b..77e87466 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+b419378d5167f584f245a1c4ba822cfdfa2b6123")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+68d54b822c21fa5b499ce0b1a26e05cd73a5d9f4")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 127138ac73aa8df71ff709863db7f72a979df40a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:55 -0500 Subject: [PATCH 060/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 47322195..90fa040a 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -56e8b4ff37a0128746cac82a3f90ed3cc08e54a639c2c1c2244e2b5731105285 +ea2a4e034dcc919a239ae35789c9103123339eacd81c0d3c7773771500fc1f29 From 8f419b9e94111c0acf12155d4a17b78ad25715fd Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:08:58 -0500 Subject: [PATCH 061/230] Update ProcessorEmulator.assets.cache --- .../ProcessorEmulator.assets.cache | Bin 304 -> 152 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index 22c4b8f9857f58a8b0f4cb199a986a300776823a..662e289d9bf6185c6e1b7d90b9899fbb5d929ec8 100644 GIT binary patch delta 61 zcmV-D0K)&U0+<0QP)kQa3;+NCnZ>BAx>Tf#9^ljD*G8_^vD2ic*MO6q)5#x*@fl~2 Tl#wwbkw6HMkOYxfIFUdIS=t-& delta 218 zcmbQixPeJ4z}wxChk=2C>09&ubJr85Do z00EFyAT~1)vj8!lOJ<^CdR~5UNoKNheo88vU#Ov>fgwk5YFTPgW=SQhYf({t5dc>k BN0|Ts From 5e70bd4a427bf6b39b98edf50eeb73b844e416d0 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:03 -0500 Subject: [PATCH 062/230] Create ProcessorEmulator.csproj.CoreCompileInputs.cache --- .../ProcessorEmulator.csproj.CoreCompileInputs.cache | 1 + 1 file changed, 1 insertion(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache new file mode 100644 index 00000000..5bd45668 --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache @@ -0,0 +1 @@ +3468de5d50933c5b09ef759fd6d8df2dba417d181972588f38522e30f9f6ba96 From ed5e24043287c70943e1e568f66d5001b1d7674d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:07 -0500 Subject: [PATCH 063/230] Create ProcessorEmulator.csproj.FileListAbsolute.txt --- ...cessorEmulator.csproj.FileListAbsolute.txt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt new file mode 100644 index 00000000..e32eab8a --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt @@ -0,0 +1,22 @@ +c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.exe +c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.deps.json +c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.runtimeconfig.json +c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.dll +c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.pdb +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ClassicStyle.baml +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\MainWindow.baml +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\App.baml +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\MainWindow.g.cs +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\App.g.cs +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator_MarkupCompile.cache +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.g.resources +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.AssemblyInfoInputs.cache +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.AssemblyInfo.cs +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.csproj.CoreCompileInputs.cache +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.sourcelink.json +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.dll +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\refint\ProcessorEmulator.dll +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.pdb +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.genruntimeconfig.cache +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ref\ProcessorEmulator.dll From 659bc83d38955b09d0fbde4e528eaaf7713d7d6a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:10 -0500 Subject: [PATCH 064/230] Create ProcessorEmulator.g.resources --- .../net6.0-windows/ProcessorEmulator.g.resources | Bin 0 -> 3660 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.g.resources diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources b/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources new file mode 100644 index 0000000000000000000000000000000000000000..834b6d29fbf3cbc33a22c2cf2862dae27f44f7ae GIT binary patch literal 3660 zcmeHK%WoS+82`MxPMk-RCL}E_4t7(Q0CD|@v)d#hDtW4?O^M==R8=Eb+mm+HeVE;~ z5+CV}BdAhUi5o%u4O}>a;6PQ0OF4s7aY2fDb%yVo^&@H&se}~uz)og7kKg>}o0;!1 z`Q_)oz7GMw7nsd_)$^H^T4A13af{4r)>fEaVs0{Sc}2%HjY2ZM#$3;E?CJ4ThEg&< zS26vH%cgBs@m<|a#+NGv(8 zpopapRqSE=U^=exriCB_Y}gWI2^_4on6}yh&fP*>Hb~O+y@5CwJkXz-DVJ%FD&0a4=ID9|^2;vsnCj!ZI@yD?1fvM1T@}I~Uh!rNW zNV7<+*hzqA96B1t<()u{3*$f=4W0?Xvl{d-G50nr%^OA1I^8vx7ds)*NLya`0~xC- zP3Xkj6#^BFLa>X02sZjLCr(SyH)raeXB6{()nq9;x63u{0uCzORDz-k3as@gDw!0? zDV^(6Ud+JO;U!r}=w(`n^q*LWeB2fyjP7_fI@SkpzXqMFIx3vMS}n6!ZwP*^K?L1n znYn&7)-6#xyr!EKCe(}EBRTtjX|PZ?*&`SgO;u1+g{_k)7uHayk)aw^=^JtO;H#jv zQ-eQ6O~!4isMW&Gh5?3Z8mW7#p9||FE0A%YZS5iW9G>#F9toaGQv3PE3?)SysRNp3 z7a;%O2}DNn?6$+=AARr+7eIxmgi#W2fc%{&A`(d1vA20(fQm|nN|q~R>mVd%l+D>| z%0}}Km2DwMDUeN3yAaxBqrKJHc3L|{UvoIy{P=ukZlb|PzKYlswHM34D|~}~iinRE zc5!1EQxAsSCEc)tP|}RPbQb?d-$P$)uXywoxA*ErUlJ>Z>Wgk7ylVI+OT3P8vZ;^p z#{2MLP523dCpsQ;d0frx>}d(n{E^EO8ER&+nc59}2icjt!67xuo8Cc27nJCD!sS(` zJk2$-q15}l6{js6?)r|0KVCFU_OPa%t^*peTSmY|^0X>u@dfY?%gjar2}aLYMSB-Z z0;?pii28zdVcYPLR$zh{FU**Lm0Nabn~Vm&P)m*0eL&OQWyhFCpZ6I2!$upK9D%y#C0IFY7il>+2*s?{j6=F-yZ- zo5ER%$OA5AHT1yOsMYg`M>0uDSz6;J_9^mDC=YFdR=G%z$<_@F?(*Keue*L-SMYI$ zcR^qhFVTV8krm34qh{nWmvW>lm#OvKT34}8(KfJ@Kf|-6ASN!4IC4V6&eAO67*mns dEy646Dg2?6RaCk#x(Y=_Ev|cNl0tauzXA9;(NF*Y literal 0 HcmV?d00001 From c7343f9224e0252bc6ad1848a0c9dd91a98f3193 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:15 -0500 Subject: [PATCH 065/230] Update ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig --- .../ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig index c71f476c..fa1769a5 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = ProcessorEmulator -build_property.ProjectDir = C:\Users\juler\Documents\GitHub\Processor-Emulator\ +build_property.ProjectDir = c:\Users\juler\Documents\GitHub\Processor-Emulator\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.CsWinRTUseWindowsUIXamlProjections = false From 159f29a8d9b0a6c373d1719449be80837dbe3544 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:18 -0500 Subject: [PATCH 066/230] Create ProcessorEmulator.genruntimeconfig.cache --- .../net6.0-windows/ProcessorEmulator.genruntimeconfig.cache | 1 + 1 file changed, 1 insertion(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache new file mode 100644 index 00000000..321075c9 --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache @@ -0,0 +1 @@ +fbcb2c37cc2a9bdd4f8b6758b66f7921742cf1e6c6b6ec844b957bdb69f6a150 From 06d9e08a088a1cc592cc5cc0468f8671a843f8c2 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:22 -0500 Subject: [PATCH 067/230] Create ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 1 + 1 file changed, 1 insertion(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json new file mode 100644 index 00000000..a136e38f --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -0,0 +1 @@ +{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/68d54b822c21fa5b499ce0b1a26e05cd73a5d9f4/*"}} \ No newline at end of file From 0ca63c52f50a5d06ff9b7ac479d0398a65b1fd87 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:26 -0500 Subject: [PATCH 068/230] Create ProcessorEmulator_MarkupCompile.cache --- .../ProcessorEmulator_MarkupCompile.cache | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache new file mode 100644 index 00000000..5b9f64f6 --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -0,0 +1,20 @@ +ProcessorEmulator + + +winexe +C# +.cs +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ +ProcessorEmulator +none +false +TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER +c:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml +2-826070488 + +381330416473 +1942128195826 +ClassicStyle.xaml;MainWindow.xaml; + +False + From 64d931c24aa69c2482ae05605a67c07938f0dc61 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:34 -0500 Subject: [PATCH 069/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index 570f214d..d3db4ad6 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -1,17 +1,17 @@ { "format": 1, "restore": { - "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} + "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} }, "projects": { - "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { + "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectUniqueName": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "projectName": "ProcessorEmulator", - "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "packagesPath": "C:\\Users\\juler\\.nuget\\packages\\", - "outputPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", + "outputPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\juler\\AppData\\Roaming\\NuGet\\NuGet.Config" @@ -43,12 +43,6 @@ "frameworks": { "net6.0-windows7.0": { "targetAlias": "net6.0-windows", - "dependencies": { - "Unicorn.Net": { - "target": "Package", - "version": "[1.0.4, )" - } - }, "imports": [ "net461", "net462", From 9d63f88d29bb470b52daa539ec017b65a30d9155 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:37 -0500 Subject: [PATCH 070/230] Update ProcessorEmulator.csproj.nuget.g.props --- obj/ProcessorEmulator.csproj.nuget.g.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.g.props b/obj/ProcessorEmulator.csproj.nuget.g.props index 538f8078..4f31cb6c 100644 --- a/obj/ProcessorEmulator.csproj.nuget.g.props +++ b/obj/ProcessorEmulator.csproj.nuget.g.props @@ -1,7 +1,7 @@  - False + True NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ From 6f44c96980bcd772e0245cfbe5581e1e5216b2ac Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:41 -0500 Subject: [PATCH 071/230] Update project.assets.json --- obj/project.assets.json | 23 ++--------------------- 1 file changed, 2 insertions(+), 21 deletions(-) diff --git a/obj/project.assets.json b/obj/project.assets.json index 3a11266e..1ef106b7 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -5,9 +5,7 @@ }, "libraries": {}, "projectFileDependencyGroups": { - "net6.0-windows7.0": [ - "Unicorn.Net >= 1.0.4" - ] + "net6.0-windows7.0": [] }, "packageFolders": { "C:\\Users\\juler\\.nuget\\packages\\": {} @@ -51,12 +49,6 @@ "frameworks": { "net6.0-windows7.0": { "targetAlias": "net6.0-windows", - "dependencies": { - "Unicorn.Net": { - "target": "Package", - "version": "[1.0.4, )" - } - }, "imports": [ "net461", "net462", @@ -97,16 +89,5 @@ "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\9.0.300\\RuntimeIdentifierGraph.json" } } - }, - "logs": [ - { - "code": "NU1101", - "level": "Error", - "message": "Unable to find package Unicorn.Net. No packages exist with this id in source(s): nuget.org", - "libraryId": "Unicorn.Net", - "targetGraphs": [ - "net6.0-windows7.0" - ] - } - ] + } } \ No newline at end of file From 9e876964e84cffb7241f14fd2b7da5a9a3e767f3 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:45 -0500 Subject: [PATCH 072/230] Update project.nuget.cache --- obj/project.nuget.cache | 20 ++++---------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index 7ef21098..8d2e3e4c 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,25 +1,13 @@ { "version": 2, - "dgSpecHash": "qp/pzXdboGE=", - "success": false, - "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "dgSpecHash": "vsvp1FVxoxg=", + "success": true, + "projectFilePath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\6.0.36\\microsoft.windowsdesktop.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\6.0.36\\microsoft.netcore.app.host.win-x64.6.0.36.nupkg.sha512" ], - "logs": [ - { - "code": "NU1101", - "level": "Error", - "message": "Unable to find package Unicorn.Net. No packages exist with this id in source(s): nuget.org", - "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", - "filePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", - "libraryId": "Unicorn.Net", - "targetGraphs": [ - "net6.0-windows7.0" - ] - } - ] + "logs": [] } \ No newline at end of file From 6bbb3df8bbb446079f6d5243e602a5513f8601df Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:51 -0500 Subject: [PATCH 073/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index 3e0ec721..c85dfa4a 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -7,9 +7,10 @@ ProcessorEmulator ProcessorEmulator + - - + + From d4112fc50f77062ff8fb86d93eb5d6ed774efe7f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 12:09:56 -0500 Subject: [PATCH 074/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index b75693de..4c621da6 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -3,13 +3,32 @@ using System.Windows; using System.Collections.Generic; using Unicorn; -using Unicorn.X86; -using Unicorn.ARM; -using Unicorn.ARM64; -using Unicorn.MIPS; -using Unicorn.PPC; -using Unicorn.SPARC; -using Unicorn.RISCV; + +// Stub definitions for Unicorn types to allow compilation without the actual wrapper. +// TODO: Remove these stubs when a real Unicorn.NET wrapper is referenced. +namespace Unicorn +{ + public enum UnicornArch { X86, ARM, ARM64, MIPS, PPC, SPARC, RISCV } + public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } + public enum HookType { Code } + public class UnicornEngine : IDisposable + { + public UnicornEngine(UnicornArch arch, UnicornMode mode) { } + public MemoryManager Memory { get; } = new MemoryManager(); + public RegisterManager Registers { get; } = new RegisterManager(); + public HookManager Hooks { get; } = new HookManager(); + public void Start(ulong begin, ulong end) { } + public void Dispose() { } + } + public class MemoryManager + { + public void Map(ulong address, ulong size) { } + public void Write(ulong address, byte[] bytes) { } + public byte[] Read(ulong address, int length) => Array.Empty(); + } + public class RegisterManager { public ulong PC { get; set; } } + public class HookManager { public void Add(HookType type, Action callback) { } } +} namespace ProcessorEmulator.Tools { From 431f7fb0b16bb4147699d5ff026fd4a10435d8e0 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 13:27:23 -0500 Subject: [PATCH 075/230] Update dotnet.yml --- .github/workflows/dotnet.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/dotnet.yml b/.github/workflows/dotnet.yml index 79e2ded8..5ce2fe5b 100644 --- a/.github/workflows/dotnet.yml +++ b/.github/workflows/dotnet.yml @@ -2,9 +2,9 @@ name: .NET Build on: push: - branches: [ main, master ] + branches: [ dev, main ] pull_request: - branches: [ main, master ] + branches: [ dev, main ] jobs: build: From e0b3ea6857e6c8b9c2fb1afb7341a2f4a47e02bd Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:00 -0500 Subject: [PATCH 076/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 47 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 2 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index ea1fb771..919fdb96 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -194,11 +194,21 @@ private async Task HandleGenericEmulation() } catch (NotImplementedException) { - // Fallback to QEMU + // Fallback to QEMU with optional extra CLI options StatusBarText("Homebrew emulator not implemented for this architecture, falling back to QEMU..."); + // Prompt user for extra QEMU command-line options + string extraArgs = PromptUserForInput("Enter extra QEMU options (leave blank for default):")?.Trim() ?? string.Empty; try { - EmulatorLauncher.Launch(filePath, arch); + if (!string.IsNullOrEmpty(extraArgs)) + { + // Use QemuManager directly for extra arguments + ProcessorEmulator.Tools.QemuManager.LaunchWithArgs(filePath, arch, extraArgs); + } + else + { + EmulatorLauncher.Launch(filePath, arch); + } StatusBarText("QEMU emulation started."); } catch (Exception qex) @@ -276,15 +286,32 @@ private async Task HandleUverseEmulation() IsWholeHome = isWholeHome }; var emulator = new UverseEmulator(config); + ShowTextWindow("Uverse Emulation", new List { "Initialized emulator with config." }); emulator.LoadBootImage(sigPath); + ShowTextWindow("Uverse Emulation", new List { $"Loaded boot image: {Path.GetFileName(sigPath)}" }); // Attempt to load content signature in same folder string contentSig = Path.Combine(Path.GetDirectoryName(sigPath), "content.sig"); if (File.Exists(contentSig)) + { emulator.LoadMediaroomContent(contentSig); + ShowTextWindow("Uverse Emulation", new List { $"Loaded content signatures: {Path.GetFileName(contentSig)}" }); + } emulator.EmulateWholeHomeNetwork(); + ShowTextWindow("Uverse Emulation", new List { "Configured whole home network." }); UverseEmulator.StartMediaroom(); + ShowTextWindow("Uverse Emulation", new List { "Started Mediaroom platform." }); + // Display Uverse emulation details to user + var uverseLog = new List + { + $"Model: {model}", + $"Processor: {proc}", + $"Memory (MB): {mb}", + $"DVR Enabled: {isDVR}", + $"Whole Home Network: {isWholeHome}" + }; + ShowTextWindow("Uverse Emulation Log", uverseLog); StatusBarText("Uverse emulation complete."); await Task.CompletedTask; @@ -478,6 +505,22 @@ private async Task HandleCrossCompile() var targets = new[] { "x86", "x64", "ARM", "ARM64" }; string toArch = PromptUserForChoice("Select target architecture:", targets); if (string.IsNullOrEmpty(toArch)) return; + // If this is a WinCE binary, launch emulator instead of static cross-compilation + if (IsWinCEBinary(inputData)) + { + MessageBox.Show("WinCE binary detected; launching built-in emulator.", "WinCE Detected", MessageBoxButton.OK, MessageBoxImage.Information); + try + { + EmulatorLauncher.Launch(inputPath, fromArch); + StatusBarText("WinCE emulation started."); + } + catch (Exception ex) + { + MessageBox.Show($"WinCE emulation error: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + StatusBarText("WinCE emulation failed."); + } + return; + } // perform translation/recompile byte[] outputData = ReadAndTranslateFile(inputPath, fromArch, toArch); var saveDlg = new SaveFileDialog { Filter = "Binary Output (*.bin)|*.bin|All Files (*.*)|*.*", FileName = Path.GetFileNameWithoutExtension(inputPath) + $"_{toArch}" }; From 90a94e0ae188c022b6b5b5fe9a9e833c57a9363e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:05 -0500 Subject: [PATCH 077/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 77e87466..2a009725 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+68d54b822c21fa5b499ce0b1a26e05cd73a5d9f4")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d4112fc50f77062ff8fb86d93eb5d6ed774efe7f")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From cfe77f6c5c1344fccd77bcb6ec3c21750168cf20 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:14 -0500 Subject: [PATCH 078/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 90fa040a..86b23734 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -ea2a4e034dcc919a239ae35789c9103123339eacd81c0d3c7773771500fc1f29 +ae7a949c217987dc077a914a67e8f1e10edcbe3af3accd35252b638995413e59 From 74b937cbcf96f45c95b5d3e9b9af984ce88b9208 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:17 -0500 Subject: [PATCH 079/230] Update ProcessorEmulator.assets.cache --- .../ProcessorEmulator.assets.cache | Bin 152 -> 152 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index 662e289d9bf6185c6e1b7d90b9899fbb5d929ec8..2a7c798742856d17faed4620771b8f4e320c7d57 100644 GIT binary patch delta 55 zcmV-70LcHC0hj?PP)kQa3;+NC5zY9+UcsAr!ayBAx>Tf#9^ljD*G8_^vD2ic*MO6q)5#x*@fl~2 Nl#wwbkw6HMR79{W8RGx| From 6aed733f89b5019ba9fe25f19423e038f0c88675 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:21 -0500 Subject: [PATCH 080/230] Update ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig --- .../ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig index fa1769a5..c71f476c 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = ProcessorEmulator -build_property.ProjectDir = c:\Users\juler\Documents\GitHub\Processor-Emulator\ +build_property.ProjectDir = C:\Users\juler\Documents\GitHub\Processor-Emulator\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.CsWinRTUseWindowsUIXamlProjections = false From af99d6c9107cd54cb423f711e35fd50d5ce46427 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:29 -0500 Subject: [PATCH 081/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index d3db4ad6..e39bb231 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -1,17 +1,17 @@ { "format": 1, "restore": { - "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} + "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} }, "projects": { - "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { + "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectUniqueName": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "projectName": "ProcessorEmulator", - "projectPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "packagesPath": "C:\\Users\\juler\\.nuget\\packages\\", - "outputPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", + "outputPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\juler\\AppData\\Roaming\\NuGet\\NuGet.Config" From f48980179582d1858cd499c4020379582df75c72 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:33 -0500 Subject: [PATCH 082/230] Update project.nuget.cache --- obj/project.nuget.cache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index 8d2e3e4c..f8e6d6c0 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "vsvp1FVxoxg=", + "dgSpecHash": "npaWG5nq9uo=", "success": true, - "projectFilePath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\6.0.36\\microsoft.windowsdesktop.app.ref.6.0.36.nupkg.sha512", From f03ff156678bb3517bbdcf48dd807e3ee8150dd1 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:36 -0500 Subject: [PATCH 083/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index c85dfa4a..ba77ccdd 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -7,10 +7,6 @@ ProcessorEmulator ProcessorEmulator - - - - - + From fb2f33d370be67d70969723c88e77899bb93609e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:43 -0500 Subject: [PATCH 084/230] Update QemuManager.cs --- QemuManager.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/QemuManager.cs b/QemuManager.cs index e41a498b..06e2ad37 100644 --- a/QemuManager.cs +++ b/QemuManager.cs @@ -61,7 +61,8 @@ private static string GetQemuExecutable(string architecture) private static string GetQemuArgs(string imagePath, string architecture) { // Basic args, can be extended for more options - return $"-m 256 -drive file=\"{imagePath}\",format=raw -nographic"; + // Use default graphical display; remove nographic to show firmware UI + return $"-m 256 -drive file=\"{imagePath}\",format=raw"; } public static void Launch(string imagePath, string architecture) @@ -71,16 +72,15 @@ public static void Launch(string imagePath, string architecture) throw new FileNotFoundException($"QEMU executable not found: {qemuExe}"); var args = GetQemuArgs(imagePath, architecture); + // Launch QEMU with GUI window var process = new Process { StartInfo = new ProcessStartInfo { FileName = qemuExe, Arguments = args, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true + UseShellExecute = true, + CreateNoWindow = false } }; process.Start(); @@ -93,16 +93,15 @@ public static void LaunchWithArgs(string imagePath, string architecture, string throw new FileNotFoundException($"QEMU executable not found: {qemuExe}"); var args = GetQemuArgs(imagePath, architecture) + " " + extraArgs; + // Launch QEMU with GUI window and extra args var process = new Process { StartInfo = new ProcessStartInfo { FileName = qemuExe, Arguments = args, - UseShellExecute = false, - RedirectStandardOutput = true, - RedirectStandardError = true, - CreateNoWindow = true + UseShellExecute = true, + CreateNoWindow = false } }; process.Start(); From ec26567344a435af6ae4f53bf9982157b2f23121 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 19:07:47 -0500 Subject: [PATCH 085/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 85 ++++++++++++++++++++++++++------------- 1 file changed, 56 insertions(+), 29 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 4c621da6..97317905 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -2,33 +2,12 @@ using System.IO; using System.Windows; using System.Collections.Generic; -using Unicorn; - -// Stub definitions for Unicorn types to allow compilation without the actual wrapper. -// TODO: Remove these stubs when a real Unicorn.NET wrapper is referenced. -namespace Unicorn -{ - public enum UnicornArch { X86, ARM, ARM64, MIPS, PPC, SPARC, RISCV } - public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } - public enum HookType { Code } - public class UnicornEngine : IDisposable - { - public UnicornEngine(UnicornArch arch, UnicornMode mode) { } - public MemoryManager Memory { get; } = new MemoryManager(); - public RegisterManager Registers { get; } = new RegisterManager(); - public HookManager Hooks { get; } = new HookManager(); - public void Start(ulong begin, ulong end) { } - public void Dispose() { } - } - public class MemoryManager - { - public void Map(ulong address, ulong size) { } - public void Write(ulong address, byte[] bytes) { } - public byte[] Read(ulong address, int length) => Array.Empty(); - } - public class RegisterManager { public ulong PC { get; set; } } - public class HookManager { public void Add(HookType type, Action callback) { } } -} +using UnicornSharp; +using UnicornSharp.Arch; +using UnicornSharp.Control; +using UnicornSharp.Memory; +using UnicornSharp.Hooks; +using System.Diagnostics; namespace ProcessorEmulator.Tools { @@ -90,8 +69,8 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) uc = new UnicornEngine(UnicornArch.RISCV, UnicornMode.RiscV64); break; default: - MessageBox.Show($"Unsupported ISA: {fromArch}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); - return input; + // RetDec fallback for unsupported ISA + return TranslateWithRetDec(fromArch, toArch, input); } const ulong BASE = 0x100000; ulong size = (ulong)input.Length; @@ -115,9 +94,57 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) catch (Exception ex) { MessageBox.Show($"Emulation error: {ex.Message}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + // Fallback to RetDec CLI + return TranslateWithRetDec(fromArch, toArch, input); } uc.Dispose(); return output.ToArray(); } + + /// + /// Fallback translation using RetDec CLI. + /// + private static byte[] TranslateWithRetDec(string fromArch, string toArch, byte[] input) + { + string tempInput = null; + string tempOutput = null; + try + { + tempInput = Path.GetTempFileName(); + tempOutput = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + File.WriteAllBytes(tempInput, input); + var args = $"--mode raw -e {fromArch} -t {toArch} -o {tempOutput} {tempInput}"; + var psi = new ProcessStartInfo("retdec-decompiler", args) + { + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + CreateNoWindow = true + }; + using var proc = Process.Start(psi); + proc.WaitForExit(); + if (proc.ExitCode != 0) + { + var err = proc.StandardError.ReadToEnd(); + MessageBox.Show($"RetDec error: {err}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + return input; + } + if (File.Exists(tempOutput)) + { + return File.ReadAllBytes(tempOutput); + } + MessageBox.Show("RetDec did not produce output.", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + return input; + } + catch (Exception ex) + { + MessageBox.Show($"RetDec invocation error: {ex.Message}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + return input; + } + finally + { + try { File.Delete(tempInput); File.Delete(tempOutput); } catch { } + } + } } } From 31d9ab317f04e37ef238e189aa20706de69c94a4 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:51:40 -0500 Subject: [PATCH 086/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 919fdb96..83f73eed 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -196,8 +196,8 @@ private async Task HandleGenericEmulation() { // Fallback to QEMU with optional extra CLI options StatusBarText("Homebrew emulator not implemented for this architecture, falling back to QEMU..."); - // Prompt user for extra QEMU command-line options - string extraArgs = PromptUserForInput("Enter extra QEMU options (leave blank for default):")?.Trim() ?? string.Empty; + // Prompt user for extra QEMU command-line options using a detailed dialog + string extraArgs = PromptForQemuOptions(); try { if (!string.IsNullOrEmpty(extraArgs)) @@ -707,6 +707,7 @@ private string PromptUserForInput(string message) return result; } + private byte[] ReadAndTranslateFile(string filePath, string fromArch, string toArch) { // Load raw data @@ -867,5 +868,42 @@ private void MainWindow_Drop(object sender, DragEventArgs e) } // All duplicate methods/helpers have been removed for clarity. + + // New method to prompt user for QEMU options + private string PromptForQemuOptions() + { + var dialog = new Window + { + Title = "QEMU Options", + Width = 500, + Height = 300, + WindowStartupLocation = WindowStartupLocation.CenterOwner, + ResizeMode = ResizeMode.CanResize, + Owner = this + }; + var stack = new StackPanel { Margin = new Thickness(10) }; + stack.Children.Add(new TextBlock { Text = "Enter extra QEMU command-line options:", Margin = new Thickness(0, 0, 0, 5) }); + var textBox = new TextBox + { + AcceptsReturn = true, + Text = string.Empty, + VerticalScrollBarVisibility = ScrollBarVisibility.Auto, + HorizontalScrollBarVisibility = ScrollBarVisibility.Auto, + Height = 180 + }; + stack.Children.Add(textBox); + var btnPanel = new StackPanel { Orientation = Orientation.Horizontal, HorizontalAlignment = HorizontalAlignment.Right, Margin = new Thickness(0, 10, 0, 0) }; + var okButton = new Button { Content = "OK", Width = 80, IsDefault = true, Margin = new Thickness(0, 0, 5, 0) }; + var cancelButton = new Button { Content = "Cancel", Width = 80, IsCancel = true }; + btnPanel.Children.Add(okButton); + btnPanel.Children.Add(cancelButton); + stack.Children.Add(btnPanel); + dialog.Content = stack; + string result = null; + okButton.Click += (s, e) => { result = textBox.Text.Trim(); dialog.DialogResult = true; dialog.Close(); }; + if (dialog.ShowDialog() == true) + return result; + return string.Empty; + } } } \ No newline at end of file From 31911c103650fffbdf140d1333d78b2d274ab97f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:51:45 -0500 Subject: [PATCH 087/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 2a009725..e8844aba 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+d4112fc50f77062ff8fb86d93eb5d6ed774efe7f")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ec26567344a435af6ae4f53bf9982157b2f23121")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 17f7b1550e9e744710772c5a9de5392b7e3ddc1d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:51:50 -0500 Subject: [PATCH 088/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 86b23734..ab4d7be0 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -ae7a949c217987dc077a914a67e8f1e10edcbe3af3accd35252b638995413e59 +623c6a9a249533787d621cb483da1464cefd21f8c4bfc405f281c4a86f6f9a54 From aa9e0d26f441e9a084ae6de063a0982b43082ca7 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:51:53 -0500 Subject: [PATCH 089/230] Update ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index a136e38f..6f50b566 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/68d54b822c21fa5b499ce0b1a26e05cd73a5d9f4/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/ec26567344a435af6ae4f53bf9982157b2f23121/*"}} \ No newline at end of file From ab84e9670f470d4f4cb331ea08f8c7488df0e44c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:51:58 -0500 Subject: [PATCH 090/230] Update ProcessorEmulator_MarkupCompile.cache --- .../net6.0-windows/ProcessorEmulator_MarkupCompile.cache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache index 5b9f64f6..01976bbc 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -4,12 +4,12 @@ winexe C# .cs -c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ +C:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ ProcessorEmulator none false TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER -c:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml +C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml 2-826070488 381330416473 From 80f9562935b6e850c4ff8ab4127a357dcf1375c1 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:55:31 -0500 Subject: [PATCH 091/230] Stub UnicornSharp with in-process Unicorn namespace Replaced UnicornSharp imports with a stubbed Unicorn namespace in BinaryTranslator.cs to allow in-process translation and testing without the external dependency. This change introduces minimal stub classes and enums to mimic UnicornSharp's API. --- Tools/BinaryTranslator.cs | 36 ++++++++++++++++--- .../ProcessorEmulator.AssemblyInfo.cs | 2 +- ...ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- .../ProcessorEmulator.sourcelink.json | 2 +- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 97317905..53ae4218 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -2,11 +2,37 @@ using System.IO; using System.Windows; using System.Collections.Generic; -using UnicornSharp; -using UnicornSharp.Arch; -using UnicornSharp.Control; -using UnicornSharp.Memory; -using UnicornSharp.Hooks; +using Unicorn; + +// Stub Unicorn namespace definitions for in-process translation +namespace Unicorn +{ + public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } + public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } + public enum HookType { Code } + public class UnicornEngine : IDisposable + { + public UnicornArch Arch { get; } + public UnicornMode Mode { get; } + public MemoryManager Memory { get; } = new MemoryManager(); + public RegisterManager Registers { get; } = new RegisterManager(); + public HookManager Hooks { get; } = new HookManager(); + public UnicornEngine(UnicornArch arch, UnicornMode mode) { Arch = arch; Mode = mode; } + public void Start(ulong begin, ulong end) { /* Stub: no-op */ } + public void Dispose() { /* Stub: no-op */ } + } + public class MemoryManager + { + public void Map(ulong addr, ulong size) { /* Stub: no-op */ } + public void Write(ulong addr, byte[] data) { /* Stub: no-op */ } + public byte[] Read(ulong addr, uint length) { return new byte[length]; } + } + public class RegisterManager { public ulong PC { get; set; } } + public class HookManager + { + public void Add(HookType type, Action callback) { /* Stub: no-op */ } + } +} using System.Diagnostics; namespace ProcessorEmulator.Tools diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index e8844aba..922adc50 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ec26567344a435af6ae4f53bf9982157b2f23121")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ab84e9670f470d4f4cb331ea08f8c7488df0e44c")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index ab4d7be0..7d18aec7 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -623c6a9a249533787d621cb483da1464cefd21f8c4bfc405f281c4a86f6f9a54 +54c367a853fefad93b2a8c460bd37a3a864a53cc51ccecf26bd705b8fa5c6eae diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 6f50b566..c05de614 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/ec26567344a435af6ae4f53bf9982157b2f23121/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/ab84e9670f470d4f4cb331ea08f8c7488df0e44c/*"}} \ No newline at end of file From 2d2b3a1396ae7ea40ef050287c607fcf77943695 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:56:45 -0500 Subject: [PATCH 092/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 53ae4218..e2b67949 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -2,9 +2,10 @@ using System.IO; using System.Windows; using System.Collections.Generic; -using Unicorn; +using System.Diagnostics; // Stub Unicorn namespace definitions for in-process translation +// (Placed before ProcessorEmulator.Tools) namespace Unicorn { public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } @@ -33,7 +34,6 @@ public class HookManager public void Add(HookType type, Action callback) { /* Stub: no-op */ } } } -using System.Diagnostics; namespace ProcessorEmulator.Tools { From 739b9829c68a63af58450edbf74d127bcd32a408 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 16:59:54 -0500 Subject: [PATCH 093/230] Add UnicornEngine stub implementation Introduces Tools/UnicornStubs.cs, providing stub classes and enums to simulate the UnicornEngine API for testing or development purposes. No functional emulation is implemented; all methods are no-ops or return default values. --- Tools/UnicornStubs.cs | 34 +++++++++++++++++++ .../ProcessorEmulator.AssemblyInfo.cs | 2 +- ...ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 3 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 Tools/UnicornStubs.cs diff --git a/Tools/UnicornStubs.cs b/Tools/UnicornStubs.cs new file mode 100644 index 00000000..75b7620e --- /dev/null +++ b/Tools/UnicornStubs.cs @@ -0,0 +1,34 @@ +using System; + +namespace Unicorn +{ + public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } + public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } + public enum HookType { Code } + + public class UnicornEngine : IDisposable + { + public UnicornArch Arch { get; } + public UnicornMode Mode { get; } + public MemoryManager Memory { get; } = new MemoryManager(); + public RegisterManager Registers { get; } = new RegisterManager(); + public HookManager Hooks { get; } = new HookManager(); + public UnicornEngine(UnicornArch arch, UnicornMode mode) { Arch = arch; Mode = mode; } + public void Start(ulong begin, ulong end) { /* Stub: no-op */ } + public void Dispose() { /* Stub: no-op */ } + } + + public class MemoryManager + { + public void Map(ulong addr, ulong size) { /* Stub: no-op */ } + public void Write(ulong addr, byte[] data) { /* Stub: no-op */ } + public byte[] Read(ulong addr, uint length) { return new byte[length]; } + } + + public class RegisterManager { public ulong PC { get; set; } } + + public class HookManager + { + public void Add(HookType type, Action callback) { /* Stub: no-op */ } + } +} diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 922adc50..6cb91d92 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ab84e9670f470d4f4cb331ea08f8c7488df0e44c")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2d2b3a1396ae7ea40ef050287c607fcf77943695")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 7d18aec7..300c282f 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -54c367a853fefad93b2a8c460bd37a3a864a53cc51ccecf26bd705b8fa5c6eae +1fe5514c326da6da54179cf0939c9a72937636e194521d6c92deb2828212d32d From 1128c3a34be9683fdbabaf8f1b9b37b1bb600bc5 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 17:02:17 -0500 Subject: [PATCH 094/230] Update assembly info and cache for new build Regenerated AssemblyInfo and cache files to reflect the latest build. No source code changes included. --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 6cb91d92..4023098a 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+2d2b3a1396ae7ea40ef050287c607fcf77943695")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+739b9829c68a63af58450edbf74d127bcd32a408")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 300c282f..ccf45995 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -1fe5514c326da6da54179cf0939c9a72937636e194521d6c92deb2828212d32d +765b729ee413da9bed244b8d2ebf575e7c94a1bf94da53a98c04200fd9a1206f From ccf35d43f8ada85397f6b6653a29f8522a49aeef Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 17:19:28 -0500 Subject: [PATCH 095/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index e2b67949..3f00bcc1 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -3,6 +3,7 @@ using System.Windows; using System.Collections.Generic; using System.Diagnostics; +// using Unicorn; // removed: use fully qualified stub implementations below // Stub Unicorn namespace definitions for in-process translation // (Placed before ProcessorEmulator.Tools) @@ -55,44 +56,44 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) if (string.Equals(fromArch, toArch, StringComparison.OrdinalIgnoreCase)) return input; // Determine Unicorn arch/mode - UnicornEngine uc; + Unicorn.UnicornEngine uc; switch (fromArch.ToLowerInvariant()) { case "x86": - uc = new UnicornEngine(UnicornArch.X86, UnicornMode.Bit32); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.X86, Unicorn.UnicornMode.Bit32); break; case "x64": case "x86_64": - uc = new UnicornEngine(UnicornArch.X86, UnicornMode.Bit64); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.X86, Unicorn.UnicornMode.Bit64); break; case "arm": - uc = new UnicornEngine(UnicornArch.ARM, UnicornMode.Arm); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.ARM, Unicorn.UnicornMode.Arm); break; case "arm64": - uc = new UnicornEngine(UnicornArch.ARM64, UnicornMode.LittleEndian); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.ARM64, Unicorn.UnicornMode.LittleEndian); break; case "mips": - uc = new UnicornEngine(UnicornArch.MIPS, UnicornMode.Mips32LittleEndian); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.MIPS, Unicorn.UnicornMode.Mips32LittleEndian); break; case "ppc": case "ppc32": - uc = new UnicornEngine(UnicornArch.PPC, UnicornMode.PPC32); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.PPC, Unicorn.UnicornMode.PPC32); break; case "ppc64": - uc = new UnicornEngine(UnicornArch.PPC, UnicornMode.PPC64); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.PPC, Unicorn.UnicornMode.PPC64); break; case "sparc": - uc = new UnicornEngine(UnicornArch.SPARC, UnicornMode.Sparc32); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.SPARC, Unicorn.UnicornMode.Sparc32); break; case "sparc64": - uc = new UnicornEngine(UnicornArch.SPARC, UnicornMode.Sparc64); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.SPARC, Unicorn.UnicornMode.Sparc64); break; case "riscv": case "riscv32": - uc = new UnicornEngine(UnicornArch.RISCV, UnicornMode.RiscV32); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.RISCV, Unicorn.UnicornMode.RiscV32); break; case "riscv64": - uc = new UnicornEngine(UnicornArch.RISCV, UnicornMode.RiscV64); + uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.RISCV, Unicorn.UnicornMode.RiscV64); break; default: // RetDec fallback for unsupported ISA @@ -107,7 +108,7 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) uc.Registers.PC = BASE; var output = new List(); // Hook instructions to capture translated bytes - uc.Hooks.Add(HookType.Code, (ucEngine, address, length, user) => + uc.Hooks.Add(Unicorn.HookType.Code, (ucEngine, address, length, user) => { var bytes = ucEngine.Memory.Read(address, length); output.AddRange(bytes); From f38a21cf9c18221467e38bc8df727b5f2bee51b9 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:48:54 -0500 Subject: [PATCH 096/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 3f00bcc1..ee1fede3 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -3,11 +3,10 @@ using System.Windows; using System.Collections.Generic; using System.Diagnostics; -// using Unicorn; // removed: use fully qualified stub implementations below +using StubUnicorn = ProcessorEmulator.Tools.StubUnicorn; // Stub Unicorn namespace definitions for in-process translation -// (Placed before ProcessorEmulator.Tools) -namespace Unicorn +namespace ProcessorEmulator.Tools.StubUnicorn { public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } @@ -22,7 +21,6 @@ public class UnicornEngine : IDisposable public UnicornEngine(UnicornArch arch, UnicornMode mode) { Arch = arch; Mode = mode; } public void Start(ulong begin, ulong end) { /* Stub: no-op */ } public void Dispose() { /* Stub: no-op */ } - } public class MemoryManager { public void Map(ulong addr, ulong size) { /* Stub: no-op */ } @@ -56,44 +54,44 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) if (string.Equals(fromArch, toArch, StringComparison.OrdinalIgnoreCase)) return input; // Determine Unicorn arch/mode - Unicorn.UnicornEngine uc; + StubUnicorn.UnicornEngine uc; switch (fromArch.ToLowerInvariant()) { case "x86": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.X86, Unicorn.UnicornMode.Bit32); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.X86, StubUnicorn.UnicornMode.Bit32); break; case "x64": case "x86_64": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.X86, Unicorn.UnicornMode.Bit64); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.X86, StubUnicorn.UnicornMode.Bit64); break; case "arm": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.ARM, Unicorn.UnicornMode.Arm); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.ARM, StubUnicorn.UnicornMode.Arm); break; case "arm64": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.ARM64, Unicorn.UnicornMode.LittleEndian); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.ARM64, StubUnicorn.UnicornMode.LittleEndian); break; case "mips": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.MIPS, Unicorn.UnicornMode.Mips32LittleEndian); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.MIPS, StubUnicorn.UnicornMode.Mips32LittleEndian); break; case "ppc": case "ppc32": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.PPC, Unicorn.UnicornMode.PPC32); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.PPC, StubUnicorn.UnicornMode.PPC32); break; case "ppc64": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.PPC, Unicorn.UnicornMode.PPC64); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.PPC, StubUnicorn.UnicornMode.PPC64); break; case "sparc": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.SPARC, Unicorn.UnicornMode.Sparc32); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.SPARC, StubUnicorn.UnicornMode.Sparc32); break; case "sparc64": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.SPARC, Unicorn.UnicornMode.Sparc64); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.SPARC, StubUnicorn.UnicornMode.Sparc64); break; case "riscv": case "riscv32": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.RISCV, Unicorn.UnicornMode.RiscV32); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.RISCV, StubUnicorn.UnicornMode.RiscV32); break; case "riscv64": - uc = new Unicorn.UnicornEngine(Unicorn.UnicornArch.RISCV, Unicorn.UnicornMode.RiscV64); + uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.RISCV, StubUnicorn.UnicornMode.RiscV64); break; default: // RetDec fallback for unsupported ISA @@ -108,9 +106,9 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) uc.Registers.PC = BASE; var output = new List(); // Hook instructions to capture translated bytes - uc.Hooks.Add(Unicorn.HookType.Code, (ucEngine, address, length, user) => + uc.Hooks.Add(StubUnicorn.HookType.Code, (engine, address, length, user) => { - var bytes = ucEngine.Memory.Read(address, length); + var bytes = engine.Memory.Read(address, length); output.AddRange(bytes); }); try @@ -175,3 +173,4 @@ private static byte[] TranslateWithRetDec(string fromArch, string toArch, byte[] } } } +} From 76719f41446835f25cb9736a4baa55c8a4275938 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:04 -0500 Subject: [PATCH 097/230] Update ArchiveExtractor.cs --- ArchiveExtractor.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/ArchiveExtractor.cs b/ArchiveExtractor.cs index a9091b3d..8f2710ad 100644 --- a/ArchiveExtractor.cs +++ b/ArchiveExtractor.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using System.IO; namespace ProcessorEmulator.Tools { From 3604b0955c4304a6f9e77ac298d80fc21372af2b Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:20 -0500 Subject: [PATCH 098/230] Remove unused using directive in ArmCpuEmulator.cs Eliminated the unnecessary 'using System.Collections.Generic;' directive from ArmCpuEmulator.cs to clean up the code. --- ArmCpuEmulator.cs | 1 - .../net6.0-windows/ProcessorEmulator.exe | Bin 151040 -> 151040 bytes .../ProcessorEmulator.genruntimeconfig.cache | 2 +- obj/Debug/net6.0-windows/apphost.exe | Bin 151040 -> 151040 bytes 4 files changed, 1 insertion(+), 2 deletions(-) diff --git a/ArmCpuEmulator.cs b/ArmCpuEmulator.cs index 1dbc000c..ccfab81a 100644 --- a/ArmCpuEmulator.cs +++ b/ArmCpuEmulator.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace ProcessorEmulator.Emulation { diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe index 0f9c1ac7e6c8ef0ba559bb71bdbb99f615200b08..1effeada8531478d2f61a07b5ed283c4c1d4a325 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0?67>pS#7!nzb7z`Pb8PXUmfutc�V^6!eGW=&X5XLlLVBp kU`PR~F$c<-GbAyX0@+4DIu!^_fx40yEVnQBW{PA20MR58DgXcg delta 99 zcmZpe!`T2tEsR^3BE0?07%Ui47)%*V7?OZ2BOpu$Vnc>BhD4xf5>VU{2$LC784Q3t iL!hV;gBh4-3KUIYFlR6Zt4sl^N@FnDzTBHBk_iCLnGziU diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache index 321075c9..5ffd1e7b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache @@ -1 +1 @@ -fbcb2c37cc2a9bdd4f8b6758b66f7921742cf1e6c6b6ec844b957bdb69f6a150 +add8ca7b3b27de1294e26b51872eea25f81dbcbd62e187cd142b4b53a22e052c diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe index 0f9c1ac7e6c8ef0ba559bb71bdbb99f615200b08..1effeada8531478d2f61a07b5ed283c4c1d4a325 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0?67>pS#7!nzb7z`Pb8PXUmfutc�V^6!eGW=&X5XLlLVBp kU`PR~F$c<-GbAyX0@+4DIu!^_fx40yEVnQBW{PA20MR58DgXcg delta 99 zcmZpe!`T2tEsR^3BE0?07%Ui47)%*V7?OZ2BOpu$Vnc>BhD4xf5>VU{2$LC784Q3t iL!hV;gBh4-3KUIYFlR6Zt4sl^N@FnDzTBHBk_iCLnGziU From 5b594c5161028ad93538fd7edb6bd625ca85ab00 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:24 -0500 Subject: [PATCH 099/230] Update BinaryScanner.cs --- BinaryScanner.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/BinaryScanner.cs b/BinaryScanner.cs index 6fb16300..2f76bac5 100644 --- a/BinaryScanner.cs +++ b/BinaryScanner.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Linq; -using System.Collections.Generic; namespace ProcessorEmulator.Tools { From 28875b1d133085adc8e84ed221e96c7b582439da Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:30 -0500 Subject: [PATCH 100/230] Update DirecTVEmulator.cs --- DirecTVEmulator.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/DirecTVEmulator.cs b/DirecTVEmulator.cs index f58557ca..1b02c6ee 100644 --- a/DirecTVEmulator.cs +++ b/DirecTVEmulator.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; namespace ProcessorEmulator.Emulation { From de58de37ddf4fa31d304150c975626a47d1c78a6 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:33 -0500 Subject: [PATCH 101/230] Update DvrVxWorksDetector.cs --- DvrVxWorksDetector.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/DvrVxWorksDetector.cs b/DvrVxWorksDetector.cs index 97f9bd51..d2064e47 100644 --- a/DvrVxWorksDetector.cs +++ b/DvrVxWorksDetector.cs @@ -1,5 +1,4 @@ using System; -using System.IO; using System.Collections.Generic; using System.Text; From 06c9bc305e02a4eadd7643a618634969b7054913 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:38 -0500 Subject: [PATCH 102/230] Update Emulation.cs --- Emulation.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Emulation.cs b/Emulation.cs index d2165781..f771fa6a 100644 --- a/Emulation.cs +++ b/Emulation.cs @@ -1,6 +1,4 @@ -using System; using System.Collections.Generic; -using System.Linq; namespace ProcessorEmulator.Emulation { From aeeb92091ad149db826cbb37d6cac3c0789da6d6 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:42 -0500 Subject: [PATCH 103/230] Update EmulatorLauncher.cs --- EmulatorLauncher.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/EmulatorLauncher.cs b/EmulatorLauncher.cs index a7213fb2..11a350c3 100644 --- a/EmulatorLauncher.cs +++ b/EmulatorLauncher.cs @@ -1,4 +1,3 @@ -using System; using ProcessorEmulator.Tools; namespace ProcessorEmulator.Emulation From 546749a5ec042f2e8df708cfc020c156cac31dcf Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:46 -0500 Subject: [PATCH 104/230] Update ExoticFilesystemManager.cs --- ExoticFilesystemManager.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/ExoticFilesystemManager.cs b/ExoticFilesystemManager.cs index c84ac79e..996da829 100644 --- a/ExoticFilesystemManager.cs +++ b/ExoticFilesystemManager.cs @@ -3,9 +3,7 @@ using System.Runtime.InteropServices; using System.Collections.Generic; using System.Linq; -using System.Text; using ProcessorEmulator.Tools.FileSystems; -using System.Reflection; namespace ProcessorEmulator.Tools { From 60de283a405a275d163061ce238c4ab2d0bee2a9 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:49 -0500 Subject: [PATCH 105/230] Update FilesystemProber.cs --- FilesystemProber.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/FilesystemProber.cs b/FilesystemProber.cs index 88bf5754..e0218838 100644 --- a/FilesystemProber.cs +++ b/FilesystemProber.cs @@ -1,6 +1,5 @@ using System; using System.IO; -using System.Collections.Generic; namespace ProcessorEmulator.Tools { From 9ad9f256c9d3f46d8f6119eed6f3d09e3b04a101 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:54 -0500 Subject: [PATCH 106/230] Update FileSystems.cs --- FileSystems.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/FileSystems.cs b/FileSystems.cs index 391d239a..98e5567b 100644 --- a/FileSystems.cs +++ b/FileSystems.cs @@ -2,7 +2,6 @@ using System.IO; using System.Collections.Generic; using System.Linq; -using System.Runtime.InteropServices; namespace ProcessorEmulator.Tools.FileSystems { From 616011210f6e9977e89694e036968037ce8daac7 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:51:58 -0500 Subject: [PATCH 107/230] Update FirmwareAnalyzer.cs --- FirmwareAnalyzer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/FirmwareAnalyzer.cs b/FirmwareAnalyzer.cs index 4b7a09d8..c7720559 100644 --- a/FirmwareAnalyzer.cs +++ b/FirmwareAnalyzer.cs @@ -1,5 +1,4 @@ using System; -using System.IO; namespace ProcessorEmulator.Tools { From 5a34efd615da620c643a5e694e57de77f7c6879e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:04 -0500 Subject: [PATCH 108/230] Update LinuxFileSystems.cs --- LinuxFileSystems.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/LinuxFileSystems.cs b/LinuxFileSystems.cs index 0c9028e2..fc8c66fb 100644 --- a/LinuxFileSystems.cs +++ b/LinuxFileSystems.cs @@ -1,7 +1,6 @@ using System; using System.IO; using System.Collections.Generic; -using System.Security.Cryptography; namespace ProcessorEmulator.Tools.FileSystems { From ef52ca4ffb3329a65a7fccc3ef0348d589defaa5 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:07 -0500 Subject: [PATCH 109/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 83f73eed..e2e56d14 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -11,6 +11,7 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using System.Diagnostics; +using ProcessorEmulator.Tools.StubUnicorn.ProcessorEmulator.Tools; // Add this if BinaryTranslator is in Tools namespace namespace ProcessorEmulator { From 5b3cbaa9430f427832900bb956836633a3c90c12 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:11 -0500 Subject: [PATCH 110/230] Update MipsCpuEmulator.cs --- MipsCpuEmulator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/MipsCpuEmulator.cs b/MipsCpuEmulator.cs index eced39b8..9ab6c788 100644 --- a/MipsCpuEmulator.cs +++ b/MipsCpuEmulator.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Windows; namespace ProcessorEmulator.Emulation From 6fcb544a3a7cf5df6a260f7ba0e02d3186d73cff Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:16 -0500 Subject: [PATCH 111/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 4023098a..35f7cc7f 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+739b9829c68a63af58450edbf74d127bcd32a408")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f38a21cf9c18221467e38bc8df727b5f2bee51b9")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 082e8cb2c0998bddfb147275ef5bd471b85232f8 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:20 -0500 Subject: [PATCH 112/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index ccf45995..491e63fe 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -765b729ee413da9bed244b8d2ebf575e7c94a1bf94da53a98c04200fd9a1206f +ae7d33e8f2d0a044083f6ee42c50994dfebfe1b12671ba620bf988bd7a5def0d From cbbbcb78c4fece6e378a12361fde691549115a9d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:23 -0500 Subject: [PATCH 113/230] Update ProcessorEmulator.csproj.CoreCompileInputs.cache --- .../ProcessorEmulator.csproj.CoreCompileInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache index 5bd45668..e8f892e7 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.CoreCompileInputs.cache @@ -1 +1 @@ -3468de5d50933c5b09ef759fd6d8df2dba417d181972588f38522e30f9f6ba96 +c87550c4733045aee4977f18358f4475a1f0ab4e686e33b7234e24d71d2eedad From 9dc24f245f58c4e3077750112bf0798ad469100e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:27 -0500 Subject: [PATCH 114/230] Update ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index c05de614..c29fb080 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/ab84e9670f470d4f4cb331ea08f8c7488df0e44c/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/f38a21cf9c18221467e38bc8df727b5f2bee51b9/*"}} \ No newline at end of file From 6f71bafafd5ecba8f2ebf437793d6d9006b70bf9 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:31 -0500 Subject: [PATCH 115/230] Update ProcessorEmulator_MarkupCompile.cache --- obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache index 01976bbc..789cd5e7 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -12,7 +12,7 @@ TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml 2-826070488 -381330416473 +39-1121013689 1942128195826 ClassicStyle.xaml;MainWindow.xaml; From 5523bd36305667496276637bcd75e53a3c99aa37 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:35 -0500 Subject: [PATCH 116/230] Update RDKVEmulator.cs --- RDKVEmulator.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/RDKVEmulator.cs b/RDKVEmulator.cs index e7f22fce..91122fb4 100644 --- a/RDKVEmulator.cs +++ b/RDKVEmulator.cs @@ -1,7 +1,5 @@ using System; using System.Collections.Generic; -using System.IO; -using System.Threading.Tasks; namespace ProcessorEmulator.Emulation { From 35ea5be50853a0613a7b5b362c53e9bdbb5d098f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:38 -0500 Subject: [PATCH 117/230] Update SatelliteStreamEmulator.cs --- SatelliteStreamEmulator.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/SatelliteStreamEmulator.cs b/SatelliteStreamEmulator.cs index 682e0d48..94b94c74 100644 --- a/SatelliteStreamEmulator.cs +++ b/SatelliteStreamEmulator.cs @@ -1,5 +1,3 @@ -using System; - namespace ProcessorEmulator.Emulation { // Placeholder for satellite transport stream and keep-alive emulation From 753c6ff5d18e861033ae5b891a32b988afca89a6 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:42 -0500 Subject: [PATCH 118/230] Update SwmLnbEmulator.cs --- SwmLnbEmulator.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/SwmLnbEmulator.cs b/SwmLnbEmulator.cs index 8c5a90ff..2795951c 100644 --- a/SwmLnbEmulator.cs +++ b/SwmLnbEmulator.cs @@ -1,5 +1,3 @@ -using System; - namespace ProcessorEmulator.Emulation { // Stub for DIRECTV SWM LNB/Switch emulation From 5fce4a3fbd4704274c38312876196db1b1292b40 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:45 -0500 Subject: [PATCH 119/230] Update Tools.cs --- Tools.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Tools.cs b/Tools.cs index d3f5ac6c..f0d971aa 100644 --- a/Tools.cs +++ b/Tools.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Net.Http; using System.Text; using System.Threading.Tasks; From a6aa092cbd415c661279d43edb5bf7c7ef2fcc05 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:51 -0500 Subject: [PATCH 120/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index ee1fede3..c475f5cb 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -3,7 +3,6 @@ using System.Windows; using System.Collections.Generic; using System.Diagnostics; -using StubUnicorn = ProcessorEmulator.Tools.StubUnicorn; // Stub Unicorn namespace definitions for in-process translation namespace ProcessorEmulator.Tools.StubUnicorn From 5ec11dc24824bd44b5f6bf22afe588c38925f7dd Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:52:56 -0500 Subject: [PATCH 121/230] Update UverseEmulator.cs --- UverseEmulator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/UverseEmulator.cs b/UverseEmulator.cs index 2ee984d7..19892b19 100644 --- a/UverseEmulator.cs +++ b/UverseEmulator.cs @@ -3,7 +3,6 @@ using System.IO; using System.Net; using System.Security.Cryptography; -using System.Text; using System.Threading.Tasks; using ProcessorEmulator.Network; From c7f4eb201e07de6afb534df8e2a896ac0dac8729 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:53:02 -0500 Subject: [PATCH 122/230] Update WinCEEmulator.cs --- WinCEEmulator.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/WinCEEmulator.cs b/WinCEEmulator.cs index 0d2579a6..363711a2 100644 --- a/WinCEEmulator.cs +++ b/WinCEEmulator.cs @@ -1,5 +1,3 @@ -using System; -using System.Runtime.InteropServices; using ProcessorEmulator.Tools; namespace ProcessorEmulator.Emulation From 94f5588f5017bc55c4e497e416730b8bea522f60 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 20:53:05 -0500 Subject: [PATCH 123/230] Update X86CpuEmulator.cs --- X86CpuEmulator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/X86CpuEmulator.cs b/X86CpuEmulator.cs index aa3035b9..25f0126e 100644 --- a/X86CpuEmulator.cs +++ b/X86CpuEmulator.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; namespace ProcessorEmulator.Emulation { From 8fdf87e726d28897a35df7925184919f03a9e946 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:01:46 -0500 Subject: [PATCH 124/230] Refactor StubUnicorn namespace and memory manager stubs Reorganized the stub definitions in ProcessorEmulator.Tools.StubUnicorn, moving the MemoryManager class and cleaning up enum and class declarations for clarity. No functional changes were made; this is a code organization improvement. --- Tools/BinaryTranslator.cs | 9 +++++---- .../net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- .../ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- .../net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index c475f5cb..9689aee3 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -6,10 +6,9 @@ // Stub Unicorn namespace definitions for in-process translation namespace ProcessorEmulator.Tools.StubUnicorn -{ - public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } - public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } - public enum HookType { Code } + } + // Stub: memory manager for in-process translation + public class MemoryManager public class UnicornEngine : IDisposable { public UnicornArch Arch { get; } @@ -20,6 +19,8 @@ public class UnicornEngine : IDisposable public UnicornEngine(UnicornArch arch, UnicornMode mode) { Arch = arch; Mode = mode; } public void Start(ulong begin, ulong end) { /* Stub: no-op */ } public void Dispose() { /* Stub: no-op */ } + } + // Stub: memory manager for in-process translation public class MemoryManager { public void Map(ulong addr, ulong size) { /* Stub: no-op */ } diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 35f7cc7f..791435ef 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+f38a21cf9c18221467e38bc8df727b5f2bee51b9")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+94f5588f5017bc55c4e497e416730b8bea522f60")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 491e63fe..5feb113b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -ae7d33e8f2d0a044083f6ee42c50994dfebfe1b12671ba620bf988bd7a5def0d +08d2645e7e4525f191992ac0d59d29806d110653b43e8bebf992679290e01ba1 diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index c29fb080..ed0d4aa7 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/f38a21cf9c18221467e38bc8df727b5f2bee51b9/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/94f5588f5017bc55c4e497e416730b8bea522f60/*"}} \ No newline at end of file From d97c5ead56d895e95eefcab197b4abdfda071f1c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:04:16 -0500 Subject: [PATCH 125/230] Refactor StubUnicorn stubs and add missing classes Reorganizes and completes the stub classes in the ProcessorEmulator.Tools.StubUnicorn namespace. Adds missing MemoryManager, RegisterManager, and HookManager classes, and corrects the UnicornEngine implementation for in-process translation stubbing. --- Tools/BinaryTranslator.cs | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 9689aee3..5fcb6d59 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -3,12 +3,12 @@ using System.Windows; using System.Collections.Generic; using System.Diagnostics; +using StubUnicorn = ProcessorEmulator.Tools.StubUnicorn; // Stub Unicorn namespace definitions for in-process translation namespace ProcessorEmulator.Tools.StubUnicorn } // Stub: memory manager for in-process translation - public class MemoryManager public class UnicornEngine : IDisposable { public UnicornArch Arch { get; } @@ -30,6 +30,36 @@ public void Write(ulong addr, byte[] data) { /* Stub: no-op */ } public class RegisterManager { public ulong PC { get; set; } } public class HookManager { + public UnicornArch Arch { get; } + public UnicornMode Mode { get; } + public MemoryManager Memory { get; } = new MemoryManager(); + public RegisterManager Registers { get; } = new RegisterManager(); + public HookManager Hooks { get; } = new HookManager(); + + public UnicornEngine(UnicornArch arch, UnicornMode mode) + { + Arch = arch; + Mode = mode; + } + + public void Start(ulong begin, ulong end) { /* Stub: no-op */ } + + public void Dispose() { /* Stub: no-op */ } + } + + public class MemoryManager + { + public void Map(ulong addr, ulong size) { /* Stub: no-op */ } + public void Write(ulong addr, byte[] data) { /* Stub: no-op */ } + public byte[] Read(ulong addr, uint length) { return new byte[length]; } + } + + public class RegisterManager { public ulong PC { get; set; } } + + public class HookManager + { + public void Add(HookType type, Action callback) { /* Stub: no-op */ } + } public void Add(HookType type, Action callback) { /* Stub: no-op */ } } } From 68cf39ba7c5a16dbbfd0c1b588b8c084c707b4d2 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:05:32 -0500 Subject: [PATCH 126/230] Add UnicornEngine enums and class definition Introduced UnicornArch, UnicornMode, and HookType enums, as well as a UnicornEngine class stub, to support future integration with the Unicorn emulator. These additions lay the groundwork for enhanced binary translation capabilities. --- Tools/BinaryTranslator.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 5fcb6d59..3867b508 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -125,7 +125,11 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) break; default: // RetDec fallback for unsupported ISA - return TranslateWithRetDec(fromArch, toArch, input); + public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } + public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } + public enum HookType { Code } + + public class UnicornEngine : IDisposable } const ulong BASE = 0x100000; ulong size = (ulong)input.Length; From ee34e1b615fa4fd621b56a8a550ddd4c06628bb4 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:11:54 -0500 Subject: [PATCH 127/230] Update assembly info and cache for new build Regenerated AssemblyInfo and cache files to reflect the latest build. No source code changes included. --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 791435ef..2feb213e 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+94f5588f5017bc55c4e497e416730b8bea522f60")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+68cf39ba7c5a16dbbfd0c1b588b8c084c707b4d2")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 5feb113b..5203e013 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -08d2645e7e4525f191992ac0d59d29806d110653b43e8bebf992679290e01ba1 +f363cafd4eace53683e536d883c1b450593a20171e454bc9624d7bb508c2405a From 38b92980afcd9de578be8a647e18203b46d28eae Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:15:02 -0500 Subject: [PATCH 128/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 3867b508..48bf2133 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -185,8 +185,9 @@ private static byte[] TranslateWithRetDec(string fromArch, string toArch, byte[] if (proc.ExitCode != 0) { var err = proc.StandardError.ReadToEnd(); - MessageBox.Show($"RetDec error: {err}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); +// Stub Unicorn namespace definitions for in-process translation return input; +{ } if (File.Exists(tempOutput)) { From 1e2d3995f601b807f8564fb3fee4e25e054e8d65 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:18:25 -0500 Subject: [PATCH 129/230] Refactor StubUnicorn stubs and improve error handling Consolidated and corrected the StubUnicorn namespace stubs, fixing class and enum definitions. Improved error handling in RetDec translation by checking for output file existence and displaying appropriate error messages. Cleaned up redundant and misplaced code. --- Tools/BinaryTranslator.cs | 59 ++++++++------------------------------- 1 file changed, 12 insertions(+), 47 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index 48bf2133..dc164954 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -7,7 +7,11 @@ // Stub Unicorn namespace definitions for in-process translation namespace ProcessorEmulator.Tools.StubUnicorn - } +{ + public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } + public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } + public enum HookType { Code } + // Stub: memory manager for in-process translation public class UnicornEngine : IDisposable { @@ -30,36 +34,6 @@ public void Write(ulong addr, byte[] data) { /* Stub: no-op */ } public class RegisterManager { public ulong PC { get; set; } } public class HookManager { - public UnicornArch Arch { get; } - public UnicornMode Mode { get; } - public MemoryManager Memory { get; } = new MemoryManager(); - public RegisterManager Registers { get; } = new RegisterManager(); - public HookManager Hooks { get; } = new HookManager(); - - public UnicornEngine(UnicornArch arch, UnicornMode mode) - { - Arch = arch; - Mode = mode; - } - - public void Start(ulong begin, ulong end) { /* Stub: no-op */ } - - public void Dispose() { /* Stub: no-op */ } - } - - public class MemoryManager - { - public void Map(ulong addr, ulong size) { /* Stub: no-op */ } - public void Write(ulong addr, byte[] data) { /* Stub: no-op */ } - public byte[] Read(ulong addr, uint length) { return new byte[length]; } - } - - public class RegisterManager { public ulong PC { get; set; } } - - public class HookManager - { - public void Add(HookType type, Action callback) { /* Stub: no-op */ } - } public void Add(HookType type, Action callback) { /* Stub: no-op */ } } } @@ -120,16 +94,9 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) case "riscv32": uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.RISCV, StubUnicorn.UnicornMode.RiscV32); break; - case "riscv64": - uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.RISCV, StubUnicorn.UnicornMode.RiscV64); - break; default: // RetDec fallback for unsupported ISA - public enum UnicornArch { X86, PPC, ARM, ARM64, MIPS, SPARC, RISCV } - public enum UnicornMode { Bit32, Bit64, Arm, LittleEndian, Mips32LittleEndian, PPC32, PPC64, Sparc32, Sparc64, RiscV32, RiscV64 } - public enum HookType { Code } - - public class UnicornEngine : IDisposable + return TranslateWithRetDec(fromArch, toArch, input); } const ulong BASE = 0x100000; ulong size = (ulong)input.Length; @@ -185,16 +152,15 @@ private static byte[] TranslateWithRetDec(string fromArch, string toArch, byte[] if (proc.ExitCode != 0) { var err = proc.StandardError.ReadToEnd(); -// Stub Unicorn namespace definitions for in-process translation + MessageBox.Show("RetDec did not produce output.", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); return input; -{ } - if (File.Exists(tempOutput)) + if (!File.Exists(tempOutput)) { - return File.ReadAllBytes(tempOutput); + MessageBox.Show("RetDec did not produce output file.", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); + return input; } - MessageBox.Show("RetDec did not produce output.", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); - return input; + return File.ReadAllBytes(tempOutput); } catch (Exception ex) { @@ -203,9 +169,8 @@ private static byte[] TranslateWithRetDec(string fromArch, string toArch, byte[] } finally { - try { File.Delete(tempInput); File.Delete(tempOutput); } catch { } + try { if (tempInput != null) File.Delete(tempInput); if (tempOutput != null) File.Delete(tempOutput); } catch { } } } } } -} From 45bfca6037fc6fb0b1099a5faf1375d3d14228fe Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:18:30 -0500 Subject: [PATCH 130/230] Update assembly info and cache files Regenerated AssemblyInfo and cache files, likely due to a build or version update. No source code changes included. --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 2feb213e..37fd3388 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+68cf39ba7c5a16dbbfd0c1b588b8c084c707b4d2")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+38b92980afcd9de578be8a647e18203b46d28eae")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 5203e013..65bcb619 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -f363cafd4eace53683e536d883c1b450593a20171e454bc9624d7bb508c2405a +4b67fd4518cb67b4ec5e1439b0503f0c1875b43d9d496e36c24114e93990db04 From 391029e0a1742675fc2b0e17ce96941cbc66cd2f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:32:22 -0500 Subject: [PATCH 131/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index e2e56d14..83f73eed 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -11,7 +11,6 @@ using System.Collections.Generic; using System.Text.RegularExpressions; using System.Diagnostics; -using ProcessorEmulator.Tools.StubUnicorn.ProcessorEmulator.Tools; // Add this if BinaryTranslator is in Tools namespace namespace ProcessorEmulator { From 1f1468daea5d32451c19ebc9cbfe08e80cc85c4a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sat, 12 Jul 2025 21:32:29 -0500 Subject: [PATCH 132/230] Update build output and source link metadata Regenerated build artifacts with updated assembly informational version and source link commit hash. No changes to application logic. --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 37fd3388..3cfbe006 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+38b92980afcd9de578be8a647e18203b46d28eae")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+45bfca6037fc6fb0b1099a5faf1375d3d14228fe")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 65bcb619..bd3518ce 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -4b67fd4518cb67b4ec5e1439b0503f0c1875b43d9d496e36c24114e93990db04 +7a5ed99f946d223f15a241b7304928fe0226861b2f91aa03c1d329f52eb50792 diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index ed0d4aa7..0811c58f 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/94f5588f5017bc55c4e497e416730b8bea522f60/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/45bfca6037fc6fb0b1099a5faf1375d3d14228fe/*"}} \ No newline at end of file From 030c8c9521c16a551a4813849c3be7ed36b993a8 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:01 -0500 Subject: [PATCH 133/230] Create settings.json --- .vscode/settings.json | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..b0430290 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,41 @@ +{ + // Disable minimap for faster rendering + "editor.minimap.enabled": false, + // Reduce visual decorations + "editor.renderWhitespace": "none", + "editor.folding": false, + "editor.codeLens": false, + "editor.semanticHighlighting.enabled": false, + + // Exclude build folders from file watchers and searches + "files.watcherExclude": { + "**/bin/**": true, + "**/obj/**": true + }, + "search.exclude": { + "**/bin/**": true, + "**/obj/**": true + }, + + // Optimize C# performance + "omnisharp.enableRoslynAnalyzers": false, + "omnisharp.useModernNet": false, + "omnisharp.msbuildLogLevel": "quiet", + // Disable inlay hints to avoid LSP requests on null documents + "editor.inlayHints.enabled": "off", + "[csharp]": { + "editor.inlayHints.enabled": "off" + }, + // Disable C# specific inlay hint settings + "csharp.inlayHints.parameterNames.enabled": "none", + "csharp.inlayHints.parameterTypes.enabled": "none", + "csharp.inlayHints.variableTypes.enabled": "none", + + // Disable outline and breadcrumbs to reduce symbol requests + "outline.showFiles": false, + "breadcrumbs.enabled": false, + + // Disable telemetry for reduced background activity + "telemetry.enableTelemetry": false, + "telemetry.telemetryLevel": "off" +} From 40757ca4ebe789682091e25ed485afca8ba662d3 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:05 -0500 Subject: [PATCH 134/230] Update ProcessorEmulator.exe --- .../net6.0-windows/ProcessorEmulator.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe index 1effeada8531478d2f61a07b5ed283c4c1d4a325..50d3e05a9dc5653b8c398c8878b5df83faf0e0e2 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0<#8PXUG8B7?=7%Ui47!ny$f!GwtGG;IWikbrDl7ZL~D4qml jSpsnqP)90*0Z@G^5E}qRl7X}-kThXP+`inKDUt~Q=K~U} delta 99 zcmZpe!`T2tEsR^3BE0?67>pS#7!nzb7z`Pb8PXUmfutc�V^6!eGW=&X5XLlLVBp kU`PR~F$c<-GbAyX0@+4DIu!^_fx40yEVnQBW{PA20MR58DgXcg From fa9f72b34d22eeeefc2f7cd13c659ce159e5bc88 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:11 -0500 Subject: [PATCH 135/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 83f73eed..109baaba 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -39,6 +39,8 @@ public partial class MainWindow : Window, IMainWindow // Add a default constructor for XAML public MainWindow() { + // Load XAML UI components + InitializeComponent(); // Initialize drag-and-drop for file support this.AllowDrop = true; this.Drop += MainWindow_Drop; From 96e9445301f0a6e03d1f13a869e3e8e0fe7e37dd Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:38 -0500 Subject: [PATCH 136/230] Update apphost.exe --- obj/Debug/net6.0-windows/apphost.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe index 1effeada8531478d2f61a07b5ed283c4c1d4a325..50d3e05a9dc5653b8c398c8878b5df83faf0e0e2 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0<#8PXUG8B7?=7%Ui47!ny$f!GwtGG;IWikbrDl7ZL~D4qml jSpsnqP)90*0Z@G^5E}qRl7X}-kThXP+`inKDUt~Q=K~U} delta 99 zcmZpe!`T2tEsR^3BE0?67>pS#7!nzb7z`Pb8PXUmfutc�V^6!eGW=&X5XLlLVBp kU`PR~F$c<-GbAyX0@+4DIu!^_fx40yEVnQBW{PA20MR58DgXcg From 47257cf94614adf93c848334e049d9a55a1275f4 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:47 -0500 Subject: [PATCH 137/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 3cfbe006..730db2e9 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+45bfca6037fc6fb0b1099a5faf1375d3d14228fe")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1f1468daea5d32451c19ebc9cbfe08e80cc85c4a")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From cdb9cd535760f641d074b9a00def9be43ad940af Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:53 -0500 Subject: [PATCH 138/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index bd3518ce..b1af09dc 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -7a5ed99f946d223f15a241b7304928fe0226861b2f91aa03c1d329f52eb50792 +2e363804dc9abb073e2a29c2bd954a76488d8b344d4d073c448e260c5859c6d3 From 71698cbe60e80b3c3c4707ad54983105b54fc075 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 12:59:57 -0500 Subject: [PATCH 139/230] Update ProcessorEmulator.assets.cache --- .../ProcessorEmulator.assets.cache | Bin 152 -> 152 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index 2a7c798742856d17faed4620771b8f4e320c7d57..662e289d9bf6185c6e1b7d90b9899fbb5d929ec8 100644 GIT binary patch delta 55 zcmV-70LcHC0hj?PP)kQa3;+NCnZ>BAx>Tf#9^ljD*G8_^vD2ic*MO6q)5#x*@fl~2 Nl#wwbkw6HMR79{W8RGx| delta 55 zcmV-70LcHC0hj?PP)kQa3;+NC5zY9+UcsAr!ay Date: Sun, 13 Jul 2025 13:00:02 -0500 Subject: [PATCH 140/230] Update ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig --- .../ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig index c71f476c..fa1769a5 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = ProcessorEmulator -build_property.ProjectDir = C:\Users\juler\Documents\GitHub\Processor-Emulator\ +build_property.ProjectDir = c:\Users\juler\Documents\GitHub\Processor-Emulator\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.CsWinRTUseWindowsUIXamlProjections = false From e8fb4860eaa3a091296b7ac942e4db21189045a8 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:00:08 -0500 Subject: [PATCH 141/230] Update ProcessorEmulator.genruntimeconfig.cache --- .../net6.0-windows/ProcessorEmulator.genruntimeconfig.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache index 5ffd1e7b..321075c9 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache @@ -1 +1 @@ -add8ca7b3b27de1294e26b51872eea25f81dbcbd62e187cd142b4b53a22e052c +fbcb2c37cc2a9bdd4f8b6758b66f7921742cf1e6c6b6ec844b957bdb69f6a150 From 343e6f0b99dc907b3db4f3de23580132e54f48ce Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:00:11 -0500 Subject: [PATCH 142/230] Update ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 0811c58f..5b618ad6 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/45bfca6037fc6fb0b1099a5faf1375d3d14228fe/*"}} \ No newline at end of file +{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/1f1468daea5d32451c19ebc9cbfe08e80cc85c4a/*"}} \ No newline at end of file From c89c40ac48a88ade7f9a9c0c72f39cbe8e7ad138 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:00:14 -0500 Subject: [PATCH 143/230] Update ProcessorEmulator_MarkupCompile.cache --- .../net6.0-windows/ProcessorEmulator_MarkupCompile.cache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache index 789cd5e7..5433e700 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -4,12 +4,12 @@ winexe C# .cs -C:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ +c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ ProcessorEmulator none false TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER -C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml +c:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml 2-826070488 39-1121013689 From 131f4cde1cedb92467e6b3b5a222c76034a86f60 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:00:17 -0500 Subject: [PATCH 144/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index e39bb231..d3db4ad6 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -1,17 +1,17 @@ { "format": 1, "restore": { - "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} + "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} }, "projects": { - "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { + "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectUniqueName": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "projectName": "ProcessorEmulator", - "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "packagesPath": "C:\\Users\\juler\\.nuget\\packages\\", - "outputPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", + "outputPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\juler\\AppData\\Roaming\\NuGet\\NuGet.Config" From fd7fe23f0cd7a882b1237e54ba4950036a5bf10e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:00:21 -0500 Subject: [PATCH 145/230] Update project.nuget.cache --- obj/project.nuget.cache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index f8e6d6c0..8d2e3e4c 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,8 +1,8 @@ { "version": 2, - "dgSpecHash": "npaWG5nq9uo=", + "dgSpecHash": "vsvp1FVxoxg=", "success": true, - "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectFilePath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\6.0.36\\microsoft.windowsdesktop.app.ref.6.0.36.nupkg.sha512", From 8d73a4d0f67edb1a117987ca278b58ce6176e7b9 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:33 -0500 Subject: [PATCH 146/230] Update ProcessorEmulator.exe --- .../net6.0-windows/ProcessorEmulator.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe index 50d3e05a9dc5653b8c398c8878b5df83faf0e0e2..97c22cd4b4ef70c8d5c3dc1d4a135ca3163dff31 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0?67*ZI_8PXV18H^Z=fwTcbGFT*$!2$@47?Kza!7}DR6{ZX( iKz<^Sv;?vZfY6x149GVHilzb888D=7U+&Em$pirAZxR&% delta 99 zcmZpe!`T2tEsR^3BE0<#8PXUG8B7?=7%Ui47!ny$f!GwtGG;IWikbrDl7ZL~D4qml jSpsnqP)90*0Z@G^5E}qRl7X}-kThXP+`inKDUt~Q=K~U} From 43320e6103152a6988940a72d5020bab9e50e72a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:37 -0500 Subject: [PATCH 147/230] Update HomebrewEmulator.cs --- Emulation/HomebrewEmulator.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Emulation/HomebrewEmulator.cs b/Emulation/HomebrewEmulator.cs index 5e0925c2..7ead694e 100644 --- a/Emulation/HomebrewEmulator.cs +++ b/Emulation/HomebrewEmulator.cs @@ -61,7 +61,9 @@ public void Run() return; } // Add other ISA dispatch as needed - throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {architecture}"); + // Unknown or unsupported architecture: skip homebrew emulation + Debug.WriteLine($"Homebrew emulator skipping unsupported architecture: {architecture}"); + return; } public void Step() From 5a2704910ffe0c4f83c06a8de00a46b53e244a54 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:41 -0500 Subject: [PATCH 148/230] Update MainWindow.xaml --- MainWindow.xaml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/MainWindow.xaml b/MainWindow.xaml index 4349d660..33a29949 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -8,7 +8,13 @@ - + + + From 4c6edc923130431b9432c1bf2901d6ef4e1ea844 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:47 -0500 Subject: [PATCH 149/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 109baaba..b2865ea4 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -555,6 +555,19 @@ private void ShowTextWindow(string title, List lines) win.Show(); } + // Menu event handlers to toggle Unicorn engine usage + private void UseUnicorn_Checked(object sender, RoutedEventArgs e) + { + BinaryTranslator.UseUnicornEngine = true; + StatusBarText("Unicorn engine enabled"); + } + + private void UseUnicorn_Unchecked(object sender, RoutedEventArgs e) + { + BinaryTranslator.UseUnicornEngine = false; + StatusBarText("Unicorn engine disabled"); + } + private static bool IsWinCEBinary(byte[] binary) { // Check PE header and subsystem for WinCE From 78ee59ed55c656eba133d2b14e961dd580bf88a7 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:49 -0500 Subject: [PATCH 150/230] Update apphost.exe --- obj/Debug/net6.0-windows/apphost.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe index 50d3e05a9dc5653b8c398c8878b5df83faf0e0e2..97c22cd4b4ef70c8d5c3dc1d4a135ca3163dff31 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0?67*ZI_8PXV18H^Z=fwTcbGFT*$!2$@47?Kza!7}DR6{ZX( iKz<^Sv;?vZfY6x149GVHilzb888D=7U+&Em$pirAZxR&% delta 99 zcmZpe!`T2tEsR^3BE0<#8PXUG8B7?=7%Ui47!ny$f!GwtGG;IWikbrDl7ZL~D4qml jSpsnqP)90*0Z@G^5E}qRl7X}-kThXP+`inKDUt~Q=K~U} From f95ac2a883b89a2ee804a933b7eb8eb57e672caf Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:54 -0500 Subject: [PATCH 151/230] Update MainWindow.baml --- obj/Debug/net6.0-windows/MainWindow.baml | Bin 1445 -> 1685 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/MainWindow.baml b/obj/Debug/net6.0-windows/MainWindow.baml index d598c8d7b45ba11daec2750bcd5b9ba4d398efbb..7e43a5a13b5fc802b8384f5ae9f179f5388dfb1e 100644 GIT binary patch delta 436 zcmX|6%}T>S5Z)wPDvhn$`qLlVE*dBzDI#p~C=@~ODLsj#ajn5Lso4a))prOUdRM%9 z?NbO|eF&c*uCt+b;hUMA`DVVEH~ppf@vY6e=Yp;ygvtPI@{3Fr0t(2UQC*1gfHN}i zT_*^Aa^a6%pUu;(rvaRHNkJ`v@>URdmOC}B6*RPh@z`U;_04G*IE?dEJCEWKVc86F z7lee*>X_iUK~*&;}0vSk&)w)z$C-!tdI z9(l|ts0dqO%)SIIEoqo;uA(i7HURQUD$kXq14Cbk+|4EPrt`G72N{fM1)L7hUQAJTF)Oq*b(G^Q=E`7COK)d1=rtiNJs delta 194 zcmbQryOevwZDs=&=G=b_raTM`417SW!oBl9YrIElPQlE-X5v5r78X-pAjJ*D%uD_< znDR~j%_7UlKUtDh-a-H-!StWOR1nDF0%ASw|E5Af8e|&t^1lo!9OwTt85tD*HIszO z3QsOzP2~~+@<8fznI_+7Rb~{K%*^J@C_34lOn0LU>3+2 IW*}w)00#IV*8l(j From 70adc534f406cedfe6313e215abb98f2f78b7d6a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:50:59 -0500 Subject: [PATCH 152/230] Update MainWindow.g.cs --- obj/Debug/net6.0-windows/MainWindow.g.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/MainWindow.g.cs b/obj/Debug/net6.0-windows/MainWindow.g.cs index 4e8d7d8d..fecc14e8 100644 --- a/obj/Debug/net6.0-windows/MainWindow.g.cs +++ b/obj/Debug/net6.0-windows/MainWindow.g.cs @@ -1,4 +1,4 @@ -#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "8E7865B1E83B78CF7F091E13C196A7B020A4D492" +#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "42C09AE418AD248FDF232113BDE4851578BE9FBE" //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -79,7 +79,21 @@ void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object return; case 2: - #line 20 "..\..\..\MainWindow.xaml" + #line 15 "..\..\..\MainWindow.xaml" + ((System.Windows.Controls.MenuItem)(target)).Checked += new System.Windows.RoutedEventHandler(this.UseUnicorn_Checked); + + #line default + #line hidden + + #line 16 "..\..\..\MainWindow.xaml" + ((System.Windows.Controls.MenuItem)(target)).Unchecked += new System.Windows.RoutedEventHandler(this.UseUnicorn_Unchecked); + + #line default + #line hidden + return; + case 3: + + #line 26 "..\..\..\MainWindow.xaml" ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.StartEmulation_Click); #line default From 7c483a5e149ce71c61f4bf6c8278303a7e557eae Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:51:02 -0500 Subject: [PATCH 153/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 730db2e9..5c8fb28d 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+1f1468daea5d32451c19ebc9cbfe08e80cc85c4a")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+fd7fe23f0cd7a882b1237e54ba4950036a5bf10e")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 28591de161d9607818e877397882f49d9268eb40 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:51:05 -0500 Subject: [PATCH 154/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index b1af09dc..086a883e 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -2e363804dc9abb073e2a29c2bd954a76488d8b344d4d073c448e260c5859c6d3 +99ad60bcbef111f694b4ca2842c76550eba772117b419787345c75b9f62d419a From 06cc26531cade2ddd8e1a86f29e8d5e01235d48f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:51:09 -0500 Subject: [PATCH 155/230] Update ProcessorEmulator.g.resources --- .../ProcessorEmulator.g.resources | Bin 3660 -> 3900 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources b/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources index 834b6d29fbf3cbc33a22c2cf2862dae27f44f7ae..c722305c2c58cbff72f88f43e6e887a0928fa121 100644 GIT binary patch delta 432 zcmX|7%SyvQ6rDV1YnxQ9RcoIE2D{L7H|_+nxNx81%0(K-HrQrLCINT-1cjjBT0cN= zA&P&X3vuViwBwynI&dy$&fIe!^IiXJzC7jB`%H4H@4bHI-n41wSP%mtR03$@IkHtC z1dtx9@-9j}PH`{rJr)M|G#K~+eVnD98sxN!3Tg_Jbr>5t{=~Xa(7D3~gAv7kU{6Bk zQO=ik9>sl3(;E1Sg_uv>F}2;$8~PFTqBx|O-cT=&d=}V!m(xoeg>Jw{u2i6{2`$sM zB^AN6g)`nAQt#UBkEoSbk?w>s{S~CRNYlyMlC1+<1;{OlTvsL~cSiYO14u!>JkJm* z1IYs{<4wz0M3 l!Q54<$%olhYRTMex9cFwQFPLPC@blt2{D_p7DNr8{sWA0W7Gfu delta 184 zcmdlZcSdHzVh*OItdsj$)Ha{y*v`z(!kqh$!IWomC9kv&F9QPuHxM%~`O9F+2V`&o zu?o-4|7=eAB_;W}w*SpUfFgPh|4sQPAK;aj5&-hR8kqhwm HK+FUHVs;`g From 094374b3afd8fab24386a8c028a3eb8ee8e1d153 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:51:12 -0500 Subject: [PATCH 156/230] Update ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 5b618ad6..1e7e6487 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/1f1468daea5d32451c19ebc9cbfe08e80cc85c4a/*"}} \ No newline at end of file +{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/fd7fe23f0cd7a882b1237e54ba4950036a5bf10e/*"}} \ No newline at end of file From 81e826d79c1526c9522bc1dab2f8ce0157486991 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:51:18 -0500 Subject: [PATCH 157/230] Update BinaryTranslator.cs --- Tools/BinaryTranslator.cs | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/Tools/BinaryTranslator.cs b/Tools/BinaryTranslator.cs index dc164954..20acb2e7 100644 --- a/Tools/BinaryTranslator.cs +++ b/Tools/BinaryTranslator.cs @@ -52,11 +52,30 @@ public static class BinaryTranslator /// Target architecture (e.g. "x64", "MIPS"). /// Original binary data. /// Translated binary data for the target ISA. + /// + /// Flag to enable in-process Unicorn stub emulation instead of RetDec. + /// + public static bool UseUnicornEngine { get; set; } = false; public static byte[] Translate(string fromArch, string toArch, byte[] input) { // If no translation needed if (string.Equals(fromArch, toArch, StringComparison.OrdinalIgnoreCase)) return input; + // Use in-process Unicorn stub engine if toggled + if (UseUnicornEngine) + return TranslateWithUnicornEngine(fromArch, toArch, input); + // Otherwise use external RetDec tool for full cross-ISA translation + return TranslateWithRetDec(fromArch, toArch, input); + } + + /// + /// In-process translation stub using Unicorn to execute and capture bytes. Only supports same-architecture emulation. + /// + private static byte[] TranslateWithUnicornEngine(string fromArch, string toArch, byte[] input) + { + // Only emulate if architectures match; otherwise fallback to RetDec + if (!string.Equals(fromArch, toArch, StringComparison.OrdinalIgnoreCase)) + return TranslateWithRetDec(fromArch, toArch, input); // Determine Unicorn arch/mode StubUnicorn.UnicornEngine uc; switch (fromArch.ToLowerInvariant()) @@ -95,18 +114,14 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) uc = new StubUnicorn.UnicornEngine(StubUnicorn.UnicornArch.RISCV, StubUnicorn.UnicornMode.RiscV32); break; default: - // RetDec fallback for unsupported ISA - return TranslateWithRetDec(fromArch, toArch, input); + return input; } const ulong BASE = 0x100000; ulong size = (ulong)input.Length; - // Map memory and write code uc.Memory.Map(BASE, size); uc.Memory.Write(BASE, input); - // Initialize PC uc.Registers.PC = BASE; var output = new List(); - // Hook instructions to capture translated bytes uc.Hooks.Add(StubUnicorn.HookType.Code, (engine, address, length, user) => { var bytes = engine.Memory.Read(address, length); @@ -114,19 +129,16 @@ public static byte[] Translate(string fromArch, string toArch, byte[] input) }); try { - // Run through the region once uc.Start(BASE, BASE + size); } - catch (Exception ex) + catch { - MessageBox.Show($"Emulation error: {ex.Message}", "Translate Error", MessageBoxButton.OK, MessageBoxImage.Error); - // Fallback to RetDec CLI - return TranslateWithRetDec(fromArch, toArch, input); + uc.Dispose(); + return input; } uc.Dispose(); return output.ToArray(); } - /// /// Fallback translation using RetDec CLI. /// From 6e2dc82ec16ebc581129fca12cbb99b4441b68cb Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 13:53:05 -0500 Subject: [PATCH 158/230] Update HomebrewEmulator.cs --- Emulation/HomebrewEmulator.cs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Emulation/HomebrewEmulator.cs b/Emulation/HomebrewEmulator.cs index 7ead694e..4458d72a 100644 --- a/Emulation/HomebrewEmulator.cs +++ b/Emulation/HomebrewEmulator.cs @@ -1,4 +1,5 @@ using System; +using System.Windows; namespace ProcessorEmulator.Emulation { @@ -61,9 +62,12 @@ public void Run() return; } // Add other ISA dispatch as needed - // Unknown or unsupported architecture: skip homebrew emulation - Debug.WriteLine($"Homebrew emulator skipping unsupported architecture: {architecture}"); - return; + // Unknown or unsupported architecture: warn and fallback to QEMU + MessageBox.Show( + $"Homebrew emulator not implemented for architecture: {architecture}.\nFalling back to QEMU emulation.", + "Homebrew Emulator", MessageBoxButton.OK, MessageBoxImage.Warning); + // Throw to signal MainWindow to catch and launch QEMU + throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {architecture}"); } public void Step() From e2a9aa1b0fbcb5b01908683722648fd494ea9fc9 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 14:31:16 -0500 Subject: [PATCH 159/230] Update HomebrewEmulator.cs --- Emulation/HomebrewEmulator.cs | 110 +++++++++++++++++++++++++++++++++- 1 file changed, 108 insertions(+), 2 deletions(-) diff --git a/Emulation/HomebrewEmulator.cs b/Emulation/HomebrewEmulator.cs index 4458d72a..c9275a5d 100644 --- a/Emulation/HomebrewEmulator.cs +++ b/Emulation/HomebrewEmulator.cs @@ -61,12 +61,118 @@ public void Run() armEmu.Run(); return; } - // Add other ISA dispatch as needed + // Additional ISA dispatch + else if (architecture.StartsWith("X86", StringComparison.OrdinalIgnoreCase) || + architecture.StartsWith("I386", StringComparison.OrdinalIgnoreCase)) + { + var x86Emu = new X86CpuEmulator(); + x86Emu.LoadProgram(memory, 0); + x86Emu.Run(); + return; + } + else if (architecture.StartsWith("SPARC64", StringComparison.OrdinalIgnoreCase)) + { + var sparc64 = new Sparc64Emulator(); + sparc64.LoadBinary(memory); + sparc64.Run(); + return; + } + else if (architecture.StartsWith("SPARC", StringComparison.OrdinalIgnoreCase)) + { + var sparc = new SparcEmulator(); + sparc.LoadBinary(memory); + sparc.Run(); + return; + } + else if (architecture.StartsWith("ALPHA", StringComparison.OrdinalIgnoreCase)) + { + var alpha = new AlphaEmulator(); + alpha.LoadBinary(memory); + alpha.Run(); + return; + } + else if (architecture.StartsWith("SUPERH", StringComparison.OrdinalIgnoreCase) || + architecture.StartsWith("SH", StringComparison.OrdinalIgnoreCase)) + { + var sh = new SuperHEmulator(); + sh.LoadBinary(memory); + sh.Run(); + return; + } + else if (architecture.StartsWith("RISCV32", StringComparison.OrdinalIgnoreCase)) + { + var rv32 = new RiscV32Emulator(); + rv32.LoadBinary(memory); + rv32.Run(); + return; + } + else if (architecture.StartsWith("RISCV64", StringComparison.OrdinalIgnoreCase)) + { + var rv64 = new RiscV64Emulator(); + rv64.LoadBinary(memory); + rv64.Run(); + return; + } + else if (architecture.StartsWith("S390X", StringComparison.OrdinalIgnoreCase)) + { + var s390 = new S390XEmulator(); + s390.LoadBinary(memory); + s390.Run(); + return; + } + else if (architecture.StartsWith("HPPA", StringComparison.OrdinalIgnoreCase)) + { + var hppa = new HppaEmulator(); + hppa.LoadBinary(memory); + hppa.Run(); + return; + } + else if (architecture.StartsWith("MICROBLAZE", StringComparison.OrdinalIgnoreCase)) + { + var mb = new MicroBlazeEmulator(); + mb.LoadBinary(memory); + mb.Run(); + return; + } + else if (architecture.StartsWith("CRIS", StringComparison.OrdinalIgnoreCase)) + { + var cris = new CrisEmulator(); + cris.LoadBinary(memory); + cris.Run(); + return; + } + else if (architecture.StartsWith("LM32", StringComparison.OrdinalIgnoreCase)) + { + var lm = new Lm32Emulator(); + lm.LoadBinary(memory); + lm.Run(); + return; + } + else if (architecture.StartsWith("M68K", StringComparison.OrdinalIgnoreCase)) + { + var m68k = new M68KEmulator(); + m68k.LoadBinary(memory); + m68k.Run(); + return; + } + else if (architecture.StartsWith("XTENSA", StringComparison.OrdinalIgnoreCase)) + { + var xt = new XtensaEmulator(); + xt.LoadBinary(memory); + xt.Run(); + return; + } + else if (architecture.StartsWith("OPENRISC", StringComparison.OrdinalIgnoreCase)) + { + var or = new OpenRiscEmulator(); + or.LoadBinary(memory); + or.Run(); + return; + } // Unknown or unsupported architecture: warn and fallback to QEMU MessageBox.Show( $"Homebrew emulator not implemented for architecture: {architecture}.\nFalling back to QEMU emulation.", "Homebrew Emulator", MessageBoxButton.OK, MessageBoxImage.Warning); - // Throw to signal MainWindow to catch and launch QEMU throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {architecture}"); } From c74580e576a3dd72dd26df6108f25ee6eff7630a Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:02:15 -0500 Subject: [PATCH 160/230] Update build outputs for ProcessorEmulator Regenerated build artifacts including AssemblyInfo, SourceLink, and apphost.exe. These changes reflect a new build with updated version and source mapping information. --- .../ProcessorEmulator.AssemblyInfo.cs | 2 +- ...ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- .../ProcessorEmulator.sourcelink.json | 2 +- obj/Debug/net6.0-windows/apphost.exe | Bin 151040 -> 151040 bytes 4 files changed, 3 insertions(+), 3 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 5c8fb28d..c37cb69b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+fd7fe23f0cd7a882b1237e54ba4950036a5bf10e")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e2a9aa1b0fbcb5b01908683722648fd494ea9fc9")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 086a883e..7a6cdcc7 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -99ad60bcbef111f694b4ca2842c76550eba772117b419787345c75b9f62d419a +13700d0da79513422cfce7c6b8218aa039db5206217bb7076366ef002f90d972 diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 1e7e6487..722ba4dc 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/fd7fe23f0cd7a882b1237e54ba4950036a5bf10e/*"}} \ No newline at end of file +{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/e2a9aa1b0fbcb5b01908683722648fd494ea9fc9/*"}} \ No newline at end of file diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe index 97c22cd4b4ef70c8d5c3dc1d4a135ca3163dff31..5310715e17649c4d8fe22ec664869ab6b85c4b41 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0=m8H^Yb87zS~k-?B5iNSy&4M-*fu_>5m2$VBmuwXC)Vq*q# gplTx^+XToC5l0OCLrBme*a delta 99 zcmZpe!`T2tEsR^3BE0?67*ZI_8PXV18H^Z=fwTcbGFT*$!2$@47?Kza!7}DR6{ZX( iKz<^Sv;?vZfY6x149GVHilzb888D=7U+&Em$pirAZxR&% From 0db78deda48bfe78a2dad630654268cb039a1603 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Sun, 13 Jul 2025 23:41:32 -0500 Subject: [PATCH 161/230] Auto-detect architecture in HomebrewEmulator and RDK-V Refactored HomebrewEmulator to auto-detect the architecture from the loaded binary instead of requiring it as a constructor argument. Updated RDK-V emulator launch to detect architecture, with a special override for Broadcom BCM7346 (X1) binaries to ARM. Added BCM7445 chip reference. Added a pre-build step to kill running ProcessorEmulator.exe to avoid file lock issues. --- Emulation/HomebrewEmulator.cs | 58 ++++++++++-------- MainWindow.xaml.cs | 13 ++++ ProcessorEmulator.csproj | 4 ++ Tools/ChipReferenceManager.cs | 1 + .../ProcessorEmulator.AssemblyInfo.cs | 2 +- ...ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- ....GeneratedMSBuildEditorConfig.editorconfig | 2 +- .../ProcessorEmulator.assets.cache | Bin 152 -> 152 bytes 8 files changed, 53 insertions(+), 29 deletions(-) diff --git a/Emulation/HomebrewEmulator.cs b/Emulation/HomebrewEmulator.cs index c9275a5d..4cf49342 100644 --- a/Emulation/HomebrewEmulator.cs +++ b/Emulation/HomebrewEmulator.cs @@ -1,5 +1,6 @@ using System; using System.Windows; +using ProcessorEmulator.Tools; namespace ProcessorEmulator.Emulation { @@ -9,20 +10,22 @@ namespace ProcessorEmulator.Emulation ///
public class HomebrewEmulator : IEmulator { - private readonly string architecture; + // Architecture is auto-detected from original binary + private byte[] originalBinary; private byte[] memory; private uint[] regs = new uint[32]; private uint pc; private Tools.DeviceTreeManager.Node deviceTree; - public HomebrewEmulator(string architecture) + public HomebrewEmulator() { - this.architecture = architecture; + // No-op: architecture will be detected at runtime } public void LoadBinary(byte[] binary) { - // Load firmware into memory (256MB) + // Store original binary and load firmware into memory (256MB) + originalBinary = binary; memory = new byte[256 * 1024 * 1024]; Array.Copy(binary, 0, memory, 0, binary.Length); // Detect Flattened Device Tree (FDT) blob in memory (magic 0xd00dfeed) @@ -44,8 +47,11 @@ public void LoadBinary(byte[] binary) public void Run() { - // Dispatch by architecture - if (architecture.StartsWith("MIPS", StringComparison.OrdinalIgnoreCase)) + // Auto-detect architecture from original binary + var detectedArch = ArchitectureDetector.Detect(originalBinary); + Debug.WriteLine($"HomebrewEmulator: auto-detected architecture: {detectedArch}"); + // Dispatch by detected architecture + if (detectedArch.StartsWith("MIPS", StringComparison.OrdinalIgnoreCase)) { // MIPS32 fetch-decode-execute const int maxSteps = 1000000; @@ -53,7 +59,7 @@ public void Run() Step(); return; } - else if (architecture.StartsWith("ARM", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("ARM", StringComparison.OrdinalIgnoreCase)) { // Delegate to ARM emulator stub var armEmu = new ArmEmulator(); @@ -62,107 +68,107 @@ public void Run() return; } // Additional ISA dispatch - else if (architecture.StartsWith("X86", StringComparison.OrdinalIgnoreCase) || - architecture.StartsWith("I386", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("X86", StringComparison.OrdinalIgnoreCase) || + detectedArch.StartsWith("I386", StringComparison.OrdinalIgnoreCase)) { var x86Emu = new X86CpuEmulator(); x86Emu.LoadProgram(memory, 0); x86Emu.Run(); return; } - else if (architecture.StartsWith("SPARC64", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("SPARC64", StringComparison.OrdinalIgnoreCase)) { var sparc64 = new Sparc64Emulator(); sparc64.LoadBinary(memory); sparc64.Run(); return; } - else if (architecture.StartsWith("SPARC", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("SPARC", StringComparison.OrdinalIgnoreCase)) { var sparc = new SparcEmulator(); sparc.LoadBinary(memory); sparc.Run(); return; } - else if (architecture.StartsWith("ALPHA", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("ALPHA", StringComparison.OrdinalIgnoreCase)) { var alpha = new AlphaEmulator(); alpha.LoadBinary(memory); alpha.Run(); return; } - else if (architecture.StartsWith("SUPERH", StringComparison.OrdinalIgnoreCase) || - architecture.StartsWith("SH", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("SUPERH", StringComparison.OrdinalIgnoreCase) || + detectedArch.StartsWith("SH", StringComparison.OrdinalIgnoreCase)) { var sh = new SuperHEmulator(); sh.LoadBinary(memory); sh.Run(); return; } - else if (architecture.StartsWith("RISCV32", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("RISCV32", StringComparison.OrdinalIgnoreCase)) { var rv32 = new RiscV32Emulator(); rv32.LoadBinary(memory); rv32.Run(); return; } - else if (architecture.StartsWith("RISCV64", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("RISCV64", StringComparison.OrdinalIgnoreCase)) { var rv64 = new RiscV64Emulator(); rv64.LoadBinary(memory); rv64.Run(); return; } - else if (architecture.StartsWith("S390X", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("S390X", StringComparison.OrdinalIgnoreCase)) { var s390 = new S390XEmulator(); s390.LoadBinary(memory); s390.Run(); return; } - else if (architecture.StartsWith("HPPA", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("HPPA", StringComparison.OrdinalIgnoreCase)) { var hppa = new HppaEmulator(); hppa.LoadBinary(memory); hppa.Run(); return; } - else if (architecture.StartsWith("MICROBLAZE", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("MICROBLAZE", StringComparison.OrdinalIgnoreCase)) { var mb = new MicroBlazeEmulator(); mb.LoadBinary(memory); mb.Run(); return; } - else if (architecture.StartsWith("CRIS", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("CRIS", StringComparison.OrdinalIgnoreCase)) { var cris = new CrisEmulator(); cris.LoadBinary(memory); cris.Run(); return; } - else if (architecture.StartsWith("LM32", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("LM32", StringComparison.OrdinalIgnoreCase)) { var lm = new Lm32Emulator(); lm.LoadBinary(memory); lm.Run(); return; } - else if (architecture.StartsWith("M68K", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("M68K", StringComparison.OrdinalIgnoreCase)) { var m68k = new M68KEmulator(); m68k.LoadBinary(memory); m68k.Run(); return; } - else if (architecture.StartsWith("XTENSA", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("XTENSA", StringComparison.OrdinalIgnoreCase)) { var xt = new XtensaEmulator(); xt.LoadBinary(memory); xt.Run(); return; } - else if (architecture.StartsWith("OPENRISC", StringComparison.OrdinalIgnoreCase)) + else if (detectedArch.StartsWith("OPENRISC", StringComparison.OrdinalIgnoreCase)) { var or = new OpenRiscEmulator(); or.LoadBinary(memory); @@ -171,9 +177,9 @@ public void Run() } // Unknown or unsupported architecture: warn and fallback to QEMU MessageBox.Show( - $"Homebrew emulator not implemented for architecture: {architecture}.\nFalling back to QEMU emulation.", + $"Homebrew emulator not implemented for architecture: {detectedArch}.\nFalling back to QEMU emulation.", "Homebrew Emulator", MessageBoxButton.OK, MessageBoxImage.Warning); - throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {architecture}"); + throw new NotImplementedException($"Homebrew emulator not implemented for architecture: {detectedArch}"); } public void Step() diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index b2865ea4..29fa7344 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -454,7 +454,20 @@ private async Task HandleRdkVEmulation() string path = dlg.FileName; StatusBarText($"Launching RDK-V emulator for {Path.GetFileName(path)}..."); var bin = File.ReadAllBytes(path); + // Auto-detect the binary's architecture var arch = ArchitectureDetector.Detect(bin); + Debug.WriteLine($"RDK-V auto-detected architecture: '{arch}'"); + // Override Broadcom MIPS marker for X1 boxes to ARM + if (arch.StartsWith("MIPS32-BCM7346", StringComparison.OrdinalIgnoreCase)) + { + Debug.WriteLine("Overriding BCM7346 MIPS detection to ARM for X1 hardware."); + arch = "ARM"; + StatusBarText("Overrode architecture to ARM for X1 hardware"); + } + else + { + StatusBarText($"Detected architecture: {arch}"); + } try { EmulatorLauncher.Launch(path, arch, platform: "RDK-V"); StatusBarText("RDK-V emulation started."); } catch (Exception ex) { MessageBox.Show($"RDK-V error: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); StatusBarText("RDK-V emulation failed."); } await Task.CompletedTask; diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index ba77ccdd..d89d2564 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -7,6 +7,10 @@ ProcessorEmulator ProcessorEmulator + + + + diff --git a/Tools/ChipReferenceManager.cs b/Tools/ChipReferenceManager.cs index 0f6806d0..b534118d 100644 --- a/Tools/ChipReferenceManager.cs +++ b/Tools/ChipReferenceManager.cs @@ -17,6 +17,7 @@ public static class ChipReferenceManager { "PE", "Generic PE format (Windows/WinCE)" }, // Humax HR44/HR54 Receiver SoCs and components { "BCM7346DRKFEBB35G", "Broadcom BCM7346 SoC: main processor for Humax DIRECTV DVR" }, + { "BCM7445", "Broadcom BCM7445 (Brahma15) quad-core ARM Cortex-A15 SoC used in X1 set-top boxes" }, { "BCM4506K0IE33G", "Broadcom BCM4506: satellite tuner and demodulator" }, { "88W8801-NJR2", "Marvell 88W8801: Wi-Fi SoC for wireless connectivity" }, { "MX65L1G80GAC1-10G", "Macronix MX65L1G80GAC1: 1Gb SPI NOR flash memory" }, diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index c37cb69b..f3a5f0d6 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e2a9aa1b0fbcb5b01908683722648fd494ea9fc9")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c74580e576a3dd72dd26df6108f25ee6eff7630a")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 7a6cdcc7..a773e23a 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -13700d0da79513422cfce7c6b8218aa039db5206217bb7076366ef002f90d972 +392105ab994e12f06104fddf5776585cfc8373ae24b0d4ae40447a0fa7697c51 diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig index fa1769a5..c71f476c 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.GeneratedMSBuildEditorConfig.editorconfig @@ -8,7 +8,7 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = ProcessorEmulator -build_property.ProjectDir = c:\Users\juler\Documents\GitHub\Processor-Emulator\ +build_property.ProjectDir = C:\Users\juler\Documents\GitHub\Processor-Emulator\ build_property.EnableComHosting = build_property.EnableGeneratedComInterfaceComImportInterop = build_property.CsWinRTUseWindowsUIXamlProjections = false diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.assets.cache index 662e289d9bf6185c6e1b7d90b9899fbb5d929ec8..2a7c798742856d17faed4620771b8f4e320c7d57 100644 GIT binary patch delta 55 zcmV-70LcHC0hj?PP)kQa3;+NC5zY9+UcsAr!ayBAx>Tf#9^ljD*G8_^vD2ic*MO6q)5#x*@fl~2 Nl#wwbkw6HMR79{W8RGx| From f0430c580455155cd580de30afd1b1c460624689 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:04 -0500 Subject: [PATCH 162/230] Delete ProcessorEmulator.exe --- bin/Debug/net6.0-windows/ProcessorEmulator.exe | Bin 151040 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 bin/Debug/net6.0-windows/ProcessorEmulator.exe diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe deleted file mode 100644 index 97c22cd4b4ef70c8d5c3dc1d4a135ca3163dff31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 151040 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 From a52e96aa8f8ff6b59a6057d0e5f673c9ef3f19c3 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:10 -0500 Subject: [PATCH 163/230] Update HomebrewEmulator.cs --- Emulation/HomebrewEmulator.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Emulation/HomebrewEmulator.cs b/Emulation/HomebrewEmulator.cs index 4cf49342..36efdf69 100644 --- a/Emulation/HomebrewEmulator.cs +++ b/Emulation/HomebrewEmulator.cs @@ -1,5 +1,6 @@ using System; using System.Windows; +using System.Diagnostics; using ProcessorEmulator.Tools; namespace ProcessorEmulator.Emulation From 1e87e6d9b4b06a04bd1eb078848901fbf3ea0c09 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:12 -0500 Subject: [PATCH 164/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 29fa7344..362fbd9f 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -189,7 +189,7 @@ private async Task HandleGenericEmulation() try { // First attempt homebrew emulation - var home = new HomebrewEmulator(arch); + var home = new HomebrewEmulator(); home.LoadBinary(binary); home.Run(); StatusBarText("Homebrew emulation complete."); @@ -399,7 +399,7 @@ private async Task HandleExecutableAnalysis() { try { - var home = new HomebrewEmulator(arch); + var home = new HomebrewEmulator(); home.LoadBinary(data); home.Run(); StatusBarText("Homebrew emulation complete."); From 879d678a42fb906cae6e6698dbe4c7fa605aa80c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:29 -0500 Subject: [PATCH 165/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index f3a5f0d6..bdc4eb45 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+c74580e576a3dd72dd26df6108f25ee6eff7630a")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0db78deda48bfe78a2dad630654268cb039a1603")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 3a8a4f48b630b4ca8255ebc4610595b820d6d2c0 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:34 -0500 Subject: [PATCH 166/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index a773e23a..7b7e976b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -392105ab994e12f06104fddf5776585cfc8373ae24b0d4ae40447a0fa7697c51 +17d4583fe036f3ffc174e05c4fd216159c28a31037d0464d11dd41eb2db5cf49 From e9b08728146f2fbcd497a58abd83cc1fc92f77ef Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:42 -0500 Subject: [PATCH 167/230] Update ProcessorEmulator.csproj.FileListAbsolute.txt --- .../net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt index e32eab8a..65c6cedb 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt @@ -1,4 +1,3 @@ -c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.exe c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.deps.json c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.runtimeconfig.json c:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.dll From 8d745d1a31ef16371f1b8aed7d260af1bb711f08 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:46 -0500 Subject: [PATCH 168/230] Update ProcessorEmulator.genruntimeconfig.cache --- .../net6.0-windows/ProcessorEmulator.genruntimeconfig.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache index 321075c9..5ffd1e7b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.genruntimeconfig.cache @@ -1 +1 @@ -fbcb2c37cc2a9bdd4f8b6758b66f7921742cf1e6c6b6ec844b957bdb69f6a150 +add8ca7b3b27de1294e26b51872eea25f81dbcbd62e187cd142b4b53a22e052c From b9fb2d54e6e870c305e126a42afe8a13edbe261c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:50 -0500 Subject: [PATCH 169/230] Update ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 722ba4dc..5bfaa7da 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/e2a9aa1b0fbcb5b01908683722648fd494ea9fc9/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/0db78deda48bfe78a2dad630654268cb039a1603/*"}} \ No newline at end of file From 62d6fc627f8bb65cee057dc35f8b8f13395e54a7 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:38:57 -0500 Subject: [PATCH 170/230] Update ProcessorEmulator_MarkupCompile.cache --- .../net6.0-windows/ProcessorEmulator_MarkupCompile.cache | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache index 5433e700..789cd5e7 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -4,12 +4,12 @@ winexe C# .cs -c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ +C:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ ProcessorEmulator none false TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER -c:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml +C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml 2-826070488 39-1121013689 From 4539c760d65cfcd36a3611d206fc47468d283937 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:39:03 -0500 Subject: [PATCH 171/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index d3db4ad6..ae99319d 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -1,17 +1,17 @@ { "format": 1, "restore": { - "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} + "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": {} }, "projects": { - "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { + "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectUniqueName": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "projectName": "ProcessorEmulator", - "projectPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "packagesPath": "C:\\Users\\juler\\.nuget\\packages\\", - "outputPath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", + "outputPath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\obj\\", "projectStyle": "PackageReference", "configFilePaths": [ "C:\\Users\\juler\\AppData\\Roaming\\NuGet\\NuGet.Config" @@ -59,10 +59,6 @@ "name": "Microsoft.AspNetCore.App.Ref", "version": "[6.0.36, 6.0.36]" }, - { - "name": "Microsoft.NETCore.App.Host.win-x64", - "version": "[6.0.36, 6.0.36]" - }, { "name": "Microsoft.NETCore.App.Ref", "version": "[6.0.36, 6.0.36]" From 4f052a523b6aaebd52264649a273991fed61668e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:39:30 -0500 Subject: [PATCH 172/230] Update project.assets.json --- obj/project.assets.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/obj/project.assets.json b/obj/project.assets.json index 1ef106b7..a834b1b1 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -65,10 +65,6 @@ "name": "Microsoft.AspNetCore.App.Ref", "version": "[6.0.36, 6.0.36]" }, - { - "name": "Microsoft.NETCore.App.Host.win-x64", - "version": "[6.0.36, 6.0.36]" - }, { "name": "Microsoft.NETCore.App.Ref", "version": "[6.0.36, 6.0.36]" From d80d089dd1804fc5379ce19e61e728c81781547e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:39:33 -0500 Subject: [PATCH 173/230] Update project.nuget.cache --- obj/project.nuget.cache | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index 8d2e3e4c..146a5048 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,13 +1,12 @@ { "version": 2, - "dgSpecHash": "vsvp1FVxoxg=", + "dgSpecHash": "BbYkv6uxcXI=", "success": true, - "projectFilePath": "c:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", + "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\6.0.36\\microsoft.windowsdesktop.app.ref.6.0.36.nupkg.sha512", - "C:\\Users\\juler\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512", - "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\6.0.36\\microsoft.netcore.app.host.win-x64.6.0.36.nupkg.sha512" + "C:\\Users\\juler\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512" ], "logs": [] } \ No newline at end of file From eaa0e6a21899f18db3bcb4210c62c4aca05efeb0 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 12:39:37 -0500 Subject: [PATCH 174/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index d89d2564..f1884c2e 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -4,12 +4,15 @@ WinExe net6.0-windows true + + false ProcessorEmulator ProcessorEmulator - - - + + + + From 72c7e376a1488664e068ca3d0e3382c526bd5c4d Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:48:06 -0500 Subject: [PATCH 175/230] debug --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index bdc4eb45..c3ea30e9 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+0db78deda48bfe78a2dad630654268cb039a1603")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+eaa0e6a21899f18db3bcb4210c62c4aca05efeb0")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 7b7e976b..2d9ddfeb 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -17d4583fe036f3ffc174e05c4fd216159c28a31037d0464d11dd41eb2db5cf49 +0c544c9b6ca350fce60c5e5a8ffae05d93e36805b424ea070641a60aba3b83bc From 4d9f04b12c855cd22a95aeafa433642dc94b860e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:54:35 -0500 Subject: [PATCH 176/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 362fbd9f..4f912a5f 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -34,6 +34,10 @@ public interface IQemuEmulator : IEmulator public partial class MainWindow : Window, IMainWindow { + // Ensure InitializeComponent exists even if XAML generation missed it + [System.Diagnostics.DebuggerNonUserCode] + private void InitializeComponent() {} + private IEmulator currentEmulator; // Add a default constructor for XAML From 62bbda26bd83dbcd1b9992ea5c5789d0d29fb7aa Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:57:27 -0500 Subject: [PATCH 177/230] Add GitHub Actions workflows and config files Introduces CI, nightly build, release, and CodeQL analysis workflows for automated builds, releases, and security analysis. Adds Dependabot configuration for NuGet dependency updates and a Release Drafter configuration for automated release notes. --- .github/dependabot.yml | 7 ++++ .github/release-drafter.yml | 35 +++++++++++++++++++ .github/workflows/ci.yml | 29 ++++++++++++++++ .github/workflows/codeql-analysis.yml | 26 +++++++++++++++ .github/workflows/nightly-build.yml | 34 +++++++++++++++++++ .github/workflows/release.yml | 48 +++++++++++++++++++++++++++ 6 files changed, 179 insertions(+) create mode 100644 .github/dependabot.yml create mode 100644 .github/release-drafter.yml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/nightly-build.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..105c536a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + - package-ecosystem: "nuget" + directory: "/" + schedule: + interval: "weekly" + open-pull-requests-limit: 5 diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000..17acb0fe --- /dev/null +++ b/.github/release-drafter.yml @@ -0,0 +1,35 @@ +name: Release Drafter + +on: + push: + branches: [dev, main] + +jobs: + update_release_draft: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: release-drafter/release-drafter@v5 + with: + config-name: "release-drafter.yml" + template: | + # 🎉 Release {{ version }} + + Hello everyone! + + We’re excited to share **{{ version }}** with you. Here’s what’s new: + + {{#changes}} + {{> change}} + {{/changes}} + + A heartfelt thank you to all contributors: + {{#contributors}} + - @{{this}} + {{/contributors}} + + Stay tuned for more updates! + change-template: | + {{#if is:added}}✨ **New** {{description}} (thanks @{{author}})!{{/if}} + {{#if is:changed}}🔄 **Updated** {{description}} (thanks @{{author}})!{{/if}} + {{#if is:fixed}}🐞 **Fixed** {{description}} (thanks @{{author}})!{{/if}} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..a3c3e614 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,29 @@ +name: CI + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + build: + name: Build on Windows + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build ProcessorEmulator.csproj --configuration Release --no-restore + + - name: Run tests (if any) + run: echo "Skipping tests: no test projects defined." diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..4f56e7d4 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,26 @@ +name: "CodeQL Analysis" + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + schedule: + - cron: '0 2 * * 1' # weekly on Monday at 2am UTC + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: csharp + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/nightly-build.yml b/.github/workflows/nightly-build.yml new file mode 100644 index 00000000..0538673a --- /dev/null +++ b/.github/workflows/nightly-build.yml @@ -0,0 +1,34 @@ +name: Nightly Build + +on: + schedule: + # every day at 3am UTC + - cron: '0 3 * * *' + +jobs: + build: + name: Daily Windows Build + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build ProcessorEmulator.csproj --configuration Release --no-restore + + - name: Publish artifacts + run: dotnet publish ProcessorEmulator.csproj --configuration Release --output artifacts + + - name: Upload nightly artifact + uses: actions/upload-artifact@v3 + with: + name: nightly-build + path: artifacts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..882b477d --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,48 @@ +name: "Release on Tag" + +on: + push: + # Trigger on git tags, e.g. v1.2.3 + tags: + - 'v*' + +jobs: + build-and-release: + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET 6 SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Build solution + run: | + dotnet restore + dotnet build ProcessorEmulator.csproj --configuration Release + + - name: Publish artifacts + run: | + dotnet publish ProcessorEmulator.csproj --configuration Release --output artifacts + + - name: Create GitHub Release + id: create_release + uses: actions/create-release@v1 + with: + tag_name: ${{ github.ref_name }} + release_name: Release ${{ github.ref_name }} + draft: false + prerelease: false + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Upload Release Asset + uses: actions/upload-release-asset@v1 + with: + upload_url: ${{ steps.create_release.outputs.upload_url }} + asset_path: artifacts/ProcessorEmulator.exe + asset_name: ProcessorEmulator-${{ github.ref_name }}.exe + asset_content_type: application/octet-stream From e629100973839183c5c02a24c6bf720a27b29b35 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 13:57:53 -0500 Subject: [PATCH 178/230] _ --- .github/copilot-instructions.md | 38 +++++++++++++++++++++++++++++++++ .gitignore | 2 +- 2 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..176ede93 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,38 @@ +# GitHub Copilot Instructions + +This document guides AI assistants when contributing to the Processor-Emulator repository. + +## 1. Project Overview +- **Language & Framework**: C# (.NET 6) WPF application with a MainWindow UI and multiple emulator implementations. +- **Core Purpose**: Load and analyze firmware images, emulate CPU architectures, probe filesystems, and extract data. +- **Key Directories**: + - `/` root: main UI code (`App.xaml`, `MainWindow.xaml.cs`, `EmulatorLauncher.cs`) + - `/Emulation`: stub and SPARC emulators + - Files in root implement each chipset emulator and filesystem logic. + +## 2. Coding Conventions +- **Naming**: PascalCase for public types and methods, _camelCase_ for private fields. +- **Async Patterns**: Use `async Task` for I/O or longer-running operations and `await` inside. +- **Helpers & Utilities**: + - Consolidate repeated logic in a single static helper. + - Place utility methods in `Tools.cs` or under a `Utilities` static class. +- **UI Interaction**: Use `Dispatcher.Invoke` or `await` to update UI from background threads. Use shared `ShowTextWindow` helper for log output. + +## 3. AI Integration Guidelines +- **Refactor Duplicates**: When encountering duplicate local functions (e.g., `AnalyzeFileType`, `ShowTextWindow`), merge into one shared definition without hitting request limit, length limit or creating invalid responses or getting stuck in loops. +- **New Emulators**: Implement new `IChipsetEmulator` in its own file. Follow existing patterns: detect types, dispatch via `InstructionTranslator`. +- **File Placement**: Match namespace and folder. Root-level emulators go in `/Emulation` folder or root if project-wide. +- **Error Handling**: Leverage `try/catch` around disk I/O and emulator startup. Surface errors via `ShowTextWindow`. + +## 4. Build & Run Tasks +- Use the existing `tasks.json`: + - **Build**: `dotnet build ProcessorEmulator.csproj` + - **Run**: `dotnet run --project ProcessorEmulator.csproj` +- No unit tests present; ensure manual end-to-end validation of firmware loads. + +## 5. Pull Request Guidelines +- Target `dev` branch. Keep PRs focused and small. +- Include screenshots or logs for UI changes. +- Verify compile and smoke-test emulation scenarios local to Windows/.NET 6. + +> _These instructions help AI assistants contribute consistently and correctly to the Processor-Emulator codebase._ diff --git a/.gitignore b/.gitignore index 6e78d5af..0bf844a3 100644 --- a/.gitignore +++ b/.gitignore @@ -256,4 +256,4 @@ bin/Release/net6.0-windows/share/locale/tr/LC_MESSAGES/qemu.mo bin/Release/net6.0-windows/share/locale/uk/LC_MESSAGES/qemu.mo bin/Release/net6.0-windows/share/locale/zh_CN/LC_MESSAGES/qemu.mo bin/Release/net6.0-windows/share/man/man1/qemu.1 -/.github + From fb8a13e6f42db33179a96c9136f0cd3d2cc631af Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:01:43 -0500 Subject: [PATCH 179/230] Create dotnet-build.yml --- .github/workflows/dotnet-build.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/dotnet-build.yml diff --git a/.github/workflows/dotnet-build.yml b/.github/workflows/dotnet-build.yml new file mode 100644 index 00000000..e636e6b7 --- /dev/null +++ b/.github/workflows/dotnet-build.yml @@ -0,0 +1,26 @@ +name: ".NET Build" + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + build: + name: build + runs-on: windows-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET SDK + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + + - name: Restore dependencies + run: dotnet restore + + - name: Build solution + run: dotnet build Processor-Emulator.sln --configuration Release --no-restore From b9ec80fd3cdf913c818548c00ce1de58235997ce Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:01:46 -0500 Subject: [PATCH 180/230] Create dotnet-desktop-build.yml --- .github/workflows/dotnet-desktop-build.yml | 28 ++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 .github/workflows/dotnet-desktop-build.yml diff --git a/.github/workflows/dotnet-desktop-build.yml b/.github/workflows/dotnet-desktop-build.yml new file mode 100644 index 00000000..7666a178 --- /dev/null +++ b/.github/workflows/dotnet-desktop-build.yml @@ -0,0 +1,28 @@ +name: ".NET Core Desktop build" + +on: + push: + branches: [dev, main] + pull_request: + branches: [dev, main] + +jobs: + build-debug: + name: build (Debug) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - run: dotnet build ProcessorEmulator.csproj --configuration Debug + + build-release: + name: build (Release) + runs-on: windows-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: '6.0.x' + - run: dotnet build ProcessorEmulator.csproj --configuration Release From 3f2ee0ca15c9402d0adf5a513098cf7d160a03aa Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Mon, 14 Jul 2025 14:12:27 -0500 Subject: [PATCH 181/230] Clean up in all the aisles Welcome steady customer --- .github/workflows/codeql-analysis.yml | 2 -- .github/{ => workflows}/dependabot.yml | 0 .github/{ => workflows}/release-drafter.yml | 0 3 files changed, 2 deletions(-) rename .github/{ => workflows}/dependabot.yml (100%) rename .github/{ => workflows}/release-drafter.yml (100%) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4f56e7d4..7e2ab1c8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -5,8 +5,6 @@ on: branches: [dev, main] pull_request: branches: [dev, main] - schedule: - - cron: '0 2 * * 1' # weekly on Monday at 2am UTC jobs: analyze: diff --git a/.github/dependabot.yml b/.github/workflows/dependabot.yml similarity index 100% rename from .github/dependabot.yml rename to .github/workflows/dependabot.yml diff --git a/.github/release-drafter.yml b/.github/workflows/release-drafter.yml similarity index 100% rename from .github/release-drafter.yml rename to .github/workflows/release-drafter.yml From 8a1f9074850c1252667404f9f9cc307eecf8af2e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:10 -0500 Subject: [PATCH 182/230] Create dependabot.yml --- .github/dependabot.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..e69de29b From 7c9320a48e701d6d4dac0e539a7f164838780f33 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:15 -0500 Subject: [PATCH 183/230] Create release-drafter.yml --- .github/release-drafter.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/release-drafter.yml diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml new file mode 100644 index 00000000..e69de29b From f4538aa55afc0e9357c9f74580224fd5a713b1ef Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:20 -0500 Subject: [PATCH 184/230] Create tasks.json --- .vscode/tasks.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .vscode/tasks.json diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..c464090b --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,19 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "Build Project", + "type": "shell", + "command": "dotnet build \"${workspaceFolder}/ProcessorEmulator.csproj\" --configuration Debug", + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "reveal": "always", + "panel": "shared" + }, + "problemMatcher": ["$msCompile"] + } + ] +} From c3623d3c8d484194256fe12c9127d389e3c37fd7 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:24 -0500 Subject: [PATCH 185/230] Update ArchiveExtractor.cs --- ArchiveExtractor.cs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/ArchiveExtractor.cs b/ArchiveExtractor.cs index 8f2710ad..f65e1c7f 100644 --- a/ArchiveExtractor.cs +++ b/ArchiveExtractor.cs @@ -1,4 +1,6 @@ +using System; using System.Diagnostics; +using System.IO; namespace ProcessorEmulator.Tools { @@ -12,7 +14,8 @@ public static void ExtractArchive(string archivePath, string outputDir) StartInfo = new ProcessStartInfo { FileName = "7z.exe", - Arguments = $"x \"{archivePath}\" -o\"{outputDir}\" -y", + // Use -spf to allow extraction of full (potentially dangerous) paths and symlinks + Arguments = $"x -spf \"{archivePath}\" -o\"{outputDir}\" -y", UseShellExecute = false, RedirectStandardOutput = true, RedirectStandardError = true, @@ -21,12 +24,38 @@ public static void ExtractArchive(string archivePath, string outputDir) }; process.Start(); process.WaitForExit(); + // Remove any files extracted outside of the output directory (prevent overwriting host paths) + SanitizeExtraction(outputDir); } public static void ExtractAndAnalyze(string archivePath, string outputDir) { ExtractArchive(archivePath, outputDir); + // Further sanitize before analysis FirmwareAnalyzer.AnalyzeFirmwareArchive(archivePath, outputDir); } + + ///

+ /// Deletes any files or directories unintentionally placed outside the extraction root. + /// + private static void SanitizeExtraction(string outputDir) + { + try + { + var root = Path.GetFullPath(outputDir).TrimEnd(Path.DirectorySeparatorChar) + Path.DirectorySeparatorChar; + // Check all files under the extraction parent path + var parent = Path.GetDirectoryName(root); + foreach (var file in Directory.GetFiles(parent, "*", SearchOption.AllDirectories)) + { + var full = Path.GetFullPath(file); + if (!full.StartsWith(root, StringComparison.OrdinalIgnoreCase)) + { + File.Delete(full); + } + } + // Optionally, similar cleanup for directories can be added + } + catch { /* Ignore cleanup errors */ } + } } } From 0a5bf79950b4ea441bd51ff6634aabcebea0cfa1 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:27 -0500 Subject: [PATCH 186/230] Create ProcessorEmulator.exe --- bin/Debug/net6.0-windows/ProcessorEmulator.exe | Bin 0 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 bin/Debug/net6.0-windows/ProcessorEmulator.exe diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe new file mode 100644 index 0000000000000000000000000000000000000000..6f634668050fcb3dbbc503a44e644355523a9d6f GIT binary patch literal 151040 zcmd?S33ycH+4wz^g@nyBDABkQHA*l@BS8%YbS7lr44ILjqNpsfXvEefLWZTt<|M*+ zn3lHM+P=2Z_HD)2zLnO6#f3nC1VIRHfV7IO)sseRaDjlze82lS=gdq(P}+X~>;GNX zm+OK#=Q+=LmixK)`+lAix@oy9-Q{v+@Gl;Bxz_M2e_r+f*Z9e3xIkGnSSu6u61ZAjm~ zz4Gm*w_dgG^w^Zw$2$MsDQu}&%>6rsyDOHc-(3}N^ILb}n6ba$cgo;5D(d)+O?hLi zm)|jke^K?u6uw!pjQeZum^NM7I^M`D{Vvz74`lJU@9j>VcGr2X-f1VD?RvoNa=mVq zR(iSisB5{huG3tu9@gW;uWJ>B0zCfGTvZ!fu3YQJdY5baB5|K6QT6UCNONUK2P@KC z?V0>mrMZIr)g$Y_57AWsix9hr;;>6|WZdU;}i+En525LW9;dW))<4V*`xfoJ= z+nieNzpUpa8Jo<#OZ_}XGi1iCx76Ok^PlpMHeHYK`yjt5e_qgKh+S>s={)cPlV1Fu z$8XA?*X3#$Qe#zAb7ZcrQ>ifcn0nr+*OdFN^SNA~$@`0VE>+5otv6)GZFk-?4X6te z11mL$@?+|i4Vf`>2GuMWui&{Xq<&02FQxy#`qN{5x8Cn|wboqhc5UZRk9=6*TO){| z$8tW{<>sev`>-^ZSNi>SS4jPItA5a_ucg+{w%UK(s^22@ zU-PQ=mpS#{8LS3mwJ+<$cnqulBB}oytNwPU{!_{N3^QCpm6f?__@~#|LtaJ|p3UXH zb&*wlJNG^1zQ(y{{*-OLg7>Fe?{9V952n2Db?QeaV zn^+y4r|ZVGUe)4I-Kbz-om$tVtpeK0OSF}JLT#NdZS5^k zZROHdp50cqZcNHA0uS=0HpX+7FSl?<@W*?t4U1d{7MJKo&lBowfOK{zofS9GRjvhw zQJ(5(x^#3i9SuzBNIK)s>2I%YY-HVTd&uq5ZfMYB*JkU{-g->W*7~KHUtGxyj7F;& z>pkaxRt->OPI!?T^{?uhe`BNbNd4-`^^Ij_(YkIN)}wCYEj_X!+Z=k8+jX$fUE6n^ zaDCm_Y5snoR1x49O%{AQH3zDSgP z#)i(LQ}n9qv0#3lxiKD(3yt(o1IeY}BWb$}eEjr%EPVEjr1@CpMAb`rCrEX9KeOBS z|I2#cr6$(-eW730WaXn{vn|M|_5i*+ zVC*Rul(;TGPdB`|@tli(z$A@|?4Y58zT>k4!^dZbPcnKB&kkp=Vl_4u-P|~|!TL>( zQa8%f8^PfL>Xi>q3#YGgQ_ookz!oS>b2Yi$ifUP{&THhIaP9RsAjz)x-Jr+r%-^do z{&1B-mCRpX#6lHs(xd*<0!Dk#I1)4t=+RJKT zx`NTKgf5x+UQmW`FJok z#;qG~%DcDAdPL{1)}xcx>oNc1JZ|!71zFYFLjP{PK3+RcaHtRh=t!G!fgT%^Mvc{~ zX5nxTZdffbZnG87e4r^L& z(0pvdZWh!N&$%(?b}d)8k@+7>s}pty4gUvvjF&zii8i1c6F!FFd1egL;~Qy$_crJb zGZsb+m+sIDH!yX@jAv!Vb2b^^sQLc+prObAI8Z*Mc|xnTexWQ`5WUI2UVy&E|2PBn zAF9^11skfhnR~P4s+swEg4(DJAjO}-wm`H;Aa;E=^ac|OM*X|D_}_6eyxrz^u22Mb z1N@9ij8jV;=b;lA=UHl;S29jI`{}c)9a#dO)^Bufz}UicPt%LHn_r$sjm4V;=X_Ir zQ+$)APPut5N9qe<&GCbtU{O&PChzxH_TXIbsv zXSYvdPTQSYrQ=_%cDo#MPVl3*e31@!_{QR`dQ(}hEV&--1()$G?d6N<1I$;>W!O!l zJUQ|NVKsnX&67FnCFao2W%QlTMO61_&-I?`WE~xhvODM< zXlf7w)}s}krM;`Q0p+L$@rJUJKCUo0(V`pM%om2sIwVC|f`1;|=&tRxPK1V8AcIS( zljLT|3*^spGWJgLW!9sz3Xu0V%a`BuapX%3dm{laTmJriS$F(<-sLnO%k-#Tk}!~Q z+2fC8PJ^07Wr(`1nTU#LPRWzP(xpvWEOd?(cAuF=&qW7&LP;>(UJqgvO>fi7T}3yheig>p(h8UfY85LleW+7>KzyMjgo%(?b--4K2#tBy>A z#cV3j;}=Y(f?PHVJUn`|Ha~a54ZiC|#H>Zc>{s>Q(vc|jTeZ5|6@MS@(&{I3wYG|< zX72&CV06HkZ+9lB>Bfz~V_&$h9=oxq4Wc}I5#&?+Dm-h6`OChrTYvGvU^M)L@}=RQ z^7|OS2&(W?)#cGJ(ki@OE}FR5$&=muzQgYaG^y3OWDLe@s;NV#&{TPJwx~9z{Fgw3 zzCs_HSDhv-016u8(L7L3zj1k#Yvu=u@*=z3`-$f9=6yoVO2bg-HiV3ppz&5P7Vv-~0przxv90wMUQ!hmedy6UZKP0^ zNx(RaHl(fo2lx;w-BA0j>S~xv9Rrjl>7lKDqg-1JS?&P&^5Qveki4!T+*6Mra zQae!Sp-7M2>#1I@t?rG|V%|$#Wk^_4YSj&?VNIzdIh*agc$mdgWEui{?k4NQhv5f%#)rN_+0Q`~u{!=6_9l4$Y0xiY`-h zhGKf&MB_?+pk7}O1QOMkBDcj zbjaU=Nm71A=H@Zw%u{|M{LgJ1LHO17LLo)_K&BDdRFhosB>YhSFvVk;*Qj^h=1DNs<(9IlD*){@ z2T1GK;YnwOMbCoXxxys!6zVYCR=r8=XC@QhSRENL-W5I=G%|Odo92RebffQ!Tm=xw z7z?E>v&#aJ4*UyXj~*M*FBr=>S&xqVIaT!7r4jit-q4M=u}IDitHM4N=CC3dM0s@B zJY6WJ?KJR9j|voHeaBPB{H$2kv|Tr@&wXB8r@ArPqZ=>lxQZf&-80U@mEqQ-S9_EL z2S8m`9X)HbGtZdR-rWp(;3JI9?a}QFd~5osapeq@IUKq8*g1&vnohE0 z4$6@&koqH38n6uX(HC}|!wC<(cXHrWGWdpB|kF zoqXXeMJX6CP6#q!>@ph$TacTr7O)L9*=AcytPXW!6z^V(f-iJtLrBQ1B0*+nvb3XQ zX)BUT+xmpPwA;)pr6EvDkIZiu4CE^6Z}As5_>9+sFc~ioTZGG&lyg@^L$~G^$b&rJ z+Bgx5fUz^4^Rqe99v6$aSg!C~e8|HSPE#Ya=L8sPF9>YAIT%UBnso>Zb*bw|^IHVa zi#ILeNBICIix*(BC7~5PD^_>|bZjZUv$ij6xd}%&&>obCE1^!n9 zK<*03_x7zBBt@}@RO4o*8m(6U5QXBtX2rAQIZK~siCQBo81sIKhbTk4|6!*!Y3fYn ztVYh}nL7tclL|?9n7=-s8$>JWDcEp@s1$iglt^)8i4#klS)CnOUw};8&9nQt0Z>~S zj!k2kwU{8r2OfBF?9qH#Zful1Y!vL2zfEm4Ll?U`vHPy_QjZ3$aEBLlqWB|0YCSqg zkKW&)zLxaG5^(YVBboZz?X0$pn>$0*+5u|-fT9WJ_8!QH{GUTN3psC6XAO?0>{T zUyMt&-V0F5jlTwsR&i7mbIuHei_S&@fvUc;Th(7M;Tt@h00LX4}B2O zyf_P+&GldkOt@Usr538*tU4M=!#E*+5i+(U{880qkrAU@;m?&dACpm=r$V;^qd(vY z(POGikGv=|5w582<2j4NZkH(ab?ppHkA}gVuoopjm)TZZ_cg#_5x2lWn1lVK#<%#( z$RgJwt^Nmqj1HFb%)I3*z-l1#{Y83dW9@g~oT7$i&ls8{lTc9#=gjHG=R3Q`JlvN- zcNvQ2Nyqn#x1jM~iji;gvE->1;%@Gc~M~{?6*AKk+eF0f_D9{Z_Y? zbX^4$rrUF^v{dfbLA&KRx9!^rL+H-P)~AinI9Q(M=@A~L4Oqkw0LFwGglMH%d?X&n zYDYP7-Z{6+JGD4pM4La1b|GR0+&z-5-TyjrI5~$WKuaA?ld9ank&>GbIN}!n87&P&ZCyIQs_W-MAPWBQm1#<>5@C>z^v#4 zgZKC=t>p<-S21b0>l_&MmFhx69MjsvTPG;7&JQTp>S^cpp)DEewmiDDzX4C3A7q#fN2( z<~(oWEeLlZZ))28L;@YMfiAnet-RZ@hh^C2$keyB`X2J0YT-*d(qr`scF7j3``9=X z{XV!e9+v5ud#@4>q}6ZbCfIq%=yW!bK>0=pgJXkUxJ57Rn0<*J%eWHd$%{Tulhbf|WG!aJ#_Z^D8YFjFlIJw+NGp%qQ}Ql2}w772em0P~d-1Ui}JQwseFm z73np688VJi5D#i)9eV7=F7Q|Pfk-@S_K;w7epN;6tgC`J1Y$R2D_UDmAfP&0dv;~e z2u}|h^Q&|tT-o{*eFRIt(3X6V?Q(^TLxISStYGPt5~!HM|dGI@YJc`}>jlHj6Pqk61{;NtuH_2}r1w!Y## z%{CvD3IskGH;&fnsbfd8%V6lm4b{<%a|BXBI0qvVn*b*z{8$)>G6sX-&c%V)2n~Y- zC=2dbwxHln#W)*xo&&j6YxCMpS8knvjW_f2nIXUtz(@x(E*%@|9~LywiJ{rCLYo`S zB38J?i4|%~{;DeNFxTNFI}YMq)D7Yd_?3lt3XR8$2ydNEFfJASzFgs;-`nVbptV#Q zC6yGjSLkMr`b_w}R#&LXg|D9r$AhmYM3Z*^VU(jJhqWos(Hyn=-;l@MarYN^5YJhA zH|9t@=TGtjlYdMx`TA~{yuw|@P|qPAwmd0;9vdidOy#dlLJyJoRhP^t5DevVx{yQ& zcPGXsgU#v9fZbGh?#z>pOBcmJEB=d?`|2^{a?7o9yuQ$V zq_0b*uN7xmeYK8t_`ld3ba$F`XW1WgcO%`k4x|ct_jgfv;yI7;1DZp0Ah6dJt}uTK z#Xx(GPBm4~JgM5i*&V8z(XA3X#;i>z35{G(mw8iaQ>j>%s+!@1I+k!nx6F_cnitYq zXFiDxDVl+hor~n@hEe*~R9S!-{0jiHf92Su=Ac_+H6N-Fm`}0D`*eqVr$Jh$#Y?9Qr{57Z}1yD7VT1%V7TLJQN z8kCoEc}W<(bljB{F^D9t9S=#~p@HqD+kHHKkzlGRJg$>|e!PYsPz|qiNyA-iJLBPI zXSk^*(<&+a<`G}48XhMN8!@kF6u2?+)a|4BlFo~NOYG}Z|CYJvEQr#4YY(X|X6;@p z;UyVA&|_;KQJpWD4r%Mt^bF8B^kW%%-EdW8B%Z{6CJPhrb^LzkJ!8q7WKU1p)m2gQNo;&O)oZ1m(|V;0>{hG#6`clFnNc1qGs~lOS6Ji9 z9Ia~M9ouQfKUW+nk)~-oC}jQ~!71V&=+6^KO|$&?WDcOseYiq_Br`L^c2f8UmK*Ql zl6^iK=xTMZ!<;M^K2iR=c4N1`qwFkP_)?I?ztboj;1m+qpU_mi)%5?$MT}Rg`;#n{ zF_|Q>ec|(n}N$V6gOHP#bfw8%6kI8D>%uPA1yDsixX&{`xDKaPVv9W-Oo&FnA{OE-#U=)@&Xjv@ZihNshOY2;tJ>8vxV?4xseXz1scvNN0t61Ep`H zuYcMZu)){}9o;r-_IWgM2tE5UYy?XI{=j^c)^SVUdG-gb&r6@FGuD>icgI19(%YP+ zmu{KW(=iXoMs8m#)&VJnECS}=F$ThJ8EFzONdw^}dBD6L#H3U}xnC{JoPm1egZ+AR zOh?chrs14896K^o-%rH{GI-4@PkVcCm-Mx_yDKCYM9r6W4IzDk&wX0 zV_sXQ30G|ULM(JYDS!Sfeh=|`8fcgW8V(Rdk&j;>IRF2v}Lr7>dy8K9k2Qik}=Gv57enepKx0_V^` zVX3chEuP^OtO=gs5UDN%9xp^#Nld zxwEeZ(#ccbd(c;t7BucH2^l?VGm5viovIr?uNVii)`8&_(`RM`q7~BvD#UXw23e6Z z@V4l?I>=|$mMju1soz(7s_)fY&+RuF_9joe^iBZKranQ!|dt?pXQN0?Zv-zh^e z8rsGg8zTGDN2F_YFH#~9J6*5;DBM$0vFiVaA{|~+*a&dj@&Te&_Y*0rf7Py`Gz-z+ zRgJXbhG48uNvO1W_KXlc_E#%Fd$rT-1$edg#<8&x6;j?`$}P|z0)T-2XtYSG0r^*t z4|yhZEaXGcUY&sM5ui)xULY^aQt(aS-ySr^gL1uO*m&*7R|co0RmA%Hf~7Cd%p~2) zjX&Rq&&VYRb2-bB5oW)_`01n(1+=o3K=9?;YlUp@;Eaq}d%ERYN-yu>yS>Nvyk{jz!(jhzB9T>9TAoc zKq|mWB()=l{*(FSCFgT}i8G%a)_hKO=5upzHJ?gnJ|%kB`7oIh@_%l&Cv!?QJ0AY+ z`B?OzFo~3NZ&5tw8X8s%x4N`B+|$a91YJPON=0fVNq(lSPP1?+NnxqHTS}ewZ>$2N zo9Zlj>mG~u-gF!+Zs0*@EdI#>2aC%IphG;@i4hje&%RbtsU&?dk8G*pIG8k@eg}Nt z>Nj>HDoy6;>JFM(yFySPx>gy|(X}ns-5&XgWtK+doyB6(;yS=wmePB3CHb|Zx0r$; z_C(!Cw+-FFs(J?5<*G!?&g)M95(KoLXYhP%G~*JxBsPA3S@gO~QYxGeY*H&I3t80> z!9-6x%yujU++>;As;?e;?BePp3^Fou7C)j(UwpmX8)r|IpT#(`;|pgm5T0=>21PCL zWpgshm1L=>@55%%C9SU6Y|W;2tPe{6)ze|V2*Tm~z@CQdyP$*7l~HCbk46LN5`Mh$ zQ@9h}&JDb3y#S{T#cILy=zgX&OxMx! zUi+n3%CNupms3EFw6EQ+w9Bs4Zk6d702jdY{4k(iQhtVqsWUcO-gCcG78`F$oj*H# z$Qc1`n0C9j*zKB5nPvQ!_j)hoB~S^^dge$~*KHpDyDUM3jRJOq4t_&CD1&O(M8E5q zR1=0hpjMpL>05qPeRR&3C4JP&k(3lkpURQ^ToSTKSw-`0uu~()$m)Bo%q+#Dz7SV) zB0UQ=TT-)FzH!7W?4ZnSUDj6BmUl@#6!P7s(zVQeAdyw1hGmUMk9;pTn-MXt8Rs$07p~vU2wS9uXL!w4BZ->LcX8}99FIZ_dy~?ZbQ?$FIX}Nn`by4U<>Q*cL-Dwk zggZy@2_yaI(u^9UC7n{UWfJyLZN8PnuN!l#K;Nq+EtRC`Ph`;SCmf+0FH`b+ss~SJhdr18bJEQppx^!KPb*NnbuBoGq$@mtqyxy zjcwgdEBQWKGz8J-!Yi_Z)4bxudul$iGFqPP6!~NNet$HWoyt9aOdVk{UARZT4{65c z%@e5t^XMndNRh=m`u&+6{Hh0R%a_fg!pN*KFS5t1sWGEYCs3yI`o-qbt25YM_F$bN z2HP%!{g7_nzE7=>`SWBSHFh6Q{zKr>sSicC_J67H0XXn7r@#AYQ-I?X(Vr>(y+?m{ z+x=aX?9V~3(tn{pl`npt-PYUt6Y#0B$Nq8aF=L0je4n>^zmInvc*M;qluq&PfGk>_7#_s1Mo)yThhgc+_Co|(;!Yy~3lQVnb7E~N*59rHpO zHJka;di3(v*OXcH&vEc7vu1-t0$yg1WfCKmyhI69f9#xYnSCw7>0~Fb0U)S3%^E55 z+5LfHt{Bykuh{Ud8^d+hUl`D5EZ~-m%U!J>3vAaX2Yg6da#(?Thq9enT}?0DIr|E= zu1$$`oju4}&cl}5oLmxibB|OO?4|52U~hP{_P}#A)YeO1JCI-g7MbtAPiKAceZ7$x+Rdf`bVQN*7be&-I zhFmt-dxFt1xFW}qBR;N#I8%`x9mh~_(DmpIl`L71Ay4!d?+ZooXq;Xi%?(A*2+746 z$78u_Jc|F6v%g1>POOb8T^%=2{1JwfEt}G33;WH0&8ZTH`+iAouaxQ2YBKcn1A6ps zFaNTmclU1^o$H1c^`_BzDpVf5o2c&HjQH-7=-r-J$YZX2&zbIz_Bhj>!s`o|&fP5N z%}jq%eu0=EXnTe?JDyV?vLowx=1}sfM8J!GpseaodGVa-Jk(Zq=*B6kei>%~OrXf# zD2wAm1`2k8Kk=MWo>WH{Ow=O_bXT|^+i4>EPl+^VL`QqhAKgC;LTm}fCgoRI`On`i zu=Z$9X%<^{@O2bNDYQh)o=*NB*`Sq)r5IR!Rk9k8t=sx>25A zLps)F!RP`{C?@X91*oLk2u`^I=`6*tQA+OJs2f+}IWseWU-%=yl|Qa@vo+=-?i7v=^lyoql)@t{Tf5YyD94jKC*sr zvOsL`sS*cZ0pF0lAXTiH7F3HV9hSZ}`-*_UvLTdZ*@C6!>_KB=8LZY@)@qS4H0oI9 z{VA)^iFpq~SyJn>Os!8!fDIqL&Acez_O1pqbVd+X6DEYQw?@a^k# z0|32d-i@fiiG`?U!-`qOT>yH6zkdt+-8$uncPi`!*~>T+3xdJ9&HVm;#&}*lXNqnw z$l0A5)VQ-6BXT3_p|b344X4w3Oky{sxdOM(cJm0*JGmZ0A$d4eSdcun^-0crFkd&{ z-63|cap_lI2|E@|$r$;^kGZaoheukKyygp3(ua@y8Rg;AjLgOS#v7uUbEV!RdNgy9 zT+p1?>_wb~7VeP(Bb2R|&dr_4?s*@q>Z}eN7~$zabl;-6`L5bi%-CyGE}fG*6SVXu zYK+$F4-&gF-fqLVAzg%RGUm6?5A^QmWzm1dM3TSBd_;AX8i2tBu#B zalC$$Xq-*pD%PQ|ahPUx>8@~=<=&Z89XZ@9tov5Goe>|?gQ)eO>-b88t<4KgiZ@IA zLxp0}+6W~`PdF|=8I2^!VPmET>YLGTJ(F=oUr^v^?Ip7@IB=!3Wo8~h6ZVdcmZ>@Z zjvkzFBRd0ctxRj{!zTN!;uaf33T1c0nj{m)%`U?N{YNov_ktYpVM?Kku`%Q9)}HVe z*smeGJWgZG43mQ`5-}TmoB}3Wq%!`Yj9-DNy0j&nWxU+_3eZw*A}?7mJn+($OSX*k zY*l+zoVS7VXMP3e)*thdoJ?dqlfMc8u(?|Bp3q(Ngmf|9^@U#i56f)Lrgp{KuAZj^caFyIRmXb7(iAIrI88+^SRBKvb9 z&1nQA&M)gva4@o|N*rNjmBOx}{$}%TU@nYcnlB@AUoIzQJS6r7wQRWbxHkcpQ@8{! z`SO#{TCRRJ0hc0k7v>Of`DBX)mm>3pPm*v+zy}_r{983@4(Ne6LXG=+0i}5Dd|f;o zq7GdEAuL}+K-N`Tgh`LwfOw|IbDkX~`EBv=nSzl3*eE~U(Zjepzx?$6;eZ+3CCNcy zW++YFBu&Z2x4h#o$`qQV4#0Udf04ihG@0rE!CjL8!bw~LgaPtn1EI(aJd*%|*W4~F zHjb2YAdXY%|y{!ok2^|)wHp!`RN{4ZN|`swt-YU9lY3DdnUGg?WyK< zil`NgRV^^1Ep3&1=@{6Da>l?y#Lbn0k7_L=_x19)!ov@i_sW$Jy%A((73X8|I(*-_ zcs)9y-;%o%kbj6vApcwWNub}(KP4bvWL~pgL4M{Y3-U$g$o5Wqul!hgmvC^=VdK`*XV-jpv+iu1ALH?TU{|NnO{tsn}C;cBu z4f#z$Nyzo_-TaD%yhsXSDH@pV19?Cy*eOn-bdJ_RFrs#e_5}rr*Q3(bygs9|g#PP~ zj<~YgAHDO+v=h?0a_Ob*jChWDrLA>6PGh{EXvEgGl=hp{w(f)iMf;U#BHGr_RibSz zdn#4i0-vY(zGU-s>!yEL<<9+QUG5*kfhsGSc<$WCGVlG&QAXss@Ec{s%K~EGU};Z~ zV~v)RoCp~MuFUECKpELV>90~po7AF(5cBd%+Mv8pg2biF*)n+;(Gbs>SxS0VJKH4@ zi3_>5w@b=Vw#ROl+@gd^--YwA+O8l9+B%JD_KwN-^`=Hq@pa7$|7kWK5Zl)1D3>*B zA?^1;)m;W%z_ovj?~cPXWXt3jwPkX*@XG@8?@V7Tl=+y1szi_6m+zIB7*FFl*N>35 zweRDqcA0|KqB_09jU<}+SVom;%xP-H4O%~wNu{nOng2rx zSTQJh{*uucZ@fT`0tjcC%h2NOii=gn@VoXg9dCk77$EmhDm}AMYsg1zk#+E|q5A}` zPiC_5oFyf0HWs(rh*}<-muca>l-qc}n(-Wq_veV9jP+eIhgB`ZtJAuiY6|ZIhu(J( z{$ascPV#UNzV#mI^Ay@L~|t_2p9w$3KX2GcCr6s;skZ? zk@yswkN`ASvA$0sjm@_}#iubE!Y#UNc#{-=d&3)x@y$7-zhV5_&CMu7+H>$f>!gXF za4X)l8tAMDIxB(Byq$7JEor`;e7rxC=9wLcUh4@(N8!J$K*&I9BOm;y+m)d$s{`Qz zu~Fn(-rNz0jxvk)t+7bw9-gzN15yd*=4}arsZ@`{?~+Xr;L`l>!-8=5;y|S!z9;19 zYod1L;U$dc{E|sn`OC&@oV&rD3aBh^%FN(p`9t#QqPZP+yl;KvcBOyKc-Qm1>v*4h zIWgW9>aiN{&$u){>-f6y{u9JZj<1G&gflPCw+M7_vQJx}GBI3cGh z2{Od0cv$s_xsXmdlSdqo_rE8IQ$RmA2qycNc9l`Ud zwh)P{v@Kh`!40GS76wb(wI#@OS4C{tW%}ZyD#$?i;c9{mJG2L0=ZP5;hlOZHE4k~W z84*}GD1n6?<{iqZLH@UHd?m_&7ymq4gq3G*i|~e>=8%8#HYIu+o)l^X2oX6mvFEWY ze+BSS8r5$6%a;l0IBVszVxi{D(?8?~4@gOZMQ2gMx?O1RuTMp{4>5UdY<#y(@r-w0 z%BFF0@iH!$$c3I>#CdwmD|~58PmAXaP`$O-!8#l_=TKm?^mOZ)TGe>YSC_)v@O4-Y zAM9VAk|#qiuG*0O#xCmMbovg3?3fOtdS9umEl$@^>VU%ZIyGH9sDL7#^Bk|(c*Eo$ z;cofz=*9Wc0$DaV8Lopc3SYC+0}_o|gku$ZzSA z$=PiZ$C(mGI|~*m@dDDvB-%8}L-W|A@tl1_Rr?rw%YiC?DgKRE-;bsP)9o*GT1vI5 zbWO^0b!kSwa34-EPpf9e|0L=1%my-CX@Zf@WgZC(u+G1}UQeh~Pwr%vN_lT5173XE z;zJ0nGCw&*6u`tGKk9T5ik}2HG68=J|Mv6GWdBfu9t*ERsy2%TBv;l(9yt}eg?%xm zXlAVj|2Z3Z);b=-VCjLNHs*lZ$b(nR;#ef@XiLx^Q{x?liD>ru@&Hio-Ku^?LAftA z`is*YJ3P}|E6*8cFtLA!0AaIv#a~56hmp~f_y0+be{L}!uNUcwn4e%CBmChO-?&p{ zz$HM~^wD44zS@h#6LUT);VQU-68Z_qOjyOn^af#+;dkP35&9EAuPz%!R-HhHe<+d; zTi}0|&~F$0`d8e7O*QIlL;TJ6{!0AKLM(Qau~IiOUwFk{Zlr}ArH8FiqV#6Vh*I{Q z{8xnDDB&pMfS608hYu?YA5^X-=fFnuPj4e3u|A4$gvzN%;w+M#)@=7z$4GMSc6DS< z+7;nU@3ZccI{m{pck8VC*qC8!U31!fH5Dp(#V31a7vS@2eI%c#AYHO_ zn^reo9@r^oYU>$6D$+=T(W`>dg&wrdt8h``8{c3bGeX3Q^{iw^yGk38fe2VQB2m(n zW5dRZb+1FRS+fTa{>ChOlk`rI6abrjF>+~gL}@F$$ECmMkgZ<&7i|gAbAW(AlHF*V zlbI?*ZPsqeZnT6NLhr3mn-$FbrM#MS)g*W6L5Z~4Y<{_!Unu*ePN^!V$8(;(7@UxG z?q%+gI?0R`XXMd)V87tT4s+bw*654LJh5^D#P_DMw1G$>o;X#!x;ss`Ce2C4b^#^k z&|ix9-2SfozeTPsehWP*UzX(sc_O(*^V=^wjC72+W}_ht^iY=hFYp3K|pmH+et+wi(byap2{Bl}9IqQPIW{1q`uu&7YNc799bCtG2?VK1?2< zUbZWQc$rSLIzkL+Q@q`TI~DY`wq^!m8Q$th$t1xrRK0T*hMDZlESVGr!y0637tUd= zjzmy4q%_nw%;ET=kkj|e;x+M23TMZg0}<0b_dRy`akTIJ%i-`>2@k2}p4VU)#9!F= z$jQJHoR^9Fg$9}n-m~iC3#*X8Z%2GAb28YBoX2s}VdN z?Ef36k}pG-tK>^(XJP8$3|T4cv-@)&e$P=H!QjRw?E%e+{eD zBCEs!FU^qj{56i5exOQ}qrVMw%=F<2GrhB8?P5i4No#$rdhbcz!*Hk{g^z{!0(X|h ze%`Sb`%+%O>Ro#~x=gL;hhm#QIZqaX5IQat4&AsD)*Ot^OP;b(9xbJ>cGZ^{-PX5(PV8*QA%jFPRZ5qJzgc#o)IVT> zb`Ri9oTTbolc}&GXVz4iIkTO=TZD-{!_;0=XL!5~v1&_9j5Mio`-|IM(WH234)jT!O)mZ#zTKI8V@+6F1yE zTPN3M+n;5`p=LE|*@DPf*B$9{rrTU}*!lRrCew#?#t%LXIX^_DAH{NhI7M_;ys;uc z=CzGh?c-UK_QO20jta#2WGJ+8uafx||4lE|LC_SykY_dXp zGhaturd6}4N;xbNDie1c9fjIsQIZ_x`-^;=io(OIgs%(i0ulX-((Z<)9$wOtOLPSji5G4-cy7AU=oAg z_)$DQ6g?q%B4&by07(kL9uJ*c2~uu1dox6(#M+wGz87T`aVl7@tM97ibF?cf9%1o6 zIUiNHE=uhO8}0S0QwXdMFtwCd(R4^uW#3Np_xWC_UHZk$X)n6u3P*ZgImdpyYR>+P z-1eK$OWdwE<4W@*dhO9Y^DkXR-gJ+WXz-Jn&OURsL*RO*PaQ~xCd{AU z5~zbuWhnNUUP?xLZE@tP^J>o(M^H($2cL9O-jv9uyeWuX94qSMPI43Ld)ZAORKGu9 z-g47VZeI9b%hpxnQ=76>c5W4`eYnA1?ectf&NAM^NVsywSmck5>B9o9k_JwB6;(qr z@k-=BU6@a$Qc|R52{qHH`A=dwf(Iq$d%NQCq!?Gb5hzxkN=Y8kwNVFza7wt?AUIF3 zWiT0_lT-=2O#Xu1SNN&=zCk=k15)a!H1)-Xzl8r`dpzYe%%la#5EUsX<2S(?U9a}<(gx#d6-i?UO^rsM>u z@#gb{8t1QLDJ9go(6SOVtO2w6h&sx0fr2sTBM$&*_(f#J<2j#l2Pe8zEJ0W85Z@Y) z!iJm*0WGY=Xi>bobBnXA76<#*^tNjI?b?&2w$nMs462k~o!SyS7uZb{ZEf{h8Ret- zE97O{>t&yyZ0kpNijq#KlJr`IH#OkRhL;j}Q>8R?7Qw-sV03seIv3@@J~X#HIvf#4c@P|o*kLNrhdS(2a|^8b)la0A2BHJ9Y|gQ{{dtBg zyn|=!Q5?M%{gDua0%d^DMziW^lLRDV#YP39%vdeTbRcD#qcgB`3 zVZsmHKxaSb(wS&eOlJ=K zq@(t$bD%CEhqDOuDZ3*`cotOtkkl0?QiI0wT{ISn)+mi7@%@NAL02nra4d+CZN3lK zRRZF*%J&%g>waed$M-z`nx4A#Jl-N>bN-U_qf$0`0ewhv+OTLzr;Kv$g|*l3J1R&2 z3Zb$h$&8rECxWt62v+OoZmpM9OgQ;;<8xh(?^!3-41etFIKUV2;HVr^Q~L7k@1?i` zhB!Ms@ZvX{pFb-TZMHlCsR#A+i|0IXw!l=m`gTx_)wA}Z$agF7+%%h&60l&M1>Vt_ zkdq7*$pbsQQ`S)OZ_JACcan&lJs&VyTI;c96iCFG6WFkyaK^^K;tuD8fw3I{8I0({ z)*8<~85YZnGFJQtt(P*Ocutm#u=8KgO7CR9vGpB7>#(QDhxpt6fxQ+qdWH&H$$HEV z(D;Uq%zy*4tN=;pb$ihn2p6#)Z1ODJs&6>V$Z$UYgR@T5h9R~AJ*AYJj9ww*%RuQS z2%#fXdPH0D2*q-`=!W+*gXBw!=PFCj>_O-2-f zykfTg*5xna^|qlQVnb(1N@+-5!F|l^QY-W<-Uq)D7i6N#$lvz|(?1Ty=2Jv|n*3J- z;K;Bx7jdSaWChi*EjU{@P8EJX2j4|FAR-B?`||4Ldh~QXD(c*gxtb>pRMR|T*@+pT z2|E6d)AcmM}iHUFOp=;PZmw*4kha%>gs$IVAVe8DHEn^C(@e8z%`) zvA^j0Y;yrGNr5Dr;^R-HGcng?t7gi_V`sBF8~-vr@%5{~hW9dq=^v0nlnrkoPIk3N z&XZ!xN^1TjcJ~?Jh`HGS3r&qUb!T+h4tbE)Cq}=OLaoTnI3gcG*{l4aA}2)Tpyjfa z$F^df-0$x8lEPt{&4>RagM`_qoH-e31X}Ne|2KtB6p6%hu97iYe^&e>zzI35$2g&^ z*w|b!k6@Rw--6NJ!DukMBN*+It$BQ=9t-60fheq0_RIz_T4Bl2z#cxoYPA~yI+y|hhx;D=PuS(V-?+w<^3$ZidC(HuYKp00jO66q@}KjyEbf$sd6 z$}tR}hy9TXmLD@oM{W2q+j4F0)ywoq9XsnxzMDqInZ5Z=_5dhf=1w!Bq8*^=IL^>T z87wvLRV9*_E;cY<=0PqGzQ@`x0q7EF)@a@yP2iQ{Kdex`3PZ!)5H{_S&oxJdeh!;o z>;?G1m-N0J(zQ4Rm?Q&)rxL1vnsL`Rs0cLiXV$1hMH?No6;yThUyn!I-K&suDEzAE zgs}5o!OlZZA*$rt%jzh4wyt^kUUCtVufS;yjp9Ub{d{Td30k8K@NHCq!Z+~(AqEgz zA^|x6{j>ynTlod#CPlxS8;H(S=lNJHdhv(L6%;bR_l&JZT1?Pq9Pk+(vbh*%8xDcu zk9c<_|JL}{EBuSjYp4dEq{cO%*W`uR))lK*Y0lg%su2&o@?WL!LB24}tyQlhNH0o< z8Y>lj(Q|y!1sT5REK)V@W_Wk!@vk5lyEUQsU=1nui_Iq5&j%?EOGkz*6f~(6K~#YZ3pv{L^L5RkD6n zvL9s*`(b3df0L=zsHycyOs%MGUeGuii0tG%?GD0>9c-}`g@c3iI!`JYf5@~abszSp zO}Eo=O#gkq9`$#$^^fNi=h!pKHYZ9Q!<4~wn$Iido12j&4Bi`(&2>3qqD**mCmXy>FA6? zNxFE)Mxo(P3VL*-yFwQqot&VHlc^?j(InXbSI08uqk6I|iY~rSSfbm}s#(q?&H!74 zJ@U_?3*nTUX%W=$Md0jlC5AnL_7%60N3q{{d7H8fsWRb)FiY%0J>-eVk?3$ucB| zr777!R;cn*p{Q`i;7z#_(-Y$p+hMFHSh{uQ`C>#AZa~79)t+X3--Wnv$&lJvm>W3w zOn3NWs)(#8lK;FSot2D4^ivj)pznC_M@)lcgjp-wYjs7`cWi9%SQYD?BO~`F5As3Q z6q)C2P}co@XBD-wp01E}-Wr3FO>j%4OC_kPq~GaEx)n0utpu!t#IRF3=|5J4SEU(y z39`g*R{8wNV6{Z@Q;sy{Q;ph^pD1dvgUJ8dk*2rEt4Ya}%=gz-o6Y9x$EhHO%u(q# z#gO4tHWfksiBzyOFSv)m1N~Z00tNQlyTNjJlnOsWhrvVsd{3I=cwD3>aR?oTK_DU+ zor5;*wd{}bXh~#S#=*w4+Cb!QUx@&it^`1*Tx|5VlnjVtqkn?0n@<8?%@2MDuFKIO zerbwWeOCt`y3sc_^*z{bw7pmf~t4NfIFNH3O+0PW>`9lkWJ_GA_QU(b5Dv~f+XLHriwhA*SMv@9e19#`31 zWrxW*Dnmlf&2wpW=ZI@V*6buM)QiTUa$~0+y9rHrCY$odd$8?1<*})5%l^R~YoG1| z6LrIJ;4F>m+Y#KSmuagr^lIO5CcQB{LP3u0&uJ3M)?Kyv7=u<>P`>8eSUrm3A?*G_ zUbY9~8v^mhwqF!Cv_1q)b$K_8A(8AxwKqhoyHP53Eq8@+&|6-?o>DPD#lchzvN6#h zIztB1vmCayoO>tB>bG)Vd@vebL3Y)C*}rlZozDIayzmR~^$`0o|1wWPwO`k0rXhn=5hV zPTntF1&!NGiCB`$u!;?fwI>s!x?5pQ`S80|Xk(h%zQbO$NyLY(u1Jt*48|t31R`H% zBg}U(F%DGWaL^q>(x(LrTR7UXe_C~^CwyumEb<`-G0*I`9vvaxcD8CnjBk?397tK6v}++AuGc2l-%58->j3HhwYn(<;E*F_Mer1 zNo0tvr6iVoP6s#@IBnO?$K@rD}75;~kd1roZr}zTAJoA>{C4|1$4yGN} z>VC~?tAL~g1vn1Tt*r(i9fe-)q0QBiBNx~9k~^(_7WLLj-;%BoyZ2}UzT zqAHLzas#Y3f0hSWv?CtlSHzeh1>L9~XG(<>)uV(#cbW*g#}5b= zNU%le9(hUl-~J`oX~7>)8j?jq5qADcieYIGh7h%)b0}g)4*@K#|L~WRud4XG9bEH@ zMsO3wP5}Pch=h6OY*7lH#ig*_d`kWQgp@dc$LI&RmRgdL`jNkJG=w~HcoV#2-o$U; zQ(t0*f`fc;+gV~Z;o{eYtDhn24Ieoj;B{3;t{hTZtVgz3Xx=U#(hTLvxPSc%0qCRo z3Z)irlIVKE1tvVO@Dq-{#z7FT-6ox(K;N3rhPzu+HrxSgDTA+;?hu6*pO-ThlJM9) zXTJC}a@n_DNmU}A?90m_Pl9l{^?1rVHrtTWKs@JQhAo!a5|P-c$2I3Gu%AjIs0B(e zA5BLvOYQ}6^8&5zZ4^vPG{4K0m1I$+7P?bd7e%MD5K+ViC8r3HI!3VF{N1Cn)LQ)x z71KZJ7S2n2$`0~o2{Y8{{wNRQ$duhdV_aeps5uUfb3lvyP@dCcA*aKPxNL0ftShv- z`IHIwsnrskr@eK$R4jZ;PXCO2K|0|??gg^Lz6Ru<1`7|8|G>Tw;t&?>ZKekw!tViw z3;aj2V|ls2jgRlCdjMXCFnow%I~yMVWf)ZfeZK$5u{pw%>YpGC0b_B`I=wTH(A)$} z5As-MlSitOa#-&)Z~u$z+u5%m1-rF2Z%QU*eLGla?}-K1h)sfGVquWTd;iJVAZ#JQ ziFPYL^FXKWII;W8K)T9FDgbMU>pBfCJ^-2|r+U^Q_gK3S8M~`w-Lpw--0Up>^BM-~P-ZfLG9~1 zFAvd=l5Uk;B})20mijSjmrGuIIf+rj7z6en+V`GTX+(vrVm$zZlx0xHmyhq^4GFSh zmdk&*uH;Hq`!Z?xUx{IiwdqfOuQ{<5YE~F6Ga{Xx9d__vJ?@<)b9U+UCn_)Bv;}~Gr$)1xzl0M z+Spj1Tf_&C_SKPPf1yGa0h$31K_WJ`2w+QADYT20Lp1nVE_ceuZf8Fs4x9Ci=I19Uzg@udt^okYK6#*#82ln1AW>xVl}f4Kl~l&DxSN zYCkrTdK*;u7d-gJUm%aR3*n9y1(F)CLQ0bOzhs{nz)7!0(yzEt9-vyh`xBe=eo6ts z;DLe2d;2-5Gausxh>)~^$kfbrR8vez%1|Bust{7-GlR7Oa-D3^+inh&c#ERLvlNRK zFNgm8U5prv*Nuew>sMGC zW(K2GE{?J!t&knEbq__GHD7pG5#&nq+Rs$dl5GDj;epI+y8JhX6UIkLmK9(^{%928| z*9ZC#MQZ#||ghgGKl5-1E7T|a(ou_^&Ygs~%ngAppjS7j1S}0Lbr&(z)4<3xo8_ds69OQODeQO@$Ff*M!T9P1SosIw15V<3d z?1>eEk@AQ_xB%N!t?q*3Q=eDT&&IyV;~WB&Q~0v$TVqIS;4_o(U_ zsAH*T<0qeIlW3g!{D;$F@v4eAw8a#9^GN|l=Etfb zK0kKP^yob`Dy%*U@gV@gf>0nyfFd=0XYq$f6o_oEI-Tt^Ih_pwOP?fpiDOYtn|97) z^Wc22&SM*NL>P2>fJuDKK|;ON(OJ~;CXSd=2MOVTM+>NHq#vvO@?3Awn3FBm{hWZ2 z1?gMeY~&EX<(7fsHSbu+P0+ab7qAae$tr`!r5m^whu0D{2bT%jN1z?_IjS=l~n%_)0Zt_dtqJ`@0 zy?)?(u(ZZLd(WveF2pyAGWo1nn_slQ8etTb=7Eabp zhloATw>r3wj%@s285v4|`S}9ont%j{n605kkTXJwU-g$g_Vy8ch~Wf=9qTdtx@44bKX#*kr=_Q|h29`@BD|Ck!Z7%_D!*h~Nt9r!Q@;Ot@-Ul16YsvbGqd$mDqzF6m#d$s!4!tM2G z%>q}iN~};}ByIJw{QcA+k4sjj0H=xCfg#|y#Up)U2rg5diBI7BF^U#%TEQD~S{>t4 z{88d{&dG}SCtB?RYlEJ#-ZU~F{*gU!e>`Ly2pPDjj|7c(MMa&!S;`YW@U7Kk7}3zj zODF91apd3yt|ImE`0&D!a>WY8X2fGR^=*R~XXSB-!h#HAM_d1JUp8oG#wNPks*IQ0 zGS^}iaOU3Lk*+-6326mewCggn{iKg;-^y$+ce`dGcP6Z+Jf3s!XP}FJ_0Nho7H+(w z`KMvFi$tI8=zpkn!;!wm#tr6x^o`JF`X0RLL>l8epf)p(~R2l7avw2$yin0R?fA6G-H*otz^v@+AWWHkG7>& zIX6+|mbRQVw^PNp<~IJP*u%9}-mtVReM?ye$Q9a6$l_xGL}>RXTEAMc?so9G*Fyp` z^UrT7v;$N9E^QFs!vt)=}MM~_^RCE&2X6! z*~8dXo>hrF13D@4>@{1S?J$3c?^nb(4X==fVF)ihz^^6FZF$xiK5rZUAA!%U|1x~0 zz45QY=U&#L3w(ZwcJy`ddFjFbVjBg3ln?n)5GF*5znjUEp)8SQDKn%ZAT{R6`GC@c_!= zN+Cxhvu3FcE&m~vWgdE5ec<9P^uwpvr#XMN?~pIo<%NA*A{+{JVl~ll0_pyRB)kv= zLV?9aM067MgGU^Fmh&Nw!yk#u$?$n~zSqksHS0yiH;5B>Nx%NAO_*>jwA%djX)*{o z-JCtWDW70?l^Vyha-QQ^@jlu_lbI}Eto|5GAv=M4BTE!bjF*zh3u}AOSqWccQ%8F* z<|VdU^FeU=3Uf$4>Wr=~Z|~wV;!d*HVI0 z)y`|#+{rZ?GVUS+g&iu%WXmxof?IaxR4=j#hI23wLzm0#;!Q#ZNj>ytrHG3DiLWS` zA7OtFR~-Rte8LgI`z0f|^o`lLYuHg^eOjrX`m7Gi(kEbSQaiVIRDb#;nGjGZ>px;f zD|zI6W=Dco{IP$G&+Oo=fdCSp+2I^v4m#P{={riv@9iX``r(H@XO9Cyi$2Y_y!LfuGBUgzP=;p=*jc~2B8L- zo@_Ckr62$(WbclZ+wJV#;nQn&_@3l9AD4Vc147?v?!~Xcr+5I3o!>0MWg=&lk^-;1 zRV)e_+?+f5z9?QjCyEns+6~HCXrEse%ZxzPDmUAGaHG4nm-<4RxqzmHG2-#EciuSX zoxLSH0mt)wXKP!#xcE4`EU|kiT^oRa;ZGf|J3K>9i^3%T{zI_luW66Zb^lB4UHJ{| zd5&#Q%=D${46CdpBaM&NGpg*LbRCs#Jn^Hg_MIVq0_TtW+|>K->?;uowt_nOen%wW zH)zE@@KiABe++@J8s-qbhf_Xh>&E5i@TNx4I7nid)$W} zdx2=5BSqH?pC3S<-200em2VNrd4zN*`8hA5wdJ)vHz7-XdU?gdhom5Tza7Yp=ETT8P^Mv8?kE%UJTqs<>+$MG;xR zqZ@TlvoI|LH*dD6*(u2u{wYsdvP~8VEwppc!mLBJuBt( zCk@&oJN)oYhWJ3+n0eZwjle;&>u%!Tl9xHztF1V)e&2k{G75hV4I8wFmPuCal{ZAk zSG0~3gjxhS61sXsK)x-3@>Xr(u?{Is?d<(HP7)t0=MkM7A1jPj%*TjWu8h{8YMYB7 zCWCP5n5HVk3!yjvfL;K^R^H`S3_zh+X}Q5?vJtRmfnhbb$e_d~q}P|yo=dy!rZ%#k zna$ggd-`6`jk$$34gOka@YfPL2I{B?Fr-&&7y>t;sLWUqH1f?87BBKJCZN(Q0I?P# z@u+2QE`;#glcKYsf$I~5`Rybzy!3-4DSFtV%R-7CE{Q|>9uCCjB>{%JvUyKw5A0Vh zqYX>6;y!8K24L$igB`kv^- z2#EQIA5qL$zlpFI5j7Nb(k$ElFfkwh)_7b*>lAZz@Pw%GP(V3UDVt?v)cOIVh^%rA ztL!Q4jr2fKrv!4H_UM14MZf77xJ92>?ApU>X|;L^88PA8|HHF&CbiqFTI%|scQDvs z=c#*A#fRXx!z$5#{+>|!HM5yun0je7*F8e}*86rc=?JaGPB2x8$;ckI*a@oG8B(kW zA}pz7nR>L;7xtE^mkY%2h%A%KW z&d|$Xo4Cl=h*r&ClrT= zLOV}Tv=ik99u1~F0V#^R#803|b&FSimuA&QeGkW7FJZ}vl1N*TzF0tVDj-45(UQ~H zi-OBzDcj}=$xG_muHdz`JIi`RaI`5}_|uX(pl9c(0tTSCBY2@GF6Y1yG`IS8+7!1H ziYv##V!>AP7Z^1N#YIUwZ>OTT2%ddu!C2NgisTZd%mc~Y@)v1k@G1NV4A{&UcyBdx znvyYfAJoj4Dq(SG?$#rh&o`yo-#5ouBi8JCVULE88fjo8y}(beCSsKJK8I4V#rn0B9Ss9 zOC_mjAN2VhMW4^K=(8-H1bx21rq3uXq;`uwBi|p8KD!eTj+N7olG?Jn)#M% z+@jmNnS3@k{pmLA@vy}{q>5dBhro}}?QD_SEKrX>vrJPKtZSmOK6HE65{QeU*H?1t z$Bh-hZY3kwhk1{<1@}X~!f#2DmxAMOweCRw*UMeZaW>0Yk7ipD&Y{KR+hU%f>b#bz z09PYb=rt^|83d`%Ehe7`jW94$iut6=uFsS`jf!^ov?`F0ZC<33*A`(=YukE8enky~7<3HHq$<&l= zasS$eNONPhxr;L3!sza-!mg1r)tJvPyZ>9TOd9w{)kVumGc1IddZ_@0y@oOG^cu$a z%|~yr3}eLP@hRaz;kx7_f*Fe5t(Cm9H38R>c zu^Ueq#azif5I#dL$*^@l;GB{&iV<5Q*JVIX%yk}~$wUF@G1Jf|2#72APMXd2#y`DE zHR0S`QMdrPl?0MFOYZx`KP40KPluDP;-6w}qvD@(RYq88@`0*t$kpUD#(pXaiNnV~ z{T`XWRs7Q}nKC#7#6Oi1QsbX)SVh~@sRSwHbd}ZvoC{zpq#c0(ZJLgzfT(QusmYB*adYlC5mEg*Q_15MCa9mv% zt3bVWd}RXl_P#l5QY;I>(l^9c9xwIv+FkcbeNUGcV27J;<|<6k^8z!e@s)=Pd<`*m z$v}K%Le2V#rpyVB+sTQmi`jYp*qD()5p8c&o;+szjq~V@`TPQr_;3_ENC8KHEyQ$h z1F~UUb)Oa}`r02G#zB{y@raI;TL^O=A7F0YUs8ODEh+vCPSlbV6S3tp7hOxLf8|;%UFcG|At5z@u+G?Mu=bJuyk_8!b>BV(bm3t*Lm-y1`Dzj>n7-i#fPT zm)ZTsc+4W~>JyLoCpX#isf2r}NA!B*F^44&#?uJZDzsN_RDqZ!Vzvs*Yz1USg5MjE z`7a3mgT|{~DM(41`ZL3Dp5@c z0kS1Tpe9pc-h5HYgvg45)Iuv|A&TRtRYYxGMbqgUO;ap6Bi@VSw9=`+AXR#&4Hf-M%@Ep-LcCPpB zMrjfL6eBUY#@SqjS;S#YZjR+<)Oz2k^5)F-zVlgTJG6#(WSJRTRXJ0yp`2FVO|&Sj z0w+jd<4Fh^_2?ik2XteIH-L2yo0FyD>R)Ppm@mMEXG$9f#a(~gL|-VKq)~R#Ggi_l zk~BN%$5xU?Qru38SV`~&Sk+l&)mcfOlC;xKnr0>KR8`+6omRnQQ{0Jg;K_3A_&t^i z7T-It{x!#4X;F!Uw8WwpYJTzuo*(Md8cvm^5-Cg58gVd~wknT7F*n{Q{gtV?=^LiT zL#_7IeD88vsm`W_cUCM8fQt(? z4O8|pb}vm$PD65iaK4+>)Ej@0m9l}AVs+aQo&l*7!&cv!K5a!uz}OdeMWu4i)y0Ba z%vY}!ow=NyA!va*JEMKB<$2r~9QsBXdSNtpDpH*&XH23K-TW8gHolc0ajc%7v*QnE z`Hg9Ls-$}6QYX6Cnp?*vz{=PZxkq9A9{H%{RSko``=>plLv-LR=<4tu!vCZ_| zD@c4!ULbbvgbd;)HPP}lvAKhcZGNLi%1!9+*va7u1!aWjb=3EqX9>PwR$i(cnCFUx zX}6qwEZQ61%5^n$0eAR)z9ppvuLyt|dsQ_r0xqHQfy#f;ausi%LHYY7ss>GeEI7ysEv-Iy+q&sFf?Pm@2T%%Uhx8=#uxiEwIViN@YYjm zaK8wOSj_hVCm|5?`2>I=ecQssQu>i~h|6JE9qjfQxK#b+& zj@=jvV?s?`A44fX`8okEX718G`2Q(6s+Y8Gs8$5O;7?x}k zrPemti94%`O~=2n<;$Zh z_6BNic(UCb4iAtl^@Zly0o@0x>(1o%a{3{*mp8BjQ$7~#QtY;-EAKNuvNl9&#~78# zEMKqc4=pkd*e$R>yCixW+cv~ZDSOo``6AiyoXD0ej%!GxyEaOlaEFAf|HK;$XY~tP zFN`JhQ4OFKr9QFA`{xmRB7ZwJdRN}bcMS{s%-=y-<@AG?TCZgq+2myv*t@(F`|a{x zTMsactE0s3PTbnT6?uBrTgM)5{(_br!=s#g2=M?@(I^*ti&tvCaDH-&r<-S2s4d>* z{=_Ed_%JI(=!NA9MA2&%R;^k$98+#c5QuKer@lpL+lk=-{p(P!Aqk%$0aL^6s}?dy zw*EC!ylKs$$Y2Kuqg}@(ok+p=*Ja}5q^MnKrkl`A&pA^vf~!@=04n(Qi(_NF zA_5sAx>;l()@~vXYm;-lT}M$2yk7v(h@4t}{uJpoC+cjUK~vi+41&4|I&W!a58j4A zy@U3I2P2s@JFjB~IlkcZoE`6cTwtD-;*K}bQp@j9qN!ITno2wr_I7B=|Lx|+M@w@V zl=5yBSS_X9(oo?6N6y4iiTE;_Y91sxW7rNWIh)cV$Zs~xqeoi-HL?8bOyF63VpM}W z;U0P!Icxr>N(3G&I`OsDiFx0v9IC#-IIlGSoAY%Xy9!GDm5iCU(1(?@a3zh#kCBQl zuvRd3WZ$)+v-mwTR7A$inO@15$Y2Fi!##FylJ=sW)dic-Cxv)U6mz^P=2*q+tu)sk zBkLw~x>P6?OQY;^Un_ajyE1L4xT`L1VtBFaVT#X-yFOaeH)IKLvJyCH7jT@qvchPB ziM>Ra*x`l*0_j9LDzKE22dl>A%B4-*b-OAoT-ZN@<2Fj5phu*jb_9?V^e_cQ#txYa z`qdihc~ES`HV8jaHGJLKq@bePMp4@kLYVi6GZeYEgZgq8%Z;h>qKrD-?LG(+`0%ih zFo^|#e>7NIb+{B*>!(0v3J+U|Lltr=g``C1-CISUkv*wh7uYHF1V@U0O*=r1V3R?3 z;#TY?*5qvL!6m`ytd;z?`CG@Us7@^JSu3>_j%&#|W_q|%-l;UShXMq-;~5d+n!e1c zHkshLao1o-*db#z4YTGY_W<+K#smx6C?LKK-$O&?pc_wncoJujctRd~;FTch#S)6cBbefIj=*(3 zt+KctqBcp}{19jVWj#3M%iQyk$j4p7rOyl*Zad%pBg5Cun?HQbxYR8|m@E;Q=8nHLE$#OfF7K%1?FD$s{z3G=O_PwT+psH69KBud-Ng z5+J@;P1kWRF-LnD;nKM46z=T^OgrJ~`bS`jxnAWHrt_5jOu(+i0EBGYZ4lk8RTyM*)sZ^ zGSC5IUQ^I$4U{pUIC{Z3jde(s6*0qF5tWR6xB1~Mf<=SN!J=(W?S~ZwXJL1-9BXM# zr%#1bpX&63|Ge4{F**%)la8k*3=hg%!=r+rfMX>WO$qMnP?QhBJ7^M6RD76^2|LmQ}r;ME}+pf`; z|3&erJr1&TaXK86w#a1K2b45#krzN(oV}OYmu{kG0VI?D$nFlL1be$|`{MV=fIX+U z_4rbn$oA4qHWM5nN|4K}b`s#N9Drz7edZ)GL3(5^Y%jw}6L5Pj`j~)givlvhV*gEj znE$tnLx)Pv0(6K!hw9$R2*g;Rf@NojQHtCnAg<eC#;qGkIbDda@c>)O5Hk(j$Lk5(Roj&v~{!jH6nhyttUv2W|lFQ%9A<31Fw;U?L&FU_{U1Y!^cQ7 zqT!{?$5|3JOyU41*T=fV`Z!*^w*}c7VVA!y)h_=9DMa=_n=2^?t8b53f)nU!ULOB$ z7C~VG$>w=i4!7}y+TjHA%zd?jCt|*(fODR?|5!mV_=x7qdj1zHu~kJuoh`Q_t*>KS zI$BSI7wZyn1YctW1H`OM1p}1Y&q9p(;A(p@ed67PF17LGhn?2f(2W_ z2`SGWp=pj^b_;l&`#)Ut1@m5{f%RC8sfhA4B zi~w!Lk>>9uld)GNp~bRV?4!ll*<}*Sr^Oa$o;+R3$SFtFsI-=V$cyHYl4$r^OAu;~ zoJi76sQzw0d%vQ!VoWgebi%)2^o|}R=ED(}+RFO2cvoIaw^`>|m3*hmyRH*@P26L- zgFa=c(`af$SiTtd5>SOt`Il?9wdy~$S3OBpy&k8c`Lu#54t{EWb}jrsbYy`XszQ#A z9EK0^#hq0kUvd*DK$Ft{+w6nj9tFZ-;ePDzWhq{FF)fxxw)(Oyh@;WsX+dyCs%`C- zZ&Bn&zmpea~v8xb;*-VLmjWHI*j(REiV2zj~6;Y*fubCHXaY z6v?kFq(e)7eJ9H*-N~=DER(;z>l68w6$z!UCgj#jQ&uMG!%rm6j&whAcfRtkmku1D z-nji!{(DERf&@7F-^kaNr+Rj+QzQ%7Z~rvG(&v66JFtl_z|waE>5adj7uc8be8`>a zyB`Z!kP>LzXwxOJ0FWL=)m&H9R8& zs^7$rqG`GMd13gq23gr^AFzrF&HtSXKcB2HiM&1q|75EMe#%lrj=jY^jjX><@BAz4iLQy7 z0lXyUf+*7&c$Dcdp?aSW%qh}78IIl5kcxu@|MY|~L)dH#af zIw80OFC^k?Mo&|&{h3|2$XoK{11yK8m>)xNI15!t_!?QoXE3O7*Uo2o5FmS1rMgZf z6#^J{eJ}CiIlF+$xa&=8X*K?Yq?ZQCBCRNxLQJnLW1I0c+u$l~B0rJ+gTfw835?+>sxsq@J3HWc+7UH>0-fZQK0Q)t( z4B#l~agrN%+#XMIeE328)}QT*G5{3 z(cuj@-fes{{3m~;`M}CE=mAOTU1w=x-}`_0UaV<~<;NqmSGUNEB*hw3^8)2&+?eaq~FuS;!Nl1JFt7#=y*WM<<6UnC-W z=VmoZt^;iB^~|@i*%3({6t`kZao4#ZmFzhqRT8?RCY?<^(=G}mJIB#-wY5hABzNXW z%cUtwz{=KN?)wdo@pjzx{8RS0+&5uMP>N3AIBj8- zygWE)iuS-oyokFVe1>ffT>m;2ZotU>M37S~_iedE#{P|q(9qoV+yuqxIHMaZZw}&{ zO7%K`_`>cKtp0wYbOg&^BgVuVqF6hIgCpBT3fjmbQ!{yqeH0Yof!}=QDtc0M?j+Tg_126{cZ!^$$uEH?GqGrp(Qak| zt63D@P+OSE+*>hkC2G}8A_m~#hGi$HtRUo@pp-2$pE&iOkS*Bq2@D5|*n3z;g9PJ| z)ovLM&hl`Z065iv&SmnJU}`D*r1E{bHW3-j-dS_>*p*l`NTsD5P(^^EMm5n>nO5en z&3s8oQ4z4wq99X6eKJJJnVoqk$;oP9Xp{Npi}(Uv1YfWNQyr7ft(^yV0*-TK#g_b9 zaX1a)&D&N9Y_me%+w;Nv( zfzm|sWH_$IYnxtzX^?XMEvLXGM!7<(rRL8O`z{sXm@XBUitQ&h=!i0Zre<@jLur?D z|1MZ8GWGx$1*h+E6F{U`&YACVI|AquN>LC>{F8RSvDII`pDpA&0-MA?c|%~+Tb4CM zqR!aB`Ej6p=gdLc11j#RF?NjCA6UzDK%yp`7>u;CDW+-EjcW8DE=Z- z(nKH12iJy1tItN^V!7XIOF247UZc}quwM}9%#&e3RXd;9r_@yquQQX@)Ffw0bdcgo znx7f+Q>Vv}xY^C^PFWGXdw8OI%{p4n?jSU+lBHB96u4`i3gOKvve!-`B%xHAvfT%( z+i@2ESHV@A**Qi=uT3#R2Nd=r1aYLJLyzivF>GbG?=WALJkn4w!8B`iy)CQGhlQK) z(se>V5q;k;1TJWtC!2q|US<9XswA9Pr4$?sE;DP`!mC$;y*RnAjVBusi7>!X=A$;@ zlciStBw0DTPrb4daoBkZrGN+*?MO@O@h!{K8hQl0`F1XHhsEr5m&#Dos)U$tlTEyY zQR+*-P(I){*qn%UJ;FQvm0 ztaJcCm}{51M}qv!8j80cW<66$f;t}}yEuNA5Q4oSE>nUDu4E4=e@J~$4m8O~^-6tu z!Qd%*!BoC~fx22?AWcaPi>+c8XPd8(M~ShcnIK?0;E)1@F=$l+(Hhlqf5hi>m-H}E z?`C5ge(bnlR)|6?^Sk4LJ;g2CO}#WK{$N?GC$iz{O@1#ecbh=b@{1W%$Lik z5wMz(TyFwolqQZ@rItRD-O`j=4n=mxQ|=~nx|D0gy3@J9vYn?Me^yW_OLM_G!Tf!M zo;^bWShJhoKE#6ukDRT7>iF|Gj1a(>r~HjMBXr!m+VYZsF|=d@{C>`5*ew-bht`RB zC`GuU;2dkSSkRp1kKRLOiBu3Yj>6byQo`7$DQWCu7ctH%0%ISGZ}S_knSYe^txC39 z=1CmKV1DQ3J27PS8+&JBZim9<%6vKWg`7WV)Diz0_xR{n5CAj6*A`SFQ9MgF7gZ8V zl0mK(b5=FRe0?Tw=jeo-D8Mp5$S1%wvednEhUw*>&dDn2={iz^!WZo!CW{#N0fbpL zH}Dp2{IRT(FJ3oem0XD$q2doP7_Xc6l0uI2l<)vOel->{b%||;$F{m~2Mm1hrk+lLFA_iSax_JR+%g6p z>Ax=L6_nPx_ml$2J@r%y?UwcOMyDuD`kYF!&MkbysT35`spz2hRLcAE0(7wTJg%}g z{-Goca4O|@lEFHaBAnn1{MOqFD~YK=^fZn$=<2vi76-}4Nf9!ieX{z`qT;UO;;wXrcALzWOYFjA{LMe`q(@Is z+dwsh45nx(WxCwT0>QjYWA&KN9ocscef#r6bL>f~6yQ|nhpfXx93nEVrc1BJSRq`iDJJr=3fNgygW#Oxappr(|HJSPy@Z z14Ne+>DxX$#7f*Kv}NY^?2|(w7L|_IY;|a;4gh1925z=ceJtxtR{VFyCzyS{KJ*Ep zCFd|r9OJzDXG{~z!yG<9(I{K3BEQ{9pdaVT+;!*lojbueaJ4$L*oj`|G_C>T__Nhz z0}O`aSZ;&H)`%!-k?By2dNK@SVD z0(9z@y;4GVfKV>?0(cYCfri%-O;=d*V3ggr>-@u5`&7UV0RDD8dG0lL8+FBkx|yRZ z)-eFr8bd*h5bJ`^)fQ}OwW3w2S{q&`hL1tH+CB?^m4-2u)MGDOSyfVFldk#q8QIZBX_YZCE86%Yb>oaSKE_QT26c`#F5}i; zj?~;w03)IJLhJK_hKH9id1<~oK?Il+i^<$%XXfzV!I|Zy`5Q7X)s06ArMLa$+_5}0 z1j!*)CMIwch#b%kSzZRUMJ-aypkm=lf8&-9S{tP>wLhqc{>Ccf5oeWn16dfN*wi!NF8O7_iiQa|)#r^33fo-`S~&Ws>W- zM-@AIG#9ol)|750OfXsUdd=*NLvME#X5@TQuGw8K2^Bo0y zVpOwVx@{rP-_%H+zM$IqC&ul@YZ;2@?KAi%!ct>By|I_s?K8Y9kC5KRTzl5YB{;*J zO;t;SD5+yK0KlmQCu%FUfk@=T{)i+1>m== zpixku_W8Msq@}B`k&YSmvOoV2%YI;FHHBi$tEgjXVnyfND?RxStV%iVE^A=_>Hn!! ziLoptZZ@BxL^}L`UX>@=ExMWS32it1D*<+n(OXIxYE z*?rLIp{DQ8-kX~P(7cBcu!E7uc2!$v=x=1oA?X^UjFXqEntn0Zy%E*gw_4JDv zChsdu7V3Y|0We1*AZEv49{D}tAVPyUqslg$2;$zJ^>!3_c3S_6IOLqAGEY|&qMjgF zcXg6xu|r3am^=CnAfZa+|KD;I15ol z`$dw%B^9H~2vmVn9)`_(G&u;8vWEX&$D}ZSYZ7irH(&=%r%#j9pjNcDfO2kad7Ttg zhNVaD<pD*OO z7ZT*I5~JD|@Qd{X4R}!`p!1#(JJeanB6G|ZNpoouUOImaNQk##QQ4$O9`~ZM!Cn?; z$7+uRBwLb46<@G-1KTTkd`3FW8k%v6x~e_wB88_@1kmaTeYROa9@)UYD$?N6OJZ3{ z)}SnX+sri=QUFruN)_$%cS>DUYM%DKApgDphK%lsm;hz-Xp}Y$1YLbgU@0>1;k57w zYckK@!LX`?Ay&eVp~VdNPIKNnY6h@}!(*(>CwDUcJgVvCwy%TRUXYd!A_@oMfp4a^m;l~msIG*f9ov6Ny2^WiNmjUbGRz?N2Bq#I(-- z%;qQXXy0#F5+u`MnTbnOwRKcGKo$R@FU>EPNLNN$W%kEhQy=X=cLIcmZ|JX8p{*w= zlb+6}zC?F<&;A1`Qs;#K?(Ow=JJTfW8P-lsp`4Np$j|BI`teSdO3Hz4p~LI<$HqKM9c|Y$BL-pwQ>XYyq7_wbcb_64*kqF;{Fz%QMWQ5{4OS^9@g~eUfWCGl69vaSIaw%D*NFZv z-<6kdRjTu1;+h5rLQ^5PhqYUlc%<`g^KvKU z0)K24K0|AW54Ie$$jOI%$d#mZktUx*F2(B=eBcZl)2X!SZi+3Y*it)HCGf>`w$HxA z_IWy>7fdq?;NIbGM6?hU0J)JPm1`cUPpj`-=oBtto%baazG5=tqYpv;r{>FvFH8)Y z!QMoGUpuQ@Jn9v-Aq)0|&Ln31nVgxig|1zHmjm8!>=pGd&iANMK1NT!fi*wU+x0Xy zN{OUq*>YkLwM`kuRg{g;8va7nRseY{X+BO^=F1RKl*e2o3?=UCVXi9m^48ESnfe)O z>Pvd}ZvvjZ7;`|m&0Xftj6|Ml5xuUnm zpeLn5bn&7F?IV7geN^0)ftkZ5y=a^M#{SOJfE;r;O<+yZ;d%K2-rTVwD$U6-4Zzb4 z?7I|;#We9IcZn=PM^F}sQ0G{%+MFYtri_QrEyHmeZL=0ast_x69Sk@ax0w%*l)>l+ zLuw>^ZfhWd;LwA{VXhj7P|7$|r;Nju1C7JDxa-RZ<6v1@RGQ~*Qy|`0C`(E8i^bl1 zATjr?&2+jc0E|8^F!~-MD|6QfB_SaMr*A2(ei|TOo`C$vNLa~#8;R|SL`m4jze!?u zB5~V#-(Jv{IzPUW(R7=B1i~zh>@^Xp>bj1p0WSr&nI{sOf_=nbuYm{3>0fo}>MJ>A z4%;o?yCiNlGgQjOJetOG|1-JIR`)LVa`pOdF6KWjrY{SrAUf}>MtIcYkoPdzVMLy6 zg_f!bUndA9=DPlQA%`@EMcBcM@E8&UBvSk*FHzRsNm5n66YnJgCJ#}I8HEd2^J5vd z-(^w;R(y4U+G6Wup4_(KU#KK5_Mlc-e21<96cwpH7UY)#Cy zjtv2_Co@ROTkBQP7ftUo8TF|peUcRGVx=No-jLCWPtup)K zZ_3O+s7&VUuv@iXsWM-6sZRG}d=g|awVm#7QRbzp%)6{I`*K*loJWd;voGgysNV0p zPkKK>m3lBg*M;EephfV#^-Sn09L=t21a=ss#cGWDR9*KiI&{CPdf70b5o8tv%9J|g zP7*};*1;l2_$CZ(s_;#ic-ar;L()HX%cihcY$-~`!$VD{xeG~FWb6%R^HnH-j3S+- z2cLe+^Rl>H7xTm#yOxVN5!XqLpWHv9WCu+9u=hy*gCrM|EUx6r|8k#6+B1?iQqp3% zKB1Y_20W1*gqCPn#i5Ip@0pSv zi*j3d$KpK+e_deumeFzOV%ULg3CFegDs7SDmy)9?yh}H7ALlmi8pen%ZFMwCsr;z} zRB_jP_sW2A@Z_J|*sg6}OQh}MhV9eo!)OndM;?Znoi%Z|MqhLf)L?X{`t2fDeDqlE z)z~^^MDt{Ti%WViy$TqFTqfED{76YtXAQM`O3w~EYNKa$ao`J!9dFr8r`Cv}M4H!_ zl!d*6*6<|_R5xM*^b!Opt$d@__#s!m)nZ4HcS%M;$C##YuD0T+m!wCL_eXUdMPm1u z4y|z)3A~8BuUYzYf4s$CgS)2ISvPr?WEM1ysn;4`CXZKJafGopvg@MejzPv7-gwgy z?PL`%eeJP@X@&9l*f?C4_Q3baiwWCMuhG=`OI7v|b=Z^dGb6jQ^=313>-*yxrsU-y zkl^f1I9o|4yXLC4cR5rGy~dEB(ZZfbw83es*$RQx*f>^*>EMJpvd0b;87*Do`({*m zylQH^vB}Q3YlO-gKGwYV04G|~&}F1W+TvZr63LKbHERCVbP433>=L6p8}6MJ+#CD4 z~@ zN4>Jln$<0$gJ#|*~N{fkXinZ1fYQFuhXDpGD3bb1XSBWfkK}EoOi=G$xAZ(}oe&$4~Q8{And7wO{-F1Ae;`DK?$|-+{jEH-^qc0Ry!E zF{_x{Q;SKqzh5~`AfrQ#L#0*D*#6}JW4a~CSu6IuF_*DN+AWeD2fY`$k8YoOaGU$B zEX$Hv-ltT7xs*KDuskUyXK$jIR}Rjz$I4Tg%=7rcc}A!mrRzt@JhQDl&@piBZ5FPD z*|xy_=X9O>e42j7Gu%h6ce4nI3KKw%%Kev;Efki_*fFuzW2V z6w`Ah-$%z6!f=N;R6LQ--V#;GTU07k2vUUAsya+$1wRma+Kcnu>aYz;z`>mO4^6Oa z_&0G1L64jQ6CV$iP#eBvLQd#peYvW5r}&XETd$CciCe1b#h0k~QfV`%sd}Y8w1A2f zf)Wz8tqFQ=XIQI0kriXG@mog-R z057xgRd4T-@NIb{E|UzR1(HT$?(1@n1n)$VE>|%EjxR?D<`iVdKKN@MxN>TS^ZL;l z94@VME9~o8@|nmCbf@_|+uEf%_HOc>n9am!2okils@>b9_q(}m9q+zKwGgkQu`{;M zr48k;hc2>)_O87$w9+f%>*Q3%i6Zp12tH>`l?GdrY5C4ob2%8L2Hx$5NWBKDd7~9o z;+7D}hU1Ilq*IQOytUZ*lq?g;f-C`Xu{nd*+pwV66HkKNFgr@-o}e|BgrwM9BNJd; zm)}*U8x!;JpUIY$4a|lRCLYYTCy)5Iv!IFiVqka?>^l{Wgyn*jUHY`zkjDs;)1tc(0Fo397U*B1G)ar=_(s|38v z1CVL zzOm{b+;XhBBRey%~2ygTfv$T*UpOy z1>Gg-7t|FL!>r};^}T#?Ajerh#+f!hDC_DH1-;jJWSGaWAf3|QQ<9VZ#a-6W@Hvb{ z9&t|8yvJSd@5-ejg2tsR>eMX0zFA7il9>G#tl=Dg1vbi@A+~r;blSB- z$ZGjoM7=S`)yM@|`W|PCM80>*0IyD~e?)oktCCTrmMENYhwQ^s%TDQgLwc3lkY;3C4DrmR% zA|{UON>g|i^Nh*Nk1*%a%vDm6*@N2&&<*q36q;^k@LFbDg+{4}jk`}1_u=W56BK`* zI1kr`dJ)U&#oACms!)%IXAjSnJR`UERP$Wz&uk;9&Y#&tDl!D*=_^{tixp*BSFZW< zN=RG{j2_jRKjwkfgNrZDm)RU_E|rw%`25}>OMx9Y1Tjtn_iU#ku(a15^%j~}@J%$+ zyhbkLvrI2n2{)+Oy4zxv;tL$JcTIKEu0UuZ-4xoBL8yz@*9>L8r;_-C8-s96EX>lgVth&j~CZ zs@VFj$&niiba0X!6BR=$>XV&0CHWhk&gC5OY zDhbi7*VLji9|Zw{=aT%AY*3X1pweHnogJ#2X6^JfZnz(s!%?v|^EN&xZ;4f<-Y+Uv8FsZ8X1Rq1b)Le72Q*O)~knDtUyJd}A{CNtK*s zB~MQ#|4=1=QmZ4rVCBJPY&q*eSRq`4ud2TYfRwX}eCEuM)zEUNB-%4JXOx9KM zJyvognOvrlYpmo4lgX#6?7&WvoqJDnJ$r1DDJyYQB?(Hu5OA!Wk4VG`n}7-;5ht1j%5_(fO<^M%3cixZUqu~=$`)O9&HV;dS)($uYMzs)VB#o@nW*&xgWo;~&?c{Dsz zoy^O|4KE4d)GAsQJC5ere4aL%zdccT4aqvYscV=yhD{F2!@;n#&7^mIv?L+HN$`91 zW4D26(~RxmnJ}H!2(^k@`wz{=FP_?R}rqsy@-w`=j)m6++z2eQy+-s zyrxHo6>xktly6MR36wX_9Ab=fW^zchX(mkE+QP1#P+8<&YMdhX6r|0QyCID8Ag&o| z*z;}tzGS;8qQjCmnbsp3c7(I_MXtwj0c7>V;`8dqJ}gdwmTV7YHM|+lG1m^^VWWAm zTdb3fJ(S_>k?$-8v^SF@VulMt2Iy=9?r)UF=lYrmRhTtl;J)VdVF08_~39 zTfB`oA{p&8}} zKm$ZHCih#May$f;lr3D2=9?=i0wwe;^H{n|`vY9e%W0#zevta`bTR`umzhsekogur zjA0Hr7gCrxNQ#{ycQx{Jhg5*5QBoI@m69FG$&@)oUhl|OWeu_hWED?o=Dk#t(g8I_ zm-DGw>V*J1Yfa|PJW7=7Ob?6s_Sr=2EHKumm$Fk+@`=k^2i| z)hrUN;bh)6ZU|3mbu1!@2caI1Dg2Xr7Z>wls-UAo6w}v<-IZjx)XHGqNQMG3v^xBJ z4JfB|IhCr8x&WEQjH&q|%R;uU5|fd0sBPxEs$rp{;Htc_$_&{WWyW0%Qq~Vs^1}7B zna^8!*+Ly*cClj2<@{igVZN!Z`Q|#V%ED}`;WStNO-*YfBgueIMNEM5;c9Y}y!qR7 z^8{Lh9D6tuUt{Gc$1SW|6ckIyW66&^32_0^X=`3SV1K*Ry4}Vtc=1AVFXcK$u8ApA z^Rtz5)x_L_0L|LN1`RLl>udOXGIJT9m1>A>X!l(1GuQ*X>y3PXK4OEnCyjs|Z-kEa zvPlcpRA%kj7RY=M0>QvcWIXISX0U^(L(VhTO&Bu7^d(!POK{W2u;U;k*aVvy}qsb)4_z-oj?ie1?~Dyr&e*KY6I|R&pO{VqhJ+$bew#0!fZK zp4H?@?N%Kx@CKb0Dbj>i$9(Q&;#(b2`)(zWo~Ga0B&cSAeA${MF5J_4(~aD_za~pG zkmXJ!vL(#DHj&7Ok0D4kzYtk%M7F?;$rU1f@PIDkt{9ClWgy+nQZJT z)*tH5`}Ym}2^?33AHx0w@0VvxJ&D{3CyeNkK++cYRWEmSzRdQe7M=)|#g zayibieBW2`$X@rH0v*(6V=?Vl&9jD87>>}<>1p0bTY5#*aWl7F*`!r-vr>?5MNHpc z-hJOG(pGA(Fm_1oiMqAb9}J!~#CJq9-=4uIt&T7Dr>S|Yh~{>4tF7KWOpAP93X0}R zFh1o5FM9l+tal@3-A#^>vu06zdb{5IzFR+{U5pmp0w?a1S}te_Uuii0o7|B$XRG58 zZcvz}MIArn&fC-C4wXjQ+^vrLcyy>2_i(q8TvBP2KJyNRE{0t+(_;UrATP1BY*MTcUJ{Rovu51S{nmR?H19@W-kQeJvZ&jvV=)=lCrhK;x{7IPth;CWv&r1PDW1D;>G9o?NDAh`wON{5NAlGr%9zE zBqPoNw=e-YuujgHo@u@!ix0(qJA;K{U&f3eBb|4qS!)8CEd?xv7nE*au*%{Jo#A3) zDUH!H+iX7Y#9lt|n8>OInswyt+{h|fyJ;cug=cYbN`Dy39ZD*qhaXUCFGf@IXUiTr zy0~vadCjcbJHjKeXwC{BV_fczE$sO6w!cO8X3TbR#?srjmh4B%$ zzt=g!4x!OJ_g1^NgPqaaZ0F4(XBUqT31P$6Yr_Zw((L z$A`qTfF~qRXUTojRq7sFKyNaU*gNtOPcjnfERz1bTSVmy;Uh8 zdDJmYngERJ`W}{)V}d-=jcF|_(>y>kZN~mq@M?VYIBMOrX?ePmj|xt3m6%ub6ys^LwUpV;wNTHjXo`?mfN-zs`#tP4bScOdFvU@PtGUQSONx8%XI>bXM8y~en&wwlp#Sv@UI!eSW& zr&ya69p~(6$xC_6@z-PoW8<=LY*kSTwFy`Dv}A-X#sI7E5Jl@ngv+|@EAQ5ie9?>Z zd}uY?Mg~S1dh9YM!RCf|FJSPokrbrm0S=sXyx1)U{rt@~f>M zd83!ZWgPOCHF)a0?aBra}x z^;qRLtx&acBSyM)+k8;d9`geDhYI5e5G_JOD{fvO<{I_~Hk`)zd}B)mlz-Ys6AA9$!!Igs%jgJ(fMxMpKZsmRBK1IF%IhRXlm-;mH%e_TECa z>ESf#N~QQ#Cizxo6bGLSvjP)9K!3IS0Jh(f^YwiE)Q7!ZYkCwY3yMm)g4^ABh??$=*~#BnHH)3n3SuW>pk1(bEVVl z5iL%%sv7qTrDmt~FvIMS8&S0iq6ruio!C#g(?Il@IyooiRUlhvN6Sny3RjjDBvf=Q zlE03-LU6_wIS$U6bn9%6Pj-u175sE)AIqW$ylL?i_DmS(EGSdV+T|SJ%L*egaGxQ| z6<%$QM>o7^iJL;_>j(sxhM{`qWcKg=Li2PMZkN03gr2lKPJkQULLH+`N`R0Q41~#UdnaIf{UbU zp_96fHt(j=$lT(z`<><;+{X3dz6|J9(kSEZmi$A`XDUyzpM?T4QjBc{C$}+>ZLJ?u%7IE{Z`6La zfCL5?O`(y>1p_{Jkw?v^U>1&d{RAg8d{D^_k&`#P#o=~V1@SpD){k?NL5W3_ee8XT z-LfSj7OYDH7${7QjKQYPw|eB{zUM=A;=LieUn=vK_)~rTKv-3a&zv%u&CL{ANd}n% zxI#DrVNNSmJj~D52nfl-J-#O+4}$=}Inqg;^rMP__pqDEqYQyzx00OQoMm7tU&5LjfVlGf9l@+g&nU%T`j<6=sr6b4tV^BuuT7(DiQFECTbc=~T zY}(W-54!RSa1C-O6q{fCSJEqB?|ZBvAxBp{2m2Y>t7(gJ!2Y%TCG;B;4Kyf*lc?3M zP(7}go%WipTWNcX%f&(kYjvrk=C~EdGa+8*y zHYc~oF)0HHuGV-X)a2CzcV?{n<^6ZwmeC;@gyVW(9oPn@z#rK)3fK5QUt={>f%pv?==H};W4?j0lzxwt3!Te8l^K+GlpX;khUs6v&Tz|04 zx<1}yU7zfb>(}!YFU9ry%dF?0G+EbQc5u}fG)r^!1#9KvUtn4ns}GU6ET3RZrvtk> zg2r}#bC+YH@w3N03XI^sst$u#?pwCZGnX1sRW z&5}cYu@gI$4k=O)`%p>OVav}m!$O>uX(#u$4j1i$4j14$4h&D zuNtzx@Ft+>1jK>tI>ZP-_7db;td|T~FSliMlc64n(H?k+UkkD|AUiJ=vL(apyEKUh zp;nr9=Vf`^TPaW2iy4;p72qmp0iEr5z1&lZKqBoS`Q^nA3s7W3SXkJgV7CKgr z#?W9b52L88q1sUP56!`%7A(d5&7IkyJGIl&yN30_2ij@gJngi>Y~_aXSzu^~zMxYE zf%H1%~7}P(_QSc@!A#CZ`r6&SoCryN4dZTffnw_$1*oo*g7atPRl^{M4W_s(PZy z<}Z3_ncVf34?fPDS+1>kb7eYz+6(Qq+8t|awYsJ>hR}i^2yn9+vRW8zdN1#Nh5c}vpuc=Oq7L-Ij-_%ppk#8DMaaC^)PyKn#X=D!m4s`wOc`{IA- zNrL9~zGwbuoPU+HPW}Sg3$IDV+5?|6>a~9Dj^K|&Z293k(PI|XYlbmPQiqf^B-tvnmzsM@T$lJtiJO3U0cZc5s zK}ZcPt-2ORrF`k$@^-flfPa(Io=}A z|AwS*(-hz)2O_6Q1l*!0o zy8xqCP6^krGho|RG1M7`-DSYI%?lF=)0;21`Qh&}%x)Rx*BPWyb|s;oCcek*MYB_0 z|DD&_T@iUq{u>q>(~ z|LE~$)q0INy4Lt-;Ltuzhlh*u5-qX>t^h|(nQ^0Hf0nq}Uid%c;lU{nk)QJrxo^M3 zu=#;?o0A?ome=U{kqG%S*Kt-lj_Z`U^X?BVn3tw@ZR|Y8zI7ehCF(`)Chp7^PF3oX zBW+9Z*Ri`J*$C_>N+>Nz^Jn4!_$|{(+x^BwPr!K9n6e*n)$0{_gz#tnN%(1mI}_ov z*-^$_bH-8V5OT-Ycb*G9<;2>nQj9U*jl|Di^p&^#GcEEPl6*$9@wOK|Ugn!d#a63} zq6gtYx;Sfog)uD)eX~1M;VXI52hKUii?fN$4MxSrEc|KBJf0iiW$&zEe3DmIu`w?^ zgu5K>a=@4IwZ8K9nVY=E24DFb;R_`XW#sTdxWI>@&3C$vk4;GbZMru)QLm8i=w~o< zoi~mI_XxgX4{bEl*o8zmimS1ZeX@sraxv1nQUrP2+d;9s*Mi36yoMaY9Sq(Zj0kdx z^MV|jq{o|pp3lLGz+Icj_JJqC)*PvKEZ@VtV}Il@JMo!gA#SyQI+~G?{gXqbnXb`l z`;>q;`+T4~GWNS247EBKxRfu5i|1hkbBB|P>A^3U2fSLxOM0-Z4&7vxXLNT>GjjLr zWS-XZo;ogBUC+0%Nej%`G{VT;!8?0L$r<-{^9d^(d+(Ok@pIw25!1d$G?%ViBliXJ zmb_`+CpEFbJXs1LB3>2EQ0GmO`%6S3GDgWgcx3D>K8@pCpsA}U?t1tlY4`OcVf65~ z6S;7@VQ<`}QIP0;s8g%hD+lS+menfFl63>h&(J8-%~w&!2^1k7M~L$4x~zwC+RUB2 zpqodwI{rX{v>!cHwh7OLYth~@H*(*9k8k(ILpkP1K8fVM!LvA~Q|cDvjv1YNLceT# z1w7zK=jI1Emm>5V7)*xv^PBgOS;dr=ZNWdS)x94QCcfe#GL3sK9GXMw1YK%~#$s z^VhPVvW&G|nV68tn6lpnszjTBQ5gGkd#+Ms5|*O*IHdj{o&zJtVJ)<2j8nh(0!>ruB_ zLopu_T~KSlBNdpGuiCn*`OX;{;WvV^-n0f3V^$tH!=*=$?7D~|(?gT|5{*}y`cIi% zDdb~rf;AJ+fowL97u$}={lhq7`>eb#yHIO*Qf`bR{jn>Y<^mB;M+d2(9^SJ1^Fx}y z=6m_(>MoLFIhoiO8e53dgXz*a{<3+6TEmYLwHVxxcbF6-jWo}bqKx){82D^9|LaqP zHRbY6=w=C=cq4!@)Vx8;g=wsrfbpF*h=NQedY23;$m-cPV#A*8@n&U};5J&VxYZK! zfGMq#$*l&Mi>(vgE#?|GNMN=6{6T(}%g?j?EH!^EzrFNLAfs0LXC*tlWmQ@8 z=-%gD*3_Ovi z300;;?+0Q!@DI&KQA2nGe9U1l5-=VtXeSG;*Ny)zXp`IwH)p|UbGt}Tw}Vi0a&6-k z0$iiae6~|McnL1FHwUn3U(O4JlS>{fK!O3-ytNo}0LqsD5xT4|j|irCz_HG4BCvvx zntT2#rT(m7nS2siSKaRrzGo^1G)ZP7_FRDo4A2-Y7RWXnV*O@mjOqf$AG#?+qQV=$ zR)8-Sic^SBV{8`AGCF;k-}nr9aW%tWn#Z#BjNGq7JwnHtGdUR+nLGD@*0>;x&fTv^ zKF#PFWnN<^hlZJz+!}M|nmX53kD?8rYVEB~BXN*tEoV7*IsNuP{IL(R!Yc{D9R&(93 zMYjpJwp^Z#D!2KRy1BSiI+`9ZW)zw}Gak214^B{~2l*)_&p84gYLwcrSW3CYDiyQ9 zG3NKU4;XVx&8gfdCzhORs4h)2e?Ckxk1mO2u>iXbao6=7zV6KAN1VXV4Hy%gVk06E z6<#``w}1C!B>Gp!T}msoMc2uzdEM;&MQ3U>Dv?oaYPWD*6!mlf5EE%CCuq!T#c5`q z?`cseF0R#PZFAOY_c!4ZT8n%QSP;7BX*@woFmk@0!G3aLK3lu{Il$vvT;8fZTq3Z8 z(v{(VSYc6P0>;Nv7u(II4yUplb*+LfrCt#_cS4ypA4p0D^Ol%K9YDrVudjVg?aq`3(WbX28{8=;_C=2fI7X# z8OYp4ciHm%$vlG{FT!35<5iY7zJ-tGZ>%tA4q4phC%J%Le4T1vMfr^dw}r0i6p77} zMrkDjCI)14S>=nxFRQU}2@t_;B`VHk(ke`FWR$t{U|zFWl2Et!+Qj2pu{@#2WW>#1 zvr-t-`XE{uc#SK5d?0RX4Rs6-lpb=)gGwE3t0A|V!RSOZZ4(n}$iwAJXdw@o4@Y$~ zD9;^lmXa+sBw??mk}C_)_0K2|Hfalw0zpCOJfX<|o)DI;JC&y`MTok_2zbptul{8j z9hT9f{8}TRVC%+$Qih6N!}Pu*LUl&W>VKGwX5~Mb*~na!5jWs!s7{o%XS53@S|^yO z7inEHtp(q%Fo-V*UW)}6o0|s%Z86vR7?!B#_jhB6WR@KVpKE?8{yUN;KF6xspt{_kHlS^ zt2Kx_T5}OKRT#e(TwP(j{IukX%*{&+T`g8o$DJo1Z8L9>c9m7-g(?8{Nt4zn7L=mCqw6q^Z=26y;}@C7_&<=% z8}$K8k1Si%VEf>EW5K27-S4R-zEqZYeaaGlT8q5E0HBq}TVL+RA0EIscCmDC2LIJ8 zbx(4s*L!8H@0JcK0}B@WyJ}1(%3`m#8?{^(`%jf@$=5{H%k`*lrTGI^Kg&cV7}Kn@ z`$@y!M@W-gW}V~^_aC3(L=5vs^9hiWUW2Eh%(bE8Q1KjT##Bm>lx9Kp^^9`((jMO? zPuSmo6hYQiRJfUIWx5Qd&O)r0(ecQWT9&qclSg}9<|+hD*BOcCABas*WeU+5Y!jWq zsYJ(*n8OQu(5nIerfex1@Byww~POFiQL_JOxWp#P*X>H*Q#Wlc~ zvSRjcVvH876AQnMQwvG_CBaEUiK4yk2uxmU;RvK}~Ie%*|TE z4iaG=HN9p|mN}FcFr|ZpDcxv%QF;~3_i8fqWY>p=^!U>9EFPEqL(RW-kQc6}W@46} z*)81q7j_yPypOatz5KJ##bwuFZ*8s|AhVRZy*z(nUDu2#L#J+wqjUX(Q6#( zh&Q3i{RDnWc7bKfGa7tpAxBTP6WcA}%(+bu4d*sXZnLmUY8b>(kL-};4+ax?huWCi z4B#QGyOaC1{`Td4#?NW9|220x&5uBkiSg^`9Y3e}1~2-L-x?XeiEL2p0er#wV5s?D zl35KPjE_BlR$9LSbTWW*2FNUF|Ca$AYYpHaTH_3zszy-m(?cWF5Xya4NRu&iG)!bj z)k&srH;4zxxx@$Xf{*LzD+*%2fq8ygP+S##ZVt@@otCn9(TzVAG?AgC$Gh@0P_cK_ zDg2hzdBQ~&-xWH!qAW9<2lJ&7m~p|q)uIOu9a&L!L}+kNwp(lboE5_2pGO}0|{(2V1y{BXm+#NkVukUHya4nk0_{MpiQl9X=~3(J=W6Ce`>8otG>}9 z;%6h;mipQ@_R#(}N86?zYO%HQ{(dv_>^{3JN_+aA>w4e+*}dku=bn#y?wPsgo{wkd znXfat8olS0aEH{o{ZO1P49xk(hv}H^Rrej{ot1m;Q>kJ@2~zx+q{1J( z_WSCkujKA+L?n!@K@O)qqW=oTJ~|6d%xZOY-({6mSYgQBvlvciK$W``t8oY9UYy58 zNncj__Se)`ig}B}#G|-${1xN@?4u{)CgZ-JMSTdl82ie)QHJi^o!^1K9_DtSq|?Hi zZ~uhr92E4{>#^CcY;njDxiUK87Zi9*XI65%FGgFhM%=lNsyR&^PUqHf6o91{H5cMA zf;$Oo`<{Udr$oRwFpziX;avWF%;GNgVCpk0nR{6(YY>17LnA)abr~Yuvr|r+F#N)_ z2Pa&jB{%>tn>6pA@0DS%bz!*;ON{CUZ1q9mjC?3YwMPL5&^HY2!V)p3HC4E(x~c>l z+c1@?a#!!J^(iYx zv4ea&ZpucfV@=^{@E9k5#hH;;JFc)T;|gcI%Sp+|se7|NDww5bN*Ros)l|=9-J69a zpc$wWxyLiM$4PyX=`rluK=FFauQ91_I$aKF!P@2hwaB{VTSn#wbncVxSjxvfMQKIB zN#goV5cIJ*fTIqPW39gT^_0R@J>$U=c4T!kIB3GdUA@cOTRp?O6J{689+-ZZ`=VIO zf|7B|8FOXyS%tYMY>=&O^`702=oxpT8+)VV*uB24?>0#4Y7aw&U}>eLr*C!7?wuu3 zB-^*T61EZ6Dn_d{n59MANf?WKQNOfcqt7)msd}i4b)}xYd*mVZ=**w94Mj=MQ@42Y z#z^sVJ7rGL9!2zg8O0M~!*N#~kT3iBeI7L0=(Raa?I>enh5m$b3(mA|IvB#vHMNzH z$`=g)pHoS7h63{Fph&8(`mHd7bR&*jb zt-~&=XciYtcK4JRcZWzKGAtv|DNZxx1$ zZfqa*l>KNKdcE%Iwiw_DeT{o+TfcDRJxbX9eL zoqAQDZRyk9*Wv3N5RR*`bnU8|J;Y6ekc}0kwTr7tyC*!CMmbg?7pRbPs`_dX^6-xL zjcu;l9ox%9cX9L=SRHuI?Pg%vQ>b`yr4w%ja9SY#jsg3|*YrId^`AtGIEpm`M|1#@ zclY#gfi<=b)S{2nsD|nXd)W_QJ~?m*O_TFU)tA-uy(L$^v6l8eTe57 zgV-del|ZZf{??1pXECwGR?pk;<&eoy7t-G$SJYZC&%>*~9lz&_TBdf!irR;mAoqoO zqVEA}*^mAQ>?hr2J3fK?8r&W~zOI+HK@WS-r@eXShbMW)L8*Ln+X)M5;CvAI@$9~@ zgtOqcojV?s4$wHt#k1E8LA{BUK}@USF76g`UWu|FPX zX9*>gy+6}q$?XH=JB3R58uLQbT-{PEN9W#!&*Tg4>cdPKRHLtmToYzB;$&Fssvz(+QDV_pUPVh7emBu%x|pa;^V) zPuk^OdrQAX9&>*$!UTu8m^8O3Y=lhILZr_}pVe+jGHkE+IEoIn2XDXa>VKB9W9 z+YeHFE%V49MUNsSEau0?@OlGgZ26d9a^>R4sC)_X1ft_ws0HsWF3vY1SCLh7=XK6+%HGTFY-99$2!wmm(IKCx z_1jB4X(yt4WIRX}-*foa;B1V&pKT@Wa5N8JY(P8BsXF-zQvtc#o_ss4>Ib%yhnC{F z#GV_OcL+y))jjeQ42nF06QOALu?+txI*K7ThZ?c`I@P;*yjOKC_#G$97u;HpQz&-w z;lCU+*+V;ShIB;EivID{n3Ko9$!3p^&>`(dQoG=bb6BwY++mbR9@a3>naw!)tY^oe zf~6PU{4ic5N{xbQg!u9(2$*W*CnWwi-W#HWT671FD`367?*+X|$R?YlfaPh0*P@uY z?>2V4mG*ShsM>vLK@|=O;RJl-EC^R*(vJ7jx-Z4q9PFUxYU*wVDS|pnbnx`$e@y>Y zi;uDHUNQAYTwizwmw9?lj-bqH`-Zr8s&5!?=WDSKyRPre+TGU{t=WB<3wpqr`2GY^ zQ{`}%{|;YNuid@UvEbyIzPD;H0^+HZ5HkDW;>EYFtm*SRtCoJy&G&fj@7t=D{;fNs z4(ECBne3gvi=^Y5>A0sCIsjGqV)RuA`^o2)F1=-(Y*23>szV#VdYTrBIW zfn4WhPz-!mv$LcZ@`=sl7)2;goPoIv9@x~&gD?q#aXpTXm@=W?pF=9~MhqMA`GwsL zjx|fMQgruTkgQvbQxkXZfUOn>-0?{&&+IE4wX>hWZR@uz%yrs$tCmZt4z8frEgjy9 zLx(u|$()o%v*h9qMswJFvv{>*+p)JV!W9Zt{7P0ryxPTX$JVKqh_B-H8PQUF+i&q& zM8xded_n7`Sb2~oocEV|2=F!;ufE^=8NMOLPd-KKpoclaI+>nzlzUX(9v96-4$N2F zdcM>*?H$B;dm2XPKZFGd?alrY3_cJz+XZ~W%W%c^h+oO~-t14+&$9mqs?ou2p{N>7 z+*$kF)9m8kcIa^CUhvrdB~n0Fy8K*f?!w~bQsmB@4 zz|*mH++!HniI*>ky@SR#I#1bOf11e(&BX)AsCm)?T~xozcxwtNjSRc~)Q4WhNTM$-?h}3f7dR{WemB4~|Y8 zuDyGY%<9`&YwmtT+8`0sjyxc^k>cV_XaT5**!&KQqc>lQwVCHJfY<^H@^Boh+|fRY zF6i?UJB)lSj-`HP2K=>sHPT0YDmvI`xp%^H#FnpdLFocT>2Xr30wvG@t!y*$r4~ZJ zokl_yI)B4lQGU_@bVfOE+*^1P>Aa6NkwnL^(D{y}6Cd;8NCB8S00J1I?JZml67m>0 zsD25K(Qn8m_8MvpoZ(~8kGfFnI1PI}=qMGAoXSm!y8qC+!i5uvAiSA`kwW@aWKkw@ zd?Av+;6g;#l2v>@M$$&lf9Pc422K8w7(%?-}~DD8@K&GvUpf+uJCQAQ_cu9464&@0IbJ>|$miwq>66bN%5<-j&(BMj_wjtG&R?|*qs=;e2npXd%>9A8 zpeFYR8}UV*p(311;&z|uef9WU(h+T_Sp>FA`VT^#VadoJ)X6cLJUt{Z-s#Eo} z$~t=52o}@ezACKbRE$kvLvY{|Do^jDMfTE%loqk9*ftMneb_%Q%_E?{wk& z5Z;|4JcpuAvyI|aNGUEw2}M`^h4U@>WfkBqiOXW&jxDOOZ(%V#l((1sAG<4|ydh7{ z(P6k*_;JPBlj}pg?=FiD!v7=qFO7vSWq41tH$`})zn|$ho9XYpr0&Qr?>J{!iCm8To05 zh-Q4->|bL3eRmGRM^(9Vhuo_|sd7c{;cKUuR!4o4!f3@_#eXdR<4!n(KB+_> z`j$!GEYFg)l!-($yP{K@`jr@r+T`SUQmJsy69cyrvpmH08N z&`A1w?{SmA$Tw5*XGeeP+!1j7)w6dm$wt48XbCJLy#tJYU!2}i;ydHGi|Iw;I7bwt z&2e0oclGUYe&}DlD^@@Bhd#jg0&$R@#!E+C3Aks}sqiwUf8q;RM8+}&+N5p4^S4)~ z3o(>?-_w0hqgBOZgo54oDmMSThP_VxI$!SfRIeUJ-Mt1Y!cb%ze$3(7-d-}Y8?Uwc zYT)hQm*k_%=(T%eYjgoDeS29J@udH#(wM(s4K52HuHx*8R`bxWJbDMigd8k}I=I^6ZwygiFJ*E`4Vdp*($`JpmA1 zhgSoMWh^t%hw`2HBvyQH!6zS=;QM3@tl#0!mRnV4S~iJpE8@O@=nGHD#fR}~o1F(( zfAry(CEu7xdaz$nAt)bDX>=cuzP%%$%c`+*jLiK<^i@WObD1d`($$YhdKG#jtXzdw zL1eRxJ*={nAZJ>d-xa z;3H#BA;MULuab$?&OVIwewo-dymvhuy~#}I%ZR2E`XsDKXq%*pS@+4pIb;eyo!*tw zN2gat!j&w@zk#|=@AoRb zpT*PTcP=dHeP8Qr3(l*n)78}h@P_a@$k@e(|A7x-fIYhPv4n6`^CvD*1P z%BEiHRP{IEI_YJ-T%`{LPItLVkf|zxWBj+z!_w@6N6A+9)7a()CYOJMD~UfF&jjW7 z*Oo~}(`UjRa-9`^*^Iw;!YI-n%|?D9p5oAjlu{uc)$m_5yi3Ea8vay685oau=c;(d zJOw9dI7h=38eXGeM8jSUKd0eC8vat#dqv|T8lKQFN2l-7aA$=|_a+V7HN0NKbs8Sh zbRX96ehr_}ba!cdmJUBfLx+aP7pQc8tKqPQk8AjlhWBW=Rl|)MF4M47!yFC&Qm*J; ztYN)|O&a!S_&E(9((q9Y4{11}p;<52B-N8U2``$j(tW5*K{K9bp~7EZr1{eRkLYqZ zm=yj6?f!sSPTK!o6W6dn(|tAAf;K)z_$Yf4k6u3drR^oyyz^`**!g&%=3!fo z2V?>^ep?4p$QqrVrAAwGuh#l!s>JO=r2aVu^= zAL6rkIQaqr9a%WKTkfpM0%V zDdh`c3>Zo`WxWH&1rvlh4+i5A*>pas;W|LZ|Iak_ZRg_}{z*eNB>GacOfw&_9OiZyRJCB)_%y%&j(Barb6^+`s7#OTm*Fk|)8ykPc14d$ zfbK3BrUz%KC)oVy&a$BUG%!i%24vH#0t^6N0@wn$5O6bKF(6nGHGnq&t^wQvxC*cx z@FKtt!0CYG@d`lZp#qR)TL4HN&I2T$9>5y`O983BDgnCyF9&2juK5xnZKyU$0-zTUBzd;^H-#CmIZ%h8fO{u=hk?uLd8anyENXaah5fIJsRJv zP|>e()&YNm8fRVbcUa?;DgH(@&N|}ngvQxE_$&IZ;{O7LiZYE;PWkg_oNa?Yug2NC z@E6iJ>yE!(jh8A^?9(`9g1L;Ip*(##wkPmxgJ*hQkM8D(>Udu zKaa*K>-=rhINKY4ts1Ay@z?s{APs;uf{Vp-lK80bN=>eoH~lX{Tinp z;qS1L&h*G)`T{Uzx_K!}xP+oVtO(jT*Np zRD?9nw#?ryjhk(EK;w5RZ*f55)Mfk~*7#it6(btITjOIIr~c&6@qNXAi9&@-ajZ+8lH>mN+3Kc^dmt#4&jcA->G5$_yJgiXR zz!o)@)lQ9h8V+6x4q#NuGBX(1F*LKm20DfdrRYjm96j2%?&=c@? zM_AadmSDKU7jXr`VU&d|n?Mf=S7|DV%VI_eqbP`X`Z@xZqL<~>(%tFjh%vdwTZ5>k z?oL#uzg1VQ4Bys_N^EOs3y|TC;8wF-+S=O#n|fc2_VI2Cc79DN9oJTH1XuDcLq@}EiK4)SICE) z0r$7IwKr2_{8C~R18|qMPZ;!XNoX4k0e6!nYqPPq$LN4^B+1Hmnvw}Q(^9CSFJQ+dlh`NJ{ zl_lJ@y(<#nSS!~0nUs_q#YfQZ@1~}U`FD55k(tO$V*VOLj_(9lUiyJNIs)5FK0sb`0-g;nfy7_Z=Cf9 znrBY0>Vg?liziPiESQ*|pO=^CbUJhK%Td1x@&|gW+PkW_{9}qH@KxbJfbOdUk*nCM zq!;k@R=l>eEz*Xb_NKtfFl>Hb`+AH!px$cKjD!A{L*drQaYukwNoOS#StL-i6{CTg z9xP@ke0`w97itZL18`BlBzGB>KFYnJmHIFg47N8w-%!tixl(J*cC|fO_dJm&^;j?(-H1TbYecM+Pk}2>s4RB0VNe!Ax8tMlSMohc3oRj z*caZup*7HHGPW)d=?-@y6e?k5cQ}mV(nNycwcQ;}GSB2kmy=eCbx@Y72rcoDPmFSF zRYwH(hBp6}mBH@L$f62Ke-(y!wVi5IhzeY>-Q(+QZb!|LKJt4SfBMS!>t$cWil|3l z(bg5H>S7c+VErU6C&A8UNJ_BtDjx=QYShpA*%DZp!iVk<%v4@7-SzE(K8*7Np8W9S-(Wt_@UO-B#p7Y@8gfmuH&q|UbxZ!ZokZFGd!JZP zm-(ptP{HK>ob$avk3SHK4~Zp%-e*;Ka~&$A@o}2{o+STW8qd`J`!sH@%j{3W4`|$6 zw>X>>|8nbBj{$okFIHdSB`EzL8OutCu<28S!8aMgJkQ9DnlK-Y8+?#~AYTT@kNRof)e#O7ZPfwEn%}Mxy1Bu~#wZ9pE zXA-_kcW4e4ob6^0`0Be;~>K!6g6vN&eqT@*hmXA4$RwB*lLs2_H(r z4<_MCmH`hITHEyo+4kY;xCHape`HRDfzjHPHQjPO{DSsY~yCjBnZH=4jaQzxL z*SQZQ#XqWXQ{P54ZkGQ$8c)~sPb7tRJfFzl9F3d$r&8l)`Fk{OzGv8|aWg+X8aK;t zpT=kE^oKNFqVZ^wzw-sf&us1Q*0@REt8th1-=%SLopey+rP_Z)gO1l|>C25veuHbz?87(hETHn#Y> zB368>T!%DWK({@tk;cY=uc=K@2HkCKEs@6gIw2D;kKv(67z5SDMyym|@Z;AD3yqCf z&}eVl+^JVmOkZZi)fw2PqYJFIvgmH^VXu{S_T5=!G1H$^)TM8Epm1Ce8lC?yR|6^XW^YMyj;l$wwS?$7jri(pK`ed zYa*Mwec@*5=Vf7aZjOiB%6dj=z`dIb#M;NJs!0_SA|!|KV$SO03K7;{&8RLvCQaSp z07-Z$13s>Fp_o&}*YvH?F$=;Hu3{mcevG=+8|5Iy$fejn9Tk>WTR75yT@zPHSXO@3bIa@;`eDij^zChDxi%mqsd;{V# z<-+vGszgs)#3KIIP@oeNo{vl}7VeCgW4=!*$B&_((B30*9mLY?^*S~3cg{I3kdNd3 zV54uFUc|7tFI!G62A$aez2d5ly(H7cBU~$}HdeO#@Rlm>>%#jZ)n!=ytHNR5b{$bi z@!*AzFYIsKZiy^IxHzGuW_DfPbOV~Wi?i9dS`uDgXRvd7N3grg#n(^r-323-zNGr| zRt@)S=)*3MHZd1_M7r?Y274!WRHHf5@NregxIpD+zS-Mjy{QFd!Gtdq@iB_#_l;4K54(@;7a9QuOT+#$#B@D zCn5IVDSWkp*qJAB?BtWM-mU$0JTtzzpA#GQWH=KyA-42McN3cNO#F1|Vtb&BXF}{5 zl(-q+q>t@^(w*-uTYAEce2d)J)XfDjjCg$LQ$lT68xy8~S0K_TU)3~j<7!^mtRvH3 z#)g&`G+Gd*4PgTaDd6gY9J^4Qosu6Pe3*78 zc4fK1*IH2{8ej{73R_PAyQ;e3-zBLBBsU$fZwBAwf!wzvv`dEVLdxyfSH&Df;Kz81 zRuEj1hYqA+{gFxp@w>zljJGZX-5^3R1;5M(DYhWQJlVE85TXU8qB!0H?2?$h4f$J+ zeR+#TC0b;eSR|8Se$}5PD#VrM`=F$?A-Ru$`iz|_UNd!Wj2d_~TruH59F(S6&Qg!2{8uS^%%aQkzB}l0W9S;Oc)6woN*c=h}h=<4MFYYYN zb)R@mt&@@wL5X#se3O6GaO;v~*@jYPs37Wk3Cg4jCQgO=FeJ;;4|y@eQS#!_GcT4p z)>Tu6CtdZcmsDD1N_1Hx`RIb{X4vB4lI!0G&FYg9(1qH?dsy&7EgON<#5t|{ODY`U7fxEdUFBbOa`vOTlaSzD5|OjX%$L8u@~%Ow(PiY+7v*RafkwY`|R zV;hLq1xr5*WXFwmh>$8G<#*mZ>z3OSVV$gYmjwgc2@;S%6kTs@NAP zE=Rjpt-lditym9AD?}aiL8DkLu7pb??CbEq9L8LD|M>D?kBp;z;Hg>WhPojxcmGHk zur5}Cs!vM%Hsmu5sbLA2qZom_D7{K;m>5olitE-+#AiLmbu2X$<){&cKUG4~iV{(J zn7T}9KWboV%H(o(NqOx+zEvGIq5P@0B2vGz4q1O&5HGQfsdUamEY_o0i;YROh$*D} zS!a_7HE}6lVkV$r7D^zohd8~4xKNiFM{IG;z_DOlhneKh zgC1hPwj9*So2fb1%Mw@PN%n}WS@x%_U-q=@FN27yy*#LaR&wxhnG{Fvpea%`rgr=PKLN4(sz?Z~p*tt(>1 zPuJaKj71o&RbsrxUotDcVgX=wLBU|5Aq& zF$w0#k}XG-b|bi@J~#DJvNqsaAhjU1wbHof0aGJQAzFOx+~O**!Y0+nOl&?5K-@z0 zr_K-KBYwr`Owe?pUtNP-T7RpMo;g}K}OBqhcj>X3yJaKb*{8~94Ey($dBqNDLctA z9@ys^k(=tfOvr1>Y2U2s8gb?~o;Ujyn!{ZzhAO;39xSMiZA z-PR-3RfxXq{QDQ zU>t>W9JdM7tYco*%~kM?k1@M+EbPlj2uUfhj%i6({m2J7u;O)S9VV`W$#PCz{;N^S zmt%aU%9}Z|=A1dHK^-OLp8Wx3>3rnO1>RKO$#$pO*?Ppd3_g^1_Ka$_tYnd`(wY}F z1Ky0V45_prM_t?HoLxyKM`n?v7HQ^8K`TF;DUmOe8)~ha;6_ecEbb&#VwFt_5u zP4$Nt#R^^Fm8an5`zhrg^G>M`SyI$(EWu8U(>dDWESsY=_AQ(luovOzQH^Bcy7A-m zbq(T~<4>!0qeQAvC}oP;OwBV|VKe&zay?J?eCGSnmEg>rADDeQ=G!~fo)kZ7Oj!%b;+$lg9Cs+K=SR7)4=x9<*0DK9!)6Mb z(DE;_w0`3Al5qNS+_F-;GfeVtovxdBd2ys|ElKLFRAZRs3FTYz!^Qcxb&DVuNZ zcA$F1WNuUO$eefLujV1DPMBL$(kYGcd8)Z?V%Ce2%lNv`KT{s&p|m+VGG_{^U9jh1 z>t#I#HP@%=Xtwb)mlLzyGuGc!EB_XSN=yLdH2u&M(tjtLu=OQR#t?S|>|xyVMEs z5oEkIE&+%C+!ZczRSg~!SNP0+B%a4a4#@{g;XFw3N3T0FRQ%VVN6H*2d9v$V|FEICo{g#wscaaD?|h4GQm=`}FhEJxODfb7jwuVK!B%^aqt%C{qmySR>E zF3A5!aijd=S|>R-KIHXuc~>JKD?b5fD3?r=JqlNZxt3z~7uNAI)1}m%FKgx0b?wuo z`S+Li=~7a4Y_5YhpdQU0NsUTW$)sNWq<%72pZWGi)s-rb#FoGwhhvujbQmK#$?SaZXca_T6TA((SDn>JgCl~X0ZwMcs_BxZ}|QjJhk%>c~WiN85h zV}?fAzA3ehXtD9UG|JT3=c`o_hG5^IejeD=h}i7&*_zEXxZW9G--*xN62p*El`h59 zRPbFB3rAe}Q!`Q3k}d~7E#QJ$)1=&va=T9RNMP#kGaV0|S`%I1fHlol$r*q-{#Ek8 z5d>|fJak#cXiWc~TR*CYO5fALV)&-!UuwtyVMC$`1$qGR&h~t^Mb_{ixxF4 z@K>srAd04|allxi$(!f7Zqw(vZln9R-CUbnT+N?YNto$%N>+b}@nVeh0MU%oY4r5B1mUKUk7nes-cOb5n zzQ;m?w9OyW@LK#r7CXb3^l1Mmde&UFB9B9$gKvp2TFM{ub=2a20`?Q9(S0O9nyJc- z=~#bOYz(sL`77!T=5#;O^jiFTU{59Iq-9b`CLkd{fsnm*~9 zzam(SUZeLVxb1;`BgWM(Kz=WopG$7XX#KM=!#D%^wHxq_dzhRp*sBS%73L|JTnywF z!n_Of`A&TQ9_B-sQY|(~X4Z@k3K3 z&C;7Zk96C#TL(%-2p9Nw1FCQxoh4;uGEbrLrdyB9+Z+h33bVbL@x%c12pZ+Qwq{?% zSF(^!n1je~@6IbL^S7X$%7C+fnYVHsE^b~~#W0mgZgh0RjdicXtz@{3a6=YMw>rAD z!mTv!b|u~V6X{(;w|xn2wKCm-BsV(lPjX|zgNbgEmjj7zGL4}Gw>p^y<`$Ox*2!?g z32yZ=+|fig8Ez!OtwDy1Cc4RRV{r3;&v}~ztvJ;w&pu$TCpes$x4EUQ87~#ezGf4{ zYk-GYHwcXWQkI*Hk)ews`~EqDpi!(1-rUviC# za{_MlF7Vc)^6DuuL?r`aJ_J|$aDqWc#lL6 z%Sp+(It=568#>B)x_CL)KoSZ^QF6>V$oh~?BP?I@)I*9EWq`x@ugpE<^l74_lU9WL0E{tn!SIEyEBQF+)tTO%*vK*`e`BgW>igNa=U+cnc;! zrx&VdR`o3CqeX+T&Ku%mn2!-Y#`qAsY~tI-(JRoquy5F5CzRJ z4dX-s%Ala!8B*mjPL{`vbVH;!XULE1|71G!74R9zBR{qu!*v*bc7Gv^8ODmsa%@65 zLRcL4+Cynxqin{c3^D1rL*yLG6zL5)@?-r!Mf_$n4cJY*xDe$ZHp-e&&SglyxHw&8 z-H|b(C?Sq^pOI%5d7$ZNaLP~qkGX{SmPrqG6EB`(7vozqM8*-LjCE&6{jLMu(h0B> zz!+JqHE+g#QEohXYJHUa}amhH5-#k;~SCoi+n@fxjsqz?uUtY086gN*0#SPh_xMI904i|MIt9k#^;PP#0rEfT?k7%j8pRRbjA|0^t4@p zbP1}`my9hz89qR-stkpcOC^ ztA)5<$K`DmF+3^k2>jB}A(~;WcwTV^%CK-`VkqC6SMMyNtW3>>tjxq?IZSrW2xO%+ z$Ay7jX^RujInG)LW5#cdv8=nYi?zOFyaoi9^>ZC8##CcQj$Pz{=XB^B7e*&nz)Xc2 zWBDcEmT-dz^9xHjD{jlp5V_6cL@xAJZu$67vQB;7O#c^5f2JYjBT4U`FvHlg5auSs zHa%NRkBk@7o3q69hDLzt8E^x?Nm!aw(=?r6(@t-j5nuZn6OX7PFVM?ig9)rbRDGHE8-eiZE z+>j?GS2)GwhbNBYg`8g2!)Wr4wcouEQq%L|oHHc!BUDDSTdb2HNO&kzKCzCiDF|=#>5f zkN<$NXR({?FCV!Uj5}%#<5v5{qQWSi;t*4gOd2Z~$scwO<%A}9v!%>Cvkg%>4UhRS zD`2v+${Nwkm*7pTs4uI$Rcd^@J!3KajJ#gXd%o*%K8%WZC}WyozaeAPupi0#qSPTM zFN`hft!*QOXtHf=XZ(u|tKS|tc|R@PRX_c(QKstODYA}aNc}ws@6yNccmXCO%jH9H zT}+FxeA8yAY45 zFh(}>?X`Qw+88bH!*CVwuB^hN8m0lp?r7%QGP!y#roJZa7rp-JAt`T|)GPk>(Ovv?eVv1biny51}K z3OT-j0fR9u&HfYAONBHvp6d3&G?4#zTLhi4XoG}I>bWEJ91Hn zrfw?cSax0E7<#th+@T4fZ0~p_{~#mv(DSeyg+YAdRYF@Y*P$}@8seC~OwVS~b+Ye9 z8qQrpoDFjfQCKdCIEW>Mu}#euQ=4HL#*3-w=cbm&bVbOPpDyy7WIs|r9x_}!e*$#M zS>o)5DbOp$7+2@V$D>dkER)`RL)^hK*$vB=V3ckdlCsvjD1vtf*!UKZ(g zySO^dn2Xv*+>e;MY%=2qXo0b|Bd_D?bm20dbcnU=CzagfL2jIon_N+JuaX;6Hx$oe zd6$W)ko8n^lfxi?4rIUdRaoAG$(B00|KdS#EG6tK#uq7QUoqtTWO$Ll3T4T=;-|(a z`S?w`c+@Br>2^GB$+W+3I6j+}_35jpAM!#P77J7z&X82@HOtK5ypqcG3G zYMLNQ@%{7B|-eAR_* z=LtlYdiq&dj*wOsN45j9f=3*0h>gauecCuRZ^IaT=yBXj_QUubD-lOqPYR=CZaT_i zQp)mJHc7Af)WFgR_N%HR#zT0{A*}wf zImECYLl!wi5&CoM7;^Xs-d(^9X!?mb=p(#!3~BXO>u$wZhnb9ZxBP^4H&+qb_yu^h z!xZI=pajlj-R;YU_#_6(A&8_c?UpnmzetlK^qa)H&PxlX6k#z=rCXFT-F-~=D|oyL zlb_=Tfip?hvfj5yuJ@^Rkr`MQabaELY^;kE#rq-D72A@dSj$-+EJZLzR{t9)O8eF0 zMID-k?0=7(+W#&?(8^jonqazMlnm8N88YWeF&Vl60rZ4vxx@L2xXQTQ$oQ^dpOW!r z*2UQmP={b{SlB!fdNyAaKCD(h$=`m&T*r3sU04o~jMVR5JNm>njyuk>V@#PZCLB@g zW=9bO!);Oe7A(JqQGHLn9<5)BHfda$W?yU68mj+m$VVTTCni3eJHpWg)0{fRlIBbx z_JwIiRl07o7opA0N!ex_7>|9?b+Ft9lO=hrQaz6vMm}xaz}~1zEt-ww|5V&!*uP+8 zJeFfW?ucY{q&Z%;3pdwexTb|VYo3m}!`c>fQEbGa>+T?u_y+U(GAwVws4>J0m0rKh z@^JQ}MoqfC*vROyKc6P66k}Jeb+|BYJzGqNOyrL_M{dGk`NM=ZhEdNIbu z!*VB#J!gb+&BE|z+-?|Gq+_Ol`ka?3rZrzLrd3=grr9>e+9UaT1koNw7%2-+0?FzX zbJL8g(?p@&_#5g+u4CSS@s>Ab{TxS>cNzb0usD&L%2!C{YfwJNoHvV~rx`UFm_23K zGVF6%8JIPj?*i01`MQiTtiy)nS~kXnIT#aC&xH(|_$o{pNK?;QaU0e%Gs~rx^v;-= zAtoNjxf!fArB^saZ<jVMa#(JMDadB^+0vIdcVcEK3vfpI4MP|!VC9!yGt!q3 zyM5d@6!p1`gzL@dr8KCy~i;n>zwSb8d(9m!a!zkBdSJFbr+i zvb_v-Q=T&4!w7l@+t<%wnRGVtE_Kg{%(zlLw=11vvtR7&$C{Cgk1{+S=KJm{6hV;< zb-9&2)zqhqh<%ge&hc51oMX;AGx9wJbDTdPmmdOH?l2xfrOUNRIoAx$pdD+n=?xj8 z|2&)cB1|P%U>mUFYV9@?b34rM){PHI9PgmawcNY{zL&}r1r2~$o8o&Zj+OU=R_S-~ zH~?eFH9fEW2271W|CIG#1o8fy;oQQOX%m?!ObMF+xla86)=Vwy)pi$Xb4_&uEJmH7 z-i_sehY8>zTNK<&4TiWdnT&T1*3hp*K>=@EW|P-u*P#%3eYOp4pJSj*xkeq&C&L>E z|EG&>@`mkZgy&7$^Ptn*FeWbJmm#g?#RRNJl5hS9ZH0JOg?AQ(cxO?FcNT>e zhF~hiQ`1Ba-a#@ioQDlF?96O2vlTivk_Wz=;42q=<%r^k3rAF$<)O@+D6?Eq@USzK z$syB`f-nG@W}CPTIDfCf==aX` z#Y`J>Ak5BVlvth^E{P-9pTbMoe}FO~B>n}!-vZ~ac$-a}4P*M7xaqI*JOO#eng;r= zg!PQGvcy?f*E*}A5c7uuan`#^k7Y`^#5+Zd(~A+uT$eHB+wj}O;%1Z&(&yFjSHlpR zcqZSICe@uOAKyf{837fRH_jK&0#CO2r_BE-kE~GJ6uvtx5K|sbSjVsDdP1@7{FL!Z z84tXfhUFx6!iv+wOv^hMlh{G*;{FKc+l~?jp5BHDahkLn` z)0z4a>FhgAItM-`9q!dmPUp>!NJpG^YJTYA{+N2HJWafMxTmTU?%_-3t38rf&Me0w zqx^u22lnFkk8ZAwMuupP!+-)t~M!o_aV{y9yZo_cn9xU^B z3~t9KO zw>RNdiMS3+8Xv-K7u;Gc^rmCd5Cy$dzeD65zehFv7Y*;yaI1zt)zGBzuBLCyQ}HKh zI7h=38eXGeM8jSUKd0eC8vat#dqv|T8lKQFN2l-7a3{t}{N1EsyN1_mxK6`En(o6I z-ml?PnlAUv@i$9{pQ52d!{ZB-|8F%M*6?u+AJXt14Yz8zQNv{#mTH)z;a@nB!|!4Z z>osiBut&qsY50(ak7{^G!x0T7F+8qGswa06UIh8z@1ZgUC4z@%p~7EZr1{eRkLYqZ zm=yj6?f!sSPTK!o6W6dn(|tlHp zL*wu2d_Su32Q|D)$E(xui`uEG&C7Lro$gK%R|Fm8gA15 z?HVuAaF&J@8rEyLN<))=xlZr6rjw=dS9G|?HM~D5UY4$RmxgmRH0ka!@Y%FA!RGGv zfVv(Mdrr#imv=`(-I3}*Q}^ce^26wG-D_Lb*4ezO4cD9U8c2C_XO*pn_jD&+6^hfU zq`IoRy}jNSXAav*PF#6H?Jxc#PW1+FJ=2yVbF<||u$I8V;Fb@;q{ zjl4u1>!r*G(yWT07@E2xfiB6>8)@}| zVhzC<2jUxPiQich;!SG`GR@0s)~&6nTTre(dUubpM%`q-B8cl&uUucV&h#0yt#1vq zx9ba9H;DC~nmRMu3&y%Y2)EwLds=3HhgS1gqyu_K75;BetB2S z5WF6u6DzO}(XG?p5fYOH@7)Q4vwL`dfWIr$DRNIuOR>?|CGv&3DFFN8w_*ny^UxC# z`2P6j4qmUlr~+YDgP%yS4G^ic&>8JfG%A1L3$@Md=$gy(7$~E;VO;i#5Odq-&z(QF zObSL)2wd*f7W@eR)_^Z$^-fMfeg65QLNGG{@N#+{RHm%~l2hq`miQ?D;?Jig-pAT(zoI)3-d-OF%WHOV8M3^97cp&VxzZQH6;TL{ zWO^dvk94aG2DfyFRzc?FeaoG=%^hb)>2sC31MA98R6O!41eapbq1*dJ>IxN5WT3@|{Jg$R=_|aNZftD#YdVd*6-0SR-9{fuR0x-B zDQDcbfTrHu9TI7b+0oSK@8*3qJvvr{@HIhYi?2()gBwfmr8ZQxszsbPX`~XuWhSix zx9P=i!)nA~EL?omC~uqN-FCQWPpNv-huT%%nmZjdpmEhrSz;0}#>D(wGv-UEl|87#b2QV2B^=Y-!sJIcnU7p0&{z-VA-WFo8Si z5s3HF0^jy-+zi?}2P&pDz#*O8XjPo6A);8%0MFk6W3eafF?H~3tY;ZJi(BS5mtAC~AJd>U z9o_A`@XYdUVr#hnvHwpA{7(t|pH~9oJ|@fmUH%)NRC>;2XWk`MSDDi?bcx-ZF}pEq zaJyBARN>o$o7>QBa*7-anlhZcT`e(Ss&K*XNMo?2G3@Ky954x{3Wpoj&>iamuMU_h z9B){|;KOa+t!C0>j#7o!)2IYSQ-x#tasX%{m?~VC9QG%WOPMa|@h&+Fxs>4=)jT4B zV5)SJ%jR_XmHFTucyg$s?!dG1aJqPnt8o8rL|$VT3!aLP#=4-tts~@C!=hMFl1-UE zd}tsLNeZ2U?v;%zF-qm=O5JRmKsZ%+H7Mu($nl^l!d-Pqi45s(-0*SXI=ed>u^54n zh@@`@#EL~6IABM4mCf^6WtL-kl zJ8Obrm?1#EOUp(W!l`(_#qfO3wMpB(fH%UBKHsN3q1}f8C*gv1o}=^velS^x64?21 zh!rrB2f(jsJKu@@P1|u_t9TMd@&@>pw!82ij_=~g58=%)4ATqvO>G|p^k7$OJKX_? zV8|QcP1A6`i0*(7z%cGG;4+*UKMuPa@LSq$Jx9*-?t~>JC@a{@0RMVE$`p2i zmx%?lu;K~33ve~&7O%rz5BR$!D7SH-2{^hGuk>gKT;&FDu-5|~hT-{R!nsvQ19rl7 zFqN=-0bgB#dV<}0miSZELM*NUe{d(f4`vVS1AyOMrRvLiewgQopN07r!Vtaza~Sp! zK=T|i;b&ov!kzFNFvnrXow?#Y7|H<835Q^4C!BN{?3pM}z)_fL*v9}1aNd_;tY?CG zR(Kzb7hwp$3DX0+^*k`o37252{Vuo@UIa4$yBqK|7}g!P;$N~>(RTwzVCdcpn0Yzg z86&(C@G=Jj+Ws`)aiJ@i^iGI3H#X?1UG=EQ8&87MEvqe|Qb@26w`z zVfMgI_#DjrunzL z1Nvc(!X5$~gE;{^;isEW-xDCWfWt66H%fRxGkAlY@Ish9uoEtXxgYj^zz?tn{{-w< zxDu^50EgXr9+T%Zi?*OHapTyQ{#s&P=r%{Hm4+4JqKIDb&fV=mhd?tcV zz<>RM;&TA-!2Q_l4EG_x`TM~$>~6qaFw`^sfM5DL^+Ys~_GQbbSg!+b^@GTgY$r#|vKL$Sx1IV*L)F;+6K|D+J!y{+|IPXLFG)xF~!slRm zVYi;~;n|?N*HL$HCtL?J3_IaQm=V~$fdBau+6C5!i{9nI9z0wZ&-dkv2u!~=#{EtCSVDAU~^*hk9IHoZMc*hv(0``8u z&mTuygM9$7;LqR{#}izDpZP1=FYE(=ui9+lCD=y*Z!mDo5N8Ff=L>l5;Mz2tON2Y& zO)wi_x1J^78G}rm4T!*RH|3WfMDL?+4s-9`<+B4ruNh zC#*Z)CaSTGoA5Q5O|ZWMc;^K;PYnAmz!zaCGcN&-!+uBBivw__w)6PpRv79H?uUF` zyAz&;eS#c6b6?^{7{(?1SMAPyk=#p2cfz7M%1+n_Bgfu=U(@#efQMl?ekOcd+us4q zovYlPfD5#}0&s)2Zv^}$%+1Kx2;f!oP=*+9cmbb)VIB#O!;qg3Xul9;hwy~KGVH

Fr0L!dSh`U0L--)fI|xHKb&(2R2Y5FOdDsQ$ya>hx z{RVhwiJ~(C_#sRw+#O3H7citxcnb{U_5wby-CqLSfc^Lkvk`C%W)9*K7A#lpgv+(v z4S18b-wgN}7+EHOFKYJ@z|Ud-K4}gB4#F@D;q%)55}?P8Z{Q%UdcYJ(fFT&l4B@x5eGt%Ai?%TXN3{UY zyANCK$%u1^D~RP%j8G2AI1B?ywK9#n(tKSNvxKHo}m;7cdONxDmj+w0#%g z0E{eKK%V)aop4({>KinB0e=Ux6ZYeP=U$=0cmTfxL;8b&&%luWLBOACJ5RLyTHB8S z-nb6s3_20OFTgOZLBJPa822T>_Vp-RrVH2)a}@Rgz`|=#hOid_E`nkBdcdb(qHrGu z9Dx~weGIU76Uq(te!vaa*@QR;G6~oV!?=WB(01-G|5_vXL6~8{Kfo}|7+|JX*|Py( zgrR?=+J^yMIE!#U zc-Y@#6aPDn{nz6GkPMnaG$4`j>0lNNXikG z@jn%=9bp;AVj~O77#7JREaPY-U0BA@T*o(rn^RfFXvmzil3zIW!_ZICus4-^@Taeb z=_>r{RIbB+pUTnK=alDx_=XPqK>V!-zXxt|fBtCs-)n(iKFzq|C9YL)9{dFS2-HCo zcwh&tff0FMfwLe125i5vJg2+{UIGRvf-iv-_$+u3{QN6(%Ddn#V1d`cOJD;$11^I2 zGrW_6+=+B!-9$Ip&2)3!Qn%8rb@#e%cfWhkJ?tKJ$K8k*^AcXt z%Xm4j`AQHC)IbZ;K{m(-dQc7Off@9I zelQ4z!6-nvKKEO3T{CK`re>ziteH1;vuf5&)9jgjb6^h5k*PGI4Yi>)(v55*-_RS? zM!jJ+dX0W#&=@vG4W$`vs!gq#Zf2YLrrxYJ>rJ!SYxbLi=CCSu1bp zR@JIorq#3h*1#HCBTKLN-Nq@TUsmK%C@4|QpI9X zY^Gv04ZEeW+^j`(>{rEtb!=#2#U6I-W61%w9AeE8_Eh|cAH}9BRt?)P<7csL-lr`_ zT=UQ&dX3Rc{B&>XsY)w?Cb5>1<{gSWb+giPTZ7iPrM5HJ*lZuPN9`EiT*7+~@KqHX zR1A5 z|GmyxG<*5k?>@>}q|PgoQlwRM+C$FdiXstt74bXzj7ptPP17YBoYXnfS+>H~`!IEf zb_kDHrF|vB-iNir%gO?J-Cf4Nx8UvedzdJDYszWPwn&RgB<)l5yImmy-x;<~6KhW+ zZIwJ{;j`?0gp@CE#jTL``AIB3iOW|260fg7%gFU8_Pc-wNQ}u1ylj0EY5s%t5PR}l z?c493J73vYR~aB+l&@~4;-}`dxLTAh_T|khsrZ+dE}cxq)!We{Qt{oQ5kLRf@du7S zaIRn&#f|6IcU6kmG*a=Mt<6V`l~Qq|V4U12uWVg4uC8sLq<8J31!H6W+Nrp@QP?c6 z6^-rXJL{t`RlQZ%LasKRhHZ3grj}X zc(Hh`xUR0tIu$P%mp89neZIIAS9i)6R#q4>l!~tv){Wxyq$Y(dypJ|B)fev4{oKN> nMj*qvg_(sO;|9#lX!U-6uMKas${#JJ0_Mgz+nzYm9jku Date: Tue, 15 Jul 2025 15:08:31 -0500 Subject: [PATCH 187/230] Update MainWindow.xaml --- MainWindow.xaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MainWindow.xaml b/MainWindow.xaml index 33a29949..d30bcca9 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -6,6 +6,9 @@

+ + + From 4575ca519b5715eb763a7649590f6974889a1bfb Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:36 -0500 Subject: [PATCH 188/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 181 +++++++++++++++++++++++++++------------------ 1 file changed, 109 insertions(+), 72 deletions(-) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 4f912a5f..8f0f8291 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -34,9 +34,6 @@ public interface IQemuEmulator : IEmulator public partial class MainWindow : Window, IMainWindow { - // Ensure InitializeComponent exists even if XAML generation missed it - [System.Diagnostics.DebuggerNonUserCode] - private void InitializeComponent() {} private IEmulator currentEmulator; @@ -266,60 +263,75 @@ private async Task HandleUverseEmulation() { var openFileDialog = new OpenFileDialog { - Filter = "Uverse Boot or Signature File (*.bin;*.sig)|*.bin;*.sig|All Files (*.*)|*.*" + Filter = "Firmware Images (*.bin;*.img;*.sig)|*.bin;*.img;*.sig|All Files (*.*)|*.*" }; if (openFileDialog.ShowDialog() != true) return; - string sigPath = openFileDialog.FileName; - StatusBarText($"Loading Uverse configuration from {Path.GetFileName(sigPath)}..."); - - // Prompt for hardware configuration - string model = PromptUserForInput("Enter model type (e.g. VIP2250):")?.Trim(); - if (string.IsNullOrWhiteSpace(model)) model = "VIP2250"; - string proc = PromptUserForInput("Enter processor type (e.g. ARM/x86):")?.Trim(); - if (string.IsNullOrWhiteSpace(proc)) proc = "ARM"; - string memInput = PromptUserForInput("Enter memory size in MB:")?.Trim(); - if (!int.TryParse(memInput, out int mb)) mb = 128; - long memBytes = mb * 1024L * 1024L; - bool isDVR = PromptUserForChoice("Is this device a DVR?", new[] { "Yes", "No" }) == "Yes"; - bool isWholeHome = PromptUserForChoice("Enable Whole Home network?", new[] { "Yes", "No" }) == "Yes"; - var config = new UverseHardwareConfig - { - ModelType = model, - ProcessorType = proc, - MemorySize = (uint)memBytes, - IsDVR = isDVR, - IsWholeHome = isWholeHome - }; - var emulator = new UverseEmulator(config); - ShowTextWindow("Uverse Emulation", new List { "Initialized emulator with config." }); - emulator.LoadBootImage(sigPath); - ShowTextWindow("Uverse Emulation", new List { $"Loaded boot image: {Path.GetFileName(sigPath)}" }); - - // Attempt to load content signature in same folder - string contentSig = Path.Combine(Path.GetDirectoryName(sigPath), "content.sig"); - if (File.Exists(contentSig)) - { - emulator.LoadMediaroomContent(contentSig); - ShowTextWindow("Uverse Emulation", new List { $"Loaded content signatures: {Path.GetFileName(contentSig)}" }); - } - - emulator.EmulateWholeHomeNetwork(); - ShowTextWindow("Uverse Emulation", new List { "Configured whole home network." }); - UverseEmulator.StartMediaroom(); - ShowTextWindow("Uverse Emulation", new List { "Started Mediaroom platform." }); - // Display Uverse emulation details to user - var uverseLog = new List - { - $"Model: {model}", - $"Processor: {proc}", - $"Memory (MB): {mb}", - $"DVR Enabled: {isDVR}", - $"Whole Home Network: {isWholeHome}" - }; - ShowTextWindow("Uverse Emulation Log", uverseLog); + string filePath = openFileDialog.FileName; + StatusBarText($"Selected file: {Path.GetFileName(filePath)}"); + try + { + string ext = Path.GetExtension(filePath).ToLowerInvariant(); + string extractDir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "_extracted"); + if (ext != ".sig") + { + // Perform generic firmware analysis + await Task.Run(() => ArchiveExtractor.ExtractAndAnalyze(filePath, extractDir)); + FirmwareAnalyzer.AnalyzeFirmwareArchive(filePath, extractDir); + StatusBarText("Firmware analysis complete."); + MessageBox.Show($"Firmware {Path.GetFileName(filePath)} analyzed in {extractDir}", "Info", MessageBoxButton.OK, MessageBoxImage.Information); + return; + } - StatusBarText("Uverse emulation complete."); + // Signature-based Uverse emulation + StatusBarText($"Loading Uverse config from {Path.GetFileName(filePath)}..."); + string model = PromptUserForInput("Enter model type (e.g. VIP2250):")?.Trim(); + if (string.IsNullOrWhiteSpace(model)) model = "VIP2250"; + string proc = PromptUserForInput("Enter processor type (e.g. ARM/x86):")?.Trim(); + if (string.IsNullOrWhiteSpace(proc)) proc = "ARM"; + string memInput = PromptUserForInput("Enter memory size in MB:")?.Trim(); + if (!int.TryParse(memInput, out int mb)) mb = 128; + uint memBytes = (uint)(mb * 1024 * 1024); + bool isDVR = PromptUserForChoice("Is this device a DVR?", new[] { "Yes", "No" }) == "Yes"; + bool isWholeHome = PromptUserForChoice("Enable Whole Home network?", new[] { "Yes", "No" }) == "Yes"; + var config = new UverseHardwareConfig + { + ModelType = model, + ProcessorType = proc, + MemorySize = memBytes, + IsDVR = isDVR, + IsWholeHome = isWholeHome + }; + var emulator = new UverseEmulator(config); + ShowTextWindow("Uverse Emulation", new List { "Initialized emulator with config." }); + emulator.LoadBootImage(filePath); + ShowTextWindow("Uverse Emulation", new List { $"Loaded boot image: {Path.GetFileName(filePath)}" }); + string contentSig = Path.Combine(Path.GetDirectoryName(filePath), "content.sig"); + if (File.Exists(contentSig)) + { + emulator.LoadMediaroomContent(contentSig); + ShowTextWindow("Uverse Emulation", new List { $"Loaded content signatures: {Path.GetFileName(contentSig)}" }); + } + emulator.EmulateWholeHomeNetwork(); + ShowTextWindow("Uverse Emulation", new List { "Configured whole home network." }); + UverseEmulator.StartMediaroom(); + ShowTextWindow("Uverse Emulation", new List { "Started Mediaroom platform." }); + var uverseLog = new List + { + $"Model: {model}", + $"Processor: {proc}", + $"Memory (MB): {mb}", + $"DVR Enabled: {isDVR}", + $"Whole Home Network: {isWholeHome}" + }; + ShowTextWindow("Uverse Emulation Log", uverseLog); + StatusBarText("Uverse emulation complete."); + } + catch (Exception ex) + { + MessageBox.Show($"Uverse processing failed: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + StatusBarText("Uverse processing failed."); + } await Task.CompletedTask; } @@ -338,11 +350,22 @@ private async Task HandleDirectvAnalysis() if (openFileDialog.ShowDialog() == true) { string filePath = openFileDialog.FileName; - StatusBarText($"Selected DirecTV firmware: {Path.GetFileName(filePath)}"); - string extractDir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "_directv_extracted"); - await Task.Run(() => ArchiveExtractor.ExtractAndAnalyze(filePath, extractDir)); - StatusBarText("DirecTV firmware extraction and analysis complete."); - MessageBox.Show($"DirecTV firmware {Path.GetFileName(filePath)} extracted and analyzed to {extractDir}.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); + StatusBarText($"Selected firmware: {Path.GetFileName(filePath)}"); + string extractDir = Path.Combine(Path.GetDirectoryName(filePath), Path.GetFileNameWithoutExtension(filePath) + "_extracted"); + try + { + // Extract archive and analyze file structure + await Task.Run(() => ArchiveExtractor.ExtractAndAnalyze(filePath, extractDir)); + // Further analyze binaries in the extracted directory + FirmwareAnalyzer.AnalyzeFirmwareArchive(filePath, extractDir); + StatusBarText("Firmware extraction and analysis complete."); + MessageBox.Show($"Firmware {Path.GetFileName(filePath)} extracted and analyzed to {extractDir}.", "Info", MessageBoxButton.OK, MessageBoxImage.Information); + } + catch (Exception ex) + { + MessageBox.Show($"Analysis failed: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + StatusBarText("Firmware analysis failed."); + } } await Task.CompletedTask; } @@ -458,20 +481,10 @@ private async Task HandleRdkVEmulation() string path = dlg.FileName; StatusBarText($"Launching RDK-V emulator for {Path.GetFileName(path)}..."); var bin = File.ReadAllBytes(path); - // Auto-detect the binary's architecture - var arch = ArchitectureDetector.Detect(bin); - Debug.WriteLine($"RDK-V auto-detected architecture: '{arch}'"); - // Override Broadcom MIPS marker for X1 boxes to ARM - if (arch.StartsWith("MIPS32-BCM7346", StringComparison.OrdinalIgnoreCase)) - { - Debug.WriteLine("Overriding BCM7346 MIPS detection to ARM for X1 hardware."); - arch = "ARM"; - StatusBarText("Overrode architecture to ARM for X1 hardware"); - } - else - { - StatusBarText($"Detected architecture: {arch}"); - } + // Force ARM architecture for RDK-V hardware + var arch = "ARM"; + Debug.WriteLine("Forcing architecture to ARM for RDK-V hardware."); + StatusBarText("Forcing ARM architecture for RDK-V hardware."); try { EmulatorLauncher.Launch(path, arch, platform: "RDK-V"); StatusBarText("RDK-V emulation started."); } catch (Exception ex) { MessageBox.Show($"RDK-V error: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); StatusBarText("RDK-V emulation failed."); } await Task.CompletedTask; @@ -766,6 +779,30 @@ private void OpenMenuItem_Click(object sender, RoutedEventArgs e) StartEmulation_Click(sender, e); } + // New handler for firmware analysis from menu + private async void AnalyzeFirmware_Click(object sender, RoutedEventArgs e) + { + var dlg = new OpenFileDialog + { + Filter = "Firmware Archives (*.zip;*.tar;*.tar.gz;*.tar.bz2;*.bin)|*.zip;*.tar;*.tar.gz;*.tar.bz2;*.bin|All Files (*.*)|*.*" + }; + if (dlg.ShowDialog() != true) return; + string archivePath = dlg.FileName; + string extractDir = Path.Combine(Path.GetDirectoryName(archivePath), Path.GetFileNameWithoutExtension(archivePath) + "_analyzed"); + StatusBarText($"Analyzing firmware: {Path.GetFileName(archivePath)}..."); + try + { + await Task.Run(() => FirmwareAnalyzer.AnalyzeFirmwareArchive(archivePath, extractDir)); + StatusBarText("Firmware analysis complete."); + MessageBox.Show($"Firmware analysis finished. Check the console for details and extracted files at:\n{extractDir}", "Analysis Complete", MessageBoxButton.OK, MessageBoxImage.Information); + } + catch (Exception ex) + { + MessageBox.Show($"Firmware analysis failed: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error); + StatusBarText("Firmware analysis failed."); + } + } + // Helper to analyze file type private static string AnalyzeFileType(string filePath, byte[] binary) { From 6cb7af7ddd4d818c0bc4d2b012c18f584a52d784 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:40 -0500 Subject: [PATCH 189/230] Update apphost.exe --- obj/Debug/net6.0-windows/apphost.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/apphost.exe b/obj/Debug/net6.0-windows/apphost.exe index 5310715e17649c4d8fe22ec664869ab6b85c4b41..6f634668050fcb3dbbc503a44e644355523a9d6f 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0>L8PXVx7*c`IfFYS7k-?C`6i8b#m;m`k3@Jb|5lE&1MH7M8 kkii%zV##0uRFlSF4wNxuFaxVG0LmmXByL~s%@oN50N?KtF8}}l delta 99 zcmZpe!`T2tEsR^3BE0=m8H^Yb87zS~k-?B5iNSy&4M-*fu_>5m2$VBmuwXC)Vq*q# gplTx^+XToC5l0OCLrBme*a From 9ab806adfb881a791c27437901e5bf24660a9e9e Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:46 -0500 Subject: [PATCH 190/230] Update MainWindow.baml --- obj/Debug/net6.0-windows/MainWindow.baml | Bin 1685 -> 1823 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/MainWindow.baml b/obj/Debug/net6.0-windows/MainWindow.baml index 7e43a5a13b5fc802b8384f5ae9f179f5388dfb1e..d857276e9b2703e06d67a595790f827a3a2844aa 100644 GIT binary patch delta 439 zcmbQrJD+dEOy+tn1_lNpAl7995~e^51}aiJ|BE>0CFWFCr7Fa`WftX@Cl;mZ>FLe< zYYNgK4a6*FmOzp@_aB2PH;@4~gc-;n$`FtakRd!srtnOj#Vl>X3l!xCVz9w{Kn4h_ zaPR!j8tpb$3@ zGcWneU@8J+fNWCXx%r>XDZiv7KiBrZ8Aw#m;lHUUkOrB`y!bEBji3Ir2BjvZR07>7 z0~7?hQ4C0djbi%GU@8vefQ-`9{%lVakOUdRVk!qD*}*J%Aju5GOaSEcHD>?- From ae667366447506b4aea7386938bff5c43f64d78f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:49 -0500 Subject: [PATCH 191/230] Update MainWindow.g.cs --- obj/Debug/net6.0-windows/MainWindow.g.cs | 26 +++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/obj/Debug/net6.0-windows/MainWindow.g.cs b/obj/Debug/net6.0-windows/MainWindow.g.cs index fecc14e8..97bc881e 100644 --- a/obj/Debug/net6.0-windows/MainWindow.g.cs +++ b/obj/Debug/net6.0-windows/MainWindow.g.cs @@ -1,4 +1,4 @@ -#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "42C09AE418AD248FDF232113BDE4851578BE9FBE" +#pragma checksum "..\..\..\MainWindow.xaml" "{ff1816ec-aa5e-4d10-87f7-6f4963833460}" "2FB00B2451265CCC554A1EBC169742CE763AEC8D" //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -79,21 +79,37 @@ void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object return; case 2: - #line 15 "..\..\..\MainWindow.xaml" + #line 10 "..\..\..\MainWindow.xaml" + ((System.Windows.Controls.MenuItem)(target)).Click += new System.Windows.RoutedEventHandler(this.AnalyzeFirmware_Click); + + #line default + #line hidden + return; + case 3: + + #line 11 "..\..\..\MainWindow.xaml" + ((System.Windows.Controls.MenuItem)(target)).Click += new System.Windows.RoutedEventHandler(this.AnalyzeFirmware_Click); + + #line default + #line hidden + return; + case 4: + + #line 18 "..\..\..\MainWindow.xaml" ((System.Windows.Controls.MenuItem)(target)).Checked += new System.Windows.RoutedEventHandler(this.UseUnicorn_Checked); #line default #line hidden - #line 16 "..\..\..\MainWindow.xaml" + #line 19 "..\..\..\MainWindow.xaml" ((System.Windows.Controls.MenuItem)(target)).Unchecked += new System.Windows.RoutedEventHandler(this.UseUnicorn_Unchecked); #line default #line hidden return; - case 3: + case 5: - #line 26 "..\..\..\MainWindow.xaml" + #line 29 "..\..\..\MainWindow.xaml" ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.StartEmulation_Click); #line default From 665060a8cf1d0ef358c12413ddf8f51fc1361e21 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:53 -0500 Subject: [PATCH 192/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index c3ea30e9..3eb200ef 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+eaa0e6a21899f18db3bcb4210c62c4aca05efeb0")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3f2ee0ca15c9402d0adf5a513098cf7d160a03aa")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From f7be247240084c9dce55e098ca20ba7fb9cd67f8 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:08:58 -0500 Subject: [PATCH 193/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 2d9ddfeb..5d2acd22 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -0c544c9b6ca350fce60c5e5a8ffae05d93e36805b424ea070641a60aba3b83bc +2c024be1bc83e86a51b9fccb22ff4b90b19cb9ea0579a14ff3ab0ba35ef7ea88 From 4131be5daffaf8963e99eddb9a2b384f411e19a0 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:02 -0500 Subject: [PATCH 194/230] Update ProcessorEmulator.csproj.FileListAbsolute.txt --- .../net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt index 65c6cedb..f09cbd0e 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.csproj.FileListAbsolute.txt @@ -19,3 +19,4 @@ c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\refi c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.pdb c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ProcessorEmulator.genruntimeconfig.cache c:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ref\ProcessorEmulator.dll +C:\Users\juler\Documents\GitHub\Processor-Emulator\bin\Debug\net6.0-windows\ProcessorEmulator.exe From c7db54dde9d297ebcc4dd0965b5114721268a6f6 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:06 -0500 Subject: [PATCH 195/230] Update ProcessorEmulator.g.resources --- .../ProcessorEmulator.g.resources | Bin 3900 -> 4038 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources b/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources index c722305c2c58cbff72f88f43e6e887a0928fa121..41e44f9c9115080a4ac1b5fe7ea08c9763e735ed 100644 GIT binary patch delta 406 zcmdlZcT9f6Vh$#G_R0M$YMW1Ulrqph`|Q)P0r$x;RA6&#)E`(Std{6QDfwvyql+#QDCwmubPq|PzvlIQ(-tu1jvG$ zB09N}S6W95CMyeT(UrMu-929xA7@6%1&Oz=gcTK`5m9Sx;#({ amzejGvVh*OMY?J$0)Ha{yC}n2koP3%`+JcLLfq@^0nREX!m~sOdd_b(iz4Je7 zylYBk$;`iI;y?jChySKLKw1chK`M2bCd=`vG4f1yh_} zAPa6dNH4;0kJOw3sNpOurououkmbxv{xX<~OxEF(WfYz4#V2ne29sd=&tM923CO*A z+W$=@fHcT7=H-7GR5;H6XEHJ<{A(r&m6e>lkS~=>3djT5s>?iCfM1zWYO)ExGo$q6 i3VwBU8K5x8Wh|z$KoVp%i>VxtWCye4fh02!GXVezy*4!f From 90a5e7a38bece2efaf4b00a888e957215b20951b Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:10 -0500 Subject: [PATCH 196/230] Update ProcessorEmulator.sourcelink.json --- obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 5bfaa7da..18eb464b 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/0db78deda48bfe78a2dad630654268cb039a1603/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/3f2ee0ca15c9402d0adf5a513098cf7d160a03aa/*"}} \ No newline at end of file From 8bebf1a3ef81211197e129698721586f05e03003 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:14 -0500 Subject: [PATCH 197/230] Delete ProcessorEmulator_MarkupCompile.cache --- .../ProcessorEmulator_MarkupCompile.cache | 20 ------------------- 1 file changed, 20 deletions(-) delete mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache deleted file mode 100644 index 789cd5e7..00000000 --- a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache +++ /dev/null @@ -1,20 +0,0 @@ -ProcessorEmulator - - -winexe -C# -.cs -C:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ -ProcessorEmulator -none -false -TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER -C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml -2-826070488 - -39-1121013689 -1942128195826 -ClassicStyle.xaml;MainWindow.xaml; - -False - From 057c0f5448aaa9457384d1dee4027f3e95d7e65c Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:18 -0500 Subject: [PATCH 198/230] Update ProcessorEmulator.csproj.nuget.dgspec.json --- obj/ProcessorEmulator.csproj.nuget.dgspec.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/obj/ProcessorEmulator.csproj.nuget.dgspec.json b/obj/ProcessorEmulator.csproj.nuget.dgspec.json index ae99319d..e39bb231 100644 --- a/obj/ProcessorEmulator.csproj.nuget.dgspec.json +++ b/obj/ProcessorEmulator.csproj.nuget.dgspec.json @@ -59,6 +59,10 @@ "name": "Microsoft.AspNetCore.App.Ref", "version": "[6.0.36, 6.0.36]" }, + { + "name": "Microsoft.NETCore.App.Host.win-x64", + "version": "[6.0.36, 6.0.36]" + }, { "name": "Microsoft.NETCore.App.Ref", "version": "[6.0.36, 6.0.36]" From 3f968b2dec58a65f6f10438e08c6cf336498b776 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:22 -0500 Subject: [PATCH 199/230] Update project.assets.json --- obj/project.assets.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/obj/project.assets.json b/obj/project.assets.json index a834b1b1..1ef106b7 100644 --- a/obj/project.assets.json +++ b/obj/project.assets.json @@ -65,6 +65,10 @@ "name": "Microsoft.AspNetCore.App.Ref", "version": "[6.0.36, 6.0.36]" }, + { + "name": "Microsoft.NETCore.App.Host.win-x64", + "version": "[6.0.36, 6.0.36]" + }, { "name": "Microsoft.NETCore.App.Ref", "version": "[6.0.36, 6.0.36]" From 8812fd78521b810b8ad20ad87e1d9313db1b9fff Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:25 -0500 Subject: [PATCH 200/230] Update project.nuget.cache --- obj/project.nuget.cache | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/obj/project.nuget.cache b/obj/project.nuget.cache index 146a5048..f8e6d6c0 100644 --- a/obj/project.nuget.cache +++ b/obj/project.nuget.cache @@ -1,12 +1,13 @@ { "version": 2, - "dgSpecHash": "BbYkv6uxcXI=", + "dgSpecHash": "npaWG5nq9uo=", "success": true, "projectFilePath": "C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\ProcessorEmulator.csproj", "expectedPackageFiles": [ "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.ref\\6.0.36\\microsoft.netcore.app.ref.6.0.36.nupkg.sha512", "C:\\Users\\juler\\.nuget\\packages\\microsoft.windowsdesktop.app.ref\\6.0.36\\microsoft.windowsdesktop.app.ref.6.0.36.nupkg.sha512", - "C:\\Users\\juler\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512" + "C:\\Users\\juler\\.nuget\\packages\\microsoft.aspnetcore.app.ref\\6.0.36\\microsoft.aspnetcore.app.ref.6.0.36.nupkg.sha512", + "C:\\Users\\juler\\.nuget\\packages\\microsoft.netcore.app.host.win-x64\\6.0.36\\microsoft.netcore.app.host.win-x64.6.0.36.nupkg.sha512" ], "logs": [] } \ No newline at end of file From f717d405e655c58335c232e3e4b7ed84b7d34e40 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:31 -0500 Subject: [PATCH 201/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index f1884c2e..a84b55cf 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -4,8 +4,11 @@ WinExe net6.0-windows true - - false + + false + false + + true ProcessorEmulator ProcessorEmulator @@ -15,5 +18,8 @@ - + + + + From 59fd0148193eb76f0774b9eb288be38389e30b27 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:37 -0500 Subject: [PATCH 202/230] Update ci.yml --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3c3e614..16512eb4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,4 +26,5 @@ jobs: run: dotnet build ProcessorEmulator.csproj --configuration Release --no-restore - name: Run tests (if any) - run: echo "Skipping tests: no test projects defined." + run: | + echo "Skipping tests: no test projects defined." From 832980e07064ca0de774f04ec3fe4e629de7f038 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:41 -0500 Subject: [PATCH 203/230] Update QemuManager.cs --- QemuManager.cs | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/QemuManager.cs b/QemuManager.cs index 06e2ad37..3492a168 100644 --- a/QemuManager.cs +++ b/QemuManager.cs @@ -60,9 +60,19 @@ private static string GetQemuExecutable(string architecture) private static string GetQemuArgs(string imagePath, string architecture) { - // Basic args, can be extended for more options - // Use default graphical display; remove nographic to show firmware UI - return $"-m 256 -drive file=\"{imagePath}\",format=raw"; + // Select machine type based on architecture: malta for MIPS, virt for ARM + string machine = null; + if (architecture.StartsWith("MIPS", StringComparison.OrdinalIgnoreCase)) machine = "malta"; + else if (architecture.StartsWith("ARM", StringComparison.OrdinalIgnoreCase)) machine = "virt"; + string machineArg = string.IsNullOrEmpty(machine) ? string.Empty : $"-machine {machine}"; + // If this is a raw firmware blob, boot it as a kernel with serial console + var ext = Path.GetExtension(imagePath).ToLowerInvariant(); + if (ext == ".bin") + { + return $"{machineArg} -m 256 -kernel \"{imagePath}\" -serial stdio"; + } + // Otherwise boot from image drive with VGA display + return $"{machineArg} -m 256 -drive file=\"{imagePath}\",format=raw -boot order=c -vga std -display sdl"; } public static void Launch(string imagePath, string architecture) @@ -73,6 +83,7 @@ public static void Launch(string imagePath, string architecture) var args = GetQemuArgs(imagePath, architecture); // Launch QEMU with GUI window + // Launch QEMU directly with GUI var process = new Process { StartInfo = new ProcessStartInfo @@ -94,12 +105,13 @@ public static void LaunchWithArgs(string imagePath, string architecture, string var args = GetQemuArgs(imagePath, architecture) + " " + extraArgs; // Launch QEMU with GUI window and extra args + // Launch QEMU with extra args directly var process = new Process { StartInfo = new ProcessStartInfo { FileName = qemuExe, - Arguments = args, + Arguments = args + " " + extraArgs, UseShellExecute = true, CreateNoWindow = false } From 950febdf58b5a2156ea3273f861f638292fd524f Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:48 -0500 Subject: [PATCH 204/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index 3eb200ef..d497c022 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3f2ee0ca15c9402d0adf5a513098cf7d160a03aa")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+59fd0148193eb76f0774b9eb288be38389e30b27")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 991facb3acea5bb6fa53deed0292caa6edba4e30 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:09:55 -0500 Subject: [PATCH 205/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 5d2acd22..8d36f917 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -2c024be1bc83e86a51b9fccb22ff4b90b19cb9ea0579a14ff3ab0ba35ef7ea88 +4141956ae82ec408ee580ee97521c934a6dda8ea6ce2b0c9093df3548387b988 From a233ea98537d189d722dd95150f41b74a4bc8f68 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:10:00 -0500 Subject: [PATCH 206/230] Update ProcessorEmulator.csproj --- ProcessorEmulator.csproj | 7 ------- 1 file changed, 7 deletions(-) diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index a84b55cf..e77ff9dd 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -4,9 +4,6 @@ WinExe net6.0-windows true - - false - false true ProcessorEmulator @@ -18,8 +15,4 @@ - - - - From 17974f46b7bce5d6bc4a73c04099e1a0cc570ce8 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:10:48 -0500 Subject: [PATCH 207/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index d497c022..cb2f35d6 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+59fd0148193eb76f0774b9eb288be38389e30b27")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a233ea98537d189d722dd95150f41b74a4bc8f68")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From ce920fb80b887e0b922cf75346ce5ab83d0c0ad4 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:10:53 -0500 Subject: [PATCH 208/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 8d36f917..2d1e5e5e 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -4141956ae82ec408ee580ee97521c934a6dda8ea6ce2b0c9093df3548387b988 +56aece4049d19cc742e11ac5bce5a6385069db2a0714cf284bea9e6291fecd62 From 1a020ddfcd106d71129d422711ad381897f6e0b6 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:50:36 -0500 Subject: [PATCH 209/230] Update MainWindow.xaml.cs --- MainWindow.xaml.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 8f0f8291..73c2ffa9 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -47,6 +47,11 @@ public MainWindow() this.Drop += MainWindow_Drop; } + private void InitializeComponent() + { + throw new NotImplementedException(); + } + public MainWindow(IEmulator currentEmulator) { this.currentEmulator = currentEmulator; From 1f2a339fa9f96b90cd12e031f792e046f3ed6400 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:50:40 -0500 Subject: [PATCH 210/230] Update ProcessorEmulator.AssemblyInfoInputs.cache --- .../net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index 2d1e5e5e..d812f750 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -56aece4049d19cc742e11ac5bce5a6385069db2a0714cf284bea9e6291fecd62 +7bf9897adca0809ec6ff3436e56b7bfe8fe4f6e6d1ca4ff5f87e985479df57f2 From a7b1f3ba89c469dd7ee27c89c8b4b4f31a8eb26b Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:50:44 -0500 Subject: [PATCH 211/230] Update ProcessorEmulator.AssemblyInfo.cs --- obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index cb2f35d6..c382fe87 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a233ea98537d189d722dd95150f41b74a4bc8f68")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ce920fb80b887e0b922cf75346ce5ab83d0c0ad4")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] From 8927025e28bd87f07397c04cdf49c886b4f0a003 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:21:27 -0500 Subject: [PATCH 212/230] Update CI workflow and project for Windows Desktop Replaces the test step in the CI workflow with a publish step to generate artifacts. Updates the project file to use Microsoft.NET.Sdk.WindowsDesktop, removes a redundant InitializeComponent implementation, and disables YAML validation in VS Code settings. These changes improve build automation and align the project with WPF requirements. --- .github/workflows/ci.yml | 6 ++---- .vscode/settings.json | 5 ++++- MainWindow.xaml.cs | 5 ----- ProcessorEmulator.csproj | 2 +- obj/Debug/net6.0-windows/MainWindow.baml | Bin 1823 -> 1768 bytes obj/Debug/net6.0-windows/MainWindow.g.cs | 12 ++--------- .../ProcessorEmulator.AssemblyInfo.cs | 2 +- ...ProcessorEmulator.AssemblyInfoInputs.cache | 2 +- .../ProcessorEmulator.g.resources | Bin 4038 -> 3983 bytes .../ProcessorEmulator.sourcelink.json | 2 +- .../ProcessorEmulator_MarkupCompile.cache | 20 ++++++++++++++++++ 11 files changed, 32 insertions(+), 24 deletions(-) create mode 100644 obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 16512eb4..d6a433d9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,5 @@ jobs: - name: Build solution run: dotnet build ProcessorEmulator.csproj --configuration Release --no-restore - - - name: Run tests (if any) - run: | - echo "Skipping tests: no test projects defined." + - name: Publish artifacts + run: dotnet publish ProcessorEmulator.csproj --configuration Release --output artifacts \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index b0430290..09b458bb 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -37,5 +37,8 @@ // Disable telemetry for reduced background activity "telemetry.enableTelemetry": false, - "telemetry.telemetryLevel": "off" + "telemetry.telemetryLevel": "off", + + // YAML: disable built-in validation to ignore ci.yml errors + "yaml.validate": false } diff --git a/MainWindow.xaml.cs b/MainWindow.xaml.cs index 73c2ffa9..af84a485 100644 --- a/MainWindow.xaml.cs +++ b/MainWindow.xaml.cs @@ -41,16 +41,11 @@ public partial class MainWindow : Window, IMainWindow public MainWindow() { // Load XAML UI components - InitializeComponent(); // Initialize drag-and-drop for file support this.AllowDrop = true; this.Drop += MainWindow_Drop; } - private void InitializeComponent() - { - throw new NotImplementedException(); - } public MainWindow(IEmulator currentEmulator) { diff --git a/ProcessorEmulator.csproj b/ProcessorEmulator.csproj index e77ff9dd..a1d7804f 100644 --- a/ProcessorEmulator.csproj +++ b/ProcessorEmulator.csproj @@ -1,4 +1,4 @@ - + WinExe diff --git a/obj/Debug/net6.0-windows/MainWindow.baml b/obj/Debug/net6.0-windows/MainWindow.baml index d857276e9b2703e06d67a595790f827a3a2844aa..8310206e0ea61c462d8f6ba2afdd60c37f3aaf8f 100644 GIT binary patch delta 38 tcmbQw_kwrBEoRsFABZar#4Ki(KyvbP<_JcX%?>Od85vn8 I8?kKz0D=$ // This code was generated by a tool. @@ -87,14 +87,6 @@ void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object return; case 3: - #line 11 "..\..\..\MainWindow.xaml" - ((System.Windows.Controls.MenuItem)(target)).Click += new System.Windows.RoutedEventHandler(this.AnalyzeFirmware_Click); - - #line default - #line hidden - return; - case 4: - #line 18 "..\..\..\MainWindow.xaml" ((System.Windows.Controls.MenuItem)(target)).Checked += new System.Windows.RoutedEventHandler(this.UseUnicorn_Checked); @@ -107,7 +99,7 @@ void System.Windows.Markup.IComponentConnector.Connect(int connectionId, object #line default #line hidden return; - case 5: + case 4: #line 29 "..\..\..\MainWindow.xaml" ((System.Windows.Controls.Button)(target)).Click += new System.Windows.RoutedEventHandler(this.StartEmulation_Click); diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs index c382fe87..cd4689ff 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfo.cs @@ -13,7 +13,7 @@ [assembly: System.Reflection.AssemblyCompanyAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ce920fb80b887e0b922cf75346ce5ab83d0c0ad4")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+a7b1f3ba89c469dd7ee27c89c8b4b4f31a8eb26b")] [assembly: System.Reflection.AssemblyProductAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyTitleAttribute("ProcessorEmulator")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache index d812f750..994987e5 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.AssemblyInfoInputs.cache @@ -1 +1 @@ -7bf9897adca0809ec6ff3436e56b7bfe8fe4f6e6d1ca4ff5f87e985479df57f2 +39379c3b5bb60f2245ae23a91b7b0ef3b7cbfbc83002b316602d5fbca324c06b diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources b/obj/Debug/net6.0-windows/ProcessorEmulator.g.resources index 41e44f9c9115080a4ac1b5fe7ea08c9763e735ed..cae97b32810c37019de67512a68c90784bc1e75b 100644 GIT binary patch delta 50 zcmX>m-!H#mF$dENw#of0YMW1UY-8rV_Lsqwn}LBr2#8rGALWT)WZo>t`;n26WwHSO FHUOgb4xIo1 delta 70 zcmeB|KPJCnF$a@8`{aHWwauqFwlVYN{$nuZW?*0t0%Bd}$zD7fd?2ng5VM$B0?EmJ UJQ0j6o1gQ1WMpKWe3Ne*0AT$PtpET3 diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json index 18eb464b..a1dc5396 100644 --- a/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json +++ b/obj/Debug/net6.0-windows/ProcessorEmulator.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/3f2ee0ca15c9402d0adf5a513098cf7d160a03aa/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\juler\\Documents\\GitHub\\Processor-Emulator\\*":"https://raw.githubusercontent.com/julerobb1/Processor-Emulator/a7b1f3ba89c469dd7ee27c89c8b4b4f31a8eb26b/*"}} \ No newline at end of file diff --git a/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache new file mode 100644 index 00000000..789cd5e7 --- /dev/null +++ b/obj/Debug/net6.0-windows/ProcessorEmulator_MarkupCompile.cache @@ -0,0 +1,20 @@ +ProcessorEmulator + + +winexe +C# +.cs +C:\Users\juler\Documents\GitHub\Processor-Emulator\obj\Debug\net6.0-windows\ +ProcessorEmulator +none +false +TRACE;DEBUG;NET;NET6_0;NETCOREAPP;WINDOWS;WINDOWS7_0;NET5_0_OR_GREATER;NET6_0_OR_GREATER;NETCOREAPP3_0_OR_GREATER;NETCOREAPP3_1_OR_GREATER;WINDOWS7_0_OR_GREATER +C:\Users\juler\Documents\GitHub\Processor-Emulator\App.xaml +2-826070488 + +39-1121013689 +1942128195826 +ClassicStyle.xaml;MainWindow.xaml; + +False + From 73f595da9c8377d12dbcfb5f0f309898c3f63727 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:28:18 -0500 Subject: [PATCH 213/230] Update ProcessorEmulator.exe --- .../net6.0-windows/ProcessorEmulator.exe | Bin 151040 -> 151040 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/bin/Debug/net6.0-windows/ProcessorEmulator.exe b/bin/Debug/net6.0-windows/ProcessorEmulator.exe index 6f634668050fcb3dbbc503a44e644355523a9d6f..2b90a9a6ce342ca85cd3ecf72f0e7a167f99db0c 100644 GIT binary patch delta 99 zcmZpe!`T2tEsR^3BE0=A7%Ul#7|aL8PXVx7*c`IfFYS7k-?C`6i8b#m;m`k3@Jb|5lE&1MH7M8 kkii%zV##0uRFlSF4wNxuFaxVG0LmmXByL~s%@oN50N?KtF8}}l From a34fdb35da5af1717f812520a320be232368bcb7 Mon Sep 17 00:00:00 2001 From: Julian R <25588072+julerobb1@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:28:23 -0500 Subject: [PATCH 214/230] Update MainWindow.xaml --- MainWindow.xaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/MainWindow.xaml b/MainWindow.xaml index d30bcca9..44287629 100644 --- a/MainWindow.xaml +++ b/MainWindow.xaml @@ -28,6 +28,9 @@