rules/Azure.AppService.Rule.ps1
# Copyright (c) Microsoft Corporation. # Licensed under the MIT License. # # Validation rules for Azure App Services # # Synopsis: App Service Plan should use a minimum number of instances for failover. Rule 'Azure.AppService.PlanInstanceCount' -Ref 'AZR-000071' -Type 'Microsoft.Web/serverfarms' -If { !(IsConsumptionPlan) -and !(IsElasticPlan) } -Tag @{ release = 'GA'; ruleSet = '2020_06'; 'Azure.WAF/pillar' = 'Reliability'; } { $Assert.GreaterOrEqual($TargetObject, 'sku.capacity', 2); } # Synopsis: App Service should reject TLS versions older than 1.2. Rule 'Azure.AppService.MinTLS' -Ref 'AZR-000073' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/slots' -Tag @{ release = 'GA'; ruleSet = '2020_06'; 'Azure.WAF/pillar' = 'Security'; } -Labels @{ 'Azure.MCSB.v1/control' = 'DP-3' } { $siteConfigs = @(GetWebSiteConfig); if ($siteConfigs.Length -eq 0) { return $Assert. HasFieldValue($TargetObject, 'properties.siteConfig.minTlsVersion', '1.2'). ReasonFrom('properties.siteConfig.minTlsVersion', $LocalizedData.MinTLSVersion, $TargetObject.properties.siteConfig.minTlsVersion); } foreach ($siteConfig in $siteConfigs) { $path = $siteConfig._PSRule.path; $Assert. HasFieldValue($siteConfig, 'properties.minTlsVersion', '1.2'). ReasonFrom('properties.minTlsVersion', $LocalizedData.MinTLSVersion, $siteConfig.properties.minTlsVersion).PathPrefix($path); } } # Synopsis: Disable remote debugging on App Service apps when not in use. Rule 'Azure.AppService.RemoteDebug' -Ref 'AZR-000074' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/slots' -Tag @{ release = 'GA'; ruleSet = '2020_12'; 'Azure.WAF/pillar' = 'Security'; } -Labels @{ 'Azure.MCSB.v1/control' = 'PV-2' } { $siteConfigs = @(GetWebSiteConfig); if ($siteConfigs.Length -eq 0) { return $Assert.HasDefaultValue($TargetObject, 'properties.siteConfig.remoteDebuggingEnabled', $False); } foreach ($siteConfig in $siteConfigs) { $path = $siteConfig._PSRule.path; $Assert.HasDefaultValue($siteConfig, 'properties.remoteDebuggingEnabled', $False).PathPrefix($path); } } # Synopsis: Configure applications to use newer .NET Framework versions. Rule 'Azure.AppService.NETVersion' -Ref 'AZR-000075' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/slots' -Tag @{ release = 'GA'; ruleSet = '2024_03'; 'Azure.WAF/pillar' = 'Security'; } { $siteConfigs = @(GetWebSiteConfig) if ($siteConfigs.Length -eq 0) { if ($Assert.HasFieldValue($TargetObject, 'properties.siteConfig.linuxFxVersion').Result -and $TargetObject.properties.siteConfig.linuxFxVersion -like 'DOTNETCORE|*') { $linuxVersion = $TargetObject.properties.siteConfig.linuxFxVersion.Split('|')[1]; return $Assert.Version($linuxVersion, '.', '>=8.0').PathPrefix('properties.siteConfig.linuxFxVersion'); } elseif (!$Assert.HasDefaultValue($TargetObject, 'properties.siteConfig.netFrameworkVersion', 'OFF').Result -and ![String]::IsNullOrEmpty($TargetObject.properties.siteConfig.netFrameworkVersion)) { return $Assert.Version($TargetObject, 'properties.siteConfig.netFrameworkVersion', '4.0 || >=8.0'); } else { return $Assert.Pass(); } } foreach ($siteConfig in $siteConfigs) { $path = $siteConfig._PSRule.path; if ($Assert.HasFieldValue($siteConfig, 'properties.linuxFxVersion').Result -and $siteConfig.properties.linuxFxVersion -like 'DOTNETCORE|*') { $linuxVersion = $siteConfig.properties.linuxFxVersion.Split('|')[1]; $Assert.Version($linuxVersion, '.', '>=8.0').PathPrefix("$path.properties.linuxFxVersion"); } elseif (!$Assert.HasDefaultValue($siteConfig, 'properties.netFrameworkVersion', 'OFF').Result -and ![String]::IsNullOrEmpty($siteConfig.properties.netFrameworkVersion)) { $Assert.Version($siteConfig, 'properties.netFrameworkVersion', '4.0 || >=8.0').PathPrefix($path); } else { $Assert.Pass(); } } } # Synopsis: Configure applications to use newer PHP runtime versions. Rule 'Azure.AppService.PHPVersion' -Ref 'AZR-000076' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/slots' -Tag @{ release = 'GA'; ruleSet = '2024_03'; 'Azure.WAF/pillar' = 'Security'; } { $siteConfigs = @(GetWebSiteConfig) if ($siteConfigs.Length -eq 0) { if ($Assert.HasFieldValue($TargetObject, 'properties.siteConfig.linuxFxVersion').Result -and $TargetObject.properties.siteConfig.linuxFxVersion -like 'PHP|*') { $linuxVersion = $TargetObject.properties.siteConfig.linuxFxVersion.Split('|')[1]; return $Assert.Version($linuxVersion, '.', '>=8.2').PathPrefix('properties.siteConfig.linuxFxVersion'); } elseif (!$Assert.HasDefaultValue($TargetObject, 'properties.siteConfig.phpVersion', 'OFF').Result -and ![String]::IsNullOrEmpty($TargetObject.properties.siteConfig.phpVersion)) { return $Assert.Version($TargetObject, 'properties.siteConfig.phpVersion', '>=8.2'); } else { return $Assert.Pass(); } } foreach ($siteConfig in $siteConfigs) { $path = $siteConfig._PSRule.path; if ($Assert.HasFieldValue($siteConfig, 'properties.linuxFxVersion').Result -and $siteConfig.properties.linuxFxVersion -like 'PHP|*') { $linuxVersion = $siteConfig.properties.linuxFxVersion.Split('|')[1]; $Assert.Version($linuxVersion, '.', '>=8.2').PathPrefix("$path.properties.linuxFxVersion"); } elseif (!$Assert.HasDefaultValue($siteConfig, 'properties.phpVersion', 'OFF').Result -and ![String]::IsNullOrEmpty($siteConfig.properties.phpVersion)) { $Assert.Version($siteConfig, 'properties.phpVersion', '>=8.2').PathPrefix($path); } else { $Assert.Pass(); } } } # Synopsis: Configure Always On for App Service apps. Rule 'Azure.AppService.AlwaysOn' -Ref 'AZR-000077' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/slots' -With 'Azure.AppService.IsWebApp', 'Azure.AppService.IsAPIApp' -Tag @{ release = 'GA'; ruleSet = '2020_12'; 'Azure.WAF/pillar' = 'Reliability'; } { $siteConfigs = @(GetWebSiteConfig); if ($siteConfigs.Length -eq 0) { return $Assert.HasFieldValue($TargetObject, 'Properties.siteConfig.alwaysOn', $True); } foreach ($siteConfig in $siteConfigs) { $Assert.HasFieldValue($siteConfig, 'properties.alwaysOn', $True); } } # Synopsis: Use HTTP/2 for App Service apps. Rule 'Azure.AppService.HTTP2' -Ref 'AZR-000078' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/slots' -Tag @{ release = 'GA'; ruleSet = '2020_12'; 'Azure.WAF/pillar' = 'Performance Efficiency'; } { $siteConfigs = @(GetWebSiteConfig); if ($siteConfigs.Length -eq 0) { return $Assert.HasFieldValue($TargetObject, 'Properties.siteConfig.http20Enabled', $True); } foreach ($siteConfig in $siteConfigs) { $Assert.HasFieldValue($siteConfig, 'Properties.http20Enabled', $True); } } #region Web Apps # Synopsis: Configure and enable instance health probes. Rule 'Azure.AppService.WebProbe' -Ref 'AZR-000079' -With 'Azure.AppService.IsWebApp' -Tag @{ release = 'GA'; ruleSet = '2022_06'; 'Azure.WAF/pillar' = 'Reliability'; } { $siteConfigs = @(GetWebSiteConfig | Where-Object { $Assert.HasField($_, 'Properties.healthCheckPath').Result }); if ($siteConfigs.Length -eq 0) { return $Assert.HasFieldValue($TargetObject, 'properties.siteConfig.healthCheckPath'); } foreach ($siteConfig in $siteConfigs) { $Assert.HasFieldValue($siteConfig, 'properties.healthCheckPath'); } } # Synopsis: Web apps should use a dedicated health check path. Rule 'Azure.AppService.WebProbePath' -Ref 'AZR-000080' -With 'Azure.AppService.IsWebApp' -Tag @{ release = 'GA'; ruleSet = '2022_06'; 'Azure.WAF/pillar' = 'Reliability'; } { $siteConfigs = @(GetWebSiteConfig | Where-Object { $Assert.HasField($_, 'properties.healthCheckPath').Result }); if ($siteConfigs.Length -eq 0) { return $Assert.Greater($TargetObject, 'properties.siteConfig.healthCheckPath', 1); } foreach ($siteConfig in $siteConfigs) { $Assert.Greater($siteConfig, 'properties.healthCheckPath', 1); } } # Synopsis: Web apps should disable insecure FTP and configure SFTP when required. Rule 'Azure.AppService.WebSecureFtp' -Ref 'AZR-000081' -With 'Azure.AppService.IsWebApp' -Tag @{ release = 'GA'; ruleSet = '2022_06'; 'Azure.WAF/pillar' = 'Security'; } -Labels @{ 'Azure.MCSB.v1/control' = 'DP-3' } { $siteConfigs = @(GetWebSiteConfig | Where-Object { $Assert.HasField($_, 'Properties.ftpsState').Result }); if ($siteConfigs.Length -eq 0) { return $Assert.In($TargetObject, 'Properties.siteConfig.ftpsState', @( 'FtpsOnly' 'Disabled' )); } foreach ($siteConfig in $siteConfigs) { $Assert.In($siteConfig, 'Properties.ftpsState', @( 'FtpsOnly' 'Disabled' )); } } # Synopsis: Configure applications to use supported Node.js runtime versions. Rule 'Azure.AppService.NodeJsVersion' -Ref 'AZR-000428' -Type 'Microsoft.Web/sites', 'Microsoft.Web/sites/config', 'Microsoft.Web/sites/slots', 'Microsoft.Web/sites/slots/config' -Tag @{ release = 'GA'; ruleSet = '2024_06'; 'Azure.WAF/pillar' = 'Security'; } { $versions = Get-NodeVersions $pass = $true foreach ($version in $versions) { if ($version -lt '20.0') { $pass = $false $Assert.Version($version.ToString(), '.', '>=20.0.0') } } # Pass if the version is not defined or version is 20 or greater. if ($pass) { $Assert.Pass() } } # Synopsis: Deploy app service plan instances using availability zones in supported regions to ensure high availability and resilience. Rule 'Azure.AppService.AvailabilityZone' -Ref 'AZR-000442' -Type 'Microsoft.Web/serverfarms' -Tag @{ release = 'GA'; ruleSet = '2024_09'; 'Azure.WAF/pillar' = 'Reliability'; } { # Check if the region supports availability zones. $provider = [PSRule.Rules.Azure.Runtime.Helper]::GetResourceType('Microsoft.Compute', 'virtualMachineScaleSets') # Use VMSS provider for availability zones as the App Service provider does not provide this information. $availabilityZones = GetAvailabilityZone -Location $TargetObject.Location -Zone $provider.ZoneMappings # Don't flag if the region does not support availability zones. if (-not $availabilityZones) { return $Assert.Pass() } # Availability zones are only supported for these Premium SKUs. $sku = [PSCustomObject]@{ name = @( 'P1v3' 'P1mv3' 'P2v3' 'P2mv3' 'P3v3' 'P3mv3' 'P4mv3' 'P5mv3' 'P1v2' 'P2v2' 'P3v2' 'EP1' 'EP2' 'EP3' ) tier = @( 'PremiumV3' 'PremiumV2' 'ElasticPremium' ) } AnyOf { $Assert.In($TargetObject, 'sku.name', $sku.name).ReasonFrom( 'sku.name', $LocalizedData.AppServiceAvailabilityZoneSKU, $TargetObject.name ) $Assert.In($TargetObject, 'sku.tier', $sku.tier).ReasonFrom( 'sku.tier', $LocalizedData.AppServiceAvailabilityZoneSKU, $TargetObject.name ) } $Assert.HasFieldValue($TargetObject, 'properties.zoneRedundant', $true) } #endregion Web Apps #region Helper functions function global:IsConsumptionPlan { [CmdletBinding()] param () process { return ( $TargetObject.sku.Name -eq 'Y1' -or $TargetObject.sku.Tier -eq 'Dynamic' ); } } function global:IsElasticPlan { [CmdletBinding()] param () process { return ( $TargetObject.sku.Name -like 'EP*' -or $TargetObject.sku.Tier -eq 'ElasticPremium' -or $TargetObject.kind -eq 'elastic' ); } } function global:GetWebSiteConfig { [CmdletBinding()] param () process { $siteConfigs = @(GetSubResources -ResourceType 'Microsoft.Web/sites/config', 'Microsoft.Web/sites/slots/config' | Where-Object { $_.Name -notlike "*/*" -or $_.Name -like "*/web" -or $_.Id -like "*/web" }) $siteConfigs; } } function global:Get-NodeVersions { <# .SYNOPSIS Get the Node.js versions for the App Service. .DESCRIPTION This function retrieves the Node.js versions for the App Service. .OUTPUTS Output is a list of Node.js versions used, except the 'NODE|lts' version as this is not version specific, hence not parsable. #> [CmdletBinding()] param ( ) [Version[]]$versions = @( # App Service on Linux. Works when main object equals Microsoft.Web/sites or Microsoft.Web/sites/slots $TargetObject.properties.siteConfig.linuxFxVersion | Where-Object { $_ -like 'NODE|*' -and $_ -ne 'NODE|lts' } # App Service on Linux. Works for when main object equals Microsoft.Web/sites/config 'web' or Microsoft.Web/sites/slots/config 'web' $TargetObject.properties.linuxFxVersion | Where-Object { $_ -like 'NODE|*' -and $_ -ne 'NODE|lts' } # App Service on Linux. GetSubResources -ResourceType 'Microsoft.Web/sites/slots' | ForEach-Object { $_.properties.siteConfig.linuxFxVersion | Where-Object { $_ -like 'NODE|*' -and $_ -ne 'NODE|lts' } } # App Service on Linux. GetSubResources -ResourceType 'Microsoft.Web/sites/config', 'Microsoft.Web/sites/slots/config' | Where-Object { $_.name -eq 'web' -or $_.name -like '*/web' } | ForEach-Object { $_.properties.linuxFxVersion | Where-Object { $_ -like 'NODE|*' -and $_ -ne 'NODE|lts' } } # App Service on Windows. Works for when main object equals Microsoft.Web/sites or Microsoft.Web/sites/slots $TargetObject.properties.siteConfig.appSettings | Where-Object name -eq 'WEBSITE_NODE_DEFAULT_VERSION' | ForEach-Object { $_.value } # App Service on Windows. Works for when main object equals Microsoft.Web/sites/config 'appsettings' or Microsoft.Web/sites/slots/config 'appsettings' $TargetObject.properties.WEBSITE_NODE_DEFAULT_VERSION # App Service on Windows. Works for when main object equals Microsoft.Web/sites/config 'web' or Microsoft.Web/sites/slots/config 'web' $TargetObject.properties.appSettings | Where-Object name -eq 'WEBSITE_NODE_DEFAULT_VERSION' | ForEach-Object { $_.value } # App Service on Windows. GetSubResources -ResourceType 'Microsoft.Web/sites/slots' | ForEach-Object { $_.properties.siteConfig.appSettings | Where-Object name -eq 'WEBSITE_NODE_DEFAULT_VERSION' | ForEach-Object { $_.value } } # App Service on Windows. GetSubResources -ResourceType 'Microsoft.Web/sites/config', 'Microsoft.Web/sites/slots/config' | Where-Object { $_.name -eq 'appsettings' -or $_.name -like '*/appsettings' } | ForEach-Object { $_.properties.WEBSITE_NODE_DEFAULT_VERSION } # App Service on Windows. GetSubResources -ResourceType 'Microsoft.Web/sites/config', 'Microsoft.Web/sites/slots/config' | Where-Object { $_.name -eq 'web' -or $_.name -like '*/web' } | ForEach-Object { $_.properties.appSettings | Where-Object name -eq 'WEBSITE_NODE_DEFAULT_VERSION' | ForEach-Object { $_.value } } ) -replace '[^\d.]' -match '.' -replace '^\d+$', '$0.0' $versions } #endregion Helper functions # SIG # Begin signature block # MIIoKQYJKoZIhvcNAQcCoIIoGjCCKBYCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCF8lnfyuc4SjJr # Tca/2pEmLYC4PrG/Xwh5ccabgQGKSaCCDXYwggX0MIID3KADAgECAhMzAAAEBGx0 # Bv9XKydyAAAAAAQEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTE0WhcNMjUwOTExMjAxMTE0WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC0KDfaY50MDqsEGdlIzDHBd6CqIMRQWW9Af1LHDDTuFjfDsvna0nEuDSYJmNyz # NB10jpbg0lhvkT1AzfX2TLITSXwS8D+mBzGCWMM/wTpciWBV/pbjSazbzoKvRrNo # DV/u9omOM2Eawyo5JJJdNkM2d8qzkQ0bRuRd4HarmGunSouyb9NY7egWN5E5lUc3 # a2AROzAdHdYpObpCOdeAY2P5XqtJkk79aROpzw16wCjdSn8qMzCBzR7rvH2WVkvF # HLIxZQET1yhPb6lRmpgBQNnzidHV2Ocxjc8wNiIDzgbDkmlx54QPfw7RwQi8p1fy # 4byhBrTjv568x8NGv3gwb0RbAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU8huhNbETDU+ZWllL4DNMPCijEU4w # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMjkyMzAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAIjmD9IpQVvfB1QehvpC # Ge7QeTQkKQ7j3bmDMjwSqFL4ri6ae9IFTdpywn5smmtSIyKYDn3/nHtaEn0X1NBj # L5oP0BjAy1sqxD+uy35B+V8wv5GrxhMDJP8l2QjLtH/UglSTIhLqyt8bUAqVfyfp # h4COMRvwwjTvChtCnUXXACuCXYHWalOoc0OU2oGN+mPJIJJxaNQc1sjBsMbGIWv3 # cmgSHkCEmrMv7yaidpePt6V+yPMik+eXw3IfZ5eNOiNgL1rZzgSJfTnvUqiaEQ0X # dG1HbkDv9fv6CTq6m4Ty3IzLiwGSXYxRIXTxT4TYs5VxHy2uFjFXWVSL0J2ARTYL # E4Oyl1wXDF1PX4bxg1yDMfKPHcE1Ijic5lx1KdK1SkaEJdto4hd++05J9Bf9TAmi # u6EK6C9Oe5vRadroJCK26uCUI4zIjL/qG7mswW+qT0CW0gnR9JHkXCWNbo8ccMk1 # sJatmRoSAifbgzaYbUz8+lv+IXy5GFuAmLnNbGjacB3IMGpa+lbFgih57/fIhamq # 5VhxgaEmn/UjWyr+cPiAFWuTVIpfsOjbEAww75wURNM1Imp9NJKye1O24EspEHmb # DmqCUcq7NqkOKIG4PVm3hDDED/WQpzJDkvu4FrIbvyTGVU01vKsg4UfcdiZ0fQ+/ # V0hf8yrtq9CkB8iIuk5bBxuPMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # hkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5 # IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEwOTA5WjB+MQswCQYDVQQG # EwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYDVQQDEx9NaWNyb3NvZnQg # Q29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+laUKq4BjgaBEm6f8MMHt03 # a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc6Whe0t+bU7IKLMOv2akr # rnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4Ddato88tt8zpcoRb0Rrrg # OGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+lD3v++MrWhAfTVYoonpy # 4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nkkDstrjNYxbc+/jLTswM9 # sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6A4aN91/w0FK/jJSHvMAh # dCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmdX4jiJV3TIUs+UsS1Vz8k # A/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL5zmhD+kjSbwYuER8ReTB # w3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zdsGbiwZeBe+3W7UvnSSmn # Eyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3T8HhhUSJxAlMxdSlQy90 # lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS4NaIjAsCAwEAAaOCAe0w # ggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRIbmTlUAXTgqoXNzcitW2o # ynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYD # VR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBDuRQFTuHqp8cx0SOJNDBa # BgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2Ny # bC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3JsMF4GCCsG # AQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFfMDNfMjIuY3J0MIGfBgNV # HSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1hcnljcHMuaHRtMEAGCCsG # AQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkAYwB5AF8AcwB0AGEAdABl # AG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn8oalmOBUeRou09h0ZyKb # C5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7v0epo/Np22O/IjWll11l # hJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0bpdS1HXeUOeLpZMlEPXh6 # I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/KmtYSWMfCWluWpiW5IP0 # wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvyCInWH8MyGOLwxS3OW560 # STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBpmLJZiWhub6e3dMNABQam # ASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJihsMdYzaXht/a8/jyFqGa # J+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYbBL7fQccOKO7eZS/sl/ah # XJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbSoqKfenoi+kiVH6v7RyOA # 9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sLgOppO6/8MO0ETI7f33Vt # Y5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtXcVZOSEXAQsmbdlsKgEhr # /Xmfwb1tbWrJUnMTDXpQzTGCGgkwghoFAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAQEbHQG/1crJ3IAAAAABAQwDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHnh08+CuS20sWAMWvOI0zyp # JoEW+oz9A8E5L2tIRzK7MEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAIWogjhV1zZo7z06usEXsUEHFPtS+aw34dwaLQ9rSCPc11Lq/5Ochqe5c # sv5F2OYmrw72zBs1GUWY9ax+v1dRkj656iOWYTNY/ctr5+QlwZZiynTla5cxok4V # yyA4HSb2L9chYzAyGn0CAvYfqahD4EimuV/aWfMKN8ko3p/tMT/Ra0KXOxOl2OAq # 284cV3a6k6l1uhf3Flgtc57ML4v3bQRN/5CD8byr+eWjFygszab1OIaglyO9YYoK # pOpZRJf/vXguyCsEpeNI2mMUjU5/jFeChyqXbzm3YqvPOzM/9sviEDDJIPrAUk7W # rQGVxFEz9uKGg7VHVd76NUqlKfDcBqGCF5MwghePBgorBgEEAYI3AwMBMYIXfzCC # F3sGCSqGSIb3DQEHAqCCF2wwghdoAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsq # hkiG9w0BCRABBKCCAUAEggE8MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCADYq9A7htxKDxJvekgXlvZ6vKk8NLxWj3cYGlXRF2OVgIGZwfUpbqe # GBIyMDI0MTAxNjE3MzQxMC40OFowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVy # aWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4RDAwLTA1 # RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCC # EeowggcgMIIFCKADAgECAhMzAAAB88UKQ64DzB0xAAEAAAHzMA0GCSqGSIb3DQEB # CwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNV # BAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4XDTIzMTIwNjE4NDYw # MloXDTI1MDMwNTE4NDYwMlowgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo # aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y # cG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMx # JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo4RDAwLTA1RTAtRDk0NzElMCMGA1UE # AxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAP6fptrhK4H2JI7lYyFueCpgBv7Pch/M2lkhZL+yB9eG # UtiYaexS2sZfc5VyD7ySsl2LG41Qw7tkA6oJmxdSM7PzNyfVpQPkPavY+HNUqMe2 # K9YaAaPjHnCpZ7VCi/e8zPxYewqx9p0iVaN8EydUpWiY7JtDv7aNzhp/OPZclBBK # YT2NBGgGiAPCaplqR5icjHQSY665w+vrvhPr9hpM+IhiUZ/5dXa7qhAcCQwbnrFg # 9CKSK1COM1YcAN8GpsERqqmlqy3GlE1ziJ3ZLXFVDFxAZeOcCB55Vts9sCgQuFvD # 7PdV61HC4QUlHNPqFtYSC/P0sxg9JuKgcvzD5mJajfG7DdHt8myp7umqyePC+eI/ # ux8TW61+LuTQ1Bkym+I6z//bf0fp4Dog5W0XzDrqKkTvURitxI2s4aVObm6qr6zI # 7W51k54ozTFjvbw1wYMWqeO4U9sQSbr561kp+1T2PEsJLOpc5U7N2oDw7ldrcTjW # PezsyVMXhDsFitCZunGqFO9+4iVjAjYDN47c6K9x7MnAGPYVCBOJUdpy8xAOBIDs # Tm/K1qTT4wsGbQBxbgg96vwDiA4YP2hKmubIC7UnrAWQGt/ZKOf6J42roXHS1aPw # imDe5C9y6DfuNJp0XqrWtQRqg8hqNkIZWT6jnCfqu35zB0nf1ERTjdpYLCfQL5fH # AgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQUw2QV9qURUQyMDcCmhTH2oOsNCiQwHwYD # VR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZO # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # VGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBc # BggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0 # cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYD # VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC # B4AwDQYJKoZIhvcNAQELBQADggIBAN/EHI/80f7v29zeWI7hzudcz9QoVwCbnDrU # XFHE/EJdFeWI2NnuwOo0/QPNRMFT21LkOqSpFKIhXXmPurx7p6WDz9wPdu/Sxbga # j0AwviWEDkwGDfDMp2KF8nQT8cipwdfXWbC1ulOILayABSHv45mdv1PAkTulsQE8 # lBTHG4KJLn+vSzZBWKkGaL/wwRbZ4iLiYn68cjkMJoAaihPgDXn/ug2P3PLNEAFN # QgI02tLX0p+vIQ3l2HmSo4bhCBxr3DovsIv5K65NmLRJnxmrrmIraFDwgwA5XF7A # KkPiVkvo0OxU1LAE1c5SWzE4A7cbTA1P5wG6D8cPjcHsTah1V+zofYRgJnFRLWuB # F4Z3a6pDGBDbCsy5NvnKQ76p37ieFp//1I3eB62ia1CfkjOF8KStpPUqdkXxMjfJ # 7Vnemd6vQKf+nXkfvA3AOQECJn7aLP01QR5gt8wab28SsNUENEyMawT8eqpjtBNJ # O0O9Tv7NnBE8aOJhhQVdP5WCR90eIWkrDjZeybQx8vlo5rfUXIIzXv+k9MgpNGIq # wMXfvRLAjBkCNXOIP/1CEQUG72miMVQs5m/O4vmJIQkhyqilUDB1s12uhmLYc3yd # 8OPMlrwIxORB5J9CxCkqvzc6EGYTcwXazPyCp7eWhzTkNbwk29nfbwmmzcskIAu3 # StA8lic7MIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG # 9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEy # MDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIw # MTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGlt # ZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # AOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az # /1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V2 # 9YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oa # ezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkN # yjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7K # MtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRf # NN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SU # HDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoY # WmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5 # C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8 # FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TAS # BgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1 # Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUw # UzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoG # CCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIB # hjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fO # mhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9w # a2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggr # BgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3 # DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEz # tTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJW # AAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G # 82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/Aye # ixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI9 # 5ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1j # dEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZ # KCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xB # Zj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuP # Ntq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvp # e784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA00w # ggI1AgEBMIH5oYHRpIHOMIHLMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScw # JQYDVQQLEx5uU2hpZWxkIFRTUyBFU046OEQwMC0wNUUwLUQ5NDcxJTAjBgNVBAMT # HE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAG76 # BizYtGFrmkU7v2DcuR/ApGcooIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg # UENBIDIwMTAwDQYJKoZIhvcNAQELBQACBQDqujubMCIYDzIwMjQxMDE2MTMxODE5 # WhgPMjAyNDEwMTcxMzE4MTlaMHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAOq6O5sC # AQAwBwIBAAICB24wBwIBAAICEw8wCgIFAOq7jRsCAQAwNgYKKwYBBAGEWQoEAjEo # MCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG # 9w0BAQsFAAOCAQEAPewC5YWhrzRCAWTCiVEGq5KRKVSjcMjW9Mehx632+V0cg834 # YwRfWU1AcbdUAxBtViNxRKJPYO8dml+Y16/QRlMoJVHFmKb6qw0CsGLqFiZJwTKk # WnBBy+yYl3LnJTX+XknILK/ZAqHCKRDJUp8x5SZAnYWJ5f1PwysYw+1ZZj3vpEfz # a2GJi+Fg6mk5LJHDUaem2HH176WF41ccLqslRTkFQHXV3FBgw+3HvFd8LzvGtYf1 # DarptxdUBE/wIDoEl76Nb3IbxqHlua4/Ir9l8f6uOvvieyneQIP91KK8F+NV8Eo5 # yrrdXv4ypmbHBRm4Rf1Cqb3DoNS9W0cc8oqTxjGCBA0wggQJAgEBMIGTMHwxCzAJ # BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jv # c29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB88UKQ64DzB0xAAEAAAHzMA0G # CWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ # KoZIhvcNAQkEMSIEIChhOinLOJ0dZeY1R/hY0OdszX2H7iRrZtuxiNhzr+4vMIH6 # BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgGLzZNIu24bhWSnzAGYmT9P5ECHzj # Wwb9oM7DGDo7YugwgZgwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz # aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv # cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx # MAITMwAAAfPFCkOuA8wdMQABAAAB8zAiBCBE71hgDj6kYCl35zk3qWkDbF8jgOyD # FtpsTzoeV3ZmeTANBgkqhkiG9w0BAQsFAASCAgBuowCOCE+vqTBjuJKSYekTi9My # /KcHSi2sfI1Yelz4furANzf6k7HMRDqo93Ke+CzzIHQYSlK4jbiUt7qgNod9nTyW # A/JSbpsfl3Jitxhg/bCb6WXu6sNegpPspkGdLmRMbGMvVhswFn6HhNlW5WusNW86 # C9ysS7p4kR4BbrVXsVMviVXW4VaOaq45QgkKJU8OwQLw0+VDAYdTIJ2NALMRg056 # y/aGeB5R90GIxRRjbDblAc/1b3K6+8+BhuwvYi/HSbcMQ8k6UjCPNiWMgfVeKyNa # JTfwmLLVsP4Zpea5maRb/1/UTY6FRsJi8xHpBSrQtGLR7Cio0fNz7CHkk8jMVJvB # uzXjcOHnksMXpTjzLdR4Lox8Jb9InwerwosMa9nBhhVC5YytqRFiwuD432Nkl5Xa # cJPm+0pM8txBzdkDViA8CZKn1cEwDFLB7hDpgWnBXzK7tqTS1VMcr/xgb/GfdVIs # xCEhsBJkp6UHL+L+MEWqfqn9x6YKd+DGsbQfJSsZjWNNiWfBZMcptbej1bhC8xlZ # 4EBVX0xG22Zw91e1bX2DRgh3IM6+tmgHAGfeKfEYZGPuvJNQEmOr1ww8Xcp8CpR8 # ooeiwEU3ViCio/oHQRYZF8xFl7II+KyplAutmGcB+caljdhSTeUuFQpX/8kjZ+d3 # ShhSIEEUXWaGQPQryA== # SIG # End signature block |