deadmoon 3 лет назад
Родитель
Сommit
589cdb9d75

+ 2 - 2
Optimizer/Controls/MoonList.cs

@@ -25,12 +25,12 @@ namespace Optimizer
 
             if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
             {
-                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(50,50,50)), e.Bounds);
+                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(50, 50, 50)), e.Bounds);
             }
 
             else
             {
-                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(20,20,20)), e.Bounds);
+                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(20, 20, 20)), e.Bounds);
 
             }
 

+ 2 - 2
Optimizer/Controls/MoonTabs.cs

@@ -186,9 +186,9 @@ namespace Optimizer
             SolidBrush brushActiveText;
 
             using (Pen penActive = new Pen(Options.ForegroundColor))
-            using (Pen penBorder = new Pen(Color.FromArgb(40,40,40), 0))
+            using (Pen penBorder = new Pen(Color.FromArgb(40, 40, 40), 0))
             using (SolidBrush brushActive = new SolidBrush(Options.ForegroundColor))
-            using (SolidBrush brushInActive = new SolidBrush(Color.FromArgb(40,40,40)))
+            using (SolidBrush brushInActive = new SolidBrush(Color.FromArgb(40, 40, 40)))
             using (SolidBrush brushAlternative = new SolidBrush(Options.ForegroundColor))
             using (SolidBrush brushActiveIndicator = new SolidBrush(ControlPaint.Light(Options.ForegroundColor)))
             using (SolidBrush brushInActiveIndicator = new SolidBrush(Options.ForegroundColor))

+ 2 - 2
Optimizer/Controls/MoonTip.cs

@@ -36,14 +36,14 @@ namespace Optimizer
             Graphics g = e.Graphics;
 
             LinearGradientBrush b = new LinearGradientBrush(e.Bounds,
-                Color.FromArgb(40,40,40), Color.FromArgb(40, 40, 40), 45f);
+                Color.FromArgb(40, 40, 40), Color.FromArgb(40, 40, 40), 45f);
 
             g.FillRectangle(b, e.Bounds);
 
             g.DrawRectangle(new Pen(Color.FromArgb(40, 40, 40), 1), new Rectangle(e.Bounds.X, e.Bounds.Y,
                 e.Bounds.Width - 1, e.Bounds.Height - 1));
 
-            
+
             g.DrawString(e.ToolTipText, font, Brushes.White,
                 new PointF(e.Bounds.X + 6, e.Bounds.Y + 6)); // top layer
 

+ 61 - 0
Optimizer/Controls/MoonTree.cs

@@ -0,0 +1,61 @@
+using System.Drawing;
+using System.Windows.Forms;
+
+namespace Optimizer
+{
+    public class MoonTree : TreeView
+    {
+        string[] rootNodes =
+        {
+            "cpu", "ram", "mobo", "gpu", "disk", "inet", "audio", "dev"
+        };
+
+        string _primaryItemTag = "_primary";
+
+        public MoonTree()
+        {
+            this.DrawMode = TreeViewDrawMode.OwnerDrawAll;
+            this.BackColor = Color.FromArgb(20, 20, 20);
+            this.ForeColor = Color.White;
+            this.BorderStyle = BorderStyle.None;
+        }
+
+        private bool FindName(string name)
+        {
+            foreach (string x in rootNodes)
+            {
+                if (x == name) return true;
+            }
+
+            return false;
+        }
+
+        protected override void OnDrawNode(DrawTreeNodeEventArgs e)
+        {
+            Rectangle r = new Rectangle();
+            r.X = 0;
+            r.Y = e.Bounds.Y;
+
+            r.Height = e.Bounds.Height;
+            r.Width = 100000;
+
+            if (e.Node.IsSelected)
+            {
+                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(50, 50, 50)), r); //e.Bounds
+            }
+            else
+            {
+                e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(20, 20, 20)), r); //e.Bounds
+            }
+
+            if (FindName(e.Node.Name)) TextRenderer.DrawText(e.Graphics, e.Node.Text, this.Font, e.Node.Bounds, Color.Silver);
+            else if (e.Node.Tag != null && e.Node.Tag.ToString() == _primaryItemTag) TextRenderer.DrawText(e.Graphics, e.Node.Text, this.Font, e.Node.Bounds, Options.ForegroundColor);
+            else TextRenderer.DrawText(e.Graphics, e.Node.Text, this.Font, e.Node.Bounds, Color.White);
+
+            if (this.ImageList != null && this.ImageList.Images.Count > 0 && e.Node.SelectedImageIndex > -1)
+            {
+                e.Graphics.DrawImage(this.ImageList.Images[e.Node.SelectedImageIndex], e.Bounds.Left + 15 * e.Node.Level + 5, e.Bounds.Top);
+            }
+        }
+    }
+}

+ 0 - 7
Optimizer/Controls/ToggleCard.cs

@@ -1,11 +1,4 @@
 using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Data;
-using System.Drawing;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
 using System.Windows.Forms;
 
 namespace Optimizer

+ 524 - 227
Optimizer/Forms/MainForm.Designer.cs

@@ -32,6 +32,14 @@ namespace Optimizer
         {
             this.components = new System.ComponentModel.Container();
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
+            System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("Processors", 0, 0);
+            System.Windows.Forms.TreeNode treeNode2 = new System.Windows.Forms.TreeNode("Memory", 1, 1);
+            System.Windows.Forms.TreeNode treeNode3 = new System.Windows.Forms.TreeNode("Graphics", 2, 2);
+            System.Windows.Forms.TreeNode treeNode4 = new System.Windows.Forms.TreeNode("Motherboard", 3, 3);
+            System.Windows.Forms.TreeNode treeNode5 = new System.Windows.Forms.TreeNode("Storage", 4, 4);
+            System.Windows.Forms.TreeNode treeNode6 = new System.Windows.Forms.TreeNode("Network Adapters", 5, 5);
+            System.Windows.Forms.TreeNode treeNode7 = new System.Windows.Forms.TreeNode("Audio", 6, 6);
+            System.Windows.Forms.TreeNode treeNode8 = new System.Windows.Forms.TreeNode("Peripherals", 7, 7);
             this.tpanel = new System.Windows.Forms.Panel();
             this.picUpdate = new System.Windows.Forms.PictureBox();
             this.txtNetFw = new System.Windows.Forms.Label();
@@ -41,28 +49,6 @@ namespace Optimizer
             this.pictureBox1 = new System.Windows.Forms.PictureBox();
             this.label2 = new System.Windows.Forms.Label();
             this.bpanel = new System.Windows.Forms.Panel();
-            this.defineCommandDialog = new System.Windows.Forms.OpenFileDialog();
-            this.defineProgramDialog = new System.Windows.Forms.OpenFileDialog();
-            this.defineFolderDialog = new System.Windows.Forms.FolderBrowserDialog();
-            this.defineFileDialog = new System.Windows.Forms.OpenFileDialog();
-            this.DefineProgramIconDialog = new System.Windows.Forms.OpenFileDialog();
-            this.DefineFolderIconDialog = new System.Windows.Forms.OpenFileDialog();
-            this.DefineURLIconDialog = new System.Windows.Forms.OpenFileDialog();
-            this.DefineFileIconDialog = new System.Windows.Forms.OpenFileDialog();
-            this.DefineCommandIconDialog = new System.Windows.Forms.OpenFileDialog();
-            this.ExportDialog = new System.Windows.Forms.SaveFileDialog();
-            this.launcherMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
-            this.trayStartup = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayCleaner = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayPinger = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayHosts = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayAD = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayRegistry = new System.Windows.Forms.ToolStripMenuItem();
-            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
-            this.trayOptions = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayRestartExplorer = new System.Windows.Forms.ToolStripMenuItem();
-            this.trayExit = new System.Windows.Forms.ToolStripMenuItem();
-            this.launcherIcon = new System.Windows.Forms.NotifyIcon(this.components);
             this.tabCollection = new Optimizer.MoonTabs();
             this.universalTab = new System.Windows.Forms.TabPage();
             this.reportingSw = new Optimizer.ToggleCard();
@@ -258,6 +244,17 @@ namespace Optimizer
             this.checkFolderOptions = new Optimizer.MoonCheck();
             this.checkControlPanel = new Optimizer.MoonCheck();
             this.registryTitle = new System.Windows.Forms.Label();
+            this.indiciumTab = new System.Windows.Forms.TabPage();
+            this.panel12 = new System.Windows.Forms.Panel();
+            this.specsTree = new Optimizer.MoonTree();
+            this.indiciumMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.toolHWCopy = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolHWGoogle = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolHWDuck = new System.Windows.Forms.ToolStripMenuItem();
+            this.panel11 = new System.Windows.Forms.Panel();
+            this.btnCopyHW = new System.Windows.Forms.Button();
+            this.btnSaveHW = new System.Windows.Forms.Button();
+            this.hwDetailed = new Optimizer.ToggleCard();
             this.integratorTab = new System.Windows.Forms.TabPage();
             this.synapse = new Optimizer.MoonTabs();
             this.integratorInfoTab = new System.Windows.Forms.TabPage();
@@ -370,12 +367,39 @@ namespace Optimizer
             this.btnUpdate = new System.Windows.Forms.Button();
             this.btnResetConfig = new System.Windows.Forms.Button();
             this.lblTheming = new System.Windows.Forms.Label();
+            this.imagesHw = new System.Windows.Forms.ImageList(this.components);
+            this.defineCommandDialog = new System.Windows.Forms.OpenFileDialog();
+            this.defineProgramDialog = new System.Windows.Forms.OpenFileDialog();
+            this.defineFolderDialog = new System.Windows.Forms.FolderBrowserDialog();
+            this.defineFileDialog = new System.Windows.Forms.OpenFileDialog();
+            this.DefineProgramIconDialog = new System.Windows.Forms.OpenFileDialog();
+            this.DefineFolderIconDialog = new System.Windows.Forms.OpenFileDialog();
+            this.DefineURLIconDialog = new System.Windows.Forms.OpenFileDialog();
+            this.DefineFileIconDialog = new System.Windows.Forms.OpenFileDialog();
+            this.DefineCommandIconDialog = new System.Windows.Forms.OpenFileDialog();
+            this.ExportDialog = new System.Windows.Forms.SaveFileDialog();
+            this.launcherMenu = new System.Windows.Forms.ContextMenuStrip(this.components);
+            this.trayDownSpeed = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayUpSpeed = new System.Windows.Forms.ToolStripMenuItem();
+            this.seperatorNetMon = new System.Windows.Forms.ToolStripSeparator();
+            this.trayStartup = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayCleaner = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayPinger = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayHosts = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayAD = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayHW = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayRegistry = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
+            this.trayOptions = new System.Windows.Forms.ToolStripMenuItem();
+            this.trayRestartExplorer = new System.Windows.Forms.ToolStripMenuItem();
+            this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
+            this.trayExit = new System.Windows.Forms.ToolStripMenuItem();
+            this.launcherIcon = new System.Windows.Forms.NotifyIcon(this.components);
             this.helpBox = new Optimizer.MoonTip();
             this.tpanel.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.picUpdate)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
             this.bpanel.SuspendLayout();
-            this.launcherMenu.SuspendLayout();
             this.tabCollection.SuspendLayout();
             this.universalTab.SuspendLayout();
             this.windows10Tab.SuspendLayout();
@@ -401,6 +425,10 @@ namespace Optimizer
             this.panelList.SuspendLayout();
             this.registryFixerTab.SuspendLayout();
             this.panel2.SuspendLayout();
+            this.indiciumTab.SuspendLayout();
+            this.panel12.SuspendLayout();
+            this.indiciumMenu.SuspendLayout();
+            this.panel11.SuspendLayout();
             this.integratorTab.SuspendLayout();
             this.synapse.SuspendLayout();
             this.integratorInfoTab.SuspendLayout();
@@ -432,6 +460,7 @@ namespace Optimizer
             this.panel8.SuspendLayout();
             ((System.ComponentModel.ISupportInitialize)(this.picFOSS)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.picFSF)).BeginInit();
+            this.launcherMenu.SuspendLayout();
             this.SuspendLayout();
             // 
             // tpanel
@@ -544,196 +573,6 @@ namespace Optimizer
             this.bpanel.Size = new System.Drawing.Size(1009, 641);
             this.bpanel.TabIndex = 2;
             // 
-            // defineCommandDialog
-            // 
-            this.defineCommandDialog.Filter = "Executables [*.exe]|*.exe";
-            this.defineCommandDialog.Title = "Optimizer";
-            this.defineCommandDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineCmd_FileOk);
-            // 
-            // defineProgramDialog
-            // 
-            this.defineProgramDialog.Filter = "Executables [*.exe]|*.exe";
-            this.defineProgramDialog.Title = "Optimizer";
-            this.defineProgramDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineProgramDialog_FileOk);
-            // 
-            // defineFolderDialog
-            // 
-            this.defineFolderDialog.Description = "Optimizer";
-            // 
-            // defineFileDialog
-            // 
-            this.defineFileDialog.Filter = "All files [*.*]|*.*";
-            this.defineFileDialog.Title = "Optimizer";
-            this.defineFileDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineFileDialog_FileOk);
-            // 
-            // DefineProgramIconDialog
-            // 
-            this.DefineProgramIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
-            this.DefineProgramIconDialog.Title = "Optimizer";
-            this.DefineProgramIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineProgramIconDialog_FileOk);
-            // 
-            // DefineFolderIconDialog
-            // 
-            this.DefineFolderIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
-            this.DefineFolderIconDialog.Title = "Optimizer";
-            this.DefineFolderIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineFolderIconDialog_FileOk);
-            // 
-            // DefineURLIconDialog
-            // 
-            this.DefineURLIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
-            this.DefineURLIconDialog.Title = "Optimizer";
-            this.DefineURLIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineURLIconDialog_FileOk);
-            // 
-            // DefineFileIconDialog
-            // 
-            this.DefineFileIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
-            this.DefineFileIconDialog.Title = "Optimizer";
-            this.DefineFileIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineFileIconDialog_FileOk);
-            // 
-            // DefineCommandIconDialog
-            // 
-            this.DefineCommandIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
-            this.DefineCommandIconDialog.Title = "Optimizer";
-            this.DefineCommandIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineCommandIconDialog_FileOk);
-            // 
-            // ExportDialog
-            // 
-            this.ExportDialog.Filter = "Text [*.txt]|*.txt";
-            this.ExportDialog.Title = "Optimizer";
-            // 
-            // launcherMenu
-            // 
-            this.launcherMenu.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10)))));
-            this.launcherMenu.Font = new System.Drawing.Font("Segoe UI Semibold", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.launcherMenu.ImageScalingSize = new System.Drawing.Size(20, 20);
-            this.launcherMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
-            this.trayStartup,
-            this.trayCleaner,
-            this.trayPinger,
-            this.trayHosts,
-            this.trayAD,
-            this.trayRegistry,
-            this.toolStripSeparator1,
-            this.trayOptions,
-            this.trayRestartExplorer,
-            this.trayExit});
-            this.launcherMenu.Name = "launcherMenu";
-            this.launcherMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
-            this.launcherMenu.Size = new System.Drawing.Size(194, 244);
-            // 
-            // trayStartup
-            // 
-            this.trayStartup.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayStartup.ForeColor = System.Drawing.Color.White;
-            this.trayStartup.Image = ((System.Drawing.Image)(resources.GetObject("trayStartup.Image")));
-            this.trayStartup.Name = "trayStartup";
-            this.trayStartup.Size = new System.Drawing.Size(193, 26);
-            this.trayStartup.Text = "Startup Manager";
-            this.trayStartup.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayStartup.Click += new System.EventHandler(this.startupItem_Click);
-            // 
-            // trayCleaner
-            // 
-            this.trayCleaner.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayCleaner.ForeColor = System.Drawing.Color.White;
-            this.trayCleaner.Image = ((System.Drawing.Image)(resources.GetObject("trayCleaner.Image")));
-            this.trayCleaner.Name = "trayCleaner";
-            this.trayCleaner.Size = new System.Drawing.Size(193, 26);
-            this.trayCleaner.Text = "PC Cleaner";
-            this.trayCleaner.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayCleaner.Click += new System.EventHandler(this.cleanerItem_Click);
-            // 
-            // trayPinger
-            // 
-            this.trayPinger.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayPinger.ForeColor = System.Drawing.Color.White;
-            this.trayPinger.Image = ((System.Drawing.Image)(resources.GetObject("trayPinger.Image")));
-            this.trayPinger.Name = "trayPinger";
-            this.trayPinger.Size = new System.Drawing.Size(193, 26);
-            this.trayPinger.Text = "Pinger Tool";
-            this.trayPinger.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayPinger.Click += new System.EventHandler(this.pingerItem_Click);
-            // 
-            // trayHosts
-            // 
-            this.trayHosts.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayHosts.ForeColor = System.Drawing.Color.White;
-            this.trayHosts.Image = ((System.Drawing.Image)(resources.GetObject("trayHosts.Image")));
-            this.trayHosts.Name = "trayHosts";
-            this.trayHosts.Size = new System.Drawing.Size(193, 26);
-            this.trayHosts.Text = "HOSTS Editor";
-            this.trayHosts.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayHosts.Click += new System.EventHandler(this.hostsItem_Click);
-            // 
-            // trayAD
-            // 
-            this.trayAD.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayAD.ForeColor = System.Drawing.Color.White;
-            this.trayAD.Image = ((System.Drawing.Image)(resources.GetObject("trayAD.Image")));
-            this.trayAD.Name = "trayAD";
-            this.trayAD.Size = new System.Drawing.Size(193, 26);
-            this.trayAD.Text = "Apps Downloader";
-            this.trayAD.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayAD.Click += new System.EventHandler(this.appsItem_Click);
-            // 
-            // trayRegistry
-            // 
-            this.trayRegistry.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayRegistry.ForeColor = System.Drawing.Color.White;
-            this.trayRegistry.Image = ((System.Drawing.Image)(resources.GetObject("trayRegistry.Image")));
-            this.trayRegistry.Name = "trayRegistry";
-            this.trayRegistry.Size = new System.Drawing.Size(193, 26);
-            this.trayRegistry.Text = "Registry Repair";
-            this.trayRegistry.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayRegistry.Click += new System.EventHandler(this.trayRegistry_Click);
-            // 
-            // toolStripSeparator1
-            // 
-            this.toolStripSeparator1.BackColor = System.Drawing.Color.DodgerBlue;
-            this.toolStripSeparator1.ForeColor = System.Drawing.Color.White;
-            this.toolStripSeparator1.Name = "toolStripSeparator1";
-            this.toolStripSeparator1.Size = new System.Drawing.Size(190, 6);
-            this.toolStripSeparator1.Tag = "";
-            // 
-            // trayOptions
-            // 
-            this.trayOptions.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayOptions.ForeColor = System.Drawing.Color.White;
-            this.trayOptions.Image = ((System.Drawing.Image)(resources.GetObject("trayOptions.Image")));
-            this.trayOptions.Name = "trayOptions";
-            this.trayOptions.Size = new System.Drawing.Size(193, 26);
-            this.trayOptions.Text = "Options";
-            this.trayOptions.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayOptions.Click += new System.EventHandler(this.trayOptions_Click);
-            // 
-            // trayRestartExplorer
-            // 
-            this.trayRestartExplorer.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayRestartExplorer.ForeColor = System.Drawing.Color.White;
-            this.trayRestartExplorer.Image = ((System.Drawing.Image)(resources.GetObject("trayRestartExplorer.Image")));
-            this.trayRestartExplorer.Name = "trayRestartExplorer";
-            this.trayRestartExplorer.Size = new System.Drawing.Size(193, 26);
-            this.trayRestartExplorer.Text = "Restart Explorer";
-            this.trayRestartExplorer.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
-            this.trayRestartExplorer.Click += new System.EventHandler(this.restartExpolorerItem_Click);
-            // 
-            // trayExit
-            // 
-            this.trayExit.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.trayExit.ForeColor = System.Drawing.Color.White;
-            this.trayExit.Image = ((System.Drawing.Image)(resources.GetObject("trayExit.Image")));
-            this.trayExit.Name = "trayExit";
-            this.trayExit.Size = new System.Drawing.Size(193, 26);
-            this.trayExit.Text = "Exit";
-            this.trayExit.Click += new System.EventHandler(this.exitItem_Click);
-            // 
-            // launcherIcon
-            // 
-            this.launcherIcon.ContextMenuStrip = this.launcherMenu;
-            this.launcherIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("launcherIcon.Icon")));
-            this.launcherIcon.Text = "Optimizer";
-            this.launcherIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.launcherIcon_MouseDoubleClick);
-            // 
             // tabCollection
             // 
             this.tabCollection.Controls.Add(this.universalTab);
@@ -746,6 +585,7 @@ namespace Optimizer
             this.tabCollection.Controls.Add(this.pingerTab);
             this.tabCollection.Controls.Add(this.hostsEditorTab);
             this.tabCollection.Controls.Add(this.registryFixerTab);
+            this.tabCollection.Controls.Add(this.indiciumTab);
             this.tabCollection.Controls.Add(this.integratorTab);
             this.tabCollection.Controls.Add(this.optionsTab);
             this.tabCollection.Dock = System.Windows.Forms.DockStyle.Fill;
@@ -2422,52 +2262,52 @@ namespace Optimizer
             // 
             this.label7.AutoSize = true;
             this.label7.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.label7.ForeColor = System.Drawing.Color.DodgerBlue;
+            this.label7.ForeColor = System.Drawing.Color.DarkGray;
             this.label7.Location = new System.Drawing.Point(550, 212);
             this.label7.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.label7.Name = "label7";
             this.label7.Size = new System.Drawing.Size(123, 21);
             this.label7.TabIndex = 56;
-            this.label7.Tag = "themeable";
+            this.label7.Tag = "";
             this.label7.Text = "Microsoft Edge";
             // 
             // label6
             // 
             this.label6.AutoSize = true;
             this.label6.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.label6.ForeColor = System.Drawing.Color.DodgerBlue;
+            this.label6.ForeColor = System.Drawing.Color.DarkGray;
             this.label6.Location = new System.Drawing.Point(361, 212);
             this.label6.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.label6.Name = "label6";
             this.label6.Size = new System.Drawing.Size(134, 21);
             this.label6.TabIndex = 55;
