public/ToggleFederatedOOBConnectors.ps1

<#
.Synopsis
Script to toggle the global federated OOB connector visibility for the organization.
 
.Description
The Set-FederatedConnectorToggle function manages the global toggle for federated out-of-box (OOB) connectors in Microsoft Copilot.
It allows administrators to enable or disable all federated connectors (existing and future) for their organization.
 
When the toggle is OFF (isDisableFederatedGlobalToggle = true), all connectors are disabled. Administrators can choose to enable all connectors.
When the toggle is ON (isDisableFederatedGlobalToggle = false or not set), all connectors are enabled. Administrators can choose to disable all connectors.
 
The function provides an interactive menu to guide administrators through the process and verifies changes after applying them.
 
.Parameter BaseUrl
Optional. Base URL for the GCS Admin API. Default is "https://gcs.office.com".
Can be overridden for different environments (e.g. Dogfood: "https://df.gcs.office.com").
 
.Parameter TenantId
Optional parameter specifying the TenantId for which the toggle operation is to be performed.
 
.Parameter Torus
Optional switch parameter to indicate if Torus is being used.
 
.Example
Set-FederatedConnectorToggle
Runs the function interactively with the default Prod environment URL.
 
.Example
Set-FederatedConnectorToggle -BaseUrl "https://df.gcs.office.com"
Runs the function against the Dogfood environment.
 
.Example
Set-FederatedConnectorToggle -TenantId "your-tenant-id"
Runs the function with a specific tenant ID.
 
.Notes
- Requires MSAL.PS PowerShell module for authentication.
- Uses OAuth authentication with Microsoft identity platform.
- Modifies the isDisableFederatedGlobalToggle field in the vertical settings.
- Clears excludedContentSources and includedFederatedContentSources lists when toggling.
- Changes may take up to 10 minutes to reflect.
- Requires appropriate admin permissions to modify vertical settings.
 
#>


function Get-CurrentVertical {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Token,
        
        [Parameter(Mandatory=$true)]
        [string]$BaseUrl
    )
    
    $url = "$BaseUrl/v1.0/admin/verticals/ALL"
    $headers = @{
        "Authorization" = "Bearer $Token"
        "Content-Type" = "application/json"
    }
    
    try {
        $response = Invoke-RestMethod -Uri $url -Method Get -Headers $headers -ErrorAction Stop
        return $response
    }
    catch {
        Write-Host "ERROR: Failed to fetch vertical settings." -ForegroundColor Red
        if ($_.Exception.Message) {
            Write-Host $_.Exception.Message -ForegroundColor Red
        }
        throw
    }
}

function Update-Vertical {
    param(
        [Parameter(Mandatory=$true)]
        [string]$Token,
        
        [Parameter(Mandatory=$true)]
        [string]$BaseUrl,
        
        [Parameter(Mandatory=$true)]
        [object]$Payload
    )
    
    $url = "$BaseUrl/v1.0/admin/verticals/ALL"
    $headers = @{
        "Authorization" = "Bearer $Token"
        "Content-Type" = "application/json"
    }
    
    try {
        $jsonPayload = $Payload | ConvertTo-Json -Depth 20
        $response = Invoke-RestMethod -Uri $url -Method Put -Headers $headers -Body $jsonPayload -ErrorAction Stop
        return $response
    }
    catch {
        Write-Host "ERROR: Failed to update vertical settings." -ForegroundColor Red
        if ($_.ErrorDetails.Message) {
            Write-Host $_.ErrorDetails.Message -ForegroundColor Red
        }
        elseif ($_.Exception.Message) {
            Write-Host $_.Exception.Message -ForegroundColor Red
        }
        throw
    }
}

