functions/Get-WUGActiveMonitor.ps1
|
<#
.SYNOPSIS Get active monitor templates, global assignments, or device-specific assignments from WhatsUp Gold. .DESCRIPTION - Uses /api/v1/monitors/- for active monitor templates (returns .ActiveMonitorTemplates). - Uses /api/v1/monitors/-/assignments/- for global monitor assignments. - Uses /api/v1/devices/{deviceId}/monitors/- or /api/v1/devices/{deviceId}/monitors/{assignmentId} for device-specific assignments. - Always returns a flat array of assignment objects, with assignment fields and matching monitor template fields (when available). - For device-only queries, you get just device assignments. - For global/IncludeAssignments queries, you get all assignments, each with their template info. - Output is always suitable for piping to Where-Object { $_.comment -match 'dns' }. - Parameters strictly match API support (see Swagger for each endpoint). .PARAMETER View Level of information returned for templates/assignments ("id","basic","info","summary","details" or assignment-appropriate values). Default = "info". .PARAMETER IncludeDeviceMonitors [templates only] Return device-specific monitors. Default = "false". .PARAMETER IncludeSystemMonitors [templates only] Return monitors owned by the system and cannot be modified. Default = "false". .PARAMETER IncludeCoreMonitors [templates only] Return core monitors. Default = "false". .PARAMETER Search Return only monitors/assignments containing this string in display name, description, or classId. .PARAMETER PageId Page to return (for paging). .PARAMETER DeviceId If specified, returns assignments for the given device. If AssignmentId is also specified, returns that specific assignment. .PARAMETER AssignmentId If specified with DeviceId, returns that specific assignment on the device. .PARAMETER AssignmentView Assignment info level ("id","minimum","basic","status"). Default="status". .PARAMETER DeviceView Assignment device info level for global assignments ("id","basic","card","overview"). Default="id". .PARAMETER MonitorTypeId [device assignments] Optional: filter by monitor type id. .PARAMETER EnabledOnly [device assignments] Optional: Only enabled assignments. Default="true". .PARAMETER IncludeAssignments If set, get both templates and global assignments (returns a flat list of assignments merged with template info). .EXAMPLE Get-WUGActiveMonitor -IncludeAssignments -Search "Ping" .EXAMPLE Get-WUGActiveMonitor -DeviceId 1234 -Search "CPU" .EXAMPLE Get-WUGActiveMonitor -DeviceId 1234 -AssignmentId 2345 .NOTES Parameters and response structure strictly follow WhatsUp Gold API documentation, and output is a flat list of assignments with template info merged in. #> function Get-WUGActiveMonitor { [CmdletBinding()] param( [ValidateSet("id", "basic", "info", "summary", "details")] [string]$View = "info", [ValidateSet("true", "false")] [string]$IncludeDeviceMonitors = "false", [ValidateSet("true", "false")] [string]$IncludeSystemMonitors = "false", [ValidateSet("true", "false")] [string]$IncludeCoreMonitors = "false", [string]$Search, [ValidateSet("true", "false")] [string]$PageId, [Parameter()][switch]$IncludeAssignments, [ValidateSet("id", "minimum", "basic", "status")] [string]$AssignmentView = "status", [ValidateSet("id", "basic", "card", "overview")] [string]$DeviceView = "overview", [string]$DeviceId, [string]$AssignmentId, [string]$MonitorTypeId, [ValidateSet("true", "false")] [string]$EnabledOnly = "true" ) begin { if (-not $global:WUGBearerHeaders) { Write-Error "Authorization header not set. Please run Connect-WUGServer first." return } if (-not $global:WhatsUpServerBaseURI) { Write-Error "Base URI not found. Please run Connect-WUGServer first." return } } process { function Write-DebugActive { param($activeObj) Write-Verbose ("[DEBUG] .active = " + ($activeObj | ConvertTo-Json -Depth 5)) } function Get-ActiveCommentArgument { param($active) $comment = $null $argument = $null if ($active) { if ($active -is [System.Collections.IDictionary]) { $comment = $active["comment"] $argument = $active["argument"] } elseif ($active -is [PSObject]) { $comment = if ($active.PSObject.Properties['comment']) { $active.PSObject.Properties['comment'].Value } else { $null } $argument = if ($active.PSObject.Properties['argument']) { $active.PSObject.Properties['argument'].Value } else { $null } } if (-not $comment -and $active.comment) { $comment = $active.comment } if (-not $argument -and $active.argument) { $argument = $active.argument } } return @($comment, $argument) } # Templates for merging with assignments (always fetched if IncludeAssignments or no DeviceId) $activeMonitors = @() if ($IncludeAssignments -or -not $DeviceId) { $templateQS = "type=active&" if ($View) { $templateQS += "view=$View&" } if ($IncludeDeviceMonitors) { $templateQS += "includeDeviceMonitors=$IncludeDeviceMonitors&" } if ($IncludeSystemMonitors) { $templateQS += "includeSystemMonitors=$IncludeSystemMonitors&" } if ($IncludeCoreMonitors) { $templateQS += "includeCoreMonitors=$IncludeCoreMonitors&" } if ($Search) { $templateQS += "search=$Search&" } if ($AllMonitors) { $templateQS += "allMonitors=$AllMonitors&" } if ($PageId) { $templateQS += "pageId=$PageId&" } $templateQS = $templateQS.TrimEnd('&') $templateURI = "${global:WhatsUpServerBaseURI}/api/v1/monitors/-" if ($templateQS) { $templateURI += "?$templateQS" } try { $templateResponse = Get-WUGAPIResponse -Uri $templateURI -Method GET if ($templateResponse.data -and $templateResponse.data.activeMonitors) { $activeMonitors = $templateResponse.data.activeMonitors } } catch { Write-Error "Failed to retrieve active monitor templates: $_" } } # If DeviceId (device-specific assignments) if ($DeviceId) { $qs = "type=active&" if ($AssignmentView) { $qs += "view=$AssignmentView&" } if ($Search) { $qs += "search=$Search&" } if ($MonitorTypeId) { $qs += "monitorTypeId=$MonitorTypeId&" } if ($EnabledOnly) { $qs += "enabledOnly=$EnabledOnly&" } if ($PageId) { $qs += "pageId=$PageId&" } $qs = $qs.TrimEnd('&') if ($AssignmentId) { $uri = "${global:WhatsUpServerBaseURI}/api/v1/devices/$DeviceId/monitors/$AssignmentId" if ($qs) { $uri += "?$qs" } try { $response = Get-WUGAPIResponse -Uri $uri -Method GET if ($response.data) { $comment = $null; $argument = $null if ($response.data.active) { $arr = Get-ActiveCommentArgument $response.data.active $comment = $arr[0]; $argument = $arr[1] } # Merge with template (if available) $tid = $response.data.monitorTypeId $template = $null if ($tid -and $activeMonitors) { $template = $activeMonitors | Where-Object { $_.monitorId -eq $tid -or $_.id -eq $tid } | Select-Object -First 1 } [PSCustomObject]@{ DeviceMonitorAssignmentId = $response.data.id Description = $response.data.description Type = $response.data.type MonitorTypeId = $response.data.monitorTypeId MonitorTypeClassId = $response.data.monitorTypeClassId MonitorTypeName = $response.data.monitorTypeName IsGlobal = $response.data.isGlobal Status = $response.data.status Enabled = $response.data.enabled comment = $comment argument = $argument TemplateName = $template.name TemplateDescription = $template.description TemplateMonitorId = $template.monitorId TemplateId = $template.id TemplateClassId = $template.monitorTypeClassId TemplateInfo = $template.monitorTypeInfo } } } catch { Write-Error "Failed to retrieve assignment $AssignmentId for device ${DeviceId}: $_" } return } else { $uri = "${global:WhatsUpServerBaseURI}/api/v1/devices/$DeviceId/monitors/-" if ($qs) { $uri += "?$qs" } try { $response = Get-WUGAPIResponse -Uri $uri -Method GET if ($response.data) { return $response.data | ForEach-Object { $comment = $null; $argument = $null if ($_.active) { $arr = Get-ActiveCommentArgument $_.active $comment = $arr[0]; $argument = $arr[1] } # Merge with template (if available) $tid = $_.monitorTypeId $template = $null if ($tid -and $activeMonitors) { $template = $activeMonitors | Where-Object { $_.monitorId -eq $tid -or $_.id -eq $tid } | Select-Object -First 1 } [PSCustomObject]@{ DeviceMonitorAssignmentId = $_.id Description = $_.description Type = $_.type MonitorTypeId = $_.monitorTypeId MonitorTypeClassId = $_.monitorTypeClassId MonitorTypeName = $_.monitorTypeName IsGlobal = $_.isGlobal Status = $_.status Enabled = $_.enabled comment = $comment argument = $argument TemplateName = $template.name TemplateDescription = $template.description TemplateMonitorId = $template.monitorId TemplateId = $template.id TemplateClassId = $template.monitorTypeClassId TemplateInfo = $template.monitorTypeInfo } } } } catch { Write-Error "Failed to retrieve monitor assignments for device ${DeviceId}: $_" } return } } # Otherwise: global assignments (IncludeAssignments) - return flat merged list $assignQS = "type=active&" if ($AssignmentView) { $assignQS += "view=$AssignmentView&" } if ($DeviceView) { $assignQS += "deviceView=$DeviceView&" } if ($Search) { $assignQS += "search=$Search&" } if ($PageId) { $assignQS += "pageId=$PageId&" } $assignQS = $assignQS.TrimEnd('&') $assignURI = "${global:WhatsUpServerBaseURI}/api/v1/monitors/-/assignments/-" if ($assignQS) { $assignURI += "?$assignQS" } $assignments = @() try { $assignmentsResponse = Get-WUGAPIResponse -Uri $assignURI -Method GET if ($assignmentsResponse.data) { $assignments = $assignmentsResponse.data } } catch { Write-Error "Failed to retrieve active monitor assignments: $_" } # Build a lookup hash for templates for join $templateMap = @{} foreach ($t in $activeMonitors) { $tid = $t.monitorId if (-not $tid -and $t.id) { $tid = $t.id } if ($tid) { $templateMap["$tid"] = $t } } foreach ($a in $assignments) { $comment = $null; $argument = $null if ($a.active) { $arr = Get-ActiveCommentArgument $a.active $comment = $arr[0] $argument = $arr[1] } $tid = $a.monitorTypeId $template = $null if ($tid -and $templateMap.ContainsKey("$tid")) { $template = $templateMap["$tid"] } [PSCustomObject]@{ DeviceId = $a.device.id DeviceName = $a.device.name DeviceHostName = $a.device.hostName DeviceAddress = $a.device.networkAddress DeviceDescription = $a.device.description DeviceRole = $a.device.role DeviceBrand = $a.device.brand DeviceOS = $a.device.os AssignmentId = $a.id Description = $a.description Status = $a.status Type = $a.type MonitorTypeId = $a.monitorTypeId MonitorTypeClassId= $a.monitorTypeClassId MonitorTypeName = $a.monitorTypeName Enabled = $a.enabled IsGlobal = $a.isGlobal comment = $comment argument = $argument TemplateName = $template.name TemplateDescription = $template.description TemplateMonitorId = $template.monitorId TemplateId = $template.id TemplateClassId = $template.monitorTypeClassId TemplateInfo = $template.monitorTypeInfo } } } } # SIG # Begin signature block # MIIVvgYJKoZIhvcNAQcCoIIVrzCCFasCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAKw3gdvDNmXw+o # oWGSD91crt5RFe1wapljdmycrUFLLaCCEfkwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5 # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3 # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4 # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1 # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7 # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2 # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/ # L9Uo2bC5a4CH2RwwggZkMIIEzKADAgECAhEA6IUbK/8zRw2NKvPg4jKHsTANBgkq # hkiG9w0BAQwFADBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2 # MB4XDTIzMDQxOTAwMDAwMFoXDTI2MDcxODIzNTk1OVowVTELMAkGA1UEBhMCVVMx # FDASBgNVBAgMC0Nvbm5lY3RpY3V0MRcwFQYDVQQKDA5KYXNvbiBBbGJlcmlubzEX # MBUGA1UEAwwOSmFzb24gQWxiZXJpbm8wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQC2JA01BehqpO3INejKVsKScaS9sd0Hjoz1tceFig6Yyu2glTKimH9n # r9l5438Cjpc1x+n42gMfnS5Cza4tZUWr1usOq3d0TljKFOOSW8Uve1J+PC0f/Hxp # DbI8hE38ICDmgv8EozBOgo4lPm/rDHVTHgiRZvy1H8gPTuE13ck2sevVslku2E2F # 8wst5Kb12OqngF96RXptEeM0iTipPhfNinWCa8e58+mbt1dHCbX46593DRd3yQv+ # rvPkIh9QkMGmumfjV5lv1S3iqf/Vg6XP9R3lTPMWNO2IEzIjk12t817rU3xYyf2Q # 4dlA/i1bRpFfjEVcxQiZJdQKnQlqd3hOk0tr8bxTI3RZxgOLRgC8mA9hgcnJmreM # WP4CwXZUKKX13pMqzrX/qiSUsB+Mvcn7LHGEo9pJIBgMItZW4zn4uPzGbf53EQUW # nPfUOSBdgkRAdkb/c7Lkhhc1HNPWlUqzS/tdopI7+TzNsYr7qEckXpumBlUSONoJ # n2V1zukFbgsBq0mRWSZf+ut3OVGo7zSYopsMXSIPFEaBcxNuvcZQXv6YdXEsDpvG # mysbgVa/7uP3KwH9h79WeFU/TiGEISH5B59qTg26+GMRqhyZoYHj7wI36omwSNja # tUo5cYz4AEYTO58gceMcztNO45BynLwPbZwZ0bxPN2wL1ruIYd+ewQIDAQABo4IB # rjCCAaowHwYDVR0jBBgwFoAUDyrLIIcouOxvSK4rVKYpqhekzQwwHQYDVR0OBBYE # FJHuVIzRubayI0tfw82Q7Q/47iu9MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8E # AjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMEoGA1UdIARDMEEwNQYMKwYBBAGyMQEC # AQMCMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeB # DAEEATBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1Nl # Y3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGsw # RAYIKwYBBQUHMAKGOGh0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1Ymxp # Y0NvZGVTaWduaW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5z # ZWN0aWdvLmNvbTAjBgNVHREEHDAagRhqYXNvbi5hbGJlcmlub0BnbWFpbC5jb20w # DQYJKoZIhvcNAQEMBQADggGBAET0EFH0r+hqoQWr4Ha9UDuEv28rTgV2aao1nFRg # GZ/5owM7x9lxappLUbgQFfeIzzAsp3gwTKMYf47njUjvOBZD9zV/3I/vaLmY2enm # MXZ48Om9GW4pNmnvsef2Ub1/+dRzgs8UFX5wBJcfy4OWP3t0OaKJkn+ZltgFF1cu # L/RPiWSRcZuhh7dIWgoPQrVx8BtC8pkh4F5ECxogQnlaDNBzGYf1UYNfEQOFec31 # UK8oENwWx5/EaKFrSi9Y4tu6rkpH0idmYds/1fvqApGxujhvCO4Se8Atfc98icX4 # DWkc1QILREHiVinmoO3smmjB5wumgP45p9OVJXhI0D0gUFQfOSappa5eO2lbnNVG # 90rCsADmVpDDmNt2qPG01luBbX6VtWMP2thjP5/CWvUy6+xfrhlqvwZyZt3SKtuf # FWkqnNWMnmgtBNSmBF5+q8w5SJW+24qrncKJWSIim/nRtC11XnoI9SXlaucS3Nlb # crQVicXOtbhksEqMTn52i8NOfzGCAxswggMXAgEBMGkwVDELMAkGA1UEBhMCR0Ix # GDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJs # aWMgQ29kZSBTaWduaW5nIENBIFIzNgIRAOiFGyv/M0cNjSrz4OIyh7EwDQYJYIZI # AWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B # CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAv # BgkqhkiG9w0BCQQxIgQgQWiHM5PuHUvzHVZQEqCeaTVEeIfaK5tmcfoQS84fpaEw # DQYJKoZIhvcNAQEBBQAEggIAomMnaYwJmAbfa25LB2f/CI6XXbVPTHkymzOxg+8k # 2m1qOCLvDem9+j83ErNU9mQ6KuKfxJxjqIwxQElt2xe4G1TSSSFRLF+avfpsZmZ3 # j34qlELU29gnRrupdII2ewJ6v5NloQ6521qgWrf8eggGXPYVJsLjWs8CAssIcPeY # ZhfdE7bkU28jPF76cyal0osv397hQu40AyIa/x80ONP+50+Szkd5aiIpzoYPwbBg # Lon1Ihxpgr5FUbMG7aGiwxhuV2IBJBOaH7wxiMbrMVkfTlEudqu8Q7Cog2XgZH0q # BWvz3NNdRIL7mdz8PxHq2polG6Puf6tUBvo2Go+eJbDFm7Izl0NQIUPBEFiZPH/R # oU2tUxk2ICDgbSX7GpQlomh7aTWV4KtC68NPVcoZnYWTsZLrIIZcKl5I7O0OX136 # cEwHi0ZhVKQKGks3E+seuscQWsfXxpyjK+MTvWdN04z+1SkKizD79r3gBbyx+a2f # wTbbq5H7xyMWbV2UbrQ0ajyot1mcH61lCx+4ZzPsal8T+9D09sKh1DwZn0tN1ivh # o7CXyZxHUGyOoEPRinK/5DQLaL+ZdBglxgZu7v/K4Nqy38P5oby7P0eZyP98OSoY # T+P69Bf8ePc3RTT7ypgIH3NIzlTBATJjnwAUB14C1an38VOh/AtR4WHXiUuLUnfX # 1o0= # SIG # End signature block |