GenerateO365RefreshToken.ps1


<#PSScriptInfo
 
.VERSION 1.2
 
.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
# MIIqzAYJKoZIhvcNAQcCoIIqvTCCKrkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCXZep6NpFtxI8V
# jvTrWSfGbj8WYUDSjPHt25nSAoi9MKCCE6cwggWQMIIDeKADAgECAhAFmxtXno4h
# 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
# 6XrbT3zlwQmqSygFG59XAOAxghZ7MIIWdwIBATB9MGkxCzAJBgNVBAYTAlVTMRcw
# FQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3Rl
# ZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEAPq/rrn
# Gks6zs5c/F0DbEowDQYJYIZIAWUDBAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZ
# BgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYB
# BAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgbVobQO3OFQLi5vkMrjnGRIjAoW/3vXaB
# 5QO8ZgOwNbcwDQYJKoZIhvcNAQEBBQAEggIAZOjjbLmMaPq+DYyENer+WulRIPlC
# Ev4irueXRTJGVgnU/ohLXCF70dcs3oSA2H27OHamg8P6I+Hr7+NyjgoCnlOW5AWA
# M2fIh53454vV+KzficJzEJvYWToE1dTXsYNM91yl8FXRGwMaN4dbgU94dO6ZqjDh
# 4r+gll1u0336Kth64EOFaNl0RLcdjYpkNc4CY8TusoiCVeQyK3XNgWtPegQ6rKpt
# M4MdWDaVMvVr6/F+iZqE2D0vmHU05rLyja5wI05qDrVSBQ9bexJ/bTg9SMyAWKvG
# nUyaX78Jw/aujRsQ01LVdCURI7bXjpQPHxQ0XE4/gJvLv6aWpcYOIqJqkRICKCHv
# UHhOTQEEzBfy+oClBs/vsZzbL5IjXSAcC5MO16/qwnRsT39Ga+vTjtbXiifVMOeY
# 7+Z0+tF64TebtTttC6r0qneVoNKhvSOkYbhDLUifnG5BmQ1+spQydP4NPyYdDZPX
# jXSsDNHwQrQjd0moUhKsrpfQhvIBRPj9h2xw2XZSsGnVkqtFuRuunePn1GMVsxVR
# 32nhnYZYqJUbrd3q9fYkzQJXJRyY/QyTWZC9PFX5ZcV1nkt1iP+Rq8KWt4kC3faR
# ZFTSuMybOMs0YU+dn38aCruJ3xZssDtKHfT0l8VaDS0sc8C/4VVlygqpgZzQRRB1
# SPbcLFI4P2HBMXChghNRMIITTQYKKwYBBAGCNwMDATGCEz0wghM5BgkqhkiG9w0B
# BwKgghMqMIITJgIBAzEPMA0GCWCGSAFlAwQCAgUAMIHwBgsqhkiG9w0BCRABBKCB
# 4ASB3TCB2gIBAQYKKwYBBAGyMQIBATAxMA0GCWCGSAFlAwQCAQUABCANO76WOglh
# WgXKo/t34HHwGU/fESUcKCLMrqERhP4qmgIVALD00GijNwTxPF44c2+26nzLL/Jf
# GA8yMDIzMDIyMjA1MTEzMlqgbqRsMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpN
# YW5jaGVzdGVyMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1Nl
# Y3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgU2lnbmVyICMzoIIN6jCCBvYwggTeoAMC
# AQICEQCQOX+a0ko6E/K9kV8IOKlDMA0GCSqGSIb3DQEBDAUAMH0xCzAJBgNVBAYT
# AkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZv
# cmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBS
# U0EgVGltZSBTdGFtcGluZyBDQTAeFw0yMjA1MTEwMDAwMDBaFw0zMzA4MTAyMzU5
# NTlaMGoxCzAJBgNVBAYTAkdCMRMwEQYDVQQIEwpNYW5jaGVzdGVyMRgwFgYDVQQK
# Ew9TZWN0aWdvIExpbWl0ZWQxLDAqBgNVBAMMI1NlY3RpZ28gUlNBIFRpbWUgU3Rh
# bXBpbmcgU2lnbmVyICMzMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# kLJxP3nh1LmKF8zDl8KQlHLtWjpvAUN/c1oonyR8oDVABvqUrwqhg7YT5EsVBl5q
# iiA0cXu7Ja0/WwqkHy9sfS5hUdCMWTc+pl3xHl2AttgfYOPNEmqIH8b+GMuTQ1Z6
# x84D1gBkKFYisUsZ0vCWyUQfOV2csJbtWkmNfnLkQ2t/yaA/bEqt1QBPvQq4g8W9
# mCwHdgFwRd7D8EJp6v8mzANEHxYo4Wp0tpxF+rY6zpTRH72MZar9/MM86A2cOGbV
# /H0em1mMkVpCV1VQFg1LdHLuoCox/CYCNPlkG1n94zrU6LhBKXQBPw3gE3crETz7
# Pc3Q5+GXW1X3KgNt1c1i2s6cHvzqcH3mfUtozlopYdOgXCWzpSdoo1j99S1ryl9k
# x2soDNqseEHeku8Pxeyr3y1vGlRRbDOzjVlg59/oFyKjeUFiz/x785LaruA8Tw9a
# zG7fH7wir7c4EJo0pwv//h1epPPuFjgrP6x2lEGdZB36gP0A4f74OtTDXrtpTXKZ
# 5fEyLVH6Ya1N6iaObfypSJg+8kYNabG3bvQF20EFxhjAUOT4rf6sY2FHkbxGtUZT
# bMX04YYnk4Q5bHXgHQx6WYsuy/RkLEJH9FRYhTflx2mn0iWLlr/GreC9sTf3H99C
# e6rrHOnrPVrd+NKQ1UmaOh2DGld/HAHCzhx9zPuWFcUCAwEAAaOCAYIwggF+MB8G
# A1UdIwQYMBaAFBqh+GEZIA/DQXdFKI7RNV8GEgRVMB0GA1UdDgQWBBQlLmg8a5or
# JBSpH6LfJjrPFKbx4DAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIwADAWBgNV
# HSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDCDAl
# MCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAIw
# RAYDVR0fBD0wOzA5oDegNYYzaHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdv
# UlNBVGltZVN0YW1waW5nQ0EuY3JsMHQGCCsGAQUFBwEBBGgwZjA/BggrBgEFBQcw
# AoYzaHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUlNBVGltZVN0YW1waW5n
# Q0EuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTANBgkq
# hkiG9w0BAQwFAAOCAgEAc9rtaHLLwrlAoTG7tAOjLRR7JOe0WxV9qOn9rdGSDXw9
# NqBp2fOaMNqsadZ0VyQ/fg882fXDeSVsJuiNaJPO8XeJOX+oBAXaNMMU6p8IVKv/
# xH6WbCvTlOu0bOBFTSyy9zs7WrXB+9eJdW2YcnL29wco89Oy0OsZvhUseO/NRaAA
# 5PgEdrtXxZC+d1SQdJ4LT03EqhOPl68BNSvLmxF46fL5iQQ8TuOCEmLrtEQMdUHC
# DzS4iJ3IIvETatsYL254rcQFtOiECJMH+X2D/miYNOR35bHOjJRs2wNtKAVHfpsu
# 8GT726QDMRB8Gvs8GYDRC3C5VV9HvjlkzrfaI1Qy40ayMtjSKYbJFV2Ala8C+7TR
# Lp04fDXgDxztG0dInCJqVYLZ8roIZQPl8SnzSIoJAUymefKithqZlOuXKOG+fRuh
# fO1WgKb0IjOQ5IRT/Cr6wKeXqOq1jXrO5OBLoTOrC3ag1WkWt45mv1/6H8Sof6eh
# SBSRDYL8vU2Z7cnmbDb+d0OZuGktfGEv7aOwSf5bvmkkkf+T/FdpkkvZBT9thnLT
# otDAZNI6QsEaA/vQ7ZohuD+vprJRVNVMxcofEo1XxjntXP/snyZ2rWRmZ+iqMODS
# rbd9sWpBJ24DiqN04IoJgm6/4/a3vJ4LKRhogaGcP24WWUsUCQma5q6/YBXdhvUw
# ggbsMIIE1KADAgECAhAwD2+s3WaYdHypRjaneC25MA0GCSqGSIb3DQEBDAUAMIGI
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxMLSmVy
# c2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwGA1UE
# AxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0xOTA1
# MDIwMDAwMDBaFw0zODAxMTgyMzU5NTlaMH0xCzAJBgNVBAYTAkdCMRswGQYDVQQI
# ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoT
# D1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2VjdGlnbyBSU0EgVGltZSBTdGFt
# cGluZyBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMgbAa/ZLH6I
# mX0BmD8gkL2cgCFUk7nPoD5T77NawHbWGgSlzkeDtevEzEk0y/NFZbn5p2QWJgn7
# 1TJSeS7JY8ITm7aGPwEFkmZvIavVcRB5h/RGKs3EWsnb111JTXJWD9zJ41OYOioe
# /M5YSdO/8zm7uaQjQqzQFcN/nqJc1zjxFrJw06PE37PFcqwuCnf8DZRSt/wflXMk
# PQEovA8NT7ORAY5unSd1VdEXOzQhe5cBlK9/gM/REQpXhMl/VuC9RpyCvpSdv7Qg
# sGB+uE31DT/b0OqFjIpWcdEtlEzIjDzTFKKcvSb/01Mgx2Bpm1gKVPQF5/0xrPnI
# hRfHuCkZpCkvRuPd25Ffnz82Pg4wZytGtzWvlr7aTGDMqLufDRTUGMQwmHSCIc9i
# VrUhcxIe/arKCFiHd6QV6xlV/9A5VC0m7kUaOm/N14Tw1/AoxU9kgwLU++Le8bwC
# KPRt2ieKBtKWh97oaw7wW33pdmmTIBxKlyx3GSuTlZicl57rjsF4VsZEJd8GEpoG
# LZ8DXv2DolNnyrH6jaFkyYiSWcuoRsDJ8qb/fVfbEnb6ikEk1Bv8cqUUotStQxyk
# SYtBORQDHin6G6UirqXDTYLQjdprt9v3GEBXc/Bxo/tKfUU2wfeNgvq5yQ1TgH36
# tjlYMu9vGFCJ10+dM70atZ2h3pVBeqeDAgMBAAGjggFaMIIBVjAfBgNVHSMEGDAW
# gBRTeb9aqitKz1SA4dibwJ3ysgNmyzAdBgNVHQ4EFgQUGqH4YRkgD8NBd0UojtE1
# XwYSBFUwDgYDVR0PAQH/BAQDAgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0l
# BAwwCgYIKwYBBQUHAwgwEQYDVR0gBAowCDAGBgRVHSAAMFAGA1UdHwRJMEcwRaBD
# oEGGP2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FDZXJ0aWZp
# Y2F0aW9uQXV0aG9yaXR5LmNybDB2BggrBgEFBQcBAQRqMGgwPwYIKwYBBQUHMAKG
# M2h0dHA6Ly9jcnQudXNlcnRydXN0LmNvbS9VU0VSVHJ1c3RSU0FBZGRUcnVzdENB
# LmNydDAlBggrBgEFBQcwAYYZaHR0cDovL29jc3AudXNlcnRydXN0LmNvbTANBgkq
# hkiG9w0BAQwFAAOCAgEAbVSBpTNdFuG1U4GRdd8DejILLSWEEbKw2yp9KgX1vDsn
# 9FqguUlZkClsYcu1UNviffmfAO9Aw63T4uRW+VhBz/FC5RB9/7B0H4/GXAn5M17q
# oBwmWFzztBEP1dXD4rzVWHi/SHbhRGdtj7BDEA+N5Pk4Yr8TAcWFo0zFzLJTMJWk
# 1vSWVgi4zVx/AZa+clJqO0I3fBZ4OZOTlJux3LJtQW1nzclvkD1/RXLBGyPWwlWE
# ZuSzxWYG9vPWS16toytCiiGS/qhvWiVwYoFzY16gu9jc10rTPa+DBjgSHSSHLeT8
# AtY+dwS8BDa153fLnC6NIxi5o8JHHfBd1qFzVwVomqfJN2Udvuq82EKDQwWli6YJ
# /9GhlKZOqj0J9QVst9JkWtgqIsJLnfE5XkzeSD2bNJaaCV+O/fexUpHOP4n2HKG1
# qXUfcb9bQ11lPVCBbqvw0NP8srMftpmWJvQ8eYtcZMzN7iea5aDADHKHwW5NWtMe
# 6vBE5jJvHOsXTpTDeGUgOw9Bqh/poUGd/rG4oGUqNODeqPk85sEwu8CgYyz8XBYA
# qNDEf+oRnR4GxqZtMl20OAkrSQeq/eww2vGnL8+3/frQo4TZJ577AWZ3uVYQ4SBu
# xq6x+ba6yDVdM3aO8XwgDCp3rrWiAoa6Ke60WgCxjKvj+QrJVF3UuWp0nr1Irpgx
# ggQtMIIEKQIBATCBkjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3JlYXRlciBN
# YW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRgwFgYDVQQKEw9TZWN0aWdvIExp
# bWl0ZWQxJTAjBgNVBAMTHFNlY3RpZ28gUlNBIFRpbWUgU3RhbXBpbmcgQ0ECEQCQ
# OX+a0ko6E/K9kV8IOKlDMA0GCWCGSAFlAwQCAgUAoIIBazAaBgkqhkiG9w0BCQMx
# DQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTIzMDIyMjA1MTEzMlowPwYJ
# KoZIhvcNAQkEMTIEMFiC6e99yJdv28ET9wLmp5NERNo6Hsmd9VjyiIg0Ddsb0T2n
# hve6f/fp0d9KZ0kUgjCB7QYLKoZIhvcNAQkQAgwxgd0wgdowgdcwFgQUqzQBOqxA
# lzGfCBrwsxjhg/gPeIEwgbwEFALWW5Xig3DBVwCV+oj5I92Tf62PMIGjMIGOpIGL
# MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTEUMBIGA1UEBxML
# SmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBVU0VSVFJVU1QgTmV0d29yazEuMCwG
# A1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eQIQMA9v
# rN1mmHR8qUY2p3gtuTANBgkqhkiG9w0BAQEFAASCAgCOmuCKr9D3hPzkDwyM9Afd
# MtVJx0YiDl8snfKxwaTKts7HHvgAgWedc7FmzhJpfTZT2Iw6Sdk3z2M9lctU5tzI
# +yvm94Fcdk3IK5ZIBPD7AvMbKMeSM95NRT1ORQw2uJNZZhZxDAEHM3a++zHL/qNx
# g8Fznho6a+5aJXu5JeFXQrgs+k/1Ol16rr5PMU1AGPNWhJhZQwI63bW1r1z+VBu1
# 5zw+yY+x0FKC56TYEGFgdm/cYBEB+fMGoKXUQzAgpm+l6YYdaBY5EOptIMLDF+uP
# N1O6yS42MB+YdLEWGK5Cunj5VJTmIxa8haTNQQT+hI+yc1IuTWZEdiGT+N/Rp/VA
# xRlm85R5HIVWafZTJLKC8Hfp8/sOypyGX0VqevWe17hkDmyIU0cNemfF0jwcScI9
# ZSPacXIchEsT7TbKvhfonILHZ7nVyPa7772KRcEuvy9bblWPXyNkj/0eC7wyO1Q+
# eLh6KCSvyjC4FfKSDzExGva+DgTXCNZVOqPIELHMoABgb+NZWi8RhuvCmrKRNboJ
# sGF6fsbWhu0qBITn9/lzxev+zLKSadxxnDGAuZ3QiN2D7L5kYvfDxqZkO7QYqqhq
# HCHuYzWp/3VT9mn/gHkcIgeYVW4kH8p4FFo9hOQenZAlN58Y53Ospp7+rCEM6G5U
# cGmRN3JrxHpGZxOsKoxlVw==
# SIG # End signature block