GenerateO365RefreshToken.ps1
<#PSScriptInfo .VERSION 1.3 .GUID 055455ac-419d-4e89-b4c9-d1ccba28393f .AUTHOR skrishnakumar .COMPANYNAME .COPYRIGHT .TAGS .LICENSEURI .PROJECTURI .ICONURI .EXTERNALMODULEDEPENDENCIES .REQUIREDSCRIPTS .EXTERNALSCRIPTDEPENDENCIES .RELEASENOTES .PRIVATEDATA #> <# .DESCRIPTION Exterro eDiscovery platform connect with O365 with the help of refresh token to support modern authentication. #> #-- This script is used for Exterro's eDiscovery Platform. #-- @author: Samraj K #-- Code snippets are referred from PS gallery projects. $ErrorActionPreference = "Stop" $WelknownClientId = "1b730954-1685-4b74-9bfd-dac224a7b894" $PSEndPointUrl = "https://ps.compliance.protection.outlook.com" $O365LoginUrl = "https://login.microsoftonline.com" [bool] $Global:autoClosed=$false; Function Show-LoginWindow { param( [System.Uri]$Url ) Add-Type -AssemblyName System.Web Add-Type -AssemblyName System.Windows.Forms $form = New-Object -TypeName System.Windows.Forms.Form -Property @{Width=500;Height=650} $web = New-Object -TypeName System.Windows.Forms.WebBrowser -Property @{Width=400;Height=600;Url=($url ) } $DocComp = { $Global:uri = $web.Url.AbsoluteUri if ($Global:Uri -match "error=[^&]*|code=[^&]*") {$Global:autoClosed=$true; $form.Close() } } $web.ScriptErrorsSuppressed = $true $web.Add_DocumentCompleted($DocComp) $form.Text="Exterro Token Generation" $Icon = [system.drawing.icon]::ExtractAssociatedIcon($PSHOME + "\powershell.exe") $form.Icon=$Icon # $form.CompanyName="Exterro Inc" $form.Controls.Add($web) $form.Add_Shown({$form.Activate()}) $form.ShowDialog() | Out-Null $queryOutput = [System.Web.HttpUtility]::ParseQueryString($web.Url.Query) if($Global:autoClosed){ $output = @{} foreach($key in $queryOutput.Keys){ $output["$key"] = $queryOutput[$key] } return $output }else{ $FileLocation="tempFile.html" if (Test-Path $FileLocation) { Remove-Item $FileLocation } $web.DocumentText | Out-File -FilePath $FileLocation -NoClobber $output= GetStringBetweenTwoStrings -firstString "code=" -secondString "\\u0026session_state=" -importPath $FileLocation Remove-Item -path $FileLocation return $output } } function GetStringBetweenTwoStrings($firstString, $secondString, $importPath){ #Get content from file $file = Get-Content $importPath #Regex pattern to compare two strings $pattern = "$firstString(.*?)$secondString" #Perform the opperation $result = [regex]::Match($file,$pattern).Groups[1].Value #Return result return $result } function Display { param( [String]$codes ) [void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') $title = 'Refresh Token' $msg = 'Please copy the refresh token from the window.' $text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title, $codes) } function Get-ExterroPSO365RefreshToken { Unblock-File -Path $MyInvocation.ScriptName; #--- Get the options section Show-Menu �Title 'My Menu' $selection = Read-Host "Please make a selection ( Default : Microsoft global environment)" switch ($selection) { '1' { $PSEndPointUrl = "https://ps.compliance.protection.outlook.com" $O365LoginUrl = "https://login.microsoftonline.com" 'You chose option #1 - Microsoft global environment' } '2' { $PSEndPointUrl = "https://ps.compliance.protection.office365.us" $O365LoginUrl = "https://login.microsoftonline.us" 'You chose option #2 - Microsoft Cloud for US Government (GCC High)' } '3' { $PSEndPointUrl = "https://l5.ps.compliance.protection.office365.us" $O365LoginUrl = "https://login.microsoftonline.us" 'You chose option #3 - Microsoft Cloud for US Government (DoD)' } '4' { $PSEndPointUrl = "https://ps.compliance.protection.outlook.de" $O365LoginUrl = "https://login.microsoftonline.de" 'You chose option #4 - Microsoft Cloud Germany' } '5' { $PSEndPointUrl = "https://ps.protection.outlook.cn" $O365LoginUrl = "https://login.partner.microsoftonline.cn" 'You chose option #5 - Azure and Microsoft 365 operated by 21Vianet in China' } 'q' { return } default { $PSEndPointUrl = "https://ps.compliance.protection.outlook.com" $O365LoginUrl = "https://login.microsoftonline.com" 'Default value - Microsoft global environment' } } #--- End of option section $refreshToken = "" $responseCode="" $codeData = Show-LoginWindow -Url "$O365LoginUrl/common/oauth2/authorize?resource=$PSEndPointUrl&client_id=$WelknownClientId&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob&prompt=login" + ";" if($Global:autoClosed){ If ($codeData["error"]) { "An error occurred accessing $PSEndPointUrl : " + $codeData["error"] return } ElseIf ($codeData["code"]) { $responseCode = $codeData["code"] ; } Else { "No code obtained from the endpoint url." ; return } }else{ $responseCode = $codeData; } #Fetch the access token if ($responseCode) { $postParams = @{grant_type='authorization_code';code=$responseCode;client_id=$WelknownClientId;redirect_uri='urn:ietf:wg:oauth:2.0:oob'} $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" $headers.Add("Content-Type", 'application/x-www-form-urlencoded') $response=Invoke-RestMethod -Uri "$O365LoginUrl/common/oauth2/token" -Method POST -Body $postParams -Headers $headers #Set-Clipboard -Value $response.refresh_token #$response | Out-File -FilePath "AccessToken.txt" Display $response.refresh_token; }else{ Write-Host "Powershell window might be closed abruptly." } } function Show-Menu { param ( [string]$Title = 'M365 Environment Details' ) Clear-Host Write-Host "================ Title ================" Write-Host "1: Press '1' for Microsoft global environment." Write-Host "2: Press '2' for Microsoft Cloud for US Government(GCC High)." Write-Host "2: Press '3' for Microsoft Cloud for US Government(DoD)." Write-Host "3: Press '4' for Microsoft Cloud Germany." Write-Host "4: Press '5' for Azure and Microsoft 365 operated by 21Vianet in China." Write-Host "Q: Press 'Q' to quit." } Get-ExterroPSO365RefreshToken # SIG # Begin signature block # MIIqywYJKoZIhvcNAQcCoIIqvDCCKrgCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBxnunWXuN/T2uu # H/8F35VrwDRhqxkDrP+QWDp21jhJ26CCE6cwggWQMIIDeKADAgECAhAFmxtXno4h # MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK # EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV # BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z # ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 # IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB # AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z # G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ # anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s # Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL # 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb # BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3 # JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c # AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx # YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0 # viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL # T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud # EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf # Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk # aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS # PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK # 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB # cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp # 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg # dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri # RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7 # 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5 # nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3 # i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H # EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G # CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ # bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0 # IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz # ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C # 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce # 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da # E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T # SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA # FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh # D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM # 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z # 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05 # huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY # mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP # /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T # AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD # VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG # A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY # aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj # ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV # HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU # cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN # BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry # sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL # IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf # Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh # OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh # dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV # 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j # wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH # Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC # XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l # /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW # eE4wggdbMIIFQ6ADAgECAhAD6v665xpLOs7OXPxdA2xKMA0GCSqGSIb3DQEBCwUA # MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE # AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz # ODQgMjAyMSBDQTEwHhcNMjEwODE3MDAwMDAwWhcNMjQwNjEzMjM1OTU5WjBgMQsw # CQYDVQQGEwJVUzEPMA0GA1UECBMGT3JlZ29uMRIwEAYDVQQHEwlCZWF2ZXJ0b24x # FTATBgNVBAoTDEV4dGVycm8sIEluYzEVMBMGA1UEAxMMRXh0ZXJybywgSW5jMIIC # IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA6LFZi4RUAV1An+PPIxdUiSTq # bClWDQIIanxbz7VE/J5bFaVR/pS4ds6JtWCMShRz3nMe/Y32tdXzygZpVeIx5qD4 # v0FbUiHveVQkvUaDREcNh83bOaEn/iyKuY1hsUkvE9mePXUpVS3EqbJH5diRhg5s # zk/yeMIbqO8EwXGfH+xkPd2lym2jtVRqPuAGUNErcnzjYlQG1yu99is8YXZ7TOR2 # O6hXiYNafGmL6YaB6ywFPWSts8mz156+rxFmz7PF3k2tsTvo7NIcc1heabxVJuuo # OdZ5ZazjgIVw+BSDo4PLa+gBb5FAEJlaB+PlVfaSyQ/wapZ7mnBtvYWgeOTFV1sp # 2IRJqbBHWa3LLGCgg+J8IUxdnYWrw7vqcBE2HiNA8bUXnzjjANXeHfs7AqI6tQR/ # Fpv8ZQZF9YeaA82ycuIiVMxwpH0h0Nu7mLQ7supMmYhC8TsscjgJMnuHvv4ECfkv # ugdQjFds4cgI2EHpUxNGzdhaTY9K2IGyWFIamqzVQa26MpVS6wIUTJp0n5n1AdO/ # aPbvKBEIKGHwO8qOAigNIEipbMhb4RhtWxgLIjRjHsd9YTE3nRgVvFz2QOB9MhX6 # Cemck+Gtc4Wv2hPpRD8kVgHuFgGsvqrYZTybMwaAen7hfqn4Zoz/IrjFoowfZQXJ # J548OBGp8dYqa8W985cCAwEAAaOCAgYwggICMB8GA1UdIwQYMBaAFGg34Ou2O/hf # EYb7/mF7CIhl9E5CMB0GA1UdDgQWBBTMmvFGbCPHA3PcBvPWH+SRyBLvfDAOBgNV # HQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBT # oFGgT4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0 # Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6 # Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5n # UlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkw # JwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYIKwYB # BQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNv # bTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lD # ZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcnQw # DAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAjLcPltOkacap+5d7J8pZ # 7gBt5XPhEb28yjyd93xjPrcfa/Hgm4oSFeHAl484gw5xl/eD8QtT+nUEbEG6ImlV # jxWZ1Kz5g8EpCUKwR8ZpB5RPPwRecFVAkaARoOEcXLN6E3omg+AK+NkKtV2/Uj1R # /aXE/+9dli80yTzsF+csNw6PCR1miaP31vuG0av4dMN59XIT9pm+0K13v4cUeVli # iKmSP9BaEBEnIxnw8amjyqznwKiLBJxNDvx1PJ53Tpun3RBfzEd96x2ZrEuB91u1 # 6VLhapv1a6fDBfWXhjkfCVreX+HO4QLfVE50MiyNYsWRXqmTnIr/AjzGzFViO8vx # 3frJlZG5u2wd9RNsPw+h/4HmJzd6tFuzY8kYsXjVOdPJGFWOip3Qu2Eh1xvmpZ/D # S1RTF8a5lGSX9aL4v0sdRLUcuWSBWjNUWHf7cARwEJed/6OcmfaFvZBRKa9QO+Q1 # u6G4DJqhyTvrYqrUDjyHS1ZYtNJCk/CN7mI7Rb+Cv6OoMWzl5fXb/TtqWpgkEYGv # kyAnMO1jmWDTO4I9zYZVsTTmvREytTyTYsppGttdWNlvrI6koPldDJryzxbrYcKo # oeprN1le9n3fV67DxNEYMW9+cJM28aNiveyWIpAZgwInP/p+5weNG0+zCP9SiAvO # 6XrbT3zlwQmqSygFG59XAOAxghZ6MIIWdgIBATB9MGkxCzAJBgNVBAYTAlVTMRcw # FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3Rl # ZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAPq/rrn # Gks6zs5c/F0DbEowDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZ # BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB # BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgsJ/nCURg0zMGykHbg76VWomjdc9UfJU/ # 4lrHUGWuCCUwDQYJKoZIhvcNAQEBBQAEggIAE1ieIUvHQUYx6z3jdJ1DzOK8r549 # nIJR6FsQrHyF7LMQzY8mNcYwJYwSxezlp//PyNBYe/9zcbpwjI6Lli7IRHppU9aJ # R7QoeK9jNHuHpgvBMkKVXiUAQTpXQOlnmhKJBgbfK8J0lN5t3YDWvHn6+ynh/8Ye # avCoqNTNwgCH3ps7qV8FML6TPvUhUWBslOXgtn4oAj8p4EOimyE0leAUtSr6ApL6 # jz+hjuUYQpL2P3suWj37XXn1ZLPyixImTYWTnCuUk3hr02P8SqTtfA869N0DEYuk # fDV1lxjj09jcL6hLWWnu6kdii2O52JanWWV46mVDZ4gYDwgMSelbHTvUuUl9J6No # drRd9/qnUXc0hKcVu3kHoEjDCDSgLwA8vXLA2lei0bkiNgJIw1YQTFQUwwIkgDJM # 0GZXUJ7GAQSIoc22qmFLRZpFP6YV06asd9xvRk+RRJS1daR1erjUOcTByOmP1jYe # dl+ng4pboyMHOPdFN65FPCWaI20HLSiX/HmhE4CVskADIbU1FX/JR/g+T+YqK7DR # NElxQ/8kR62xoZLbBYmzOXSlBFT4JHlTwq8qLQjwHmxcH7q7pmJMXc8Krwi6W7G3 # tNoqB7NSsKtrrd++twLTEYVwccDCcf7ElKl5Y0NcDdatt4x7/tCTcaxB5h6A+4oX # YQ0SGJIR37bTGnShghNQMIITTAYKKwYBBAGCNwMDATGCEzwwghM4BgkqhkiG9w0B # BwKgghMpMIITJQIBAzEPMA0GCWCGSAFlAwQCAgUAMIHvBgsqhkiG9w0BCRABBKCB # 3wSB3DCB2QIBAQYKKwYBBAGyMQIBATAxMA0GCWCGSAFlAwQCAQUABCDu3m9qzKQf # 4PiHLur7KfNIYLUFWbISUJvcJ/UqdDjKlwIULpnakmw2O1fm9Z0lcllLUZvFRgcY # DzIwMjMwMjIyMTUzODAzWqBupGwwajELMAkGA1UEBhMCR0IxEzARBgNVBAgTCk1h # bmNoZXN0ZXIxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAwwjU2Vj # dGlnbyBSU0EgVGltZSBTdGFtcGluZyBTaWduZXIgIzOggg3qMIIG9jCCBN6gAwIB # AgIRAJA5f5rSSjoT8r2RXwg4qUMwDQYJKoZIhvcNAQEMBQAwfTELMAkGA1UEBhMC # R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y # ZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJT # QSBUaW1lIFN0YW1waW5nIENBMB4XDTIyMDUxMTAwMDAwMFoXDTMzMDgxMDIzNTk1 # OVowajELMAkGA1UEBhMCR0IxEzARBgNVBAgTCk1hbmNoZXN0ZXIxGDAWBgNVBAoT # D1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAwwjU2VjdGlnbyBSU0EgVGltZSBTdGFt # cGluZyBTaWduZXIgIzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCQ # snE/eeHUuYoXzMOXwpCUcu1aOm8BQ39zWiifJHygNUAG+pSvCqGDthPkSxUGXmqK # IDRxe7slrT9bCqQfL2x9LmFR0IxZNz6mXfEeXYC22B9g480Saogfxv4Yy5NDVnrH # zgPWAGQoViKxSxnS8JbJRB85XZywlu1aSY1+cuRDa3/JoD9sSq3VAE+9CriDxb2Y # LAd2AXBF3sPwQmnq/ybMA0QfFijhanS2nEX6tjrOlNEfvYxlqv38wzzoDZw4ZtX8 # fR6bWYyRWkJXVVAWDUt0cu6gKjH8JgI0+WQbWf3jOtTouEEpdAE/DeATdysRPPs9 # zdDn4ZdbVfcqA23VzWLazpwe/OpwfeZ9S2jOWilh06BcJbOlJ2ijWP31LWvKX2TH # aygM2qx4Qd6S7w/F7KvfLW8aVFFsM7ONWWDn3+gXIqN5QWLP/Hvzktqu4DxPD1rM # bt8fvCKvtzgQmjSnC//+HV6k8+4WOCs/rHaUQZ1kHfqA/QDh/vg61MNeu2lNcpnl # 8TItUfphrU3qJo5t/KlImD7yRg1psbdu9AXbQQXGGMBQ5Pit/qxjYUeRvEa1RlNs # xfThhieThDlsdeAdDHpZiy7L9GQsQkf0VFiFN+XHaafSJYuWv8at4L2xN/cf30J7 # qusc6es9Wt340pDVSZo6HYMaV38cAcLOHH3M+5YVxQIDAQABo4IBgjCCAX4wHwYD # VR0jBBgwFoAUGqH4YRkgD8NBd0UojtE1XwYSBFUwHQYDVR0OBBYEFCUuaDxrmisk # FKkfot8mOs8UpvHgMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1Ud # JQEB/wQMMAoGCCsGAQUFBwMIMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMIMCUw # IwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEAjBE # BgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29S # U0FUaW1lU3RhbXBpbmdDQS5jcmwwdAYIKwYBBQUHAQEEaDBmMD8GCCsGAQUFBzAC # hjNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FUaW1lU3RhbXBpbmdD # QS5jcnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqG # SIb3DQEBDAUAA4ICAQBz2u1ocsvCuUChMbu0A6MtFHsk57RbFX2o6f2t0ZINfD02 # oGnZ85ow2qxp1nRXJD9+DzzZ9cN5JWwm6I1ok87xd4k5f6gEBdo0wxTqnwhUq//E # fpZsK9OU67Rs4EVNLLL3OztatcH714l1bZhycvb3Byjz07LQ6xm+FSx4781FoADk # +AR2u1fFkL53VJB0ngtPTcSqE4+XrwE1K8ubEXjp8vmJBDxO44ISYuu0RAx1QcIP # NLiIncgi8RNq2xgvbnitxAW06IQIkwf5fYP+aJg05Hflsc6MlGzbA20oBUd+my7w # ZPvbpAMxEHwa+zwZgNELcLlVX0e+OWTOt9ojVDLjRrIy2NIphskVXYCVrwL7tNEu # nTh8NeAPHO0bR0icImpVgtnyughlA+XxKfNIigkBTKZ58qK2GpmU65co4b59G6F8 # 7VaApvQiM5DkhFP8KvrAp5eo6rWNes7k4EuhM6sLdqDVaRa3jma/X/ofxKh/p6FI # FJENgvy9TZntyeZsNv53Q5m4aS18YS/to7BJ/lu+aSSR/5P8V2mSS9kFP22GctOi # 0MBk0jpCwRoD+9DtmiG4P6+mslFU1UzFyh8SjVfGOe1c/+yfJnatZGZn6Kow4NKt # t32xakEnbgOKo3TgigmCbr/j9re8ngspGGiBoZw/bhZZSxQJCZrmrr9gFd2G9TCC # BuwwggTUoAMCAQICEDAPb6zdZph0fKlGNqd4LbkwDQYJKoZIhvcNAQEMBQAwgYgx # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJz # ZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQD # EyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE5MDUw # MjAwMDAwMFoXDTM4MDExODIzNTk1OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT # EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMP # U2VjdGlnbyBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJTQSBUaW1lIFN0YW1w # aW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyBsBr9ksfoiZ # fQGYPyCQvZyAIVSTuc+gPlPvs1rAdtYaBKXOR4O168TMSTTL80VlufmnZBYmCfvV # MlJ5LsljwhObtoY/AQWSZm8hq9VxEHmH9EYqzcRaydvXXUlNclYP3MnjU5g6Kh78 # zlhJ07/zObu5pCNCrNAVw3+eolzXOPEWsnDTo8Tfs8VyrC4Kd/wNlFK3/B+VcyQ9 # ASi8Dw1Ps5EBjm6dJ3VV0Rc7NCF7lwGUr3+Az9ERCleEyX9W4L1GnIK+lJ2/tCCw # YH64TfUNP9vQ6oWMilZx0S2UTMiMPNMUopy9Jv/TUyDHYGmbWApU9AXn/TGs+ciF # F8e4KRmkKS9G493bkV+fPzY+DjBnK0a3Na+WvtpMYMyou58NFNQYxDCYdIIhz2JW # tSFzEh79qsoIWId3pBXrGVX/0DlULSbuRRo6b83XhPDX8CjFT2SDAtT74t7xvAIo # 9G3aJ4oG0paH3uhrDvBbfel2aZMgHEqXLHcZK5OVmJyXnuuOwXhWxkQl3wYSmgYt # nwNe/YOiU2fKsfqNoWTJiJJZy6hGwMnypv99V9sSdvqKQSTUG/xypRSi1K1DHKRJ # i0E5FAMeKfobpSKupcNNgtCN2mu32/cYQFdz8HGj+0p9RTbB942C+rnJDVOAffq2 # OVgy728YUInXT50zvRq1naHelUF6p4MCAwEAAaOCAVowggFWMB8GA1UdIwQYMBaA # FFN5v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBQaofhhGSAPw0F3RSiO0TVf # BhIEVTAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUE # DDAKBggrBgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOg # QYY/aHR0cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmlj # YXRpb25BdXRob3JpdHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYz # aHR0cDovL2NydC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0Eu # Y3J0MCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqG # SIb3DQEBDAUAA4ICAQBtVIGlM10W4bVTgZF13wN6MgstJYQRsrDbKn0qBfW8Oyf0 # WqC5SVmQKWxhy7VQ2+J9+Z8A70DDrdPi5Fb5WEHP8ULlEH3/sHQfj8ZcCfkzXuqg # HCZYXPO0EQ/V1cPivNVYeL9IduFEZ22PsEMQD43k+ThivxMBxYWjTMXMslMwlaTW # 9JZWCLjNXH8Blr5yUmo7Qjd8Fng5k5OUm7Hcsm1BbWfNyW+QPX9FcsEbI9bCVYRm # 5LPFZgb289ZLXq2jK0KKIZL+qG9aJXBigXNjXqC72NzXStM9r4MGOBIdJIct5PwC # 1j53BLwENrXnd8ucLo0jGLmjwkcd8F3WoXNXBWiap8k3ZR2+6rzYQoNDBaWLpgn/ # 0aGUpk6qPQn1BWy30mRa2Coiwkud8TleTN5IPZs0lpoJX47997FSkc4/ifYcobWp # dR9xv1tDXWU9UIFuq/DQ0/yysx+2mZYm9Dx5i1xkzM3uJ5rloMAMcofBbk1a0x7q # 8ETmMm8c6xdOlMN4ZSA7D0GqH+mhQZ3+sbigZSo04N6o+TzmwTC7wKBjLPxcFgCo # 0MR/6hGdHgbGpm0yXbQ4CStJB6r97DDa8acvz7f9+tCjhNknnvsBZne5VhDhIG7G # rrH5trrINV0zdo7xfCAMKneutaIChrop7rRaALGMq+P5CslUXdS5anSevUiumDGC # BC0wggQpAgEBMIGSMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1h # bmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGlt # aXRlZDElMCMGA1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQQIRAJA5 # f5rSSjoT8r2RXwg4qUMwDQYJYIZIAWUDBAICBQCgggFrMBoGCSqGSIb3DQEJAzEN # BgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjMwMjIyMTUzODAzWjA/Bgkq # hkiG9w0BCQQxMgQwUU1tCFAeaWNlcwPjhKUX2isWzS7Tv++6ZVxdTCLKx3UBJkeI # U1QWg2edKWj7IzGbMIHtBgsqhkiG9w0BCRACDDGB3TCB2jCB1zAWBBSrNAE6rECX # MZ8IGvCzGOGD+A94gTCBvAQUAtZbleKDcMFXAJX6iPkj3ZN/rY8wgaMwgY6kgYsw # gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtK # ZXJzZXkgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYD # VQQDEyVVU0VSVHJ1c3QgUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5AhAwD2+s # 3WaYdHypRjaneC25MA0GCSqGSIb3DQEBAQUABIICAFthaAqb/jJ2XW90CBX3IbDS # ydre0nBArynsow8gb7/ehk/MAtR7/sCyt3nW3wPMAUIEHPrQ4afnWWIxtBM0wHq9 # DvgoUz+8WCO5OvIkiCgam2n+y9eR6UJOI4b3fAK0RaWwbG+bVU4WcBgyKc3QCQXe # cauUPWC0kC3L/jffo8fd1r3ibZBzgbQ6ssic4b3nwLcQ5p8qfg3AUKZwdVf2uvzS # 6WJ+su4V3lPvqPrBehAaR8JU422+LAuhQsYoIu4mu82AKwZNqI0C2M8Vys+ZDrSO # cNBvbkwYFpDwQCeTX29yquRiZXiCZHEKFJ0ILKuwjXEseFbSiYA6tLbPc5vBSfo1 # tWJcvgS6ssz2PuhkLQuA8pXmrGndSLZ3PVw9WMVRdDdLyeUUp7ByR05rI6L44VL4 # Npse0JHGusU0PDS91gzxB1+QFN06Ic0ytr9u0U6YVrXH5udcWSeJR9C0CCcb82lf # LhcQ31D6XU/VAThuEjR9c+Cm/Ssg7AYdSZBIaqmT/KMFQXQ7+RXvp4ETm0N1VEzf # Yp826RwescBNtJu09F6mc/5/NnVmj+2G8a+QgjKgr88kI1BJo1gZyMbOc3GaTPqF # o7R5aPcSDyqpqf6jOvvElByvGevWMpquiMgF0MqYMXoezEXQf3n3TbJ7uwfywVJb # mVbw440QwWGG3m7DAfh+ # SIG # End signature block |