HP.SmartExperiences.psm1

Set-StrictMode -Version 3.0
#requires -Modules "HP.Private","HP.ClientManagement"

<#
.SYNOPSIS
  Sets Smart Experiences as managed or unmanaged
 
.DESCRIPTION
  If Smart Experiences\Policy is not found on the registry, this command sets the 'Privacy Alert' and 'Auto Screen Dimming' features to the default values.
 
  The default values for both 'Privacy Alert' and 'Auto Screen Dimming' are:
    - AllowEdit: $true
    - Default: Off
    - Enabled: $false
    
  Use the Set-HPeAISettingValue command to configure the values of the eAI features.
 
.PARAMETER Enabled
  If set to $true, this command will configure eAi as managed. If set to $false, this command will configure eAI as unmanaged.
 
.EXAMPLE
  Set-HPeAIManaged -Enabled $true
 
.NOTES
  Admin privilege is required.
 
.LINK
  [Get-HPeAISettingValue](https://developers.hp.com/hp-client-management/doc/Get-HPeAISettingValue)
 
.LINK
  [Set-HPeAISettingValue](https://developers.hp.com/hp-client-management/doc/Set-HPeAISettingValue)
#>

function Set-HPeAIManaged {
  [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Set-HPeAIManaged")]
  param(
    [Parameter(Mandatory = $true,Position = 0,ValueFromPipeline = $true)]
    [bool]$Enabled
  )
  $eAIRegPath = 'HKLM:\Software\Policies\HP\SmartExperiences'

  if ((Test-HPSmartExperiencesIsSupported) -eq $false) {
    throw [System.NotSupportedException]"HP Smart Experiences is currently not supported on this platform."
  }

  if (-not (Test-IsElevatedAdmin)) {
    throw [System.Security.AccessControl.PrivilegeNotHeldException]"elevated administrator"
  }

  $reg = Get-Item -Path $eAIRegPath -ErrorAction SilentlyContinue
  if ($null -eq $reg) {
    Write-Verbose "Creating registry entry $eAIRegPath"
    New-Item -Path $eAIRegPath -Force | Out-Null
  }

  if ($true -eq $Enabled) {
    $managed = 1

    # Check if eAI attributes exist, if not, set the defaults
    Write-Verbose "Reading registry path $eAIRegPath\Policy"
    $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Policy
    if ($reg) {
      Write-Verbose "$eAIRegPath\Policy attributes found"
      try {
        Write-Verbose "Data read: $($reg.Policy)"
        $current = $reg.Policy | ConvertFrom-Json
      }
      catch {
        throw [System.FormatException]"$($_.Exception.Message): Please ensure Policy property contains a valid JSON."
      }
    }
    else {
      $current = [ordered]@{
        attentionDim = [ordered]@{
          allowEdit = $true
          default = 0
          isEnabled = $false
        }
        shoulderSurf = [ordered]@{
          allowEdit = $true
          default = 0
          isEnabled = $false
        }
      }

      $value = $current | ConvertTo-Json -Compress
      Write-Verbose "Setting $eAIRegPath\Policy to defaults $value"
    
      if ($reg) {
        Set-ItemProperty -Path $eAIRegPath -Value $value -Name Policy -Force | Out-Null
      }
      else {
        New-ItemProperty -Path $eAIRegPath -Value $value -Name Policy -Force | Out-Null
      }
    }
  }
  else {
    $managed = 0
  }

  Write-Verbose "Setting $eAIRegPath\Managed to $managed"
  $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Managed
  if ($reg) {
    Set-ItemProperty -Path $eAIRegPath -Value $managed -Name Managed -Force | Out-Null
  }
  else {
    New-ItemProperty -Path $eAIRegPath -Value $managed -Name Managed -Force | Out-Null
  }
}

<#
.SYNOPSIS
  Checks if eAI is managed on the current device
.DESCRIPTION
  If eAI is managed, this command returns true. Otherwise, this command returns false. If 'SmartExperiences' entry is not found in the registry, false is returned by default.
 
.EXAMPLE
  Get-HPeAIManaged
 
.NOTES
  Admin privilege is required.
 
.LINK
  [Set-HPeAIManaged](https://developers.hp.com/hp-client-management/doc/Set-HPeAIManaged)
#>

function Get-HPeAIManaged {
  [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Get-HPeAIManaged")]
  param()
  $eAIRegPath = 'HKLM:\Software\Policies\HP\SmartExperiences'

  if ((Test-HPSmartExperiencesIsSupported) -eq $false) {
    throw [System.NotSupportedException]"HP Smart Experiences is currently not supported on this platform."
  }

  if (-not (Test-IsElevatedAdmin)) {
    throw [System.Security.AccessControl.PrivilegeNotHeldException]"elevated administrator"
  }

  Write-Verbose "Reading $eAIRegPath\Managed"
  $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Managed

  if ($reg) {
    return ($reg.Managed -eq 1)
  }

  return $false
}

<#
.SYNOPSIS
  Configures HP eAI features on the current device
 
.DESCRIPTION
  Configures HP eAI features on the current device. At this time, only the 'Privacy Alert' feature and the 'Auto Screen Dimming' feature are available to be configured.
 
.PARAMETER Name
  Specifies the eAI feature name to configure. The value must be one of the following values:
  - Privacy Alert
  - Auto Screen Dimming
 
.PARAMETER Enabled
  If set to $true, this command will enable the feature specified in the Name parameter. If set to $false, this command will disable the feature specified in the -Name parameter.
 
.PARAMETER AllowEdit
  If set to $true, editing is allowed for the feature specified in the Name parameter. If set to $false, editing is not allowed for the feature specified in the -Name parameter.
 
.PARAMETER Default
  Sets default value of the feature specified in the -Name parameter. The value must be one of the following values:
  - On
  - Off
 
.EXAMPLE
  Set-HPeAISettingValue -Name 'Privacy Alert' -Enabled $true -Default 'On' -AllowEdit $false
 
.EXAMPLE
  Set-HPeAISettingValue -Name 'Privacy Alert' -Enabled $true
 
.EXAMPLE
  Set-HPeAISettingValue -Name 'Auto Screen Dimming' -Default 'On'
 
.EXAMPLE
  Set-HPeAISettingValue -Name 'Auto Screen Dimming' -AllowEdit $false
 
.NOTES
  Admin privilege is required.
 
.LINK
  [Set-HPeAIManaged](https://developers.hp.com/hp-client-management/doc/Set-HPeAIManaged)
 
.LINK
  [Get-HPeAISettingValue](https://developers.hp.com/hp-client-management/doc/Get-HPeAISettingValue)
#>

function Set-HPeAISettingValue {
  [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Set-HPeAISettingValue")]
  param(
    [Parameter(Mandatory = $true,Position = 0,ParameterSetName = 'Enabled')]
    [Parameter(Mandatory = $true,Position = 0,ParameterSetName = 'AllowEdit')]
    [Parameter(Mandatory = $true,Position = 0,ParameterSetName = 'Default')]
    [ValidateSet('Privacy Alert','Auto Screen Dimming')]
    [string]$Name,

    [Parameter(Mandatory = $true,Position = 1,ParameterSetName = 'Enabled')]
    [bool]$Enabled,

    [Parameter(Mandatory = $false,Position = 2,ParameterSetName = 'Enabled')]
    [Parameter(Mandatory = $true,Position = 1,ParameterSetName = 'AllowEdit')]
    [bool]$AllowEdit,

    [Parameter(Mandatory = $false,Position = 3,ParameterSetName = 'Enabled')]
    [Parameter(Mandatory = $false,Position = 2,ParameterSetName = 'AllowEdit')]
    [Parameter(Mandatory = $true,Position = 1,ParameterSetName = 'Default')]
    [ValidateSet('On','Off')]
    [string]$Default
  )
  $eAIFeatures = @{
    'Privacy Alert' = 'shoulderSurf'
    'Auto Screen Dimming' = 'attentionDim'
  }
  $eAIRegPath = 'HKLM:\Software\Policies\HP\SmartExperiences'

  if ((Test-HPSmartExperiencesIsSupported) -eq $false) {
    throw [System.NotSupportedException]"HP Smart Experiences is currently not supported on this platform."
  }

  if (-not (Test-IsElevatedAdmin)) {
    throw [System.Security.AccessControl.PrivilegeNotHeldException]"elevated administrator"
  }

  Write-Verbose "Reading registry path $eAIRegPath\Policy"
  $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Policy
  if ($reg) {
    try {
      Write-Verbose "Data read: $($reg.Policy)"
      $current = $reg.Policy | ConvertFrom-Json
    }
    catch {
      throw [System.FormatException]"$($_.Exception.Message): Please ensure Policy property contains a valid JSON."
    }
  }
  else {
    $current = [ordered]@{
      attentionDim = [ordered]@{
        allowEdit = $true
        default = 0
        isEnabled = $false
      }
      shoulderSurf = [ordered]@{
        allowEdit = $true
        default = 0
        isEnabled = $false
      }
    }
    Write-Verbose "Creating registry entry with the default values to $eAIRegPath"
    New-Item -Path $eAIRegPath -Force | Out-Null
  }

  Write-Verbose "$($eAIFeatures[$Name]) selected"
  $config = $current.$($eAIFeatures[$Name])
  if ($PSBoundParameters.Keys.Contains('Enabled')) {
    $config.isEnabled = $Enabled
  }
  if ($PSBoundParameters.Keys.Contains('AllowEdit')) {
    $config.allowEdit = $AllowEdit
  }
  if ($PSBoundParameters.Keys.Contains('Default')) {
    $config.default = if ($Default -eq 'On') { 1 } else { 0 }
  }

  $value = $current | ConvertTo-Json -Compress
  Write-Verbose "Setting $eAIRegPath\Policy to $value"

  if ($reg) {
    Set-ItemProperty -Path $eAIRegPath -Value $value -Name Policy -Force | Out-Null
  }
  else {
    New-ItemProperty -Path $eAIRegPath -Value $value -Name Policy -Force | Out-Null
  }

  $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Managed
  if ($reg) {
    $managed = $reg.Managed
  }
  else {
    $managed = 0
    Write-Verbose "Creating registry entry $eAIRegPath\Managed with default value $managed"
    New-ItemProperty -Path $eAIRegPath -Value $managed -Name Managed -Force | Out-Null
  }
  if ($managed -eq 0) {
    Write-Warning "eAI managed attribute has not been set. Refer to Set-HPeAIManaged function documentation on how to set it."
  }
}

<#
.SYNOPSIS
  Checks if Smart Experiences is supported on the current device
 
.DESCRIPTION
  This command checks if the BIOS setting "HP Smart Experiences" exists to determine if Smart Experiences is supported on the current device.
 
.EXAMPLE
  Test-HPSmartExperiencesIsSupported
 
.LINK
  [Get-HPeAISettingValue](https://developers.hp.com/hp-client-management/doc/Get-HPeAISettingValue)
 
.LINK
  [Set-HPeAISettingValue](https://developers.hp.com/hp-client-management/doc/Set-HPeAISettingValue)
 
.LINK
  [Set-HPeAIManaged](https://developers.hp.com/hp-client-management/doc/Set-HPeAIManaged)
#>

function Test-HPSmartExperiencesIsSupported {
  [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Test-HPSmartExperiencesIsSupported")]
  param()

  [boolean]$status = $false
  try {
    $mode = (Get-HPBIOSSettingValue -Name "HP Smart Experiences")
    $status = $true
  }
  catch {}

  return $status
}

<#
.SYNOPSIS
  Retrieves the values of the specified HP eAI feature from the current device
 
.DESCRIPTION
  This command retrieves the values of the specified HP eAI feature where the feature must be from the current device. The feature must be either 'Privacy Alert' or 'Auto Screen Dimming'.
 
.PARAMETER Name
  Specifies the eAI feature to read. The value must be one of the following values:
  - Privacy Alert
  - Auto Screen Dimming
 
.EXAMPLE
  Get-HPeAISettingValue -Name 'Privacy Alert'
 
.EXAMPLE
  Get-HPeAISettingValue -Name 'Auto Screen Dimming'
 
.NOTES
  Admin privilege is required.
 
.LINK
  [Set-HPeAISettingValue](https://developers.hp.com/hp-client-management/doc/Set-HPeAISettingValue)
 
.LINK
  [Set-HPeAIManaged](https://developers.hp.com/hp-client-management/doc/Set-HPeAIManaged)
#>

function Get-HPeAISettingValue {
  [CmdletBinding(HelpUri = "https://developers.hp.com/hp-client-management/doc/Get-HPeAISettingValue")]
  param(
    [Parameter(Mandatory = $true,Position = 0)]
    [ValidateSet('Privacy Alert','Auto Screen Dimming')]
    [string]$Name
  )
  $eAIFeatures = @{
    'Privacy Alert' = 'shoulderSurf'
    'Auto Screen Dimming' = 'attentionDim'
  }
  $eAIRegPath = 'HKLM:\Software\Policies\HP\SmartExperiences'

  if ((Test-HPSmartExperiencesIsSupported) -eq $false) {
    throw [System.NotSupportedException]"HP Smart Experiences is currently not supported on this platform."
  }

  Write-Verbose "Reading registry path $eAIRegPath\Policy"
  $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Policy
  if (-not $reg) {
    throw [System.InvalidOperationException]'HP eAI is not currently configured on your device.'
  }
  else {
    try {
      Write-Verbose "Data read: $($reg.Policy)"
      $current = $reg.Policy | ConvertFrom-Json
    }
    catch {
      throw [System.FormatException]"$($_.Exception.Message): Please ensure Policy property contains a valid JSON."
    }
    Write-Verbose "$($eAIFeatures[$Name]) selected"
    $config = $current.$($eAIFeatures[$Name])

    $reg = Get-ItemProperty -Path $eAIRegPath -ErrorAction SilentlyContinue -Name Managed
    if ($reg) {
      $managed = $reg.Managed
    }
    else {
      $managed = $false
    }
    Write-Verbose "Managed: $managed"

    return [ordered]@{
      Enabled = [bool]$config.isEnabled
      Default = if ($config.default -eq 1) { 'On' } else { 'Off' }
      AllowEdit = [bool]$config.allowEdit
    }
  }
}
# SIG # Begin signature block
# MIIoGAYJKoZIhvcNAQcCoIIoCTCCKAUCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCD+zdIXquO7YMDR
# GFZo5716vczwSbHf5W7BzvHLkEW9k6CCDYowggawMIIEmKADAgECAhAIrUCyYNKc
# 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/pQd52MbOoZWeE4wggbSMIIEuqADAgECAhAJvPMqSNxAYhV5FFpsbzOhMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjQwMjE1MDAwMDAwWhcNMjUwMjE4
# MjM1OTU5WjBaMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTESMBAG
# A1UEBxMJUGFsbyBBbHRvMRAwDgYDVQQKEwdIUCBJbmMuMRAwDgYDVQQDEwdIUCBJ
# bmMuMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEApbF6fMFy6zhGVra3
# SZN418Cp2O8kjihQCU9tqPO9tkzbMyTsgveLJVnXPJNG9kQPMGUNp+wEHcoUzlRc
# YJMEL9fhfzpWPeSIIezGLPCdrkMmS3fdRUwFqEs7z/C6Ui2ZqMaKhKjBJTIWnipe
# rRfzGB7RoLepQcgqeF5s0DBy4oG83dqcRHo3IJRTBg39tHe3mD5uoGHn5n366abX
# vC+k53BVyD8w8XLppFVH5XuNlXMq/Ohf613i7DRb/+u92ZiAPVPXXnlxUE26cuDb
# OfJKN/bXPmvnWcNW3YHVp9ztPTQZhX4yWYXHrAI2Cv6HxUpO6NzhFoRoBTkcYNbA
# 91pf1Vagh/MNcA2BfQYT975/Vlvj9cfEZ/NwZthZuHa3rdrvCKhhjw7YU2QUeaTJ
# 0uaX4g6B9PFNqAASYLach3CDJiLmYEfus/utPh57mk0q27yL25fXo/PaMDXiDNIi
# 7Wuz7A+sPsbtdiY8zvEIRQ+XJXtKAlD4tqG9YzlTO6ZoQX/rAgMBAAGjggIDMIIB
# /zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQURH4F
# u5yEAuElYWUbyGRYkNLLrA8wPgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEF
# BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu
# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB
# Mzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNl
# cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB
# NDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQAD
# ggIBAFiCyuI6qmaQodDyMNpp0l7eIXFgJ4JI59o59PleFj4rcyd/+F4iI7u5if8G
# rV5Kn3s3tK9vfJO8SpqtEh7lL4e69z6v3ohcy4uy2hsjKQ/fFcDo9pQYDGmDVjCa
# D5qSVEIBlJHBe5NKEJAgUE0kaMjLzbi2+8DKJlNtvZ+hatuPl9fMnmU+VbQh7JhZ
# yJdz8Ay0tcQ9lC8HAX5Ah/pU+Vtv+c8gMSxjS1aWXoGCa1869IVi2O6qx7MuX12U
# 1eIpB9XxYr7HSebvg2G7Gz6nCh7u+4k7m3hJu9EStUIN2JII5260+E60uDWoHEhx
# tHbdueFQxJrTKnhplOSaaPFCVBDkWG83ZzN9N3z/45w1pBUNBiPJdRQJ58MhBYQe
# Zl90heMBL8QNQk2i0E5gHNT9pJiCR9+mvJkRxEVgUn+16ZpVnI6kzhThV9qBaWVF
# h83X4UWc/nwHKIuu+4x4fmkYc79A3MrsHflZIO8jOy0GC/xBnZTQ8s5b9Tb2UkHk
# w692Ypl7War3W7M37JCAPC/A7M4CwQYjdjG43zs5m36auYVaTvRLKtZVLzcj8oZX
# 4vqhlZ8+jCPXFiuDfoBXiTckTLpv/eHQ6q7Aoda+qARWPPE1U2v5r/lpKVqIx7B4
# PdFZAUf5MtG/Bj7LVXvXjW8ABIJv7L4cI2akn6Es0dmvd6PsMYIZ5DCCGeACAQEw
# fTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV
# BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hB
# Mzg0IDIwMjEgQ0ExAhAJvPMqSNxAYhV5FFpsbzOhMA0GCWCGSAFlAwQCAQUAoHww
# EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIG3E5D4F
# piA2/YErt8Qydv9icCvR5FyGzPBa13rZG6PoMA0GCSqGSIb3DQEBAQUABIIBgKFg
# 0ODgWLVb8WpmrmT/CsNYq4K2BCdE4NzasY4saU/QuCwf0OgbM1PsVxjscKjy9B2z
# 2epg/Ryt9GEer8buSXBRRPReowX8rPSEud+g9XdBKgdvz8e8HtxrvbE3oH+aogqZ
# YenBk3GDJrNbFE1t/kdrxStUfgzONlOi0xRxL6oHlJCo6EIJ9LyE33LU9qEpNqAY
# KLhTsS4rG+Z5c6CI0dUbsivsChCpfk/rizp+8Ovwh2cW9CjSUVPOEMEJx2QTIFQ4
# AevxiW2mQuF8yG/RP+FZ9NgbZn6I+Y21mNclTk8+W3Kw19YPfA73KvZZLX8K4G69
# T8I8kvEFFBEaZQuRV1G9DBaqV5PnrLwB++oKU/t3WBYv4tPiobDK5cri6PWh0JvE
# 6ZuuZ68MWQjMxT/yX7EpnAZuAenL5I4sKfz1Gz63zs/1rE5+ps3jICs+ADaNlfL1
# s0xNuBLyxELqRgolG8JQwYVQ02/AFsFrUqrV/eKLI4n19FnvcFNDj4YcY5O+MKGC
# Fzowghc2BgorBgEEAYI3AwMBMYIXJjCCFyIGCSqGSIb3DQEHAqCCFxMwghcPAgED
# MQ8wDQYJYIZIAWUDBAIBBQAweAYLKoZIhvcNAQkQAQSgaQRnMGUCAQEGCWCGSAGG
# /WwHATAxMA0GCWCGSAFlAwQCAQUABCDk3EcGCRMOfPiOVKXPMogflGFSkK0Pk5RS
# PCr48DdI4QIRAO8vH+j12KGn1Tv8shjGhGcYDzIwMjQxMTA2MTcxNzM1WqCCEwMw
# gga8MIIEpKADAgECAhALrma8Wrp/lYfG+ekE4zMEMA0GCSqGSIb3DQEBCwUAMGMx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMy
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcg
# Q0EwHhcNMjQwOTI2MDAwMDAwWhcNMzUxMTI1MjM1OTU5WjBCMQswCQYDVQQGEwJV
# UzERMA8GA1UEChMIRGlnaUNlcnQxIDAeBgNVBAMTF0RpZ2lDZXJ0IFRpbWVzdGFt
# cCAyMDI0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvmpzn/aVIauW
# MLpbbeZZo7Xo/ZEfGMSIO2qZ46XB/QowIEMSvgjEdEZ3v4vrrTHleW1JWGErrjOL
# 0J4L0HqVR1czSzvUQ5xF7z4IQmn7dHY7yijvoQ7ujm0u6yXF2v1CrzZopykD07/9
# fpAT4BxpT9vJoJqAsP8YuhRvflJ9YeHjes4fduksTHulntq9WelRWY++TFPxzZrb
# ILRYynyEy7rS1lHQKFpXvo2GePfsMRhNf1F41nyEg5h7iOXv+vjX0K8RhUisfqw3
# TTLHj1uhS66YX2LZPxS4oaf33rp9HlfqSBePejlYeEdU740GKQM7SaVSH3TbBL8R
# 6HwX9QVpGnXPlKdE4fBIn5BBFnV+KwPxRNUNK6lYk2y1WSKour4hJN0SMkoaNV8h
# yyADiX1xuTxKaXN12HgR+8WulU2d6zhzXomJ2PleI9V2yfmfXSPGYanGgxzqI+Sh
# oOGLomMd3mJt92nm7Mheng/TBeSA2z4I78JpwGpTRHiT7yHqBiV2ngUIyCtd0pZ8
# zg3S7bk4QC4RrcnKJ3FbjyPAGogmoiZ33c1HG93Vp6lJ415ERcC7bFQMRbxqrMVA
# Niav1k425zYyFMyLNyE1QulQSgDpW9rtvVcIH7WvG9sqYup9j8z9J1XqbBZPJ5XL
# ln8mS8wWmdDLnBHXgYly/p1DhoQo5fkCAwEAAaOCAYswggGHMA4GA1UdDwEB/wQE
# AwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMCAGA1Ud
# IAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6FtltTYUv
# cyl2mi91jGogj57IbzAdBgNVHQ4EFgQUn1csA3cOKBWQZqVjXu5Pkh92oFswWgYD
# VR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCBkAYIKwYB
# BQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNv
# bTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lD
# ZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNydDANBgkq
# hkiG9w0BAQsFAAOCAgEAPa0eH3aZW+M4hBJH2UOR9hHbm04IHdEoT8/T3HuBSyZe
# q3jSi5GXeWP7xCKhVireKCnCs+8GZl2uVYFvQe+pPTScVJeCZSsMo1JCoZN2mMew
# /L4tpqVNbSpWO9QGFwfMEy60HofN6V51sMLMXNTLfhVqs+e8haupWiArSozyAmGH
# /6oMQAh078qRh6wvJNU6gnh5OruCP1QUAvVSu4kqVOcJVozZR5RRb/zPd++PGE3q
# F1P3xWvYViUJLsxtvge/mzA75oBfFZSbdakHJe2BVDGIGVNVjOp8sNt70+kEoMF+
# T6tptMUNlehSR7vM+C13v9+9ZOUKzfRUAYSyyEmYtsnpltD/GWX8eM70ls1V6QG/
# ZOB6b6Yum1HvIiulqJ1Elesj5TMHq8CWT/xrW7twipXTJ5/i5pkU5E16RSBAdOp1
# 2aw8IQhhA/vEbFkEiF2abhuFixUDobZaA0VhqAsMHOmaT3XThZDNi5U2zHKhUs5u
# HHdG6BoQau75KiNbh0c+hatSF+02kULkftARjsyEpHKsF7u5zKRbt5oK5YGwFvgc
# 4pEVUNytmB3BpIiowOIIuDgP5M9WArHYSAR16gc0dP2XdkMEP5eBsX7bf/MGN4K3
# HP50v/01ZHo/Z5lGLvNwQ7XHBx1yomzLP8lx4Q1zZKDyHcp4VQJLu2kWTsKsOqQw
# ggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0GCSqGSIb3DQEBCwUAMGIx
# CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
# dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBH
# NDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTlaMGMxCzAJBgNVBAYTAlVT
# MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UEAxMyRGlnaUNlcnQgVHJ1
# c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBpbmcgQ0EwggIiMA0GCSqG
# SIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJUVXHJQPE8pE3qZdRodbS
# g9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+eDzMfUBMLJnOWbfhXqAJ9
# /UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47qUT3w1lbU5ygt69OxtXXn
# HwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL6IRktFLydkf3YYMZ3V+0
# VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c1eYbqMFkdECnwHLFuk4f
# sbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052FVUmcJgmf6AaRyBD40Nj
# gHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+onP65x9abJTyUpURK1h0
# QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/wojzKQtwYSH8UNM/STKvv
# mz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1eSuo80VgvCONWPfcYd6T
# /jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uKIqjBJgj5FBASA31fI7tk
# 42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7pXcheMBK9Rp6103a50g5r
# mQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4E
# FgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5n
# P+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcG
# CCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQu
# Y29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGln
# aUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8v
# Y3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNV
# HSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIB
# AH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7x1Bd4ksp+3CKDaopafxp
# wc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGIdDAiCqBa9qVbPFXONASIl
# zpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7giqzl/Yy8ZCaHbJK9nXzQ
# cAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6wCeCRK6ZJxurJB4mwbfe
# Kuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx2cYTgAnEtp/Nh4cku0+j
# Sbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5knLD0/a6fxZsNBzU+2QJsh
# IUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3itTK37xJV77QpfMzmHQXh6
# OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7HhmLNriT1ObyF5lZynDw
# N7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUVmDG0YgkPCr2B2RP+v6TR
# 81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKmKYcJRyvmfxqkhQ/8mJb2
# VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8MIIFjTCCBHWgAwIBAgIQ
# DpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBlMQswCQYDVQQGEwJVUzEV
# MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t
# MSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMjIwODAx
# MDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD
# ExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
# DwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aa
# za57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllV
# cq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT
# +CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd
# 463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+
# EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92k
# J7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5j
# rubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
# f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJU
# KSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+wh
# X8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQAB
# o4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5n
# P+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDgYDVR0P
# AQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29j
# c3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MEUGA1UdHwQ+MDww
# OqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
# RFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0GCSqGSIb3DQEBDAUAA4IB
# AQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6pGrsi+IcaaVQi7aSId229
# GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1Wz/n096wwepqLsl7Uz9FD
# RJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp8jQ87PcDx4eo0kxAGTVG
# amlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglohJ9vytsgjTVgHAIDyyCw
# rFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8SuFQtJ37YOtnwtoeW/VvR
# XKwYw02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBjMQswCQYDVQQGEwJVUzEX
# MBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0
# ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5nIENBAhALrma8Wrp/lYfG
# +ekE4zMEMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0B
# CRABBDAcBgkqhkiG9w0BCQUxDxcNMjQxMTA2MTcxNzM1WjArBgsqhkiG9w0BCRAC
# DDEcMBowGDAWBBTb04XuYtvSPnvk9nFIUIck1YZbRTAvBgkqhkiG9w0BCQQxIgQg
# e4YpkLnbxcDYomQqf81O6isZyecGAxfXbmbz++Xd6MkwNwYLKoZIhvcNAQkQAi8x
# KDAmMCQwIgQgdnafqPJjLx9DCzojMK7WVnX+13PbBdZluQWTmEOPmtswDQYJKoZI
# hvcNAQEBBQAEggIAOfCj8taglxSQhyH3Psvys0BBzywKxXsLOznql8hC9fI9Q/q7
# nke+gboF8bqbUnq6VTuM6wUGot3kfvN0Apxd8VLNnzeGCOvggRj8Er4mcRK/Cccv
# QardLj73qLajJ90mznHYHavOseUVLaFb0Jsch6uify56wbUls/bGrHuD3HEW8riF
# ovhwKPoBK7EJ8aQbD05DfQXJgeqKKFLQzgWPFBQj/cESGLDx74FOJ6FrmvuLxMp7
# nM0ybyeHbcpiNAVJ6wPt4hncMUCEOCaQ9cHLZrziBahIbqUyT1xQDIWQl/fPPCFa
# kC2tsvk+dNTk/juh2AfA+BX76eKRSvtGd4qbV45Z4NFILJh87W784HSd3xKWktXm
# TgvfDs80s5b9ZyQD1jCk2JwJFvPifd9PnTRlBFzOLvK995BUqcTN65IMTfv0/asJ
# WutJgpS3z3ESaawDsd+23pDVHrks8XOaVSzzLvxMuu/bVIPNxwBmvfSH65qknuBv
# 0knPkrITUWZRSpDsC4vwzDuozD/WKeW+37HbhBsGpSLYgpsgI7tharV7YoBzRZfy
# UJQ5bhDrRl+orOL8MDBpDNs3ytRZ9O8/M5E3q14pQ1AhzRG7oGyMOt1yOEn6s0D9
# 1eeZIj/AtQY1vBr4bjsZycNagdgVPToPuARBkPGZj/Qd6biK2M6Nliu1IRc=
# SIG # End signature block