functions/helperfunctions.ps1
function Add-ProvCCTenantLogin { [CmdletBinding( SupportsPaging = $false, SupportsShouldProcess = $false, PositionalBinding = $false)] Param ( [Parameter(Mandatory = $true)] [String]$UserName, [Parameter(Mandatory = $true)] [SecureString]$Password, [Parameter(Mandatory = $true)] [String]$TenantId ) Write-Verbose 'Creating authentication Token and adding Azure RM Account to local environment' # $usercred = new-object pscredential ($username, (convertto-securestring $password -asplaintext -force)) $usercred = new-object pscredential ($username,$password) $authparam = @{ Tenantid = $tenantid Usercredential = $usercred } $global:token = Get-ProvAzureAuthContext @authparam } function Test-ProvCCTenantLogin { [CmdletBinding( SupportsPaging = $false, SupportsShouldProcess = $false, PositionalBinding = $false)] Param () Write-Verbose "Testing valid Login to Azure Subscription and Token timeout" if ($global:token -ne $null) { Write-Verbose ".a valid Token exists" if (($TS = new-timespan -start (Get-Date) -end $global:Token.ExpiresDate).Ticks -le '9000000000') { Write-Warning "..token will timeout in $($Ts.minutes) minutes, refreshing!" Write-Verbose "..constructing Get-ProvAzureAuthContext input parameters" [String]$Username = Read-Host "Full qualified username (name@domain)" [SecureString]$password = (Convertto-Securestring (Read-Host "Password") -asplaintext -force) [String]$tenantid = Read-Host "TenantId (in GUID Format)" $usercred = new-object pscredential ('admin@pandora42.onmicrosoft.com', (convertto-securestring 'h?C62JMV8!' -asplaintext -force)) $authparam = @{ Tenantid = '5de6aeba-b232-4a78-9dff-35e20bec0b14' Usercredential = $usercred } $global:token = Get-ProvAzureAuthContext @authparam } else { Write-Verbose "..token expires in $($TS.Minutes) (loads of time ... :-))" } Write-Verbose ".testing if logged in to the correct tenant" if (((Get-AzureRmContext).Tenant.id) -ne ($global:token.Tenantid)) { Write-Verbose "Adding AzureRM Account to current session" Add-AzureRmAccount -AccessToken $global:token.accesstoken -Accountid $global:token.TenantId |Out-Null } } else { write-error "You are not authenticated to an Azure Tenant. Use `"Add-PCCTenantLogin`" to authenticate before running the installer" break } } function Get-ProvCCGalleryModuleUri { Param ( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [String]$ModuleName ) Write-Verbose "Checking if module $ModuleName exists" $Url = "https://www.powershellgallery.com/api/v2/Search()?`$filter=IsLatestVersion&searchTerm=%27$ModuleName%27&targetFramework=%27%27&includePrerelease=false&`$skip=0&`$top=40" # This gives you the Moduledetails $Moduledetails = Invoke-RestMethod -Method Get -Uri $Url -UseBasicParsing # Now lets do some split/trim functions to get the version of the module $moduleversion = ((($Moduledetails.id).Split('Version=')[-1]).Trimend(')')).Trim([Char]0x0027) # Contruct the module content URL $ModuleContentUrl = "https://www.powershellgallery.com/api/v2/package/$ModuleName/$ModuleVersion" # And here comes the magic !! - find the blob storage space where the ZIP File of the module is stoired (Invoke-WebRequest -Uri $ModuleContentUrl -MaximumRedirection 0 -UseBasicParsing -ErrorAction Ignore).Headers.Location } function New-ProvCCConnectionType { [CmdletBinding( SupportsPaging = $false, SupportsShouldProcess = $false, PositionalBinding = $false)] [OutputType('Provance.Azure.PCC.ConnectionType')] Param( [Parameter(Mandatory = $true)] [Object]$AuthContext, [String]$apiversion = '2015-10-31', [Parameter(Mandatory = $true)] [GUID]$Subscriptionid, [Parameter(Mandatory = $true)] [ValidatenotNullorempty()] [String]$ResourceGroupName, [Parameter(Mandatory = $true)] [ValidatenotNullorempty()] [String]$AutomationAccountName, [Parameter(Mandatory = $true)] [ValidateSet("PCC-Azure-Subscription", "PCC-Azure-LogAnalyticsWorkspace", "PCC-Provance-ITSM", "PCC-Azure-Compute", "PCC-Azure-AutomationAccount")] [String]$ConnTypeName ) try { $url = "https://management.azure.com/subscriptions/$($subscriptionid.guid)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.Automation/automationAccounts/$($AutomationAccountName)/connectionTypes/$($ConnTypeName)?api-version=$apiversion" Write-Verbose -Message "Using url: $url" #region construct body $body = @{} switch ($ConnTypeName) { 'PCC-Azure-Subscription' { $body = @{ name = $ConnTypeName properties = @{ isGlobal = $false fieldDefinitions = @{ ApplicationId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } ApplicationKey = @{ isEncrypted = $true isOptional = $false type = 'System.String' } TenantId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } TenantName = @{ isEncrypted = $false isOptional = $false type = 'System.String' } TenantFQDN = @{ isEncrypted = $false isOptional = $false type = 'System.String' } SubscriptionId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } SubscriptionName = @{ isEncrypted = $false isOptional = $false type = 'System.String' } APIVersion = @{ isEncrypted = $false isOptional = $false type = 'System.String' } } } } } 'PCC-Azure-AutomationAccount' { $body = @{ name = $ConnTypeName properties = @{ isGlobal = $false fieldDefinitions = @{ TenantId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } TenantFQDN = @{ isEncrypted = $false isOptional = $false type = 'System.String' } SubscriptionId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } SubscriptionName = @{ isEncrypted = $false isOptional = $false type = 'System.String' } AARGName = @{ isEncrypted = $false isOptional = $false type = 'System.String' } AAName = @{ isEncrypted = $false isOptional = $false type = 'System.String' } ApplicationId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } ApplicationKey = @{ isEncrypted = $true isOptional = $false type = 'System.String' } APIVersion = @{ isEncrypted = $false isOptional = $true type = 'System.String' } } } } } 'PCC-Azure-LogAnalyticsWorkspace' { $body = @{ name = $ConnTypeName properties = @{ isGlobal = $false fieldDefinitions = @{ ApplicationId = @{ isEncrypted = $false isOptional = $false type = "System.String" } ApplicationKey = @{ isEncrypted = $true isOptional = $false type = "System.String" } TenantId = @{ isEncrypted = $false isOptional = $false type = "System.String" } OMSRGName = @{ isEncrypted = $false isOptional = $false type = "System.String" } SubscriptionId = @{ isEncrypted = $false isOptional = $false type = "System.String" } OMSWorkspace = @{ isEncrypted = $false isOptional = $false type = "System.String" } APIVersion = @{ isEncrypted = $false isOptional = $false type = 'System.String' } } } } } 'PCC-Azure-Compute' { $body = @{ name = $ConnTypeName properties = @{ isGlobal = $false fieldDefinitions = @{ ApplicationId = @{ isEncrypted = $false isOptional = $false type = "System.String" } ApplicationKey = @{ isEncrypted = $true isOptional = $false type = "System.String" } TenantId = @{ isEncrypted = $false isOptional = $false type = "System.String" } SubscriptionId = @{ isEncrypted = $false isOptional = $false type = "System.String" } APIVersionARMVM = @{ isEncrypted = $false isOptional = $false type = 'System.String' } APIVersionClassicVM = @{ isEncrypted = $false isOptional = $false type = 'System.String' } } } } } 'PCC-Provance-ITSM' { $body = @{ name = $ConnTypeName properties = @{ isGlobal = $false fieldDefinitions = @{ InstanceURL = @{ isEncrypted = $false isOptional = $false type = 'System.String' } Username = @{ isEncrypted = $false isOptional = $false type = 'System.String' } Password = @{ isEncrypted = $true isOptional = $false type = 'System.String' } TenantId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } ApplicationId = @{ isEncrypted = $false isOptional = $false type = 'System.String' } APIVersion = @{ isEncrypted = $false isOptional = $false type = 'System.String' } } } } } } $body = $body | ConvertTo-Json -Depth 6 Write-Verbose -Message "Using body: $body" #endregion #region construct header $header = @{ 'Authorization' = "$($AuthContext.tokentype) $($AuthContext.accesstoken)" "Content-Type" = "application/json" } Write-Verbose -Message "Using header: $header" #endregion #region invoke rest method $Rawdata = Invoke-RestMethod ` -Method Put ` -Uri $url ` -ContentType application/json ` -Headers $header ` -Body $body #endregion return $Rawdata } catch { Write-Verbose -Message "StatusCode: $_.Exception.Response.StatusCode.value__" Write-Verbose -Message "StatusDescription: $_.Exception.Response.StatusDescription" Write-Error -Message "Unable to create new connection type `n Error: $($_)" -ErrorAction Stop } } # SIG # Begin signature block # MIIaBQYJKoZIhvcNAQcCoIIZ9jCCGfICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUXF7kuVdjdxk3dFvlwRfLgHKk # NJSgghSZMIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UE # BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY # BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290 # IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx # MDUwMzA3MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw # EQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEt # MCsGA1UECxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMw # MQYDVQQDEypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0g # RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYusw # ZLiBCGzDBNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz # 6ojcnqOvK/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am # +GZHY23ecSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1g # O7GyQ5HYpDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQW # OlDxSq7neTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB # 0lL7AgMBAAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB # BjAdBgNVHQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqF # BxBnKLbv9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDov # L2NybC5nb2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0g # ADAzMDEGCCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9z # aXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyI # BslQj6Zz91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwl # TxFWMMS2RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKo # cyQetawiDsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1 # KrKQ0U11GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkK # rqeKM+2xLXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDABMIIFADCC # A+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNV # BAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJm # aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290 # IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx # MDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw # EQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9n # aWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxkdGVjaC5j # b20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK # AoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuFpDS1FuXL # zOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE3ZNWjKRM # XpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlVBv8KJAV+ # L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+MB5FcSM1 # /5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYXv32JgIBE # Q+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMBAf8EBTAD # AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+zWrZtj2z # ZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYBBQUHAQEE # LjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbS8w # OwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9z # ZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUFBwIBFito # dHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMA0GCSqG # SIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pNQdvBE+zc # MQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0rjpf5Mqt # JsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjOeT2pkb9U # GBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQsPTIFwwK # lhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ7nIMpBKG # gc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7MIIFPDCCBCSgAwIBAgIJALbL # wjYBUl1HMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMH # QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j # b20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBv # c2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1 # dGhvcml0eSAtIEcyMB4XDTE3MTIxMTIwMzEwMVoXDTE4MDkwNjE1NDIwMFowfTEL # MAkGA1UEBhMCQ0ExDzANBgNVBAgTBlF1ZWJlYzERMA8GA1UEBxMIR2F0aW5lYXUx # JDAiBgNVBAoTG1Byb3ZhbmNlIFRlY2hub2xvZ2llcywgSW5jLjEkMCIGA1UEAxMb # UHJvdmFuY2UgVGVjaG5vbG9naWVzLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOC # AQ8AMIIBCgKCAQEAzv3zfbU437wH1fLprlbIGBtCLjMKf2XSIWgPIpymOhJeQP07 # H/dGlg8fy4vUJpWS3jwAAAiQfycR8IyCpGTZf1XiPLsdnw4WIwbaYYe6LylA8xhv # 8d8Hassqp2LCZbBhm9ueLySqPM+DykABQOFPYbJVj/WDwd8/KaBCGZw0FXsl+AuB # HeiZ89pjz4oFX+BXrM5/rvVHZuYD6W+UesxxibNrmuMf3JFzfh2Ttr+orMRRCCSt # v0N87EAOkjZ52fIbsKptMHRaywZO1qGIWFlBSTBcCktMlKjVpbZkVCrY81eMhkzb # +nOTpvAaUFNEESekdMveZA8XJoYQ3XoFXU8vjwIDAQABo4IBhTCCAYEwDAYDVR0T # AQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwNQYD # VR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5nb2RhZGR5LmNvbS9nZGlnMnM1LTMu # Y3JsMF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwIwOTA3BggrBgEFBQcCARYraHR0 # cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzAIBgZngQwB # BAEwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nb2Rh # ZGR5LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRk # eS5jb20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAUQMK9J47MNIMw # ojPX+2yz8LQsgM4wHQYDVR0OBBYEFOwFSw0KFV9Bs1UypkhJ4XNI/N9JMA0GCSqG # SIb3DQEBCwUAA4IBAQASYv3417VLTHaQ/stRoHy/s4SSSovygnp2luUUChTuXQ9z # SJxzrXwmNbdVZV1X1LrDWHhxTztwOPwDbV6TNSwKhBMTTSZQ9gJCbfQ/gwaqhvbG # 3pFN62FcUHZ0B6xfWTqcxQ+eMLdAzbt52HMkLAGfaFKRiIllM079bxTZ6QiSNHQ5 # 76gDm0V16n3zvPFKA7wJyaWAQY2//UPrBP3B1zxElgock21I6OiLLIe7vBvLvvXw # QuJe/QM+p4sr6OTJGI4OsLI9N4dLpC0gmbz1QCPIvkOQOFsB14bLiqzABSJEkvc8 # C+lF7ABlmdTLnsx+yePeC3Ka9+rKEGyetKKpFFCgMIIFfTCCBGWgAwIBAgIJAO+V # wvSA4xuTMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH # QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxk # IFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0YXJm # aWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQgU2Vj # dXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTE3MTExNDA3MDAwMFoX # DTIyMTExNDA3MDAwMFowgYcxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h # MRMwEQYDVQQHEwpTY290dHNkYWxlMSQwIgYDVQQKExtTdGFyZmllbGQgVGVjaG5v # bG9naWVzLCBMTEMxKzApBgNVBAMTIlN0YXJmaWVsZCBUaW1lc3RhbXAgQXV0aG9y # aXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDm730Ku3SP # yEahtiafyThSMSvGVFw6JhBrYkQYOcH10SjiERRWLn3DD51isWZDIrkxmTdy/zEt # 2m0qf2odGk7KRPeO7OMlEbeGS4Cc11H7OvxG6VSADFbYTkrgGREeDgFxPA8WzeaJ # YFVwJq7kcoFSGN797hHOoYsd/GkD/iqnEjNfYRUcKdaH9b/Yzjwjte6uba5Iepls # Nx0eXWU+zy7bff21Qb1HQ0P0VTuYCbviRJknhKOZKSGuNhQ9CFDzMQbcbsbyx3+o # v/iMaIGp7NHNlk/4hR1rFFmMwPRT/m123J8xGpoYBPPMOHyk15bF/1laR3kAr3fh # bj0OQoUOUFIBAgMBAAGjggGpMIIBpTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE # AwIGwDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAdBgNVHQ4EFgQUnc8cgP4K1qL8 # WBg+p9NUQO7WFGEwHwYDVR0jBBgwFoAUJUWBaFAmOD07LSy+zWrZtj2zZmMwgYQG # CCsGAQUFBwEBBHgwdjAqBggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxk # dGVjaC5jb20vMEgGCCsGAQUFBzAChjxodHRwOi8vY3JsLnN0YXJmaWVsZHRlY2gu # Y29tL3JlcG9zaXRvcnkvc2ZfaXNzdWluZ19jYS1nMi5jcnQwVAYDVR0fBE0wSzBJ # oEegRYZDaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L21h # c3RlcnN0YXJmaWVsZDJpc3N1aW5nLmNybDBQBgNVHSAESTBHMEUGC2CGSAGG/W4B # BxcCMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20v # cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAFJGgfPKVmOa5BUYGkgzgZUH # APDVCxA0oDWH0E5+lQB0DlDHgv5G6O4Ju2dqL9TAJfhRAS0i+PaXwLOWbz/yxZc9 # jpCNDbVWIRIZdxzXvR7dOSvRPgWFxW1Msip51ys9TQV2ybVAyA+CjVwuNOALYWrT # 2ZhQBEp47lbsLRag4VwYpydVkbfKa4Egad+0V0SHQrWxwnMaj/7PT+b8WilhTxTR # XNWlxRlQ+9wla5Sqwn5PwafeJwv6eGS6nKC00cRPDQ6WDCo46VhOjkmv50J+o93p # 9LM2hkFuoRMrR5O3D8Zcg1jbab4rTDT+f+Wn5eYn9PwbYB7e4WMjRafylm5E3Hox # ggTWMIIE0gIBATCBwjCBtDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmEx # EzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu # MS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8x # MzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg # LSBHMgIJALbLwjYBUl1HMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKAC # gAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx # DjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBS+1WyB2BQ3FJgoS30nqkSF # k/NJHDANBgkqhkiG9w0BAQEFAASCAQBh4EMck0DQJpp+yBDNe/LrKcfwr36Y/PA0 # PN8oo1p0lbKktNJgW1UKjZPAD7xTb9Ea9jjl1GjrgNIDIb3ulRPqBvzqxqffDbJ6 # QJwl1Jk+XaeGl5W0dTw/bCJGsmdKC26GaVw8Z8gwcFlC/fRaapgvrLY2y9WTBDfn # xQUDv1IRdxmZ5a38gf+XIkez0y+ECIoaJ3Z8AZ6mAnGShuyykN0IvGApkj8npkpz # m16qIdavMmMDfAjv5xBcLtVNMxzIiTym3sx1onnbYKWz3yTILfHR5dI2wuhYSThK # fRKwYb/IZ/ZIt3bplsVtWp/hF4apRgH+z5nKAuZSqmWGvJvvwLmEoYICbjCCAmoG # CSqGSIb3DQEJBjGCAlswggJXAgEBMIHUMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UE # CBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZp # ZWxkIFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0 # YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQg # U2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyAgkA75XC9IDjG5MwCQYF # Kw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF # MQ8XDTE4MDUyMDEzNTg1NFowIwYJKoZIhvcNAQkEMRYEFAs/lfcFDjzouweGmHVJ # QlgGw0qyMA0GCSqGSIb3DQEBAQUABIIBAAfzQl5NkSWKLLtAEdAKVShiVQP74Un/ # jnyGFtTbNhYYKsKdEuE3um+1/9NL8aVFa1Pb7ec/KAU+OZpEF5Rt4sQTfoI7M23h # xsa7ULFcdeiVhakPljahRScNlQSK9eapansp7o2xVFV0I01PIQv1Spa05koDr7/Z # 1qc058aNPqQuIi634qxuo1pHzEa0Vd4LfLiYy4OQ0aKsHtPVWHl0fqIcOJkZ23dw # fEW/0y4be8I4pSyKENkjwSGa171MUgCaP6ZZRvGzjvb/9jmzqiQK2ACZEJS/RJvp # t0v2D9INqEg9/OWCrVZEDkFw51lmcnRsN4BAuAdIUzdAvilqwFtcKFI= # SIG # End signature block |