-            this.label6.Tag = "themeable";
+            this.label6.Tag = "";
             this.label6.Text = "Internet Explorer";
             // 
             // label5
             // 
             this.label5.AutoSize = true;
             this.label5.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.label5.ForeColor = System.Drawing.Color.DodgerBlue;
+            this.label5.ForeColor = System.Drawing.Color.DarkGray;
             this.label5.Location = new System.Drawing.Point(550, 18);
             this.label5.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.label5.Name = "label5";
             this.label5.Size = new System.Drawing.Size(117, 21);
             this.label5.TabIndex = 54;
-            this.label5.Tag = "themeable";
+            this.label5.Tag = "";
             this.label5.Text = "Mozilla Firefox";
             // 
             // label4
             // 
             this.label4.AutoSize = true;
             this.label4.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.label4.ForeColor = System.Drawing.Color.DodgerBlue;
+            this.label4.ForeColor = System.Drawing.Color.DarkGray;
             this.label4.Location = new System.Drawing.Point(362, 17);
             this.label4.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.label4.Name = "label4";
             this.label4.Size = new System.Drawing.Size(126, 21);
             this.label4.TabIndex = 47;
-            this.label4.Tag = "themeable";
+            this.label4.Tag = "";
             this.label4.Text = "Google Chrome";
             // 
             // pictureBox11
@@ -2571,7 +2411,7 @@ namespace Optimizer
             // 
             this.checkSelectAll.AutoSize = true;
             this.checkSelectAll.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.checkSelectAll.ForeColor = System.Drawing.Color.White;
+            this.checkSelectAll.ForeColor = System.Drawing.Color.Silver;
             this.checkSelectAll.Location = new System.Drawing.Point(29, 14);
             this.checkSelectAll.Margin = new System.Windows.Forms.Padding(2);
             this.checkSelectAll.Name = "checkSelectAll";
@@ -3556,6 +3396,192 @@ namespace Optimizer
             this.registryTitle.Tag = "themeable";
             this.registryTitle.Text = "Fix common registry issues";
             // 
+            // indiciumTab
+            // 
+            this.indiciumTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
+            this.indiciumTab.Controls.Add(this.panel12);
+            this.indiciumTab.Controls.Add(this.panel11);
+            this.indiciumTab.Location = new System.Drawing.Point(4, 25);
+            this.indiciumTab.Name = "indiciumTab";
+            this.indiciumTab.Padding = new System.Windows.Forms.Padding(3);
+            this.indiciumTab.Size = new System.Drawing.Size(999, 610);
+            this.indiciumTab.TabIndex = 14;
+            this.indiciumTab.Text = "Hardware";
+            // 
+            // panel12
+            // 
+            this.panel12.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.panel12.Controls.Add(this.specsTree);
+            this.panel12.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.panel12.Location = new System.Drawing.Point(3, 38);
+            this.panel12.Name = "panel12";
+            this.panel12.Size = new System.Drawing.Size(993, 569);
+            this.panel12.TabIndex = 2;
+            // 
+            // specsTree
+            // 
+            this.specsTree.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
+            this.specsTree.BorderStyle = System.Windows.Forms.BorderStyle.None;
+            this.specsTree.ContextMenuStrip = this.indiciumMenu;
+            this.specsTree.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.specsTree.DrawMode = System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
+            this.specsTree.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.specsTree.ForeColor = System.Drawing.Color.White;
+            this.specsTree.Location = new System.Drawing.Point(0, 0);
+            this.specsTree.Name = "specsTree";
+            treeNode1.ImageIndex = 0;
+            treeNode1.Name = "cpu";
+            treeNode1.SelectedImageIndex = 0;
+            treeNode1.Text = "Processors";
+            treeNode2.ImageIndex = 1;
+            treeNode2.Name = "ram";
+            treeNode2.SelectedImageIndex = 1;
+            treeNode2.Text = "Memory";
+            treeNode3.ImageIndex = 2;
+            treeNode3.Name = "gpu";
+            treeNode3.SelectedImageIndex = 2;
+            treeNode3.Text = "Graphics";
+            treeNode4.ImageIndex = 3;
+            treeNode4.Name = "mobo";
+            treeNode4.SelectedImageIndex = 3;
+            treeNode4.Text = "Motherboard";
+            treeNode5.ImageIndex = 4;
+            treeNode5.Name = "disk";
+            treeNode5.SelectedImageIndex = 4;
+            treeNode5.Text = "Storage";
+            treeNode6.ImageIndex = 5;
+            treeNode6.Name = "inet";
+            treeNode6.SelectedImageIndex = 5;
+            treeNode6.Text = "Network Adapters";
+            treeNode7.ImageIndex = 6;
+            treeNode7.Name = "audio";
+            treeNode7.SelectedImageIndex = 6;
+            treeNode7.Text = "Audio";
+            treeNode8.ImageIndex = 7;
+            treeNode8.Name = "dev";
+            treeNode8.SelectedImageIndex = 7;
+            treeNode8.Text = "Peripherals";
+            this.specsTree.Nodes.AddRange(new System.Windows.Forms.TreeNode[] {
+            treeNode1,
+            treeNode2,
+            treeNode3,
+            treeNode4,
+            treeNode5,
+            treeNode6,
+            treeNode7,
+            treeNode8});
+            this.specsTree.Size = new System.Drawing.Size(991, 567);
+            this.specsTree.TabIndex = 0;
+            this.specsTree.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.specsTree_NodeMouseClick);
+            // 
+            // indiciumMenu
+            // 
+            this.indiciumMenu.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10)))));
+            this.indiciumMenu.Font = new System.Drawing.Font("Segoe UI Semibold", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.indiciumMenu.ImageScalingSize = new System.Drawing.Size(20, 20);
+            this.indiciumMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.toolHWCopy,
+            this.toolHWGoogle,
+            this.toolHWDuck});
+            this.indiciumMenu.Name = "launcherMenu";
+            this.indiciumMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
+            this.indiciumMenu.ShowImageMargin = false;
+            this.indiciumMenu.Size = new System.Drawing.Size(223, 76);
+            // 
+            // toolHWCopy
+            // 
+            this.toolHWCopy.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.toolHWCopy.ForeColor = System.Drawing.Color.White;
+            this.toolHWCopy.Name = "toolHWCopy";
+            this.toolHWCopy.Size = new System.Drawing.Size(222, 24);
+            this.toolHWCopy.Text = "Copy";
+            this.toolHWCopy.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.toolHWCopy.Click += new System.EventHandler(this.toolStripMenuItem1_Click);
+            // 
+            // toolHWGoogle
+            // 
+            this.toolHWGoogle.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.toolHWGoogle.ForeColor = System.Drawing.Color.White;
+            this.toolHWGoogle.Name = "toolHWGoogle";
+            this.toolHWGoogle.Size = new System.Drawing.Size(222, 24);
+            this.toolHWGoogle.Text = "Search with Google...";
+            this.toolHWGoogle.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.toolHWGoogle.Click += new System.EventHandler(this.toolStripMenuItem2_Click);
+            // 
+            // toolHWDuck
+            // 
+            this.toolHWDuck.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.toolHWDuck.ForeColor = System.Drawing.Color.White;
+            this.toolHWDuck.Name = "toolHWDuck";
+            this.toolHWDuck.Size = new System.Drawing.Size(222, 24);
+            this.toolHWDuck.Text = "Search with DuckDuckGo...";
+            this.toolHWDuck.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.toolHWDuck.Click += new System.EventHandler(this.toolStripMenuItem3_Click);
+            // 
+            // panel11
+            // 
+            this.panel11.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
+            this.panel11.Controls.Add(this.btnCopyHW);
+            this.panel11.Controls.Add(this.btnSaveHW);
+            this.panel11.Controls.Add(this.hwDetailed);
+            this.panel11.Dock = System.Windows.Forms.DockStyle.Top;
+            this.panel11.Location = new System.Drawing.Point(3, 3);
+            this.panel11.Name = "panel11";
+            this.panel11.Size = new System.Drawing.Size(993, 35);
+            this.panel11.TabIndex = 1;
+            // 
+            // btnCopyHW
+            // 
+            this.btnCopyHW.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnCopyHW.BackColor = System.Drawing.Color.DodgerBlue;
+            this.btnCopyHW.FlatAppearance.BorderSize = 0;
+            this.btnCopyHW.FlatAppearance.MouseDownBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnCopyHW.FlatAppearance.MouseOverBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnCopyHW.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.btnCopyHW.ForeColor = System.Drawing.Color.White;
+            this.btnCopyHW.Location = new System.Drawing.Point(703, 4);
+            this.btnCopyHW.Margin = new System.Windows.Forms.Padding(2);
+            this.btnCopyHW.Name = "btnCopyHW";
+            this.btnCopyHW.Size = new System.Drawing.Size(140, 25);
+            this.btnCopyHW.TabIndex = 91;
+            this.btnCopyHW.Tag = "themeable";
+            this.btnCopyHW.Text = "Copy";
+            this.btnCopyHW.UseVisualStyleBackColor = false;
+            this.btnCopyHW.Click += new System.EventHandler(this.btnCopyHW_Click);
+            // 
+            // btnSaveHW
+            // 
+            this.btnSaveHW.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
+            this.btnSaveHW.BackColor = System.Drawing.Color.DodgerBlue;
+            this.btnSaveHW.FlatAppearance.BorderSize = 0;
+            this.btnSaveHW.FlatAppearance.MouseDownBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnSaveHW.FlatAppearance.MouseOverBackColor = System.Drawing.Color.RoyalBlue;
+            this.btnSaveHW.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
+            this.btnSaveHW.ForeColor = System.Drawing.Color.White;
+            this.btnSaveHW.Location = new System.Drawing.Point(847, 4);
+            this.btnSaveHW.Margin = new System.Windows.Forms.Padding(2);
+            this.btnSaveHW.Name = "btnSaveHW";
+            this.btnSaveHW.Size = new System.Drawing.Size(140, 25);
+            this.btnSaveHW.TabIndex = 90;
+            this.btnSaveHW.Tag = "themeable";
+            this.btnSaveHW.Text = "Save";
+            this.btnSaveHW.UseVisualStyleBackColor = false;
+            this.btnSaveHW.Click += new System.EventHandler(this.btnSaveHW_Click);
+            // 
+            // hwDetailed
+            // 
+            this.hwDetailed.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
+            this.hwDetailed.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.hwDetailed.ForeColor = System.Drawing.Color.White;
+            this.hwDetailed.LabelText = "Detailed View";
+            this.hwDetailed.Location = new System.Drawing.Point(5, 4);
+            this.hwDetailed.Name = "hwDetailed";
+            this.hwDetailed.Size = new System.Drawing.Size(374, 24);
+            this.hwDetailed.TabIndex = 89;
+            this.hwDetailed.Tag = "themeable";
+            this.hwDetailed.ToggleChecked = true;
+            this.hwDetailed.ToggleClicked += new System.EventHandler(this.hwDetailed_ToggleClicked);
+            // 
             // integratorTab
             // 
             this.integratorTab.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
@@ -5016,12 +5042,12 @@ namespace Optimizer
             // lblUpdateDisabled
             // 
             this.lblUpdateDisabled.AutoSize = true;
-            this.lblUpdateDisabled.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.lblUpdateDisabled.ForeColor = System.Drawing.Color.Gold;
+            this.lblUpdateDisabled.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.lblUpdateDisabled.ForeColor = System.Drawing.Color.Silver;
             this.lblUpdateDisabled.Location = new System.Drawing.Point(32, 358);
             this.lblUpdateDisabled.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
             this.lblUpdateDisabled.Name = "lblUpdateDisabled";
-            this.lblUpdateDisabled.Size = new System.Drawing.Size(239, 21);
+            this.lblUpdateDisabled.Size = new System.Drawing.Size(208, 19);
             this.lblUpdateDisabled.TabIndex = 69;
             this.lblUpdateDisabled.Text = "Disabled in experimental builds";
             this.lblUpdateDisabled.Visible = false;
@@ -5196,6 +5222,7 @@ namespace Optimizer
             // btnResetConfig
             // 
             this.btnResetConfig.BackColor = System.Drawing.Color.DodgerBlue;
+            this.btnResetConfig.FlatAppearance.BorderColor = System.Drawing.Color.RoyalBlue;
             this.btnResetConfig.FlatAppearance.BorderSize = 0;
             this.btnResetConfig.FlatAppearance.MouseDownBackColor = System.Drawing.Color.RoyalBlue;
             this.btnResetConfig.FlatAppearance.MouseOverBackColor = System.Drawing.Color.RoyalBlue;
@@ -5223,6 +5250,256 @@ namespace Optimizer
             this.lblTheming.Tag = "themeable";
             this.lblTheming.Text = "Choose your theme";
             // 
+            // imagesHw
+            // 
+            this.imagesHw.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imagesHw.ImageStream")));
+            this.imagesHw.TransparentColor = System.Drawing.Color.Transparent;
+            this.imagesHw.Images.SetKeyName(0, "cpu.png");
+            this.imagesHw.Images.SetKeyName(1, "ram.png");
+            this.imagesHw.Images.SetKeyName(2, "gpu.png");
+            this.imagesHw.Images.SetKeyName(3, "mobo.png");
+            this.imagesHw.Images.SetKeyName(4, "1608923_hdd_o_icon.png");
+            this.imagesHw.Images.SetKeyName(5, "inet.png");
+            this.imagesHw.Images.SetKeyName(6, "audio.png");
+            this.imagesHw.Images.SetKeyName(7, "dev.png");
+            this.imagesHw.Images.SetKeyName(8, "os.png");
+            // 
+            // defineCommandDialog
+            // 
+            this.defineCommandDialog.Filter = "Executables [*.exe]|*.exe";
+            this.defineCommandDialog.Title = "Optimizer";
+            this.defineCommandDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineCmd_FileOk);
+            // 
+            // defineProgramDialog
+            // 
+            this.defineProgramDialog.Filter = "Executables [*.exe]|*.exe";
+            this.defineProgramDialog.Title = "Optimizer";
+            this.defineProgramDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineProgramDialog_FileOk);
+            // 
+            // defineFolderDialog
+            // 
+            this.defineFolderDialog.Description = "Optimizer";
+            // 
+            // defineFileDialog
+            // 
+            this.defineFileDialog.Filter = "All files [*.*]|*.*";
+            this.defineFileDialog.Title = "Optimizer";
+            this.defineFileDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineFileDialog_FileOk);
+            // 
+            // DefineProgramIconDialog
+            // 
+            this.DefineProgramIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
+            this.DefineProgramIconDialog.Title = "Optimizer";
+            this.DefineProgramIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineProgramIconDialog_FileOk);
+            // 
+            // DefineFolderIconDialog
+            // 
+            this.DefineFolderIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
+            this.DefineFolderIconDialog.Title = "Optimizer";
+            this.DefineFolderIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineFolderIconDialog_FileOk);
+            // 
+            // DefineURLIconDialog
+            // 
+            this.DefineURLIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
+            this.DefineURLIconDialog.Title = "Optimizer";
+            this.DefineURLIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineURLIconDialog_FileOk);
+            // 
+            // DefineFileIconDialog
+            // 
+            this.DefineFileIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
+            this.DefineFileIconDialog.Title = "Optimizer";
+            this.DefineFileIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineFileIconDialog_FileOk);
+            // 
+            // DefineCommandIconDialog
+            // 
+            this.DefineCommandIconDialog.Filter = "Icon [*.ico]|*.ico|Executable [*.exe]|*.exe";
+            this.DefineCommandIconDialog.Title = "Optimizer";
+            this.DefineCommandIconDialog.FileOk += new System.ComponentModel.CancelEventHandler(this.DefineCommandIconDialog_FileOk);
+            // 
+            // ExportDialog
+            // 
+            this.ExportDialog.Filter = "Text [*.txt]|*.txt";
+            this.ExportDialog.Title = "Optimizer";
+            // 
+            // launcherMenu
+            // 
+            this.launcherMenu.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(10)))), ((int)(((byte)(10)))), ((int)(((byte)(10)))));
+            this.launcherMenu.Font = new System.Drawing.Font("Segoe UI Semibold", 11F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.launcherMenu.ImageScalingSize = new System.Drawing.Size(20, 20);
+            this.launcherMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
+            this.trayDownSpeed,
+            this.trayUpSpeed,
+            this.seperatorNetMon,
+            this.trayStartup,
+            this.trayCleaner,
+            this.trayPinger,
+            this.trayHosts,
+            this.trayAD,
+            this.trayHW,
+            this.trayRegistry,
+            this.toolStripSeparator1,
+            this.trayOptions,
+            this.trayRestartExplorer,
+            this.toolStripSeparator2,
+            this.trayExit});
+            this.launcherMenu.Name = "launcherMenu";
+            this.launcherMenu.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;
+            this.launcherMenu.Size = new System.Drawing.Size(221, 356);
+            // 
+            // trayDownSpeed
+            // 
+            this.trayDownSpeed.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayDownSpeed.ForeColor = System.Drawing.Color.White;
+            this.trayDownSpeed.Image = ((System.Drawing.Image)(resources.GetObject("trayDownSpeed.Image")));
+            this.trayDownSpeed.Name = "trayDownSpeed";
+            this.trayDownSpeed.Size = new System.Drawing.Size(220, 26);
+            this.trayDownSpeed.Text = "-";
+            this.trayDownSpeed.Visible = false;
+            // 
+            // trayUpSpeed
+            // 
+            this.trayUpSpeed.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayUpSpeed.ForeColor = System.Drawing.Color.White;
+            this.trayUpSpeed.Image = ((System.Drawing.Image)(resources.GetObject("trayUpSpeed.Image")));
+            this.trayUpSpeed.Name = "trayUpSpeed";
+            this.trayUpSpeed.Size = new System.Drawing.Size(220, 26);
+            this.trayUpSpeed.Text = "-";
+            this.trayUpSpeed.Visible = false;
+            // 
+            // seperatorNetMon
+            // 
+            this.seperatorNetMon.Name = "seperatorNetMon";
+            this.seperatorNetMon.Size = new System.Drawing.Size(217, 6);
+            this.seperatorNetMon.Visible = false;
+            // 
+            // trayStartup
+            // 
+            this.trayStartup.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayStartup.ForeColor = System.Drawing.Color.White;
+            this.trayStartup.Image = ((System.Drawing.Image)(resources.GetObject("trayStartup.Image")));
+            this.trayStartup.Name = "trayStartup";
+            this.trayStartup.Size = new System.Drawing.Size(220, 26);
+            this.trayStartup.Text = "Startup Manager";
+            this.trayStartup.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayStartup.Click += new System.EventHandler(this.startupItem_Click);
+            // 
+            // trayCleaner
+            // 
+            this.trayCleaner.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayCleaner.ForeColor = System.Drawing.Color.White;
+            this.trayCleaner.Image = ((System.Drawing.Image)(resources.GetObject("trayCleaner.Image")));
+            this.trayCleaner.Name = "trayCleaner";
+            this.trayCleaner.Size = new System.Drawing.Size(220, 26);
+            this.trayCleaner.Text = "PC Cleaner";
+            this.trayCleaner.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayCleaner.Click += new System.EventHandler(this.cleanerItem_Click);
+            // 
+            // trayPinger
+            // 
+            this.trayPinger.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayPinger.ForeColor = System.Drawing.Color.White;
+            this.trayPinger.Image = ((System.Drawing.Image)(resources.GetObject("trayPinger.Image")));
+            this.trayPinger.Name = "trayPinger";
+            this.trayPinger.Size = new System.Drawing.Size(220, 26);
+            this.trayPinger.Text = "Pinger Tool";
+            this.trayPinger.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayPinger.Click += new System.EventHandler(this.pingerItem_Click);
+            // 
+            // trayHosts
+            // 
+            this.trayHosts.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayHosts.ForeColor = System.Drawing.Color.White;
+            this.trayHosts.Image = ((System.Drawing.Image)(resources.GetObject("trayHosts.Image")));
+            this.trayHosts.Name = "trayHosts";
+            this.trayHosts.Size = new System.Drawing.Size(220, 26);
+            this.trayHosts.Text = "HOSTS Editor";
+            this.trayHosts.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayHosts.Click += new System.EventHandler(this.hostsItem_Click);
+            // 
+            // trayAD
+            // 
+            this.trayAD.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayAD.ForeColor = System.Drawing.Color.White;
+            this.trayAD.Image = ((System.Drawing.Image)(resources.GetObject("trayAD.Image")));
+            this.trayAD.Name = "trayAD";
+            this.trayAD.Size = new System.Drawing.Size(220, 26);
+            this.trayAD.Text = "Apps Downloader";
+            this.trayAD.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayAD.Click += new System.EventHandler(this.appsItem_Click);
+            // 
+            // trayHW
+            // 
+            this.trayHW.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayHW.ForeColor = System.Drawing.Color.White;
+            this.trayHW.Image = ((System.Drawing.Image)(resources.GetObject("trayHW.Image")));
+            this.trayHW.Name = "trayHW";
+            this.trayHW.Size = new System.Drawing.Size(220, 26);
+            this.trayHW.Text = "Hardware Information";
+            this.trayHW.Click += new System.EventHandler(this.trayHW_Click);
+            // 
+            // trayRegistry
+            // 
+            this.trayRegistry.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayRegistry.ForeColor = System.Drawing.Color.White;
+            this.trayRegistry.Image = ((System.Drawing.Image)(resources.GetObject("trayRegistry.Image")));
+            this.trayRegistry.Name = "trayRegistry";
+            this.trayRegistry.Size = new System.Drawing.Size(220, 26);
+            this.trayRegistry.Text = "Registry Repair";
+            this.trayRegistry.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayRegistry.Click += new System.EventHandler(this.trayRegistry_Click);
+            // 
+            // toolStripSeparator1
+            // 
+            this.toolStripSeparator1.BackColor = System.Drawing.Color.DodgerBlue;
+            this.toolStripSeparator1.ForeColor = System.Drawing.Color.White;
+            this.toolStripSeparator1.Name = "toolStripSeparator1";
+            this.toolStripSeparator1.Size = new System.Drawing.Size(217, 6);
+            this.toolStripSeparator1.Tag = "";
+            // 
+            // trayOptions
+            // 
+            this.trayOptions.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayOptions.ForeColor = System.Drawing.Color.White;
+            this.trayOptions.Image = ((System.Drawing.Image)(resources.GetObject("trayOptions.Image")));
+            this.trayOptions.Name = "trayOptions";
+            this.trayOptions.Size = new System.Drawing.Size(220, 26);
+            this.trayOptions.Text = "Options";
+            this.trayOptions.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayOptions.Click += new System.EventHandler(this.trayOptions_Click);
+            // 
+            // trayRestartExplorer
+            // 
+            this.trayRestartExplorer.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayRestartExplorer.ForeColor = System.Drawing.Color.White;
+            this.trayRestartExplorer.Image = ((System.Drawing.Image)(resources.GetObject("trayRestartExplorer.Image")));
+            this.trayRestartExplorer.Name = "trayRestartExplorer";
+            this.trayRestartExplorer.Size = new System.Drawing.Size(220, 26);
+            this.trayRestartExplorer.Text = "Restart Explorer";
+            this.trayRestartExplorer.TextDirection = System.Windows.Forms.ToolStripTextDirection.Horizontal;
+            this.trayRestartExplorer.Click += new System.EventHandler(this.restartExpolorerItem_Click);
+            // 
+            // toolStripSeparator2
+            // 
+            this.toolStripSeparator2.Name = "toolStripSeparator2";
+            this.toolStripSeparator2.Size = new System.Drawing.Size(217, 6);
+            // 
+            // trayExit
+            // 
+            this.trayExit.Font = new System.Drawing.Font("Segoe UI Semibold", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.trayExit.ForeColor = System.Drawing.Color.White;
+            this.trayExit.Image = ((System.Drawing.Image)(resources.GetObject("trayExit.Image")));
+            this.trayExit.Name = "trayExit";
+            this.trayExit.Size = new System.Drawing.Size(220, 26);
+            this.trayExit.Text = "Exit";
+            this.trayExit.Click += new System.EventHandler(this.exitItem_Click);
+            // 
+            // launcherIcon
+            // 
+            this.launcherIcon.ContextMenuStrip = this.launcherMenu;
+            this.launcherIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("launcherIcon.Icon")));
+            this.launcherIcon.Text = "Optimizer";
+            this.launcherIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.launcherIcon_MouseDoubleClick);
+            // 
             // helpBox
             // 
             this.helpBox.AutoPopDelay = 90000;
