From dc7ee1b321579b63e1feba0aa2481abbbd6abeac Mon Sep 17 00:00:00 2001 From: BlubbFish Date: Wed, 20 Jan 2016 17:21:55 +0000 Subject: [PATCH] Init of TimeKeeper --- TimeKeeper.sln | 26 ++++ TimeKeeper/Controller/CTray.cs | 47 ++++++++ TimeKeeper/Controller/CWindow.cs | 25 ++++ TimeKeeper/Models/MTray.cs | 16 +++ TimeKeeper/Models/MWindow.cs | 19 +++ TimeKeeper/Program.cs | 20 +++ TimeKeeper/Properties/AssemblyInfo.cs | 38 ++++++ TimeKeeper/Properties/Resources.Designer.cs | 83 +++++++++++++ TimeKeeper/Properties/Resources.resx | 127 ++++++++++++++++++++ TimeKeeper/Resources/Icons/door_open.png | Bin 0 -> 508 bytes TimeKeeper/Resources/Icons/main.ico | Bin 0 -> 9662 bytes TimeKeeper/TimeKeeper.csproj | 98 +++++++++++++++ TimeKeeper/View/VTray.cs | 69 +++++++++++ TimeKeeper/View/VWindow.cs | 35 ++++++ TimeKeeper/View/ViewWindowForm.Designer.cs | 33 +++++ TimeKeeper/View/ViewWindowForm.cs | 31 +++++ TimeKeeper/bin/Release/TimeKeeper.exe | Bin 0 -> 31232 bytes TimeKeeper/bin/Release/Utils.dll | Bin 0 -> 15872 bytes 18 files changed, 667 insertions(+) create mode 100644 TimeKeeper.sln create mode 100644 TimeKeeper/Controller/CTray.cs create mode 100644 TimeKeeper/Controller/CWindow.cs create mode 100644 TimeKeeper/Models/MTray.cs create mode 100644 TimeKeeper/Models/MWindow.cs create mode 100644 TimeKeeper/Program.cs create mode 100644 TimeKeeper/Properties/AssemblyInfo.cs create mode 100644 TimeKeeper/Properties/Resources.Designer.cs create mode 100644 TimeKeeper/Properties/Resources.resx create mode 100644 TimeKeeper/Resources/Icons/door_open.png create mode 100644 TimeKeeper/Resources/Icons/main.ico create mode 100644 TimeKeeper/TimeKeeper.csproj create mode 100644 TimeKeeper/View/VTray.cs create mode 100644 TimeKeeper/View/VWindow.cs create mode 100644 TimeKeeper/View/ViewWindowForm.Designer.cs create mode 100644 TimeKeeper/View/ViewWindowForm.cs create mode 100644 TimeKeeper/bin/Release/TimeKeeper.exe create mode 100644 TimeKeeper/bin/Release/Utils.dll diff --git a/TimeKeeper.sln b/TimeKeeper.sln new file mode 100644 index 0000000..0c45a0d --- /dev/null +++ b/TimeKeeper.sln @@ -0,0 +1,26 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2012 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TimeKeeper", "TimeKeeper\TimeKeeper.csproj", "{25F58397-71CB-4298-979E-BAACE80C61CB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utils", "..\Utils\Utils\Utils.csproj", "{FAC8CE64-BF13-4ECE-8097-AEB5DD060098}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {25F58397-71CB-4298-979E-BAACE80C61CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25F58397-71CB-4298-979E-BAACE80C61CB}.Release|Any CPU.Build.0 = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FAC8CE64-BF13-4ECE-8097-AEB5DD060098}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/TimeKeeper/Controller/CTray.cs b/TimeKeeper/Controller/CTray.cs new file mode 100644 index 0000000..3610f85 --- /dev/null +++ b/TimeKeeper/Controller/CTray.cs @@ -0,0 +1,47 @@ +using BlubbFish.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TimeKeeper.Controller { + class Tray : OwnController { + private static View.Tray tray; + private static Controller.Window window; + + override protected void init() { + tray = new View.Tray(); + window = new Controller.Window(); + } + + /// + /// User klickt Doppelt auf das TrayIcon + /// + /// + /// + internal static void Click_Tray(object sender, EventArgs e) { + Click_Open(sender, e); + } + + /// + /// User klickt auf den Eintrag Öffnen + /// + /// + /// + internal static void Click_Open(object sender, EventArgs e) { + window.execute(); + } + + /// + /// User klickt auf den Eintrag Beenden + /// + /// + /// + internal static void Click_Quit(object sender, EventArgs e) { + tray.Dispose(); + Application.Exit(); + } + } +} diff --git a/TimeKeeper/Controller/CWindow.cs b/TimeKeeper/Controller/CWindow.cs new file mode 100644 index 0000000..07b488e --- /dev/null +++ b/TimeKeeper/Controller/CWindow.cs @@ -0,0 +1,25 @@ +using BlubbFish.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TimeKeeper.Controller { + class Window : OwnController { + private static View.Window window; + + public Window() { + + } + + override protected void init() { + window = new View.Window(); + } + + public static void FormClosed(object sender, FormClosedEventArgs e) { + window.Dispose(); + } + } +} diff --git a/TimeKeeper/Models/MTray.cs b/TimeKeeper/Models/MTray.cs new file mode 100644 index 0000000..2af7116 --- /dev/null +++ b/TimeKeeper/Models/MTray.cs @@ -0,0 +1,16 @@ +using BlubbFish.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TimeKeeper.Models { + class Tray : OwnModel { + private Tray() { + this.init(); + } + override protected void init() { + } + } +} diff --git a/TimeKeeper/Models/MWindow.cs b/TimeKeeper/Models/MWindow.cs new file mode 100644 index 0000000..46a463f --- /dev/null +++ b/TimeKeeper/Models/MWindow.cs @@ -0,0 +1,19 @@ +using BlubbFish.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TimeKeeper.Models { + class Window : OwnModel { + + private Window() { + this.init(); + } + + override protected void init() { + + } + } +} diff --git a/TimeKeeper/Program.cs b/TimeKeeper/Program.cs new file mode 100644 index 0000000..953e0e5 --- /dev/null +++ b/TimeKeeper/Program.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TimeKeeper { + class Program { + static void Main(string[] args) { + try { + Controller.Tray t = new Controller.Tray(); + t.execute(); + Application.Run(); + } catch(Exception e) { + MessageBox.Show("Fehler: " + e.Message + "\nStack: " + e.StackTrace, "Exception: " + e.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/TimeKeeper/Properties/AssemblyInfo.cs b/TimeKeeper/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..9f8cf30 --- /dev/null +++ b/TimeKeeper/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Resources; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("TimeKeeper")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("TimeKeeper")] +[assembly: AssemblyCopyright("Copyright BlubbFish © 2016")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("7df6ab3d-639f-4549-a770-10ba3540a26b")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: NeutralResourcesLanguageAttribute("de-DE")] diff --git a/TimeKeeper/Properties/Resources.Designer.cs b/TimeKeeper/Properties/Resources.Designer.cs new file mode 100644 index 0000000..89df8a1 --- /dev/null +++ b/TimeKeeper/Properties/Resources.Designer.cs @@ -0,0 +1,83 @@ +//------------------------------------------------------------------------------ +// +// Dieser Code wurde von einem Tool generiert. +// Laufzeitversion:4.0.30319.34209 +// +// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn +// der Code erneut generiert wird. +// +//------------------------------------------------------------------------------ + +namespace TimeKeeper.Properties { + using System; + + + /// + /// Eine stark typisierte Ressourcenklasse zum Suchen von lokalisierten Zeichenfolgen usw. + /// + // Diese Klasse wurde von der StronglyTypedResourceBuilder automatisch generiert + // -Klasse über ein Tool wie ResGen oder Visual Studio automatisch generiert. + // Um einen Member hinzuzufügen oder zu entfernen, bearbeiten Sie die .ResX-Datei und führen dann ResGen + // mit der /str-Option erneut aus, oder Sie erstellen Ihr VS-Projekt neu. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Gibt die zwischengespeicherte ResourceManager-Instanz zurück, die von dieser Klasse verwendet wird. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("TimeKeeper.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Überschreibt die CurrentUICulture-Eigenschaft des aktuellen Threads für alle + /// Ressourcenzuordnungen, die diese stark typisierte Ressourcenklasse verwenden. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Icon ähnlich wie (Symbol). + /// + internal static System.Drawing.Icon IconMain { + get { + object obj = ResourceManager.GetObject("IconMain", resourceCulture); + return ((System.Drawing.Icon)(obj)); + } + } + + /// + /// Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap MenuImagesQuit { + get { + object obj = ResourceManager.GetObject("MenuImagesQuit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/TimeKeeper/Properties/Resources.resx b/TimeKeeper/Properties/Resources.resx new file mode 100644 index 0000000..a567d56 --- /dev/null +++ b/TimeKeeper/Properties/Resources.resx @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Resources\Icons\main.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\Icons\door_open.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/TimeKeeper/Resources/Icons/door_open.png b/TimeKeeper/Resources/Icons/door_open.png new file mode 100644 index 0000000000000000000000000000000000000000..64bab57ddd0e95ad9a73a3828ec29b5d0b4dd675 GIT binary patch literal 508 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 GpZT9kMO|kA literal 0 HcmV?d00001 diff --git a/TimeKeeper/TimeKeeper.csproj b/TimeKeeper/TimeKeeper.csproj new file mode 100644 index 0000000..e2cd890 --- /dev/null +++ b/TimeKeeper/TimeKeeper.csproj @@ -0,0 +1,98 @@ + + + + + Debug + AnyCPU + {25F58397-71CB-4298-979E-BAACE80C61CB} + WinExe + Properties + TimeKeeper + TimeKeeper + v4.5 + 512 + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + TimeKeeper.Program + + + Resources\Icons\main.ico + + + + + + + + + + + + + + + + + + + + + True + True + Resources.resx + + + Form + + + ViewWindowForm.cs + + + + + + + {fac8ce64-bf13-4ece-8097-aeb5dd060098} + Utils + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + \ No newline at end of file diff --git a/TimeKeeper/View/VTray.cs b/TimeKeeper/View/VTray.cs new file mode 100644 index 0000000..d26c7cc --- /dev/null +++ b/TimeKeeper/View/VTray.cs @@ -0,0 +1,69 @@ +using BlubbFish.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using TimeKeeper.Properties; +using System.Drawing; + +namespace TimeKeeper.View { + class Tray : OwnView { + public Models.Tray Model { get; private set; } + private NotifyIcon trayi; + + + public Tray() { + this.init(); + this.Model = Models.Tray.Instance; + this.Model.setObserver(this); + } + + public override void update() { + this.trayi.ContextMenuStrip = this.genMenu(); + } + + override protected void init() { + this.trayi = new NotifyIcon(); + this.trayi.Visible = true; + this.trayi.Icon = new Icon(Resources.IconMain, 40, 40); + this.trayi.Text = "TimeKeeper"; + this.trayi.DoubleClick += Controller.Tray.Click_Tray; + } + + override public void Dispose() { + this.trayi.Visible = false; + Application.ExitThread(); + } + + private ContextMenuStrip genMenu() { + ContextMenuStrip menu = new ContextMenuStrip(); + ToolStripMenuItem mo = new ToolStripMenuItem("Öffnen"); + mo.Image = Resources.MenuImagesQuit; + mo.Click += Controller.Tray.Click_Open; + mo.Name = "Open"; + menu.Items.Add(mo); + + menu.Items.Add(new ToolStripSeparator()); + + ToolStripMenuItem mq = new ToolStripMenuItem("Beenden"); + mq.Image = Resources.MenuImagesQuit; + mq.Click += Controller.Tray.Click_Quit; + mq.Name = "Quit"; + menu.Items.Add(mq); + return menu; + } + + private void showBallonTooltip(string text, ToolTipIcon toolTipIcon, string title = "TimeKeeper Tray") { + this.trayi.BalloonTipIcon = toolTipIcon; + this.trayi.BalloonTipText = text; + this.trayi.BalloonTipTitle = title; + this.trayi.ShowBalloonTip(100); + } + + internal void showError(string text) { + this.showBallonTooltip(text, ToolTipIcon.Error); + } + } +} diff --git a/TimeKeeper/View/VWindow.cs b/TimeKeeper/View/VWindow.cs new file mode 100644 index 0000000..29be588 --- /dev/null +++ b/TimeKeeper/View/VWindow.cs @@ -0,0 +1,35 @@ +using BlubbFish.Utils; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TimeKeeper.View { + class Window : OwnView { + private ViewWindowForm form; + public Window() { + this.form = new ViewWindowForm(); + this.init(); + this.Model.setObserver(this); + } + + public override void update() { + this.form.UpdateForm(); + } + + protected override void init() { + this.Model = Models.Window.Instance; + this.form.SetModel(this.Model); + this.form.Show(); + } + + public override void Dispose() { + this.form.BeginInvoke((Action)(() => { + this.form.Dispose(); + })); + } + + public Models.Window Model { get; private set; } + } +} diff --git a/TimeKeeper/View/ViewWindowForm.Designer.cs b/TimeKeeper/View/ViewWindowForm.Designer.cs new file mode 100644 index 0000000..fb607e9 --- /dev/null +++ b/TimeKeeper/View/ViewWindowForm.Designer.cs @@ -0,0 +1,33 @@ +namespace TimeKeeper.View { + partial class ViewWindowForm { + ///

+ /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if(disposing && (components != null)) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.components = new System.ComponentModel.Container(); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Text = "ViewWindowForm"; + } + + #endregion + } +} \ No newline at end of file diff --git a/TimeKeeper/View/ViewWindowForm.cs b/TimeKeeper/View/ViewWindowForm.cs new file mode 100644 index 0000000..29b6b94 --- /dev/null +++ b/TimeKeeper/View/ViewWindowForm.cs @@ -0,0 +1,31 @@ +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 TimeKeeper.View { + public partial class ViewWindowForm : Form { + private Models.Window model; + + public ViewWindowForm() { + InitializeComponent(); + this.FormClosed += Controller.Window.FormClosed; + this.Icon = TimeKeeper.Properties.Resources.IconMain; + } + + public void UpdateForm() { + this.BeginInvoke((Action)(() => { + + })); + } + + internal void SetModel(Models.Window window) { + this.model = window; + } + } +} diff --git a/TimeKeeper/bin/Release/TimeKeeper.exe b/TimeKeeper/bin/Release/TimeKeeper.exe new file mode 100644 index 0000000000000000000000000000000000000000..714e311b0fddd19d565692ae152aa0441db4ce66 GIT binary patch literal 31232 zcmeHw2VB(0x9{u%OHmOKdt0#tQLy)lpavBiU^lR^i>xlYxVtEJG3+VtPq5k`57q02>J=gKK!sMTGs**0a($RquGY#u zdV0%4bV`+Li4rz7b42&*#8`KU8G9SEyl-x5@k}ZyCMm{PSE9I@sQ1+5%E?BM<=V-~ zk(%@-ACqywO*~nmb0cN`QyH@p|MJ}&)WpK3klcRUA3=Gqn?o$L@b1BkRW3;X zzxm~iSry>1BK+F|xT{eWZY2DXCjkl*dCk$AFk$43`Mc^3`ar^jZV}|EN47iJ0;U5M zh^tO>YndYC&qO3j?8mC2l4CvaS6&zOyK#|fNESDO4z4xCU`>Qttn z>uR9HWf2t7oFZ~ZFgrJsI+Z0psgCrtah7qsyud4%@JbEL8D)c!_)-Q75@90~DLPf8 z@Oy2F=_w%8QdfyEJ*7@ws#zN+Qrt#gOW;+>tEJD>Dl3`PAzMa`RAz7?k`whbqEms$oa&R83U;A%0tK79lp;PVJDH&Y(IYrX(486* zTANqyc&ci1=P_pWN=wI57R~DwGr77(T&9^5m57b=7^$HNx#Ky5w475@9;Dw)TI!nd z;HuKGloQcb#tYAUsZ(>#qieyTQ%izQR8cai6V;qds%yn#b(M~_=JI$2$#ktbiJ4LT z_ZPK9rEO?KwDE#RaF)|iMc9~PiOg1Ws^(;9M>Jjgya4@Ku2zRUobpc&kKg9njp^a&)#(22aoEO{H3={l3&lEhJc=7{UUDf&d7;J4(J z={z|>*Og#x6JqE_eiK2To-44pRlYzg5=e;_5NM^hmJ||bl_Svkj4A8pIvPZBios0h zmFKt6^~m#AQ|fvW;@nDVRzY8ycn|@2hJhr`V@@i&5@uS)@+$Gv5B^)GqpHsDm2cSnu_qy zxJRw}!kNUw5-R_BWHsKS4MtUnYaf+C7p4zX8S;F6R0^d^Ur!!l2-N8{>VSIkzAC*z zt<$z`;@W`!)swr2X^dfdRa>np%&1pr>dAYB1!&ZP-BhD}bi-BJwgJtXE1Cv2ZPu`5 z<0h&GEn3$2Jh3pXQ5~YnP2F2%r1rxH1!047_&xNBQEKf_SIpZ97gLcpjCryUA`d0Zz)fyM3m591Ap$y*#;s}KVsBn7>&S;$bwD|i=eRoDPz=cw3!^SvB~UN zk-hu%3#WRc1q4^^|6#Lc&4sedmL2LceR|}??%hZ4FJI0x$=uu{vwQbR=flHi29fHH zWNBdH%OBBO$@!l%YuDbg_<8=N`oo7ss)AHYm$z%HyH?u1XR5Vzk1Pv|?pfyMy&$vb z4~e8_cI{e<v7(%+zyeuqD;*1smjMft(KUU=aW9Hz&57vA4BsUG!-5A}a%kG$3wSIn5zTD(@ zWlB%Tu(O?(RjTB#*<~G8qGE+rs8M|>>U^^SPPP9)O~=(J<1huqY{F5>E`)R+2;1Ua zQR^H3l=0znXOV*Ks#K`tPA=D<*9R?VL>_p3@ZSDkGSjBMG9RIPQueoH$=#L8`wN>l zJ$toE<^9R_cAL^1?AK*gs;~pqtL=xQJeu4C}W7F_Dx zg)3Q?y4T763D>%($sR?0mqTdY^Z;5m-;Wl}cA!=BZRGAEo z-Vb)=JW#E24=gPE3*NXy;dI5(SY+J;W15e7M#|MC%XP0omNqG3oT3#FvnKn+K2gl( z04i7hCAD6?6KLHk86Dl;!^1rlT{?050iK;dp!>HU(8udN2KP_KP{k{Z&^*P2u}?7P zhbLIM>?tBQJj1#*PcVN@JVxqc;s4!McznAY-_)A`ml{3Mv|1ZD6dMdn>yao?PKhd& z{IS?^8D3I-#a0=OWhK2ZvGJHB(vi;*e0;4!wgOpR?p*)B>n8_ODu<@(FX(jJ7-ev{EoiP@6n<^GrY%d5qppZC^G{~_0*@Jq)~Wg3k7G)$eG zh80UQuyac$4(!Q9)GlD_MqtsRj~F}Q6$S;w!Od+un$?*EcLy(c$l7B}t2T)FtqtyO zZGh*CoRR!%J-jiN#kEi?oCqliZKH;8u<%6-8$Aws?8BR0F*sUfJm%O9z-rfVZ%I$u z#fg5)+dbFahAi*5e>rD6RzHgG25rs?R^7tz;0%m1q+!|OOl;o*?A`&aSqV&*;lH zLvMrqIt#35-UB=3`w?e<1}_I)!P9}!I9WLY^GXiF4>b($Nl)Hhcz@+{GuNH=lK)!& z8jeSyQbcBHHMgM;%|N&@1G?dFp$dEi->#?N-f#uF$j2bCN`FkP+zgv4SH^{^c6eCT z7D-iX@wSp3?v*TtqqY)U=v@bIjt|4zv%`@XH3UhUd*Rg&O>uRE4YrP8*xh0M6-@LU^2O?GNcwt_tEs@%}AwINo#)oFL@W#0+ZrIu4kev*dhPFe>?Kwz&G7rfo#vpl5FrF>-M08Lo zY#GK7)us<#PkDs*(_SKZ!X3OEbq;48CSZx}Kq#w@eo4xScK-Z!d%U_>6EAj`N8*a& zNSG?cy5UuMcp-D?a%Ra|HIHI^_+Ct#{2G%ce1y&bR3ZJ>we~^$cqI}h1|cy*iL3}e zq>t>6RJ9jU{W{^pppHoMZHMH}EpVfjBMv&);EL7*=}%T5JAFA)E>6YkEh^lb)&>Xt z9I(xg;ZTbnNc!a|Qh$1dchm3U&BO~hQ*1Qp{~i1*k9(b~-0S-ucz(_mFZNO%R+h!B zi44cbS9+Wqp6l+5N-NFFf7+yD_-R%WW=x~<56eQe@^`SaQ-8de8;&RQ#vpOQIApE- z9v_!YLOS^~i2iZjXkgwre4K2+18*-Ju382+C-=mMN9*z8;Y`GB^Fr)|rijsggDpcX zv9LG8_NHx+^4k-nEqI0ZbM7N)@0%Mvlou^>VkczPle@u9$_FtA51m z4fBw7oCeP`JAqiTM`>_6upanhAyTG{!_98Jaj0x1oElOWCucT6Ubw5@iu5%vk+$>&J}gK;(v&}Oipqbf?GPx-=;+f+p5g6CTEKGrvoSP2 zKC?<)=i^u~_d1p>dW(fWXJG8aOvuY!#_awY#2;9VXS-M6!GX0%KeZLvN4Meq=H<9M zdm@hNl-M+&D;9KWj1ldt!%*8A-&ZIBW!rX`HYM=Np^YOK9h|5=ds;CMZ?-(dhy962 z-~SdFyOWT<{Wa45c#5~Puiz}Lt(V&>ps5g&nWsH@9-RA8b}lm1`sU7gC7vDLVxJJT zlF!4R85deN{Pyb&tX`gsrHelzVoDauJ6ysK{dKr`crA{vn2ojJ!?Db-CuR(61?AwH z@YGgB>+mvYF}^&SPptx{In_{Wf*s@@Qk3aA5 zmX6H056HUm9+|PpNLg|NCrgdO(vkxZQfYV=kGFQl!M|K*^6*a$*MIfzcM!SmEmkeh z#PnI2C|m9}2Gt40#P+o@pluCw2ysU1-x{KQR7-R^)gE4FJ<#uTH}sG8LXSP2&}w@N zIIfk$Ld#$gtQY#fKK0V-~9%{Ea}V1$r(oUMEd2OGHXN#4Mq|w=_)iFdX5lzYd@uu3 zGG<~z$~cU95sHy_gJ8Ji2i>tj@ZZxLowl}x^U7MV9!~nJLxdg~f4;GP`OB7Nm;9FF zPS8o*`tB62cRPV=jgR4i<35}%w+-j)*Wq08`PgqW0>6I~EZWb#GY|M4|8JXmb&q3P z^l_y2arkeUj)l=HusC)het)wRzkOVYg^4pT@9}udzN5#C%ORK) zI~2qB4?wqV9;mn63D!Xj)`2GdxdPAkU2J}D#*sN^eK%d&)8HrUarp&%TdtzMJQwr( zjzyTaAIA6vCGH=xc*RYhwYi^!|F-U&k++`%yC31mfi&#co`qk21{~_eV06?hto?H_ zR$uuU>mM(|=G5ibkhB1+p3TJX_a|b>jWJkoVH74D8IA!v`=Iek7g!H7Ln)P7lz*-g zPfp&dxM<^?T{D&#v2fjZEQpH0)We|&rgc*Lt<6zpMY+@;_sxpP<^Ni@b?aDMJo6GK zV$!j9cNP{dB>i1tFf(R8w%qs~e_SKoA1*^w>U!);UWq*~mtptgU$HxW5q8~Pf>jsi z!ANU`)@xe8T4MoO(6BuH`8d7m%JTIy6Q(3ic`y>Q5=LQWf*zA@1w(zYA9|nmM41hx z(Rrii>8RM9^drF6o1Q%`;MVm-oIaI~15w#nvLqX28pU8q>{9Hyvl?4({*IjwR^WKX zR-8}WgDdY2;cD_>#JxU@^H26+_qDZ{dUPy0uWlpSk0fB|N3O;G_#?_~PdA?V<>}n) zC5b;^MdFWG@q9K`KAw%m4<{kwx(05WT7te_!f|-@_mg%^9{jc1^YZD_`y%e$ev6Ce zKH|vXY%Kdd8x@)!#kTXCaO(aZMBP}AV|TaX%7-Jko_ZXYl4#HIWD9oQUW#RBreXY! z;TX8k3ymk%MDYP;F!$4b?7SiJ{*ISBk~gKS!M3#Z*!zAh_9m{vp`=K}ByY#!M>El8 zWg}SoSiz;g%gdQ-XH1U1aajIe(BI6v&qXBMe}}7=GI8uE@H?&dtF}3Us7o7g<#sd< zo!^FyXP08px#^g2$bf+LgV1rlJL=AD2KlU(s6Mqjs*F{_UiTeryi|}5SdLb^7Gq~d zBx1Ao<3u{`5kKt1g%2^fn05jypZ$uqzqdfi-nM8lu<6-|UndMaef>0FcYd{@^0ye! z{}LX?zrzihV@{p`RPw_{+nO>+8-W^pZ^g{jl{%A2j6rGmMM(>@g zFzE0h42u2}y`rB$zVswyUfaR?M8o&UCS1S)+{lc@wTyGPlNpB#>9P2p`hAmSjp3qm zeWm|Nw{XekU-&nZ|FR+dt%eM_jK>e(aA~WDn>k*{RSHW8D26I~n=C}p! z5wVDT@*Mk<-eb?}3~YX#jpfgQAL6s1zXiB#x&q7I8)4>s48hR{a38UFo_!k$*>|z? z{ciL&Yh(t*_Jevr*9`E z94W9SU@dRBtbIe@BA%sUQG6<<-b_V@U5}|U z&!YICv+2XP?Rl~8!7msVr$L>yZP9b_pz|Ys3)lP+yOsZJ@|n4_I@;pSwqsx22S|V0 zAk|g8dXb73&uE!)hxY6TK0@B;CF~n!qGS`Gr0W|nhx-Va|BTvj8ZKpgMC@A{tEl|9 zzevaGhv}GmCmr3RUch3=IXDE~NL6n=x^m3Xu=!m!c8wXid-94uZ(rx%X1{2j?~JQ| zA!yaiKS!;NNW7LH|02_05PAFY@xF+M4^j}Hkc~@Mvaoem3Mx6@MDaRFC_(z$)_(_9 z@&Se}c!9W#bX?EKz=f2LIG*$o`(9;GpUA-Cd+F$Z=p|%+mr*w0x|qMF#mu*vcVtqn zTQB4Jcbv~mV&ns>*DG&(KhPbCIa_@;j#n7}@!stHlRsnp7X;GZtWw2jj2j<^5u@TU zB=917`5c0iOEfCixqwo26Hu(ieb|(^1mkbdaOdMk+|9^D-1|(NPszgZWcoJrDwFb% z1@+MW3jcmn$h_V7x_I(W&-%Zc z_IUrh;5$g0@co0x)K58vRAo6oWM{6kDRbPFSQTtTlTCsF_VJ*XBMiAw%^h5i#_;tPFmP2Tgy z`R&|S)7}O@f0;h%6|y!YA#-0MGH5@LvgRIrS2=;}HRj@6lbLZZVsG;A=>LdmJZ&Go zTNj%ayyZfcV$*pH{Nr3^zx8K73|MzAY0$b0PyN>2&aONU1+xx6FrhckxrkI z9Ju81k0?(ap~%(*Gyu>F3_{f4}N!V#=C_$bOXtyvPP_ zWg>Oa8$4-!3b&i@y!?3TS>4;{hktiY{>!o9pV0SH85!47%6+_*vgz&OyU2W$Cie61 z!e1c4<=pG|Ua?!>?s-gSZobNVRsa4f$$!E8@!os?_tDSN-b}xVCxa8x6FS8meWZ#T zp8Usi{;m9L%~$P_zgGB{_%q^@D?MLvZAn~@Q}?g*yR!JzjD)Wm=RcA8m*eFpeE%r= zbVppN8;dWvJX{dZzw7@yhR5f9;BSv3|4w56fw=#u{xqikZ!L%aK+*pHFOupznxEwc zvRO6Z#uLJE%KJoe`7fF61xfsJ$x;3bW_&@HTA;xHg&Up2&s{pg&A4lp<4VcxPyjdk zUdW4(k`D27Z0Qp>+RQ|cw=}uAcm$_Mb2&LK59c_~7kAs|xIAx!OK3O1UCRWMJ741uc|qvh21j? zYc<}j+{L(-7vGKb3*X5yn^#CI^K{k6x4)*hzIAb8W`eHXm1#{opB%QzcC|~_bNBk{ zveJV0-gfKlu&Hm|VZ(;?^7XZtePZ&NGhLOzH5NX%*>wNN%%0sEj_bc~w$Dy!&m}fd z5$A*4`}Hd~`}XUgd&b&TnV1oy(rh7iE;M$?@#07`GtABR# zpgF1a$82l({Ah;zH|}QBDqVaq$^D!~?7WHJ)mnA&Y2f0Qe?GXYnX#Z>m*EvEmmfA) zvFOZGY3-k9?(OQaWZi(EfpOujy#ky1&R(#lMBVQl=J%*$A9reBM2vs@X8TKtsXMzj zt&{v@#5XktZm--taBQU2_wNIacb^^=@!i&^n)8n=a#Aw z7ix3&vE{yq9_v4P)inR!?T3~%`&ZI=?B84Yxz?rG{BrX)ly>aD@T^6XiY0p1cC7AT zQ{B@#Nx!D*yM#XHF8$izX??dLm-ho)}civAX@t6&J^uFW&d#yo-VRhy1j@icRqwJy&@xIA-BsW1(9x zV@hz7S-~gV>YdyYFthsIz@zUvRFG}?twXnj3!Ce`&G?~njYs;H%0?B|^r=(R-rB>l z)Rd0Z&83oYYoneut=93*lIhi_+Xe3Jv3hwc+kS4%MopfWQ0L~}=~0Q7J`_7Jd(eUd zFP4^R?YKE|+14$SU%l3i+-0&Z^M)JeG zjTD85u!Fb&bl(=MRK1jeS2yMgc6upM8H}j`c2fTOG=;G_i zH$I_+o74DKqoYO_z?sQVr;_xmvdWr{T{D(Zt1&-i!M$!|c`xHSIFsdzNpG?|j30vG z3tbY$c)ueR@)j+80m*rIY?CWvyV+XeJ4Vok-DB7307nLUOcV%8c?qX@N*+__1WAa* zhHaHBk=WA#>r{f}36^D(r5dR%i#Ah7SPU|Q|buV zQNSSrh6}jOe4e=tJ1*d5L3t^ll?6||t%bA2Sk{{|V#6XV{4H$Q3WB!mqygB@5G>2a$O2?GY@W=SBy5p!IX6YDEZIi0vaE`wMp~9NBWTOI zS#rslqTo!YP+MkW#rZ?5IR66j+p_fp?b&XtREaISAt(<7 zw6f-!=&dz;D9x!4Q|q#$V@y?<1<`md+0g+xj+s%daI6ArO+Ir`vplRdrDx9g4}f-b zAljFXv6zdaEOyMF4HH;Nl4Hjr*c?`hV)D;{T*@5sSu?u!Kv)xj6=OAt!%|Y7U~x%h z0qYX{Nz#Vk0Z9jv(?>d%;E&R&M44}SSR!Fpq>G7C-E1qtc4qs8e=O@IC&BDED=m=| zB}iaDGe=2H!gM*93t?t#Y!23fFbnpBz^0XVm&lnV`=t=JOkgINmTZH-7P29d`oy_Q zV3R~VYj(5%r!_lXDC}~fu&V-_$ATrzs5ClMXJkyN+pup1_Pvm4!+HtqXREUk4=V9F zIoN%PCt(Y7u$Ph^gssTIib;o1y~O5V)uaK0B?-)wLNQjwQKZNEOXU>iF0k)epmZW( z-34}>Et1Zpo<3Y)lh_L4EWs)XY#tk9nMBwuflag8CH;x8`6f=Q!_uD#TWSgud9Y>C z0z1iWk`!BZRbZy_v}G-7a9vJPdOWPVz$UR|>2HK3=U^6Qs|c%ElXHI0%9%w{D`+e* zQ;zIee}S1&uxBcPnNqN4OLM|_3e+P^@kr}~gdGytB+_~!VLzELrnHueBXJVuZpO#4 zt_1&{zq{bAbLLTt;@^2)6faP|ABP{nx<_XGT z$#u(PlI;>+ht);fj3T<6#YoCqos%q@h)irYHD4yF;*s@YfZvvEXUV!iioH6&_+l_X9C>ylq0;m}RMNdk5-;}m}ZBLrj?oFW&ngMbw!vn9Vu zETxvzX02(|v=MW|1j$fFN5Q3h9nwlVf}p!}B*7MDI|YoPHg88Gu9SK$pIz(;N-3|F z1RY3@l=4xG=#>dd>1Id?^4Ag2ikV07{!!5Q5>lA5Tm+jJU@FNje1Z1(Gnx-e6`~5q zy`CqD2ae-Q89MdurBjA!RPC4#-G%C=QiZDYuBvbq^U*6t7o@rCv_`#7qfzNuKebk= z8&xonWT-R-*2{FOxIhTYyo};t{)FDiy@86K+-WOx0?H219FiaI_%)wku=@?vjN(Ls~QEi~QfR@rbrQ5+_3&rp>%huS-gSX~2+I=v9*uF)A(%KWH2 z2@{QZDb(6rJ@U&W*XO0s(jHCE^f@=-2+w8iLhDzBMmG$vmkt)I9&Hyl5t+L@GQ> zCMi91Ms?6=kq=&%Y8ECGU|cxe;^sQ?okJ)^)^ddT=yVz%b*PA82-c12sL*J1T23_* z7pHX6>#1IO|4?b#4fpfws0bWRTaV6al}5=-sRr>jYfx$FvLfA&Q}E_8QlSY`F{MzS zxS6;^ZY+?PQEk+ya?7HR=?GFf+M2=Cr2#I5{mdw_rS}`e?N9R_RBo>4qrPXGmYQK^;&q zzg@!A%6tL2l5>jm^MKB3jq0<&9;R!gx&6n`U7;NsMtw3rdTy6dD~4)y2BSKV8mTHE zZ0Jx$A!ST7sz}~K44>9BZ^V?mzF>ZcAS$7cN}~uDK0|)0Ipx6PQBZ(dqc#?(6dI@l zdDCzU4W&^^#AThrX-uMM-4M7M8QKD}d@(WuiJ3Q$D9@}^#tTLSJ>93Hw5*W41I zWT?y27@_1L`588qpGx0Dr}Z_c^o0X+Bj?43kQ_>GQxS!dhY(-RywORirlGx~UN_26xRO5!pz@?j$RF*+3}8w_&lF0f zUw#mc7Dhi&IBoKW$aVpKehrwLsZ+aq*KE_SrJtX>A~0B`bkpjzqeFCI1}~K{Sf}(* zX;ecgv4&z`qxqP5x*0}m19NI5H<)!)4OMGBwIk^&H1jl#r91~BmT9cb8+Eyd3vvrH z>bwIL8WnH2Le0-9KKwxp8lC(+wFaYt3Y+uw44`@%Nh2W78kbgRyye849&4IZ3zmzA zjxKGh#I!2ftxvF?zEg^^S&Y_VYN0FQ`4mr%iP^|hlKk7IC}NWko>~tYIrAgr`*>7$ zzJf88v&aUK4D^|_K$707Pz5zh8u_^_F)PrtkULQnB8k!{%q2!*#@l^P$0CFntqKF+E*VloQ2M$ zCwfjKkT^n#t`=9i1--owVIf5CMwW+i8LssHhMss#80Y6Vyj@uz;p*t7H%-XG&q{rE zLA=Vpx*g7{^cB)Z(W@=|I=PZk8O1si)RPvh%$KxbC9bg``qNU1S|+jXDfH6PZJdro z;WVXy%sTfDI;-|2IdbMhsVLZJDzZm+2ZgnCaCKiawfC!@qq@g3Ss8n4iM^f4aj@Du zW^msMP2y*o$?R*AEp8@f5*clKD%)2e)XC(nLMwYo6?3}(kV_@DwjCs_aqcvn+XP+t%E;hKy;7$gN-GW;R+YJv zWydhJhE_n9Id3!22UEVkpmd~_D_b!MrCBOsw@5t7k|$sv5oK;Ev9B(ZODo&j*D|w| zRF-kABVw#1v{B-QD^j^Ur`kuH5QS97TxK6}+DcA@OZE|QrU;Lzz)KS|v6T@}l%Rbb zD=Smf=O*X9NIZ)W%4D*QrI~$8`-s={PZU;LPYJ8&+M|dUc=E^WQKf?vRx`1JW zX+@(_7*qwwuAxfG#Q#FGNu96s1@4#U;{|=u1^DvmG%e~og{#EQO6*ZpDp#e3e^;Pi zBx^Bw2jTmBz?{A~hzs5kw&Z@xSOovw!=GIK>qGtF*%KK7*9DTrn_ZfY`ff~Gl0OY^CQIQiVlpI0%NZRSl#cZrz0^(c3abZ_DH@4F0C4=xv#zw`Gdn zmMMB$rs!>%zd2wQV57TrMQ_U#y)9GpwoK96GDUC86um7|U}nho(i~CrwoK96GWiX{ znNv7D>@}z7;5Y2>(kk# zg`=Ebtx(cE8?CCX<7kz^v3;Kt8R*p) zmq1-eD}^D%b!0!>i8F2v{^KL7QCF>lf0!P5rz=Aci*eb8CnYQQiL>@Hf3p691Pkxc+lV6-oMkuLS-N0Q1&^ literal 0 HcmV?d00001 diff --git a/TimeKeeper/bin/Release/Utils.dll b/TimeKeeper/bin/Release/Utils.dll new file mode 100644 index 0000000000000000000000000000000000000000..914f560112019800d2705fd28ec0990063e63f9a GIT binary patch literal 15872 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 J|L;cNzXA9WR9^r9 literal 0 HcmV?d00001