HP.WorkforceExperience.psm1

#
# Copyright 2018-2026 HP Development Company, L.P.
# All Rights Reserved.
#
# NOTICE: All information contained herein is, and remains the property of HP Development Company, L.P.
#
# The intellectual and technical concepts contained herein are proprietary to HP Development Company, L.P
# and may be covered by U.S. and Foreign Patents, patents in process, and are protected by
# trade secret or copyright law. Dissemination of this information or reproduction of this material
# is strictly forbidden unless prior written permission is obtained from HP Development Company, L.P.



<#
.SYNOPSIS
  Sets the update settings for the HP Workforce Experience agent
 
.DESCRIPTION
    This command sets the update settings for the HP Workforce Experience agent, allowing you to enable or disable automatic updates and specify particular versions of the Insights Agent, Analytics Agent, and Insights Plugin to use. For more information, please visit https://learn.workforceexperience.hp.com/docs/managing-software-updates-for-hp-insights
 
.PARAMETER AutoUpdateEnabled
    If set to $true, this will enable automatic updates for the Workforce Experience agent. If set to $false, automatic updates will be disabled.
 
.PARAMETER InsightsAgentVersion
    Specifies the version of the HP Insights package to use. Cannot be set if AutoUpdateEnabled is set to $true.
 
.PARAMETER AnalyticsAgentVersion
    Specifies the version of the HP Insights Analytics package to use. Cannot be set if AutoUpdateEnabled is set to $true.
 
.PARAMETER InsightsPluginVersion
    Specifies the version of the HP Insights Plugin package to use. Cannot be set if AutoUpdateEnabled is set to $true.
 
.PARAMETER StrictVersioning
    If set to $true, this will enable force-update Opt-Out option. If set to $false, the Force-Update Opt-Out option will be disabled. Cannot be set if AutoUpdateEnabled is set to $true.
 
.EXAMPLE
    PS C:\> Set-HPWxpAgentVersionUpdates -AutoUpdateEnabled $true
 
.EXAMPLE
    PS C:\> Set-HPWxpAgentVersionUpdates -InsightsPluginVersion "1.0.0.0" -UseStrictVersioning $true
#>


