Skip to content

Instantly share code, notes, and snippets.

@jhochwald
Last active December 22, 2015 13:42
Show Gist options
  • Save jhochwald/d14deb6341166a5e6aed to your computer and use it in GitHub Desktop.
Save jhochwald/d14deb6341166a5e6aed to your computer and use it in GitHub Desktop.
Disable Clutter for all Exchange Online (Office 365) Mailboxes in a
<#
{
"info": {
"Statement": "Code is poetry",
"Author": "Joerg Hochwald",
"Contact": "[email protected]",
"Link": "http://hochwald.net",
"Support": "https://github.com/jhochwald/MyPowerShellStuff/issues"
},
"Copyright": "(c) 2012-2015 by Joerg Hochwald. All rights reserved."
}
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, this list of
conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation and/or
other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
By using the Software, you agree to the License, Terms and Conditions above!
#>
<#
.SYNOPSIS
Disable Clutter for all Mailboxes
.DESCRIPTION
Disable the Exchange Online Feature Clutter for all User Mailboxes.
Microsoft introduced it as ON BY DEFAULT and we do not want that.
The user can enable the feature via OWA if he likes to have it.
.EXAMPLE
PS C:\scripts\PowerShell> .\Set-Clutter-disabled4all.ps1
Disable the Exchange Online Feature Clutter for all User Mailboxes.
.NOTES
Microsoft agreed to use this script on a large tentent!
.LINK
hochwald.net http://hochwald.net
#>
#requires -version 3
# Debug enabled?
Set-Variable -Name "debug" -Scope:Script -Value $($true)
# Cleanup
Remove-Variable cnt -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# No fancy Debug messages if the script is called unattended
if ($RunUnattended -eq $true) {
Set-Variable -Name "debug" -Scope:Script -Value $($false)
Set-Variable -Name "ProgressPreference" -Scope:Script -Value $("SilentlyContinue")
# Remember to enable it again ;-)
Set-Variable -Name "ProgressPreference" -Scope:Global -Value $("SilentlyContinue")
}
# Make a clear screen
Clear-Host
# Check the PowerShell Version
if ($PSVersionTable.PSVersion.Major -lt 3) {
# Wrong PowerShell, inform operator
Write-Error -Message "Sorry your PowerShell is to old! Minimum PowerShell Version is 3.0 or newer" -ErrorAction Stop -Category ResourceUnavailable -recommendedAction "Please check installation"
# Exit on Error
exit 1
}
<#
This is the part that will not work on your system!
You need to have the BASE Module installed...
Find the Functions below and replace them with your own ones!
# This checks that the command Get-BaseVersion exist, if not it will try to load the Base module
if (!(Get-Command Get-BaseVersion -errorAction SilentlyContinue)) {
# Where is the module
$BaseModule = "C:\scripts\PowerShell\modules\base.psm1"
If (-not(Test-Path -path $BaseModule)) {
# Aw Snap! PowerShell Base Module is missing
Write-Error -Message "Error: PowerShell Base Module missing..." -ErrorAction Stop -Category ResourceUnavailable -recommendedAction "Please review your configuration"
# Die hard!
exit 1
} else {
try {
# Try to import the Base Module
Import-Module $BaseModule -DisableNameChecking -force -Scope Global -ErrorAction Stop
} catch [System.Exception] {
# Aw Snap! Houston, We've Got a Problem. And I mean a real one!
Write-Error -Message "Error: $ExceptionInfo" -ErrorAction Stop -Category ResourceUnavailable -recommendedAction "Please review your configuration"
# Die hard!
exit 1
}
}
}
#>
# This is a command that you need to replace by your own
# It comes from the BASE Module, the one that you DO NOT have!!!
#
# Connect to Office 365 Exchange 365
Reconnect-O365Exchange > $null 2>&1 3>&1
# Cleanup
Remove-Variable timestamp -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# If debug is enabled...
if ($debug -eq $true) {
# Cleanup
Remove-Variable StartTime -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# Mark the script start to use in debug output
Set-Variable -Name "StartTime" -Scope:Script -Value $((get-date).ToString())
}
# Here we go. Now we start the real work!
Write-Output "Collecting data from Office 365, this will take a while!"
# Cleanup
Remove-Variable mailboxes -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# What to display in the Report?
Set-Variable -Name "mailboxes" -Scope:Script -Value $(@((Get-Mailbox -RecipientTypeDetails UserMailbox -resultsize unlimited -WarningAction SilentlyContinue -errorAction SilentlyContinue) | Where { $_.name -Notlike '*DiscoverySearchMailbox*' } | select UserPrincipalName))
# Cleanup
Remove-Variable mailboxcount -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# How many Mailboxes do we have?
Set-Variable -Name "mailboxcount" -Scope:Script -Value $(($mailboxes.count))
# Make a clear screen
Clear-Host
# Catch zero item results to prevent exit of the script while get a null pointer exception
if ($mailboxcount -eq 0) {
# Aw Snap!
# No matching mailboxes found. Not even one...
# That seems to be a bad selection dude!
Write-Error -Message "Error: Something is wrong! No Mailboxes found to report..." -Category ResourceUnavailable -recommendedAction "Please check!"
# This is a command that you need to replace by your own
# It comes from the BASE Module, the one that you DO NOT have!!!
#
# Disconnect from Microsoft Office 365 and kill myself
Disconnect-O365 > $null 2>&1 3>&1
Disconnect-all > $null 2>&1 3>&1
Disconnect-O365 > $null 2>&1 3>&1
# Die hard - Exit on Error
exit 1
} else {
# Info for the operator
Write-Host "Found $mailboxcount Exchange Online User Mailboxes." -ForegroundColor "White"
}
<#
We start to slice the big Variable of mailboxes (UPN)
This seems to be very useful instead of calling Office365/Azue with a big block
This is called multidimensional array within PowerShell
#>
# Number to use for splits
# 100 should be a good start value
Set-Variable -Name "SlicePartsize" -Scope:Script -Value $("100")
# Make a split
Set-Variable -Name "SliceParts" -Scope:Script -Value $([Math]::Ceiling($mailboxes.count / $SlicePartsize))
# Create a multidimensional array with number of values specified above (With $size)
$SliceArray = @()
# Figure out where we are and slice it
for ($i = 1; $i -le $SliceParts; $i++) {
# First we figure out where to start
Set-Variable -Name "start" -Scope:Script -Value $((($i - 1) * $SlicePartsize))
# Now we figure out where to end and build the offset
Set-Variable -Name "end" -Scope:Script -Value $((($i) * $SlicePartsize) - 1)
# Check the counter
if ($end -ge ($mailboxes.count)) {
# Set the new offset
Set-Variable -Name "end" -Scope:Script -Value $(($mailboxes.count))
$end = ($mailboxes.count)
}
# And here is our brand new array
$SliceArray +=, @($mailboxes[$start..$end])
}
# Now we loop over all Mailboxes in all sliced arrays
# Catch yourself a coffee, this will take a while to complete... Snickers?
for ($i = 0; $i -lt $SliceArray.Length; $i++) {
# Build a new array
Set-Variable -Name "MailboxesSlice" -Scope:Script -Value $(@($SliceArray[$i]))
# Now we loop over all Mailboxes in this slice
foreach ($mb in $MailboxesSlice) {
# This is a command that you need to replace by your own
# It comes from the BASE Module, the one that you DO NOT have!!!
#
# Make sure that we are still connected...
Reconnect-O365Exchange
<#
Microsoft limits administrator interactions
This is good! Is saves us from administrators that flood the tenant
But this interactions needs more then we are allowed to have.
Sometimes a connections then gets lost, so we try to figure out
if we are still connected and do a reconnect if we need to!
This is all local and takes only a few milliseconds
#>
# Get the counter ready
Set-Variable -Name "cnt" -Scope:Script -Value $(($cnt + 1))
Set-Variable -Name "pct" -Scope:Script -Value $(($cnt/$mailboxcount * 100))
# Cleanup
Remove-Variable myUPN -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# Get the User Principal Name
Set-Variable -Name "myUPN" -Scope:Script -Value $(($mb.UserPrincipalName))
# Inform the operator where we are
if ($RunUnattended -eq $true) {
# Script called unattended, do nothing... Yet!
} else {
Write-Progress -Activity "Collecting Clutter details" -Status "Processing mailbox $cnt of $mailboxcount - $myUPN" -PercentComplete $pct
}
# Disable Clutter for the given User
Remove-Variable SetMyClutter -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# Try to remove Clutter
try {
Set-Variable -Name "SetMyClutter" -Scope:Script -Value $((set-clutter -identity $myUPN -enable $false -ErrorAction:Stop -WarningAction:SilentlyContinue) > $null 2>&1 3>&1)
} catch {
# Whoopsie, we had a problem while we try to remove Clutter for this User
# So we try it again.
# This time it is a "Fire and Forget"
Set-Variable -Name "SetMyClutter" -Scope:Script -Value $((set-clutter -identity $myUPN -enable $false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue) > $null 2>&1 3>&1)
}
Remove-Variable SetMyClutter -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# DEBUG: Slow down, but this will take much longer, but prevents the throttling
Start-Sleep -Milliseconds 125
# This is a command that you need to replace by your own
# It comes from the BASE Module, the one that you DO NOT have!!!
#
# Make sure that we are still connected...
Reconnect-O365Exchange
}
# Wait to prevent Office 365 throttling
# This is the time to Wait until we start with the next slice of users
# A good time is 5 - 10 Seconds
Start-Sleep -Seconds 5
# This is a command that you need to replace by your own
# It comes from the BASE Module, the one that you DO NOT have!!!
#
# Make sure that we are still connected...
Reconnect-O365Exchange
}
# Cleanup
Remove-Variable mailboxes -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
Remove-Variable mb -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# If debug is enabled...
if ($debug -eq $true) {
# Create a new time-stamp
Set-Variable -Name "EndTime" -Scope:Script -Value $((get-date).ToString())
# find the difference between Start and Stop to display the elapsed time
Set-Variable -Name "TimeDiff" -Scope:Script -Value $((New-TimeSpan $StartTime $EndTime))
# How long was the run?
Set-Variable -Name "TimeToRun" -Scope:Script -Value $(($TimeDiff.ToString()))
# DEBUG Output to console
# The only reason we use Write-Host instead of Write-Output here!
Write-Host "Here is some nice Debug information for you:" -ForegroundColor "White"
Write-Host "Users Found : $mailboxcount"
Write-Host "Time elapsed : $TimeToRun"
Write-Host "`r`nThanks for being such a patient customer...`r`n`tHave a great day!" -ForegroundColor "White"
# Cleanup DEBUG Variables
Remove-Variable EndTime -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
Remove-Variable TimeDiff -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
Remove-Variable TimeToRun -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
}
# Cleanup
Remove-Variable mailboxcount -Force -Confirm:$false -ErrorAction:SilentlyContinue -WarningAction:SilentlyContinue
# This is a command that you need to replace by your own
# It comes from the BASE Module, the one that you DO NOT have!!!
#
# Disconnect from Microsoft Online (Azure)
Disconnect-O365 > $null 2>&1 3>&1
# Make a clean exit
exit 0
# SIG # Begin signature block
# MIIfOgYJKoZIhvcNAQcCoIIfKzCCHycCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUmErUjqTG+crI9jUkZYXhyHxO
# 3SSgghnLMIIEFDCCAvygAwIBAgILBAAAAAABL07hUtcwDQYJKoZIhvcNAQEFBQAw
# VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
# BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0
# MTMxMDAwMDBaFw0yODAxMjgxMjAwMDBaMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQK
# ExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRpbWVzdGFt
# cGluZyBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlO9l
# +LVXn6BTDTQG6wkft0cYasvwW+T/J6U00feJGr+esc0SQW5m1IGghYtkWkYvmaCN
# d7HivFzdItdqZ9C76Mp03otPDbBS5ZBb60cO8eefnAuQZT4XljBFcm05oRc2yrmg
# jBtPCBn2gTGtYRakYua0QJ7D/PuV9vu1LpWBmODvxevYAll4d/eq41JrUJEpxfz3
# zZNl0mBhIvIG+zLdFlH6Dv2KMPAXCae78wSuq5DnbN96qfTvxGInX2+ZbTh0qhGL
# 2t/HFEzphbLswn1KJo/nVrqm4M+SU4B09APsaLJgvIQgAIMboe60dAXBKY5i0Eex
# +vBTzBj5Ljv5cH60JQIDAQABo4HlMIHiMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB
# Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTBHBgNV
# HSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFs
# c2lnbi5jb20vcmVwb3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2Ny
# bC5nbG9iYWxzaWduLm5ldC9yb290LmNybDAfBgNVHSMEGDAWgBRge2YaRQ2XyolQ
# L30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEATl5WkB5GtNlJMfO7FzkoG8IW
# 3f1B3AkFBJtvsqKa1pkuQJkAVbXqP6UgdtOGNNQXzFU6x4Lu76i6vNgGnxVQ380W
# e1I6AtcZGv2v8Hhc4EvFGN86JB7arLipWAQCBzDbsBJe/jG+8ARI9PBw+DpeVoPP
# PfsNvPTF7ZedudTbpSeE4zibi6c1hkQgpDttpGoLoYP9KOva7yj2zIhd+wo7AKvg
# IeviLzVsD440RZfroveZMzV+y5qKu0VN5z+fwtmK+mWybsd+Zf/okuEsMaL3sCc2
# SI8mbzvuTXYfecPlf5Y1vC0OzAGwjn//UYCAp5LUs0RGZIyHTxZjBzFLY7Df8zCC
# BJ8wggOHoAMCAQICEhEhBqCB0z/YeuWCTMFrUglOAzANBgkqhkiG9w0BAQUFADBS
# MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEoMCYGA1UE
# AxMfR2xvYmFsU2lnbiBUaW1lc3RhbXBpbmcgQ0EgLSBHMjAeFw0xNTAyMDMwMDAw
# MDBaFw0yNjAzMDMwMDAwMDBaMGAxCzAJBgNVBAYTAlNHMR8wHQYDVQQKExZHTU8g
# R2xvYmFsU2lnbiBQdGUgTHRkMTAwLgYDVQQDEydHbG9iYWxTaWduIFRTQSBmb3Ig
# TVMgQXV0aGVudGljb2RlIC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQCwF66i07YEMFYeWA+x7VWk1lTL2PZzOuxdXqsl/Tal+oTDYUDFRrVZUjtC
# oi5fE2IQqVvmc9aSJbF9I+MGs4c6DkPw1wCJU6IRMVIobl1AcjzyCXenSZKX1GyQ
# oHan/bjcs53yB2AsT1iYAGvTFVTg+t3/gCxfGKaY/9Sr7KFFWbIub2Jd4NkZrItX
# nKgmK9kXpRDSRwgacCwzi39ogCq1oV1r3Y0CAikDqnw3u7spTj1Tk7Om+o/SWJMV
# TLktq4CjoyX7r/cIZLB6RA9cENdfYTeqTmvT0lMlnYJz+iz5crCpGTkqUPqp0Dw6
# yuhb7/VfUfT5CtmXNd5qheYjBEKvAgMBAAGjggFfMIIBWzAOBgNVHQ8BAf8EBAMC
# B4AwTAYDVR0gBEUwQzBBBgkrBgEEAaAyAR4wNDAyBggrBgEFBQcCARYmaHR0cHM6
# Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADAWBgNV
# HSUBAf8EDDAKBggrBgEFBQcDCDBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY3Js
# Lmdsb2JhbHNpZ24uY29tL2dzL2dzdGltZXN0YW1waW5nZzIuY3JsMFQGCCsGAQUF
# BwEBBEgwRjBEBggrBgEFBQcwAoY4aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNv
# bS9jYWNlcnQvZ3N0aW1lc3RhbXBpbmdnMi5jcnQwHQYDVR0OBBYEFNSihEo4Whh/
# uk8wUL2d1XqH1gn3MB8GA1UdIwQYMBaAFEbYPv/c477/g+b0hZuw3WrWFKnBMA0G
# CSqGSIb3DQEBBQUAA4IBAQCAMtwHjRygnJ08Kug9IYtZoU1+zETOA75+qrzE5ntz
# u0vxiNqQTnU3KDhjudcrD1SpVs53OZcwc82b2dkFRRyNpLgDXU/ZHC6Y4OmI5uzX
# BX5WKnv3FlujrY+XJRKEG7JcY0oK0u8QVEeChDVpKJwM5B8UFiT6ddx0cm5OyuNq
# Q6/PfTZI0b3pBpEsL6bIcf3PvdidIZj8r9veIoyvp/N3753co3BLRBrweIUe8qWM
# ObXciBw37a0U9QcLJr2+bQJesbiwWGyFOg32/1onDMXeU+dUPFZMyU5MMPbyXPsa
# jMKCvq1ZkfYbTVV7z1sB3P16028jXDJHmwHzwVEURoqbMIIFTDCCBDSgAwIBAgIQ
# FtT3Ux2bGCdP8iZzNFGAXDANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJHQjEb
# MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRow
# GAYDVQQKExFDT01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBD
# b2RlIFNpZ25pbmcgQ0EwHhcNMTUwNzE3MDAwMDAwWhcNMTgwNzE2MjM1OTU5WjCB
# kDELMAkGA1UEBhMCREUxDjAMBgNVBBEMBTM1NTc2MQ8wDQYDVQQIDAZIZXNzZW4x
# EDAOBgNVBAcMB0xpbWJ1cmcxGDAWBgNVBAkMD0JhaG5ob2ZzcGxhdHogMTEZMBcG
# A1UECgwQS3JlYXRpdlNpZ24gR21iSDEZMBcGA1UEAwwQS3JlYXRpdlNpZ24gR21i
# SDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK8jDmF0TO09qJndJ9eG
# Fqra1lf14NDhM8wIT8cFcZ/AX2XzrE6zb/8kE5sL4/dMhuTOp+SMt0tI/SON6BY3
# 208v/NlDI7fozAqHfmvPhLX6p/TtDkmSH1sD8AIyrTH9b27wDNX4rC914Ka4EBI8
# sGtZwZOQkwQdlV6gCBmadar+7YkVhAbIIkSazE9yyRTuffidmtHV49DHPr+ql4ji
# NJ/K27ZFZbwM6kGBlDBBSgLUKvufMY+XPUukpzdCaA0UzygGUdDfgy0htSSp8MR9
# Rnq4WML0t/fT0IZvmrxCrh7NXkQXACk2xtnkq0bXUIC6H0Zolnfl4fanvVYyvD88
# qIECAwEAAaOCAbIwggGuMB8GA1UdIwQYMBaAFCmRYP+KTfrr+aZquM/55ku9Sc4S
# MB0GA1UdDgQWBBSeVG4/9UvVjmv8STy4f7kGHucShjAOBgNVHQ8BAf8EBAMCB4Aw
# DAYDVR0TAQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzARBglghkgBhvhCAQEE
# BAMCBBAwRgYDVR0gBD8wPTA7BgwrBgEEAbIxAQIBAwIwKzApBggrBgEFBQcCARYd
# aHR0cHM6Ly9zZWN1cmUuY29tb2RvLm5ldC9DUFMwQwYDVR0fBDwwOjA4oDagNIYy
# aHR0cDovL2NybC5jb21vZG9jYS5jb20vQ09NT0RPUlNBQ29kZVNpZ25pbmdDQS5j
# cmwwdAYIKwYBBQUHAQEEaDBmMD4GCCsGAQUFBzAChjJodHRwOi8vY3J0LmNvbW9k
# b2NhLmNvbS9DT01PRE9SU0FDb2RlU2lnbmluZ0NBLmNydDAkBggrBgEFBQcwAYYY
# aHR0cDovL29jc3AuY29tb2RvY2EuY29tMCMGA1UdEQQcMBqBGGhvY2h3YWxkQGty
# ZWF0aXZzaWduLm5ldDANBgkqhkiG9w0BAQsFAAOCAQEASSZkxKo3EyEk/qW0ZCs7
# CDDHKTx3UcqExigsaY0DRo9fbWgqWynItsqdwFkuQYJxzknqm2JMvwIK6BtfWc64
# WZhy0BtI3S3hxzYHxDjVDBLBy91kj/mddPjen60W+L66oNEXiBuIsOcJ9e7tH6Vn
# 9eFEUjuq5esoJM6FV+MIKv/jPFWMp5B6EtX4LDHEpYpLRVQnuxoc38mmd+NfjcD2
# /o/81bu6LmBFegHAaGDpThGf8Hk3NVy0GcpQ3trqmH6e3Cpm8Ut5UkoSONZdkYWw
# rzkmzFgJyoM2rnTMTh4ficxBQpB7Ikv4VEnrHRReihZ0zwN+HkXO1XEnd3hm+08j
# LzCCBdgwggPAoAMCAQICEEyq+crbY2/gH/dO2FsDhp0wDQYJKoZIhvcNAQEMBQAw
# gYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
# BgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBMaW1pdGVkMSswKQYD
# VQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEwMDEx
# OTAwMDAwMFoXDTM4MDExODIzNTk1OVowgYUxCzAJBgNVBAYTAkdCMRswGQYDVQQI
# ExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoT
# EUNPTU9ETyBDQSBMaW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRpZmlj
# YXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# kehUktIKVrGsDSTdxc9EZ3SZKzejfSNwAHG8U9/E+ioSj0t/EFa9n3Byt2F/yUsP
# F6c947AEYe7/EZfH9IY+Cvo+XPmT5jR62RRr55yzhaCCenavcZDX7P0N+pxs+t+w
# gvQUfvm+xKYvT3+Zf7X8Z0NyvQwA1onrayzT7Y+YHBSrfuXjbvzYqOSSJNpDa2K4
# Vf3qwbxstovzDo2a5JtsaZn4eEgwRdWt4Q08RWD8MpZRJ7xnw8outmvqRsfHIKCx
# H2XeSAi6pE6p8oNGN4Tr6MyBSENnTnIqm1y9TBsoilwie7SrmNnu4FGDwwlGTm0+
# mfqVF9p8M1dBPI1R7Qu2XK8sYxrfV8g/vOldxJuvRZnio1oktLqpVj3Pb6r/SVi+
# 8Kj/9Lit6Tf7urj0Czr56ENCHonYhMsT8dm74YlguIwoVqwUHZwK53Hrzw7dPamW
# oUi9PPevtQ0iTMARgexWO/bTouJbt7IEIlKVgJNp6I5MZfGRAy1wdALqi2cVKWlS
# ArvX31BqVUa/oKMoYX9w0MOiqiwhqkfOKJwGRXa/ghgntNWutMtQ5mv0TIZxMOmm
# 3xaG4Nj/QN370EKIf6MzOi5cHkERgWPOGHFrK+ymircxXDpqR+DDeVnWIBqv8mqY
# qnK8V0rSS527EPywTEHl7R09XiidnMy/s1Hap0flhFMCAwEAAaNCMEAwHQYDVR0O
# BBYEFLuvfgI9+qbxPISOre44mOzZMjLUMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
# Af8EBTADAQH/MA0GCSqGSIb3DQEBDAUAA4ICAQAK8dVGhLeuUbtssk1BFACTTJzL
# 5cBUz6AljgL5/bCiDfUgmDwTLaxWorDWfhGS6S66ni6acrG9GURsYTWimrQWEmla
# jOHXPqQa6C8D9K5hHRAbKqSLesX+BabhwNbI/p6ujyu6PZn42HMJWEZuppz01yfT
# ldo3g3Ic03PgokeZAzhd1Ul5ACkcx+ybIBwHJGlXeLI5/DqEoLWcfI2/LpNiJ7c5
# 2hcYrr08CWj/hJs81dYLA+NXnhT30etPyL2HI7e2SUN5hVy665ILocboaKhMFrEa
# mQroUyySu6EJGHUMZah7yyO3GsIohcMb/9ArYu+kewmRmGeMFAHNaAZqYyF1A4CI
# im6BxoXyqaQt5/SlJBBHg8rN9I15WLEGm+caKtmdAdeUfe0DSsrw2+ipAT71VpnJ
# Ho5JPbvlCbngT0mSPRaCQMzMWcbmOu0SLmk8bJWx/aode3+Gvh4OMkb7+xOPdX9M
# i0tGY/4ANEBwwcO5od2mcOIEs0G86YCR6mSceuEiA6mcbm8OZU9sh4de826g+XWl
# m0DoU7InnUq5wHchjf+H8t68jO8X37dJC9HybjALGg5Odu0R/PXpVrJ9v8dtCpOM
# pdDAth2+Ok6UotdubAvCinz6IPPE5OXNDajLkZKxfIXstRRpZg6C583OyC2mUX8h
# wTVThQZKXZ+tuxtfdDCCBeAwggPIoAMCAQICEC58h8wOk0pS/pT9HLfNNK8wDQYJ
# KoZIhvcNAQEMBQAwgYUxCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1h
# bmNoZXN0ZXIxEDAOBgNVBAcTB1NhbGZvcmQxGjAYBgNVBAoTEUNPTU9ETyBDQSBM
# aW1pdGVkMSswKQYDVQQDEyJDT01PRE8gUlNBIENlcnRpZmljYXRpb24gQXV0aG9y
# aXR5MB4XDTEzMDUwOTAwMDAwMFoXDTI4MDUwODIzNTk1OVowfTELMAkGA1UEBhMC
# R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9y
# ZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAhBgNVBAMTGkNPTU9ETyBS
# U0EgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
# AQEAppiQY3eRNH+K0d3pZzER68we/TEds7liVz+TvFvjnx4kMhEna7xRkafPnp4l
# s1+BqBgPHR4gMA77YXuGCbPj/aJonRwsnb9y4+R1oOU1I47Jiu4aDGTH2EKhe7VS
# A0s6sI4jS0tj4CKUN3vVeZAKFBhRLOb+wRLwHD9hYQqMotz2wzCqzSgYdUjBeVoI
# zbuMVYz31HaQOjNGUHOYXPSFSmsPgN1e1r39qS/AJfX5eNeNXxDCRFU8kDwxRstw
# rgepCuOvwQFvkBoj4l8428YIXUezg0HwLgA3FLkSqnmSUs2HD3vYYimkfjC9G7WM
# crRI8uPoIfleTGJ5iwIGn3/VCwIDAQABo4IBUTCCAU0wHwYDVR0jBBgwFoAUu69+
# Aj36pvE8hI6t7jiY7NkyMtQwHQYDVR0OBBYEFCmRYP+KTfrr+aZquM/55ku9Sc4S
# MA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1UdJQQMMAoG
# CCsGAQUFBwMDMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGgP6A9hjto
# dHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FDZXJ0aWZpY2F0aW9uQXV0
# aG9yaXR5LmNybDBxBggrBgEFBQcBAQRlMGMwOwYIKwYBBQUHMAKGL2h0dHA6Ly9j
# cnQuY29tb2RvY2EuY29tL0NPTU9ET1JTQUFkZFRydXN0Q0EuY3J0MCQGCCsGAQUF
# BzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQEMBQADggIB
# AAI/AjnD7vjKO4neDG1NsfFOkk+vwjgsBMzFYxGrCWOvq6LXAj/MbxnDPdYaCJT/
# JdipiKcrEBrgm7EHIhpRHDrU4ekJv+YkdK8eexYxbiPvVFEtUgLidQgFTPG3UeFR
# AMaH9mzuEER2V2rx31hrIapJ1Hw3Tr3/tnVUQBg2V2cRzU8C5P7z2vx1F9vst/dl
# CSNJH0NXg+p+IHdhyE3yu2VNqPeFRQevemknZZApQIvfezpROYyoH3B5rW1CIKLP
# DGwDjEzNcweU51qOOgS6oqF8H8tjOhWn1BUbp1JHMqn0v2RH0aofU04yMHPCb7d4
# gp1c/0a7ayIdiAv4G6o0pvyM9d1/ZYyMMVcx0DbsR6HPy4uo7xwYWMUGd8pLm1Gv
# TAhKeo/io1Lijo7MJuSy2OU4wqjtxoGcNWupWGFKCpe0S0K2VZ2+medwbVn4bSoM
# fxlgXwyaiGwwrFIJkBYb/yud29AgyonqKH4yjhnfe0gzHtdl+K7J+IMUk3Z9ZNCO
# zr41ff9yMU2fnr0ebC+ojwwGUPuMJ7N2yfTm18M04oyHIYZh/r9VdOEhdwMKaGy7
# 5Mmp5s9ZJet87EUOeWZo6CLNuO+YhU2WETwJitB/vCgoE/tqylSNklzNwmWYBp7O
# SFvUtTeTRkF8B93P+kPvumdh/31J4LswfVyA4+YWOUunMYIE2TCCBNUCAQEwgZEw
# fTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
# A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAhBgNV
# BAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBAhAW1PdTHZsYJ0/yJnM0UYBc
# MAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MCMGCSqGSIb3DQEJBDEWBBSPV1r+seg+naqWvFtsDm6RZqc4nDANBgkqhkiG9w0B
# AQEFAASCAQBy+wM/IFWeXsV27SO8gH0gyxJTuuSLGvI5pfTuF89lp9E344DEo4nf
# 88SFbaMwuHi4truXsSZnirzFnqXLqVi/qLar5KZPfHWJoGKNzawQH2aA2synRNbA
# hLVmKjZwRl0r9lkGaqWu7l6f+nnrI6Sc8r14YwkACZbzLPVI+ZbqBxP0BYzLEXEQ
# g8bCr6j7fS6oK2JbeWvwRfOO1q/SYKDwRRwPasUsOcftCA5OwoT8fKmAat+qqsRN
# +yzRep90NqGnKCIW/yYjupM39aeGyRflsx7LaAmeZk5Xo8ZL4eYTDg/riqNQce1X
# 87EZRnkYIX/Atdk6V1z2OtJMG6ofFsJ0oYICojCCAp4GCSqGSIb3DQEJBjGCAo8w
# ggKLAgEBMGgwUjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
# c2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzICEhEh
# BqCB0z/YeuWCTMFrUglOAzAJBgUrDgMCGgUAoIH9MBgGCSqGSIb3DQEJAzELBgkq
# hkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE1MTIxMTEyMjUzM1owIwYJKoZIhvcN
# AQkEMRYEFCAHoh2qOQmktO1XHJfgsKwxmCWmMIGdBgsqhkiG9w0BCRACDDGBjTCB
# ijCBhzCBhAQUs2MItNTN7U/PvWa5Vfrjv7EsKeYwbDBWpFQwUjELMAkGA1UEBhMC
# QkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKDAmBgNVBAMTH0dsb2JhbFNp
# Z24gVGltZXN0YW1waW5nIENBIC0gRzICEhEhBqCB0z/YeuWCTMFrUglOAzANBgkq
# hkiG9w0BAQEFAASCAQBhWJqfvD/XUEgz7VTtzVGr0ppxshnDqQt61+Ythv9y2haW
# HZw48d0xmdmYCDN5iE8QtvTniP9HRc0t59JeTBjBz2YxZORuSMFnDjsYS7SLDHm6
# 8TEy5SCjf50B0/BN9pjn7tHy/mvEimoLfnmKdlJNK0scabo0TdZHHNafgY4Msmr/
# /flIjaKnL4uCdf4CVDKEtSa3CSmdoNieYmsdVk7dEuyKV8aaCHPohBtZl1o97qfc
# plOjH4uRqH4vAdu/4N+qtSbSQx+/ZztxTp9glVyFhAO9pZW2Mh09VR4OsjTM3Yew
# n5mGiDQUtY860xsceEOEuqHMvL65ONdZ0i2J/hUP
# SIG # End signature block
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment