From 4660abc0b64e656bd7abdd216bde460cf6f31b81 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 17 Nov 2009 14:41:08 +0000 Subject: [PATCH] Keyboard shortcut logic --- PROMS/Volian.Controls.Library/StepRTB.cs | 111 +++++++++++++ .../StepRTB.designer.cs | 4 + .../Volian.Controls.Library/StepTabRibbon.cs | 151 +++++++++++++++--- .../StepTabRibbon.designer.cs | Bin 199646 -> 213264 bytes 4 files changed, 242 insertions(+), 24 deletions(-) diff --git a/PROMS/Volian.Controls.Library/StepRTB.cs b/PROMS/Volian.Controls.Library/StepRTB.cs index c37394fd..f2c6252f 100644 --- a/PROMS/Volian.Controls.Library/StepRTB.cs +++ b/PROMS/Volian.Controls.Library/StepRTB.cs @@ -435,6 +435,45 @@ namespace Volian.Controls.Library { AddText(txt); } + + private void ToggleCase() + { + char type = 'l'; + // do not change case on linked text + RangeStatus rs = FindRangeStatus(); + string tmp = null; + if (rs != RangeStatus.NoContainedLinks) + { + int start = SelectionStart; + int ostart = SelectionStart; + int end = SelectionStart + SelectionLength; + bool processed = false; + while (!processed && start <= end) + { + foreach (LinkLocation ll in LinkLocations) + { + if (ll.Start >= start && ll.End <= end) + { + processed = true; + if (start < ll.Start) + { + SelectionStart = start; + SelectionLength = ll.Start - start; + } + start = ll.End + 1; + break; + } + } + } + } + string ostring = SelectedText; + if ((char.IsUpper(ostring, 0) && char.IsUpper(ostring, 1)) || + (char.IsLower(ostring, 0) && char.IsUpper(ostring, 1))) type = 'l'; // lower case + else if ((char.IsUpper(ostring, 0) && char.IsLower(ostring, 1))) type = 'U'; // upper case + else type = 'T'; // Title case + SetSelectedCase(type); + } + public void SetSelectedCase(char type) { // do not change case on linked text @@ -1153,6 +1192,55 @@ namespace Volian.Controls.Library #region KeyboardHandling void StepRTB_KeyUp(object sender, KeyEventArgs e) { + if (e.Control) + { + if (e.Alt) + { + switch (e.KeyCode) + { + case Keys.M: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.btnAnnots_Click(sender, e); + e.Handled = true; + break; + default: + break; + } + } + if (e.Shift) + { + switch (e.KeyCode) + { + case Keys.F: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsFigure"); + e.Handled = true; + break; + case Keys.T: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsTable"); + e.Handled = true; + break; + case Keys.N: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsNote"); + e.Handled = true; + break; + case Keys.C: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsCaution"); + e.Handled = true; + break; + case Keys.S: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsSubStps"); + e.Handled = true; + break; + case Keys.H: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsHLS"); + e.Handled = true; + break; + case Keys.R: + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.ShortCutContextMenu("InsRNO"); + e.Handled = true; + break; + } + } + } if (!e.Shift) return; switch (e.KeyCode) { @@ -1167,6 +1255,10 @@ namespace Volian.Controls.Library if (e.Control) // Hardspace - Ctrl+Shift+Space InsertSymbol(@"\u160?"); break; + case Keys.F3: // shift F3 + e.Handled = true; + ToggleCase(); // toggle through Upper, Lower, and Title case + break; default: break; } @@ -1202,6 +1294,11 @@ namespace Volian.Controls.Library StepRTB_HomeEndPressed(e); e.Handled = true; break; + case Keys.Enter: + //Console.WriteLine("Ctrl+Enter - Page Break"); + this.MyStepItem.MyStepPanel.MyStepTabPanel.MyStepTabRibbon.btnInsPgBrk_Click(sender, e); + e.Handled = true; + break; } } switch (e.KeyCode) @@ -1363,6 +1460,14 @@ namespace Volian.Controls.Library // comment on _OverWrite e.Handled = true; break; + case Keys.F6: + e.Handled = true; + SendKeys.Send("%H{ESC}"); + break; + case Keys.Tab: + e.SuppressKeyPress = true; + e.Handled = true; + break; } } private void StepRTB_HomeEndPressed(KeyEventArgs keyargs) @@ -2067,6 +2172,12 @@ namespace Volian.Controls.Library DebugPrint(where, ": {0} {1} '{2}'", SelectionStart, SelectionLength, SelectedText); } #endregion + + private void StepRTB_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e) + { + if ((e.KeyCode == Keys.Tab) && (!e.Alt && !e.Control)) + e.IsInputKey = true; + } } public partial class StepRTBModeChangeEventArgs : EventArgs { diff --git a/PROMS/Volian.Controls.Library/StepRTB.designer.cs b/PROMS/Volian.Controls.Library/StepRTB.designer.cs index 3eb38d3f..0f399e7e 100644 --- a/PROMS/Volian.Controls.Library/StepRTB.designer.cs +++ b/PROMS/Volian.Controls.Library/StepRTB.designer.cs @@ -29,6 +29,10 @@ namespace Volian.Controls.Library private void InitializeComponent() { this.SuspendLayout(); + // + // StepRTB + // + this.PreviewKeyDown += new System.Windows.Forms.PreviewKeyDownEventHandler(this.StepRTB_PreviewKeyDown); this.ResumeLayout(false); } diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.cs index f0bbaf10..a9e0b2eb 100644 --- a/PROMS/Volian.Controls.Library/StepTabRibbon.cs +++ b/PROMS/Volian.Controls.Library/StepTabRibbon.cs @@ -45,6 +45,8 @@ namespace Volian.Controls.Library private ItemInfo MyItemInfo { get { return _MyStepRTB.MyItemInfo; } } + private DevComponents.DotNetBar.ButtonItem _DefaultContextMenu; + private int _MyLastFormatID = -1; private StepRTB _MyStepRTB; public StepRTB MyStepRTB @@ -60,10 +62,12 @@ namespace Volian.Controls.Library { case E_FieldToEdit.StepText: _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMRtfEdit); + _DefaultContextMenu = btnCMRtfEdit; break; case E_FieldToEdit.Text: case E_FieldToEdit.Number: _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMRtfEdit3); + _DefaultContextMenu = btnCMRtfEdit3; break; default: break; @@ -93,12 +97,13 @@ namespace Volian.Controls.Library BuildSymbolGallery(sl, galleryContainerSymbolsCM); BuildSymbolGallery(sl, galleryContainerSymbolsCM3); } - SetButtonAndMenuEnabling(); + SetButtonAndMenuEnabling(true); _MyLastFormatID = MyItemInfo.ActiveFormat.FormatID; } } } + private void BuildSymbolGallery(SymbolList sl, DevComponents.DotNetBar.GalleryContainer gc) { foreach (Symbol sym in sl) @@ -126,7 +131,7 @@ namespace Volian.Controls.Library void _MyStepRTB_ModeChange(object sender, StepRTBModeChangeEventArgs args) { - SetButtonAndMenuEnabling(); + SetButtonAndMenuEnabling(true); } #endregion #region Constructor @@ -169,8 +174,8 @@ namespace Volian.Controls.Library } void MyStepRTB_SelectionChanged(object sender, EventArgs e) { - //Console.WriteLine(string.Format("StepTabRibbon: In MyStepRTB_SelectionChanged, Selected Text = {0}",MyStepRTB.SelectedText)); - SetButtonAndMenuEnabling(); + //Console.WriteLine(string.Format("StepTabRibbon: In MyStepRTB_SelectionChanged, Selected Text = {0}", MyStepRTB.SelectedText)); + SetButtonAndMenuEnabling(false); } void btnInsStep_Click(object sender, EventArgs e) { @@ -260,7 +265,7 @@ namespace Volian.Controls.Library btnDelelete.Enabled = btnDelStep.Enabled = setting; btnInsAftH.Enabled = btnInsBefH.Enabled = setting; } - private void SetButtonAndMenuEnabling() + private void SetButtonAndMenuEnabling(bool docontextmenus) { if (_MyStepRTB.FieldToEdit != E_FieldToEdit.StepText) return; // No need to change menu that does not get used @@ -306,9 +311,9 @@ namespace Volian.Controls.Library btnCMEditTran.Enabled = false; btnCMEditRO.Enabled = false; } - SetStepButtonAndMenuEnabling(); + SetStepButtonAndMenuEnabling(docontextmenus); } - private void SetStepButtonAndMenuEnabling() + private void SetStepButtonAndMenuEnabling(bool docontextmenus) { btnInsPgBrk.Checked = false; // see if manual page break - only available on HLS @@ -360,17 +365,28 @@ namespace Volian.Controls.Library btnInsTable.SubItems.Clear(); btnInsSubstep.SubItems.Clear(); + if (docontextmenus) + { + btnCMInsHLS.SubItems.Clear(); + btnCMInsCaution.SubItems.Clear(); + btnCMInsNote.SubItems.Clear(); + btnCMInsFigure.SubItems.Clear(); + btnCMInsTable.SubItems.Clear(); + btnCMInsSubStps.SubItems.Clear(); + btnCMInsRNO.SubItems.Clear(); + } // if (rno is enabled, set the tag: if (btnInsRNO.Enabled) btnInsRNO.Tag = string.Format("{0} {1}", (int)E_FromTypes.RNOs, MyStepItem.MyItemInfo.ActiveFormat.PlantFormat.FormatData.GetIndexFromType("RNOType")); // add subitems depending on whether parent type is enabled: - if (btnInsHLS.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.HLS, sd, btnInsHLS, 0); - if (btnInsCaut.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Caution, sd, btnInsCaut, (int)E_FromType.Caution); - if (btnInsNote.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Note, sd, btnInsNote, (int)E_FromType.Note); - if (btnInsFig.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Fig, sd, btnInsFig, (int)E_FromType.Table); - if (btnInsTable.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Table, sd, btnInsTable, (int)E_FromType.Table); - if (btnInsSubstep.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Substep, sd, btnInsSubstep, (int)E_FromType.Step); + if (btnInsHLS.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.HLS, sd, btnInsHLS, 0, btnCMInsHLS, docontextmenus); + if (btnInsCaut.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Caution, sd, btnInsCaut, (int)E_FromType.Caution, btnCMInsCaution, docontextmenus); + if (btnInsNote.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Note, sd, btnInsNote, (int)E_FromType.Note, btnCMInsNote, docontextmenus); + if (btnInsFig.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Fig, sd, btnInsFig, (int)E_FromType.Table, btnCMInsFigure, docontextmenus); + if (btnInsTable.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Table, sd, btnInsTable, (int)E_FromType.Table, btnCMInsTable, docontextmenus); + if (btnInsSubstep.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.Substep, sd, btnInsSubstep, (int)E_FromType.Step, btnCMInsSubStps, docontextmenus); + if (btnInsRNO.Enabled) GalleryForSubTypes(MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepDataList.RNO, sd, btnInsRNO, 0, btnCMInsRNO, docontextmenus); btnInsTrans.Enabled = btnCMTransition.Enabled = btnInsRO.Enabled = btnCMRO.Enabled = true; } @@ -382,7 +398,8 @@ namespace Volian.Controls.Library /// StepData: find subtypes related to this /// StepData: this should be selected button /// DevComponents.DotNetBar.ButtonItem: if items in the gallery, add gallery to this button - private void GalleryForSubTypes(StepData sdc, StepData selType, DevComponents.DotNetBar.ButtonItem btn, int fromtype) + /// DevComponents.DotNetBar.ButtonItem: if items in the gallery, add btns to context menu + private void GalleryForSubTypes(StepData sdc, StepData selType, DevComponents.DotNetBar.ButtonItem btn, int fromtype, DevComponents.DotNetBar.ButtonItem cmbtn, bool docontextmenus) { int cursel = -1; // The first argument (boolean) in StepGetLevelTypes provides the option to get a complete list of step types @@ -392,6 +409,7 @@ namespace Volian.Controls.Library List sdl = MyItemInfo.ActiveFormat.PlantFormat.FormatData.StepGetLevelTypes(getall, sdc, ref cursel, selType.Type, MyItemInfo); if (sdl != null && sdl.Count > 0) { + Char kt = 'A'; // start with letter A for KeyTips foreach (StepDataRetval sdr in sdl) { bool addit = true; @@ -414,22 +432,59 @@ namespace Volian.Controls.Library bi.Text = sdr.Name; bi.Tag = string.Format("{0} {1}", fromtype, sdr.Index); // index of type to insert it when button is clicked bi.Checked = (sd.Type == selType.Type); + if (docontextmenus) + { + DevComponents.DotNetBar.ButtonItem cmbi = new DevComponents.DotNetBar.ButtonItem("cmbtn" + sd.Type, sd.Type); + cmbi.ButtonStyle = DevComponents.DotNetBar.eButtonStyle.TextOnlyAlways; + cmbi.Text = sdr.Name; + cmbi.Tag = string.Format("{0} {1}", fromtype, sdr.Index); // index of type to insert it when button is clicked + cmbi.Checked = (sd.Type == selType.Type); + cmbi.Click += new System.EventHandler(btnInsStep_Click); + cmbtn.SubItems.Add(cmbi); + } if (MyItemInfo.IsHigh && hlsSubType != -1 && sdr.Index == hlsSubType) bi.Checked = true; bi.Click += new System.EventHandler(btnInsStep_Click); + // Assign only A-Z to the KeyTips in the list (i.e. assign only the first 24 in the list) + // Note that KeyTips logic support only single characters at this level (can't have 'AA' for example) + if (kt != '0') + { + bi.KeyTips = kt.ToString(); + if (kt == 'Z') + kt = '0'; + else + kt++; + } btn.SubItems.Add(bi); } } // if only 1, be sure event exists on button to insert item & if more than 1 remove event because // we want the drop down to appear. - btn.Click -= new System.EventHandler(btnInsStep_Click); + if (btn.Name != "btnInsRNO") + btn.Click -= new System.EventHandler(btnInsStep_Click); + if (docontextmenus) + cmbtn.Click -= new System.EventHandler(btnInsStep_Click); if (btn.SubItems.Count == 1) { btn.SubItems.Clear(); - btn.Tag = string.Format("{0} {1}", fromtype, sdc.Index); - btn.Click += new System.EventHandler(btnInsStep_Click); + if (btn.Name != "btnInsRNO") + { + btn.Tag = string.Format("{0} {1}", fromtype, sdc.Index); + btn.Click += new System.EventHandler(btnInsStep_Click); + } + if (docontextmenus) + { + cmbtn.SubItems.Clear(); + DevComponents.DotNetBar.ButtonItem cmbi = new DevComponents.DotNetBar.ButtonItem("cmbtn" + sdc.Type, sdc.Type); + cmbi.ButtonStyle = DevComponents.DotNetBar.eButtonStyle.TextOnlyAlways; + cmbi.Text = btn.Text; + if (btn.Name == "btnInsRNO") + cmbi.Tag = btn.Tag; + else + cmbi.Tag = string.Format("{0} {1}", fromtype, sdc.Index); // index of type to insert it when button is clicked + cmbi.Click += new System.EventHandler(btnInsStep_Click); + cmbtn.SubItems.Add(cmbi); + } } - //else - // btn.Click -= new System.EventHandler(btnInsStep_Click); } } #endregion @@ -439,8 +494,9 @@ namespace Volian.Controls.Library DevComponents.DotNetBar.ButtonItem b = (DevComponents.DotNetBar.ButtonItem)sender; _MyStepRTB.InsertSymbol(Convert.ToInt32(b.Tag)); } - private void btnInsPgBrk_Click(object sender, EventArgs e) + public void btnInsPgBrk_Click(object sender, EventArgs e) { + rtabInsert.Select(); if (MyItemInfo.IsProcedure || MyItemInfo.IsSection) return; // toggle manual page break @@ -707,9 +763,6 @@ namespace Volian.Controls.Library private void btnBookmarks_Click(object sender, EventArgs e) { - //_RibbonControl.KeyTipsEnabled = true; - - //SendKeys.Send("{F10}"); StepPanelTabDisplayEventArgs args = new StepPanelTabDisplayEventArgs("Bookmarks"); MyStepItem.MyStepPanel.OnTabDisplay(sender, args); } @@ -726,7 +779,7 @@ namespace Volian.Controls.Library MyStepItem.MyStepPanel.OnTabDisplay(sender, args); } - private void btnAnnots_Click(object sender, EventArgs e) + public void btnAnnots_Click(object sender, EventArgs e) { StepPanelTabDisplayEventArgs args = new StepPanelTabDisplayEventArgs("Annots"); MyStepItem.MyStepPanel.OnTabDisplay(sender, args); @@ -769,6 +822,56 @@ namespace Volian.Controls.Library } } + private void btnCMIns_PopupClose(object sender, EventArgs e) + { + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, _DefaultContextMenu); + } + + public void ShortCutContextMenu(string menuName) + { + bool displayMenu = true; + switch (menuName) + { + case "InsHLS": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsHLS); + break; + case "InsRNO": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsRNO); + break; + case "InsSubStps": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsSubStps); + break; + case "InsCaution": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsCaution); + break; + case "InsNote": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsNote); + break; + case "InsTable": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsTable); + break; + case "InsFigure": + _ContextMenuBar.SetContextMenuEx(_MyStepRTB, btnCMInsFigure); + break; + default: + displayMenu = false; + break; + } + if (displayMenu) + { + SendKeys.Send("+{F10}{DOWN}"); // Display Context menu + } + } + + private void btnSpell_Click(object sender, EventArgs e) + { + MessageBox.Show("Functionality not available.", "Spell Check"); + } + + private void btnFindRplDlg_Click(object sender, EventArgs e) + { + MessageBox.Show("Functionality not available.", "Find/Replace"); + } } public enum E_FieldToEdit { StepText, Text, Number }; diff --git a/PROMS/Volian.Controls.Library/StepTabRibbon.designer.cs b/PROMS/Volian.Controls.Library/StepTabRibbon.designer.cs index c8da55c5bc53ea3c2dd0fa576d879634f1407a97..23c0910554b0e34f0507c6b013f8a8d07554a726 100644 GIT binary patch delta 3325 zcmbtXeN5En9e=(L$4!poJm5rx3I{4_5cI&8u+9-cN0C`Pk6UwX8GsQYY;m2m z+gdf7JNuwtvakjkn=NK@%v=05eR0|}&du#SS!;j zzuevPd|y7#_x<_ZG@AV{WsK)kh|qSs7)q-VHH|f=LtqJ%R`?#k@KJ6Fcy>*iUad7@ z%_?pb_ttF_q3SAqbH?!;hCSSr-pmfNJ*=7aF`vl%_VbFHx|OxFgQBQoxfreP(iIvi z`(j948~UT`w0gFeJxv%rVm`-wB~ga&cI zTqvf0niKfh$!aeAN33!qp1SLzUz>0R9f5n|Y>o(@d{l(bE)j+|+Oi*JUgoBcow?Xf z`u4IOyfFgH*Vt+E1XLcF#r}^6(}x z_dA0K&6vc#&vF8unIMR^|9BL!ZP^mx8f_E5ykNobE^azfMzF>7=)Z0{u7fCFJ^Be& z&o-z-pCSJ9#P3yxc$wVW*&#A=KRtG$dMRK}(^}H|2(O1I2Z_=}`}UZWq<656BSd_X z$i1}bWe>3yBDb*a*l#)Uzr%d=bPy*lE9Hu5zm{b%6H7~Yij}_9+d&5(T0~FcOTL?o zUfLJ2G-8Cvyeh<{X$xN3#a)3Pf8qvoH1j$U&ZB_dwhH?lmt14GnQsg9&mRAYOePk1 z!7Rgyt9u})NDp5v0WY4lM`YHdjs?Hx<=fOs>+FF+gQ|?0KN@hn6Rg5L+KP1tAq!op zJU1h;3KW7ML2a%dN;5^<2U!?;1x)Df2De--!SkD-3LifXW_&H1m!SO^bQE=7-bp%m?$InsI z$aZj)WvROC9?V#K{dOq(;YV6-ilW zP-YR9Mf1G}t;UEWMs)lEEYh3&WO#iR$;Md}u30s+qfF^rwZC75cT$C8`Z%7r19ow~ z_W^YNg;H@k2=&T|xof%;*~zE4SQFd1&{&r;mUJvQ7laAC7beiR21?X;9Y1Wqq0eBS zkc%%rfFWAg@WgErnLeBs6EQr)TZHpPqZYgl6DiUNIgrKdt*?5j1}yoxmpZUp*`nv- z)Kd60saUlOe}xehFRZz!SNgJKFPcb`;GreSc8Y^7?ORlGvI2T^3+Bm!;V#BJJUBd-H=Pr(ihE#X$} zxv%lr^rc&9npRV-Zei=?O52^yUw{a;J4T(c#i_0+Rm|_L(EK^PDk^^{#<~34HQL;A zIxm7$8|7%5R`4fN)P;)^#k^A8m*{>MHmVyIL(x^@U5jHbs8D?Uvc&_B^Ka;y^%r5Y zuKChMnndcBPKdCmJ(iD7JGbMRW@t>=$To?~?-VMEc5WrFgpAGX>#RcER~uLb9(arA zqkknY_(e$}e@s}uY1WRu%wJ!RbM@SW-w$#l{`(?0^b^V+lzFt57 z(zVF>sd{go^zg^9CI|&+{Q);%YcOiS-C)Fkr-EQRT|_aE_9w-4z8lKbsTm1xHmnyV zW|Cl$mltO0b(|oHV*^m6^pk|!--cz<^CV(SbX5WXd47MZ_=Lh6bqN zDSN3NdVlN$h4w?CIMNJ{M^We?*o77cyOq*jEaKUnvdDD6mjWv3fp9^X?Ka*H7Bi4W znS(804w`WV7E!nxY*gI^vqiKAJfo;03Es{(kS{8(!Vi@)x53Y~_*hEc0!8$v;GsmJ zUhq?E9~6mT9|Xqm(Co2d?t)5*DU!lFGG!F~2%1>) z0oo;=bQg+CLvT(O*>4b#sr{$XFN-)yCQZRY+M}XIcg=W_{O@2pxm1+J1`9T;RBgi| zaeM+k)1XmoD?OszgNQ=Jb#OHQ`;PszRoSP6z%BT@@-qm(y{Yvv($EzYIH1=M)M zUOPnt=%7l!F{6UkS+VrDL-hL5111mivU2f#3D&IoM=$Pk({rj&M>KA$!xh8xX#F)D z-%^d?ZP#dm~qI(Y#H+~H+?#a<&+#Sm{|P+Pn#&a70tqT9+Pv#&}(!QkDNvq RhA=J?lC)($#j2$