function Set-HPWxpAgentVersionUpdates {
    [CmdletBinding(DefaultParameterSetName = 'VersionSettings')]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'AutoUpdate')]
        [bool]$AutoUpdateEnabled,

        [Parameter(Mandatory = $false, ParameterSetName = 'VersionSettings')]
        [string]$InsightsAgentVersion,

        [Parameter(Mandatory = $false, ParameterSetName = 'VersionSettings')]
        [string]$AnalyticsAgentVersion,

        [Parameter(Mandatory = $false, ParameterSetName = 'VersionSettings')]
        [string]$InsightsPluginVersion,

        [Parameter(Mandatory = $false, ParameterSetName = 'VersionSettings')]
        [bool]$StrictVersioning
    )

    # User must specify either AutoUpdateEnabled or at least one of the version settings, but not both
    # Default parameter set is VersionSettings, so if user does not specify AutoUpdateEnabled,
    # we will assume they want to set version settings and validate that at least one version setting is specified
     if ($PSCmdlet.ParameterSetName -eq 'VersionSettings' -and -not ($InsightsAgentVersion -or $AnalyticsAgentVersion -or $InsightsPluginVersion -or $StrictVersioning)) {
        throw "Please specify at least one parameter."
    }
    
    # REG_DWORD,IsVersionPolicy: 300
    # REG_SZ, TechpulseVersion: 5.XX.XXX
    # REG_SZ, HPTAVersion: 4.X.XXXX.X
    # REG_SZ, PluginPackageVersion: 1.X.X.X
    # REG_SZ, UseStrictVersioning: False or True
    $registryPath = "HKLM:\SOFTWARE\Policies\Hewlett-Packard\HPTechPulse\GPO\TechPulseVersionPolicy"

    if (-not (Test-Path $registryPath)) {
        try {
            New-Item -Path $registryPath -Force | Out-Null
        }
        catch {
            throw "Failed to create registry key at $($registryPath): $_"
        }
    }

    # Silently Continue because we can check if the key exists using the output of Get-ItemProperty
    $isVersionPolicy = Get-ItemProperty -Path $registryPath -Name "IsVersionPolicy" -ErrorAction SilentlyContinue

    if($PSCmdlet.ParameterSetName -eq 'AutoUpdate') {
        if ($isVersionPolicy) {
            # Key exists, check if the value is already set to the desired value
            # true = 0 (auto-updates enabled)
            # false = 400 (auto-updates disabled by CMSL)
            if($AutoUpdateEnabled -and $isVersionPolicy.IsVersionPolicy -ne 0) {
                try {
                    Set-ItemProperty -Path $registryPath -Name "IsVersionPolicy" -Value 0
                    Write-Output "Successfully set IsVersionPolicy to 0."
                }
                catch {
                    throw "Failed to set IsVersionPolicy to 0: $_"
                }
            }
            elseif(-not $AutoUpdateEnabled -and $isVersionPolicy.IsVersionPolicy -ne 400) {
                try {
                    Set-ItemProperty -Path $registryPath -Name "IsVersionPolicy" -Value 400
                    Write-Output "Successfully set IsVersionPolicy to 400."
                }
                catch {
                    throw "Failed to set IsVersionPolicy to 400: $_"
                }
            }
            else {
                Write-Output "IsVersionPolicy is already set to the desired value. No changes needed."
            }
        }
        else {
            # Key does not exist, create it and set the value
            try {
                if($AutoUpdateEnabled) {
                    New-ItemProperty -Path $registryPath -Name "IsVersionPolicy" -Value 0 -PropertyType DWORD -Force | Out-Null
                    Write-Output "Successfully created IsVersionPolicy with value 0."
                }
                else {
                    New-ItemProperty -Path $registryPath -Name "IsVersionPolicy" -Value 400 -PropertyType DWORD -Force | Out-Null
                    Write-Output "Successfully created IsVersionPolicy with value 400."
                }
            }
            catch {
                throw "Failed to create IsVersionPolicy registry key at $($registryPath): $_"
            }
        }
    }
    else {
        if($isVersionPolicy.IsVersionPolicy -eq 0) {
            throw "Cannot set agent versions when automatic updates are enabled. Please disable automatic updates to set specific agent versions."
        }

        Write-Verbose "Automatic updates are disabled. Setting agent version update settings..."

        # check ADMX file from https://downloads.hpdaas.com/production/microsoft/tm-client/InsightsPolicy/HPInsights_Version_Settings.zip
        # to make sure the version passed in is supported in the ADMX file

        # download zip file and extract
        $zipUrl = "https://downloads.hpdaas.com/production/microsoft/tm-client/InsightsPolicy/HPInsights_Version_Settings.zip"
        $zipPath = "$env:TEMP\HPInsights_Version_Settings.zip"
        $extractPath = "$env:TEMP\HPInsights_Version_Settings"

        try {
            # add proxy support
            Invoke-WebRequest -Uri $zipUrl -OutFile $zipPath -UseBasicParsing 
            Expand-Archive -Path $zipPath -DestinationPath $extractPath -Force
        }
        catch {
            throw "Failed to download or extract ADMX file: $_"
        }

        # ADMX files are in XML format
        $admxFile = Join-Path -Path $extractPath -ChildPath "HPInsights_Version_Settings.admx"
        if(-not (Test-Path $admxFile)) {
            throw "ADMX file not found at expected path: $admxFile"
        }

        [xml]$admxContent = Get-Content -Path $admxFile 
        # In the ADMX structure (policyDefinitions > policies > policy > elements),
        # each setting (for example, TechpulseVersion) is represented as an enum entry, where each item/value/string defines a supported version.
        $supportedTechpulseVersions = $admxContent.policyDefinitions.policies.policy.elements.enum | 
            Where-Object { $_.id -eq "TechpulseVersion" } | Select-Object -ExpandProperty item | Select-Object -ExpandProperty value | Select-Object -ExpandProperty string
        Write-Verbose "Supported Techpulse Versions from ADMX: $($supportedTechpulseVersions -join ", ")"

        $supportedHPTAVersions = $admxContent.policyDefinitions.policies.policy.elements.enum | 
            Where-Object { $_.id -eq "HPTAVersion" } | Select-Object -ExpandProperty item | Select-Object -ExpandProperty value | Select-Object -ExpandProperty string
        
        Write-Verbose "Supported HPTA Versions from ADMX: $($supportedHPTAVersions -join ", ")"

        $supportedPluginPackageVersions = $admxContent.policyDefinitions.policies.policy.elements.enum |
            Where-Object { $_.id -eq "PluginPackageVersion" } | Select-Object -ExpandProperty item | Select-Object -ExpandProperty value | Select-Object -ExpandProperty string
        Write-Verbose "Supported Plugin Package Versions from ADMX: $($supportedPluginPackageVersions -join ", ")"
        
        # validate the versions passed in by the user against the supported versions in the ADMX file
        if($InsightsAgentVersion -and -not ($supportedTechpulseVersions -contains $InsightsAgentVersion)) {
            throw "The specified InsightsAgentVersion '$InsightsAgentVersion' is not supported. Supported versions are: $($supportedTechpulseVersions -join ", ")"
        }
        if($AnalyticsAgentVersion -and -not ($supportedHPTAVersions -contains $AnalyticsAgentVersion)) {
            throw "The specified AnalyticsAgentVersion '$AnalyticsAgentVersion' is not supported. Supported versions are: $($supportedHPTAVersions -join ", ")"
        }
        if($InsightsPluginVersion -and -not ($supportedPluginPackageVersions -contains $InsightsPluginVersion)) {
            throw "The specified InsightsPluginVersion '$InsightsPluginVersion' is not supported. Supported versions are: $($supportedPluginPackageVersions -join ", ")"
        }

        if($InsightsAgentVersion) {
            try {
                Set-ItemProperty -Path $registryPath -Name "TechpulseVersion" -Value $InsightsAgentVersion -Type String -Force | Out-Null
                Write-Output "Successfully set TechpulseVersion to $InsightsAgentVersion."
            }
            catch {
                throw "Failed to set TechpulseVersion: $_"
            }
        }

        if($AnalyticsAgentVersion) {
            try {
                Set-ItemProperty -Path $registryPath -Name "HPTAVersion" -Value $AnalyticsAgentVersion -Type String -Force | Out-Null
                Write-Output "Successfully set HPTAVersion to $AnalyticsAgentVersion."
            }
            catch {
                throw "Failed to set HPTAVersion: $_"
            }
        }

        if($InsightsPluginVersion) {
            try {
                Set-ItemProperty -Path $registryPath -Name "PluginPackageVersion" -Value $InsightsPluginVersion -Type String -Force | Out-Null
                Write-Output "Successfully set PluginPackageVersion to $InsightsPluginVersion."
            }
            catch {
                throw "Failed to set PluginPackageVersion: $_"
            }
        }

        if($PSBoundParameters.Keys.Contains('StrictVersioning')) {
            if($StrictVersioning) {
                try {
                    Set-ItemProperty -Path $registryPath -Name "UseStrictVersioning" -Value "True" -Type String -Force | Out-Null
                    Write-Output "Successfully set UseStrictVersioning to True at $($registryPath)."
                }
                catch {
                    throw "Failed to set UseStrictVersioning to True: $_"
                }
            }
            else {
                try {
                    Set-ItemProperty -Path $registryPath -Name "UseStrictVersioning" -Value "False" -Type String -Force | Out-Null
                    Write-Output "Successfully set UseStrictVersioning to False."
                }
                catch {
                    throw "Failed to set UseStrictVersioning to False: $_"
                }
            }
        }
    }
}

