From f5dd70db71207631eee2731b0706f99b71db175e Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Thu, 8 Oct 2015 17:05:35 +0200 Subject: [PATCH] Rebuilt core client code --- .../.vs/ErgometerApplication/v14/.suo | Bin 101888 -> 85504 bytes .../ClientApplicatie.Designer.cs | 8 +- .../ErgometerApplication/ClientApplicatie.cs | 283 +----------------- .../ClientApplicatie.resx | 3 - .../ErgometerApplication.csproj | 1 + .../ErgometerApplication/MainClient.cs | 109 +++++++ .../DesignTimeResolveAssemblyReferences.cache | Bin 7477 -> 10502 bytes 7 files changed, 128 insertions(+), 276 deletions(-) create mode 100644 ErgometerApplication/ErgometerApplication/MainClient.cs diff --git a/ErgometerApplication/.vs/ErgometerApplication/v14/.suo b/ErgometerApplication/.vs/ErgometerApplication/v14/.suo index 0457cd738329c1292d6fd246b61ba12e2548a881..43cbfe447ccb200cbf6f8f7b47e5289ed9db8670 100644 GIT binary patch delta 5460 zcmd5=e^k@g760CELI@CSkjO6)k{B^!#DIlbN;Uk@B31-cq?UCeqR>)A2-Z3#(Y1=L zRmgL`&7sq@vu>x;%6B9Cqf@Lsn`fOCdhFJNt)g}PXo-uK>p_uY42933i0M^IbVD2*Tp3d9YM$Ad)X#~&;nEr!(VB7SfZdLf-Pi7jF< zu*>3lF)o;`QLKr04tu^GP5lKyjkwOv21T}nAQy+2j0i@cO1Xq1uSBdx&^T1?^6?{) z>JeV4$1@iBSVRJ%0PzgMjG%TM((6cR;H^Gc5>l0ypXOQb6UO+c)ko8Ol$0bRZ$X$4 zsfb7f$&1-r%6kkme6^WK^L_j*q_YuI5D&75xzQ{yXfZUk7f-gVLeUe5)rcPJm@3kMO2?{{xLIfdHzz&5P+w1R^YU4V-IK>QnV4RKu%!ezyz zoWR?xV1v)tI^AK`Yl`Gst&lvWQm7SbgesvBY|EJkU%>DV+z@@7-GaMBK2E_cNC%hILHPNfy&dV2%W%e@DnAljJ>+Udzh@ zm(kZ6Wz^Vwdi=VA4x>OX@18N*5H3u^sy~Rx{@06wIGPuhu1x3#xXM5`-Dx};4%sLp zMO3J>>L3bE3ts2=j)UFr(;*r>ZirO+AjSDJ#&>5D5WY*+AJF)F+Il zM$rljTWMM+IdnE)=k@VnxnEhG_dWxol)p_dg}Ty|PNSabttJh{V>7}(dC6|w47|h$ z@lyQM^9tw8qv1lLuif7#r~(Ctq$@Lnq0?f6?HQ26wi)7ByjjOe$D4R+HYD(#Dj1PP zUr>3|UO@Z` zFNe?D>m9BfF}Umv3Yh}Wj)HrcBj3!cb0G#C4028dnuP5!MaEWPU?A7~wR-KFAH3MK z|0l$?C|%(F2z z!l)VNI8}OR$rs@t_3cnaA0#`)GziOu6~g1fE&HG~z{SqwqZp@0-tW}pX_Pp5y>9`u zCz4&W8Jsg;lVbGp?FN{QQ;0BJ}n zRwyqK*!3~54}UZQ!*|$j>I?KokUR#w&E?P?Wn_8L)^Cf)Dqo1~eWa1~i;_pXE|Fj1yR2&1+^RVSTJi8b^W;mcg1z24p2fH3vn`uS*elD7EOXgRSm>XP zmT9(Zxr$}2d2klxinnSyvSkm`ZpxTI8RR!k zRw$Kk-6y0;HOIl(wpx70G<3xTrd~k`)TETIlm%l>^yoP)y{5N~t zBd!4@dvuHS|I+cU0LvacC7rrD4y5|Neg7-p%5hy2pO61YwO0g@?Os07ZhlS^>VJh!d!+iQ)QsM{`nIt5hxMha9ilc?n@C&P@GAi+FCknha* zaDXsWi>g5|vo@1iq4H9=|Rvj-( z2Q&ZU-Eg-&H-Lzy?O=D9ly| zY!&wi_?g%yW^1t}tfln@(mY~heL=W{aEe;1Nl)d81TIgb{8GXMLR7Ghd(x1cOkkN) zG|9gp{E`r;@%z(B9!r=+m>jI%M7c!}RtsB$6|5XiG8@XEJb|DKe&a!DNj4E;2`PkB z!gK<+$JHojuCE+^>N#EVP zXS_??Bw*9{b>h9W^5fURMr@q0BoY#79PF`d8%rmpdg3(fyh`ecDuhVjqU!vlVZr9; zrMfh#RGa9JP{B;#gw{m2?9Q?R`Vy_4&VJn-s#G=Qp-w$qpw;jZs~x3I*)eu2$hx>U zA?Y@<*Fw0Rz@*$6%z1U()W5&zkZvx?YM(eXe?Xr{6{^qiEF-$8LID0JAPmltXPf)M zlWRt^DT ziGoX0vo4=8o9uoqnFOE-ok^HDFGc!;6@1>=n$BW~#n}Axsb_awS>dX7)|P)S{dzi! zb(hn4RL0TOx%_L6i9?;QMFM~3$*5`(i^)U249r6+od+?pvFroz+C-1V&0ZoOOv?k$ z%7c3KTu~cpE2zF_XZZvWMf4ak-8QoRkVz%+-;QPAXX;Y7zZZFb0D9 z%yN0k3nK+SQuxeL4UE}C1^YN`DPO4Pvub?EH`)PlxO@>F5VK|1b#B0+)mLL-W;VJi zmnv}-ceZk+qCAGjGF*r)nG5ytB=Y&G_9qXmISM*naJ2@9ZoHbiK-XF&kKii+UlS-v z*(LBZsVfK4ao5ZT&e>$Jy=)W4%}Ny;$~~51EY8f(Zl_kKiJ3);OX8|YYX}Ll+wlN| z|G7{Q7TA^*-hszoPm&BJ@GS05jGdS%R0<73olq}0g`0%tv3*9V!3P>2V6Rf{300(2 zB~(xcRk%KRI@;?#z`7m9m{OlNiEk{UYi{=5jk(+ALnMB@Ax84eg)w+fy%~+$QgGMK zoNsJ616S@W!(*?Td4hWMZo3{cTv^}JrLG4^Q*LPTp zOK*3`j{XP2(A?I70}mT;(~*U8iSuuu(!vwR7H=`~phhQvK0nM;9NnWIAzH2f8IR^2 zLP-Dnxmi4aFz5k~m^1O| z4SD$Ja|yDosSnW5s>fr$F$Y%w`?`;KZtTC{n8E$)C(FB@ItjFD?}KNnPxd*M|F1fK z8s^;Ejh6iee9N71#y8LL;3!<(7Kc%;B^Mniv`h)qSr3^|7auCyzbOp9 z!$t%n!MB~*Y75zuLirqhFDlbD1djqcJwXi6^kHW?9Dg9OW++4 z(L3-{+4BAtcp?$TDoXGDeU}E0d{``HrGWuoJsB%oKhgkfQFoCRemm0$p!-Lg^ z77olbC&m=juXWZ` zxvJ{v8g2fGUD3O)vG9uWYZ|KRdzM%M+du!Y)M^8L_{e8zPXW|O_t_v%L${RCx|kSZ zH(*ogppozCH%VkQ0s?X`$vt84DGzhs*fn&iZ%{7v%0NLey>C2?q^YXD(pgi}SX)i^ zaA#m1(rzmZMKhU!JCz_*TLW_sSLUt_j_te#CdMpNEEk4YCK?(gLjkOcJ-63y`4)I_ zWL?OMLlF2@$Bz*E=u?l5JnNysLy9`XkMig_x9&R)fiHl{5CWtnD5QlfT&P3v!a2Sd z4`6RtJdWR-fu#49laSH7%L>V2(idtq<@`Gw>+ugg6iJ+fGrUGF*(?gGg;edOhv_`?ik`$#B{7F!TlF0Ha$N(@|7_*@nl z8aJbMr0wmtLXsG(JPQMa`}kK1-t_`u|NqcpTF(AGA@H{PfrM84Vjf~3`K}KN!4SfE z%L@318#jm3h5ZT;5=(6$xnp2y?~>V&r|n%j1?m8I+pg_hVTT>z!8abi^YZ@ _data; - //private int i = 0; - //NetCommand command; - //private ServerCommunicator communicator = new ServerCommunicator(); - //List readFile = new List(); - public ClientApplicatie() { - InitializeComponent(); - comPort = new ComPort(); - - doctor = new TcpClient("127.0.0.1", 8888); - - // _data = new List(); - // communicator.data = _data; + InitializeComponent(); } - //private void connectButton_Click(object sender, EventArgs e) - //{ - // if (!comPort.IsOpen()) - // { - // if (comPort.Connect(ComPortBox.Text)) - // { - // connectButton.Text = "Disconnect"; - // statusButton.Enabled = true; - // resetButton.Enabled = true; - // timerStatus.Enabled = true; - // inputTextBox.Enabled = true; - // timeButton.Enabled = true; - // distanceButton.Enabled = true; - // powerButton.Enabled = true; - // energyButton.Enabled = true; - // ComPortBox.Enabled = false; - - // comPort.Write("RS"); - // comPort.Read(); - // Thread.Sleep(200); - // comPort.Write("CM"); - // comPort.Read(); - // Thread.Sleep(200); - - // comPort.Write("ST"); - // string response = comPort.Read(); - // Console.WriteLine(response); - - // Meting m = Meting.Parse(response); - // SaveData(m); - // // richTextBox1.Text = m.ToString(); - // } - // } - // else - // { - // if (comPort.Disconnect()) - // { - // connectButton.Text = "Connect"; - // timerStatus.Checked = false; - // statusButton.Enabled = false; - // resetButton.Enabled = false; - // timerStatus.Enabled = false; - // inputTextBox.Enabled = false; - // timeButton.Enabled = false; - // distanceButton.Enabled = false; - // powerButton.Enabled = false; - // energyButton.Enabled = false; - // ComPortBox.Enabled = true; - // richTextBox1.Text = ""; - - // WriteFile(); - - // } - // } - // communicator.client = new TcpClient(); - // communicator.client.Connect("127.0.0.1", 8888); - // Thread thread = new Thread(ServerCommunication); - // thread.Start(communicator); - //} - - //private void statusButton_Click(object sender, EventArgs e) - //{ - // comPort.Write("ST"); - // string response = comPort.Read(); - // Console.WriteLine(response); - // Meting m = Meting.Parse(response, '\t'); - // Console.WriteLine(m); - // SaveData(m); - // communicator.data.Add(m); - // command = new NetCommand(m, communicator.sessionId); - // NetHelper.SendNetCommand(communicator.client, command); - // richTextBox1.Text = m.ToString(); - // WriteFile(); - //} - - //static void ServerCommunication(object obj) - //{ - // ServerCommunicator communicator = obj as ServerCommunicator; - - // NetCommand net = NetHelper.ReadNetCommand(communicator.client); - // if (net.Type == NetCommand.CommandType.SESSION) - // communicator.sessionId = net.Session; - - // NetCommand command = new NetCommand("name", false, "pass", communicator.sessionId); - // NetHelper.SendNetCommand(communicator.client, command); - //} - - //private void resetButton_Click(object sender, EventArgs e) - //{ - // comPort.Write("RS"); - // comPort.Read(); - // Thread.Sleep(200); - // comPort.Write("CM"); - // comPort.Read(); - //} - - //private void updateTimer_Tick(object sender, EventArgs e) - //{ - // if (timerStatus.Checked) - // { - // comPort.Write("ST"); - // string response = comPort.Read(); - // Console.WriteLine(response); - // Meting m = Meting.Parse(response); - // SaveData(m); - // communicator.data.Add(m); - // command = new NetCommand(m, communicator.sessionId); - // NetHelper.SendNetCommand(communicator.client, command); - // richTextBox1.Text = m.ToString(); - // command = new NetCommand(communicator.data[0], communicator.sessionId); - // NetHelper.SendNetCommand(communicator.client, command); - // } - //} - - //private void timeButton_Click(object sender, EventArgs e) - //{ - // comPort.Write("RS"); - // comPort.Read(); - // Thread.Sleep(200); - // string[] temp = inputTextBox.Text.Split(':'); - // comPort.Write("PT " + temp[0] + temp[1]); - // Console.WriteLine("PT " + temp[0] + temp[1]); - // inputTextBox.Text = ""; - // comPort.Read(); - //} - - //private void distanceButton_Click(object sender, EventArgs e) - //{ - // comPort.Write("RS"); - // comPort.Read(); - // Thread.Sleep(200); - // int temp = int.Parse(inputTextBox.Text); - // comPort.Write("PD " + temp.ToString()); - // inputTextBox.Text = ""; - // comPort.Read(); - //} - - //private void powerButton_Click(object sender, EventArgs e) - //{ - // int temp = int.Parse(inputTextBox.Text); - // comPort.Write("PW " + temp.ToString()); - // inputTextBox.Text = ""; - // comPort.Read(); - //} - - //private void energyButton_Click(object sender, EventArgs e) - //{ - // comPort.Write("RS"); - // comPort.Read(); - // Thread.Sleep(200); - // int temp = int.Parse(inputTextBox.Text); - // comPort.Write("PE " + temp.ToString()); - // inputTextBox.Text = ""; - // comPort.Read(); - //} - - //private void timerStatus_CheckedChanged(object sender, EventArgs e) - //{ - // if (timerStatus.Checked) - // { - // statusButton.Enabled = false; - // updateTimer.Start(); - // writeTimer.Start(); - // } - // else - // { - // statusButton.Enabled = true; - // updateTimer.Stop(); - // writeTimer.Stop(); - // } - //} - - //private void readButton_Click(object sender, EventArgs e) - //{ - // ReadFile(); - // if (readFile != null) - // { - // metingNextButton.Enabled = true; - // metingBackButton.Enabled = true; - // } - - //} - - //private void metingBackButton_Click(object sender, EventArgs e) - //{ - // if (i > 0) - // { i--; - // metingNextButton.Enabled = true; - // } - // if (i == 0) - // { - // metingBackButton.Enabled = false; - // } - // richTextBox1.Text = readFile.ElementAt(i).ToString(); - //} - - //private void metingNextButton_Click(object sender, EventArgs e) - //{ - // if (i < (readFile.Count - 1)) - // { i++; - // metingBackButton.Enabled = true; - // } - // if (i == (readFile.Count - 1)) - // { - // metingNextButton.Enabled = false; - // } - // richTextBox1.Text = readFile.ElementAt(i).ToString(); - //} - - //private void writeTimer_Tick(object sender, EventArgs e) - //{ - // WriteFile(); - //} - - - //private void WriteFile() - //{ - // string json = Newtonsoft.Json.JsonConvert.SerializeObject(_data); - // string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "ErgometerSessionData.ergo"); - // System.IO.File.WriteAllText(path, json); - // Console.WriteLine("Writing file: " + path); - //} - - //private void SaveData(Meting meting) - //{ - // _data.Add(meting); - //} - - //private void ReadFile() - //{ - // string path; - // OpenFileDialog file = new OpenFileDialog(); - // file.Filter = "Ergometer files(*.ergo) | *.ergo | All files(*.*) | *.*"; - // if (file.ShowDialog() == DialogResult.OK) - // { - // path = file.FileName; - // readFile = Newtonsoft.Json.JsonConvert.DeserializeObject>(System.IO.File.ReadAllText(path)); - // richTextBox1.Text = readFile.ElementAt(i).ToString(); - // } - // else - // { - // readFile = null; - // } - //} + private void updateTimer_Tick(object sender, EventArgs e) + { + if(MainClient.Doctor.Connected) + { + MainClient.ComPort.Write("ST"); + string response = MainClient.ComPort.Read(); + MainClient.SaveMeting(response); + } + } public void validateLogin(string username, string password) { - if(username.Length >= 4) + if (username.Length >= 4) { - if(password.Length == 0) + if (password.Length == 0) { panelLogin.lblVerification.Text = "Vul een wachtwoord in."; panelLogin.lblVerification.ForeColor = Color.Red; panelLogin.lblVerification.Visible = true; } - if (password.Length > 0 && password.Length < 9) + if (password.Length > 0 && password.Length < 8) { panelLogin.lblVerification.Text = "Vul een wachtwoord in van minimaal 8 karakters."; panelLogin.lblVerification.ForeColor = Color.Red; @@ -302,7 +53,7 @@ namespace ErgometerApplication } if (password.Length >= 8) { - //password checken + MainClient.Connect(SerialPort.GetPortNames()[0], username, password); panelClientContainer.BringToFront(); this.labelUsername.Text = panelLogin.textBoxUsername.Text; panelTopBar.Visible = true; @@ -319,7 +70,7 @@ namespace ErgometerApplication private void ClientApplicatie_Resize(object sender, System.EventArgs e) { Control control = (Control)sender; - if(control.Size.Width < 980) + if (control.Size.Width < 980) { panelGraphView.Visible = false; panelClientChat.Width = 400; @@ -343,7 +94,7 @@ namespace ErgometerApplication public void sessionLogout() { - + MainClient.Disconnect(); } private void buttonLogOff_Click(object sender, EventArgs e) @@ -352,7 +103,5 @@ namespace ErgometerApplication panelTopBar.Visible = false; sessionLogout(); } - - } } \ No newline at end of file diff --git a/ErgometerApplication/ErgometerApplication/ClientApplicatie.resx b/ErgometerApplication/ErgometerApplication/ClientApplicatie.resx index 29ee7eb..26f2a51 100644 --- a/ErgometerApplication/ErgometerApplication/ClientApplicatie.resx +++ b/ErgometerApplication/ErgometerApplication/ClientApplicatie.resx @@ -120,9 +120,6 @@ 17, 17 - - 147, 19 - 25 diff --git a/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj b/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj index cc4fa12..6ff639d 100644 --- a/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj +++ b/ErgometerApplication/ErgometerApplication/ErgometerApplication.csproj @@ -54,6 +54,7 @@ + Component diff --git a/ErgometerApplication/ErgometerApplication/MainClient.cs b/ErgometerApplication/ErgometerApplication/MainClient.cs new file mode 100644 index 0000000..a6e709b --- /dev/null +++ b/ErgometerApplication/ErgometerApplication/MainClient.cs @@ -0,0 +1,109 @@ +using ErgometerLibrary; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net.Sockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace ErgometerApplication +{ + class MainClient + { + + public static ComPort ComPort { get; } + public static TcpClient Doctor { get; } + public static List Metingen { get; } + + public static int Session; + + public static string HOST = "127.0.0.1"; + public static int PORT = 8888; + + static MainClient() + { + ComPort = new ComPort(); + Doctor = new TcpClient(); + Metingen = new List(); + + Session = 0; + } + + public static void Connect(string comport, string name, string password) + { + if (!ComPort.IsOpen()) + { + if (ComPort.Connect(comport)) + { + ComPort.Write("RS"); + ComPort.Read(); + Thread.Sleep(200); + ComPort.Write("CM"); + ComPort.Read(); + Thread.Sleep(200); + + ComPort.Write("ST"); + string response = ComPort.Read(); + Console.WriteLine(response); + + SaveMeting(response); + } + else + throw new Exception("Comport was unable to connect"); + } + else + throw new Exception("Comport is already connected"); + + + if(!Doctor.Connected) + { + Doctor.Connect(HOST, PORT); + + NetCommand net = NetHelper.ReadNetCommand(Doctor); + if (net.Type == NetCommand.CommandType.SESSION) + Session = net.Session; + else + throw new Exception("Session not assigned"); + + NetCommand command = new NetCommand(name, false, password, Session); + NetHelper.SendNetCommand(Doctor, command); + } + else + throw new Exception("Client is already connected"); + } + + public static void Disconnect() + { + if (ComPort.IsOpen()) + { + if (ComPort.Disconnect()) + { + + } + else + throw new Exception("Comport was unable to disconnect"); + } + else + throw new Exception("Comport is already closed"); + + if (Doctor.Connected) + { + NetHelper.SendNetCommand(Doctor, new NetCommand(NetCommand.CommandType.LOGOUT, Session)); + Doctor.Close(); + } + else + throw new Exception("Client is already disconnected"); + } + + public static void SaveMeting(string meting) + { + Meting m = Meting.Parse(meting); + Metingen.Add(m); + if (Doctor.Connected) + { + NetHelper.SendNetCommand(Doctor, new NetCommand(m, Session)); + } + } + } +} diff --git a/ErgometerApplication/ErgometerApplication/obj/Debug/DesignTimeResolveAssemblyReferences.cache b/ErgometerApplication/ErgometerApplication/obj/Debug/DesignTimeResolveAssemblyReferences.cache index e5db29062a13814175bb65808a293ad1744ccdc1..dc63a6ff93c7cebe76b9b520fe4cc00c3cace22f 100644 GIT binary patch literal 10502 zcmeHMNpl;=6`lqMAZ7%Tk|QT_;y7@mcoPEu- zW+6paVyRMz?NlX}54Pn)mOqf~;HsRm++!b{s@&~+4*3Vl`x-Og3;-sCY*s2Pw2BY? z-n{AV>G!>*TN0Bb=^i!wqUBOVUb$#gUB`3ke&N}`Fl&V?x_84X%sVb0&#!UUGaUPD zX{s=Rf8+W2!1M!`pS5}5ySh1^Uk%nxqk4gFUvX}5`|SF}WPQ4Rx?U>PrYH1CJ&nm8 z?L9|%+w-|q_H~~_OQ{zNkpHMUObY7r zj$T{RtG?q7hu@Q(cdVxFa`!L>op)+{)pa(F8h5i0l#N%pOkd<>)^s!Ao+J$oN$K>V zY_GXiqOnf&So2EP`2T!i=3E}DQjZW-WRNtG!{}w{FOwnCn4hiCk{YgV<(Ftzy!;b4 zXHGp?xyB7^MaDfZ1zGc{r zLd`TY*q}R%W_!^iQ&%o<+vfg8Wx=Ti7Poz`a^CQlgY`AT3v{#W2Q|Z~EV>QH;y!oh znoTmj4)gROTsQ2>0$&drJ>Mztn>>Sku=aBcUNY>Ov*i_*9M|&1Mkq98eP5=Wt5&(^ z8S92=_}gMGb>HTSEX+NlVT-vA(Omkze3#`_9oID0#WXpZ=KBk?m9i7KRZciO2nwTaVEcx}!>Be= zkK7-xNvTwdrA81erF%bG`1JV4%c`nozDTS}@nE7bIWbu}qvpOuf|b^?cH;fs!~N;g z`gC>rRO!s*6rY$mlg9S^@4sD^GfW;C@3cXAgMxmo5XMfiyNfq{ZX?HGqYC}JaP=Bq zc{~Kl<(4T5p)C+!+wm9Xz&1nw!@s>hW_R#D* zX(MumS2nDs$pQ2e8@flO3v!<0&bieM!>0<4O2!p?DS)FvNii%d5XD^1<(A%T^4gN? zSVJfS;u-`j-C4OJh!=PR7IUw=Kl54)vNuu^LV~f`|~Y?uU&&3 z5dxGah-985a-ml#wG)L)do8-{z%()NQ$&UlQzWsG^egveWU;!F^qMjb@=cHeks}CE zXlaC{y@otgv^h(ovYN6Kr8QTvw9VFmf_hEYLA|e9TAfx8P_QA!Mnl7fVH8m_QzSBy zC}@=l$V)^dmBG(MFnt=rNg|*3wocKQ!|>$KvaQqfx^fESG{_8*BM1y=48Z_fn>jJuqg(Ws`4*A848Aj4EEeZyi{j{343BQb_R+1_eRM1K8oCc5 zRpdo+bnE#Jj&901TAln?x@5RNJ0NZiZ{pOgX;N0cO}_CL8Vm!{6LNt+Q|~hwA~}PI zlYgQy_hO&qt0>OYG(ztGXF9^=N!Nu)c3yAlRXV6jvXt#A^Lo_J(d`FPM-~|lO<8FD zN({+F1m{KS;M}V$5n)I#LVP|FFGGxkBg89__&JD?f`s@&Bz~ScGLk??$Uw@;XczVG zIWGMeHh#pdmZDwen+D1c(vY&$po)_n7EboR$B;fmX1++BU7YX|JrYj%ZR%`CKDaPj zY@K_H;@sQQIr^jB_`8w#D#SC9xDtu4L5u_jTXpXE7(yCa ziXm!11?!EsG=S6(3^Bm5DqR=iGVe0?b+u^<^r!`^4eGJGF(k3~VvNe(C9VytcZk`674lv;tdRc(usXo7 zLK%{2!AeyeVp>3IQjgtq z?=>=Ttk44HTDZGSJ$5SwHTGJJQP~fPYiGnC5VMmJaqwv4E;^vdIDibGbbz7sIvIGE zLhB8B)PmKU)MHyQB(cpHqp~0lD?b4%99+9$g#+vWRtFeXZ;^r9h1MNnT0nZ6dd!Jo zhuJYkWmX(WW&%jK>gWa%t~>@nI>11Bj||*ZXx$}Y3sCP*NH>Hg?qGk8^b{~sk%Xuo~k%%BvqTcsiKG!s((1A x-8%9Qb(W!+>^Um7AUW#o-Bc0Fld5m-rV4LOs=mFOD(oOs+iQhAdad=)zX2L4FLnR` delta 1326 zcmZWnO-~b16zv;kUi)6ZrtMfPDztnk6=)z-gla`2B`gFJ3oHzVR3(Izk5~*u7vjo< zl`%JQs|({tOaz01Y*05Yj8W0Jhs2dG)E{8*-f3E=^d)n8&$(~jnR{MuoqL&BUSu^j zHk(aKAEHnRGz6V0J3gGl1$B^6|p>RYNere7~^NZAW-DaPZl2?_!AvN!=-NE3# z-COjsE&F$Gp|Gr;L3n4^x#lmEf07(1lXZu#xWce5(khJze|XDEQl4hsFfvL&L=bo_ z+;*mU9hUYWbi2E&>#5a1aFE~-f{&7+rG+5nnr@&Bc_V^5Hjo=4WzQ5heXF zf=#Ls*a&}Jx$AK=tqBDK?kI*!ie{`A@Zl}cAGjf6SgM;lJ3Fu)>3|1%!2cNu3E03> zK2htWHwoMqP(Kp!hU(#z&rs=$;k{f1uRlE#rro$id;ZtPXbSUY<5-XV6j}Yq63z2NeYWJ+fj#4kTOPF>GgV^-s?P5K-%>2akxD-Q0+hMYOVsT=REkv?M zR@;XqwsfmywqCj@2R_Q$^^xIF+_AOD=*FUOrO~LQbS+KnQOfxqMN!(LNb)`UUbDB{ RJ-XogCKHUln|cA}{0BqsIP?Gj