function Set-FederatedConnectorToggle {
    param(
        # Base URL for GCS Admin API
        [Parameter(Mandatory=$false)]
        [string]
        $BaseUrl = "https://gcs.office.com",

        # Tenant Id
        [Parameter(Mandatory=$false)]
        [string]
        $TenantId,

        # Torus Check
        [Parameter(Mandatory=$false)]
        [switch]
        $Torus
    )
    Write-Host "`n========================================" -ForegroundColor Cyan
    Write-Host "Federated Connector Toggle Manager" -ForegroundColor Cyan
    Write-Host "========================================`n" -ForegroundColor Cyan
    
    try {
        # Use module's token acquisition
        $TokenInfoObj = GetOAuthToken -TenantId $TenantId -Torus:$Torus

        # Validate token was successfully acquired
        if ($null -eq $TokenInfoObj -or $null -eq $TokenInfoObj.Token -or [string]::IsNullOrEmpty($TokenInfoObj.Token.AccessToken)) {
            throw "Failed to acquire authentication token. Please ensure you have the necessary permissions and try again."
        }

        $token = $TokenInfoObj.Token.AccessToken
        
        # Fetch current vertical settings
        $vertical = Get-CurrentVertical -Token $token -BaseUrl $BaseUrl

        # Validate vertical response
        if ($null -eq $vertical) {
            throw "Failed to retrieve vertical settings. The API returned a null response."
        }

        if ($null -eq $vertical.payload) {
            throw "Failed to retrieve vertical settings payload. The API response is missing the payload property."
        }
    
    $toggleIsOff = $false
    if ($null -ne $vertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"] -and
        $vertical.payload.isDisableFederatedGlobalToggle -eq $true) {
        $toggleIsOff = $true
    }
    
    Write-Host "Current State: " -NoNewline
    if ($toggleIsOff) {
        Write-Host "Federated connectors are DISABLED for your organization" -ForegroundColor Green
    } else {
        Write-Host "Federated connectors are ENABLED for your organization" -ForegroundColor Green
    }
    
    Write-Host "`n" -ForegroundColor Cyan
    
    if ($toggleIsOff) {
        Write-Host "What would you like to do?" -ForegroundColor Yellow
        Write-Host "[1] Enable all federated connectors (including new connectors (if any))" -ForegroundColor White
        Write-Host "[2] Keep disabled by default (enable individually via Admin Center)" -ForegroundColor White
        Write-Host ""
        Write-Host "You can manage individual connectors at:" -ForegroundColor Gray
        Write-Host "Microsoft Admin Center -> Connectors -> Connection list`n" -ForegroundColor Gray
        
        $choice = Read-Host "Select option (1-2)"
        
        if ($choice -eq "1") {
            if ($null -eq $vertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) {
                $vertical.payload | Add-Member -MemberType NoteProperty -Name "isDisableFederatedGlobalToggle" -Value $false -Force
            } else {
                $vertical.payload.isDisableFederatedGlobalToggle = $false
            }
            
            $externalEntity = $vertical.payload.entities | Where-Object { $_.entityType -eq "External" }
            if ($null -eq $externalEntity) {
                $externalEntity = [PSCustomObject]@{
                    entityType = "External"
                    contentSources = @()
                }
                if ($null -eq $vertical.payload.entities) {
                    $vertical.payload.entities = @()
                }
                $vertical.payload.entities += $externalEntity
            }
            
            if ($null -eq $externalEntity.PSObject.Properties["excludedContentSources"]) {
                $externalEntity | Add-Member -MemberType NoteProperty -Name "excludedContentSources" -Value @() -Force
            } else {
                $externalEntity.excludedContentSources = @()
            }
            
            if ($null -eq $externalEntity.PSObject.Properties["includedFederatedContentSources"]) {
                $externalEntity | Add-Member -MemberType NoteProperty -Name "includedFederatedContentSources" -Value @() -Force
            } else {
                $externalEntity.includedFederatedContentSources = @()
            }
            
            Write-Host "`nUpdating settings..." -ForegroundColor Yellow
            Update-Vertical -Token $token -BaseUrl $BaseUrl -Payload $vertical.payload
            
            Write-Host "Verifying changes..." -ForegroundColor Yellow
            $updatedVertical = Get-CurrentVertical -Token $token -BaseUrl $BaseUrl
            
            $verified = $false
            $toggleCorrect = $false
            $listsEmpty = $false
            
            if ($null -ne $updatedVertical -and $null -ne $updatedVertical.payload) {
                if ($null -ne $updatedVertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) {
                    if ($updatedVertical.payload.isDisableFederatedGlobalToggle -eq $false) {
                        $toggleCorrect = $true
                    }
                }

                $externalEntity = $updatedVertical.payload.entities | Where-Object { $_.entityType -eq "External" }
                if ($null -ne $externalEntity) {
                    $excludedEmpty = ($null -eq $externalEntity.excludedContentSources -or $externalEntity.excludedContentSources.Count -eq 0)
                    $includedEmpty = ($null -eq $externalEntity.includedFederatedContentSources -or $externalEntity.includedFederatedContentSources.Count -eq 0)
                    $listsEmpty = $excludedEmpty -and $includedEmpty
                }

                $verified = $toggleCorrect -and $listsEmpty
            }
            
            if ($verified) {
                Write-Host "`nUpdated successfully." -ForegroundColor Green
                Write-Host "All federated connectors are enabled" -ForegroundColor Green
                Write-Host "Users in your organization can now access federated connectors in Copilot." -ForegroundColor White
                Write-Host "New connectors will be enabled by default" -ForegroundColor White
                Write-Host "" -ForegroundColor White
                Write-Host "Note:" -ForegroundColor Gray
                Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray
                Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray
            } else {
                Write-Host "`n⚠ Warning: Unable to verify changes" -ForegroundColor Yellow
                Write-Host "Please check the settings manually.`n" -ForegroundColor Yellow
            }
        } else {
            Write-Host "`nNo changes made" -ForegroundColor Yellow
            Write-Host "Connectors remain disabled" -ForegroundColor Yellow
            Write-Host "Enable specific connectors via Microsoft Admin Center -> Connectors -> Connection list as needed" -ForegroundColor White
            Write-Host "" -ForegroundColor White
            Write-Host "Note:" -ForegroundColor Gray
            Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray
            Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray
        }
    } else {
        Write-Host "What would you like to do?" -ForegroundColor Yellow
        Write-Host "[1] Disable all connectors (including future connectors)" -ForegroundColor White
        Write-Host "[2] Keep enabled by default (disable individually via Admin Center)" -ForegroundColor White
        Write-Host ""
        Write-Host "You can manage individual connectors at:" -ForegroundColor Gray
        Write-Host "Microsoft Admin Center -> Connectors -> Connection list`n" -ForegroundColor Gray
        
        $choice = Read-Host "Select option (1-2)"
        
        if ($choice -eq "1") {
            if ($null -eq $vertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) {
                $vertical.payload | Add-Member -MemberType NoteProperty -Name "isDisableFederatedGlobalToggle" -Value $true -Force
            } else {
                $vertical.payload.isDisableFederatedGlobalToggle = $true
            }
            
            $externalEntity = $vertical.payload.entities | Where-Object { $_.entityType -eq "External" }
            if ($null -eq $externalEntity) {
                $externalEntity = [PSCustomObject]@{
                    entityType = "External"
                    contentSources = @()
                }
                if ($null -eq $vertical.payload.entities) {
                    $vertical.payload.entities = @()
                }
                $vertical.payload.entities += $externalEntity
            }
            
            if ($null -eq $externalEntity.PSObject.Properties["excludedContentSources"]) {
                $externalEntity | Add-Member -MemberType NoteProperty -Name "excludedContentSources" -Value @() -Force
            } else {
                $externalEntity.excludedContentSources = @()
            }
            
            if ($null -eq $externalEntity.PSObject.Properties["includedFederatedContentSources"]) {
                $externalEntity | Add-Member -MemberType NoteProperty -Name "includedFederatedContentSources" -Value @() -Force
            } else {
                $externalEntity.includedFederatedContentSources = @()
            }
            
            Write-Host "`nUpdating settings..." -ForegroundColor Yellow
            Update-Vertical -Token $token -BaseUrl $BaseUrl -Payload $vertical.payload
            
            Write-Host "Verifying changes..." -ForegroundColor Yellow
            $updatedVertical = Get-CurrentVertical -Token $token -BaseUrl $BaseUrl
            
            $verified = $false
            $toggleCorrect = $false
            $listsEmpty = $false
            
            if ($null -ne $updatedVertical -and $null -ne $updatedVertical.payload) {
                if ($null -ne $updatedVertical.payload.PSObject.Properties["isDisableFederatedGlobalToggle"]) {
                    if ($updatedVertical.payload.isDisableFederatedGlobalToggle -eq $true) {
                        $toggleCorrect = $true
                    }
                }

                $externalEntity = $updatedVertical.payload.entities | Where-Object { $_.entityType -eq "External" }
                if ($null -ne $externalEntity) {
                    $excludedEmpty = ($null -eq $externalEntity.excludedContentSources -or $externalEntity.excludedContentSources.Count -eq 0)
                    $includedEmpty = ($null -eq $externalEntity.includedFederatedContentSources -or $externalEntity.includedFederatedContentSources.Count -eq 0)
                    $listsEmpty = $excludedEmpty -and $includedEmpty
                }
                $verified = $toggleCorrect -and $listsEmpty
            }
            
            if ($verified) {
                Write-Host "`nUpdated successfully." -ForegroundColor Green
                Write-Host "All federated connectors are now DISABLED." -ForegroundColor Green
                Write-Host "Users cannot see federated connectors in Copilot." -ForegroundColor White
                Write-Host "Future connectors will be disabled automatically." -ForegroundColor White
                Write-Host "" -ForegroundColor White
                Write-Host "Note:" -ForegroundColor Gray
                Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray
                Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray
            } else {
                Write-Host "`n⚠ Warning: Unable to verify changes" -ForegroundColor Yellow
                Write-Host "Please check the settings manually.`n" -ForegroundColor Yellow
            }
        } else {
            Write-Host "`nNo changes made." -ForegroundColor Yellow
            Write-Host "Connectors remain enabled for your organization" -ForegroundColor Yellow
            Write-Host "Disable specific connectors via Microsoft Admin Center -> Connectors -> Connection list as needed." -ForegroundColor White
            Write-Host "" -ForegroundColor White
            Write-Host "Note:" -ForegroundColor Gray
            Write-Host "Changes may take up to 10 minutes to reflect." -ForegroundColor Gray
            Write-Host "You may need to refresh the Admin Center to see the updated state.`n" -ForegroundColor Gray
        }
    }
    }
    catch {
        Write-Error "Error happened while executing Set-FederatedConnectorToggle. Error = $_"
    }
}