# SIG # Begin signature block
# MIIoVQYJKoZIhvcNAQcCoIIoRjCCKEICAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAXWlDyleNjNriF
# HGBxmMr3wEXnlhwqXRdfixDgeacZ3KCCDYowggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wggbSMIIEuqADAgECAhAEsHM0tIaHE0aTXWqfk0f3MA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjUxMTAyMDAwMDAwWhcNMjYxMTAz
# MjM1OTU5WjBaMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAG
# A1UEBxMJUGFsbyBBbHRvMRAwDgYDVQQKEwdIUCBJbmMuMRAwDgYDVQQDEwdIUCBJ
# bmMuMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAiLZapeTEjTVXsbZd
# 8cZqZDb6YkviUyS/BygaNTIqLYMp6sg9ANcVqqR26xCnN5H5dy4kzjSgD3jgY9fP
# PZzWzLubAAIjqcpcifU2W27gwahe2KngYtzYGsd459rk3rCauoPiHa1yt1jwxz7L
# +UmzORKF/EznoqEcyhsLhdQeMYNt29txkS1sqn8yzhqiGKQPGwiITvXHqO4ETSQ4
# ulvZV8CufIpJoB8cvUqwF6LcWVdIiCVT/Jbto+NoC2BfaxI39NqUztbdxdEiVQGr
# cvRwWOe0DSMcdFzcfwJThiomQ1iun93TQXfO0JqTq0QSrnBwv8VsWd4Or1MbBHIJ
# vjQ70t9rbAsH/CKo15Js35khUVgkqlO8TXXcerpeV7naVu/5dxuKGtoB6khtDMKJ
# qkXumkWMgefTvhej0JU9b/5VgrhWj6nzjlgH61qacvqZg/e6KozZttCVj/lYasKb
# raDqKYHbp8Q9aiLaOJGJ8youyE9TU6TeebbHt3xqUd7v0qwXAgMBAAGjggIDMIIB
# /zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQUhkqh
# egiiQTH1tlGBQ/Hu8oVs+BkwPgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEF
# BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu
# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB
# Mzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNl
# cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB
# NDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQAD
# ggIBAGw9ypjljOGXMzN8v8FKh28bPETaRBMd7U7MbBBcCRGxaAN0mTm7ovkhfoWa
# NM/NBnDnhizPqG6wcHlRDWE7BR9IY86Ig1YeBPDdFqv5ggY2HOJ+kdWx2LoegYx6
# U2g24EpsVg8NHKQI65PWJ20cDc2BTjqdeu5cCDrtO3zILJVZO5v3bu2FoY/ffTTg
# bNFKbOoOfgp70wlUCaWieN+pNU9B21W4aeMsbeeeKmxlIY/5WCN8+oZy+/h+SnqI
# FLGehJROdJgnEwDBln/zurlx+HFAdDeGkAqugLComkvjWnaAe0CiAA9r/EqYw9yw
# rRVojBxJJxJkUruDwgycTABzgSzjOWzJbQQXO8FcOnbPbffTZObvbxS4CvUMs0LA
# GRLV1KuqWHURjXIQMcpvlbLXygbKBFzfQHCR/9lMN7dmL+eZ+fdGko/4UMHlsfeN
# fluvA2XlYPomH443GDPH2AH3XrgI+e14NGTYPR112jc6XXHtvikTvlTzgrxdSJxs
# +M7ab8gu5qA0lfn0KfyciwfDuu6VxOHqi0r392jfxfMD6vSFiHwbWvee1xAu7fEu
# R/l1FmMIM/2MhxQEua2zvbKJ3IEF1hHyEsr0elynqXQJtKw8rvgNntR4duGXcgF7
# fgayNKBdLS93HspKMhXx7o1Ajuxj/9kes+icVRJPvhTKNt8XMYIaITCCGh0CAQEw
# fTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV
# BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hB
# Mzg0IDIwMjEgQ0ExAhAEsHM0tIaHE0aTXWqfk0f3MA0GCWCGSAFlAwQCAQUAoHww
# EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIP2v5IEM
# aLWD4CQS/bTbN/LZiQA5KMt+C1vbiXKZn6/IMA0GCSqGSIb3DQEBAQUABIIBgAUg
# nhmyEKdpAsucO64AKEQYLEfRv6AVTscot6K++Lyj66ecspoFOdcO2Iit05vxTEo5
# qfcZukF6aD71LaJDvOtKHXtJoQdNvyzsB4sjwgiBlt7cCv3/aFaslEx28OoK9hFJ
# T37x72hAmTe8RxqtUN41sK6Gv7kiZ5flBdBxw35HV6WdSMqT0ewvQ8y/EVGDwqo1
# VOpGG+vJ7LxRaaUv1j56TJYa/FRu7pwBEfTkzU4iN4fzv9bIB4xbquW89UaTxh77
# lHeKelOdCSXlRcoQ+FNvS9m9Ntl8YMW2tHOc9GeQ9PAkF0ixvqLqCJi2/V3VVlDY
# vYHuxp4Pa4D5GPF4hTwnrTqArj7SjLXGjUH5Du0M7oJ4malxUqIo09Lgba0whSn+
# RqDPXocNzMs/0WySB5sTmV1WnDJ7frRerYSxVp3mRtANXlyv4+4r7W/XwTO2rgam
# IENrjU5IoOmJjnVnNDkAUPzAdwYIAxOAQer8KrJaO1563uTuDfCqdGpogacqpKGC
# F3cwghdzBgorBgEEAYI3AwMBMYIXYzCCF18GCSqGSIb3DQEHAqCCF1AwghdMAgED
# MQ8wDQYJYIZIAWUDBAIBBQAweAYLKoZIhvcNAQkQAQSgaQRnMGUCAQEGCWCGSAGG
# /WwHATAxMA0GCWCGSAFlAwQCAQUABCCjVh316FXeafYtA/nR+YC0MoF2T1HQrKsG
# x9IjRx3SwQIRAMCjOCixYm8c0EVTYgLbx3YYDzIwMjYwNzI4MTU0NDQ0WqCCEzow
# ggbtMIIE1aADAgECAhAKgO8YS43xBYLRxHanlXRoMA0GCSqGSIb3DQEBCwUAMGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYg
# MjAyNSBDQTEwHhcNMjUwNjA0MDAwMDAwWhcNMzYwOTAzMjM1OTU5WjBjMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lD
# ZXJ0IFNIQTI1NiBSU0E0MDk2IFRpbWVzdGFtcCBSZXNwb25kZXIgMjAyNSAxMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EasLRLGntDqrmBWsytXum9R
# /4ZwCgHfyjfMGUIwYzKomd8U1nH7C8Dr0cVMF3BsfAFI54um8+dnxk36+jx0Tb+k
# +87H9WPxNyFPJIDZHhAqlUPt281mHrBbZHqRK71Em3/hCGC5KyyneqiZ7syvFXJ9
# A72wzHpkBaMUNg7MOLxI6E9RaUueHTQKWXymOtRwJXcrcTTPPT2V1D/+cFllESvi
# H8YjoPFvZSjKs3SKO1QNUdFd2adw44wDcKgH+JRJE5Qg0NP3yiSyi5MxgU6cehGH
# r7zou1znOM8odbkqoK+lJ25LCHBSai25CFyD23DZgPfDrJJJK77epTwMP6eKA0kW
# a3osAe8fcpK40uhktzUd/Yk0xUvhDU6lvJukx7jphx40DQt82yepyekl4i0r8OEp
# s/FNO4ahfvAk12hE5FVs9HVVWcO5J4dVmVzix4A77p3awLbr89A90/nWGjXMGn7F
# QhmSlIUDy9Z2hSgctaepZTd0ILIUbWuhKuAeNIeWrzHKYueMJtItnj2Q+aTyLLKL
# M0MheP/9w6CtjuuVHJOVoIJ/DtpJRE7Ce7vMRHoRon4CWIvuiNN1Lk9Y+xZ66laz
# s2kKFSTnnkrT3pXWETTJkhd76CIDBbTRofOsNyEhzZtCGmnQigpFHti58CSmvEyJ
# cAlDVcKacJ+A9/z7eacCAwEAAaOCAZUwggGRMAwGA1UdEwEB/wQCMAAwHQYDVR0O
# BBYEFOQ7/PIx7f391/ORcWMZUEPPYYzoMB8GA1UdIwQYMBaAFO9vU0rp5AZ8esri
# kFb2L9RJ7MtOMA4GA1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcD
# CDCBlQYIKwYBBQUHAQEEgYgwgYUwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
# Z2ljZXJ0LmNvbTBdBggrBgEFBQcwAoZRaHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIw
# MjVDQTEuY3J0MF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYy
# MDI1Q0ExLmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJ
# KoZIhvcNAQELBQADggIBAGUqrfEcJwS5rmBB7NEIRJ5jQHIh+OT2Ik/bNYulCrVv
# hREafBYF0RkP2AGr181o2YWPoSHz9iZEN/FPsLSTwVQWo2H62yGBvg7ouCODwrx6
# ULj6hYKqdT8wv2UV+Kbz/3ImZlJ7YXwBD9R0oU62PtgxOao872bOySCILdBghQ/Z
# LcdC8cbUUO75ZSpbh1oipOhcUT8lD8QAGB9lctZTTOJM3pHfKBAEcxQFoHlt2s9s
# XoxFizTeHihsQyfFg5fxUFEp7W42fNBVN4ueLaceRf9Cq9ec1v5iQMWTFQa0xNqI
# tH3CPFTG7aEQJmmrJTV3Qhtfparz+BW60OiMEgV5GWoBy4RVPRwqxv7Mk0Sy4QHs
# 7v9y69NBqycz0BZwhB9WOfOu/CIJnzkQTwtSSpGGhLdjnQ4eBpjtP+XB3pQCtv4E
# 5UCSDag6+iX8MmB10nfldPF9SVD7weCC3yXZi/uuhqdwkgVxuiMFzGVFwYbQsiGn
# oa9F5AaAyBjFBtXVLcKtapnMG3VH3EmAp/jsJ3FVF3+d1SVDTmjFjLbNFZUWMXuZ
# yvgLfgyPehwJVxwC+UpX2MSey2ueIu9THFVkT+um1vshETaWyQo8gmBto/m3acaP
# 9QsuLj3FNwFlTxq25+T4QwX9xa6ILs84ZPvmpovq90K8eWyG2N01c4IhSOxqt81n
# MIIGtDCCBJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjANBgkqhkiG9w0BAQsFADBi
# MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
# d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
# RzQwHhcNMjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5WjBpMQswCQYDVQQGEwJV
# UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRy
# dXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx0wqYQXK+PEbAHKx126NG
# aHS0URedTa2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz4aH+qbxeLho8I6jY3xL1
# IusLopuW2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJgMQB3h2DZ0Mal5kYp77j
# YMVQXSZH++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQbzIBHYJBYgzWIjk8eDrY
# hXDEpKk7RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6bNMI1I7Gb5IBZK4ivbVC
# iZv7PNBYqHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJRfN20VRS3hpLgIR4hjzL
# 0hpoYGk81coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU14lDnki7CcoKCz6eum5A1
# 9WZQHkqUJfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDDjAmSFTUms+wV/FbWBqi7
# fTJnjq3hj0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cnT6Toy+rN+nM8M7LnLqCr
# O2JP3oW//1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq1BtmXUqEG1NqzJKS4kOm
# xkYp2WyODi7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqgPrHRVHhGNKlYzyjlroPx
# ul+bgIspzOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAw
# HQYDVR0OBBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8GA1UdIwQYMBaAFOzX44LS
# cV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF
# BQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
# Z2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYy
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j
# cmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEB
# CwUAA4ICAQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfFiBowf0/Dm1wGc/Do7oVM
# Y2mhXZXjDNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4/iEIUBO41P5F448rSYJ5
# 9Ib61eoalhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/DMm/axFSgoR8n6c3nuZB
# 9BfBwAQYK9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HRtrYfctSLANEBfHU16r3J
# 05qX3kId+ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2o1f4MXRJDMdTSlOLh0HC
# n2cQLwQCqjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K9i697cvaiIo2p61Ed2p8
# xMJb82Yosn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc3hsXMrS+U0yy+GWqAXam
# 4ToWd2UQ1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLiRu7hAWE6bTEm4XYRkA6T
# l4KSFLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovR
# Diyx3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8
# BlqmyIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBY0wggR1
# oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X
# DTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTAT
# BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEh
# MB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLh
# Kac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+
# vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMp
# Lc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+n
# MNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1Dek
# LgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmk
# wuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0
# yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP
# 9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHh
# D5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnf
# fEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId
# 5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LS
# cV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgP
# MA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0
# dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2Vy
# dHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNV
# HR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB
# c3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0B
# AQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlU
# Iu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqa
# i7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eH
# qNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01
# YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ
# 8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3wwggN4AgEBMH0waTELMAkGA1UE
# BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2Vy
# dCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENB
# MQIQCoDvGEuN8QWC0cR2p5V0aDANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0B
# CQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDcyODE1NDQ0NFow
# KwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQU3WIwrIYKLTBr2jixaHlSMAf7QX4wLwYJ
# KoZIhvcNAQkEMSIEIHS5FODZ7Uf9Us40vSi0HzgLxdHkzExbLTaOaX5F1pqzMDcG
# CyqGSIb3DQEJEAIvMSgwJjAkMCIEIEqgP6Is11yExVyTj4KOZ2ucrsqzP+NtJpqj
# NPFGEQozMA0GCSqGSIb3DQEBAQUABIICAHXtVynIx77bUrnDEmknvJpHnpzPkPLe
# fo64nmGfnLbuAuw6IAXC4Wv1Alx+4A/K4B2GrFajqEuxZO1lYe6446u/+tQBZuSB
# gWCTNDvw/PK0VSSP9bsrPNIR5xn3zGwDw+bORks8xy6NNdxx9MWUespqlUttMi2s
# KCkxrRK7KWd1eXhgZzHV7d1/es7yEgALYftIwj4uht31L/70NwVHVsxF5bw86Vju
# 3Zmo9/L5oXuz6+fEbyxcTry57BsgwlgV/Q6uCNdanUwGucKvw7JRlpOf8z8iFsbr
# bWkS74PtGy/fFX82/K7x6cAAfe8gdhzdNnMXsPDVNMP6tWe5ddn/hYdBXEB2Jr/T
# Gu4WAchM89gHwFsIKltdjBrV8HVlXFM4Sa4wzC7rqecq0AoC1xIbct3Yn8EQJSKI
# bmeaBvfCXzI4MfUtO5jAMpuYTtRtL/LnMQtKyh6QN3mVL1kzlqBwguN7UtB7KYxH
# gBLmukfkDKc7FF/GrS7YSxYKdl+gXblrL9z6DxOQ/ChQWPb/Uz+vEc3LUttohp1r
# DyTZhdaoNL9WkS4XHHUqGPkYc9R4G7jFcwQCpU0WbKTtrfnO7aSYUL/stbZStIAo
# A29KbVWGtcDSJFjdtNm3PN15FktILl2sZjkWELwinoJe9Y9ZctVowOj7irBtWEOy
# NrqIK6KGGhCa
# SIG # End signature block