@@ -5258,7 +5535,6 @@ namespace Optimizer
             ((System.ComponentModel.ISupportInitialize)(this.picUpdate)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
             this.bpanel.ResumeLayout(false);
-            this.launcherMenu.ResumeLayout(false);
             this.tabCollection.ResumeLayout(false);
             this.universalTab.ResumeLayout(false);
             this.windows10Tab.ResumeLayout(false);
@@ -5296,6 +5572,10 @@ namespace Optimizer
             this.registryFixerTab.PerformLayout();
             this.panel2.ResumeLayout(false);
             this.panel2.PerformLayout();
+            this.indiciumTab.ResumeLayout(false);
+            this.panel12.ResumeLayout(false);
+            this.indiciumMenu.ResumeLayout(false);
+            this.panel11.ResumeLayout(false);
             this.integratorTab.ResumeLayout(false);
             this.synapse.ResumeLayout(false);
             this.integratorInfoTab.ResumeLayout(false);
@@ -5341,6 +5621,7 @@ namespace Optimizer
             this.panel8.PerformLayout();
             ((System.ComponentModel.ISupportInitialize)(this.picFOSS)).EndInit();
             ((System.ComponentModel.ISupportInitialize)(this.picFSF)).EndInit();
+            this.launcherMenu.ResumeLayout(false);
             this.ResumeLayout(false);
 
         }
@@ -5355,7 +5636,6 @@ namespace Optimizer
         private System.Windows.Forms.Label label2;
         private System.Windows.Forms.Panel bpanel;
         private MoonTabs tabCollection;
-        //private ColoredTabs tabCollection;
         private System.Windows.Forms.TabPage universalTab;
         private System.Windows.Forms.TabPage windows10Tab;
         private System.Windows.Forms.TabPage windows8Tab;
@@ -5687,6 +5967,23 @@ namespace Optimizer
         private ToggleCard quickAccessToggle;
         private ToggleCard helpTipsToggle;
         private PictureBox picUpdate;
+        private TabPage indiciumTab;
+        private MoonTree specsTree;
+        private Panel panel12;
+        private Panel panel11;
+        private ImageList imagesHw;
+        private ToggleCard hwDetailed;
+        private Button btnSaveHW;
+        private ToolStripMenuItem trayHW;
+        private ContextMenuStrip indiciumMenu;
+        private ToolStripMenuItem toolHWCopy;
+        private ToolStripMenuItem toolHWGoogle;
+        private ToolStripMenuItem toolHWDuck;
+        private Button btnCopyHW;
+        private ToolStripSeparator toolStripSeparator2;
+        private ToolStripMenuItem trayDownSpeed;
+        private ToolStripSeparator seperatorNetMon;
+        private ToolStripMenuItem trayUpSpeed;
     }
 }
 

+ 783 - 59
Optimizer/Forms/MainForm.cs

@@ -12,6 +12,7 @@ using System.Net;
 using System.Net.NetworkInformation;
 using System.Reflection;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 
@@ -19,6 +20,8 @@ namespace Optimizer
 {
     public partial class MainForm : Form
     {
+        Dictionary<string, string> translationList;
+
         ListViewColumnSorter _columnSorter;
 
         List<StartupItem> _startUpItems = new List<StartupItem>();
@@ -35,9 +38,9 @@ namespace Optimizer
         string _shodanIP = string.Empty;
         PingReply tmpReply;
 
-        //NetworkMonitor _networkMonitor;
-        //double uploadSpeed = 0;
-        //double downloadSpeed = 0;
+        NetworkMonitor _networkMonitor;
+        double uploadSpeed = 0;
+        double downloadSpeed = 0;
 
         DesktopItemType _desktopItemType = DesktopItemType.Program;
         DesktopTypePosition _desktopItemPosition = DesktopTypePosition.Top;
@@ -65,8 +68,14 @@ namespace Optimizer
         string _errorModernAppsMessage = "The following app(s) couldn't be uninstalled:\n";
         string _resetMessage = "Are you sure you want to reset configuration?\n\nThis will reset all your preferences, including any icons you extracted or downloaded using Integrator, but will not touch anything on your computer!";
 
+        string _byteSizeNullString = " b";
+        string _primaryItemTag = "_primary";
+
         ColorOverrider _colorOverrider;
 
+        List<TreeNode> _hwDetailed;
+        TreeNode[] _hwSummarized;
+
         private string NewVersionMessage(string latestVersion)
         {
             return Options.TranslationList["newVersion"].ToString().Replace("{LATEST}", latestVersion).Replace("{CURRENT}", Program.GetCurrentVersionTostring());
@@ -504,7 +513,7 @@ namespace Optimizer
         }
 
         //INIT
-        public MainForm()
+        public MainForm(SplashForm _splashForm)
         {
             InitializeComponent();
 
@@ -515,9 +524,13 @@ namespace Optimizer
 
             EnableToggleEvents();
 
+            _splashForm.LoadingStatus.Text = "checking for requirements ...";
+
             // theming
             Options.ApplyTheme(this);
             launcherMenu.Renderer = new MoonMenuRenderer();
+            indiciumMenu.Renderer = new MoonMenuRenderer();
+
             progressDownloader.BackColor = Options.ForegroundColor;
             progressDownloader.ForeColor = Options.ForegroundAccentColor;
 
@@ -525,6 +538,9 @@ namespace Optimizer
             _trayMenu = Options.CurrentOptions.EnableTray;
             quickAccessToggle.ToggleChecked = Options.CurrentOptions.EnableTray;
             launcherIcon.Visible = Options.CurrentOptions.EnableTray;
+            seperatorNetMon.Visible = Options.CurrentOptions.EnableTray;
+            trayDownSpeed.Visible = Options.CurrentOptions.EnableTray;
+            trayUpSpeed.Visible = Options.CurrentOptions.EnableTray;
 
             // help tips
             helpBox.Active = Options.CurrentOptions.ShowHelp;
@@ -548,7 +564,7 @@ namespace Optimizer
 
             // system color overriding
             _colorOverrider = new ColorOverrider();
-            _colorOverrider.SetColor(KnownColor.Highlight, Color.FromArgb(50,50,50).ToArgb());
+            _colorOverrider.SetColor(KnownColor.Highlight, Color.FromArgb(50, 50, 50).ToArgb());
             _colorOverrider.SetColor(KnownColor.HighlightText, Color.White.ToArgb());
 
             if (Utilities.CurrentWindowsVersion == WindowsVersion.Unsupported)
@@ -608,18 +624,26 @@ namespace Optimizer
                 txtOS.Text += string.Format(" ({0})", Utilities.GetWindows10Build());
             }
 
+            _splashForm.LoadingStatus.Text = "loading startup && hosts items ...";
+
             _columnSorter = new ListViewColumnSorter();
             listStartupItems.ListViewItemSorter = _columnSorter;
 
+            specsTree.ImageList = imagesHw;
+
             GetStartupItems();
             GetHostsEntries();
 
             GetDesktopItems();
             GetCustomCommands();
 
+            _splashForm.LoadingStatus.Text = "getting feed ...";
             GetFeed();
             GetFootprint();
 
+            _splashForm.LoadingStatus.Text = "loading hardware specifications ...";
+            GetHardwareSpecs();
+
             LoadSettings();
 
             // Translation-related
@@ -677,32 +701,646 @@ namespace Optimizer
                 lblUpdateDisabled.Visible = true;
             }
 
-            //_networkMonitor = new NetworkMonitor();
+            // network monitoring
+            _networkMonitor = new NetworkMonitor();
+            if (Options.CurrentOptions.EnableTray) 
+            {
+                _networkMonitor.StartMonitoring();
+                NetworkMonitoring();
+            }
         }
 
-        //private void NetworkMonitoring()
-        //{
-        //    while (true)
-        //    {
-        //        downloadSpeed = 0;
-        //        uploadSpeed = 0;
+        private void GetHardwareSpecs()
+        {
+            GetCPUs();
+            GetRAM();
+            GetGPUs();
+            GetMotherboards();
+            GetStorage();
+            GetNetworkAdapters();
+            GetAudioDevices();
+            GetPeripherals();
+            GetOSInfo();
 
-        //        foreach (NetworkAdapter adapter in _networkMonitor.Adapters)
-        //        {
-        //            //adapter.Refresh();
-        //            downloadSpeed += Math.Round(adapter.DownloadSpeedMbps, 2);
-        //            uploadSpeed += Math.Round(adapter.UploadSpeedMbps, 2);
-        //        }
+            _hwDetailed = specsTree.Nodes.Cast<TreeNode>().ToList();
+            _hwSummarized = BuildHardwareSummaryNodes();
 
-        //        this.Text = string.Format("Optimizer - DOWN: {0} UP: {1}", downloadSpeed, uploadSpeed);
+            specsTree.ExpandAll();
+            specsTree.Nodes[0].EnsureVisible();
+        }
 