# SIG # Begin signature block
# MIIojQYJKoZIhvcNAQcCoIIofjCCKHoCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB4JDzpYIX1fjbm
# oZyRS3Ytfco9IgdiBFWQ43Bk/wxwfKCCDYUwggYDMIID66ADAgECAhMzAAAEhJji
# EuB4ozFdAAAAAASEMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjUwNjE5MTgyMTM1WhcNMjYwNjE3MTgyMTM1WjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDtekqMKDnzfsyc1T1QpHfFtr+rkir8ldzLPKmMXbRDouVXAsvBfd6E82tPj4Yz
# aSluGDQoX3NpMKooKeVFjjNRq37yyT/h1QTLMB8dpmsZ/70UM+U/sYxvt1PWWxLj
# MNIXqzB8PjG6i7H2YFgk4YOhfGSekvnzW13dLAtfjD0wiwREPvCNlilRz7XoFde5
# KO01eFiWeteh48qUOqUaAkIznC4XB3sFd1LWUmupXHK05QfJSmnei9qZJBYTt8Zh
# ArGDh7nQn+Y1jOA3oBiCUJ4n1CMaWdDhrgdMuu026oWAbfC3prqkUn8LWp28H+2S
# LetNG5KQZZwvy3Zcn7+PQGl5AgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUBN/0b6Fh6nMdE4FAxYG9kWCpbYUw
# VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh
# dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwNTM2MjAfBgNVHSMEGDAW
# gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw
# MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx
# XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB
# AGLQps1XU4RTcoDIDLP6QG3NnRE3p/WSMp61Cs8Z+JUv3xJWGtBzYmCINmHVFv6i
# 8pYF/e79FNK6P1oKjduxqHSicBdg8Mj0k8kDFA/0eU26bPBRQUIaiWrhsDOrXWdL
# m7Zmu516oQoUWcINs4jBfjDEVV4bmgQYfe+4/MUJwQJ9h6mfE+kcCP4HlP4ChIQB
# UHoSymakcTBvZw+Qst7sbdt5KnQKkSEN01CzPG1awClCI6zLKf/vKIwnqHw/+Wvc
# Ar7gwKlWNmLwTNi807r9rWsXQep1Q8YMkIuGmZ0a1qCd3GuOkSRznz2/0ojeZVYh
# ZyohCQi1Bs+xfRkv/fy0HfV3mNyO22dFUvHzBZgqE5FbGjmUnrSr1x8lCrK+s4A+
# bOGp2IejOphWoZEPGOco/HEznZ5Lk6w6W+E2Jy3PHoFE0Y8TtkSE4/80Y2lBJhLj
# 27d8ueJ8IdQhSpL/WzTjjnuYH7Dx5o9pWdIGSaFNYuSqOYxrVW7N4AEQVRDZeqDc
# fqPG3O6r5SNsxXbd71DCIQURtUKss53ON+vrlV0rjiKBIdwvMNLQ9zK0jy77owDy
# XXoYkQxakN2uFIBO1UNAvCYXjs4rw3SRmBX9qiZ5ENxcn/pLMkiyb68QdwHUXz+1
# fI6ea3/jjpNPz6Dlc/RMcXIWeMMkhup/XEbwu73U+uz/MIIHejCCBWKgAwIBAgIK
# YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw
# OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD
# VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la
# UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc
# 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D
# dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+
# lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk
# kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6
# A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd
# X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL
# 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd
# sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3
# T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS
# 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI
# bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL
# BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD
# uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv
# c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h
# cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA
# YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn
# 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7
# v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b
# pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/
# KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy
# CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp
# mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi
# hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb
# BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS
# oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL
# gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX
# cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGl4wghpaAgEBMIGVMH4x
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p
# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAASEmOIS4HijMV0AAAAA
# BIQwDQYJYIZIAWUDBAIBBQCggeYwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINPL
# uIwOIqwLaOjo+uWF7OhZHF8tSnetfZ8Nz43cD5+OMHoGCisGAQQBgjcCAQwxbDBq
# oEyASgBNAGkAYwByAG8AcwBvAGYAdAAuAEcAcgBhAHAAaAAuAEMAbwBuAG4AZQBj
# AHQAbwByAHMALgBDAG0AZABsAGUAdAAuAGQAbABsoRqAGGh0dHA6Ly93d3cubWlj
# cm9zb2Z0LmNvbTANBgkqhkiG9w0BAQEFAASCAQB5R8L3rULCx+oXlWAt3Rocf8Vx
# dyORaoYCpomIQFL56BWunuQ2dfcoxW2NPMQMHCvT1Z4/q2BKqtJ9p7g/xz4pazBI
# k01tJCGpYV1d7OP8P37Xrs1LAnwxQDvaCWK4RlX3XFRDYKx3fra2O2V4w6rie2bl
# lA16xPtguBvEI7gOUnvqK9stsIsOUtMKFpSGkoDKKRx4inbU3H9itVW4UkDgu8rm
# eO3VLyy4G2fw2SZdMoSUkYe0lxP1LD1jekIGODFt2Mjnc5xStCML3zBqfweoT1nI
# a2V2UZ0EO6GwcnoXc5Apvet5sSUpGPeUrZaFwhz2O0TdI4MRk7Wyy/F9vHwUoYIX
# sDCCF6wGCisGAQQBgjcDAwExghecMIIXmAYJKoZIhvcNAQcCoIIXiTCCF4UCAQMx
# DzANBglghkgBZQMEAgEFADCCAVoGCyqGSIb3DQEJEAEEoIIBSQSCAUUwggFBAgEB
# BgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIKcnA+ZMPglbrYLthO4pesF7
# H8C6/d4DpRJftpzTNKIXAgZpvC24MJUYEzIwMjYwNDA2MTM0NjI0Ljc4NVowBIAC
# AfSggdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloIIR/jCCBygwggUQoAMCAQIC
# EzMAAAITsEM1Zs+vlegAAQAAAhMwDQYJKoZIhvcNAQELBQAwfDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgUENBIDIwMTAwHhcNMjUwODE0MTg0ODE3WhcNMjYxMTEzMTg0ODE3
# WjCB0zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcT
# B1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UE
# CxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQL
# Ex5uU2hpZWxkIFRTUyBFU046MzYwNS0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jv
# c29mdCBUaW1lLVN0YW1wIFNlcnZpY2UwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQD0mXrguhnEMg1IWDP70pLk7O/mbnjx49XNz1FdZ7hPj8ymV+Brh6rX
# ZEZ2nlxW+eN17m/F+rZrH+Oe7u9Rbitk3iY5Sbm+H6RxixCVhDncXCAgHecSNxAe
# iasbeZl7+jOMVICvoluCUq0h4DJI/MBwXPIB6vmUs1QcES9AwzwE6MzJqkK+HTGy
# DjEoVxUQlAsoR8IYF98xkj9qa60cVvcJRNntpWkbYocQVQ2VnW/Awq/FdM9EOdvA
# 8bPLKoknOd+ws0dDi9e3a21LU94KgYjSE3U96rzIawhcz2ihzALToMY1Iz/gsDHa
# 4q/CZSfo3AtzT62a+fLrDbytkt6OyRF+dVah8S/WZZjSMdScevBIYFLyBU/2BwGz
# o/mDQ6kk8x/F1SQddGRww89bSEg/w1tbxblK6nwe7CdIpuOnICUYFR0z9XmtlvSx
# maSfvXivpQsYr5wssA3pHcWFfo3SePrgXbstMrYFtLSkllpeOjR4M3PVBzF4gUtS
# AX5EGwtgOfwTxwKR7Erw2W3caL3Ml/nnDpR9Nn6TBMzEyoXGHv5N/Hv5oE5tn6fH
# 3rUC2KoDLvNVXr2j8tZF0o9l29mf0RLIZtOc9+OQERG/bamtKUROVHDM/puYRU4p
# YtZXDG7CHttRZS5RvVyP3fO+21BgZBq3kT0Assk2aW8soKyQHutouwIDAQABo4IB
# STCCAUUwHQYDVR0OBBYEFBOeEErH4WvKmFBYxGKkfj2wwUA6MB8GA1UdIwQYMBaA
# FJ+nFV0AXmJdg/Tl0mWnG1M1GelyMF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMFRpbWUtU3Rh
# bXAlMjBQQ0ElMjAyMDEwKDEpLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUH
# MAKGUGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9z
# b2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUyMDIwMTAoMSkuY3J0MAwGA1UdEwEB/wQC
# MAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeAMA0GCSqG
# SIb3DQEBCwUAA4ICAQCCbFomsapDYPpQmFnpCXZJkU5o24ZtbcvMH4RL6XYEHUwm
# 0FFIV2L+FVjfc2nGwlCFDlMtWnQNdg6Qig9BzXusf4hWF6Y7yMK35TojVMjDpxHt
# z60Sj8mOnoSoRTVzj+atoyOAeFD6toL85QCb3wDWvhsg8e2wGYtE4aZ4TlcsgVoE
# hlYe+HYI5chMo5tdV3nAa0nV1ll3BocAJcXnTqO1r66hR3LMB642VM8tOtnyfKHE
# bCT1WHp6INDsJAxZJJrwMlL09ReN6iL29N1Ltkxeq762/pDPfG2gEXn5gUri4T6a
# Iaz3QXGbRUraVauYWGORGXnPKgc53Abuyk1iQOiYI81Yi51RCZBgqm38eyyl9xv7
# GmdYgNB0zOATymPW+nAuBYScfsu1Ph1kJ6gOj08rjRHEEPyQonvr2eCQTB/AIPYR
# f8xCTv14i86GmcfXYa5UHK9opmTldm+q08403Cvyr+oDfzvsi5bBaCdp5f6munDR
# 1n9Au1sYZWuA/5NFCO37Z1xkDk/dfgvAA2GI+zLQ6XhcJ2Ps7EEsW87OwI8M9pWe
# Sn518MUb404GKvtqpMnrzrbanKaDVX7qBz/VG/EL/CC9jIbTfd5wmq/Q6fRlE1iv
# 6L86TCADcc/VosPRoesSnDqW3TbreJGQK+tx1w5bzDeMLxMm5oZbILZL2MSPODCC
# B3EwggVZoAMCAQICEzMAAAAVxedrngKbSZkAAAAAABUwDQYJKoZIhvcNAQELBQAw
# gYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS
# ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMT
# KU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTIx
# MDkzMDE4MjIyNVoXDTMwMDkzMDE4MzIyNVowfDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAg
# UENBIDIwMTAwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDk4aZM57Ry
# IQt5osvXJHm9DtWC0/3unAcH0qlsTnXIyjVX9gF/bErg4r25PhdgM/9cT8dm95VT
# cVrifkpa/rg2Z4VGIwy1jRPPdzLAEBjoYH1qUoNEt6aORmsHFPPFdvWGUNzBRMhx
# XFExN6AKOG6N7dcP2CZTfDlhAnrEqv1yaa8dq6z2Nr41JmTamDu6GnszrYBbfowQ
# HJ1S/rboYiXcag/PXfT+jlPP1uyFVk3v3byNpOORj7I5LFGc6XBpDco2LXCOMcg1
# KL3jtIckw+DJj361VI/c+gVVmG1oO5pGve2krnopN6zL64NF50ZuyjLVwIYwXE8s
# 4mKyzbnijYjklqwBSru+cakXW2dg3viSkR4dPf0gz3N9QZpGdc3EXzTdEonW/aUg
# fX782Z5F37ZyL9t9X4C626p+Nuw2TPYrbqgSUei/BQOj0XOmTTd0lBw0gg/wEPK3
# Rxjtp+iZfD9M269ewvPV2HM9Q07BMzlMjgK8QmguEOqEUUbi0b1qGFphAXPKZ6Je
# 1yh2AuIzGHLXpyDwwvoSCtdjbwzJNmSLW6CmgyFdXzB0kZSU2LlQ+QuJYfM2BjUY
# hEfb3BvR/bLUHMVr9lxSUV0S2yW6r1AFemzFER1y7435UsSFF5PAPBXbGjfHCBUY
# P3irRbb1Hode2o+eFnJpxq57t7c+auIurQIDAQABo4IB3TCCAdkwEgYJKwYBBAGC
# NxUBBAUCAwEAATAjBgkrBgEEAYI3FQIEFgQUKqdS/mTEmr6CkTxGNSnPEP8vBO4w
# HQYDVR0OBBYEFJ+nFV0AXmJdg/Tl0mWnG1M1GelyMFwGA1UdIARVMFMwUQYMKwYB
# BAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcD
# CDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0T
# AQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTV9lbLj+iiXGJo0T2UkFvXzpoYxDBWBgNV
# HR8ETzBNMEugSaBHhkVodHRwOi8vY3JsLm1pY3Jvc29mdC5jb20vcGtpL2NybC9w
# cm9kdWN0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcmwwWgYIKwYBBQUHAQEE
# TjBMMEoGCCsGAQUFBzAChj5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpL2Nl
# cnRzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNydDANBgkqhkiG9w0BAQsFAAOC
# AgEAnVV9/Cqt4SwfZwExJFvhnnJL/Klv6lwUtj5OR2R4sQaTlz0xM7U518JxNj/a
# ZGx80HU5bbsPMeTCj/ts0aGUGCLu6WZnOlNN3Zi6th542DYunKmCVgADsAW+iehp
# 4LoJ7nvfam++Kctu2D9IdQHZGN5tggz1bSNU5HhTdSRXud2f8449xvNo32X2pFaq
# 95W2KFUn0CS9QKC/GbYSEhFdPSfgQJY4rPf5KYnDvBewVIVCs/wMnosZiefwC2qB
# woEZQhlSdYo2wh3DYXMuLGt7bj8sCXgU6ZGyqVvfSaN0DLzskYDSPeZKPmY7T7uG
# +jIa2Zb0j/aRAfbOxnT99kxybxCrdTDFNLB62FD+CljdQDzHVG2dY3RILLFORy3B
# FARxv2T5JL5zbcqOCb2zAVdJVGTZc9d/HltEAY5aGZFrDZ+kKNxnGSgkujhLmm77
# IVRrakURR6nxt67I6IleT53S0Ex2tVdUCbFpAUR+fKFhbHP+CrvsQWY9af3LwUFJ
# fn6Tvsv4O+S3Fb+0zj6lMVGEvL8CwYKiexcdFYmNcP7ntdAoGokLjzbaukz5m/8K
# 6TT4JDVnK+ANuOaMmdbhIurwJ0I9JZTmdHRbatGePu1+oDEzfbzL6Xu/OHBE0ZDx
# yKs6ijoIYn/ZcGNTTY3ugm2lBRDBcQZqELQdVTNYs6FwZvKhggNZMIICQQIBATCC
# AQGhgdmkgdYwgdMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYDVQQD
# ExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNloiMKAQEwBwYFKw4DAhoDFQCY
# ETxIKPGCNpybLz9UR2Ts3GlHpqCBgzCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwMA0GCSqGSIb3DQEBCwUAAgUA7X29DjAiGA8yMDI2MDQwNjA1MDMx
# MFoYDzIwMjYwNDA3MDUwMzEwWjB3MD0GCisGAQQBhFkKBAExLzAtMAoCBQDtfb0O
# AgEAMAoCAQACAhagAgH/MAcCAQACAhK2MAoCBQDtfw6OAgEAMDYGCisGAQQBhFkK
# BAIxKDAmMAwGCisGAQQBhFkKAwKgCjAIAgEAAgMHoSChCjAIAgEAAgMBhqAwDQYJ
# KoZIhvcNAQELBQADggEBAK7Ijia7vAfuCkGI08/or9gZ9RrmPD0QHS2B4O8suCSc
# 0lDnPzMLgfzGnB3HetFtoeGTBZOKL1V8GqyxvgIY6Cra1BY2Gaygk5GUJFIKxo4c
# YC19jYN7pCLc14kNNDEWf79WOTb91GMLD6TtsVuhV+0U3bZU1tOYSsnD7KohzaJg
# RchnoasqRYcel1edJ48vPNnE5a6DaYef1K44ayYqHDjzek6QVu7yivYrEcLCR5Uf
# v9TdOnlQoNvAIi2/Y8MImjrxhvxyGGqRxkOmYH2K1HBehjCX4Ito47AeGD5/U7ED
# rdM4+IdCWa3RKI/v9Em7trzuFCrbhZ+pA98xIo30my4xggQNMIIECQIBATCBkzB8
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1N
# aWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAhOwQzVmz6+V6AABAAAC
# EzANBglghkgBZQMEAgEFAKCCAUowGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE
# MC8GCSqGSIb3DQEJBDEiBCDy1Cxprzjm8CXdK+asGpCbWQPPUCaZVO3K2R0jaKtA
# +zCB+gYLKoZIhvcNAQkQAi8xgeowgecwgeQwgb0EIMzhCW0UhTPwngOMDM/idWh1
# m9DFgaV5Qh+nzo5rnFhoMIGYMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENB
# IDIwMTACEzMAAAITsEM1Zs+vlegAAQAAAhMwIgQg5rJDC/dk07msyMrxx/7CNJIQ
# fjXQAZUsum2lsej6s7IwDQYJKoZIhvcNAQELBQAEggIAGz5JMIb9SGW7+vOL3ieF
# CSXV4kqEH32oOW8TEJr8lU/ISf+Kt0iQBZsQ0o/JEJZ16waed4kXB3brQ9QnT9HV
# RxiUoYNxGBuFxtrJpcz3rKRnRWD7qIPqQe6wUVrVJo+NBoshEKVmy8OO/Ylp0rSH
# 66jnxiNHiwvRGxGxec313MSodJrfvh3vGf6JlTHeagslbhkqlwwTB/iO5Jc8Qdd9
# hI65hg5XBWtGELJ3GR9BRGeMzE1J82bRjUcMsCTJvCS2l4sRq0KSP5X76TuhGbGG
# 6VQbFAPHpOix23IQtbuAKZxSXh9mwlTGhmcCSfXKnl8lCw7yteU7FJDoNDKqG1BO
# Qo7QLoxN9oAYmUc7bAR1Yoj6Jjy1mxmZ5LIt9TpqUD8muJSHC2YKILqyCyW1UJ9r
# Rd6ZiWgw/hp4u5m2t9/Ic47mFuS9taB9HVmp5KClf/DdBEi4QHHCUGUuY2BzE75h
# X1G2qmUlQpnOo6XNQCtDU/IdkyhEuRGhfrrEb4EB1rSagZH5wnV++hVMoeFH2cKr
# 4A1LHkMdh2d65XjaBdUm4PTh0R4H9DuO5UCXYQNWOhmSdOpqcFbIbnk3nu5piryY
# ZQs7mrBjUNjecdNyVd3cMN1bruTOfxlnWo96p+nlul13KDEtbwwlmkUT94wgAo5D
# ANEMx5+rIdmef/hIm+aotwY=
# SIG # End signature block