functions/Invoke-WUGDeviceRefresh.ps1

function Invoke-WUGDeviceRefresh {
    <#
    .SYNOPSIS
        Refreshes one or more devices' configurations based on physical device scan.
 
    .DESCRIPTION
        Uses the bulk refresh API endpoint to initiate configuration updates for one or more devices.
        This includes resyncing monitor settings, role assignments, and other metadata.
        Also supports refreshing all devices in a device group.
 
    .PARAMETER DeviceId
        One or more device IDs to refresh. Belongs to the 'ByDevice' parameter set.
 
    .PARAMETER GroupId
        The ID of a device group to refresh. Uses PUT /api/v1/device-groups/{groupId}/refresh.
        Belongs to the 'ByGroup' parameter set.
 
    .PARAMETER UpdateNamesForTableActiveMonitor
        Whether to update monitor names from scan data (true/false).
 
    .PARAMETER UpdateEnableSettingsForTableActiveMonitor
        Whether to update monitor enablement state (true/false).
 
    .PARAMETER AddUseInRescanActiveMonitor
        Whether to enable matching monitors for use in rescan (true/false).
 
    .PARAMETER IncludeAssignedRoles
        Whether to include current role, OS, brand matching info (true/false).
 
    .PARAMETER ResetOptions
        Array of reset actions such as 'inventory', 'os', 'snmp', etc.
 
    .PARAMETER DropDataOlderThanHours
        Drop inventory data collected before X hours. Use -1 to keep all.
 
    .EXAMPLE
        Invoke-WUGDeviceRefresh -DeviceId 101,102 -ResetOptions @("inventory", "os")
 
    .EXAMPLE
        Invoke-WUGDeviceRefresh -GroupId 101
 
    .NOTES
        Uses internal helper function Get-WUGAPIResponse for API calls.
    #>

    [CmdletBinding(DefaultParameterSetName = 'ByDevice', SupportsShouldProcess = $true)]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'ByDevice')][Alias("id")][int[]]$DeviceId,
        [Parameter(Mandatory = $true, ParameterSetName = 'ByGroup')][int]$GroupId,
        [Parameter(ParameterSetName = 'ByDevice')][ValidateSet("true", "false")][string]$UpdateNamesForTableActiveMonitor,
        [Parameter(ParameterSetName = 'ByDevice')][ValidateSet("true", "false")][string]$UpdateEnableSettingsForTableActiveMonitor,
        [Parameter(ParameterSetName = 'ByDevice')][ValidateSet("true", "false")][string]$AddUseInRescanActiveMonitor,
        [Parameter(ParameterSetName = 'ByDevice')][ValidateSet("true", "false")][string]$IncludeAssignedRoles,
        [Parameter(ParameterSetName = 'ByDevice')][ValidateSet(
            "inventory", "resources", "ipam", "roles", "interfaces", "os",
            "snmp", "displayname", "assignedroles", "notes", "def",
            "monitors", "primaryip", "credentials", "allattributes")][string[]]$ResetOptions,
        [Parameter(ParameterSetName = 'ByDevice')][ValidateRange(-1, [int]::MaxValue)][int]$DropDataOlderThanHours
    )

    begin {
        Write-Verbose "[Invoke-WUGDeviceRefresh] Begin block starting."
        if (-not $global:WhatsUpServerBaseURI) {
            Write-Error "WhatsUpServerBaseURI is not set. Please run Connect-WUGServer to establish a connection."
            return
        }
        Write-Verbose "Starting device refresh request."
    }

    process {
        Write-Verbose "[Invoke-WUGDeviceRefresh] Processing request."

        if ($PSCmdlet.ParameterSetName -eq 'ByGroup') {
            $uri = "${global:WhatsUpServerBaseURI}/api/v1/device-groups/${GroupId}/refresh"
            Write-Verbose "PUT $uri"
            if (-not $PSCmdlet.ShouldProcess("Device group ${GroupId}", 'Refresh device group')) { return }
            try {
                $response = Get-WUGAPIResponse -Uri $uri -Method 'PUT'
                Write-Verbose "Successfully triggered refresh for device group ${GroupId}."
                return $response
            }
            catch {
                Write-Error "Failed to refresh device group ${GroupId}: $_"
            }
        }
        else {
            $baseUri = "${global:WhatsUpServerBaseURI}/api/v1/devices"

            if (-not $PSCmdlet.ShouldProcess("Device(s) $($DeviceId -join ', ')", 'Refresh device configuration')) { return }

            if ($DeviceId.Count -eq 1) {
                # Single-device optimised path: PUT /devices/{id}/refresh
                $uri = "$baseUri/$($DeviceId[0])/refresh"
                Write-Verbose "PUT $uri"
                try {
                    $response = Get-WUGAPIResponse -Uri $uri -Method 'PUT'
                    if ($response.data.success -eq $true) {
                        Write-Information -Message "Refresh request accepted for device $($DeviceId[0]). Scan ID: $($response.data.id)"
                        return $response.data.id
                    } else {
                        return $response.data
                    }
                }
                catch {
                    Write-Error "Failed to refresh device $($DeviceId[0]): $_"
                }
            }
            else {
                # Batch path: PATCH /devices/-/refresh
                $uri = "$baseUri/-/refresh"
                Write-Verbose "PATCH $uri"

                $body = @{ deviceIds = $DeviceId }

                if ($UpdateNamesForTableActiveMonitor)      { $body.updateNamesForTableActiveMonitor = $UpdateNamesForTableActiveMonitor }
                if ($UpdateEnableSettingsForTableActiveMonitor) { $body.updateEnableSettingsForTableActiveMonitor = $UpdateEnableSettingsForTableActiveMonitor }
                if ($AddUseInRescanActiveMonitor)           { $body.addUseInRescanActiveMonitor = $AddUseInRescanActiveMonitor }
                if ($IncludeAssignedRoles)                  { $body.includeAssignedRoles = $IncludeAssignedRoles }
                if ($ResetOptions)                          { $body.resetOptions = $ResetOptions }
                if ($PSBoundParameters.ContainsKey('DropDataOlderThanHours')) { $body.dropDataOlderThanHours = $DropDataOlderThanHours }

                $jsonBody = $body | ConvertTo-Json -Depth 4

                try {
                    Write-Information -Message "Sending refresh request for DeviceIds: $($DeviceId -join ', ')"
                    $response = Get-WUGAPIResponse -Uri $uri -Method PATCH -Body $jsonBody

                    if ($response.data.success -eq $true) {
                        Write-Information -Message "Refresh request accepted successfully. Scan ID: $($response.data.id)"
                        return $response.data.id
                    } else {
                        Write-Warning "Refresh request returned success = false."
                        return $response.data
                    }
                } catch {
                    Write-Error "Failed to refresh device config(s): $_"
                }
            }
        }
    }

    end {
        Write-Verbose "[Invoke-WUGDeviceRefresh] End block completed."
        Write-Verbose "Completed bulk device refresh."
    }
}
# End of Invoke-WUGDeviceRefresh function
# End of script
#------------------------------------------------------------------
# This script is part of the WhatsUpGoldPS PowerShell module.
# It is designed to interact with the WhatsUp Gold API for network monitoring.
# The script is provided as-is and is not officially supported by WhatsUp Gold.
# Use at your own risk.
#------------------------------------------------------------------
# SIG # Begin signature block
# MIIVlwYJKoZIhvcNAQcCoIIViDCCFYQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAMjLHXeCiwppli
# 4Gck7m8clxQ2RlCmO98zgvrpR7Rn3KCCEdMwggVvMIIEV6ADAgECAhBI/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/
# L9Uo2bC5a4CH2RwwggY+MIIEpqADAgECAhAHnODk0RR/hc05c892LTfrMA0GCSqG
# SIb3DQEBDAUAMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0
# ZWQxKzApBgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYw
# HhcNMjYwMjA5MDAwMDAwWhcNMjkwNDIxMjM1OTU5WjBVMQswCQYDVQQGEwJVUzEU
# MBIGA1UECAwLQ29ubmVjdGljdXQxFzAVBgNVBAoMDkphc29uIEFsYmVyaW5vMRcw
# FQYDVQQDDA5KYXNvbiBBbGJlcmlubzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCC
# AgoCggIBAPN6aN4B1yYWkI5b5TBj3I0VV/peETrHb6EY4BHGxt8Ap+eT+WpEpJyE
# tRYPxEmNJL3A38Bkg7mwzPE3/1NK570ZBCuBjSAn4mSDIgIuXZnvyBO9W1OQs5d6
# 7MlJLUAEufl18tOr3ST1DeO9gSjQSAE5Nql0QDxPnm93OZBon+Fz3CmE+z3MwAe2
# h4KdtRAnCqwM+/V7iBdbw+JOxolpx+7RVjGyProTENIG3pe/hKvPb501lf8uBAAD
# LdjZr5ip8vIWbf857Yw1Bu10nVI7HW3eE8Cl5//d1ribHlzTzQLfttW+k+DaFsKZ
# BBL56l4YAlIVRsrOiE1kdHYYx6IGrEA809R7+TZA9DzGqyFiv9qmJAbL4fDwetDe
# yIq+Oztz1LvEdy8Rcd0JBY+J4S0eDEFIA3X0N8VcLeAwabKb9AjulKXwUeqCJLvN
# 79CJ90UTZb2+I+tamj0dn+IKMEsJ4v4Ggx72sxFr9+6XziodtTg5Luf2xd6+Phha
# mOxF2px9LObhBLLEMyRsCHZIzVZOFKu9BpHQH7ufGB+Sa80Tli0/6LEyn9+bMYWi
# 2ttn6lLOPThXMiQaooRUq6q2u3+F4SaPlxVFLI7OJVMhar6nW6joBvELTJPmANSM
# jDSRFDfHRCdGbZsL/keELJNy+jZctF6VvxQEjFM8/bazu6qYhrA7AgMBAAGjggGJ
# MIIBhTAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimqF6TNDDAdBgNVHQ4EFgQU
# 6YF0o0D5AVhKHbVocr8GaSIBibAwDgYDVR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQC
# MAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwSgYDVR0gBEMwQTA1BgwrBgEEAbIxAQIB
# AwIwJTAjBggrBgEFBQcCARYXaHR0cHM6Ly9zZWN0aWdvLmNvbS9DUFMwCAYGZ4EM
# AQQBMEkGA1UdHwRCMEAwPqA8oDqGOGh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2Vj
# dGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FSMzYuY3JsMHkGCCsGAQUFBwEBBG0wazBE
# BggrBgEFBQcwAoY4aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGlj
# Q29kZVNpZ25pbmdDQVIzNi5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNl
# Y3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAEIsm4xnOd/tZMVrKwi3doAXvC
# wOA/RYQnFJD7R/bSQRu3wXEK4o9SIefye18B/q4fhBkhNAJuEvTQAGfqbbpxow03
# J5PrDTp1WPCWbXKX8Oz9vGWJFyJxRGftkdzZ57JE00synEMS8XCwLO9P32MyR9Z9
# URrpiLPJ9rQjfHMb1BUdvaNayomm7aWLAnD+X7jm6o8sNT5An1cwEAob7obWDM6s
# X93wphwJNBJAstH9Ozs6LwISOX6sKS7CKm9N3Kp8hOUue0ZHAtZdFl6o5u12wy+z
# zieGEI50fKnN77FfNKFOWKlS6OJwlArcbFegB5K89LcE5iNSmaM3VMB2ADV1FEcj
# GSHw4lTg1Wx+WMAMdl/7nbvfFxJ9uu5tNiT54B0s+lZO/HztwXYQUczdsFon3pjs
# Nrsk9ZlalBi5SHkIu+F6g7tWiEv3rtVApmJRnLkUr2Xq2a4nbslUCt4jKs5UX4V1
# nSX8OM++AXoyVGO+iTj7z+pl6XE9Gw/Td6WKKKsxggMaMIIDFgIBATBoMFQxCzAJ
# BgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzApBgNVBAMTIlNl
# Y3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYCEAec4OTRFH+FzTlzz3Yt
# N+swDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgZV2nQyne4xjCYaJY+qFKcT0g48CdH18e
# RIFbmhrJkcYwDQYJKoZIhvcNAQEBBQAEggIAW+qk2RiCIlI6wLF3pZuS6w9VnSv6
# YAB+fiCyhgZTOOv3+JALqjlsKuvcDuhihUcSFwNkCEGn4jLeApcvr3Eg/eG00QO/
# DwMbNPQ/mH5/YXTjlAYaExuy7EtHD4ZNuScG3241d05qMKtqOfJuWRYoXWQmkn2L
# MUu25fbxijaKdYiCpNKRHWTEUnfCPClpg1VSjP9EzpwxIcstY4+++174z/wGj3Ev
# 9IWQNjpv+id/hsXjaK2Fjlrxn0YVokAPaJHyG9Jl1/+o4RtFk8i9mSnmXW35TAx9
# iyQqrdvy1VupcdxuTbMdz2GZyUELcyH8gq2a6GL+HyAEoTcD4dfdIWR3BkqVz7oy
# 9cvzWcp3xtjZPHtpEOaITXGLOnT4QnxQtEgUB37EOPQCSzqMg4C/62pdAItXAvyE
# zioWAgtOXNSyk1vtfzATOkkkzqQOxMdc/XTMgZ2SdK/FK5UIIB+yHTL/UVkdA2eh
# 22x0wgxD7PRJ93cEU/Ecg30N3XS6fgfILXlUrTzYiv2zmZcxqMN/JE6J1snrPZcP
# l8ZfUtwk5EBtRCjuzGSSIOm6CS97srBaNykSGtC+sYS7Qosf6v5jkHPRd/KcoITS
# 2kr8I1cDa+KAWn2Vb27ZAHdaW7GIGm6c8rQEIzjx9sEIMAKYnyysy5XpNPq5FRHn
# Lu7OiNaP4cla47k=
# SIG # End signature block