-        //        Thread.Sleep(1000);
-        //    }
-        //}
+        private TreeNode[] BuildHardwareSummaryNodes()
+        {
+            TreeNode osNode = new TreeNode("Operating System");
+            osNode.Name = "os";
+            osNode.Tag = _primaryItemTag;
+            osNode.SelectedImageIndex = 8;
+            HardwareSummary.OSInfo.ForEach(x => osNode.Nodes.Add(x));
+
+            TreeNode cpuNode = new TreeNode("Processors");
+            cpuNode.Name = "scpu";
+            cpuNode.Tag = _primaryItemTag;
+            cpuNode.SelectedImageIndex = 0;
+            HardwareSummary.CPUs.ForEach(x => cpuNode.Nodes.Add(x));
+
+            TreeNode ramNode = new TreeNode("Memory");
+            ramNode.Name = "sram";
+            ramNode.Tag = _primaryItemTag;
+            ramNode.SelectedImageIndex = 1;
+            ramNode.Nodes.Add(HardwareSummary.TotalRAM);
+
+            TreeNode moboNode = new TreeNode("Motherboards");
+            moboNode.Name = "smobo";
+            moboNode.Tag = _primaryItemTag;
+            moboNode.SelectedImageIndex = 3;
+            HardwareSummary.Motherboards.ForEach(x => moboNode.Nodes.Add(x));
+
+            TreeNode gpuNode = new TreeNode("Graphics");
+            gpuNode.Name = "sgpu";
+            gpuNode.Tag = _primaryItemTag;
+            gpuNode.SelectedImageIndex = 2;
+            HardwareSummary.GPUs.ForEach(x => gpuNode.Nodes.Add(x));
+
+            TreeNode diskNode = new TreeNode("Disk Drives");
+            diskNode.Name = "sdisk";
+            diskNode.Tag = _primaryItemTag;
+            diskNode.SelectedImageIndex = 4;
+            HardwareSummary.Disks.ForEach(x => diskNode.Nodes.Add(x));
+
+            TreeNode networkNode = new TreeNode("Network Adapters");
+            networkNode.Name = "sinet";
+            networkNode.Tag = _primaryItemTag;
+            networkNode.SelectedImageIndex = 5;
+            HardwareSummary.NetworkAdapters.ForEach(x => networkNode.Nodes.Add(x));
+
+            TreeNode biosNode = new TreeNode("BIOS");
+            biosNode.Tag = _primaryItemTag;
+            biosNode.SelectedImageIndex = 3;
+            HardwareSummary.BIOS.ForEach(x => biosNode.Nodes.Add(x));
+
+            return new TreeNode[]
+            {
+                osNode, cpuNode, ramNode, moboNode, gpuNode, diskNode, networkNode, biosNode
+            };
+        }
+
+        private void GetOSInfo()
+        {
+            HardwareSummary.OSInfo.Add($"{Utilities.GetOS()} ({(Environment.Is64BitOperatingSystem ? "64-bit" : "32-bit")})");
+            if (SystemInformation.PowerStatus.BatteryChargeStatus == BatteryChargeStatus.NoSystemBattery)
+            {
+                HardwareSummary.OSInfo.Add($"Desktop ({Environment.MachineName})");
+            }
+            else
+            {
+                HardwareSummary.OSInfo.Add($"Laptop ({Environment.MachineName})");
+            }
+        }
+
+        private void GetAudioDevices()
+        {
+            List<AudioDevice> audios = IndiciumHelper.GetAudioDevices();
+
+            if (audios.Count > 0)
+            {
+                foreach (AudioDevice device in audios)
+                {
+                    TreeNode node = new TreeNode(device.ProductName);
+
+                    node.Tag = _primaryItemTag;
+                    node.Nodes.Add("Manufacturer: " + device.Manufacturer);
+                    node.Nodes.Add("Status: " + device.Status);
+                    specsTree.Nodes["audio"].Nodes.Add(node);
+                }
+            }
+        }
+
+        private void GetPeripherals()
+        {
+            IndiciumHelper.GetPeripherals();
+
+            if (IndiciumHelper.Keyboards.Count > 0)
+            {
+                TreeNode kbNodes = new TreeNode("Keyboards");
+                kbNodes.Name = "keyboards";
+
+                foreach (Keyboard keyboard in IndiciumHelper.Keyboards)
+                {
+                    TreeNode node = new TreeNode(keyboard.Name);
+                    node.Tag = _primaryItemTag;
+                    node.Nodes.Add("Layout: " + keyboard.Layout);
+                    node.Nodes.Add("Function Keys: " + keyboard.FunctionKeys);
+                    node.Nodes.Add("Status: " + keyboard.Status);
+                    node.Nodes.Add("Locked: " + keyboard.Locked);
+                    kbNodes.Nodes.Add(node);
+                }
+                specsTree.Nodes["dev"].Nodes.Add(kbNodes);
+            }
+
+            if (IndiciumHelper.PointingDevices.Count > 0)
+            {
+                TreeNode pdNodes = new TreeNode("Pointing Devices");
+                pdNodes.Name = "pointings";
+
+                foreach (PointingDevice pointingDevice in IndiciumHelper.PointingDevices)
+                {
+                    TreeNode node = new TreeNode(pointingDevice.Name);
+                    node.Tag = _primaryItemTag;
+                    node.Nodes.Add("Manufacturer: " + pointingDevice.Manufacturer);
+                    node.Nodes.Add("Buttons: " + pointingDevice.Buttons);
+                    node.Nodes.Add("Pointing Type: " + pointingDevice.PointingType);
+                    node.Nodes.Add("Device Interface: " + pointingDevice.DeviceInterface);
+                    node.Nodes.Add("Hardware Type: " + pointingDevice.HardwareType);
+                    node.Nodes.Add("Status: " + pointingDevice.Status);
+                    node.Nodes.Add("Locked: " + pointingDevice.Locked);
+                    pdNodes.Nodes.Add(node);
+                }
+                specsTree.Nodes["dev"].Nodes.Add(pdNodes);
+            }
+        }
+
+        private void GetNetworkAdapters()
+        {
+            IndiciumHelper.GetNetworkAdapters();
+
+            if (IndiciumHelper.PhysicalAdapters.Count > 0)
+            {
+                TreeNode physicalsNode = new TreeNode("Physical Adapters");
+                physicalsNode.Name = "physicalAdapters";
+
+                foreach (NetworkDevice adapter in IndiciumHelper.PhysicalAdapters)
+                {
+                    TreeNode node = new TreeNode(adapter.ProductName);
+                    HardwareSummary.NetworkAdapters.Add(adapter.ProductName);
+
+                    node.Tag = _primaryItemTag;
+                    node.Nodes.Add("Manufacturer: " + adapter.Manufacturer);
+                    node.Nodes.Add("Adapter Type: " + adapter.AdapterType);
+                    node.Nodes.Add("MAC Address: " + adapter.MacAddress);
+                    //node.Nodes.Add("Physical Adapter: " + adapter.PhysicalAdapter);
+                    node.Nodes.Add("Service Name: " + adapter.ServiceName);
+                    physicalsNode.Nodes.Add(node);
+                }
+                specsTree.Nodes["inet"].Nodes.Add(physicalsNode);
+            }
+
+            if (IndiciumHelper.VirtualAdapters.Count > 0)
+            {
+                TreeNode virtualsNode = new TreeNode("Virtual Adapters");
+                virtualsNode.Name = "virtualAdapters";
+
+                foreach (NetworkDevice adapter in IndiciumHelper.VirtualAdapters)
+                {
+                    TreeNode node = new TreeNode(adapter.ProductName);
+
+                    node.Tag = _primaryItemTag;
+                    node.Nodes.Add("Manufacturer: " + adapter.Manufacturer);
+                    node.Nodes.Add("Adapter Type: " + adapter.AdapterType);
+                    node.Nodes.Add("MAC Address: " + adapter.MacAddress);
+                    //node.Nodes.Add("Physical Adapter: " + adapter.PhysicalAdapter);
+                    node.Nodes.Add("Service Name: " + adapter.ServiceName);
+                    virtualsNode.Nodes.Add(node);
+                }
+                specsTree.Nodes["inet"].Nodes.Add(virtualsNode);
+            }
+        }
+
+        private void GetStorage()
+        {
+            List<Disk> disks = IndiciumHelper.GetDisks();
+            IndiciumHelper.GetVolumes();
+
+            if (disks.Count > 0)
+            {
+                TreeNode disksNode = new TreeNode("Disk Drives");
+                disksNode.Name = "drives";
+
+                foreach (Disk disk in disks)
+                {
+                    TreeNode node = new TreeNode(disk.Model);
+                    node.Tag = _primaryItemTag;
+
+                    if (disk.Capacity.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Size: " + disk.Capacity);
+                        HardwareSummary.Disks.Add($"{disk.Model} ({disk.Capacity})");
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Size: -");
+                    }
+                    node.Nodes.Add("Firmware Revision: " + disk.FirmwareRevision);
+                    node.Nodes.Add("Media Type: " + disk.MediaType);
+                    node.Nodes.Add("Bytes/Sector: " + disk.BytesPerSector);
+
+                    disksNode.Nodes.Add(node);
+                }
+                specsTree.Nodes["disk"].Nodes.Add(disksNode);
+            }
+
+            if (IndiciumHelper.Opticals.Count > 0)
+            {
+                TreeNode opticalsNode = new TreeNode("Optical Drives");
+                opticalsNode.Name = "opticals";
+
+                foreach (Volume optical in IndiciumHelper.Opticals)
+                {
+                    string tmp = string.Empty;
+                    if (!string.IsNullOrEmpty(optical.DriveLetter))
+                    {
+                        tmp = " (" + optical.DriveLetter + ")";
+                    }
+                    else
+                    {
+                        tmp = "-";
+                    }
+
+                    TreeNode node = new TreeNode(optical.Label + tmp);
+                    node.Tag = _primaryItemTag;
+                    node.Nodes.Add("File System: " + optical.FileSystem);
+
+                    if (optical.Capacity.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Size: " + optical.Capacity);
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Size: -");
+                    }
+                    if (optical.UsedSpace.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Used Space: " + optical.UsedSpace);
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Used Space: -");
+                    }
+                    if (optical.FreeSpace.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Free Space: " + optical.FreeSpace);
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Free Space: -");
+                    }
+                    node.Nodes.Add("Indexing: " + optical.Indexing);
+                    node.Nodes.Add("Compressed: " + optical.Compressed);
+                    node.Nodes.Add("Drive Type: " + optical.DriveType);
+                    node.Nodes.Add("Block Size: " + optical.BlockSize);
+
+                    opticalsNode.Nodes.Add(node);
+                }
+                specsTree.Nodes["disk"].Nodes.Add(opticalsNode);
+            }
+
+            if (IndiciumHelper.Volumes.Count > 0)
+            {
+                TreeNode volumesNode = new TreeNode("Partitions");
+                volumesNode.Name = "volumes";
+
+                foreach (Volume volume in IndiciumHelper.Volumes)
+                {
+                    string tmp = string.Empty;
+                    if (!string.IsNullOrEmpty(volume.DriveLetter))
+                    {
+                        tmp = " (" + volume.DriveLetter + ")";
+                    }
+                    else
+                    {
+                        tmp = "-";
+                    }
+
+                    TreeNode node = new TreeNode(volume.Label + tmp);
+                    node.Tag = _primaryItemTag;
+
+                    node.Nodes.Add("File System: " + volume.FileSystem);
+                    if (volume.Capacity.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Size: " + volume.Capacity);
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Size: -");
+                    }
+                    if (volume.UsedSpace.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Used Space: " + volume.UsedSpace);
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Used Space: -");
+                    }
+                    if (volume.FreeSpace.ToString() != _byteSizeNullString)
+                    {
+                        node.Nodes.Add("Free Space: " + volume.FreeSpace);
+                    }
+                    else
+                    {
+                        node.Nodes.Add("Free Space: -");
+                    }
+                    node.Nodes.Add("Indexing: " + volume.Indexing);
+                    node.Nodes.Add("Compressed: " + volume.Compressed);
+                    node.Nodes.Add("Drive Type: " + volume.DriveType);
+                    node.Nodes.Add("Block Size: " + volume.BlockSize);
+
+                    volumesNode.Nodes.Add(node);
+                }
+                specsTree.Nodes["disk"].Nodes.Add(volumesNode);
+
+                if (IndiciumHelper.Removables.Count > 0)
+                {
+                    TreeNode removablesNode = new TreeNode("Removable Drives");
+                    removablesNode.Name = "removables";
+
+                    foreach (Volume removable in IndiciumHelper.Removables)
+                    {
+                        string tmp = string.Empty;
+                        if (!string.IsNullOrEmpty(removable.DriveLetter))
+                        {
+                            tmp = " (" + removable.DriveLetter + ")";
+                        }
+                        else
+                        {
+                            tmp = "-";
+                        }
+
+                        TreeNode node = new TreeNode(removable.Label + tmp);
+
+                        node.Tag = _primaryItemTag;
+
+                        node.Nodes.Add("File System: " + removable.FileSystem);
+                        if (removable.Capacity.ToString() != _byteSizeNullString)
+                        {
+                            node.Nodes.Add("Size: " + removable.Capacity);
+                        }
+                        else
+                        {
+                            node.Nodes.Add("Size: -");
+                        }
+                        if (removable.UsedSpace.ToString() != _byteSizeNullString)
+                        {
+                            node.Nodes.Add("Used Space: " + removable.UsedSpace);
+                        }
+                        else
+                        {
+                            node.Nodes.Add("Used Space: -");
+                        }
+                        if (removable.FreeSpace.ToString() != _byteSizeNullString)
+                        {
+                            node.Nodes.Add("Free Space: " + removable.FreeSpace);
+                        }
+                        else
+                        {
+                            node.Nodes.Add("Free Space: -");
+                        }
+                        node.Nodes.Add("Indexing: " + removable.Indexing);
+                        node.Nodes.Add("Compressed: " + removable.Compressed);
+                        node.Nodes.Add("Drive Type: " + removable.DriveType);
+                        node.Nodes.Add("Block Size: " + removable.BlockSize);
+                        removablesNode.Nodes.Add(node);
+                    }
+                    specsTree.Nodes["disk"].Nodes.Add(removablesNode);
+                }
+            }
+        }
+
+        private void GetCPUs()
+        {
+            List<CPU> cpus = IndiciumHelper.GetCPUs();
+
+            if (cpus.Count > 0)
+            {
+                foreach (CPU cpu in cpus)
+                {
+                    TreeNode node = new TreeNode(cpu.Name);
+                    node.Tag = _primaryItemTag;
+
+                    HardwareSummary.CPUs.Add($"{cpu.Name} ({cpu.Cores} Cores, {cpu.LogicalCpus} Threads)");
+
+                    node.Nodes.Add("Cores: " + cpu.Cores);
+                    node.Nodes.Add("Threads: " + cpu.LogicalCpus);
+                    //node.Nodes.Add("Logical CPUs: " + cpu.LogicalCpus);
+                    node.Nodes.Add("Virtualization: " + cpu.Virtualization);
+                    node.Nodes.Add("Data Execution Prevention: " + cpu.DataExecutionPrevention);
+                    node.Nodes.Add("L2 Cache: " + cpu.L2CacheSize);
+                    node.Nodes.Add("L3 Cache: " + cpu.L3CacheSize);
+                    node.Nodes.Add("Stepping: " + cpu.Stepping);
+                    node.Nodes.Add("Revision: " + cpu.Revision);
+
+                    specsTree.Nodes["cpu"].Nodes.Add(node);
+                }
+            }
+        }
+
+        private void GetMotherboards()
+        {
+            List<Motherboard> mobos = IndiciumHelper.GetMotherboards();
+
+            if (mobos.Count > 0)
+            {
+                foreach (Motherboard mobo in mobos)
+                {
+                    TreeNode node = new TreeNode(mobo.Manufacturer);
+                    TreeNode node2 = new TreeNode("BIOS");
+                    node.Tag = _primaryItemTag;
+                    node2.Tag = _primaryItemTag;
+
+                    HardwareSummary.Motherboards.Add($"{mobo.Manufacturer} ({mobo.SystemModel}) ({mobo.Product})");
+                    HardwareSummary.BIOS.Add($"{mobo.BIOSManufacturer} {mobo.BIOSName}");
+
+                    node.Nodes.Add("System: " + mobo.SystemModel);
+                    node.Nodes.Add("Chipset: " + mobo.Chipset);
+                    node.Nodes.Add("Product: " + mobo.Product);
+                    node.Nodes.Add("Model: " + mobo.Model);
+                    node.Nodes.Add("Version: " + mobo.Version);
+                    node.Nodes.Add("Revision: " + mobo.Revision);
+
+                    node2.Nodes.Add("Manufacturer: " + mobo.BIOSManufacturer);
+                    node2.Nodes.Add("Manufacturer: " + mobo.BIOSName);
+                    node2.Nodes.Add("Version: " + mobo.BIOSVersion);
+                    node2.Nodes.Add("Build Number: " + mobo.BIOSBuildNumber);
+
+                    specsTree.Nodes["mobo"].Nodes.Add(node);
+                    specsTree.Nodes["mobo"].Nodes.Add(node2);
+                }
+            }
+        }
+
+        private void GetGPUs()
+        {
+            List<GPU> gpus = IndiciumHelper.GetGPUs();
+
+            if (gpus.Count > 0)
+            {
+                foreach (GPU gpu in gpus)
+                {
+                    TreeNode node = new TreeNode(gpu.Name);
+                    node.Tag = _primaryItemTag;
+
+                    HardwareSummary.GPUs.Add($"{gpu.Name} ({gpu.Memory.ToString("GiB")})");
+
+                    node.Nodes.Add("Video Memory: " + gpu.Memory.ToString("GiB"));
+                    node.Nodes.Add("Video Memory Type: " + gpu.VideoMemoryType);
+                    node.Nodes.Add("DAC Type: " + gpu.DACType);
+                    node.Nodes.Add("Current Resolution: " + gpu.ResolutionX + " x " + gpu.ResolutionY);
+                    node.Nodes.Add("Current Refresh Rate: " + gpu.RefreshRate + " Hz");
+
+                    specsTree.Nodes["gpu"].Nodes.Add(node);
+                }
+            }
+        }
+
+        private void GetRAM()
+        {
+            List<RAM> ramInfo = IndiciumHelper.GetRAM();
+            VirtualMemory vm = IndiciumHelper.GetVM();
+
+            ByteSize totalRAM = new ByteSize(0);
+            string memoryType = string.Empty;
+            uint memorySpeed = 0;
+
+            if (ramInfo.Count > 0)
+            {
+                foreach (RAM ram in ramInfo)
+                {
+                    TreeNode node = new TreeNode(ram.BankLabel.ToLowerInvariant().Replace("bank", "Module"));
+                    node.Tag = _primaryItemTag;
+
+                    totalRAM += ram.Capacity;
+                    memorySpeed = ram.Speed;
+                    memoryType = ram.MemoryType;
+
+                    node.Nodes.Add("Manufacturer: " + ram.Manufacturer);
+                    node.Nodes.Add("Size: " + ram.Capacity.ToString("GiB"));
+                    node.Nodes.Add("Memory Type: " + ram.MemoryType);
+                    node.Nodes.Add("Speed: " + ram.Speed + " MHz");
+                    node.Nodes.Add("Form Factor: " + ram.FormFactor);
+
+                    specsTree.Nodes["ram"].Nodes.Add(node);
+                }
+
+                HardwareSummary.TotalRAM = $"{totalRAM.ToString("GiB")} {memoryType} @ {memorySpeed} MHz";
+            }
+
+            if (vm != null)
+            {
+                TreeNode node = new TreeNode("Virtual Memory");
+                node.Name = "vm";
+                node.Tag = _primaryItemTag;
+
+                node.Nodes.Add("Total: " + vm.TotalVirtualMemory.ToString("GiB"));
+                node.Nodes.Add("Available : " + vm.AvailableVirtualMemory.ToString("GiB"));
+                node.Nodes.Add("Used: " + vm.UsedVirtualMemory.ToString("GiB"));
+
+                specsTree.Nodes["ram"].Nodes.Add(node);
+            }
+        }
+
+        private void NetworkMonitoring()
+        {
+            Task.Factory.StartNew(() =>
+            {
+                while (Options.CurrentOptions.EnableTray)
+                {
+                    downloadSpeed = 0;
+                    uploadSpeed = 0;
+
+                    foreach (NetworkAdapter adapter in _networkMonitor.Adapters)
+                    {
+                        //adapter.Refresh();
+                        downloadSpeed += Math.Round(adapter.DownloadSpeedKbps, 2);
+                        uploadSpeed += Math.Round(adapter.UploadSpeedKbps, 2);
+                    }
+
+                    this.Invoke(new Action(() =>
+                    {
+                        trayDownSpeed.Text = $"{downloadSpeed} KB/s";
+                        trayUpSpeed.Text = $"{uploadSpeed} KB/s";
+                    }));
+
+                    Thread.Sleep(1000);
+                }
+            });
+        }
+
+        private void TranslateIndicium()
+        {
+            if (hwDetailed.ToggleChecked)
+            {
+                // DETAILS TRANSLATION
+                TreeNode cpu = specsTree.Nodes["cpu"];
+                TreeNode ram = specsTree.Nodes["ram"];
+                TreeNode gpu = specsTree.Nodes["gpu"];
+                TreeNode mobo = specsTree.Nodes["mobo"];
+                TreeNode disk = specsTree.Nodes["disk"];
+                TreeNode inet = specsTree.Nodes["inet"];
+                TreeNode audio = specsTree.Nodes["audio"];
+                TreeNode dev = specsTree.Nodes["dev"];
+
+                if (cpu != null) cpu.Text = translationList["cpu"];
+                if (ram != null)
+                {
+                    ram.Text = translationList["ram"];
+                    TreeNode vm = ram.Nodes["vm"];
+                    if (vm != null) vm.Text = translationList["vm"];
+                }
+                if (gpu != null) gpu.Text = translationList["gpu"];
+                if (mobo != null) mobo.Text = translationList["mobo"];
+                if (disk != null)
+                {
+                    disk.Text = translationList["disk"];
+                    TreeNode disks = disk.Nodes["drives"];
+                    TreeNode vols = disk.Nodes["volumes"];
+                    TreeNode opticals = disk.Nodes["opticals"];
+                    TreeNode removables = disk.Nodes["removables"];
+                    if (disks != null) disks.Text = translationList["drives"];
+                    if (vols != null) vols.Text = translationList["volumes"];
+                    if (opticals != null) opticals.Text = translationList["opticals"];
+                    if (removables != null) removables.Text = translationList["removables"];
+                }
+                if (inet != null)
+                {
+                    inet.Text = translationList["inet"];
+                    TreeNode pas = inet.Nodes["physicalAdapters"];
+                    TreeNode vas = inet.Nodes["virtualAdapters"];
+                    if (pas != null) pas.Text = translationList["physicalAdapters"];
+                    if (vas != null) vas.Text = translationList["virtualAdapters"];
+                }
+                if (audio != null) audio.Text = translationList["audio"];
+                if (dev != null)
+                {
+                    dev.Text = translationList["dev"];
+                    TreeNode kbs = dev.Nodes["keyboards"];
+                    TreeNode pds = dev.Nodes["pointings"];
+                    if (kbs != null) kbs.Text = translationList["keyboards"];
+                    if (pds != null) pds.Text = translationList["pointings"];
+                }
+            }
+            else
+            {
+                // SUMMARY TRANSLATION
+                TreeNode os = specsTree.Nodes["os"];
+                TreeNode scpu = specsTree.Nodes["scpu"];
+                TreeNode sram = specsTree.Nodes["sram"];
+                TreeNode sgpu = specsTree.Nodes["sgpu"];
+                TreeNode smobo = specsTree.Nodes["smobo"];
+                TreeNode sdisk = specsTree.Nodes["sdisk"];
+                TreeNode sinet = specsTree.Nodes["sinet"];
+
+                if (os != null) os.Text = translationList["os"];
+                if (scpu != null) scpu.Text = translationList["cpu"];
+                if (sram != null) sram.Text = translationList["ram"];
+                if (sgpu != null) sgpu.Text = translationList["gpu"];
+                if (smobo != null) smobo.Text = translationList["mobo"];
+                if (sdisk != null) sdisk.Text = translationList["disk"];
+                if (sinet != null) sinet.Text = translationList["inet"];
+            }
+        }
 
         private void Translate(bool skipFull = false)
         {
-            Dictionary<string, string> translationList = Options.TranslationList.ToObject<Dictionary<string, string>>();
+            translationList = Options.TranslationList.ToObject<Dictionary<string, string>>();
+
             if (Environment.Is64BitOperatingSystem)
             {
                 translationList["txtBitness"] = translationList["txtBitness"].Replace("{BITS}", translationList["c64"]);
@@ -713,6 +1351,7 @@ namespace Optimizer
             }
 
             SetHelpBoxTranslation();
+            TranslateIndicium();
 
             if (!skipFull)
             {
@@ -729,6 +1368,7 @@ namespace Optimizer
                 listStartupItems.Columns[0].Text = translationList["startupItemName"];
                 listStartupItems.Columns[1].Text = translationList["startupItemLocation"];
                 listStartupItems.Columns[2].Text = translationList["startupItemType"];
+
                 trayStartup.Text = translationList["trayStartup"];
                 trayCleaner.Text = translationList["trayCleaner"];
                 trayPinger.Text = translationList["trayPinger"];
@@ -738,9 +1378,13 @@ namespace Optimizer
                 trayRegistry.Text = translationList["trayRegistry"];
                 trayRestartExplorer.Text = translationList["trayRestartExplorer"];
                 trayExit.Text = translationList["trayExit"];
+                trayHW.Text = translationList["trayHW"];
 
-                Control element;
+                toolHWCopy.Text = translationList["toolHWCopy"];
+                toolHWDuck.Text = translationList["toolHWDuck"];
+                toolHWGoogle.Text = translationList["toolHWGoogle"];
 
+                Control element;
                 foreach (var x in translationList)
                 {
                     if (x.Key == null || x.Key == string.Empty) continue;
@@ -756,7 +1400,6 @@ namespace Optimizer
 
                     element.Text = x.Value;
                 }
-
             }
 
             txtVersion.Text = txtVersion.Text.Replace("{VN}", Program.GetCurrentVersionTostring());
@@ -1157,30 +1800,6 @@ namespace Optimizer
             }
         }
 
-        //private void button39_Click(object sender, EventArgs e)
-        //{
-        //    HelperForm f = new HelperForm(this, MessageType.Restart, _restartMessage);
-        //    f.ShowDialog();
-        //}
-
-        //private void button43_Click(object sender, EventArgs e)
-        //{
-        //    HelperForm f = new HelperForm(this, MessageType.Restart, _restartMessage);
-        //    f.ShowDialog();
-        //}
-
-        //private void button44_Click(object sender, EventArgs e)
-        //{
-        //    HelperForm f = new HelperForm(this, MessageType.Restart, _restartMessage);
-        //    f.ShowDialog();
-        //}
-
-        //private void button45_Click(object sender, EventArgs e)
-        //{
-        //    HelperForm f = new HelperForm(this, MessageType.Restart, _restartMessage);
-        //    f.ShowDialog();
-        //}
-
         private void checkSelectAll_CheckedChanged(object sender, EventArgs e)
         {
             checkTemp.Checked = checkSelectAll.Checked;
@@ -1386,16 +2005,7 @@ namespace Optimizer
         {
             if (tabCollection.SelectedTab == hostsEditorTab) txtIP.Focus();
 
-            if (tabCollection.SelectedTab == pingerTab)
-            {
-                txtPingInput.Focus();
-                //_networkMonitor.StartMonitoring();
-                //NetworkMonitoring();
-            }
-            //else
-            //{
-            //    _networkMonitor.StopMonitoring();
-            //}
+            if (tabCollection.SelectedTab == pingerTab) txtPingInput.Focus();      
         }
 
         private void button48_Click(object sender, EventArgs e)
@@ -3130,6 +3740,23 @@ namespace Optimizer
 
             _trayMenu = quickAccessToggle.ToggleChecked;
             launcherIcon.Visible = quickAccessToggle.ToggleChecked;
+
+            seperatorNetMon.Visible = Options.CurrentOptions.EnableTray;
+            trayDownSpeed.Visible = Options.CurrentOptions.EnableTray;
+            trayUpSpeed.Visible = Options.CurrentOptions.EnableTray;
+
+            if (Options.CurrentOptions.EnableTray)
+            {
+                if (_networkMonitor != null)
+                {
+                    _networkMonitor.StartMonitoring();
+                    NetworkMonitoring();
+                }
+            }
+            else
+            {
+                if (_networkMonitor != null) _networkMonitor.StopMonitoring();
+            }
         }
 
         private void helpTipsToggle_ToggleClicked(object sender, EventArgs e)
@@ -3144,5 +3771,102 @@ namespace Optimizer
         {
             CheckForUpdate();
         }
+
+        private void hwDetailed_ToggleClicked(object sender, EventArgs e)
+        {
+            specsTree.Nodes.Clear();
+
+            if (hwDetailed.ToggleChecked)
+            {
+                specsTree.Nodes.AddRange(_hwDetailed.ToArray());
+            }
+            else
+            {
+                specsTree.Nodes.AddRange(_hwSummarized);
+            }
+
+            TranslateIndicium();
+            specsTree.ExpandAll();
+            specsTree.Nodes[0].EnsureVisible();
+        }
+
+        private void trayHW_Click(object sender, EventArgs e)
+        {
+            tabCollection.SelectedTab = indiciumTab;
+            RestoreWindow();
+        }
+
+        private void toolStripMenuItem1_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                Clipboard.SetText(specsTree.SelectedNode.Text);
+            }
+            catch { }
+        }
+
+        private void toolStripMenuItem2_Click(object sender, EventArgs e)
+        {
+            if (specsTree.Nodes.Count > 0)
+            {
+                Utilities.SearchWith(specsTree.SelectedNode.Text, false);
+            }
+        }
+
+        private void toolStripMenuItem3_Click(object sender, EventArgs e)
+        {
+            if (specsTree.Nodes.Count > 0)
+            {
+                Utilities.SearchWith(specsTree.SelectedNode.Text, true);
+            }
+        }
+
+        private void btnSaveHW_Click(object sender, EventArgs e)
+        {
+            SaveFileDialog d = new SaveFileDialog();
+            d.InitialDirectory = Application.StartupPath;
+            d.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
+            d.FileName = $"Optimizer_Hardware_{Environment.MachineName}_{DateTime.Now.ToShortDateString()}.txt";
+
+            if (d.ShowDialog() == DialogResult.OK) File.WriteAllText(d.FileName, GetSpecsToString(specsTree), Encoding.UTF8);
+        }
+
+        private void btnCopyHW_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                Clipboard.SetText(GetSpecsToString(specsTree));
+            }
+            catch { }
+        }
+
+        private string GetSpecsToString(TreeView trv)
+        {
+            StringBuilder sb = new StringBuilder();
+            foreach (TreeNode node in trv.Nodes)
+            {
+                WriteNodeIntoString(0, node, sb);
+            }
+
+            return sb.ToString();
+        }
+
+        private void WriteNodeIntoString(int level, TreeNode node, StringBuilder sb)
+        {
+            sb.AppendLine(new string('\t', level) + node.Text);
+
+            foreach (TreeNode child in node.Nodes)
+            {
+                WriteNodeIntoString(level + 1, child, sb);
+            }
+        }
+
+        private void specsTree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
+        {
+            if (e.Button == MouseButtons.Right || e.Button == MouseButtons.Left)
+            {
+                specsTree.SelectedNode = e.Node;
+            }
+        }
     }
 }

+ 172 - 13
Optimizer/Forms/MainForm.resx

@@ -397,6 +397,9 @@
         D5X2XSh/+v/1kqS/AhjB55rV+r1JAAAAAElFTkSuQmCC
 </value>
   </data>
+  <metadata name="indiciumMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>904, 44</value>
+  </metadata>
   <data name="integrator7.Text" xml:space="preserve">
     <value>Items can have custom icons and position.
 They can also be hidden, accessible only
@@ -1793,41 +1796,184 @@ any application only by typing your desired keyword.</value>
         2+78tjX//qqUN7yvicFQFckgXfpv8rIR+fgu/Ah+Dr8jjzN3IOTvT+V3/n6L/5evlisQ5wP9dHVI2crU
         rE3Ix+7k4Rcga1tkt94dYVX+/60atFDEkXuZ1Y7Ggc1va7TGJC81SGd50tucvz/gr9xb5YFM+nU5P6mP
         Tfnt01DpHHsRacX2GdHrD2pe59Fv2Ykj90rLlgnlW+AuMsv+fzJ11yOH4nDYAAAAAElFTkSuQmCC
