Obs/scripts/Install-StandaloneObservability.ps1
##------------------------------------------------------------------ ## <copyright file="Install-StandaloneObservability.ps1" company="Microsoft"> ## Copyright (C) Microsoft. All rights reserved. ## </copyright> ##------------------------------------------------------------------ [CmdletBinding(SupportsShouldProcess = $true, ConfirmImpact = "Medium", PositionalBinding = $false, DefaultParameterSetName = "DefaultSet")] param( [Parameter(Mandatory = $true)] [System.String] $ResourceGroupName, [Parameter(Mandatory = $true)] [System.String] $SubscriptionId, [Parameter(Mandatory = $true)] [System.String] $TenantId, [Parameter(Mandatory=$false)] [System.String] $RegistrationRegion = "eastus", [Parameter(Mandatory = $true, ParameterSetName = "DefaultSet")] [PSCredential] $RegistrationCredential, [Parameter(Mandatory = $true, ParameterSetName = "Interactive")] [Switch] $Interactive, [Parameter(Mandatory = $true, ParameterSetName = "PassThrough")] [Switch] $PassThrough, [Parameter(Mandatory = $true, ParameterSetName = "ServicePrincipal")] [PSCredential] $RegistrationSPCredential, [Parameter(Mandatory=$true)] [System.String] $FactoryLogShare, [Parameter(Mandatory=$false)] [System.String] $ClusterName, [Parameter(Mandatory=$false)] [System.String] $ObsRootFolderPath = "C:\StandaloneObservability", [Parameter(Mandatory=$false)] [Switch] $ParseOnce, [Parameter(Mandatory=$false)] [System.String] $Cloud = "AzureCloud", [Parameter(Mandatory=$false)] [System.String] $GcsRegion = "eastus", [Parameter(Mandatory=$false)] [System.Boolean] $SkipArcForServer = $false ) Import-Module "$PSScriptRoot\ExtensionHelper.psm1" Import-Module "$PSScriptRoot\StandaloneObservabilityHelper.psm1" Import-Module "$PSScriptRoot\StandaloneObservabilityConstants.psm1" try { $ErrorActionPreference = "Stop" $functionName = $MyInvocation.MyCommand.Name if ([string]::IsNullOrEmpty($ClusterName)) { Write-Host "ClusterName is empty. So setting it to computer name $($env:COMPUTERNAME)" $ClusterName = $env:COMPUTERNAME } if(-not (Test-Path -Path $ObsRootFolderPath -PathType Container)) { Write-Host "ObsRootFolderPath: $ObsRootFolderPath is not present. So creating it" New-Item -Path $ObsRootFolderPath -ItemType Directory -Force } $transcriptFileName = "{0}.{1:yyyy-MM-dd-hh-mm-ss}.log" -f $functionName, $(Get-Date) $transcriptFilePath = Join-Path -Path $ObsRootFolderPath -ChildPath $transcriptFileName Start-Transcript -Path $transcriptFilePath -Append $gmaPackageContentPath = Get-GmaPackageContentPath Import-Module "$gmaPackageContentPath\GMATenantJsonHelper.psm1" -Force Add-Type -Path "$gmaPackageContentPath\Microsoft.AzureStack.Observability.ObservabilityCommon.dll" ## Create pre-requisites for Extension New-GmaStateFolders -ObsRootFolderPath $ObsRootFolderPath Set-HandlerEnvInfo -ObsRootFolderPath $ObsRootFolderPath -CloudName $Cloud -RegionName $RegistrationRegion $parsingEnginePath = Join-Path -Path $global:ObsArtifactsPaths.ObservabilityAgent -ChildPath "LogParsingEngine" $parsingEngineScript = Join-Path -Path $global:extensionRootLocation -ChildPath "scripts\Invoke-ParsingEngine.ps1" $gcsEnvironment = "Prod" ## default environment ## Check if the reg key created for CI exists or not, if yes then change the GCSEnvironment to point to PPE. if (Test-RegKeyExists -Path "HKLM:\Software\Microsoft\SQMClient\" -Name "IsCIEnv") { $gcsEnvironment = "Ppe" } elseif (Get-IsArcAEnvironment) { $gcsEnvironment = "ArcAPpe" } $envInfoFilePath = "$gmaPackageContentPath\EnvironmentInfo.json" $tenantInfoContent = Get-Content $envInfoFilePath -Raw | ConvertFrom-Json $envInfo = $tenantInfoContent.$gcsEnvironment # Settings from EnvironmentInfo.json $gcsEndpoint = $envInfo.EndPoint $gcsAccount = $envInfo.Account $genevaConfigVersion = $envInfo.ConfigVersion ## Install Azure Connected Machine agent $StampId = Set-StampGuid $resourceName = "$(hostname)-$StampId" if ($skipArcForServer -eq $false) { Write-Host "$functionName Azure identity is not enabled. Going to install Arc for server agent" -Verbose if(-not (Get-Module -Name Az.Accounts -ListAvailable)) { Install-Module -Name Az.Accounts -AllowClobber -Force } if ($PSCmdlet.ParameterSetName -eq "ServicePrincipal") { Connect-AzAccount -Credential $RegistrationSPCredential -ServicePrincipal -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -RegistrationSPCredential $RegistrationSPCredential } elseif ($PSCmdlet.ParameterSetName -eq "Interactive") { Connect-AzAccount -UseDeviceAuthentication -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId $token = Get-AzAccessToken Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -AccessToken $token.Token } elseif ($PSCmdlet.ParameterSetName -eq "PassThrough") { $token = Get-AzAccessToken Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -AccessToken $token.Token } else { Connect-AzAccount -Credential $RegistrationCredential -Environment $Cloud -Tenant $TenantId -Subscription $SubscriptionId $token = Get-AzAccessToken Install-AzureConnectedMachineAgent -ResourceName $resourceName -ResourceGroupName $ResourceGroupName -TenantId $TenantId ` -RegionName $RegistrationRegion -SubscriptionId $SubscriptionId -Cloud $Cloud ` -StampId $StampId -AccessToken $token.Token } } ## Start Pipeline installation using Extension Install interface $deviceArmResourceUri = $PipelineConstants.DeviceArmUriFormat -f $SubscriptionId, $ResourceGroupName, $resourceName $osBuild = Get-OSBuildVersion $logFile = Get-HandlerLogFile Set-StandaloneScenarioRegistry -LogFile $logFile -ErrorAction Stop $configTypes = @([Microsoft.AzureStack.Observability.ObservabilityCommon.TenantConfigGenerator.Contract.TenantConfigType]::Telemetry, [Microsoft.AzureStack.Observability.ObservabilityCommon.TenantConfigGenerator.Contract.TenantConfigType]::Diagnostics) foreach($configType in $configTypes) { $gcsNameSpace = $envInfo.Namespaces.$configType [Microsoft.AzureStack.Observability.ObservabilityCommon.TenantConfigGenerator.TenantConfigRegistrySetter]::Current.SetTenantConfigRegistryKeys( $configType, "1.0", "AuthMSIToken", $gcsEndpoint, $gcsAccount, $gcsNameSpace, $GcsRegion, $genevaConfigVersion, $LocalPath, "true", "true", $GcsRegion, $deviceArmResourceUri, $StampId, $ClusterName, $osBuild, "1.0", $resourceName, $deviceArmResourceUri, $ClusterName, [string]::Empty) } Write-Host "Starting Install-Extension script with DeviceArmResourceUri: $deviceArmResourceUri StampId: $StampId ClusterName: $ClusterName CloudName: $Cloud RegistrationRegion: $RegistrationRegion" & "$PSScriptRoot\Install-Extension.ps1" ` -ErrorAction Stop if($LASTEXITCODE -ne 0) { Write-Error "Error during Extension installation $LASTEXITCODE" } & "$PSScriptRoot\Enable-Extension.ps1" if($LASTEXITCODE -ne 0) { Write-Error "Error during Extension enable $LASTEXITCODE" } # Sleep for sometime and check for GCS Config Wait-ForGcsConfigSync -TimeInSeconds 180 -LogFile $logFile $transcriptFolderPath = Join-Path -Path $(Get-LogFolderPath) -ChildPath $PipelineConstants.TranscriptsFolderName if($ParseOnce) { ## Run ParsingEngine with given log location Write-Host "Starting Parser scripts arguments: $parsingEngineScript -FactorySharePath $FactoryLogShare -ParsingEnginePackagePath $parsingEnginePath -GmaPackageContentPath $gmaPackageContentPath -TranscriptFolderPath $transcriptFolderPath" & $parsingEngineScript -FactorySharePath $FactoryLogShare ` -ParsingEnginePackagePath $parsingEnginePath ` -GmaPackageContentPath $gmaPackageContentPath ` -TranscriptFolderPath $transcriptFolderPath ` -ParseOnce ` -ErrorAction Stop } else { ## Create ParsingEngine scheduled tasks $scriptArguments = "-TaskName $($PipelineConstants.ParserScheduledTaskName) -FactorySharePath $FactoryLogShare -ParsingEnginePackagePath $parsingEnginePath -GmaPackageContentPath $gmaPackageContentPath -TranscriptFolderPath $transcriptFolderPath" Write-Host "Creating Parser scheduled task with arguments: $scriptArguments" New-ScheduledTaskForObservability -TaskName $PipelineConstants.ParserScheduledTaskName ` -TaskPath $PipelineConstants.ParserScheduledTaskPath ` -Description $PipelineConstants.ParserScheduledTaskDescription ` -ScriptPath $parsingEngineScript ` -ScriptArguments $scriptArguments ` -DisableOnRegistration ` -ErrorAction Stop ScheduledTasks\Enable-ScheduledTask -TaskPath $PipelineConstants.ParserScheduledTaskPath ` -TaskName $PipelineConstants.ParserScheduledTaskName ` -ErrorAction Stop } Set-Status -Name $functionName ` -Operation "Enabling succeeded" ` -Message "$functionName : Successfully enabled Standalone Observability pipeline components." ` -Status "success" ` -Code 0 Write-Host "Standalone Observability pipeline installation complete." Stop-Transcript -ErrorAction SilentlyContinue } catch { if ($null -eq (Get-Command -Verb Get -Noun ExceptionDetails) -and (-not [System.String]::IsNullOrEmpty($gmaPackageContentPath))) { Import-Module "$gmaPackageContentPath\GMATenantJsonHelper.psm1" -Force $exceptionDetails = Get-ExceptionDetails -ErrorObject $_ $errorMessage = "$functionName : Failed to enable Standalone Observability pipeline components. Exception is as follows: $exceptionDetails." Set-Status -Name $functionName ` -Operation "Enabling failed" ` -Message $errorMessage ` -Status "error" ` -Code 1 Write-Error $errorMessage Stop-Transcript -ErrorAction SilentlyContinue } else { Write-Error $_ } } # SIG # Begin signature block # MIInvwYJKoZIhvcNAQcCoIInsDCCJ6wCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCywLGufcqy116D # cq7k+EbWK7IXX2QZ53+4LyZdGjAsOaCCDXYwggX0MIID3KADAgECAhMzAAADrzBA # DkyjTQVBAAAAAAOvMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjMxMTE2MTkwOTAwWhcNMjQxMTE0MTkwOTAwWjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDOS8s1ra6f0YGtg0OhEaQa/t3Q+q1MEHhWJhqQVuO5amYXQpy8MDPNoJYk+FWA # hePP5LxwcSge5aen+f5Q6WNPd6EDxGzotvVpNi5ve0H97S3F7C/axDfKxyNh21MG # 0W8Sb0vxi/vorcLHOL9i+t2D6yvvDzLlEefUCbQV/zGCBjXGlYJcUj6RAzXyeNAN # xSpKXAGd7Fh+ocGHPPphcD9LQTOJgG7Y7aYztHqBLJiQQ4eAgZNU4ac6+8LnEGAL # go1ydC5BJEuJQjYKbNTy959HrKSu7LO3Ws0w8jw6pYdC1IMpdTkk2puTgY2PDNzB # tLM4evG7FYer3WX+8t1UMYNTAgMBAAGjggFzMIIBbzAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQURxxxNPIEPGSO8kqz+bgCAQWGXsEw # RQYDVR0RBD4wPKQ6MDgxHjAcBgNVBAsTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEW # MBQGA1UEBRMNMjMwMDEyKzUwMTgyNjAfBgNVHSMEGDAWgBRIbmTlUAXTgqoXNzci # tW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3JsMGEG # CCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDExXzIwMTEtMDctMDguY3J0 # MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIBAISxFt/zR2frTFPB45Yd # mhZpB2nNJoOoi+qlgcTlnO4QwlYN1w/vYwbDy/oFJolD5r6FMJd0RGcgEM8q9TgQ # 2OC7gQEmhweVJ7yuKJlQBH7P7Pg5RiqgV3cSonJ+OM4kFHbP3gPLiyzssSQdRuPY # 1mIWoGg9i7Y4ZC8ST7WhpSyc0pns2XsUe1XsIjaUcGu7zd7gg97eCUiLRdVklPmp # XobH9CEAWakRUGNICYN2AgjhRTC4j3KJfqMkU04R6Toyh4/Toswm1uoDcGr5laYn # TfcX3u5WnJqJLhuPe8Uj9kGAOcyo0O1mNwDa+LhFEzB6CB32+wfJMumfr6degvLT # e8x55urQLeTjimBQgS49BSUkhFN7ois3cZyNpnrMca5AZaC7pLI72vuqSsSlLalG # OcZmPHZGYJqZ0BacN274OZ80Q8B11iNokns9Od348bMb5Z4fihxaBWebl8kWEi2O # PvQImOAeq3nt7UWJBzJYLAGEpfasaA3ZQgIcEXdD+uwo6ymMzDY6UamFOfYqYWXk # ntxDGu7ngD2ugKUuccYKJJRiiz+LAUcj90BVcSHRLQop9N8zoALr/1sJuwPrVAtx # HNEgSW+AKBqIxYWM4Ev32l6agSUAezLMbq5f3d8x9qzT031jMDT+sUAoCw0M5wVt # CUQcqINPuYjbS1WgJyZIiEkBMIIHejCCBWKgAwIBAgIKYQ6Q0gAAAAAAAzANBgkq # 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 # /Xmfwb1tbWrJUnMTDXpQzTGCGZ8wghmbAgEBMIGVMH4xCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNp # Z25pbmcgUENBIDIwMTECEzMAAAOvMEAOTKNNBUEAAAAAA68wDQYJYIZIAWUDBAIB # BQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO # MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIHNoXiXwVHsC/PqEnZc4ihBK # mnSgNWEnMC+w56DyHcVnMEIGCisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8A # cwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEB # BQAEggEAYiSex0i/nU0M7jtaYpQj81Dax1r0eHtepqWBuIMlbKDsAmh8uu2tQ9cI # 5//vTVk6kNyZmy34+XEPDYQTzlIizKS5LNNODIZG+dIOEedUK2TdTAwV+QZ+dEks # covcnTJ+xwIDteLmqzcJv/xErRBdTDmigM+LOB0JZoHxMsiVLavZKcLf6CQEnNKH # Vf268cJKOQTeAxCzCFz9CoYZoLfK9HSIEDM8vy6Y94bfUlfDtdvN19yK2qr5115A # xEJ8f4RJ7VvQgSZeWTda5jcxFXGjeVHsBF1Bq0aSGMOUgN9AL3bWNtFdf5oPEdh9 # 2ESEyRC0onr21V0IVktw1gBvRcCmhKGCFykwghclBgorBgEEAYI3AwMBMYIXFTCC # FxEGCSqGSIb3DQEHAqCCFwIwghb+AgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFZBgsq # hkiG9w0BCRABBKCCAUgEggFEMIIBQAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFl # AwQCAQUABCBFgbbgdtY7JBRi4bYjXYQvN70GtuBj3UtBDVhNFoD9UAIGZr4UiW9j # GBMyMDI0MDgxOTE3Mjg1MC40MjNaMASAAgH0oIHYpIHVMIHSMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJl # bGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNO # OjNCRDQtNEI4MC02OUMzMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBT # ZXJ2aWNloIIReDCCBycwggUPoAMCAQICEzMAAAHlj2rA8z20C6MAAQAAAeUwDQYJ # KoZIhvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjMx # MDEyMTkwNzM1WhcNMjUwMTEwMTkwNzM1WjCB0jELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3Bl # cmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjozQkQ0LTRC # ODAtNjlDMzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZTCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKl74Drau2O6LLrJO3HyTvO9 # aXai//eNyP5MLWZrmUGNOJMPwMI08V9zBfRPNcucreIYSyJHjkMIUGmuh0rPV5/2 # +UCLGrN1P77n9fq/mdzXMN1FzqaPHdKElKneJQ8R6cP4dru2Gymmt1rrGcNe800C # cD6d/Ndoommkd196VqOtjZFA1XWu+GsFBeWHiez/PllqcM/eWntkQMs0lK0zmCfH # +Bu7i1h+FDRR8F7WzUr/7M3jhVdPpAfq2zYCA8ZVLNgEizY+vFmgx+zDuuU/GChD # K7klDcCw+/gVoEuSOl5clQsydWQjJJX7Z2yV+1KC6G1JVqpP3dpKPAP/4udNqpR5 # HIeb8Ta1JfjRUzSv3qSje5y9RYT/AjWNYQ7gsezuDWM/8cZ11kco1JvUyOQ8x/JD # kMFqSRwj1v+mc6LKKlj//dWCG/Hw9ppdlWJX6psDesQuQR7FV7eCqV/lfajoLpPN # x/9zF1dv8yXBdzmWJPeCie2XaQnrAKDqlG3zXux9tNQmz2L96TdxnIO2OGmYxBAA # ZAWoKbmtYI+Ciz4CYyO0Fm5Z3T40a5d7KJuftF6CToccc/Up/jpFfQitLfjd71cS # +cLCeoQ+q0n0IALvV+acbENouSOrjv/QtY4FIjHlI5zdJzJnGskVJ5ozhji0YRsc # v1WwJFAuyyCMQvLdmPddAgMBAAGjggFJMIIBRTAdBgNVHQ4EFgQU3/+fh7tNczEi # fEXlCQgFOXgMh6owHwYDVR0jBBgwFoAUn6cVXQBeYl2D9OXSZacbUzUZ6XIwXwYD # VR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # cmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3JsMGwG # CCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIw # MjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcD # CDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBADP6whOFjD1ad8Gk # EJ9oLBuvfjndMyGQ9R4HgBKSlPt3pa0XVLcimrJlDnKGgFBiWwI6XOgw82hdolDi # MDBLLWRMTJHWVeUY1gU4XB8OOIxBc9/Q83zb1c0RWEupgC48I+b+2x2VNgGJUsQI # yPR2PiXQhT5PyerMgag9OSodQjFwpNdGirna2rpV23EUwFeO5+3oSX4JeCNZvgyU # OzKpyMvqVaubo+Glf/psfW5tIcMjZVt0elswfq0qJNQgoYipbaTvv7xmixUJGTbi # xYifTwAivPcKNdeisZmtts7OHbAM795ZvKLSEqXiRUjDYZyeHyAysMEALbIhdXgH # Eh60KoZyzlBXz3VxEirE7nhucNwM2tViOlwI7EkeU5hudctnXCG55JuMw/wb7c71 # RKimZA/KXlWpmBvkJkB0BZES8OCGDd+zY/T9BnTp8si36Tql84VfpYe9iHmy7Pqq # xqMF2Cn4q2a0mEMnpBruDGE/gR9c8SVJ2ntkARy5SfluuJ/MB61yRvT1mUx3lypp # O22ePjBjnwoEvVxbDjT1jhdMNdevOuDeJGzRLK9HNmTDC+TdZQlj+VMgIm8ZeEIR # NF0oaviF+QZcUZLWzWbYq6yDok8EZKFiRR5otBoGLvaYFpxBZUE8mnLKuDlYobjr # xh7lnwrxV/fMy0F9fSo2JxFmtLgtMIIHcTCCBVmgAwIBAgITMwAAABXF52ueAptJ # mQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgT # Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlmaWNh # dGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1WhcNMzAwOTMwMTgzMjI1 # WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCCAiIwDQYJKoZIhvcNAQEB # BQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O1YLT/e6cBwfSqWxOdcjK # NVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZnhUYjDLWNE893MsAQGOhg # fWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t1w/YJlN8OWECesSq/XJp # rx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxqD89d9P6OU8/W7IVWTe/d # vI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmPfrVUj9z6BVWYbWg7mka9 # 7aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSWrAFKu75xqRdbZ2De+JKR # Hh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv231fgLrbqn427DZM9itu # qBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zbr17C89XYcz1DTsEzOUyO # ArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYctenIPDC+hIK12NvDMk2ZItb # oKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQcxWv2XFJRXRLbJbqvUAV6 # bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17aj54WcmnGrnu3tz5q4i6t # AgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQABMCMGCSsGAQQBgjcVAgQW # BBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQUn6cVXQBeYl2D9OXSZacb # UzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku # aHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA # QwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2 # VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu # bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEw # LTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt # MjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3hLB9nATEkW+Geckv8qW/q # XBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x5MKP+2zRoZQYIu7pZmc6 # U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74py27YP0h1AdkY3m2CDPVt # I1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1AoL8ZthISEV09J+BAljis # 9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbCHcNhcy4sa3tuPywJeBTp # kbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB9s7GdP32THJvEKt1MMU0 # sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNtyo4JvbMBV0lUZNlz138e # W0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3rsjoiV5PndLQTHa1V1QJ # sWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcVv7TOPqUxUYS8vwLBgqJ7 # Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A245oyZ1uEi6vAnQj0llOZ0 # dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lwY1NNje6CbaUFEMFxBmoQ # tB1VM1izoXBm8qGCAtQwggI9AgEBMIIBAKGB2KSB1TCB0jELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxh # bmQgT3BlcmF0aW9ucyBMaW1pdGVkMSYwJAYDVQQLEx1UaGFsZXMgVFNTIEVTTjoz # QkQ0LTRCODAtNjlDMzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2Vy # dmljZaIjCgEBMAcGBSsOAwIaAxUA942iGuYFrsE4wzWDd85EpM6RiwqggYMwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQUFAAIF # AOpt2McwIhgPMjAyNDA4MTkyMjQ0MjNaGA8yMDI0MDgyMDIyNDQyM1owdDA6Bgor # BgEEAYRZCgQBMSwwKjAKAgUA6m3YxwIBADAHAgEAAgIWQTAHAgEAAgIRyTAKAgUA # 6m8qRwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAID # B6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBBQUAA4GBAGIAHpMi39g/wROTFOeP # UUIVBKfjMKnJaOkDxa//apHilXPH11ufpPLe3Swx6TqzXZDkUCi9DMzwlXuOxKc6 # 4IcRY1Mtdw6vdDhxZaWMnGz1rRk+LIz3Ojk3n/iA9u611OXe4haQlDYzkT3+GVkv # UYXaIrZmOXXR9X+eVxMeXkW8MYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTACEzMAAAHlj2rA8z20C6MAAQAAAeUwDQYJYIZIAWUDBAIB # BQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx # IgQg5x2UKT8UkPGXYLTUtWasjcHFOGDZDuic4z95xcD4YvYwgfoGCyqGSIb3DQEJ # EAIvMYHqMIHnMIHkMIG9BCAVqdP//qjxGFhe2YboEXeb8I/pAof01CwhbxUH9U69 # 7TCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB5Y9q # wPM9tAujAAEAAAHlMCIEIIEAKkQ5Fkf6cS2t7nwVCe0Nc9p63B60XeoDY2zcWq5Y # MA0GCSqGSIb3DQEBCwUABIICAEeG0zrL7BxBsqocCKavVMzrmyxpytzOi8OZ8ofR # QV2yHOgHgV1mdryGUP84C3W5oslIYXlJercqG5f7Hg4AoakXIei5sydP+P7RQH1i # 6aVJOdMaYf1IA6NkBouZ92r61T3KLR8DQIWDU68MPkC7nON2PKoscw+Y0CNvmY2V # rs3OgCmGZWxWz/eeqWQL1IswrdlstN4gSyB5PSxHLRxWQzl4F5YSoxkLtkWxMX0O # x1XwnZweWEHFcRJ4OQsbpOy1EIftLm65mEdbxnyPxALClkuyNjCPGG3eQvkUxFEv # WpiGdtfOIJdx3mVLtzzZ9hGUMVYcbchpJIMfHE6ee1G32UnuYievqTK++7l2x0uh # C0qpOPDLc6EVvZXcKt53u7f4vkzjtcWUN2r8OFgPzR+zMtFautr8jwv58zZ8l8wp # iFAM0I/Q0o7Dm9cV6/PHQJUuHyZWY6ABtMizfvmKFUfao0Cu1LH8MPFHEYrurSqF # F5Z5odl7Nglo8QjQyNcJmC0Yyl+HdK3fB4mlDR/LpzUMd0atsAhhAkzHM9/TDl66 # Vt1i6MEF0DTDVUIjtMtoq1um/AwUC2BBvriA5H8wvnkUJ2SWdU3Y+/OLkiBw2ppL # Z7GoLVD/llxSZCX6VCItaDkWGs1qOkM9TJPWTtlouBRSGV/4vsZVivbE2XdnqRhh # XyJ4 # SIG # End signature block |