From 8a8b286c7761bb58706d9c70999cc8b6035bff80 Mon Sep 17 00:00:00 2001 From: Jonathan Jenne Date: Fri, 13 Sep 2019 16:05:20 +0200 Subject: [PATCH] zooflow --- Message/EventBus.vb | 63 +++ Message/Messaging.vbproj | 1 + Modules/ZooFlow/ClassProfileFilter.vb | 483 ------------------ Modules/ZooFlow/ZooFlow.vbproj | 1 - ZooFlow/ClassFlowForm.vb | 27 + ZooFlow/ClassPatterns.vb | 302 +++++++++++ ZooFlow/ClassProfileFilter.vb | 58 ++- ZooFlow/Events/OnFlowFormInteractionEvent.vb | 11 + ZooFlow/Events/OnFlowFormStateChangedEvent.vb | 12 + ZooFlow/My Project/Resources.Designer.vb | 38 +- ZooFlow/My Project/Resources.resx | 17 +- ZooFlow/Resources/CW_GEFUNDEN_klein.png | Bin 0 -> 20252 bytes ZooFlow/Resources/CW_klein.png | Bin 0 -> 17999 bytes ZooFlow/Resources/GLOBIX_GEFUNDEN_klein.png | Bin 0 -> 18788 bytes ZooFlow/Resources/GLOBIX_klein.png | Bin 0 -> 15495 bytes ZooFlow/Resources/ZOOFLOW_Home_klein.png | Bin 0 -> 17587 bytes ZooFlow/ZooFlow.vbproj | 26 +- ZooFlow/frmFlowForm.vb | 57 ++- ZooFlow/frmMain.vb | 52 +- 19 files changed, 621 insertions(+), 527 deletions(-) create mode 100644 Message/EventBus.vb delete mode 100644 Modules/ZooFlow/ClassProfileFilter.vb create mode 100644 ZooFlow/ClassPatterns.vb create mode 100644 ZooFlow/Events/OnFlowFormInteractionEvent.vb create mode 100644 ZooFlow/Events/OnFlowFormStateChangedEvent.vb create mode 100644 ZooFlow/Resources/CW_GEFUNDEN_klein.png create mode 100644 ZooFlow/Resources/CW_klein.png create mode 100644 ZooFlow/Resources/GLOBIX_GEFUNDEN_klein.png create mode 100644 ZooFlow/Resources/GLOBIX_klein.png create mode 100644 ZooFlow/Resources/ZOOFLOW_Home_klein.png diff --git a/Message/EventBus.vb b/Message/EventBus.vb new file mode 100644 index 00000000..fed4b4da --- /dev/null +++ b/Message/EventBus.vb @@ -0,0 +1,63 @@ +Imports System.Reflection + +''' +''' A Simple EventBus for .NET +''' https://stackoverflow.com/questions/368265/a-simple-event-bus-for-net +''' +Public Class EventBus + Private Shared _Instance As EventBus + Private _Listeners As List(Of EventListenerWrapper) = New List(Of EventListenerWrapper)() + + Public Shared ReadOnly Property Instance As EventBus + Get + If IsNothing(_Instance) Then + _Instance = New EventBus() + End If + Return _Instance + End Get + End Property + + Public Sub Register(ByVal listener As Object) + If Not _Listeners.Any(Function(l) l.Listener.Equals(listener)) Then + _Listeners.Add(New EventListenerWrapper(listener)) + End If + End Sub + + Public Sub Unregister(ByVal listener As Object) + _Listeners.RemoveAll(Function(l) l.Listener = listener) + End Sub + + Public Sub PostEvent(ByVal e As Object) + _Listeners. + Where(Function(l) l.EventType = e.[GetType]()). + ToList(). + ForEach(Sub(l) l.PostEvent(e)) + End Sub + + + + Private Class EventListenerWrapper + Public Property Listener As Object + Public Property EventType As Type + Private _method As MethodBase + + Public Sub New(ByVal listener As Object) + Me.Listener = listener + Dim oType As Type = listener.[GetType]() + _method = oType.GetMethod("OnEvent") + If _method Is Nothing Then + Throw New ArgumentException("Class " & oType.Name & " does not containt method OnEvent") + End If + Dim oParameters As ParameterInfo() = _method.GetParameters() + + If oParameters.Length <> 1 Then + Throw New ArgumentException("Method OnEvent of class " & oType.Name & " have invalid number of parameters (should be one)") + End If + EventType = oParameters(0).ParameterType + End Sub + + Public Sub PostEvent(ByVal e As Object) + _method.Invoke(Listener, {e}) + End Sub + End Class +End Class diff --git a/Message/Messaging.vbproj b/Message/Messaging.vbproj index a26b52c0..2aed5974 100644 --- a/Message/Messaging.vbproj +++ b/Message/Messaging.vbproj @@ -82,6 +82,7 @@ + True diff --git a/Modules/ZooFlow/ClassProfileFilter.vb b/Modules/ZooFlow/ClassProfileFilter.vb deleted file mode 100644 index bb00d69b..00000000 --- a/Modules/ZooFlow/ClassProfileFilter.vb +++ /dev/null @@ -1,483 +0,0 @@ -Imports System.Drawing -Imports System.Windows.Forms -Imports System.Text.RegularExpressions -Imports DigitalData.Modules.Logging -Imports DigitalData.Modules.Windows -Imports DigitalData.Modules.Language.Utils -Imports DigitalData.Modules.ZooFlow.Params - -Public Class ClassProfileFilter - Private _ProfileTable As DataTable - Private _ProcessTable As DataTable - Private _WindowTable As DataTable - Private _ControlTable As DataTable - Private _Profiles As List(Of ProfileData) - Private _Logger As Logger - Private _TreeView As TreeView - Private _Window As Window - - Public ReadOnly Property Profiles As List(Of ProfileData) - Get - Return _Profiles - End Get - End Property - - Public Sub New(LogConfig As LogConfig, ProfileDatatable As DataTable, ProcessTable As DataTable, WindowDatatable As DataTable, ControlDatatable As DataTable, ImageList As ImageList) - Try - _Logger = LogConfig.GetLogger() - _ProfileTable = ProfileDatatable - _ProcessTable = ProcessTable - _WindowTable = WindowDatatable - _ControlTable = ControlDatatable - _Profiles = TransformProfiles() - _Window = New Window(LogConfig) - - _TreeView.Nodes.Clear() - _TreeView.ImageList = ImageList - _TreeView.SelectedImageIndex = 0 - Catch ex As Exception - _Logger.Error(ex) - Throw ex - End Try - End Sub - - Public Function ToList() As List(Of ProfileData) - Return _Profiles - End Function - - Private Function FindNode(ByVal Node As TreeNode, SearchTerm As String) - Dim oNode As TreeNode - For Each oNode In Node.Nodes - If oNode.Text = SearchTerm Then - Return oNode - End If - Next - Return Node - End Function - - Private Function GetLowestNode(ByVal Node As TreeNode) As TreeNode - If Node.GetNodeCount(False) = 1 Then - Return GetLowestNode(Node.Nodes.Item(0)) - Else - Return Node - End If - End Function - - Public Function FilterProfilesByClipboardRegex(Profiles As List(Of ProfileData), ClipboardContents As String) As List(Of ProfileData) - Dim oFilteredProfiles As New List(Of ProfileData) - For Each oProfile In Profiles - _Logger.Debug("Current Profile: {0}", oProfile.Name) - - Try - Dim oRegex As New Regex(oProfile.Regex) - Dim oMatch = oRegex.Match(ClipboardContents) - If oMatch.Success Then - _Logger.Debug("FilterProfilesByClipboardRegex: Clipboard Regex Matched: {0}", ClipboardContents) - 'TODO: Add Debug Data - oFilteredProfiles.Add(oProfile) - oProfile.IsMatched = True - Dim oNode As New TreeNode($"Profile: {oProfile.Name}") - oNode.ImageIndex = 0 - Dim f = New Font("Tahoma", 9, FontStyle.Bold) - oNode.NodeFont = f - _TreeView.Nodes.Add(oNode) - Dim oSubnode As New TreeNode($"MATCH on Global Clipboard Regex: {oProfile.Regex}") - oSubnode.ImageIndex = 1 - oSubnode.Tag = oProfile.Name & "-REGEX" - oNode.Nodes.Add(oSubnode) - - End If - Catch ex As Exception - _Logger.Warn("Regex '{0}' could not be processed for input '{1}'", oProfile.Regex, ClipboardContents) - _Logger.Error(ex) - End Try - Next - - Return oFilteredProfiles - End Function - Public Function FilterProfilesByProcess(Profiles As List(Of ProfileData), CurrentProcessName As String) As List(Of ProfileData) - Dim oFilteredProfiles As New List(Of ProfileData) - Try - For Each oProfile In Profiles - Dim oGuid = oProfile.Guid - - If oProfile.IsMatched = False Then - Continue For - End If - - - Dim oProcesses As New List(Of ProfileData.ProcessData) - For Each oProcessDef As ProfileData.ProcessData In oProfile.Processes - If oProcessDef.ProfileId <> oGuid Then - Continue For - End If - _Logger.Debug($"FilterProfilesByProcess: Checking Profile: {oProfile.Name} ...") - If oProcessDef.ProcessName.ToLower = CurrentProcessName.ToLower Then - _Logger.Debug($"Yes...Processname Matched: {oProcessDef.ProcessName}") - 'oProfile.MATCH_PROCESSNAME = $"Processname Matched: {oProfile.ProcessName}" - 'TODO: Add Debug Data - oFilteredProfiles.Add(oProfile) - oProfile.MatchedProcessID = oProcessDef.Guid - oProcessDef.IsMatched = True - oProcesses.Add(oProcessDef) - oProfile.IsMatched = True - oProfile.MatchedProcessID = oProcessDef.Guid - Dim oParentNode As TreeNode - Dim oExit = False - For Each oTreeNode As TreeNode In _TreeView.Nodes - For Each oNodes As TreeNode In oTreeNode.Nodes - If oExit = True Then Exit For - If oNodes.Tag = oProfile.Name & "-REGEX" Then - oParentNode = oNodes - oExit = True - Exit For - End If - Next - Next - - If Not IsNothing(oParentNode) Then - Dim oNode As New TreeNode($"MATCH on Process: {oProcessDef.ProcessName}") - oNode.ImageIndex = 4 - oNode.Tag = oProfile.Name & "-PROCESS" - oParentNode.Nodes.Add(oNode) - End If - End If - Next - If oFilteredProfiles.Count > 0 Then - oProfile.Processes = oProcesses - End If - Next - - Return oFilteredProfiles - Catch ex As Exception - _Logger.Warn("Unexpected error in FilterProfilesByProcess...") - _Logger.Error(ex) - End Try - - End Function - Public Function FilterWindowsByWindowTitleRegex(Profiles As List(Of ProfileData), WindowTitle As String) As List(Of ProfileData) - Dim oProfiles As New List(Of ProfileData) - - For Each oProfile As ProfileData In Profiles - _Logger.Debug("Checking WindowDefinition for profile: {0}...", oProfile.Name) - If oProfile.IsMatched = False Then Continue For - Dim oWindows As New List(Of ProfileData.WindowData) - - For Each oWindowDef As ProfileData.WindowData In oProfile.Windows - If oWindowDef.WindowProcessID <> oProfile.MatchedProcessID Then Continue For - Try - If oWindowDef.Regex = String.Empty Then - oProfile.MatchedWindowID = oWindowDef.Guid - oWindowDef.IsMatched = True - oWindows.Add(oWindowDef) - Exit For - End If - - Dim oRegex As New Regex(oWindowDef.Regex) - Dim oMatch = oRegex.Match(WindowTitle) - - If oMatch.Success Then - _Logger.Debug("MATCH on WindowTitle: {0}", WindowTitle) - 'TODO: Add Debug Data - oProfile.MatchedWindowID = oWindowDef.Guid - oWindowDef.IsMatched = True - oWindows.Add(oWindowDef) - Dim olowestNode As TreeNode = Node_Get_Lowest_Node(oProfile.Name & "-REGEX") - If Not IsNothing(olowestNode) Then - Dim oNode As New TreeNode($"MATCH on WindowTitle: [{WindowTitle}]") - oNode.ImageIndex = 3 - oNode.Tag = oProfile.Name & "-WINDOW" - olowestNode.Nodes.Add(oNode) - End If - Exit For - End If - Catch ex As Exception - _Logger.Warn("Regex '{0}' could not be processed for input '{1}'", oWindowDef.Regex, WindowTitle) - _Logger.Error(ex) - End Try - Next - - If oWindows.Count > 0 Then - oProfile.Windows = oWindows - oProfile.IsMatched = True - oProfiles.Add(oProfile) - End If - Next - - Return oProfiles - End Function - - Public Function FilterWindowsByWindowClipboardRegex(Profiles As List(Of ProfileData), ClipboardContents As String) As List(Of ProfileData) - Dim oProfiles As New List(Of ProfileData) - - For Each oProfile As ProfileData In Profiles - _Logger.Debug("Current Profile: {0}", oProfile.Name) - - Dim oWindows As New List(Of ProfileData.WindowData) - - For Each w As ProfileData.WindowData In oProfile.Windows - Try - If w.Regex = String.Empty Then - oWindows.Add(w) - End If - - Dim oRegex As New Regex(w.Regex) - Dim oMatch = oRegex.Match(ClipboardContents) - - If oMatch.Success Then - _Logger.Debug("Window Clipboard Regex Matched: {0}", ClipboardContents) - Dim oResult As TreeNode - For Each oTreeNode In _TreeView.Nodes - If Not IsNothing(oResult) Then Exit For - If oTreeNode.Tag = oProfile.Name & "-REGEX" Then - oResult = oTreeNode - End If - - - Next - If Not IsNothing(oResult) Then - Dim oNode As New TreeNode($"MATCH on WINDOW Clipboard Regex: [{w.Regex}]") - oNode.ImageIndex = 2 - oNode.Tag = oProfile.Name & "-WINDOW_REGEX" - Dim olowestNode As TreeNode = GetLowestNode(oResult) - olowestNode.Nodes.Add(oNode) - End If - - oWindows.Add(w) - - - End If - Catch ex As Exception - _Logger.Warn("Regex '{0}' could not be processed for input '{1}'", w.Regex, ClipboardContents) - _Logger.Error(ex) - End Try - Next - - If oWindows.Count > 0 Then - oProfile.Windows = oWindows - oProfiles.Add(oProfile) - End If - Next - - Return oProfiles - End Function - - Public Function FilterProfilesByFocusedControl(Profiles As List(Of ProfileData), ClipboardContents As String, ControlFocusresult As String) As List(Of ProfileData) - Dim oWindow As Window.WindowInfo - Dim oFocusedControl As Window.WindowInfo - Dim oFocusedControlName As String = String.Empty - - Try - oWindow = _Window.GetWindowInfo() - oFocusedControl = _Window.GetFocusedControl(oWindow.hWnd) - - If oFocusedControl Is Nothing Then - _Logger.Info("Could not get FocusedControl in Window (Old method) {0}", oWindow.WindowTitle) - oFocusedControlName = String.Empty - Else - oFocusedControlName = oFocusedControl.ControlName - End If - Catch ex As Exception - _Logger.Warn("Error while getting Focused control (Old method)") - _Logger.Error(ex) - oFocusedControlName = String.Empty - End Try - - Dim oFilteredProfiles As New List(Of ProfileData) - - For Each oProfileMatchedSofar In Profiles - If oProfileMatchedSofar.IsMatched = False Then Continue For - - _Logger.Debug("Checking ControlDefiniotion on profile: {0}", oProfileMatchedSofar.Name) - If oProfileMatchedSofar.Controls.Count = 0 Then - oFilteredProfiles.Add(oProfileMatchedSofar) - - Dim oNode As New TreeNode($"No Controls configured!") - oNode.ImageIndex = 2 - oNode.ForeColor = Color.Blue - oNode.Tag = oProfileMatchedSofar.Name & "-NOCONTROLCONFIG" - Dim f = New Font("Tahoma", 10, FontStyle.Bold) - oNode.NodeFont = f - _TreeView.Nodes.Add(oNode) - Continue For - End If - - Dim oControls As New List(Of ProfileData.ControlData) - - For Each oControlDefinition In oProfileMatchedSofar.Controls - Try - If oControlDefinition.WindowId <> oProfileMatchedSofar.MatchedWindowID Then Continue For - _Logger.Debug($"Working on ControlDefinition: {oControlDefinition.Guid}-{oControlDefinition.ControlName}...") - If oControlDefinition.Regex = String.Empty Then - oProfileMatchedSofar.MatchedControlID = oControlDefinition.Guid - oControlDefinition.IsMatched = True - oControls.Add(oControlDefinition) - Exit For - End If - 'Dim oResult As TreeNode - 'For Each oTreeNode In CurrMatchTreeView.Nodes - ' oResult = NodeFind(oTreeNode, $"Global Clipboard Regex Matched [{oProfile.Regex}]") - 'Next - 'Dim oNode As TreeNode - Dim oNodeCaption As String - 'Dim oAddNode As Boolean = False - Dim oRegex As New Regex(oControlDefinition.Regex) - - Dim oFocusedControlResult As String = "" - - If oControlDefinition.AutomationId <> String.Empty And oControlDefinition.ControlName = String.Empty Then - _Logger.Debug($"AutomationID should be used...") - If Not IsNothing(ControlFocusresult) Then - If ControlFocusresult <> String.Empty Then - _Logger.Debug($"AutomationID will be used...") - oFocusedControlResult = ControlFocusresult - End If - End If - ElseIf oControlDefinition.AutomationId = String.Empty And oControlDefinition.ControlName <> String.Empty Then - _Logger.Debug($"ControlName should be used...") - If Not IsNothing(oFocusedControlName) Then - If oFocusedControlName <> String.Empty Then - _Logger.Debug($"ControlName will be used...") - oFocusedControlResult = oFocusedControlName - End If - End If - - End If - If oFocusedControlResult <> String.Empty Then - Dim oControlRegex As New Regex(oControlDefinition.Regex) - Dim oControlMatch = oRegex.Match(oFocusedControlResult) - - If oControlMatch.Success Then - _Logger.Debug($"MATCH on Focused Control [{oFocusedControlResult}] with Regex [{oControlDefinition.Regex}]") - oProfileMatchedSofar.IsMatched = True - oProfileMatchedSofar.MatchedControlID = oControlDefinition.Guid - oControlDefinition.IsMatched = True - oControls.Add(oControlDefinition) - Dim olowestNode As TreeNode = Node_Get_Lowest_Node(oProfileMatchedSofar.Name & "-REGEX") - If Not IsNothing(olowestNode) Then - Dim oNode As New TreeNode($"MATCH on Focused Control [{oFocusedControlResult}] with Regex [{oControlDefinition.Regex}]") - oNode.ImageIndex = 2 - oNode.Tag = oProfileMatchedSofar.Name & "-CONTROL" - olowestNode.Nodes.Add(oNode) - End If - Exit For - End If - End If - Catch ex As Exception - _Logger.Warn("Regex '{0}' could not be processed for input '{1}'", oControlDefinition.Regex, oFocusedControlName) - _Logger.Error(ex) - End Try - Next - - If oControls.Count > 0 Then - oProfileMatchedSofar.Controls = oControls - oFilteredProfiles.Add(oProfileMatchedSofar) - Else - Dim olowestNode As TreeNode = Node_Get_Lowest_Node(oProfileMatchedSofar.Name & "-REGEX") - If Not IsNothing(olowestNode) Then - Dim oNode As New TreeNode($"NO MATCHES on Focused Control, Please check the Config") - oNode.ImageIndex = 2 - oNode.Tag = oProfileMatchedSofar.Name & "-CONTROLNoMatch" - olowestNode.Nodes.Add(oNode) - End If - End If - Next - - Return oFilteredProfiles - End Function - Private Function Node_Get_Lowest_Node(NodeTag As String) As TreeNode - Dim oExit = False - Dim oParentNode As TreeNode - For Each oTreeNode As TreeNode In _TreeView.Nodes - For Each oNodes As TreeNode In oTreeNode.Nodes - If oExit = True Then Exit For - If oNodes.Tag = NodeTag Then - oParentNode = oNodes - oExit = True - Exit For - End If - Next - Next - Dim olowestNode As TreeNode = GetLowestNode(oParentNode) - - Return olowestNode - End Function - Public Function ClearNotMatchedProfiles(Profiles As List(Of ProfileData)) As List(Of ProfileData) - Dim oFilteredProfiles As New List(Of ProfileData) - For Each oProfile In Profiles - If oProfile.IsMatched Then - oFilteredProfiles.Add(oProfile) - End If - Next - Return oFilteredProfiles - End Function - Private Function TransformProfiles() As List(Of ProfileData) - Dim oList As New List(Of ProfileData) - - For Each oRow As DataRow In _ProfileTable.Rows - Dim oProfileId = oRow.Item("GUID") - Dim oProcessList As List(Of ProfileData.ProcessData) = TransformProcesses(oProfileId, _ProcessTable) - Dim oWindowList As List(Of ProfileData.WindowData) = TransformWindows(oProfileId, _WindowTable) - Dim oControlList As List(Of ProfileData.ControlData) = TransformControls(oProfileId, _ControlTable) - - oList.Add(New ProfileData() With { - .Guid = oRow.Item("GUID"), - .Regex = NotNull(oRow.Item("REGEX_EXPRESSION"), String.Empty), - .Name = NotNull(oRow.Item("NAME"), String.Empty), - .Comment = NotNull(oRow.Item("COMMENT"), String.Empty), - .ProfileType = NotNull(oRow.Item("PROFILE_TYPE"), String.Empty), - .Processes = oProcessList, - .Windows = oWindowList, - .Controls = oControlList - }) - Next - - Return oList - End Function - - Private Function TransformControls(ProfileId As Integer, ControlDatatable As DataTable) As List(Of ProfileData.ControlData) - Dim oControlList As New List(Of ProfileData.ControlData) - - For Each oRow As DataRow In ControlDatatable.Rows - If oRow.Item("PROFILE_ID") = ProfileId Then - oControlList.Add(New ProfileData.ControlData() With { - .Guid = oRow.Item("GUID"), - .Description = NotNull(oRow.Item("DESCRIPTION"), String.Empty), - .Regex = NotNull(oRow.Item("REGEX"), String.Empty), - .AutomationId = NotNull(oRow.Item("AUTOMATION_ID"), String.Empty), - .WindowId = oRow.Item("WINDOW_ID") - }) - End If - Next - - Return oControlList - End Function - Private Function TransformProcesses(ProfileId As Integer, ProcessDatatable As DataTable) As List(Of ProfileData.ProcessData) - Dim oProcessList As New List(Of ProfileData.ProcessData) - - For Each oRow As DataRow In ProcessDatatable.Rows - oProcessList.Add(New ProfileData.ProcessData() With { - .Guid = oRow.Item("GUID"), - .ProfileId = oRow.Item("PROFILE_ID"), - .ProcessName = NotNull(oRow.Item("PROC_NAME"), String.Empty) - }) - Next - - Return oProcessList - End Function - Private Function TransformWindows(ProfileId As Integer, WindowDatatable As DataTable) As List(Of ProfileData.WindowData) - Dim oWindowList As New List(Of ProfileData.WindowData) - - For Each oRow As DataRow In WindowDatatable.Rows - oWindowList.Add(New ProfileData.WindowData() With { - .Guid = oRow.Item("GUID"), - .WindowProcessID = oRow.Item("PROCESS_ID"), - .Title = NotNull(oRow.Item("DESCRIPTION"), String.Empty), - .Regex = NotNull(oRow.Item("REGEX"), String.Empty), - .Sequence = NotNull(oRow.Item("SEQUENCE"), 0) - }) - Next - - Return oWindowList - End Function -End Class diff --git a/Modules/ZooFlow/ZooFlow.vbproj b/Modules/ZooFlow/ZooFlow.vbproj index 53da6caa..6e22bcfa 100644 --- a/Modules/ZooFlow/ZooFlow.vbproj +++ b/Modules/ZooFlow/ZooFlow.vbproj @@ -74,7 +74,6 @@ - diff --git a/ZooFlow/ClassFlowForm.vb b/ZooFlow/ClassFlowForm.vb index d2da8887..c294eac0 100644 --- a/ZooFlow/ClassFlowForm.vb +++ b/ZooFlow/ClassFlowForm.vb @@ -51,6 +51,9 @@ Class Win32 Public Const AC_SRC_OVER As Byte = &H0 Public Const AC_SRC_ALPHA As Byte = &H1 + Public Const WM_NCLBUTTONDOWN As Integer = &HA1 + Public Const HTCAPTION As Integer = &H2 + Public Shared Function UpdateLayeredWindow(ByVal hwnd As IntPtr, ByVal hdcDst As IntPtr, ByRef pptDst As Point, ByRef psize As Size, ByVal hdcSrc As IntPtr, ByRef pprSrc As Point, ByVal crKey As Int32, ByRef pblend As BLENDFUNCTION, ByVal dwFlags As Int32) As Bool End Function @@ -72,6 +75,13 @@ Class Win32 Public Shared Function DeleteObject(ByVal hObject As IntPtr) As Bool End Function + + Public Shared Function ReleaseCapture() As Boolean + End Function + + Public Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer + End Function + End Class Public Class ClassFlowForm @@ -81,6 +91,23 @@ Public Class ClassFlowForm TopMost = True End Sub + + + Private Sub Form_Load(ByVal sender As Object, ByVal e As EventArgs) + AddHandler MouseDown, New MouseEventHandler(AddressOf Form_MouseDown) + End Sub + + Private Sub Form_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) Handles MyBase.MouseDown + If e.Button = MouseButtons.Left Then + Win32.ReleaseCapture() + Win32.SendMessage(Handle, Win32.WM_NCLBUTTONDOWN, Win32.HTCAPTION, 0) + End If + End Sub + + Private Sub Form_click(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Click + MsgBox("LOL") + End Sub + Public Sub SetBitmap(ByVal bitmap As Bitmap) SetBitmap(bitmap, 255, bitmap.Width, bitmap.Height) End Sub diff --git a/ZooFlow/ClassPatterns.vb b/ZooFlow/ClassPatterns.vb new file mode 100644 index 00000000..be46d13b --- /dev/null +++ b/ZooFlow/ClassPatterns.vb @@ -0,0 +1,302 @@ +Imports System.Text.RegularExpressions +Imports DigitalData.Modules.Logging +Imports DigitalData.Modules.ZooFlow + +''' +''' Defines common Functions for Checking for and replacing placeholders. +''' This Class also includes a child class `Pattern` for passing around Patterns. +''' +''' The format of all placeholders is: +''' {#TYPE#VALUE} +''' +''' Some Examples: +''' {#INT#USERNAME} +''' {#CTRL#CMB_2} +''' {#WMI#String 39} +''' +Public Class ClassPatterns + ' Complex patterns that rely on a datasource like a Database or Windream + Public Const PATTERN_WMI = "WMI" + Public Const PATTERN_CTRL = "CTRL" + ' Simple patterns that only rely on .NET functions + Public Const PATTERN_INT = "INT" + ' Simple patterns that rely on Data from the TBDD_USER table + Public Const PATTERN_USER = "USER" + + Public Const USER_VALUE_PRENAME = "PRENAME" + Public Const USER_VALUE_SURNAME = "SURNAME" + Public Const USER_VALUE_EMAIL = "EMAIL" + Public Const USER_VALUE_SHORTNAME = "SHORTNAME" + Public Const USER_VALUE_USER_ID = "USER_ID" + Public Const USER_VALUE_PROFILE_ID = "PROFILE_ID" + + Public Const INT_VALUE_USERNAME = "USERNAME" + Public Const INT_VALUE_MACHINE = "MACHINE" + Public Const INT_VALUE_DOMAIN = "DOMAIN" + Public Const INT_VALUE_DATE = "DATE" + + Public Const CLIPBOARD_VALUE_DE = "@Zwischenablage" + Public Const CLIPBOARD_VALUE_EN = "@Clipboard" + + Public Const MAX_TRY_COUNT = 100 + + Private _Logger As Logger + Private _LogConfig As LogConfig + + Private _Regex As Regex = New Regex("{#(\w+)#([\w\s_-]+)}+") + Private _AllPatterns As New List(Of String) From {PATTERN_WMI, PATTERN_CTRL, PATTERN_USER, PATTERN_INT} + Private _ComplexPatterns As New List(Of String) From {PATTERN_WMI, PATTERN_CTRL} + Private _SimplePatterns As New List(Of String) From {PATTERN_USER, PATTERN_INT} + + ''' + ''' Wraps a pattern-type and -value in the common format: {#type#value} + ''' + Public Function WrapPatternValue(type As String, value As String) As String + Return New Pattern(type, value).ToString + End Function + + Public Sub New(LogConfig As LogConfig) + _LogConfig = LogConfig + _Logger = LogConfig.GetLogger + End Sub + + Public Function ReplaceAllValues(input As String, User As State.UserState) As String + Try + Dim result = input + + result = ReplaceInternalValues(result) + result = ReplaceUserValues(result, User) + + Return result + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("Error in ReplaceAllValues:" & ex.Message) + Return input + End Try + End Function + + Public Function ReplaceClipboardContents(Input As String, ClipboardContents As String) As String + Dim oResult = Input + + oResult = oResult.Replace(CLIPBOARD_VALUE_DE.ToLower, ClipboardContents) + oResult = oResult.Replace(CLIPBOARD_VALUE_DE.ToUpper, ClipboardContents) + oResult = oResult.Replace(CLIPBOARD_VALUE_EN.ToLower, ClipboardContents) + oResult = oResult.Replace(CLIPBOARD_VALUE_EN.ToUpper, ClipboardContents) + + Return oResult + End Function + + Public Function ReplaceInternalValues(Input As String) As String + Try + Dim oResult = Input + + ' Replace Username(s) + While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_USERNAME) + oResult = ReplacePattern(oResult, PATTERN_INT, System.Environment.UserName) + End While + + ' Replace Machinename(s) + While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_MACHINE) + oResult = ReplacePattern(oResult, PATTERN_INT, System.Environment.MachineName) + End While + + ' Replace Domainname(s) + While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_DOMAIN) + oResult = ReplacePattern(oResult, PATTERN_INT, System.Environment.UserDomainName) + End While + + ' Replace CurrentDate(s) + While ContainsPatternAndValue(oResult, PATTERN_INT, INT_VALUE_DATE) + oResult = ReplacePattern(oResult, PATTERN_INT, Now.ToShortDateString) + End While + + Return oResult + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("Error in ReplaceInternalValues:" & ex.Message) + Return Input + End Try + End Function + + Public Function ReplaceUserValues(Input As String, User As State.UserState) As String + Try + Dim oResult = Input + + While ContainsPatternAndValue(oResult, PATTERN_USER, USER_VALUE_PRENAME) + oResult = ReplacePattern(Input, PATTERN_USER, User.GivenName) + End While + + While ContainsPatternAndValue(oResult, PATTERN_USER, USER_VALUE_USER_ID) + oResult = ReplacePattern(Input, PATTERN_USER, User.UserId.ToString) + End While + + While ContainsPatternAndValue(oResult, PATTERN_USER, USER_VALUE_SURNAME) + oResult = ReplacePattern(Input, PATTERN_USER, User.Surname) + End While + + While ContainsPatternAndValue(oResult, PATTERN_USER, USER_VALUE_SHORTNAME) + oResult = ReplacePattern(Input, PATTERN_USER, User.ShortName) + End While + + While ContainsPatternAndValue(oResult, PATTERN_USER, USER_VALUE_EMAIL) + oResult = ReplacePattern(Input, PATTERN_USER, User.Email) + End While + + Return oResult + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("Error in ReplaceUserValues:" & ex.Message) + Return Input + End Try + End Function + + Public Function ReplaceControlValues(Input As String, Panel As Panel) As String + Try + Dim oResult = Input + Dim oTryCounter = 0 + + While ContainsPattern(oResult, PATTERN_CTRL) + If oTryCounter > MAX_TRY_COUNT Then + Throw New Exception("Max tries in ReplaceControlValues exceeded.") + End If + + Dim controlName As String = GetNextPattern(oResult, PATTERN_CTRL).Value + Dim control As Control = Panel.Controls.Find(controlName, False).FirstOrDefault() + + If control IsNot Nothing Then + Dim value As String = control.Text + oResult = ReplacePattern(oResult, PATTERN_CTRL, value) + End If + + oTryCounter += 1 + End While + + Return oResult + Catch ex As Exception + _Logger.Error(ex) + _Logger.Warn("Error in ReplaceControlValues:" & ex.Message) + Return Input + End Try + End Function + + Private Function ContainsPattern(input As String, type As String) As Boolean + Dim elements As MatchCollection = _Regex.Matches(input) + + For Each element As Match In elements + Dim t As String = element.Groups(1).Value + + If t = type Then + Return True + End If + Next + + Return False + End Function + + Public Function GetNextPattern(Input As String, Type As String) As Pattern + Dim oElements As MatchCollection = _Regex.Matches(Input) + + For Each oElement As Match In oElements + ' Pattern in input + Dim oType As String = oElement.Groups(1).Value + Dim oValue As String = oElement.Groups(2).Value + + If oType = Type Then + Return New Pattern(oType, oValue) + End If + Next + + Return Nothing + End Function + Public Function GetAllPatterns(Input As String) As List(Of Pattern) + Dim elements As MatchCollection = _Regex.Matches(Input) + Dim results As New List(Of Pattern) + + For Each element As Match In elements + ' Pattern in input + Dim t As String = element.Groups(1).Value + Dim v As String = element.Groups(2).Value + + results.Add(New Pattern(t, v)) + Next + + Return results + End Function + Public Function ReplacePattern(Input As String, Type As String, Replacement As String) As String + Dim oElements As MatchCollection = _Regex.Matches(Input) + + If IsNothing(Replacement) Or Replacement = String.Empty Then + Return Input + End If + + For Each element As Match In oElements + ' if group 1 contains the 'pattern' the replace whole group with 'replacement' + ' and return it + If element.Groups(1).Value = Type Then + Return Regex.Replace(Input, element.Groups(0).Value, Replacement) + End If + Next + + ' no replacement made + Return Input + End Function + Private Function ContainsPatternAndValue(Input As String, Type As String, Value As String) As Boolean + Dim oElements As MatchCollection = _Regex.Matches(Input) + + For Each oElement As Match In oElements + ' Pattern in input + Dim oType As String = oElement.Groups(1).Value + Dim oValue As String = oElement.Groups(2).Value + + If oType = Type And oValue = Value Then + Return True + End If + Next + + Return False + End Function + + Public Function HasAnyPatterns(Input As String) As Boolean + Return _AllPatterns.Any(Function(p) + Return HasPattern(Input, p) + End Function) + End Function + + Public Function HasOnlySimplePatterns(Input As String) As Boolean + Return Not HasComplexPatterns(Input) + End Function + + Public Function HasComplexPatterns(Input As String) As Boolean + Return _ComplexPatterns.Any(Function(oPattern) + Return HasPattern(Input, oPattern) + End Function) + End Function + + Public Function HasPattern(Input As String, Type As String) As Boolean + Dim oMatches = _Regex.Matches(Input) + + For Each oMatch As Match In oMatches + For Each oGroup As Group In oMatch.Groups + If oGroup.Value = Type Then + Return True + End If + Next + Next + + Return False + End Function + + Public Class Pattern + Public ReadOnly Property Type As String + Public ReadOnly Property Value As String + + Public Sub New(Type As String, Value As String) + Me.Type = Type + Me.Value = Value + End Sub + + Public Overrides Function ToString() As String + Return $"{{#{Type}#{Value}}}" + End Function + End Class +End Class \ No newline at end of file diff --git a/ZooFlow/ClassProfileFilter.vb b/ZooFlow/ClassProfileFilter.vb index 37d75905..22fc3e5a 100644 --- a/ZooFlow/ClassProfileFilter.vb +++ b/ZooFlow/ClassProfileFilter.vb @@ -217,7 +217,6 @@ Public Class ClassProfileFilter Return oProfiles End Function - Public Function FilterWindowsByWindowClipboardRegex(Profiles As List(Of ProfileData), ClipboardContents As String) As List(Of ProfileData) Dim oProfiles As New List(Of ProfileData) @@ -272,7 +271,6 @@ Public Class ClassProfileFilter Return oProfiles End Function - Public Function FilterProfilesByFocusedControl(Profiles As List(Of ProfileData), ClipboardContents As String, ControlFocusresult As String) As List(Of ProfileData) Dim oWindow As Window.WindowInfo Dim oFocusedControl As Window.WindowInfo @@ -396,6 +394,59 @@ Public Class ClassProfileFilter Return oFilteredProfiles End Function + Public Function FilterProfilesBySearchResults(Profiles As List(Of ProfileData)) As List(Of ProfileData) + Dim oProfiles As New List(Of ProfileData) + + For Each oProfile In Profiles + Dim oResultDocs As Integer = 0 + Dim oResultData As Integer = 0 + + Dim oPatterns As New ClassPatterns(My.LogConfig) + Dim oDataSearches As DataTable = My.Database.GetDatatable($"SELECT COUNT_COMMAND FROM TBCW_PROF_DATA_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID = {oProfile.Guid}") + Dim oDocSearches As DataTable = My.Database.GetDatatable($"SELECT COUNT_COMMAND FROM TBCW_PROF_DOC_SEARCH WHERE ACTIVE = 1 AND PROFILE_ID = {oProfile.Guid}") + + For Each oRow As DataRow In oDataSearches.Rows + Dim oCountCommand = String.Empty + Try + oCountCommand = NotNull(oRow.Item("COUNT_COMMAND"), String.Empty) + + If oCountCommand = String.Empty Then + Continue For + End If + + oCountCommand = oPatterns.ReplaceAllValues(oCountCommand, My.Application.User) + oResultData += NotNull(Of Integer)(My.Database.GetScalarValue(oCountCommand), 0) + Catch ex As Exception + _Logger.Warn("Invalid SQL Query for Counting Data in Profile {0}: {1}", oProfile.Guid, oCountCommand) + End Try + Next + + For Each oRow As DataRow In oDocSearches.Rows + Dim oCountCommand = String.Empty + Try + oCountCommand = NotNull(oRow.Item("COUNT_COMMAND"), String.Empty) + + If oCountCommand = String.Empty Then + Continue For + End If + + oCountCommand = oPatterns.ReplaceAllValues(oCountCommand, My.Application.User) + oResultDocs += NotNull(Of Integer)(My.Database.GetScalarValue(oCountCommand), 0) + Catch ex As Exception + _Logger.Warn("Invalid SQL Query for Counting Data in Profile {0}: {1}", oProfile.Guid, oCountCommand) + End Try + Next + + If oResultData > 0 Or oResultDocs > 0 Then + oProfile.CountData = oResultData + oProfile.CountDocs = oResultDocs + oProfiles.Add(oProfile) + End If + Next + + Return oProfiles + End Function + Private Function Node_Get_Lowest_Node(NodeTag As String) As TreeNode Dim oExit = False Dim oParentNode As TreeNode @@ -445,7 +496,6 @@ Public Class ClassProfileFilter Return oList End Function - Private Function TransformControls(ProfileId As Integer, ControlDatatable As DataTable) As List(Of ProfileData.ControlData) Dim oControlList As New List(Of ProfileData.ControlData) @@ -492,4 +542,6 @@ Public Class ClassProfileFilter Return oWindowList End Function + + End Class diff --git a/ZooFlow/Events/OnFlowFormInteractionEvent.vb b/ZooFlow/Events/OnFlowFormInteractionEvent.vb new file mode 100644 index 00000000..ea200dee --- /dev/null +++ b/ZooFlow/Events/OnFlowFormInteractionEvent.vb @@ -0,0 +1,11 @@ +Public Class OnFlowFormInteractionEvent + Public Enum FlowFormInteraction + Click + End Enum + + Public ReadOnly Property Interaction As FlowFormInteraction + + Public Sub New(Interaction As FlowFormInteraction) + _Interaction = Interaction + End Sub +End Class diff --git a/ZooFlow/Events/OnFlowFormStateChangedEvent.vb b/ZooFlow/Events/OnFlowFormStateChangedEvent.vb new file mode 100644 index 00000000..86cfdf77 --- /dev/null +++ b/ZooFlow/Events/OnFlowFormStateChangedEvent.vb @@ -0,0 +1,12 @@ +Public Class OnFlowFormStateChangedEvent + Public Enum FlowFormState + [Default] + HasSearchResults + End Enum + + Public ReadOnly Property State As FlowFormState + + Public Sub New(State As FlowFormState) + _State = State + End Sub +End Class diff --git a/ZooFlow/My Project/Resources.Designer.vb b/ZooFlow/My Project/Resources.Designer.vb index f18a3286..a42ec63e 100644 --- a/ZooFlow/My Project/Resources.Designer.vb +++ b/ZooFlow/My Project/Resources.Designer.vb @@ -63,9 +63,9 @@ Namespace My.Resources ''' ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. ''' - Friend ReadOnly Property CW_hatwas_klein() As System.Drawing.Bitmap + Friend ReadOnly Property CW_GEFUNDEN_klein() As System.Drawing.Bitmap Get - Dim obj As Object = ResourceManager.GetObject("CW_hatwas_klein", resourceCulture) + Dim obj As Object = ResourceManager.GetObject("CW_GEFUNDEN_klein", resourceCulture) Return CType(obj,System.Drawing.Bitmap) End Get End Property @@ -73,9 +73,39 @@ Namespace My.Resources ''' ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. ''' - Friend ReadOnly Property CW_wartet_klein() As System.Drawing.Bitmap + Friend ReadOnly Property CW_klein() As System.Drawing.Bitmap Get - Dim obj As Object = ResourceManager.GetObject("CW_wartet_klein", resourceCulture) + Dim obj As Object = ResourceManager.GetObject("CW_klein", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property GLOBIX_GEFUNDEN_klein() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("GLOBIX_GEFUNDEN_klein", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property GLOBIX_klein() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("GLOBIX_klein", resourceCulture) + Return CType(obj,System.Drawing.Bitmap) + End Get + End Property + + ''' + ''' Sucht eine lokalisierte Ressource vom Typ System.Drawing.Bitmap. + ''' + Friend ReadOnly Property ZOOFLOW_Home_klein() As System.Drawing.Bitmap + Get + Dim obj As Object = ResourceManager.GetObject("ZOOFLOW_Home_klein", resourceCulture) Return CType(obj,System.Drawing.Bitmap) End Get End Property diff --git a/ZooFlow/My Project/Resources.resx b/ZooFlow/My Project/Resources.resx index 2ba959ad..7eb0f61a 100644 --- a/ZooFlow/My Project/Resources.resx +++ b/ZooFlow/My Project/Resources.resx @@ -118,10 +118,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - ..\Resources\CW_hatwas_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\CW_GEFUNDEN_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\CW_wartet_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\CW_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\GLOBIX_GEFUNDEN_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\GLOBIX_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\ZOOFLOW_Home_klein.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/ZooFlow/Resources/CW_GEFUNDEN_klein.png b/ZooFlow/Resources/CW_GEFUNDEN_klein.png new file mode 100644 index 0000000000000000000000000000000000000000..e544b92e19b68a7d5b3bb9bd5476a77af7ce528b GIT binary patch literal 20252 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 literal 0 HcmV?d00001 diff --git a/ZooFlow/Resources/CW_klein.png b/ZooFlow/Resources/CW_klein.png new file mode 100644 index 0000000000000000000000000000000000000000..251710c6f74189a84293bb512320f04163a39815 GIT binary patch literal 17999 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 AE&u=k literal 0 HcmV?d00001 diff --git a/ZooFlow/Resources/GLOBIX_GEFUNDEN_klein.png b/ZooFlow/Resources/GLOBIX_GEFUNDEN_klein.png new file mode 100644 index 0000000000000000000000000000000000000000..fe73164b5f6a1e8094966914f29104d72a2b7ea7 GIT binary patch literal 18788 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 bq5R5zhU~CFW{J#z6p%5Vu6{1-oD!M<6?)f! literal 0 HcmV?d00001 diff --git a/ZooFlow/Resources/GLOBIX_klein.png b/ZooFlow/Resources/GLOBIX_klein.png new file mode 100644 index 0000000000000000000000000000000000000000..1833fdef09af7547b4b0c8643e822ae054737740 GIT binary patch literal 15495 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 z z0DP2h3CW;$;~Lbhtn$n-Axw%fPzpv$I9%d>-Dp;2&uKJO|95bdErNebZoD3PaEI7C-E(Mjg_=U`XP+nY+8HPDgS+uI)vJ$&;y5y+T5ik7RiIz(-254^-&%O8d>`FSmk@zq8 zH+uO}iWi!=qi!Z``adQLuBoZ9?d9*lkzTH;7dczfWS(AMI&TC5?@tSm7T?w zep_8z+X_~Ph_<#i)qK4+)GBr^u5p`TcP)7SA6J{B>txxDLeYQX*&q64h&LNXI9Wb% zCZpq+f?cJ`LG8lb>iAn*XXZz$ScU2Lw>)0Znku2J071)U3%jlu!yJ~?m#`|PVR;wD zq!&Nas9pfS^*OynIPxwaCBBGRF9M_izvh|lz3~3_olgDFwnHU<`?&8Im04@7#HvYp zd3k$sZP}*${-7gt;44}8@#Du$GENIhWaKO|%-fPrftwV-q4htqeJeBN7M?ix8*lj& z+6jADPy&aZrYjVTNLnfX!++9@69A=PA=6ktGn-lU`?2N00d88~M&a6J@y3`c!$IZ;8(ioXI4pRNd#|8`3q@fi2J zQMdiM(8#y(%#{e~+IN-_rBikF|Gu6-4~(qxu(VsUmtVz&qf>vccGYi{1rVq_D)U_} ziwv4L5?^Ggmt9>wtXJ*6y!A|)aj@-vqCC4%2>OXBR*DD1#NV>)PVwK(|KcRq(@{X ze#bA=zdpTwCf?xN3J{C?(0k7(ZvLRap=XbF#>fASpB#-d4D|I`Cz$wqZQE6hJ{%ex z#P}~2x0P>*M}7PDEiRGI>hIzHKz#x9daX3Czlm1|3|+cL{FhYy&M<8nuxws-iRzxc zwzB2jr94n+sn@r-<$Ru+qrHB$?trr(KcA*8JN|0lz`(%Cc18V>=klM=cLW3k^7Hc} z*}@cJn1K%N!5a9UCLwkbDYo)f&)8V9CcXangrMQ%F6w4tPm~Hd;(LROE2?w)&YNEr z6S1sn+kj+D3iZpZf69ereMzk0jVdoM?}v_7mig}84eD3-V(FvgzjbwOy`mKFCfMe)&q(OMOx!lv`xfyN81y6OZ-#)W*EiPJ ze{6AboO>kwtvrI#`+uUA@3Z0Mdx^K4d-+LQF}0h&?w1x+E#%Mp*Gn~IHw&NTL5kpZ zWrS%tgJF-#clu1T)S?k50iQwtt zkCwlF(Wf=y>NAt$^@M>a3{O_ds~3E#fkcQ8ui0!y#QmKV{Wy*5oxJHb*C}2!ZENco zy*c>vw9xN;R+c&OWf45{ArazElyV|5%&R(wdwmJ_nyYsNWP%kAy^`#IR#FE;DppTp zrCKwvX95R)l}`PrP-$X85 z`^B|_jRCDhphZ`6?y{e0bD9e}bAJ7FEqw5?BD3U<3^v1LXJ$@*su=TLTyqVgET=yT z-z8vVL=lRN2U`pazOlT@1-G#jEl;o4z#)QvBzrv?mfrCWUB!rVr%5I&L2!qrB3-hf z4BB^=Pp29$%pa{F+?%Vi5dbii&Sj%Zs9TG&r6r#S@9FB{;QAucdiu;FG-PC+(Z0HOQ>E8A)5?N`WzzyZ;Z3k;>h4Qj83=TcvMbF);Kq;5<=8aqP zM+F=jdIloRsGWCNc}{)`FZ?6nR(9#Uw+uhc=jV-#C#C5}whO0E03D3$g`OkJzlw4H zgLgY)K83K49)2n;RD<;(5=j)n^A+=ad{ydZt>dW%%52=zv8XmlnbfU`>qWbEx0fe|0u%a ztww=Z>)>;qm7S|jahjmvZJz?_g+>yFnp+sMkikvuvq)fm{=#Bm{qY*87XvFh2VRl* zeM2tpR!WN{#mW`sxi-hq%414zZ+yMRyL(>#P$xNP0Ks7%e!f~;%+Wal3R(pt>Zt#p zMZ~j3MVh(JxP$L;iB7zm*>1TU5^T z$i>6Ws5}hr6g}cEf|*5yA*9Ap-KOiT#1BoJLI$O9K@&I4sN2O0?!4Xbdea>)~8=U#!=sJ1*<~woKuK zmd0)QEzV3USJ?@8p4;kZway!6(!7|=6zVulTg+K^S}O`f_HB<(`;3==eiqxbGESBK zj0WXeiDhR&A=LUu+VM`gQ0;XdJcu&{bkM}2miEyWbe_+dnKC+*GiAhT>~bMy3X%9F z!az=zP5N`hGH*c}_}IHllcOoFcUtfr-tyaMQhmses0%`40UU`rPq)Vy*jHM9-(AB8 ze||bpUiSHOVp!IM)_na9ob-TONBQz7(&JyZ%6>Uy0FAVxn7pe9&^R=|fWXz;4?pTU zLOJI3Nc~y(GK=l+?Ck8g_u{7wAkzB|Tu|KQI1|FdWv>e|O=rK7d-C7zhQ#LGlq(4kV61T5vOBV3ECh zQVY?2juv%nuH?;F@?DgFKoN)^n#b3rOPE@#F1^!Xk0|h>fns=Oh$$C&vfX zr^9vkr*&Ug8@@b0UlnTDe~bH15Zw!`L!W{*zvYbhUPVHP8U)^3XfklE`XOKVv~d23 zZTQ5+oddNeKS`NPF=zG4ZHEp!IjfgooI|1&`}+E5M?im>{A5re7_i>Knw!P8NFQ*x z_WLr6vbs;@Dh45*>$uIDXSiC7a9>0Iric8Nq{>2y_%Gu)i5h$XF-LdLip_7ggI?-C zm-*tJOQ09pZd zj^S#t_nqJJBJaEHF=rEnow8Otp(netIN!^?5q6y`Yzl>7oC=09$gUK!OO9(Lodgii$!3;9S|ks$3GXYpTPJWpg$e)Jntd~(f>F`1G8*(?)`;%iMCgF2p9njC{} zuCqE;TiwA;R$WxolaQLa+|}86{;`!635X`ndUTId2(MklMvu|Eu%J?rKo#~D)+eZv z($Zky&|aISV+v+NC6)oFDo#a3S=k)$x%zP~&st+nGztaWc5~17E6|z}7Uj3<{HMDG z_~j+j^Bx$JX-%d1RWx?_{r56%#*hKq;oSeJQUECHr?$M0j`n7%3Kl_AzmSwWPaoB$ zt*-uh(Y?CctDq3T^z-m5T*hNVLpHgy5Ar&LwhzQ z*DI%G)gRQ2AFCDC!8SCV30x-=0mrielAuY;pkx-LPb*Z4h|4-?Y7({}*_HnAo^Iyf z;_{on&js=+yKhx`3+6`J?8R10u4*ccevRkanch4#2JKUFLh7~lK>HPgsOx|JP^Dij z4iq{Z&b^Bgg-t1kBEX?N#pzc7rzC#yT$|G4X!yfgMKEy^NIl6mtr7#y!EB zp}2(IkLzTsWzV)rVrFHPKU`0!7x(>%>sIyx1;yOS?IrTc9svY-g3gvre!CUtK&DEBf~R#r}d0wlBnlJpl{ zG;#F&b{UGOAr+NLH81bHiSHuLyn%dC*ND3bdXho~Hobz7_65kJt15N)NU?$yuIO=K z;rF2@9+9Vaw=pcs=*G*nMba(mfvRi-UBI(kEh|?LL1%oo}w$f5~)R=zA{*)=VXsDqfrk_Zu-TC?*__B=+#V9A&mn z#WUeZymeCU=>vu|P0AV>8O>(ieew0QVU3hn-UrfuNd{fSh+^|gS@@-jMZIb<{{f=u z`TC92RYM-%-G63x9~}`&oT1a4OVn#)*fKtc*dhPia6R8HFOMX#KTA>4i?6>#b~aX? z^#ue8zW(|Aw4NSx$^HGCA!c*%1QSmk>h>PL8(%#MY6n#W^n~?%?GN^1SG1lkE-a8s z0V7@gXi_i9(YdZ?q&W9K!U(Pv40xPoOmgyVl@wu~*Qu#@E?g7*j^EhJHoib_^Yp2f zn5gI`@aq*of&Kmcxp}n&X|o#oeOYYgX|o48d9M|iY2`HjQ3UKZ*#KX98Q@oy!Y*@oSDa zv^Q9lg$BUC@=n$mPIxSq28)|cE0$wGmAKW#&JyJ&Ze?xlSjqI&qAa#$q=yXo{2tGU z^j*h^YK`@BBVVo}kFnk2JA`w3Z{qJM9UY&@sFieFLgu7V0y(vXv6gB-D8nTUDO-jK zp9QvW)bv)nje}&ba|>Sk`)5Fe8!fi}ndK3gkRe4&ZopNyJJkZ(&F~wm;h@2CyE`Uz zhtD1SH?Tl>Cq6t-cfr=H|*B@=iJT0u<4g%CjMMX(Djl*Vs+@P}tC!L?{ zE)a3B{k=hjyc8o}l!$M?i0%3F=gFz7 zcf;Y!WQd-X!E~Hv6&Qu1r<&};z_dpv5f*J2O1Z|cECmq8ZM}g0Tx)xEZ8lNN!+vb; z=exU2FDSZiad3S9*3m%hPAB zNk`o%+3Vg=hf8W}CG<>8(mw*ucL(bf79sF`wfkRHm8kDW>^Y#MZUaUMP&szG#jZ4o zf%>B|zTaOVX=`sUC{9md;N@}diy`Na8D}T>RqKbsI(@5QcRM!9DUgoDp`a^qW8%P3 z2VboD>sM@H=S+;8#`K7N1sjUcLpGNR$4DP_E!XA`4sDJJp?h_2OMy8nId>itV%BEP z133{^`X~eF`M>zPR+g6dEsEccj*Zy^ivjWMJrTI}cwy$S>zo`MacJyoWtKf_{(P}W zi}WzIsIB_GanbJPAghv|%edFwtBlm)LmPj)k_QJaR{$HT+v+zE2r+y8?nXmWZZwcN zuQbo8&`MD6a;y$mz>U~$zN}VbU}QvRd0ooSGfiH++vWWV#nMnIYu(d<0t^!|c0~cf0Wr>r3$oOc9dL_LW=Y)~^sh?G4p6(&hCyx z2ceiq=k!c}6&fY+-Kr+@3OSp@uZn6!BtG=n*Q~V$sk8OXc1@pvIAi~*pdgZV`6`rM zrTh11PHpRiv=7-aU#OPK(!W*vH@gUsJ*NpV+bIuZy?h>vqLiB-u)?Am z<9-Q0YT&$+$m~joWc@EUl%Fqp%FgHN?!Eu>=a0Tlp|MfnVijPZ6)LiKr_S1Wu9_m# zKV>$tKUyvvAA_v5s1~r_t41YfmbzX#f^5Dxvt;2*kWDu*`EZ8!nxO4}bs!=2@6i7-Co@JdO$bL4 zNklt?q83BU#GJWU_zSoMbw zbH(?jV|xoK|0a3Ou7`l;wqReo)nB3ao535acHvVC=r_w%Z3yF2&~2#1yU$yVOb%>K zLnEi46Lw^jbou-J<7|3>|0F=L*3`~q5olGD0S6TUK6#auL&CjX`xv6jZBCB)oK_Kw zX^PJ>i4oT*dI?co09)e;Ya7rswsY<$^n+W(c1j>_&gxGCBztjc4xf0z@LgnC&x8bq zNaXWOD|(+G(xX9FW2Y7>(Au*l%W}8VBzzVCUjN$r*F+JO%xkGMQ%SvtkCLie0LlI7 zeG-DJca`Q$hs#MN!nJurlslJx{seMoKP)KHdl_7QPNOQ<0npcd6AYa@z|@Izaa(hP zSCqu|VEX?cf?j+jS^GhQFvXEeXUWuSf@`-Qm&u)suKIg0Mk}QJ9K4Ye*FP{I#AQ-f zV*@B{@3jBVE_~ft9S@jD^I7pafMqKGf}`_osBil@I)ivBh`8|ZAamlbbLxB|L+)?d z8cH}exB~V%Rgu8;b!X6nrC8sG_Ct^ITAONd0KRj(RaUZW)V;Ih*U<*s<^52b(JxMT z|IU)7-lGht7NFWz>%=hsnB4$@y~Ap+F$N~&c=_i2_`{nJFlaL%?8NY5T{3Sv85RK2@;cN~a=!U2 zeSDeeIFLyNVcIh?0fcS1N`i2`@%22HEf^_=RXqpS+MH5!IjH?WhdOZv+F4fv?`;{6=FhyXL?Te z99)e&kc`a2A>S9c9<9C_P`9gBDreJf^R(vi--X1GWimGNwWDY}__S@X5y$;@7d{ly zzh(~o0A7L`z?{OYtm~|3lqYn@lHy{X8q3c3ToC;}6a$U#?&!GqyfLF8U*Me(4h{8< z6gl8q+vnAs`|$8n{;5mh2i>%{J^IFr)TN`OTpM87ny;7@^L|s=*xK59{c9wt0PaF> zL6+{juDCRlU?ORo#PaL`4d_kLS!^ktGhbl^UHb4V;_{c})JD^PrH;biasIbJJV7BD z?r`@8aA8O6IX`f-(q-Ri9Jp$+e8^8KvxA7995M2mnN(L3)jAK+1Z{10r0-EyI{`1> zLfYelC}7P;RR!t%ciT>dk1f|vA~|sjRrZ#iSGmt3<#sObKMES~ZPD;m#(3bGCjUf9 z?pyDKjy*6jF{y{X-9CS|l`RKwYSPCf-u)+Cu^r4L5*D*`%5zq&<+Eu%_MM?)Mb0zd zp7iq1Yg`YBRWWA5sT&R0QHxk@YA+_`g4<-ZF88>q#{*DiT_vouV_^a`ez{`2z>Rhm zl?g&Tv*MImW7f4iQQtOG+Rmh>Ni4#Vu}I+QN09TVxb&Wa9gFgK*uP=`J0sqGss!(3 z)Ltn3HQx`>q+By48v)wSBCtbj%=P+nPwSwmm6g>r#{OWepn!9cEwdLi_}wG_0YyWP zESsbj4pF@Fr%E#nbf>e3?YGTEI@HBkU4EKRr!K|Ci(ReoQj^@vKA6)3xv{;g>rGJO zgkr@UsHSNg7HoPhX_{4+dD$%c0;xpXocJ$=`X2sGc31&LB%O8Gpx*yz3{(V`$ntg^ z8WKN+#Ls1V-T6U@QQj#@sLvnJmJ=OGWPd6@YbFjy0qT$&E=mjeU5AG-FR@fW) zd3aQ~x%Q2e+nrwh$ja)4>Q*KXChvorO0Orj-M+nu_%hLu8wtb--CSKip7f?4mx)n_ z+mMjc{s$Gp!fJI?=U014L}zCwQ5M@b){DZIh@W*fpFu@LRQye`Nn*)yJrDWB$*R3) zj?wR(zV%Z`9Xf7_t=91M1Hgb=e*)r=SXF?rt}YuuMyk}WL?G>~eN6r#OvjePmZ%&S zZ>dcr-6>sZ?~lAGrYC>#;ncNrlT23=?yqrIV!y-5`LH#T&cHv2MD8LMWf1}S&UP4d z*N-shDQ1{kh%HIrv~=b6Gr{ia%<^*g4Uk>fv2*9c)d11FdGn?b+`T1yswuFuY6672 zbr8R%@I8x9l?sdMcQY#EcuMlflsd7I*%e%Y#i}toz5XjP+-C_1CV$=M`Xv05H2#i3 z`JLaQ7En{45ukZ2AB6~1aGYn2?XX7%FI+95TQ{W=HI1MUi7dUHsJ#B3jz_W$x+;9| z4D0?OgaoR9O6wyC6bem!{d`)9;P^&in$u?XWBDtFfyS}wYT(M{Gl9$b`GU#0Ua}F5 z0Q|hXy!PhDhvD@=Tf+QZH4zCpGYt)mJ^=zk=7;=z-*`)&Og`0@5b@2=??Q_F7+c-W zF6b{kMg|iVm~FA`vpW-Oo|0;7K%UFJw-(gEo0aS)&RDFvE7IJ^lUE zB*<$^y<2zgY;9SdXKS61Kh4*6H6cZ28DmY-)Kvt?)2X#DkCSo{grAl?8S+WWz5J4g z|C)}V-kc|fg!(=akk^YyAZ(7Zo|&K^!ttMrLsuh=Ijhl8Z33{Mh&T`-T^u>$_*%2- zCUv+O7Bw(BYG)4^N(b^G2GCs(Mk-y}*2TMb7E0xjK>z*uyo(4D!IKahi#HSd$Q^km zCoUW!uL49X6Vi28{L$i3zjJNKquTIIo@qkIt0%_}8_)rRVp&waovQnbN3AeOs)#g* zFN)gQ77$mS-PkjPI%>|F$gKP?f*-{M@_Ud?k{eRwoiW~Rst{pK*lTz1eM)%cWr!`Tw`JNk8F2OYK)qTeMnE%n27k->tdA(~*~0esxi&HR`Dc-j z3cq<+Hpw#HXjbvkN4b>Sg#$zjZNr-kdV6&x3D{vQD8ZirqADbo_0zf;l3hR_nFXoh zqp2(HhRwz4XW4RY6J)q?j|`Y9xgCbu4JTiZMuD4OWYe4bcYAxgd{YW?Jk`ZuyDDvU zO@iUDv^xo8+FqD8a{tIbS|!*rdw<54`O>7_@E9?YPL_1m_O%475Oxm6zz9K3y#>kD z(+E%AVwF2I{bOg~c=F0=;Aw!iPs&8Ryu8fP%F%M5&PpBLk)L0#u4Hl+aVvrw8h+DE z7zk7g@O&OWKYtlK&}|Pe$De|CSI^HdN+FM8g6JiD0oYtEd7f*d35=30$AM6KHlwP( zak~K+37S_Cja#IWoAgW@xQGS!=6gv8cjOD3By*stcEiTcc*Z0L%>|#^rx!mksg6Z| zC6G?cVyj^biwjM061N@xYf+5(%<+^CvCWEuY%V>?Vn`4%qEFYhrloYAS&cb^)NMo*hM}q2 zx+2zP93LVyXT`%M|M>E8mguyM|Pq-RL3@u5A!N{;RO74$@qBV>x8z=KJz? zjg|L@Y#V)6gyT6uOi3c?(KIuX(O>e>35PD^=oI|0a`)jh8_laKP~S9^623Af?zQ6l zvj?SALPu|OmbBy_^^{JtN6WM46e7~Y>Xjb$FD0G|+}tk4p%a)DKXyx&?N4idi=kkT zrjX0bYcaOadw7Paxif3+IfD{A1XHpAv$1>B+Wq&2Ku9*-ud3S^%f1z!)!sTp!j408 z(nsZ87UR5j%g>o*lPgSOz$t}8290igTe<%HWnY94r-16QAlb7y(aZbAKamW`K~>ld zd-+n>?%HK|wE75QDPg!(x;zceJoimWfoGdT)Mtgs1yo8gOw8wkxU*YSwX$XTCa6iR zlUQ2JdBg-fj)*YLd}EL^r#O!+kTQW4_9E~4Iwg~=DZ1dF*s~9dKwj6xyCL@kaSJ%n zz|xADBr|DC4lDi#gAE`r2`{`#*ua9xb{SBs_SL<37~Xejz#P|O4r$K+8*W!*@7i@% zTD|0xn=Yi%OE2l`IRwt3)fdA8n0|RwF~7=F5!bn%eJDte(`GA`sZRG6YzdWK+uXRi zS3LHQ<{RJ2Nu}vB&iq|=rY8y+E7t z<~V8UN_`TgwRqUk@SV4JCFi6kS0XjMI)cbbUfn3D*W|2uF>~^b0X(CznB`rhuFn1 zpJB^kRMgCXcV7pR^%(4@D}&{95El9qx(`M44^;4^iE~=Qj6%J34AZ)j9SO4Nyv77yo zI($Y(xW6)t|_t zsYG>BNu6-%oYiR60D<&#OTAn(3;~?4E&hAUc8?xx~tsIYOu)cogt@=nTyK?HKX377<_@=)+3o==|nH+ZN1|`(E-;k4g-Sg8d-~n2jZ&^X9dXi$f4r`~&U2 zJ1IGtB0v9+0*ch9b_~Sx2%r@E7NMZsq9CkhVX4RRf}HLTJesNADP{Og6)Jl@R2B;- zq*8b-zxhIcbcK}Bjs;|?Y-PtTVqZV8_SDw4)Yf)08u-ATbJC1)$c<~&`wV=2HrsH^ z9{KMkt`Aa6cRIg)=D7d$)OzU{x+IQ8akmNsldP_)B5%X52^tN!K@sX3{|&qP>~Oh3 zX=&+;f&Ts#3Gc7>pD9*-gqxYvnLWJU4wYXY(eNKlGVUtFwv|x0UVwkH8IU&#Z!J}x2 zgI_pK^Bl$kxBxg2GpBWh{qAKnyB;>fU% z!WRmm>)|sCZNy1td>bG^dM{$NKu-Yu6wYi+dX07PH$r^DPcofLN-E$jBu<;SFG0xO z4Up^@L+m3o)^u1fL77EFrMJN;g*c~-#+y35IZ(yZ49h@l3g;9NEhGcXc!+S`(4bs) zk)RI9H+tsk__1*I1}>Y(wvU_a8j^%$&>-&8-36j#ESoZlGiMkP;h7ep_tP{lHI+!2=Bza?V;z-7$eEbUhTXqArIZy_XR@xD zixr(=fdf^Nlh4vnbrl2M{UU>84(#FWbeJn$|fr-WUuTH zzPHcg@%!)h`2P7lb*A%L_kG>h^?W|B>pI~Y&lE^*(cFR{h(t+IP76Gr-`rvN;4y6b zl>~UgH&s!PgRXD>eQwH)1D_B&D(bpG5E0qU9cy&X?;rS(z*R|2o?w}fBzgVr4E7v$MCWfx5Nd6N>v^b3EE)y#w`r`#Q8jb^@;hQ#PcTmJ0Hfc;R*BbZV5ftz5cIpgL>1~`ME}K;`GdkVq2Yo2 z76{bll^Fsh4dch~%ckahs$-U7!SMf%NY_*byVq2Hs}(Uzl@rh0?L@0=-Cw;Ewk&)H zg5gMuL4pk>q*v?U5_7Ro7>?{^EMshl0!uoCBf?LUqA8G35e-*{ouR)rgu6M45g^kM z#PtyiPPE&?q}6sam0S-kbYCj}&4qrkcGV_meP8>hzmEE3%m>TRuzCck5(MnSm|D2{ z^11pVI3fhiiyCSdtQEfRsO$Rnm6w_z>P-+zT{^gs4c2FI1o6vYB-7P!-EcRB2viC| zIgDuRh|I8vOjs=IG^eIVO%6*ikBcv#+Vf$zxe2#9Q;Zwb$`4JEK-`T)jv3Lf_GqD1 z>{cYi5o@kHEJ&ghYlgxoRC%j#%I8?$+V@PM4l!vczT|fAYP&eIM@nSjxWZB7D9jFa!0ilyz@fE6{dJaGcOd6G zNEJBJMNTtbNX_Mic9mGuOxaxeoHd~`TO3lHo;|^w8dHXYDZBkyz}aD+=UZ^v;8#c^ z0R9TipLV~m{P(^mt!~1=kAEKy3EP595L(PJj3Fi;<3}HLO+ACGpa52f`#eXk$dEzv zva?K%!30*N15fd4R;2{nwl`v@Jf8SakDwZVj3O+@Iyu3d4mY3)awHS2I1tufU&Hs< zxe$jw-j7()*G&-8)>c!BrQOX;Z&GncW>aE|i#0(w^_8FCNK<#!#+LNDWTX?_!ZMa* zGONzdPm0L=7|SXGW8(QE0~bdTC*>%)8YIT{nl&s7a}pU1>4g#b*3KRgVHro|SO@3l z|IGVM$@8a;%I5)LH_7ZcPAeAVnce`#NLGmuDtynHH??(q3rrsx&hy6v-ncA0C8)+k z89AL}Jpr}8goFq6LWz9&VxV7S=wascp|yQa@yA^s*}YP5II@Mo)s0vQEPfINxDQ zKm0T2q`y9=f2>XzSlYFA$Z1&eWF_AvCYrGf2Z}SF?m`q)+o@;AldThv>gunjFhcq~ zeFsa@jM6W(S5$;p7Cv~$X;RR2C;bwB28mW|xbhs8sgOeYS@|}33wxHC90!bpRvS}j z;aFA^W$U+gGiQ(n0YnJCr638-ezty9wy@^`VOmcAs9aJiB|JRWf- zw9V+Q4N_#7QY>!Nve|TXQJrZ`?XUtVGvuS3u+r(*lD=<-c;;YAC4XnSI(1E$G-&V( z&G+E6)mlBZwOfIuY;YJnZQ}ceYQ<2~euU9UNEz&Ir6Dmn@leGHCYqu~&t! zBm!6e+y@tz6inaZOof9aj67zWt6-u-bIV96f*z=}eeLkgUw)+&rpnC(;3=Wj zTQx&YlfED86l1@f?S}OkxDUQ(f+1~s2SNsYJnct9!;#R(=}L+Uud)=9x|czmk!TxH7VXe zQ3Cq-Ax!92J`7`a!p=&6pe{TD*t zK#mBPyYl>Jvneh-tDC^_0Y8fuKnQ$S&@JfDTz7(1$+=c&ErqB63=~UWIX-kaC)pb; z*+UVQDXgch?YEA-mhu*EnxCHxw!{y><~eGUmxFP~iY`v1xC|E6vns`Y;%9fxxJ_S& zSk|SF4qdBo8Aa~VM|XE2hOh(ld5&Zb6Nbrj6YeX;a@h}vSeuS>gE#15G6YuD?Wcjm zm#_>G@NKZWxM!Z?^!Jzq2_O()an`UkDa>^f)S4&3A6^rnb4Fr z$z1}!gssDKtVxkpCiS+QbHS2{@Fi{S@l_X>XQHp%w6*P!VN}qnb4I!Zkp%tiKXoGP zsmHq~Bfgk1&=q{cm=53C3 z4aH z^G|XfMlhRV>O}TBvE5x=r^>mO#dd2^Kc%h@rHmZ^{Ax?~-fKDyvJ%`(c}Co87F(=S z#(XHYa5k8Ka&oe+?teZ;_vx{n&C$hWV2<@~ec!|+0ZaVd`mJJH&TNSZ>d*0`$;ruT z{%3tg4?vV{2;@YdZtP8!E!QREw5Sc9?b?{hfsGlJ-5?0Go8h926bTLv9=+}Vx1+P* zzY;?@F@8`itI~4UyN5m(J2eH@e?p~Fjy%P`u=iOfvo#%0=&cQaBeG@x07$vF5gaQH zY|7yN?-zj-MbTyl$UYvKsMEnzqBdjcRF26Iy*b#xcWpBqL2iT21PJyT<^X; z!?TAhAKWFu>4+nHhUQMviuOmdRRoNDkH;V0rV~9%-Ap%re0|UZO$zxWQMb)_2mgziC#m4og8xw#1NY#- zzz42An(C+reUEr}ct}$=e975Vd&;>U+7U(7?lz=riAwGeThUZc;_4=hH{*X8#7ArV zY&=)yqI8)kF_K!WTT8pxjJW$SK{1v!i=M}EF_HKUmyl?KJ;a@nui)>87nBJS~1`8HS#zoaFUsJ$vSG~mPT{yl) z@rPuqBw9o2B^FD_IKl^xF{$)2dHm+6(;m2!z6tYd&Yq{ELk#t)h&NwGv@NrBxK?tr) z+zJeEc6R>K*eJfTSx}PpcY4V0q#bPbZ@zeXbd>CR;repn$-Lji&SppmepXY{T&3No zJIMFIsssd{&z73V_6kkv3;1`0knp~E`I1deleSuN5D_HD%;e_kx=j$URy(Y&4ng+) zgM;)^FN#5&{#)XIxwWROqLQ1w#d~oyrrvTqUgGCwYhhuL{_Ta4Q3->X`}Ra^Z0upk z=5*(>(^@!t8b`zFy!R7Jb94Ejr|UV^qi+sZ@%;WRGnAzAqq%z$Y<}-To^-s&1zg-;0wEO@Egn32I(XkAm5_^NAl7viFvN zUZ)()_6h{CKT8pI+A6BC|Jma2Zzjy$Xq}9-wYBAj#EBp}am1uRT_(qQX!#!&6ftp! zVkD!HFzpEnqYVvTj81E7-`{J#*d6JOV^^ooKmKhcXydTZ+@z#EF6WOI1`h+cjQx+qoB_gwIFVLxBHAYo-?1+T_o!S5(mg@^OzdMdGS_j&^Hh*o)YN{x3(p3FM_ zKAtqSKzs1`n zDUZy*vy@F!#$@kn9XYWg?7W8Q#E=+F{J+Zs(zPam*Ei$A&m zzU-lmt?gFD+Stg5iP4*t4|UO!=j+-M;s5mc?S59~MT;Nw+@&&b)tqoF1iV!mj!OtV z8q2$#9XH$ry_bPe3xu*UqdymPZr4*x951vlmL7wF~j9J*<;*N>SDS*DvGor_igUO1oJX#0SiwCzrTxB_Wu}*K7#4^5lZj19=kD?>mB0d zdynZGjEMqzG%Gm}JWnFU^lk6)=*QC0aJfMDRNI+qwT{Kox#3}Bxh&0@YCFnX!G(Li zd)|lk&1b9Hh9w?T%9Lurj+TOMOV*x@s_+gxV~hL2M@$30cYf~G!AJaaT$BtsyuaMN zOhQ5;sxme}2rS3`b6J_DY{xGiG9(Anx7*e)Odq7Ku1m_m|7|>yihi0kak4WrV{2n` zq{Fo;9Mz#u)aN6~&e0L(U6r$5S z*HS&Aq>g_)?=Eh+I(Mp>b?&>LoRj*&jgL5p3<*Zp=dtPaL`}0>@A>hT5f3-_u>tVX z_amuzd3t+#VEX=-$Lb#v6WLjnkO&l9{*Lc{q><0%yC?G;T)^RyR$g-VWg<|FXyPfv z<>j8g!{va3pNk+__%|5!`A6EWkA#80JZQVSgXe>`qWDitF+*>j&aMu8y64caQ;n*& z3q_#rbbZ8vD4@^T*_}SX|Grd;b)BFqEh-xDIhnS!{odE74nP_mS zax2KsUy7Ex^3(>mI<7t?M96(}41Wj0d#u+@ojv1%km{`ypOTIT6I^2VdJNVXtchC?vX-5<8 zir=ow+&naP{`Yr(z2ml&{_*#RC6!vrdN8IUSO!O}ibs9%a-xx+?p&qyb4C!b{s7OB z?tVD%L|r`Y*Bzu{f_e6gxS>w7&lw<^{X0?1!gbF$2H?+AUYdC0kgZgW#hW{;1khHIj~2ho<9%^VLrd=X)*JS1Ba-9;;r1xsenB zF@8r@uLDf^CnLYJ6`Z7`Bql^oKNIO%J~Ki~KK*WmzG2(P~PPL&?8Em=$Q z&)@s|kNlVKEpWV(V|JgE;R3P#RfGG^k7i;|hn7qCL*S9;y$^cXPa`vHpHp=DB9_@8 zMfaU_#4?%@_AY)DN9wFs-LQT$zrYZLBNgA%&&KM3dS#|~hSjfiX9WjLA}@jdCWc2+ z>-&jlPW~zEY;+O*?g#k^BWLUEQ$cT_C9&NFk9!6d-~scxLms*IH7{c5~G&qlgB~%`7f~pNK)74PhGij!P*W^ zNlEz&Hl8=AuoyT5Ves|(p2vvbK!w-w<^~#`646psQ!{g0>fawczZNM^wiv0yegU^h zBmc{19ekvm5za7(c(OxIVphyKm1z6e>m685mqzEKiH1H`XKN2%&+NLrPX;LLum5?j zfAZ^@jx7#T3@5UOz}mUdxgKWVytcOXBYARSf+k!pGw-71Q%-O5zZKr}8lSU+I#@=9 zeFdGEd!@w56iT7IqT(Jk3K#lZRW%M`L&MT_?_QoRG)erX~Vzf!$D zJ$eH~EL?-h0{i-n94b;e(H~O_d(ZXt^&LA%o=|izJAKmnUS3}QZM@*WbpM>8%d;VW z`&zKelZW7fP_wsE*AkE2-pl6a$2tn@`=8Evw44lz?Y%g$nC9>D9Lba)TkTIG7ase} zCwJ%?PIS49JWa99`0u~}*unJ%@J!o;m<-pstes0;pAGTupZUD4XmYo;EpP&WKB2E% z9|t0ZfG{%+Y)`x|kvE+ahHP275A4XMWi8E{)Xc)-B{MpM}#RCrETNkpqNp( z9P{P(`aS?C8&7`P=9*$O1!>%x4?dK{r{ujm*`6NT?_r6it+u=1LvlD(`vOTRqpYlK zB?E-4ist6#qMFlZNsr7&&(_k@1yb}J3^KfHhZ_j#n0~h*I_mU8iV6w@RL3yxB&%j- zX0Urt>{A5XHh*y9)SaNBCEQJ~uP(c_c*LaFqAHc**xnF#tWUa>+I^b$zrMU1wM^TM zV8=hFmDgnTKH1K@TxPhgEow<82}b&L@WlgiXi#M{UOA7?1)R}ybqTlf;^Ja`I2uc# z73Xb0t$ANU9KfLmq| zsU({TP+%{i)sjnA30M=9~C?rHJTP6cz`UXcn_|jYU zeS_JRkcrh86YBFHH4;W4e@A`U5P18~dC%fMe7Fz5RBD0OLnl|Z%#p8d*O#XZx$*RF zLGQk9HL=DiolNLC(22ONYjhNpG{5qiv8x%-t8+Gg=`i{4Cd>j2DUPqFPyXGzcjqAT zkQNy>c};K3FAI}icJlf;l~-3!{Jjb7^9L(^724VofNeSF{O#PGYq)WJTeHh0BgP~e zYHDg-^G)7;fFCw(yJ8Il1_t&69uVx#o?x9ku^cVcys{X|Fu!(qhHpTydn>k;+ly)k zD_|)q02cE11tpmNotlMad2MaIF~J8B%vuz9fF_!Nh{c_k&4%F@|I>;?^gnpb=)VUH zH$OiwkJH28^^cC$pcmTNbaZq(dNuaGEnmK{Ry(hJA3Acs28$-Y1F;pveWb{0>M&Ei zBj>q*jGfYPQrl9uD3}Wi%PaEz3{(GXOOdfQp3Ph%}nT0F&*W>xxD&Bf^ ztq4@Fye7rx_-8rsyVT4 z2$7d1A1nh6&WZcW{UcUSri0K(YV*xb5<>~Ew0JS&%)bM<>#pbL@h%7J>3mja*O zu^iN)5_JwHg=H-MByU5Y_KTPH=oQb>ug}uA2u7Kf_iHcLv!W*|tE=fZ)%^l;te2>9 zQP|QHA&h-QOt|&MV!(Zj=xM#5+)}&Sw=U3YHX8mki~q@?lLq-9o{aRx>0Y!9P3p*+ z*VkXSE>rdzo>4{eeCeBbVKBLIL!?y(U$ktiitm3TXTMD^{_z!(=0yQfDz$?wb~XiV z_lBD>$ZBlvg{i_a5X(#zHnMkR7`{#!yjygI>xvGq$wg_hCun!E>Ct z!NF9qjv=XQA8jtm0+sB#6PA$St?#lH7OU^?t{P+Ba`owq3938n5e6gO{aMCiS(&u8 zLw|>HcRNi1dhtTBg(l3Zv?(!$>nL7cDtDs<@IBy{@~-!;FI%c`di}Q6*Gv6R8y3cC z#XbLou_`ePC;&PfwallyVeNtk))X+a^{T-sG$FYlX8*mMGk+JylP8n1usdGlUh?wt zjV+XOd#4Yq0@i&mp@1|G6LiY9Ei4&kpo!vNeSlsedRg;Bfgn7Ph2TB zY^tC9mSW5owl?r7QG%k4IDJSVfydyLYfhUnP+;T%jo%sK{=K@Y3?RB8ezxl{w?6Rx zH+-v3s=dnY(`Nm%P@OF%qGRpL zF+n28@jKnsj)T8o5PW9{QLV^CO5r9BFOx)buIso~&=e{?e+TYXjUO+&g^TWgc zEY5r+os);!02(1uR#t8VKD(@9ZgpnNH!?Gfr}0lab<-PD;8xCoa*+v~lLZ))ad2?^ zg=UE_`I{d(G(J)yJ-9nWtpCU{%kY9p_yx#EA`n3Aph>4IAWFUP|GOC4ed*^fzQV1k ztZQwZ*HT&O`s%iQv(wTyLY*>G`NbQK>Lu!$!Tz#XU-y-k)}EpU!1iiG0|NsaJH8-@IWONh!IrwZIu=?|b~rL8KR=2iLN@PhrO1gGoxaB{=rM{o zJrWC_3D;xRsk{9~2cT(nn*uKRr$3-e@wUkmKL+H@h$y+%`Go{1BW2{}gVWN}(-;1W z!GS;|-RPFO+RyLmdWtI5myPb0wFlft=<-a}&@e3}HFZY}#1{n=YIz@krtKQLi^}PD zV5W3y?B`~emQ3CFGJjXwRRjiNTVI|Z_W=pmJE@}sfWPE?aGoMj&zDaxKKV!*H88^H zWUY;7CG8q~Q-($|1d@!WLYo0Gz9=xdwCM#%ztNbH#~ZM$J)nwpRNGC$k&+4X*1D8H zN3oAqaRYMYOKt7olifM*sg1QW4L}joZv4}rgN+T%@Q8Mv*LKUr++J}H0E@drmiO-6 zd)IQg9WTUuCTreAJbnj4(nI{Jo3rO$V*0??$OCdED^kGr$8GjXGQ-UUix(*#V| z^N;cGsWQ}YCdZ~hpzxKz=l`!3pxFx1sEEHNtjR{leO_9>3&{M9R8|PW$4JuPqpjmr zPV*aZRsf)(D>7ll@$|6}aZo}+LX^}1v?v_4eBBX0KlWIEwG#n)B zOaMhc15kSYT!pvEbz|D+G$Da754}Gn=KlQ^bo=LHhk1P= z{kz5ucuVge9=X_$j4^EvLed@zttPr2K+t$;55S{3iP;4w)T-`x5Jw(LN|&!ikzM4i z2N>on4GqQx&*gW0&uSFJC?oH)#Dwh}d-X>99c4xMU!VHlwgfjfCv|QN|AALilO#J5 z1_H_1kNequtxi3pX+{!-@}z}bBj zHDF{8t0oN#z7`f@fIg)+>DGPxN|6x`zln-X=bHs8z_cHg@M5d;TMp7zIxZp)Ti@cm zNLVrH(?X>(uFsOU)(#si_aG`bv%}zzzPwu!CY`BuTHXeV8F7#KLX)@0`UUWknq4~P zkCNmt{Osm2d|g)HoUg90_O1;_^agz%B?$u5@{a#$Ame8$L(j#ghsCv~ZZ0krnqW17 zaAB!pXh?sa=zo^TDVe^9Nu2?xvIIc<$p1aefZNZXKan6OAI{I_*J9KMeDLlbnJGYN zzc+Hzi&OYa0>uFv*#@e0G^^5jUT#`GDSnV$-ZAR;?dRaNO;ramBM zbPqzH9uqG%qhmN+Bl#1|FiNuA2S6`cT>vDb0N< z(070faBi;qhXCDUM0EEtz^}H+_{ljj=~qX&=0G()_5IUEFakVeDXY>x21DGpciIgs zqo!6W^eLc-7Utki@>^_Te0*c!a@Qle3DCj@SA!=AR2tB`EYv?e<_3|GA?*dleL@J} zG+Y_!XuzXKZxk*1o&}INdRuY#c;iOR$!yqbZa4;r`zKXo=enckyW-GfTqqI{TS^HT z&JXnr;=&&foi!;&YJi)r%H$xmlIB;7D>iCr?pfadD`t5Q24m8J@|sP+zSmAFLVoLx4G({o0!!}hje?St zpRbmjBLWS39j%X?%Z8G2Cg+U2_!Fb`T~LjMO5ah2Q@JC{5l;rrrk*A)h9IT~qGwD- zvpgDJ>rF$pVLGCeEKY>SBq*O?-U0$ISuFtWATjMYByp-Q@#`rIE?$sK@7D3Tk7WAf z*0Gn6+8EFR1)=$$#Z#(DGTLzbns_p}}zg;%GBC#*kwpI)IY{3a-2=Aq**p^Dcs>q^AF3LN(_f?6b@cQ;{TsUe zH`D=Q@mw^2F~eZdaJ*JOB9b(efIk*pj3XU-FHa67xBiSdhVOjrj4T{o@p`&kNmk_c ziKqA|03Rtys%%3KA~A4mu)aka?dR&%3_AUOwZ8pB)$+Gf_C|b~Z$27Td2%CFRpE%- z<_1MQ>Qa}kAV*<)GVjz)x9594mhP98le3z2V0?o=w?AoOk#w&b?CN*@rUT| zRpOlMI@?w@>_X6;o7yzaqhUKC3=I)2*%j0r-snK5v}|(6_(EA&7cCRk|3=p6+un=6$+rcir`**@>0n79F{K z+2ZfsxTAXuf4j;qb{iZ<*8nu>wVf;;khuPL7-acs?J;r3H1LQQAm07>*G|M+8H~($ ztVv*clV0)noMeI@Vwo7 z_qB~p4cY-T9DAlZqpnWGCV5qa1PKxi0ExzBX!Nk6eJGkF;|LsgswOGxs@lC*dfC&( zHG!%30hzqfkQY!`FriaGR;&a5=8%flFlFqM{NO+z5yd+O20k?bBuu18@x7RI*%&K& zd#Y(`xIB_)bh%82E$iqbM}!?D4M*z4etF!%_sZ|2BAxCGoVURrVADL!z$4_InBHFm zc5T-L=5Jx>`}a-w{XE_GUpR22i6N}69_JMDNkjiRf&2HLuTG?i>+X$IKKNNTIOJ99 zAq|C{{1FpxC9dZ=JVa2Pvxonzrpt);3Rzl$F2);Zli3_x1I43`t&WFW!ClQWZoJZGlIRB=7wB3F6q_#Fl^NfChH*qu)z&cJ3}B z+?ivBsZr#XgDG`S$10=E@kA3ycGT1~40Q8a{^Uw+J;!~6ZSrNswUd?>noul)VWV%A z{R$oX!DC4%K+|FRm$iJRp2P~qB=tqWE@*)?tmDDaFps2#`)e^o(c;&-I z;j^@7!O?GHQ}ivL@*Up;Dss*+F>bF(Z`qyx@EQ$v{y0UEU0wvXG(O+O7gVsC@t`!? ze#RYFwBXn|cd$xt7BR7U-M%Y)NK%IfKkDcDrr(I=w z_I2i?D~U#uWk6TadGUgkC@_Gl&$I==CK~`iqRuX_9@n^3@Ysv|+fet9Fa*;4GH>(W zr9&*pbidZXzme?0{Dt(?>33VlgP>Gob78!X;qfy~?f!a|$y7^5a-AjahgaoLSRq-} zmUsE~F7-g|+n;x@Q?1TY(HiPGWE&w^LfY)6mdU4Gq=}Z-E{v9o?%&*b?u>IL!hTlG zT^AR4dG(Ae%vj!AdD8oq1XtSB;9!6s+h^+Wyl)$(`GVK^Pl5eisgOJE{F{}McIfoH zFE1~qU%7WXm4ZUj-TL${H-Z50a!L(J{U9=Oi~}}pl*jwjxfQfG(h*Z+Qf z_|H(c5vbnbHwi7E8W`WCQtsNr*U3MjVNAn6eteMvfZ98#&Dan4u*RKKk5_$0Z&J^r zCV#7s{cBsH772{tn`#ZeZ2x?}=`xdWaLinmqz@YnQNX zBrj3R4vg5`u)KB9nQv36p7-{{GJjuw)=RsQpS>E$oH5 z_@WPB0sLJ$%rS6|?6-JCloXrw#ekb>AH5U_=Eo0YECo9CVBy!VaP{%Yn%{Z!F3p>V z25erFf8m4bNs`#m-5;}a(mUrrj&qEyUtv+^AX>?03cuMp%kPK&9~Ac@&3qC= zyM87;ZA6)1oj92*^uV9w+m1 zKZ`7B{r8cO61n{mwaejwSxyZ5Nh8(Hd3p~4&6##S*{M3-SZ6G#X z{{HKLWZ>a76B0MnZh4*P<&iNHnGkLODS4JxR;-A;@#nArw8bWCe#-iYd8VZ%CG&E_ zs|mPUvJrolLIs~D?)sZzUKZ8C#2@M#J50jIeG5p8rj>hP{p3+pQB^hdQ|MQl&g}ZY zrBBS}zOWoFc7QV?56EE+(|n1t~)441!Y{7PJMqh-FiXQxI;?;X{^xGn4)6>6{R^N52;dQyaGG9Utcb zQY_=UCX24jmeA|RF}Ji^lY^+uyajs*aGeySV&H|#)W1w%5SQ@}cJKU(aGm5$3O}?9 zn+a!bu&A26PD<4ENa6@C^SfNi?L@3aY%a5c0P$yuSYOeK&)?&PA|PD2W>6SKC4X*p z%qx?-8CcosTFPbSx-qWgUiAaoVi4nNUCL*Pn@KEcM?sfYxLIAQnV3_S*fm+sTeQkS`siRTLZ&dj+@jc5JJ>0{kH}EOTz$#| zLt?eV-fQtDh;yCZ_bQgJjUB6gH`r%?^$mf-h#_XoX65rQL3|Vfs|v!y24NHd<@Q;c znJ(;8-B)Tjg)g-#dhv5ScDQJmb+KBtNZIBYnd=H?j4z%?`2E4 z8tSjEbK{o^Urf2;ptYD+%oq#L;Dc_W1X0nxercaoDd6pOXo?L?=QGU$B}9NnZ25YK z2`knwR;u$Pd)V@;E}d_JYHw9`W`}S@5k)nh$C9-m3#=?0_~S!nuDixlt8TIW({#!wbk{j%eoFXqqKM0H`V&F#^O?A=P`wy_-u8L>v0Ln2R{C-CvQ1K{hf0w%mkWZe2b$f5HecN3C93+oUlCan>!_!j7ZVucWU=unV95o-ESZdr zA6YPhc8ZT~>!@@SxEw3{y*tq)7*VL-LYk;lqrYC~QaCH)sYQ)9L>T(Isk%VE8)Cgp zMDD^*O@;Hbx_ji|GRBWfMNM89mGpV=NkEx}&68oQ9J%MpF~wVKP<-y%=hP6~ptgJs zjvpq;7R{L)l!?EFGX*SEU}4ybJG=D2iZ9#Nr}m>#g?X@;4T=mc!=JB0*o<@MWY`e3 zNnL!8?gJzRq)67ouUoRG-5Kb9NW{JKMj>2YSuVxc>{o{ix6Q zU=2?y4THnoUo5eWc=w>a{fY&|mj$v-^qyY+PMi``6pLj1KIllVLwAwPccF!h36r z$sGw0{rA5wA+Op>Cyd4+#c(alo zxEEjzGEc$>UcT-#RFKMM=7J!_041TSe3dX)$@88p>G#Hhn(9Rs zyzNVd3MEbYN3Xv0J$>vk&|LI(dS6v8zQSI1hAqTo3Mv)zUFP0UA%apsb4MJYwH-z0 za5o6;cweaCP9XiM9gb`L3VYu8@MR)1vNqwBn!?vI@@Exl$AWK}GE!)|^BO1|u(C>$ z%Y3`(4u7aJtJ6exh8v6#elFduV~><7!e8XBEo=DA4+?N)2-|ibYB4OT_za_{akFG7XJtC zDl2uB9rW|LG#o2{U@>}UD7W?F;K$UT1qGj@yAiW_L8#lty>KQps6v&SslFzLyzAtp z#7@MbT;v}m{Qw;>wG*NE~`ubMo{KWJW|eu14*i$UeFODqxrf>S;+{~$oiC?*z$lk(lj41G`%24 zS$3PagHLVj_si5c%86M)wGlqzIQ|o?FKuN#pc)>620*{fWWGzb%V6Ea9GRi{dkZ|a zr}e|!pa-XdyuC;3XAQp<60QJn04oKkOj zVbFU?^A3d%!*NjQBp*h&W;4abdVr)OOxDs_HI~TNO4wR=!p~qbyUg|A0lUQKcvFK( z&;)cMOY<^@S`GOG`plK2TCJB5T&KN8oGVnrMZ_N0>ke@Q35t-usk}wU*YyDu0I0IX z1$r~%hYI`_jtZKS^nj!EMV4Fzu;;)SdN1#LN|Ze8rsh!{qgVp3p>4HpEzPWF>paJh zBO@T^KE;F7QFU*)C@Zjj1OIH48rTSO$BMxK)(*c1go|fbF`Db1AYEkEuo~XjcCtG5JADa5QL!}-<(oT zA>%d0E1oQqbdREC;W#Wt6-^35qBH>xMl>T?cu%hxD56gb#Y#yU43-oYhBPd7Cw!1$ zTuQMdKFdUw#>|$$CP31Z4f;nvy50J%?13v3fPm!eX3~l{ZaEipIhVN%Dueur%A%vr z=XiVU094kZ_q!Z2wSjo8bi0{lP=!5?^V{(}5`HUKuCLr3YMsf-W_ZVzApi+0ai+E- zhH|;ebHO@qDvfmO17tNn{~^1A{U-rI?}PM&4ZH48S$}J zg2@lI|IX?p#kpkoYi-woZk_PVFi-rs_4WZzmR->^HU!Ry8_!Xi5+q$^HNN_BE;tn$0 zw^qrkWn6ur2k{$%1>^MUKVo+j7m}4M23SkGQ%VbVYbc+x%jCtJWFz4fD67#_?q)(4 z$Fb(|v9NSd;l3$2hkAAsN zADs&^$#G=AWR9@{i3Fb#P}O4y$Biv!R{!AtNUb7`znT!G|Ab8a#UhfyP!OsGB|k(U zKml)nah*?B<;(`MO7K{&x>1}WYx1Y$Ve_~Yo$B7&U658T;pE{lv_(A4 z1j&CcgKvWfmKa4jO!qQAYWqGkMZnU?C6Jz#9^{7$kw6;u0Ml6~Cj~MZBNcygx8Y%9 zU4IKFADR>_fRv>}Fcm@G{g zTuZpVv|T9{r8?Io#|glRTK;VIC@B)Ig)5^N`C1gip9adxXMsZSFEWz@uiDNdJ~8on z<|3i+*uuO#5jI%h`{cx-bg66Rl1Z_Ro){K?Yj7S+ z=wG0yP`qV9il3I0A-a3H%u_r~Lwg*QjHZB6w=bX??L;4M4Kz{GM@NGG>5a6{2jZB( z`YqY{|2)Z$1_GegdzdmyFqG!r-eT+ZJetb;bw{RnGK@g8le#PQwV+_e52Ob`LIN+k zJBwDr>&VK@?f4#ysnkwvbZSZ`hD=1-5&}(L?<_GQA3l8OCS>~duCW_eX86X!cnur> z9)y##Q>KIRYYr5~!pw}~c8$CO3@e*rtDXmxJIb<><(Xk5h#-gBp^%QX^`P%g&{rX~ z!*40f4F{IL@7dT`e;X|<3BwP}*B&?EIxGH>!Q?W? zoNmO%r(=R7 zpo4(6d*2w7Bo@j*8X4O4?%sd;8XBb(C=5^{fbGhHk~y78w}R4AJ_k@Q`Cmllx&q8( zraB8u2|;~vsCSbg|HFp`FElA$f!qY>W3vLCHxm;Rl%Su!Ooz)J5mM*4*gg&hoKDKm z$Ay(_197X&gW3n}DPH_-*~wt?*Z@;j!`~%_KxxkJ)DDNzO?rX|MyR}@WINsV5Q1+(JY zb;yYG@17X7+-Iqx$pG2peHH6MfYkql({h&@2`=_?5Xw`;-;{UVrOV-oq~w0}QbWU0 zQ=DGP2_zvr@b!Kdw?4OwQ2}Z85jS6kY*ztj8$Tdnv(zQ4Mwi>eoT1aXKiNrBNH}@^JEh%a0HIjsFEmNmnb!vbshmJXf~% z^Yfbrg`EBZOmd*EO99kR+-4^W56iKB3;a;hTWRAE>ts7n8t0W$R8-_!icYJ?0Eh}S zKma*8v&}JOsl#=ZNxuyuh$K?)U@;OfRpK%U{zoA{y}Yjx-Hm$tDM$39hBD|9X%7Y| zN;`M=lR^y+*Fvx}W+^HEw~VmO7#0OX;PeZ(xr2pRSXfY?0JQ*!=E`$l>x1BAa3lvv zY;Zh$=>3qE)Pp#)RTCVWJRG;0tIrs-V~O#FAnxJ1(}0d($;_XVw;?J zg|-{6j3d6@AJD{l(=L|$>C-*n-ukzWZR(5ffr4{iY6BP(=&`;yJUnFoUS3EYa>v%n z>MMwqBW*fbE{SJ~kCIr!<*;eH!}+`1W!6^XV1Lk5JV%-ken1^m3Wp-hbSVYZWI=Z{ zVp(SE*X3N9d%f)!_jZzyPtQ2j@TNYRARa?0*Z~GmDTAo`_#$YbX z@2P6LvGT%?=DOgg6dH=plrT=*3*>{rgBz*;KR?p2bnA+I$)gGUa)j@^&obqtH0JW! zeb@YcAR-Lg>i&}L$F}Qhd8$BB4$?Vo9#ImRL}pkTP6l?<>s{s#3fdOcB^iVLlI=|v zt8a7@65R|=jiowI{w$$tjhWZ~_3&4dURftgRZcu>Iz{bW4!;tsoY?KI*4eSWymRt6 zt?OsdLVkYt`huG6)=O;_?WX_6^(>mrSKp*4dq)+C`9+0IT1S08jND~jddzH}<0P?p zwez@IjO4#NPE{Tw-R?7@U1T%VSJ6}RIt|~d6Md7qu1I9oqAzD8$HVp}V_ouvw84*t d{NHX@dFmYg1Q~2tk~=qFQ<8rsSBx|c{6E(n*lGX( literal 0 HcmV?d00001 diff --git a/ZooFlow/ZooFlow.vbproj b/ZooFlow/ZooFlow.vbproj index 6ef8582a..f8628b45 100644 --- a/ZooFlow/ZooFlow.vbproj +++ b/ZooFlow/ZooFlow.vbproj @@ -89,8 +89,11 @@ + + + @@ -183,16 +186,16 @@ - - - - {991d0231-4623-496d-8bd0-9ca906029cbc} Filesystem + + {af664d85-0a4b-4bab-a2f8-83110c06553a} + Messaging + {44982F9B-6116-44E2-85D0-F39650B1EF99} Config @@ -223,6 +226,21 @@ + + + + + + + + + + + + + + +