+</value>
+  </data>
+  <metadata name="imagesHw.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>796, 44</value>
+  </metadata>
+  <data name="imagesHw.ImageStream" mimetype="application/x-microsoft.net.object.binary.base64">
+    <value>
+        AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w
+        LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0
+        ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC8
+        GgAAAk1TRnQBSQFMAgEBCQEAAUABAQFAAQEBIAEAASABAAT/ASEBAAj/AUIBTQE2BwABNgMAASgDAAGA
+        AwABYAMAAQEBAAEgBgABwP8A/wD/AP8A/wD/AP8A/wAeAANHAYB0//8AiQADRwGAdP//AIkAAyoBQANH
+        AYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANH
+        AYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGA/wD/AP8A
+        kwBo/wNHAYD/AJUAaP8DRwGA/wCVAAj/A1oBwANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGA
+        A0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgAj/A0cBgP8A
+        lQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNH
+        AYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/
+        A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8A
+        lQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNHAYBUAAj/A0cBgP8AlQAI/wNH
+        AYBUAAj/A0cBgP8AlQBo/wNHAYD/AJUAaP8DRwGA/wCVAGj/A0cBgP8A/wD/AP8A/wD/AP8A/wD/AP8A
+        /wD/AP8A/wD/AB8AA0cBgGj/A1oBwP8AjQADRwGAdP8QAANHAYBg/wNHAYADKgFARAAI/wNHAYC8AAz/
+        A0cBgAMqAUBUAANHAYAM/wNHAYAMAGj/A0cBgEQACP8DRwGAeAAM/zgACP8DRwGAZAAI/wNHAYAIAHD/
+        RAADRwGAA0cBgAMqAUBwAANHAYAQ/yAAA0cBgANHAYADKgFADAAI/wNHAYAEAAj/A0cBgAQAKP8DRwGA
+        BAAI/wNHAYAEAAj/A0cBgAQACP8DRwGACAAM/1gAA0cBgAj/vAAY/yAACP8DRwGADAAI/wNHAYAEAAj/
+        A0cBgAQAKP8DRwGABAAI/wNHAYAEAAj/A0cBgAQACP8DRwGACAAM/zQAA0cBgANHAYADRwGACAADRwGA
+        A0cBgAMqAUAEAANHAYAI/zQAA0cBgCAAA0cBgAMqAUBUAANHAYAc/yAACP8DRwGADAAI/wNHAYBkAAj/
+        A0cBgAgADP80AAz/A0cBgBD/BAADRwGACP8wAAz/A0cBgBQADP9QACT/IAAI/wNHAYAMAAj/A0cBgGQA
+        CP8DRwGACAAM/zQADP8DRwGAEP8EAANHAYAI/zAAMP80AAMqAUADRwGAA0cBgANHAYADRwGAA0cBgCj/
+        IAAI/wNHAYAMAAj/A0cBgAQACP8DRwGABAAI/wNHAYAEAAj/A0cBgAQACP8DRwGABAAI/wNHAYAEAAj/
+        A0cBgAQACP8DRwGACAAM/zQADP8IAAj/A0cBgAQAA0cBgAj/MAAw/zQAQP8gAAj/A0cBgAwACP8DRwGA
+        BAAI/wNHAYAEAAj/A0cBgAQACP8DRwGABAAI/wNHAYAEAAj/A0cBgAQACP8DRwGABAAI/wNHAYAIAAz/
+        WAADRwGACP80AANHAYADRwGAGP8DWgHAA0cBgAMqAUA0AED/CAADRwGACP8MAAj/A0cBgAwACP8DRwGA
+        ZAAI/wNHAYAIAHD/IAAE/wNHAYBEAAT/JABA/wgAA0cBgAj/DAAI/wNHAYAMAAj/A0cBgGQACP8DRwGA
+        CABw/xwAA0cBgAz/AyoBQDQAA0cBgAz/AyoBQBwAQP8IAANHAYAI/wwACP8DRwGADAAI/wNHAYAEAAj/
+        A0cBgAQACP8DRwGABAAI/wNHAYAEAAj/A0cBgAQACP8DRwGABAAI/wNHAYAEAAj/A0cBgAwAaP8DRwGA
+        HAADRwGAFP8oAANHAYAU/wNHAYAcAED/CAADRwGACP8MAAj/A0cBgAwACP8DRwGABAAI/wNHAYAEAAj/
+        A0cBgAQACP8DRwGABAAI/wNHAYAEAAj/A0cBgAQACP8DRwGABAAI/wNHAYAMAAz/UAAM/wNHAYAcAAMq
+        AUAY/wNHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAGP8DRwGAIABA/wgAA0cBgAj/DAAI/wNH
+        AYAMAAj/A1oBwGAAA0cBgAj/A0cBgAwAA0cBgAz/SAADRwGADP8oAEj/A0cBgCQAQP8IAANHAYAI/wwA
+        CP8DRwGADAAQ/wNHAYBUABD/A0cBgAwAA0cBgAz/SAADRwGADP8QAANHAYADRwGAAyoBQBAAA0cBgANa
+        AcA0/wNHAYAUAANHAYADRwGAAyoBQAwAQP8IAANHAYAI/wwACP8DRwGADAADKgFAcP8DRwGAFAAM/wNH
+        AYBEAAz/EAAQ/xwAA0cBgCT/HAAQ/wwAQP8IAANHAYAI/wwACP8DRwGAFABo/wNHAYAYAAz/A0cBgEQA
+        DP8QAANHAYAQ/wNaAcBQAANHAYAQ/wNaAcAMAANaAcA8/yAACP8DRwGARAADWgHACP9MAAz/QAAM/wNH
+        AYAUAANHAYAU/wNHAYBEABj/KAAo/yAACP8DRwGARAADRwGACP9MAAz/QAAM/wNHAYAYAANHAYAY/wNa
+        AcADRwGAAyoBQCQAA0cBgANHAYAY/wNaAcAvAAEBA0cBgCD/IAAI/wNHAYBEAANHAYAI/0wAA0cBgAz/
+        OAADRwGADP8kAGD/QAAc/yAACP8DRwGARAADRwGACP9MAANHAYAM/wNHAYADRwGAA0cBgANHAYADRwGA
+        A0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA1oBwAz/KAADKgFAA0cBgEj/A1oBwANH
+        AYBIAANHAYAU/yAACP8DRwGARAAI/wNaAcBQAFD/OABA/1wAEP9sAAz/A0cBgFAAA0cBgEj/A1oBwEQA
+        A0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgAMqAUBnAAEBA0cBgANHAYADRwGA
+        bAAM/1wAQP//AFkADP//APUADP//APUADP8DRwGA/wD/AP8A/wD/AP8A/wD/AGQAAyoBQANHAYADRwGA
+        DAADRwGAA0cBgAMqAUAIAANHAYADRwGAA0cBgFAAA0cBgANHAYADKgFAVAADRwGA/wAVAANHAYAI/wwA
+        CP8DRwGACAAM/0wAEP9UAAT//wAVAANHAYAI/wwACP8DRwGACAAM/0gAA1oBwBT/AyoBQEwABP8MAANH
+        AYADRwGAA0cBgANHAYADRwGABAADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADRwGA
+        A0cBgANHAYADRwGAbAADKgFAEP8DRwGAOAADRwGACP8MAAj/A0cBgAgADP9EACD/TAAE/wwAFP8EADT/
+        bAAY/wNHAYAwAANHAYADWgHACP8DRwGAA0cBgANHAYAI/wNaAcADRwGAA0cBgAz/A0cBgDwAA1oBwAz/
+        A1oBwANHAYAQ/wMqAUBEAAT/DAAE/wQABP8EAAT/BAAE/wQABP8EAAT/BAAE/wQABP8EAAT/BAAE/yAA
+        A0cBgBD/A1oBwBQAA0cBgANHAYADKgFABAADRwGAA0cBgAMqAUAEAAj/A1oBwANHAYAI/wNHAYAsAANH
+        AYBE/zQAFP8IAANHAYAQ/0QABP8MAAT/DAAE/wQABP8sAAT/IAAY/xQACP8DRwGABAAI/wNHAYAEABj/
+        A0cBgCwASP8DRwGALAADWgHADP8DWgHADAADWgHAFP8DKgFANABw/wMqAUAQAAz/A1oBwAj/FAAI/wNH
+        AYAEAAj/A0cBgAQAA1oBwBT/AyoBQBwAIP8oAANHAYAc/wNHAYAYABT/DAAg/zwABP9cAANHAYAI/xAA
+        GP8UAAj/A0cBgAQACP8DRwGACAAQ/yQAGP8DWgHAMAADRwGAGP8DRwGAFAADWgHADP8DWgHADAADKgFA
+        BAADWgHABP8DWgHAA0cBgBD/AyoBQCwAEP8DRwGACAADRwGAA0cBgANHAYADKgFAFAADRwGAGP8DRwGA
+        AyoBQAgAA0cBgAT/A0cBgAwAGP8MACj/A0cBgAQACP8DRwGAJAAY/wNHAYA0ABj/A0cBgBQAEP8QAAj/
+        BAAE/wgAA0cBgBD/LAAE/wQABP8QAAz/A0cBgA8AAQEU/wNHAYAEAAz/AwABAQgAA0cBgAT/A0cBgAwA
+        EP8DRwGADAAo/wNHAYAEAAj/A0cBgDQACP8DRwGACAAg/wwACP8DRwGAJAAQ/wMqAUAEAAMqAUAM/wNa
+        AcAMAANaAcAU/wMqAUAkAAT/BAAI/wNHAYAIAAT/A0cBgAT/A0cBgAwAA1oBwAT/A0cBgAQAA0cBgAT/
+        CAADWgHADP8DKgFABAADKgFABP8DRwGAEAAI/xQACP8DRwGAFAAI/wNHAYAEAAj/A0cBgDQACP8DRwGA
+        CAAg/wwACP8DRwGAJAADRwGAEP8IABT/BAAg/yQABP8EAAT/EAAE/wNHAYAE/wNHAYAIAAz/A0cBgAQA
+        A0cBgAT/BAAM/wMAAQEI/wgABP8DRwGAEAAI/xQACP8DRwGAFAAI/wNHAYAEAAj/A0cBgCQAA0cBgANH
+        AYADRwGAA0cBgAj/A0cBgAgADP8DRwGAA0cBgANaAcAI/wwACP8DWgHAA0cBgANHAYADRwGAAyoBQBgA
+        A0cBgBD/AyoBQAQAA1oBwAT/A1oBwAwAA1oBwAT/A1oBwANHAYAQ/wMqAUAcAAT/A0cBgAj/A0cBgAgA
+        BP8DWgHABP8DRwGABAADKgFABP8DWgHABP8DWgHABAADRwGABP8DWgHABP8DWgHACAADRwGABP8DRwGA
+        BAAE/wNHAYAQACT/A0cBgAj/DAAY/wNHAYAkABj/A0cBgAgADP8IAANHAYAI/wwAGP8DRwGAHAADRwGA
+        EP8IAAT/FAAE/wgAA0cBgBD/HAAM/xAADP8DRwGABAADRwGABP8DRwGAHP8DRwGAFP8EAAT/A0cBgBAA
+        JP8DRwGACP8MABj/A0cBgCQAGP8DRwGACAAM/wgAA0cBgAj/DAAY/wNHAYAgAANHAYAQ/wMqAUAkAANa
+        AcAU/wMqAUAUAANHAYADRwGACP8DRwGAHAADRwGABP8IAAMqAUAI/wNHAYADRwGAHP8EAAT/A0cBgCwA
+        CP8DRwGAFAAI/wNHAYAIAANHAYAQ/wNaAcAkAAj/A0cBgAgAIP8MAAj/A0cBgDQAA0cBgBD/GAAE/wQA
+        IP8UAAz/JAADRwGACP8IAAj/CAAI/wwACP8EAAT/A0cBgCwACP8DRwGAFAAI/wNHAYAIABj/JAAI/wNH
+        AYAIACD/DAAI/wNHAYA4AANHAYAQ/wMqAUAMAANaAcAE/wNaAcAEAANaAcAE/wNaAcADRwGAEP8DKgFA
+        FAAI/wNHAYAIAAz/A0cBgAQAA0cBgBj/A0cBgQNHAYAM/wMqAUAEAANaAcAE/wQABP8DRwGAEAAk/wNH
+        AYAUACD/A1oBwAj/JAAI/wNHAYAIACD/DAAI/wNHAYA8AANHAYAQ/wgAFP8EAAT/CAADRwGADP8DRwGA
+        FAAE/xAABP8DRwGABP8DRwGABAADRwGABP8DRwGADAAQ/wNHAYAI/wQACP8EAAT/A0cBgBAAJP8DRwGA
+        FAAs/xQAGP8DRwGANAAY/wNHAYAwAANHAYAQ/wMqAUAEAANaAcAM/wMqAUAMAANaAcAM/wNHAYAMABD/
+        A0cBgAgABP8DRwGABP8DRwGABwABAQT/A1oBwAgAA0cBgAT/A0cBgANHAYAE/wQAA0cBgAT/A0cBgQT/
+        AwABAQQABP8DRwGAEAAI/xQACP8DRwGAFAAI/wNHAYAIABj/FAAc/zAAHP8DRwGANAADRwGAEP8IAAj/
+        EAAU/xAABP8EAAT/EAAE/wNHAYAE/wNHAYAIABT/A0cBgQQAA0cBgAT/CAAI/wNHAYEIAAT/A0cBgBAA
+        CP8UAAj/A0cBgBQACP8DRwGADAAQ/wNHAYAUAANHAYADRwGAA0cBgANHAYAQ/wNHAYADRwGAA0cBgANH
+        AYADRwGAA0cBgANHAYADRwGAA0cBgANHAYADWgHADP8DWgHAA0cBgANHAYADRwGAAyoBQDgAA0cBgBD/
+        AyoBQAQAAyoBQAwAA1oBwAz/A1oBwBQABP8DRwGACP8DRwGACAAE/wNaAcAE/wNHAYAMAANaAcAM/wMA
+        AQEEAANaAcAE/wMqAUADRwGACP8DKgFABAADKgFABP8DRwGACAADRwGAEP8DWgHADAAo/wNHAYBEAEj/
+        A0cBgEwAA0cBgBD/EAAU/xgADP8QAAz/A0cBgBAAKP8MAAj/A0cBgAgAGP8MACj/A0cBgEQAAyoBQED/
+        A0cBgFQAA0cBgBD/AyoBQAQAA1oBwAz/A1oBwCQACP8DRwGALAADKgFAA0cBgBD/A1oBwANHAYAIAAMq
+        AUAI/wNHAYAMAAz/A1oBwAj/FAAI/wNHAYAEAAj/A0cBgFQAA0cBgAj/DAAI/wNHAYAIAAz/YAADRwGA
+        JP8oAAT/XAADRwGABP8DRwGAEAAY/xQACP8DRwGABAAI/wNHAYBUAANHAYAI/wwACP8DRwGACAAM/2QA
+        A0cBgBj/A1oBwCQAbP8DRwGAFAAY/xQACP8DRwGABAAI/wNHAYBUAANHAYAI/wwACP8DRwGACAAM/2gA
+        A0cBgBT/sAAQ/wNHAYCEAANHAYAI/wwACP8DRwGACAAM/2wAA0cBgAj/A1oBwP8A/wD/AP8A/wD/AP8A
+        LwABQgFNAT4HAAE+AwABKAMAAYADAAFgAwABAQEAAQEGAAEGFgAD/wEABP8MAAT/DAAE/wwABP8MAAGA
+        AgABAQwAAYACAAEBDAABgAIAAQEMAAT/DAAB4AIAAQMMAAHgAgABAwwAAeACAAEDDAAB4wL/AeMMAAHj
+        Av8B4wwAAeMC/wHjDAAB4wL/AeMMAAHjAv8B4wwAAeMC/wHjDAAB4wL/AeMMAAHjAv8B4wwAAeMC/wHj
+        DAAB4wL/AeMMAAHjAv8B4wwAAeMC/wHjDAAB4wL/AeMMAAHjAv8B4wwAAeACAAEDDAAB4AIAAQMMAAHg
+        AgABAwwABP8MAAT/DAAE/wwABP8MACz/AcACAAEDDP8BgAIAAQEB4AIAAQMB/wH+AT8F/wGDAv8C4AIA
+        AQMB/wH+AT8D/wEfAf8BjwL/AfgBwAIAAQMB/wH+AT8C/wH8AR8B4wGIAYABCAGIAccC/wHjBf8B+AEf
+        AeMBiAGAAQgBiAHHAf8BxgEjAf8B7wHzAv8B4AEfAeMBjwL/AfgBxwH/AcABIwH/AcMB4wL/AcABHwHj
+        AY8C/wH4AccB/wHAASMB/wHAAQMB/wHgAQABHwHjBIgBxwH/AcYBIwH/AcABAwH/AeABAAEfAeMEiAHH
+        Av8B4wH/AeABAwH/AeABAAEYAeMBjwL/AfgBwAIAAQMB/AL/Ab8B4AEAARgB4wGPAv8B+AHAAgABAwH4
+        AT8B/gEPAeABAAEYAeMEiAHgAgABAwH4AR8B+AEPAeABAAEYAeMEiAHjAv8BwwH4AgABHwHgAQABGAHj
+        AY8C/wHwAeEC/wGHAf4CAAE/AeABAAEYAeMBgwL/AeAB4QL/AYcBjwIAAfgB4AEAARgB4wGAAgABAQHw
+        Av8BjwEPAeABBwHwAeABAAEYAeMB4AIAAQMB8AL/AY8BAwL/AcAB4AEAAR8B4wH/Af4BPwH/AfgC/wEP
+        AYAC/wGBAf8BgAEfAeMB/wH+AT8B/wH4Av8BDwHAAQ8B+AEDAf8BgAEfAeMB/wH+AT8B/wH4AX8B/gEf
+        AfACAAEPAf8B8AEfAeMB/wH+AT8B/wH4AgABHwH4AgABHwH/AfgBHwHjAf8B/gE/Af8B/AIAAT8B/wIA
+        Av8B/gEfAv8B/AE/Af8B/AIAAT8B/wHgAQMC/wH+AR8C/wH8AX8C/wIACv8B/AF/Dv8B/AF/Dv8B/AE/
+        Qv8BjgExAv8B4wL/Ae8I/wGOATEC/wHDAv8B7wj/AY4BMQL/AYAC/wHuAQgBAAE/Av8B+AEfAf8BjgEx
+        Av8BAAL/Ae4BCAEAAT8C/wH4AQ8B/wIAAf8B/gEAAT8B/wHuAqoBvwHAAfgBiAEPAf4CAAF/AfwBGAE/
+        Af8B7gHrAf8BvwHAAfgBiAEPAf4CAAE/AfgBOAEPAf8BgAIAAQMBwAH4AYgBDwHgAR8B+AEDAfABcAEP
+        Af8B7wL/AeMBwAH4AYwBPwHgAT8B/AEDAeAB6AEDAf8BgwEPAYABMQHAAeABAgE/AeABPwH+AQMB4QHl
+        AYMB/wGvAQ4BAgEYAuABAgE/Af4BMAEOAT8B4AGDAYAB/wGjAQ4BJgEIAfMB4wHiAT8B/gEwAQ4BPwHg
+        AcEBAAH/Aa8BDAEkAQwB8wHjAeIBPwHgATABDgEDAfABIwGAAT8BgwEIASABxAHwAQAB4AE/AeABMQGO
+        AQMB+AE3AdgBPwGPAQgBAAEEAfABAAHgAT8B4AExAY4BAwH8AQ8B+AEPAYMB+QGAAQQB/wLjAQMB/gEw
+        AQ4BPwH+AQ8B0AEPAY8B+AHMAeQB/wLjAQMB/gEwAQ4BPwH/AQMBiAEDAeMBCAEAASQB8AEDAeABAwH+
+        ATABDgE/Af8BgwEFAYMB7wEIAeABJAHwAQMB4AEDAeABPwH+AQMB/wHAA4MBCAHBAQQB8wLjAQMB4AE/
+        AfwBAwH/AeABzwEHAa8BDAEJAYwB8wLjAYMB4AIAAQMB/wHwAS4BDwGDAQ4CCAHAAeABAwH/Af4CAAE/
+        Af8B+AE8AR8BjwEPAQABOAHAAeABAwH/Af4CAAF/Af8B/AEIAT8B4wH/AYABYQHAAfgBjwL/AY4BMQL/
+        Af4BAAF/Ae8C/wHjAcAB+AGPAv8BjgExA/8BAAH/AYACAAEHAcAB+AGPAv8BjgExA/8BgQX/AeAE/wGO
+        ATED/wHDOf8L
 </value>
   </data>
   <metadata name="defineCommandDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>127, 17</value>
+    <value>83, 12</value>
   </metadata>
   <metadata name="defineProgramDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>305, 17</value>
+    <value>261, 12</value>
   </metadata>
   <metadata name="defineFolderDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>473, 17</value>
+    <value>429, 12</value>
   </metadata>
   <metadata name="defineFileDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>628, 17</value>
+    <value>584, 12</value>
   </metadata>
   <metadata name="DefineProgramIconDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>768, 17</value>
+    <value>724, 12</value>
   </metadata>
   <metadata name="DefineFolderIconDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>961, 17</value>
+    <value>917, 12</value>
   </metadata>
   <metadata name="DefineURLIconDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>1263, 17</value>
+    <value>1219, 12</value>
   </metadata>
   <metadata name="DefineFileIconDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>1430, 17</value>
+    <value>1386, 12</value>
   </metadata>
   <metadata name="DefineCommandIconDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>17, 56</value>
+    <value>594, 44</value>
   </metadata>
   <metadata name="ExportDialog.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>1141, 17</value>
+    <value>1097, 12</value>
   </metadata>
   <metadata name="launcherMenu.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>219, 56</value>
+    <value>160, 46</value>
   </metadata>
+  <data name="trayDownSpeed.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACVSURBVGhD7c9bCsQgEERR978qd5YQKCFI5TVD7DbcA/Vj
+        q1QXAAAA4Htqrcs+Op4HC0RjgWgsEI0ForFAtPQLXBX8d/66vkBf4smsnw/hSmzR+HCB/rxF43FciRY3
+        v/NmOFfkl+i7GK7Qk+ibWK7Yneh5Dq7gWfQsF1fURddzcoX30bXcXPEtGs9h6vLN1OUBAHhfKStvXoLZ
+        PGw0bQAAAABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="trayUpSpeed.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8
+        YQUAAAAJcEhZcwAACxIAAAsSAdLdfvwAAACVSURBVGhD7c9RCsQgDIRh738qb7aLMEKR2dW2YCL8H8xD
+        G5VJAQAAP9RaPy36PEsvf+QSY/kejXNzxa/RsZxcYRcdz8UV/Rddy8EVXImux3LF7kTPxHCFnkTP7eWK
+        9Lj5yp2tXIkWje0Czfi/R+N9ZiXuzMb5FrMCb+fh0hecYYFoLBCNBaKxQDQWiHb8AgAAAMBEKV9ExYLZ
+        y3qhowAAAABJRU5ErkJggg==
+</value>
+  </data>
   <data name="trayStartup.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
         iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
@@ -1944,6 +2090,19 @@ any application only by typing your desired keyword.</value>
         jFG8Evswz5DrixWwD3SmXFushH2oM+S6YkXsgx0p1xQrYx/uCKkvMmAfcI/UFpmwD7lF6oqM2AedkZoi
         M/ZhRyReXAH7wJHEiithH9rkeHFF7IN/l2PF1akPXxRFURRFURRFURRFURTFXfjz51+ntwAJHZvXfwAA
         AABJRU5ErkJggg==
+</value>
+  </data>
+  <data name="trayHW.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
+    <value>
+        iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAABGdBTUEAALGPC/xhBQAAAAlwSFlzAAAL
+        EgAACxIB0t1+/AAAAZ1JREFUaEPtjgHOqjAQBr3/qbzZe6GZzyx1BH5ULAmTTKJ0ut3bxcXFsdzv939V
+        Pp+DfvnI8djY4lWyMbGFTfKxsEWX5NoY2IJb5PpvscUiyabmJ9hCkeSBNZHkWGyRSPKEtZHkGGyBSPIS
+        uxNJvos9HEka/f9Kf69K8h3swUjSePW9Upteks9iD0WSxtp5xdpI8hnsgUjSsPNI8oS1kxy/jw2PJA07
+        jySt4eeDvo0cv4cNjiQzlrq1b70k+7GhkUSxrn7bItf2Y0MjySK16++vybX92NBI8mdslkm+HxsaSXZj
+        M6tk+7GhkaTR/zesqfN6SfZjQyNJ49X3ijX1Wy/JfmxoJGmsnU9YsyTX9mNDI0nDziPJuZcP1pjk72GD
+        JzmesbWbsLZK9j42fJLjJ6yxvna9JJ/BHogkT9Qz6+u3XpLPYg9FEsX6Jbn2HezBSDLDuiW59l3s4Ugy
+        wzqT/BhsgUgyw7oq2bHYIpHkgTWR5DfYQpFk3OWDLbZFro+BLbgk18bCFjXJx8QWrpKNjS0+yfE5OPXy
+        Fxen53b7D1YCyYQqquMKAAAAAElFTkSuQmCC
 </value>
   </data>
   <data name="trayRegistry.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
@@ -2006,7 +2165,7 @@ any application only by typing your desired keyword.</value>
 </value>
   </data>
   <metadata name="launcherIcon.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>349, 56</value>
+    <value>305, 51</value>
   </metadata>
   <data name="launcherIcon.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
     <value>
@@ -3141,7 +3300,7 @@ any application only by typing your desired keyword.</value>
 </value>
   </data>
   <metadata name="helpBox.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
-    <value>470, 56</value>
+    <value>427, 51</value>
   </metadata>
   <metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
     <value>94</value>

+ 13 - 13
Optimizer/Forms/SplashForm.Designer.cs

@@ -32,7 +32,7 @@ namespace Optimizer
             System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(SplashForm));
             this.pictureBox1 = new System.Windows.Forms.PictureBox();
             this.pictureBox2 = new System.Windows.Forms.PictureBox();
-            this.label1 = new System.Windows.Forms.Label();
+            this.LoadingStatus = new System.Windows.Forms.Label();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
             ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit();
             this.SuspendLayout();
@@ -57,17 +57,17 @@ namespace Optimizer
             this.pictureBox2.TabIndex = 1;
             this.pictureBox2.TabStop = false;
             // 
-            // label1
+            // LoadingStatus
             // 
-            this.label1.Dock = System.Windows.Forms.DockStyle.Bottom;
-            this.label1.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
-            this.label1.ForeColor = System.Drawing.Color.Silver;
-            this.label1.Location = new System.Drawing.Point(0, 199);
-            this.label1.Name = "label1";
-            this.label1.Size = new System.Drawing.Size(458, 59);
-            this.label1.TabIndex = 2;
-            this.label1.Text = "loading ...";
-            this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
+            this.LoadingStatus.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.LoadingStatus.Font = new System.Drawing.Font("Segoe UI Semibold", 12F, ((System.Drawing.FontStyle)((System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))), System.Drawing.GraphicsUnit.Point, ((byte)(0)));
+            this.LoadingStatus.ForeColor = System.Drawing.Color.Silver;
+            this.LoadingStatus.Location = new System.Drawing.Point(0, 199);
+            this.LoadingStatus.Name = "LoadingStatus";
+            this.LoadingStatus.Size = new System.Drawing.Size(458, 59);
+            this.LoadingStatus.TabIndex = 2;
+            this.LoadingStatus.Text = "loading settings ...";
+            this.LoadingStatus.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
             // 
             // SplashForm
             // 
@@ -75,7 +75,7 @@ namespace Optimizer
             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi;
             this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
             this.ClientSize = new System.Drawing.Size(458, 258);
-            this.Controls.Add(this.label1);
+            this.Controls.Add(this.LoadingStatus);
             this.Controls.Add(this.pictureBox2);
             this.Controls.Add(this.pictureBox1);
             this.DoubleBuffered = true;
@@ -98,6 +98,6 @@ namespace Optimizer
 
         private System.Windows.Forms.PictureBox pictureBox1;
         private System.Windows.Forms.PictureBox pictureBox2;
-        private System.Windows.Forms.Label label1;
+        protected internal System.Windows.Forms.Label LoadingStatus;
     }
 }

+ 124 - 115
Optimizer/Hardware.cs

@@ -1,127 +1,136 @@
-//using System;
-//using System.Collections.Generic;
-//using System.Linq;
-//using System.Text;
-//using System.Threading.Tasks;
+using System;
+using System.Collections.Generic;
 
-//namespace Optimizer
-//{
-//    public class CPU
-//    {
-//        public string Name { get; set; }
-//        public ByteSize L2CacheSize { get; set; }
-//        public ByteSize L3CacheSize { get; set; }
-//        public UInt32 Cores { get; set; }
-//        public UInt32 Threads { get; set; }
-//        public UInt32 LogicalCpus { get; set; }
-//        public string Virtualization { get; set; }
-//        public string DataExecutionPrevention { get; set; }
-//        public string Stepping { get; set; }
-//        public string Revision { get; set; }
-//    }
+namespace Optimizer
+{
+    public class CPU
+    {
+        public string Name { get; set; }
+        public ByteSize L2CacheSize { get; set; }
+        public ByteSize L3CacheSize { get; set; }
+        public UInt32 Cores { get; set; }
+        public UInt32 Threads { get; set; }
+        public UInt32 LogicalCpus { get; set; }
+        public string Virtualization { get; set; }
+        public string DataExecutionPrevention { get; set; }
+        public string Stepping { get; set; }
+        public string Revision { get; set; }
+    }
 
-//    public class RAM
-//    {
-//        public string BankLabel { get; set; }
-//        public UInt64 Capacity { get; set; }
-//        public string FormFactor { get; set; }
-//        public string Manufacturer { get; set; }
-//        public string MemoryType { get; set; }
-//        public UInt32 Speed { get; set; }
-//    }
+    public class RAM
+    {
+        public string BankLabel { get; set; }
+        public ByteSize Capacity { get; set; }
+        public string FormFactor { get; set; }
+        public string Manufacturer { get; set; }
+        public string MemoryType { get; set; }
+        public UInt32 Speed { get; set; }
+    }
 
-//    public class VirtualMemory
-//    {
-//        public ByteSize TotalVirtualMemory { get; set; }
-//        public ByteSize AvailableVirtualMemory { get; set; }
-//        public ByteSize UsedVirtualMemory { get; set; }
-//    }
+    public class VirtualMemory
+    {
+        public ByteSize TotalVirtualMemory { get; set; }
+        public ByteSize AvailableVirtualMemory { get; set; }
+        public ByteSize UsedVirtualMemory { get; set; }
+    }
 
-//    public class GPU
-//    {
-//        public string Name { get; set; }
-//        public ByteSize Memory { get; set; }
-//        public UInt32 ResolutionX { get; set; }
-//        public UInt32 ResolutionY { get; set; }
-//        public UInt32 RefreshRate { get; set; }
-//        public string DACType { get; set; }
-//        public string VideoMemoryType { get; set; }
-//    }
+    public class GPU
+    {
+        public string Name { get; set; }
+        public ByteSize Memory { get; set; }
+        public UInt32 ResolutionX { get; set; }
+        public UInt32 ResolutionY { get; set; }
+        public UInt32 RefreshRate { get; set; }
+        public string DACType { get; set; }
+        public string VideoMemoryType { get; set; }
+    }
 
-//    public class Disk
-//    {
-//        public UInt32 BytesPerSector { get; set; }
-//        public string FirmwareRevision { get; set; }
-//        public string MediaType { get; set; }
-//        public string Model { get; set; }
-//        public ByteSize Capacity { get; set; }
-//    }
+    public class Disk
+    {
+        public UInt32 BytesPerSector { get; set; }
+        public string FirmwareRevision { get; set; }
+        public string MediaType { get; set; }
+        public string Model { get; set; }
+        public ByteSize Capacity { get; set; }
+    }
 
-//    public class Volume
-//    {
-//        public UInt64 BlockSize { get; set; }
-//        public ByteSize Capacity { get; set; }
-//        public string Compressed { get; set; }
-//        public string DriveLetter { get; set; }
-//        public string DriveType { get; set; }
-//        public string FileSystem { get; set; }
-//        public ByteSize FreeSpace { get; set; }
-//        public ByteSize UsedSpace { get; set; }
-//        public string Indexing { get; set; }
-//        public string Label { get; set; }
-//    }
+    public class Volume
+    {
+        public UInt64 BlockSize { get; set; }
+        public ByteSize Capacity { get; set; }
+        public string Compressed { get; set; }
+        public string DriveLetter { get; set; }
+        public string DriveType { get; set; }
+        public string FileSystem { get; set; }
+        public ByteSize FreeSpace { get; set; }
+        public ByteSize UsedSpace { get; set; }
+        public string Indexing { get; set; }
+        public string Label { get; set; }
+    }
 
-//    public class NetworkDevice
-//    {
-//        public string AdapterType { get; set; }
-//        public string Manufacturer { get; set; }
-//        public string ProductName { get; set; }
-//        public string PhysicalAdapter { get; set; }
-//        public string MacAddress { get; set; }
-//        public string ServiceName { get; set; }
-//    }
+    public class NetworkDevice
+    {
+        public string AdapterType { get; set; }
+        public string Manufacturer { get; set; }
+        public string ProductName { get; set; }
+        public string PhysicalAdapter { get; set; }
+        public string MacAddress { get; set; }
+        public string ServiceName { get; set; }
+    }
 
-//    public class Keyboard
-//    {
-//        public string Name { get; set; }
-//        public string Layout { get; set; }
-//        public string Status { get; set; }
-//        public UInt16 FunctionKeys { get; set; }
-//        public string Locked { get; set; }
-//    }
+    public class Keyboard
+    {
+        public string Name { get; set; }
+        public string Layout { get; set; }
+        public string Status { get; set; }
+        public UInt16 FunctionKeys { get; set; }
+        public string Locked { get; set; }
+    }
 
-//    public class PointingDevice
-//    {
-//        public string Name { get; set; }
-//        public string Manufacturer { get; set; }
-//        public string Status { get; set; }
-//        public UInt16 Buttons { get; set; }
-//        public string Locked { get; set; }
-//        public string HardwareType { get; set; }
-//        public string PointingType { get; set; }
-//        public string DeviceInterface { get; set; }
-//    }
+    public class PointingDevice
+    {
+        public string Name { get; set; }
+        public string Manufacturer { get; set; }
+        public string Status { get; set; }
+        public UInt16 Buttons { get; set; }
+        public string Locked { get; set; }
+        public string HardwareType { get; set; }
+        public string PointingType { get; set; }
+        public string DeviceInterface { get; set; }
+    }
 
-//    public class AudioDevice
-//    {
-//        public string ProductName { get; set; }
-//        public string Manufacturer { get; set; }
-//        public string Status { get; set; }
-//    }
+    public class AudioDevice
+    {
+        public string ProductName { get; set; }
+        public string Manufacturer { get; set; }
+        public string Status { get; set; }
+    }
 
-//    public class Motherboard
-//    {
-//        public string Model { get; set; }
-//        public string Manufacturer { get; set; }
-//        public string Chipset { get; set; }
-//        public string Product { get; set; }
-//        public string Version { get; set; }
-//        public string Revision { get; set; }
-//        public string SystemModel { get; set; }
+    public class Motherboard
+    {
+        public string Model { get; set; }
+        public string Manufacturer { get; set; }
+        public string Chipset { get; set; }
+        public string Product { get; set; }
+        public string Version { get; set; }
+        public string Revision { get; set; }
+        public string SystemModel { get; set; }
 
-//        public string BIOSName { get; set; }
-//        public string BIOSManufacturer { get; set; }
-//        public string BIOSVersion { get; set; }
-//        public string BIOSBuildNumber { get; set; }
-//    }
-//}
+        public string BIOSName { get; set; }
+        public string BIOSManufacturer { get; set; }
+        public string BIOSVersion { get; set; }
+        public string BIOSBuildNumber { get; set; }
+    }
+
+    public static class HardwareSummary
+    {
+        public static List<string> CPUs = new List<string>();
+        public static string TotalRAM = string.Empty;
+        public static List<string> Motherboards = new List<string>();
+        public static List<string> GPUs = new List<string>();
+        public static List<string> Disks = new List<string>();
+        public static List<string> NetworkAdapters = new List<string>();
+        public static List<string> BIOS = new List<string>();
+        public static List<string> OSInfo = new List<string>();
+    }
+}

+ 665 - 477
Optimizer/IndiciumHelper.cs

@@ -1,477 +1,665 @@
-//using System;
-//using System.Collections.Generic;
-//using System.Linq;
-//using System.Text;
-//using System.Threading.Tasks;
-//using System.Management;
-//using System.IO;
-//using System.Net.NetworkInformation;
-//using System.Runtime.InteropServices;
-//using System.Globalization;
-//using Microsoft.Win32;
-
-//namespace Optimizer
-//{
-//    public static class IndiciumHelper
-//    {
-//        public static List<CPU> GetCPUs()
-//        {
-//            List<CPU> CPUs = new List<CPU>();
-//            CPU cpu;
-
-//            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
-//            foreach (ManagementObject mo in searcher.Get())
-//            {
-//                cpu = new CPU();
-
-//                cpu.Name = Convert.ToString(mo.Properties["Name"].Value);
-//                cpu.L2CacheSize = ByteSize.FromKiloBytes(Convert.ToDouble(mo.Properties["L2CacheSize"].Value));
-//                cpu.L3CacheSize = ByteSize.FromKiloBytes(Convert.ToDouble(mo.Properties["L3CacheSize"].Value));
-//                cpu.Cores = Convert.ToUInt32(mo.Properties["NumberOfCores"].Value);
-//                cpu.Threads = Convert.ToUInt32(mo.Properties["ThreadCount"].Value);
-//                cpu.LogicalCpus = Convert.ToUInt32(mo.Properties["NumberOfLogicalProcessors"].Value);
-//                bool temp = Convert.ToBoolean(mo.Properties["VirtualizationFirmwareEnabled"].Value);
-//                cpu.Virtualization = (temp) ? "Yes" : "No";
-//                cpu.Stepping = Convert.ToString(mo.Properties["Description"].Value);
-//                cpu.Revision = Convert.ToString(mo.Properties["Revision"].Value);
-
-//                try
-//                {
-//                    ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
-//                    foreach (ManagementObject mo2 in searcher2.Get())
-//                    {
-//                        bool temp2 = Convert.ToBoolean(mo2.Properties["DataExecutionPrevention_Available"].Value);
-//                        cpu.DataExecutionPrevention = (temp2) ? "Yes" : "No";
-//                    }
-//                }
-//                catch { }
-
-//                if (string.IsNullOrEmpty(cpu.Name)) cpu.Name = GetCPUNameAlternative();
-
-//                CPUs.Add(cpu);
-//            }
-
-//            return CPUs;
-//        }
-
-//        private static string GetCPUNameAlternative()
-//        {
-//            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0", false))
-//            {
-//                return key.GetValue("ProcessorNameString").ToString();
-//            }
-//        }
-
-//        public static List<RAM> GetRAM()
-//        {
-//            List<RAM> modules = new List<RAM>();
-//            RAM module;
-
-//            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
-//            foreach (ManagementObject mo in searcher.Get())
-//            {
-//                module = new RAM();
-
-//                module.BankLabel = Convert.ToString(mo.Properties["BankLabel"].Value);
-//                module.Capacity = Convert.ToUInt64(mo.Properties["Capacity"].Value);
-//                module.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
-//                module.Speed = Convert.ToUInt32(mo.Properties["Speed"].Value);
-//                UInt16 memorytype = Convert.ToUInt16(mo.Properties["MemoryType"].Value);
-//                UInt16 formfactor = Convert.ToUInt16(mo.Properties["FormFactor"].Value);
-//                module.MemoryType = SanitizeMemoryType(memorytype);
-//                module.FormFactor = SanitizeFormFactor(formfactor);
-
-//                modules.Add(module);
-//            }
-
-//            return modules;
-//        }
-
-//        public static List<GPU> GetGPUs()
-//        {
-//            List<GPU> GPUs = new List<GPU>();
-//            GPU gpu;
-
-//            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
-//            foreach (ManagementObject mo in searcher.Get())
-//            {
-//                gpu = new GPU();
-
-//                gpu.Name = Convert.ToString(mo.Properties["Name"].Value);
-//                gpu.Memory = ByteSize.FromBytes(Convert.ToDouble(mo.Properties["AdapterRAM"].Value));
-//                gpu.ResolutionX = Convert.ToUInt32(mo.Properties["CurrentHorizontalResolution"].Value);
-//                gpu.ResolutionY = Convert.ToUInt32(mo.Properties["CurrentVerticalResolution"].Value);
-//                gpu.RefreshRate = Convert.ToUInt32(mo.Properties["CurrentRefreshRate"].Value);
-//                gpu.DACType = Convert.ToString(mo.Properties["AdapterDACType"].Value);
-//                UInt16 vtype = Convert.ToUInt16(mo.Properties["VideoMemoryType"].Value);
-//                gpu.VideoMemoryType = SanitizeVideoMemoryType(vtype);
-
-//                GPUs.Add(gpu);
-//            }
-
-//            return GPUs;
-//        }
-
-//        public static List<Motherboard> GetMotherboards()
-//        {
-//            List<Motherboard> motherboards = new List<Motherboard>();
-//            Motherboard mobo;
-
-//            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
-//            foreach (ManagementObject mo in searcher.Get())
-//            {
-//                mobo = new Motherboard();
-
-//                mobo.Model = Convert.ToString(mo.Properties["Model"].Value);
-//                mobo.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
-//                mobo.Product = Convert.ToString(mo.Properties["Product"].Value);
-//                mobo.Version = Convert.ToString(mo.Properties["Version"].Value);
-
-//                try
-//                {
-//                    ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_IDEController");
-//                    foreach (ManagementObject mo2 in searcher2.Get())
-//                    {
-//                        mobo.Chipset = Convert.ToString(mo2.Properties["Description"].Value);
-//                    }
-//                }
-//                catch { }
-
-//                try
-//                {
-//                    ManagementObjectSearcher searcher3 = new ManagementObjectSearcher("SELECT * FROM Win32_IDEController");
-//                    foreach (ManagementObject mo3 in searcher3.Get())
-//                    {
-//                        mobo.Revision = Convert.ToString(mo3.Properties["RevisionNumber"].Value);
-//                    }
-//                }
-//                catch { }
-
-//                try
-//                {
-//                    ManagementObjectSearcher searcher4 = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem");
-//                    foreach (ManagementObject mo4 in searcher4.Get())
-//                    {
-//                        mobo.SystemModel = Convert.ToString(mo4.Properties["Model"].Value);
-//                    }
-//                }
-//                catch { }
-
-//                ManagementObjectSearcher searcher5 = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS");
-//                foreach (ManagementObject mo5 in searcher5.Get())
-//                {
-//                    mobo.BIOSName = Convert.ToString(mo5.Properties["Name"].Value);
-//                    mobo.BIOSManufacturer = Convert.ToString(mo5.Properties["Manufacturer"].Value);
-//                    mobo.BIOSVersion = Convert.ToString(mo5.Properties["Version"].Value);
-//                    mobo.BIOSBuildNumber = Convert.ToString(mo5.Properties["BuildNumber"].Value);
-//                    //ReleaseDate = DateTime.Parse(mo.Properties["ReleaseDate"].Value.ToString());
-//                }
-
-//                motherboards.Add(mobo);
-//            }
-
-//            return motherboards;
-//        }
-
-//        public static List<Disk> GetStorageDevices()
-//        {
-//            List<Disk> Disks = new List<Disk>();
-//            //List<Volume> Volumes = new List<Volume>();
-//            //List<Volume> Removables = new List<Volume>();
-//            //List<Volume> Opticals = new List<Volume>();
-
-//            Disk disk;
-
-//            ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
-//            foreach (ManagementObject mo2 in searcher2.Get())
-//            {
-//                disk = new Disk();
-
-//                disk.Model = Convert.ToString(mo2.Properties["Model"].Value);
-//                disk.BytesPerSector = Convert.ToUInt32(mo2.Properties["BytesPerSector"].Value);
-//                disk.FirmwareRevision = Convert.ToString(mo2.Properties["FirmwareRevision"].Value);
-//                disk.MediaType = Convert.ToString(mo2.Properties["MediaType"].Value);
-//                disk.Capacity = ByteSize.FromBytes(Convert.ToDouble(mo2.Properties["Size"].Value));
-
-//                Disks.Add(disk);
-//            }
-
-//            return Disks;
-//        }
-
-//        public static List<NetworkDevice> GetNetworkDevices()
-//        {
-//            List<NetworkDevice> adapters = new List<NetworkDevice>();
-//            NetworkDevice adapter;
-
-//            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter");
-//            foreach (ManagementObject mo in searcher.Get())
-//            {
-//                adapter = new NetworkDevice();
-
-//                adapter.AdapterType = Convert.ToString(mo.Properties["AdapterType"].Value);
-//                adapter.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
-//                adapter.ProductName = Convert.ToString(mo.Properties["ProductName"].Value);
-//                bool isPhysical = Convert.ToBoolean(mo.Properties["PhysicalAdapter"].Value);
-//                adapter.PhysicalAdapter = (isPhysical) ? "Yes" : "No";
-//                adapter.MacAddress = Convert.ToString(mo.Properties["MacAddress"].Value);
-//                adapter.ServiceName = Convert.ToString(mo.Properties["ServiceName"].Value);
-
-//                if (isPhysical) adapters.Add(adapter);
-//            }
-
-//            return adapters;
-//        }
-
-//        private static string SanitizeDriveType(UInt32 i)
-//        {
-//            string result = string.Empty;
-
-//            switch (i)
-//            {
-//                case 0:
-//                    result = "Unknown";
-//                    break;
-//                case 1:
-//                    result = "No Root Directory";
-//                    break;
-//                case 2:
-//                    result = "Removable Disk";
-//                    break;
-//                case 3:
-//                    result = "Local Disk";
-//                    break;
-//                case 4:
-//                    result = "Network Drive";
-//                    break;
-//                case 5:
-//                    result = "Compact Disk";
-//                    break;
-//                case 6:
-//                    result = "RAM Disk";
-//                    break;
-//            }
-
-//            return result;
-//        }
-
-//        private static string SanitizeVideoMemoryType(UInt16 i)
-//        {
-//            string result = string.Empty;
-
-//            switch (i)
-//            {
-//                case 1:
-//                    result = "Other";
-//                    break;
-//                case 2:
-//                    result = "Unknown";
-//                    break;
-//                case 3:
-//                    result = "VRAM";
-//                    break;
-//                case 4:
-//                    result = "DRAM";
-//                    break;
-//                case 5:
-//                    result = "SRAM";
-//                    break;
-//                case 6:
-//                    result = "WRAM";
-//                    break;
-//                case 7:
-//                    result = "EDO RAM";
-//                    break;
-//                case 8:
-//                    result = "Burst Synchronous DRAM";
-//                    break;
-//                case 9:
-//                    result = "Pipelined Burst SRAM";
-//                    break;
-//                case 10:
-//                    result = "CDRAM";
-//                    break;
-//                case 11:
-//                    result = "3DRAM";
-//                    break;
-//                case 12:
-//                    result = "SDRAM";
-//                    break;
-//                case 13:
-//                    result = "SGRAM";
-//                    break;
-//            }
-
-//            return result;
-//        }
-
-//        private static string SanitizeFormFactor(UInt16 i)
-//        {
-//            string result = string.Empty;
-
-//            switch (i)
-//            {
-//                case 0:
-//                    result = "Unknown";
-//                    break;
-//                case 1:
-//                    result = "Other";
-//                    break;
-//                case 2:
-//                    result = "SIP";
-//                    break;
-//                case 3:
-//                    result = "DIP";
-//                    break;
-//                case 4:
-//                    result = "ZIP";
-//                    break;
-//                case 5:
-//                    result = "SOJ";
-//                    break;
-//                case 6:
-//                    result = "Proprietary";
-//                    break;
-//                case 7:
-//                    result = "SIMM";
-//                    break;
-//                case 8:
-//                    result = "DIMM";
-//                    break;
-//                case 9:
-//                    result = "TSOP";
-//                    break;
-//                case 10:
-//                    result = "PGA";
-//                    break;
-//                case 11:
-//                    result = "RIMM";
-//                    break;
-//                case 12:
-//                    result = "SODIMM";
-//                    break;
-//                case 13:
-//                    result = "SRIMM";
-//                    break;
-//                case 14:
-//                    result = "SMD";
-//                    break;
-//                case 15:
-//                    result = "SSMP";
-//                    break;
-//                case 16:
-//                    result = "QFP";
-//                    break;
-//                case 17:
-//                    result = "TQFP";
-//                    break;
-//                case 18:
-//                    result = "SOIC";
-//                    break;
-//                case 19:
-//                    result = "LCC";
-//                    break;
-//                case 20:
-//                    result = "PLCC";
-//                    break;
-//                case 21:
-//                    result = "BGA";
-//                    break;
-//                case 22:
-//                    result = "FPBGA";
-//                    break;
-//                case 23:
-//                    result = "LGA";
-//                    break;
-//            }
-
-//            return result;
-//        }
-
-//        private static string SanitizeMemoryType(UInt16 i)
-//        {
-//            string result = string.Empty;
-
-//            switch (i)
-//            {
-//                case 0:
-//                    result = "Unknown";
-//                    break;
-//                case 1:
-//                    result = "Other";
-//                    break;
-//                case 2:
-//                    result = "DRAM";
-//                    break;
-//                case 3:
-//                    result = "Synchonous DRAM";
-//                    break;
-//                case 4:
-//                    result = "Cache DRAM";
-//                    break;
-//                case 5:
-//                    result = "EDO";
-//                    break;
-//                case 6:
-//                    result = "EDRAM";
-//                    break;
-//                case 7:
-//                    result = "VRAM";
-//                    break;
-//                case 8:
-//                    result = "SRAM";
-//                    break;
-//                case 9:
-//                    result = "RAM";
-//                    break;
-//                case 10:
-//                    result = "ROM";
-//                    break;
-//                case 11:
-//                    result = "Flash";
-//                    break;
-//                case 12:
-//                    result = "EEPROM";
-//                    break;
-//                case 13:
-//                    result = "FEPROM";
-//                    break;
-//                case 14:
-//                    result = "EPROM";
-//                    break;
-//                case 15:
-//                    result = "CDRAM";
-//                    break;
-//                case 16:
-//                    result = "3DRAM";
-//                    break;
-//                case 17:
-//                    result = "SDRAM";
-//                    break;
-//                case 18:
-//                    result = "SGRAM";
-//                    break;
-//                case 19:
-//                    result = "RDRAM";
-//                    break;
-//                case 20:
-//                    result = "DDR";
-//                    break;
-//                case 21:
-//                    result = "DDR2";
-//                    break;
-//                case 22:
-//                    result = "DDR2 FB-DIMM";
-//                    break;
-//                case 24:
-//                    result = "DDR3";
-//                    break;
-//                case 25:
-//                    result = "FBD2";
-//                    break;
-//            }
-
-//            return result;
-//        }
-//    }
-//}
+using Microsoft.Win32;
+using System;
+using System.Collections.Generic;
+using System.Management;
+
+namespace Optimizer
+{
+    public static class IndiciumHelper
+    {
+        public static List<Volume> Volumes = new List<Volume>();
+        public static List<Volume> Opticals = new List<Volume>();
+        public static List<Volume> Removables = new List<Volume>();
+
+        public static List<NetworkDevice> PhysicalAdapters = new List<NetworkDevice>();
+        public static List<NetworkDevice> VirtualAdapters = new List<NetworkDevice>();
+
+        public static List<Keyboard> Keyboards = new List<Keyboard>();
+        public static List<PointingDevice> PointingDevices = new List<PointingDevice>();
+
+        public static List<CPU> GetCPUs()
+        {
+            List<CPU> CPUs = new List<CPU>();
+            CPU cpu;
+
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Processor");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                cpu = new CPU();
+
+                cpu.Name = Convert.ToString(mo.Properties["Name"].Value);
+                cpu.L2CacheSize = ByteSize.FromKiloBytes(Convert.ToDouble(mo.Properties["L2CacheSize"].Value));
+                cpu.L3CacheSize = ByteSize.FromKiloBytes(Convert.ToDouble(mo.Properties["L3CacheSize"].Value));
+                cpu.Cores = Convert.ToUInt32(mo.Properties["NumberOfCores"].Value);
+                cpu.Threads = Convert.ToUInt32(mo.Properties["ThreadCount"].Value);
+                cpu.LogicalCpus = Convert.ToUInt32(mo.Properties["NumberOfLogicalProcessors"].Value);
+                bool temp = Convert.ToBoolean(mo.Properties["VirtualizationFirmwareEnabled"].Value);
+                cpu.Virtualization = (temp) ? "Yes" : "No";
+                cpu.Stepping = Convert.ToString(mo.Properties["Description"].Value);
+                cpu.Revision = Convert.ToString(mo.Properties["Revision"].Value);
+
+                try
+                {
+                    ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
+                    foreach (ManagementObject mo2 in searcher2.Get())
+                    {
+                        bool temp2 = Convert.ToBoolean(mo2.Properties["DataExecutionPrevention_Available"].Value);
+                        cpu.DataExecutionPrevention = (temp2) ? "Yes" : "No";
+                    }
+                }
+                catch { }
+
+                if (string.IsNullOrEmpty(cpu.Name)) cpu.Name = GetCPUNameAlternative();
+
+                CPUs.Add(cpu);
+            }
+
+            return CPUs;
+        }
+
+        private static string GetCPUNameAlternative()
+        {
+            using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"HARDWARE\DESCRIPTION\System\CentralProcessor\0", false))
+            {
+                return key.GetValue("ProcessorNameString").ToString();
+            }
+        }
+
+        public static VirtualMemory GetVM()
+        {
+            VirtualMemory vm = new VirtualMemory();
+
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                vm.TotalVirtualMemory = ByteSize.FromKiloBytes(Convert.ToUInt64(mo.Properties["TotalVirtualMemorySize"].Value));
+                vm.AvailableVirtualMemory = ByteSize.FromKiloBytes(Convert.ToUInt64(mo.Properties["FreeVirtualMemory"].Value));
+                vm.UsedVirtualMemory = vm.TotalVirtualMemory.Subtract(vm.AvailableVirtualMemory);
+            }
+
+            return vm;
+        }
+
+        public static List<RAM> GetRAM()
+        {
+            List<RAM> modules = new List<RAM>();
+            RAM module;
+
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMemory");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                module = new RAM();
+
+                module.BankLabel = Convert.ToString(mo.Properties["BankLabel"].Value);
+                module.Capacity = ByteSize.FromBytes(Convert.ToDouble(mo.Properties["Capacity"].Value));
+                module.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
+                module.Speed = Convert.ToUInt32(mo.Properties["Speed"].Value);
+                UInt16 memorytype = Convert.ToUInt16(mo.Properties["MemoryType"].Value);
+                UInt16 formfactor = Convert.ToUInt16(mo.Properties["FormFactor"].Value);
+                module.MemoryType = SanitizeMemoryType(memorytype);
+                module.FormFactor = SanitizeFormFactor(formfactor);
+
+                modules.Add(module);
+            }
+
+            return modules;
+        }
+
+        public static List<Motherboard> GetMotherboards()
+        {
+            List<Motherboard> mobos = new List<Motherboard>();
+
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_BaseBoard");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                Motherboard mobo = new Motherboard();
+
+                mobo.Model = Convert.ToString(mo.Properties["Model"].Value);
+                mobo.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
+                mobo.Product = Convert.ToString(mo.Properties["Product"].Value);
+                mobo.Version = Convert.ToString(mo.Properties["Version"].Value);
+
+                try
+                {
+                    ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_IDEController");
+                    foreach (ManagementObject mo2 in searcher2.Get())
+                    {
+                        mobo.Chipset = Convert.ToString(mo2.Properties["Description"].Value);
+                    }
+                }
+                catch { }
+
+                try
+                {
+                    ManagementObjectSearcher searcher3 = new ManagementObjectSearcher("SELECT * FROM Win32_IDEController");
+                    foreach (ManagementObject mo3 in searcher3.Get())
+                    {
+                        mobo.Revision = Convert.ToString(mo3.Properties["RevisionNumber"].Value);
+                    }
+                }
+                catch { }
+
+                try
+                {
+                    ManagementObjectSearcher searcher4 = new ManagementObjectSearcher("SELECT * FROM Win32_ComputerSystem");
+                    foreach (ManagementObject mo4 in searcher4.Get())
+                    {
+                        mobo.SystemModel = Convert.ToString(mo4.Properties["Model"].Value);
+                    }
+                }
+                catch { }
+
+                ManagementObjectSearcher searcher5 = new ManagementObjectSearcher("SELECT * FROM Win32_BIOS");
+                foreach (ManagementObject mo5 in searcher5.Get())
+                {
+                    mobo.BIOSName = Convert.ToString(mo5.Properties["Name"].Value);
+                    mobo.BIOSManufacturer = Convert.ToString(mo5.Properties["Manufacturer"].Value);
+                    mobo.BIOSVersion = Convert.ToString(mo5.Properties["Version"].Value);
+                    mobo.BIOSBuildNumber = Convert.ToString(mo5.Properties["BuildNumber"].Value);
+                    //ReleaseDate = DateTime.Parse(mo.Properties["ReleaseDate"].Value.ToString());
+                }
+
+                mobos.Add(mobo);
+            }
+
+            return mobos;
+        }
+
+        public static List<Disk> GetDisks()
+        {
+            List<Disk> disks = new List<Disk>();
+
+            ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_DiskDrive");
+            foreach (ManagementObject mo2 in searcher2.Get())
+            {
+                Disk disk = new Disk();
+
+                disk.Model = Convert.ToString(mo2.Properties["Model"].Value);
+                disk.BytesPerSector = Convert.ToUInt32(mo2.Properties["BytesPerSector"].Value);
+                disk.FirmwareRevision = Convert.ToString(mo2.Properties["FirmwareRevision"].Value);
+                disk.MediaType = Convert.ToString(mo2.Properties["MediaType"].Value);
+                disk.Capacity = ByteSize.FromBytes(Convert.ToDouble(mo2.Properties["Size"].Value));
+
+                disks.Add(disk);
+            }
+
+            return disks;
+        }
+
+        public static void GetVolumes()
+        {
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Volume");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                Volume volume = new Volume();
+
+                volume.BlockSize = Convert.ToUInt64(mo.Properties["BlockSize"].Value);
+                volume.Capacity = ByteSize.FromBytes(Convert.ToDouble(mo.Properties["Capacity"].Value));
+                bool temp = Convert.ToBoolean(mo.Properties["Compressed"].Value);
+                volume.Compressed = (temp) ? "Yes" : "No";
+                volume.DriveLetter = Convert.ToString(mo.Properties["DriveLetter"].Value);
+                UInt32 i = Convert.ToUInt32(mo.Properties["DriveType"].Value);
+                volume.DriveType = SanitizeDriveType(i);
+                volume.FileSystem = Convert.ToString(mo.Properties["FileSystem"].Value);
+                volume.FreeSpace = ByteSize.FromBytes(Convert.ToDouble(mo.Properties["FreeSpace"].Value));
+                volume.UsedSpace = volume.Capacity.Subtract(volume.FreeSpace);
+                bool temp2 = Convert.ToBoolean(mo.Properties["IndexingEnabled"].Value);
+                volume.Indexing = (temp2) ? "Yes" : "No";
+                volume.Label = Convert.ToString(mo.Properties["Label"].Value);
+
+                if (i == 2)
+                {
+                    Removables.Add(volume);
+                }
+                else if (i == 5)
+                {
+                    Opticals.Add(volume);
+                }
+                else
+                {
+                    Volumes.Add(volume);
+                }
+            }
+        }
+
+        public static void GetPeripherals()
+        {
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_Keyboard");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                Keyboard keyboard = new Keyboard();
+
+                keyboard.Name = Convert.ToString(mo.Properties["Description"].Value);
+                keyboard.Layout = Convert.ToString(mo.Properties["Layout"].Value);
+                keyboard.Status = Convert.ToString(mo.Properties["Status"].Value);
+                keyboard.FunctionKeys = Convert.ToUInt16(mo.Properties["NumberOfFunctionKeys"].Value);
+                bool temp = Convert.ToBoolean(mo.Properties["IsLocked"].Value);
+                keyboard.Locked = (temp) ? "Yes" : "No";
+
+                Keyboards.Add(keyboard);
+            }
+
+            ManagementObjectSearcher searcher2 = new ManagementObjectSearcher("SELECT * FROM Win32_PointingDevice");
+            foreach (ManagementObject mo2 in searcher2.Get())
+            {
+                PointingDevice pointingDevice = new PointingDevice();
+
+                pointingDevice.Name = Convert.ToString(mo2.Properties["Description"].Value);
+                pointingDevice.Manufacturer = Convert.ToString(mo2.Properties["Manufacturer"].Value);
+                pointingDevice.Status = Convert.ToString(mo2.Properties["Status"].Value);
+                pointingDevice.Buttons = Convert.ToUInt16(mo2.Properties["NumberOfButtons"].Value);
+                bool temp = Convert.ToBoolean(mo2.Properties["IsLocked"].Value);
+                pointingDevice.Locked = (temp) ? "Yes" : "No";
+                pointingDevice.HardwareType = Convert.ToString(mo2.Properties["HardwareType"].Value);
+                UInt16 i = Convert.ToUInt16(mo2.Properties["PointingType"].Value);
+                pointingDevice.PointingType = SanitizePointingType(i);
+                UInt16 i2 = Convert.ToUInt16(mo2.Properties["DeviceInterface"].Value);
+                pointingDevice.DeviceInterface = SanitizeDeviceInterface(i2);
+
+                PointingDevices.Add(pointingDevice);
+            }
+        }
+
+        public static List<GPU> GetGPUs()
+        {
+            List<GPU> GPUs = new List<GPU>();
+
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_VideoController");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                GPU gpu = new GPU();
+
+                gpu.Name = Convert.ToString(mo.Properties["Name"].Value);
+                gpu.Memory = ByteSize.FromBytes(Convert.ToDouble(mo.Properties["AdapterRAM"].Value));
+                gpu.ResolutionX = Convert.ToUInt32(mo.Properties["CurrentHorizontalResolution"].Value);
+                gpu.ResolutionY = Convert.ToUInt32(mo.Properties["CurrentVerticalResolution"].Value);
+                gpu.RefreshRate = Convert.ToUInt32(mo.Properties["CurrentRefreshRate"].Value);
+                gpu.DACType = Convert.ToString(mo.Properties["AdapterDACType"].Value);
+                UInt16 vtype = Convert.ToUInt16(mo.Properties["VideoMemoryType"].Value);
+                gpu.VideoMemoryType = SanitizeVideoMemoryType(vtype);
+
+                GPUs.Add(gpu);
+            }
+
+            return GPUs;
+        }
+
+        public static void GetNetworkAdapters()
+        {
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapter");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                NetworkDevice adapter = new NetworkDevice();
+
+                adapter.AdapterType = Convert.ToString(mo.Properties["AdapterType"].Value);
+                adapter.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
+                adapter.ProductName = Convert.ToString(mo.Properties["ProductName"].Value);
+                bool temp = Convert.ToBoolean(mo.Properties["PhysicalAdapter"].Value);
+                adapter.PhysicalAdapter = (temp) ? "Yes" : "No";
+                adapter.MacAddress = Convert.ToString(mo.Properties["MacAddress"].Value);
+                adapter.ServiceName = Convert.ToString(mo.Properties["ServiceName"].Value);
+
+                if (temp)
+                {
+                    PhysicalAdapters.Add(adapter);
+                }
+                else
+                {
+                    VirtualAdapters.Add(adapter);
+                }
+            }
+        }
+
+        public static List<AudioDevice> GetAudioDevices()
+        {
+            List<AudioDevice> audioDevices = new List<AudioDevice>();
+
+            ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_SoundDevice");
+            foreach (ManagementObject mo in searcher.Get())
+            {
+                AudioDevice device = new AudioDevice();
+
+                device.ProductName = Convert.ToString(mo.Properties["ProductName"].Value);
+                device.Manufacturer = Convert.ToString(mo.Properties["Manufacturer"].Value);
+                device.Status = Convert.ToString(mo.Properties["Status"].Value);
+
+                audioDevices.Add(device);
+            }
+
+            return audioDevices;
+        }
+
+        private static string SanitizeDriveType(UInt32 i)
+        {
+            string result = string.Empty;
+
+            switch (i)
+            {
+                case 0:
+                    result = "Unknown";
+                    break;
+                case 1:
+                    result = "No Root Directory";
+                    break;
+                case 2:
+                    result = "Removable Disk";
+                    break;
+                case 3:
+                    result = "Local Disk";
+                    break;
+                case 4:
+                    result = "Network Drive";
+                    break;
+                case 5:
+                    result = "Compact Disk";
+                    break;
+                case 6:
+                    result = "RAM Disk";
+                    break;
+            }
+
+            return result;
+        }
+
+        private static string SanitizeVideoMemoryType(UInt16 i)
+        {
+            string result = string.Empty;
+
+            switch (i)
+            {
+                case 1:
+                    result = "Other";
+                    break;
+                case 2:
+                    result = "Unknown";
+                    break;
+                case 3:
+                    result = "VRAM";
+                    break;
+                case 4:
+                    result = "DRAM";
+                    break;
+                case 5:
+                    result = "SRAM";
+                    break;
+                case 6:
+                    result = "WRAM";
+                    break;
+                case 7:
+                    result = "EDO RAM";
+                    break;
+                case 8:
+                    result = "Burst Synchronous DRAM";
+                    break;
+                case 9:
+                    result = "Pipelined Burst SRAM";
+                    break;
+                case 10:
+                    result = "CDRAM";
+                    break;
+                case 11:
+                    result = "3DRAM";
+                    break;
+                case 12:
+                    result = "SDRAM";
+                    break;
+                case 13:
+                    result = "SGRAM";
+                    break;
+            }
+
+            return result;
+        }
+
+        private static string SanitizeFormFactor(UInt16 i)
+        {
+            string result = string.Empty;
+
+            switch (i)
+            {
+                case 0:
+                    result = "Unknown";
+                    break;
+                case 1:
+                    result = "Other";
+                    break;
+                case 2:
+                    result = "SIP";
+                    break;
+                case 3:
+                    result = "DIP";
+                    break;
+                case 4:
+                    result = "ZIP";
+                    break;
+                case 5:
+                    result = "SOJ";
+                    break;
+                case 6:
+                    result = "Proprietary";
+                    break;
+                case 7:
+                    result = "SIMM";
+                    break;
+                case 8:
+                    result = "DIMM";
+                    break;
+                case 9:
+                    result = "TSOP";
+                    break;
+                case 10:
+                    result = "PGA";
+                    break;
+                case 11:
+                    result = "RIMM";
+                    break;
+                case 12:
+                    result = "SODIMM";
+                    break;
+                case 13:
+                    result = "SRIMM";
+                    break;
+                case 14:
+                    result = "SMD";
+                    break;
+                case 15:
+                    result = "SSMP";
+                    break;
+                case 16:
+                    result = "QFP";
+                    break;
+                case 17:
+                    result = "TQFP";
+                    break;
+                case 18:
+                    result = "SOIC";
+                    break;
+                case 19:
+                    result = "LCC";
+                    break;
+                case 20:
+                    result = "PLCC";
+                    break;
+                case 21:
+                    result = "BGA";
+                    break;
+                case 22:
+                    result = "FPBGA";
+                    break;
+                case 23:
+                    result = "LGA";
+                    break;
+            }
+
+            return result;
+        }
+
+        private static string SanitizeMemoryType(UInt16 i)
+        {
+            string result = string.Empty;
+
+            switch (i)
+            {
+                case 0:
+                    result = "Unknown";
+                    break;
+                case 1:
+                    result = "Other";
+                    break;
+                case 2:
+                    result = "DRAM";
+                    break;
+                case 3:
+                    result = "Synchonous DRAM";
+                    break;
+                case 4:
+                    result = "Cache DRAM";
+                    break;
+                case 5:
+                    result = "EDO";
+                    break;
+                case 6:
+                    result = "EDRAM";
+                    break;
+                case 7:
+                    result = "VRAM";
+                    break;
+                case 8:
+                    result = "SRAM";
+                    break;
+                case 9:
+                    result = "RAM";
+                    break;
+                case 10:
+                    result = "ROM";
+                    break;
+                case 11:
+                    result = "Flash";
+                    break;
+                case 12:
+                    result = "EEPROM";
+                    break;
+                case 13:
+                    result = "FEPROM";
+                    break;
+                case 14:
+                    result = "EPROM";
+                    break;
+                case 15:
+                    result = "CDRAM";
+                    break;
+                case 16:
+                    result = "3DRAM";
+                    break;
+                case 17:
+                    result = "SDRAM";
+                    break;
+                case 18:
+                    result = "SGRAM";
+                    break;
+                case 19:
+                    result = "RDRAM";
+                    break;
+                case 20:
+                    result = "DDR";
+                    break;
+                case 21:
+                    result = "DDR2";
+                    break;
+                case 22:
+                    result = "DDR2 FB-DIMM";
+                    break;
+                case 24:
+                    result = "DDR3";
+                    break;
+                case 25:
+                    result = "FBD2";
+                    break;
+            }
+
+            return result;
+        }
+
+        private static string SanitizeDeviceInterface(UInt16 i)
+        {
+            string result = string.Empty;
+
+            switch (i)
+            {
+                case 1:
+                    result = "Other";
+                    break;
+                case 2:
+                    result = "Unknown";
+                    break;
+                case 3:
+                    result = "Serial";
+                    break;
+                case 4:
+                    result = "PS/2";
+                    break;
+                case 5:
+                    result = "Infrared";
+                    break;
+                case 6:
+                    result = "HP-HIL";
+                    break;
+                case 7:
+                    result = "Bus mouse";
+                    break;
+                case 8:
+                    result = "ADB (Apple Desktop Bus)";
+                    break;
+                case 160:
+                    result = "Bus mouse DB-9";
+                    break;
+                case 161:
+                    result = "Bus mouse micro-DIN";
+                    break;
+                case 162:
+                    result = "USB";
+                    break;
+            }
+
+            return result;
+        }
+
+        private static string SanitizePointingType(UInt16 i)
+        {
+            string result = string.Empty;
+
+            switch (i)
+            {
+                case 1:
+                    result = "Other";
+                    break;
+                case 2:
+                    result = "Unknown";
+                    break;
+                case 3:
+                    result = "Mouse";
+                    break;
+                case 4:
+                    result = "Track Ball";
+                    break;
+                case 5:
+                    result = "Track Point";
+                    break;
+                case 6:
+                    result = "Glide Point";
+                    break;
+                case 7:
+                    result = "Touch Pad";
+                    break;
+                case 8:
+                    result = "Touch Screen";
+                    break;
+                case 9:
+                    result = "Mouse - Optical Sensor";
+                    break;
+            }
+
+            return result;
+        }
+    }
+}

+ 78 - 78
Optimizer/NetworkAdapter.cs

@@ -1,78 +1,78 @@
-//using System.Diagnostics;
-
-//namespace Optimizer
-//{
-//    public class NetworkAdapter
-//    {
-//        long _downloadSpeed, _uploadSpeed;
-//        long _downloadValue, _uploadValue;
-//        long _downloadValueOld, _uploadValueOld;
-
-//        string _name;
-
-//        internal PerformanceCounter DownloadCounter, UploadCounter;
-
-//        internal NetworkAdapter(string name)
-//        {
-//            _name = name;
-//        }
-
-//        internal void Initialize()
-//        {
-//            _downloadValueOld = DownloadCounter.NextSample().RawValue;
-//            _uploadValueOld = UploadCounter.NextSample().RawValue;
-//        }
-
-//        internal void Refresh()
-//        {
-//            _downloadValue = DownloadCounter.NextSample().RawValue;
-//            _uploadValue = UploadCounter.NextSample().RawValue;
-
-//            _downloadSpeed = _downloadValue - _downloadValueOld;
-//            _uploadSpeed = _uploadValue - _uploadValueOld;
-
-//            _downloadValueOld = _downloadValue;
-//            _uploadValueOld = _uploadValue;
-//        }
-
-//        public override string ToString()
-//        {
-//            return _name;
-//        }
-
-//        public string Name
-//        {
-//            get { return _name; }
-//        }
-
-//        public long DownloadSpeed
-//        {
-//            get { return _downloadSpeed; }
-//        }
-
-//        public long UploadSpeed
-//        {
-//            get { return _uploadSpeed; }
-//        }
-
-//        public double DownloadSpeedKbps
-//        {
-//            get { return this._downloadSpeed / 1024.0; }
-//        }
-
-//        public double UploadSpeedKbps
-//        {
-//            get { return this._uploadSpeed / 1024.0; }
-//        }
-
-//        public double DownloadSpeedMbps
-//        {
-//            get { return this._downloadSpeed / 1024.0 / 1024.0; }
-//        }
-
-//        public double UploadSpeedMbps
-//        {
-//            get { return this._uploadSpeed / 1024.0 / 1024.0; }
-//        }
-//    }
-//}
+using System.Diagnostics;
+
+namespace Optimizer
+{
+    public class NetworkAdapter
+    {
+        long _downloadSpeed, _uploadSpeed;
+        long _downloadValue, _uploadValue;
+        long _downloadValueOld, _uploadValueOld;
+
+        string _name;
+
+        internal PerformanceCounter DownloadCounter, UploadCounter;
+
+        internal NetworkAdapter(string name)
+        {
+            _name = name;
+        }
+
+        internal void Initialize()
+        {
+            _downloadValueOld = DownloadCounter.NextSample().RawValue;
+            _uploadValueOld = UploadCounter.NextSample().RawValue;
+        }
+
+        internal void Refresh()
+        {
+            _downloadValue = DownloadCounter.NextSample().RawValue;
+            _uploadValue = UploadCounter.NextSample().RawValue;
+
+            _downloadSpeed = _downloadValue - _downloadValueOld;
+            _uploadSpeed = _uploadValue - _uploadValueOld;
+
+            _downloadValueOld = _downloadValue;
+            _uploadValueOld = _uploadValue;
+        }
+
+        public override string ToString()
+        {
+            return _name;
+        }
+
+        public string Name
+        {
+            get { return _name; }
+        }
+
+        public long DownloadSpeed
+        {
+            get { return _downloadSpeed; }
+        }
+
+        public long UploadSpeed
+        {
+            get { return _uploadSpeed; }
+        }
+
+        public double DownloadSpeedKbps
+        {
+            get { return this._downloadSpeed / 1024.0; }
+        }
+
+        public double UploadSpeedKbps
+        {
+            get { return this._uploadSpeed / 1024.0; }
+        }
+
+        public double DownloadSpeedMbps
+        {
+            get { return this._downloadSpeed / 1024.0 / 1024.0; }
+        }
+
+        public double UploadSpeedMbps
+        {
+            get { return this._uploadSpeed / 1024.0 / 1024.0; }
+        }
+    }
+}

+ 85 - 85
Optimizer/NetworkMonitor.cs

@@ -1,100 +1,100 @@
-//using System.Collections;
-//using System.Diagnostics;
-//using System.Timers;
+using System.Collections;
+using System.Diagnostics;
+using System.Timers;
 
-//namespace Optimizer
-//{
-//    public class NetworkMonitor
-//    {
-//        Timer _timer;
-//        ArrayList _adapters;
-//        ArrayList _monitoredAdapters;
+namespace Optimizer
+{
+    public class NetworkMonitor
+    {
+        Timer _timer;
+        ArrayList _adapters;
+        ArrayList _monitoredAdapters;
 
-//        public NetworkMonitor()
-//        {
-//            _adapters = new ArrayList();
-//            _monitoredAdapters = new ArrayList();
-//            EnumerateNetworkAdapters();
+        public NetworkMonitor()
+        {
+            _adapters = new ArrayList();
+            _monitoredAdapters = new ArrayList();
+            EnumerateNetworkAdapters();
 
-//            _timer = new Timer(1000);
-//            _timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
-//        }
+            _timer = new Timer(1000);
+            _timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
+        }
 
-//        private void EnumerateNetworkAdapters()
-//        {
-//            PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");
+        private void EnumerateNetworkAdapters()
+        {
+            PerformanceCounterCategory category = new PerformanceCounterCategory("Network Interface");
 
-//            foreach (string name in category.GetInstanceNames())
-//            {
-//                if (name == "MS TCP Loopback interface") continue;
-//                if (name.ToLowerInvariant().Contains("virtual")) continue;
-//                if (name.ToLowerInvariant().Contains("hyper-v")) continue;
+            foreach (string name in category.GetInstanceNames())
+            {
+                if (name == "MS TCP Loopback interface") continue;
+                if (name.ToLowerInvariant().Contains("virtual")) continue;
+                if (name.ToLowerInvariant().Contains("hyper-v")) continue;
 
-//                NetworkAdapter adapter = new NetworkAdapter(name);
-//                adapter.DownloadCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", name);
-//                adapter.UploadCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", name);
-//                _adapters.Add(adapter);
-//            }
-//        }
+                NetworkAdapter adapter = new NetworkAdapter(name);
+                adapter.DownloadCounter = new PerformanceCounter("Network Interface", "Bytes Received/sec", name);
+                adapter.UploadCounter = new PerformanceCounter("Network Interface", "Bytes Sent/sec", name);
+                _adapters.Add(adapter);
+            }
+        }
 
-//        private void timer_Elapsed(object sender, ElapsedEventArgs e)
-//        {
-//            foreach (NetworkAdapter adapter in this._monitoredAdapters)
-//            {
-//                adapter.Refresh();
-//            }
-//        }
+        private void timer_Elapsed(object sender, ElapsedEventArgs e)
+        {
+            foreach (NetworkAdapter adapter in this._monitoredAdapters)
+            {
+                adapter.Refresh();
+            }
+        }
 
-//        public NetworkAdapter[] Adapters
-//        {
-//            get { return (NetworkAdapter[])_adapters.ToArray(typeof(NetworkAdapter)); }
-//        }
+        public NetworkAdapter[] Adapters
+        {
+            get { return (NetworkAdapter[])_adapters.ToArray(typeof(NetworkAdapter)); }
+        }
 
-//        public void StartMonitoring()
-//        {
-//            if (_adapters.Count > 0)
-//            {
-//                foreach (NetworkAdapter adapter in _adapters)
-//                {
-//                    if (!_monitoredAdapters.Contains(adapter))
-//                    {
-//                        _monitoredAdapters.Add(adapter);
-//                        adapter.Initialize();
-//                    }
-//                }
+        public void StartMonitoring()
+        {
+            if (_adapters.Count > 0)
+            {
+                foreach (NetworkAdapter adapter in _adapters)
+                {
+                    if (!_monitoredAdapters.Contains(adapter))
+                    {
+                        _monitoredAdapters.Add(adapter);
+                        adapter.Initialize();
+                    }
+                }
 
-//                _timer.Enabled = true;
-//            }
-//        }
+                _timer.Enabled = true;
+            }
+        }
 
-//        public void StartMonitoring(NetworkAdapter adapter)
-//        {
-//            if (!_monitoredAdapters.Contains(adapter))
-//            {
-//                _monitoredAdapters.Add(adapter);
-//                adapter.Initialize();
-//            }
+        public void StartMonitoring(NetworkAdapter adapter)
+        {
+            if (!_monitoredAdapters.Contains(adapter))
+            {
+                _monitoredAdapters.Add(adapter);
+                adapter.Initialize();
+            }
 
-//            _timer.Enabled = true;
-//        }
+            _timer.Enabled = true;
+        }
 
-//        public void StopMonitoring()
-//        {
-//            _monitoredAdapters.Clear();
-//            _timer.Enabled = false;
-//        }
+        public void StopMonitoring()
+        {
+            _monitoredAdapters.Clear();
+            _timer.Enabled = false;
+        }
 
-//        public void StopMonitoring(NetworkAdapter adapter)
-//        {
-//            if (_monitoredAdapters.Contains(adapter))
-//            {
-//                _monitoredAdapters.Remove(adapter);
-//            }
+        public void StopMonitoring(NetworkAdapter adapter)
+        {
+            if (_monitoredAdapters.Contains(adapter))
+            {
+                _monitoredAdapters.Remove(adapter);
+            }
 
-//            if (_monitoredAdapters.Count == 0)
-//            {
-//                _timer.Enabled = false;
-//            }
-//        }
-//    }
-//}
+            if (_monitoredAdapters.Count == 0)
+            {
+                _timer.Enabled = false;
+            }
+        }
+    }
+}

+ 2 - 3
Optimizer/Optimize.cs

@@ -1,5 +1,4 @@
-using Microsoft.VisualBasic.FileIO;
-using Microsoft.Win32;
+using Microsoft.Win32;
 using System;
 using System.Diagnostics;
 using System.IO;
@@ -980,7 +979,7 @@ namespace Optimizer
 
             Utilities.TryDeleteRegistryValue(true, @"SOFTWARE\Policies\Microsoft\InputPersonalization", "AllowInputPersonalization");
             Utilities.TryDeleteRegistryValue(true, @"SOFTWARE\Policies\Microsoft\Edge", "PersonalizationReportingEnabled");
-            
+
 
             Utilities.TryDeleteRegistryValue(true, @"SOFTWARE\Policies\Microsoft\Windows\System", "AllowCrossDeviceClipboard");
             Utilities.TryDeleteRegistryValue(true, @"Software\Policies\Microsoft\Windows\Messaging", "AllowMessageSync");

+ 3 - 0
Optimizer/Optimizer.csproj

@@ -98,6 +98,9 @@
     <Compile Include="Controls\MoonToggle.cs">
       <SubType>Component</SubType>
     </Compile>
+    <Compile Include="Controls\MoonTree.cs">
+      <SubType>Component</SubType>
+    </Compile>
     <Compile Include="Controls\ToggleCard.cs">
       <SubType>UserControl</SubType>
     </Compile>

+ 2 - 23
Optimizer/Options.cs

@@ -76,7 +76,7 @@ namespace Optimizer
     {
         internal static Color ForegroundColor = Color.MediumOrchid;
         internal static Color ForegroundAccentColor = Color.DarkOrchid;
-        internal static Color BackgroundColor = Color.FromArgb(10,10,10);
+        internal static Color BackgroundColor = Color.FromArgb(10, 10, 10);
         internal static Color BackAccentColor = Color.FromArgb(40, 40, 40);
 
         readonly static string _themeFlag = "themeable";
@@ -139,19 +139,6 @@ namespace Optimizer
                     c.FlatAppearance.MouseOverBackColor = c2;
                 }
 
-                if (x is ToggleCard)
-                {
-                    c.Toggle.Invalidate();
-                }
-
-                if (x is Label)
-                {
-                    if ((string)c.Tag == _themeFlag)
-                    {
-                        c.ForeColor = c1;
-                    }
-                }
-
                 if (x is LinkLabel)
                 {
                     if ((string)c.Tag == _themeFlag)
@@ -162,15 +149,7 @@ namespace Optimizer
                     }
                 }
 
-                if (x is CheckBox)
-                {
-                    if ((string)c.Tag == _themeFlag)
-                    {
-                        c.ForeColor = c1;
-                    }
-                }
-
-                if (x is RadioButton)
+                if (x is CheckBox || x is RadioButton || x is Label)
                 {
                     if ((string)c.Tag == _themeFlag)
                     {

+ 2 - 2
Optimizer/Program.cs

@@ -136,7 +136,7 @@ namespace Optimizer
 
                                     StartSplashForm();
 
-                                    _MainForm = new MainForm();
+                                    _MainForm = new MainForm(_SplashForm);
                                     _MainForm.Load += MainForm_Load;
                                     Application.Run(_MainForm);
 
@@ -235,7 +235,7 @@ namespace Optimizer
                             {
                                 StartSplashForm();
 
-                                _MainForm = new MainForm();
+                                _MainForm = new MainForm(_SplashForm);
                                 _MainForm.Load += MainForm_Load;
 
                                 Application.Run(_MainForm);

+ 27 - 1
Optimizer/Resources/EL.json

@@ -29,7 +29,7 @@
 	"appsTab": "Εφαρμογές",
 	"cleanerTab": "Εκκαθάριση",
 	"pingerTab": "Δίκτυο",
-	"registryFixerTab": "Registry",
+	"registryFixerTab": "Μητρώο",
 	"integratorTab": "Integrator",
 	"optionsTab": "Επιλογές",
 	"oldMixerSw": "Επαναφορά Κλασσικού Μείκτη Ήχου",
@@ -279,6 +279,32 @@
 	"trayRestartExplorer": "Επανεκκίνηση Explorer",
 	"trayExit": "Έξοδος",
 	"tipWhatsThis": "Τι είναι αυτό;",
+	"hwDetailed": "Λεπτομερής Προβολή",
+	"btnCopyHW": "Αντιγραφή",
+	"btnSaveHW": "Αποθήκευση",
+	"indiciumTab": "Yλικολογισμικό",
+	"toolHWCopy": "Αντιγραφή",
+	"toolHWGoogle": "Αναζήτηση με Google",
+	"toolHWDuck": "Αναζήτηση με DuckDuckGo",
+	"trayHW": "Yλικολογισμικό",
+	"os": "Λειτουργικό Σύστημα",
+	"cpu": "Επεξεργαστές",
+	"ram": "Μνήμη",
+	"gpu": "Γραφικά",
+	"mobo": "Μητρικές Κάρτες",
+	"disk": "Αποθηκευτικός Χώρος",
+	"inet": "Συσκευές Δικτύου",
+	"audio": "Ήχος",
+	"dev": "Περιφερειακά",
+	"vm": "Εικονική Μνήμη",
+	"drives": "Σκληροί Δίσκοι",
+	"volumes": "Τόμοι",
+	"opticals": "Οπτικοί Δίσκοι",
+	"removables": "Αφαιρούμενοι Δίσκοι",
+	"physicalAdapters": "Φυσικές Συσκευές Δικτύου",
+	"virtualAdapters": "Εικονικές Συσκευές Δικτύου",
+	"keyboards": "Πληκτρολόγια",
+	"pointings": "Ποντίκια",
 	"performanceTip": "Συλλογή εσωτερικών ρυθμίσεων των Windows για βελτιστοποίηση της απόδοσης.
 Πλήρως ασφαλής για εφαρμογή.
 

+ 26 - 0
Optimizer/Resources/EN.json

@@ -279,6 +279,32 @@
 	"trayRestartExplorer": "Restart Explorer",
 	"trayExit": "Exit",
 	"tipWhatsThis": "What's this?",
+	"hwDetailed": "Detailed View",
+	"btnCopyHW": "Copy",
+	"btnSaveHW": "Save",
+	"indiciumTab": "Hardware",
+	"toolHWCopy": "Copy",
+	"toolHWGoogle": "Search with Google",
+	"toolHWDuck": "Search with DuckDuckGo",
+	"trayHW": "Hardware Information",
+	"os": "Operating System",
+	"cpu": "Processors",
+	"ram": "Memory",
+	"gpu": "Graphics",
+	"mobo": "Motherboards",
+	"disk": "Storage",
+	"inet": "Network Adapters",
+	"audio": "Audio",
+	"dev": "Peripherals",
+	"vm": "Virtual Memory",
+	"drives": "Disk Drives",
+	"volumes": "Partitions",
+	"opticals": "Optical Drives",
+	"removables": "Removable Drives",
+	"physicalAdapters": "Physical Adapters",
+	"virtualAdapters": "Virtual Adapters",
+	"keyboards": "Keyboards",
+	"pointings": "Pointing Devices",
 	"performanceTip": "Collection of internal Windows settings to optimize performance.
 Completely safe to apply.
 

+ 10 - 0
Optimizer/Utilities.cs

@@ -884,5 +884,15 @@ namespace Optimizer
 
             return "4.0";
         }
+
+        internal static void SearchWith(string term, bool ddg)
+        {
+            try
+            {
+                if (ddg) Process.Start(string.Format("https://duckduckgo.com/?q={0}", term));
+                if (!ddg) Process.Start(string.Format("https://www.google.com/search?q={0}", term));
+            }
+            catch { }
+        }
     }
 }