Invoke-OffboardingCheck.ps1
|
<#
.SYNOPSIS Free, read-only Microsoft 365 offboarding check. Finds accounts that look like leavers and shows what they still hold. .DESCRIPTION When someone leaves, the license is usually the only thing anyone remembers to remove. The account often keeps its group memberships and a user mailbox that was never converted to shared, and nobody notices until an audit. This connects to Microsoft Graph with delegated, READ-ONLY scopes via device-code sign-in (nothing to register, no app, no secrets). It never writes, removes, or changes anything in your tenant, and it stores nothing. You act on the list yourself. For each account that looks like a leaver (disabled, or no activity for -InactiveDays) it reports: * whether it still holds a paid license, and which * how many groups it is still a member of * whether its mailbox is still a user mailbox rather than converted to shared Activity signal is chosen automatically, exactly as the license scan does it: directory sign-in activity when the tenant has Entra ID P1/P2, otherwise the Microsoft 365 usage reports. Disabled accounts are flagged on any tenant. What it deliberately does NOT do (that's the paid ServerBridge License Auditor): * mailbox size and archive detail, app role assignments, a formatted PDF, scheduled re-runs with drift tracking, and multi-tenant roll-up. See https://server-bridge.com/license-auditor.html .PARAMETER InactiveDays An account with no activity in this many days is treated as a possible leaver. Default 90. Range 1-3650. (The usage-report fallback resolves to the nearest supported window: 30, 90 or 180 days.) .PARAMETER OutputCsv Path for the CSV export. Default: .\offboarding-check_<tenant>_<date>.csv .PARAMETER IncludeGuests Include guest (external) users. Off by default. .PARAMETER PassThru Emit the finding objects to the pipeline in addition to the CSV. .EXAMPLE Invoke-OffboardingCheck .EXAMPLE Invoke-OffboardingCheck -InactiveDays 30 -OutputCsv C:\reports\leavers.csv .NOTES Requires the Microsoft Graph PowerShell SDK: Install-Module Microsoft.Graph -Scope CurrentUser Delegated scopes requested (all read-only), the same set the license scan uses: User.Read.All, Organization.Read.All, AuditLog.Read.All, Reports.Read.All The mailbox type comes from Microsoft's mailbox usage report, which lags a day or two and is unavailable when your tenant conceals user names in reports. Both cases are reported rather than guessed. Project: https://github.com/lbcrowe-del/ServerBridge-LicenseScan License: MIT #> [CmdletBinding()] param( [ValidateRange(1, 3650)] [int]$InactiveDays = 90, [string]$OutputCsv, [switch]$IncludeGuests, [switch]$PassThru ) # Shared helpers (sign-in, activity signal, CSV escaping) live in Invoke-LicenseScan.ps1 so there # is exactly one copy. Dot-sourcing it defines the functions without running a scan: that script # only runs its entry point when it is not dot-sourced. if (-not (Get-Command -Name Connect-ScanGraph -ErrorAction SilentlyContinue)) { $sharedPath = Join-Path $PSScriptRoot 'Invoke-LicenseScan.ps1' if (-not (Test-Path -LiteralPath $sharedPath)) { throw "Invoke-LicenseScan.ps1 must sit next to this script (it holds the shared sign-in and activity helpers)." } . $sharedPath } # --------------------------------------------------------------------------- # Pure, testable helpers (no Graph calls - safe to dot-source) # --------------------------------------------------------------------------- function Get-MailboxTypeLabel { <# Plain-English label for a mailbox recipient type from Microsoft's usage report. $null/empty means the report didn't cover this account (it lags a day or two). #> [CmdletBinding()] param([Parameter()][AllowNull()][AllowEmptyString()][string]$RecipientType) if ([string]::IsNullOrWhiteSpace($RecipientType)) { return 'unknown' } switch ($RecipientType.Trim().ToLower()) { 'usermailbox' { return 'user' } 'user' { return 'user' } 'sharedmailbox' { return 'shared' } 'shared' { return 'shared' } 'roommailbox' { return 'room' } 'room' { return 'room' } 'equipmentmailbox' { return 'equipment' } 'equipment' { return 'equipment' } default { return $RecipientType.Trim().ToLower() } } } function Get-OffboardingRow { <# Pure projection: given normalized user objects (DisplayName, UserPrincipalName, UserType, AccountEnabled, LastActivity, AssignedLicenses[].SkuId, GroupCount, MailboxType), a SkuId->PartNumber map and a cutoff, emit one row per leaver-looking account. No Graph, no I/O - unit-testable. An account is a possible leaver when disabled, OR (when an activity signal is available) when last activity is older than the cutoff or unknown. With no activity signal only disabled accounts are flagged, because everything else would be a guess. Unlike the license scan this emits ONE row per account, not one per license, because the unit of work when offboarding is the person. #> [CmdletBinding()] param( [Parameter(Mandatory)][AllowNull()][AllowEmptyCollection()][object[]]$Users, [Parameter(Mandatory)][hashtable]$SkuMap, [Parameter(Mandatory)][datetime]$Cutoff, [bool]$ActivitySignalAvailable = $true, [switch]$IncludeGuests ) foreach ($u in @($Users | Where-Object { $null -ne $_ })) { if (-not $IncludeGuests -and $u.UserType -eq 'Guest') { continue } $reason = $null if (-not $u.AccountEnabled) { $reason = 'disabled' } elseif ($ActivitySignalAvailable -and (Test-UserDormant -LastActivity $u.LastActivity -Cutoff $Cutoff)) { $reason = 'inactive' } if (-not $reason) { continue } $licenses = @() foreach ($lic in $u.AssignedLicenses) { $part = $SkuMap[$lic.SkuId] if (-not $part) { continue } if ((Get-SkuMonthlyPrice -PartNumber $part) -le 0) { continue } # free SKUs aren't worth reclaiming $licenses += $part } $mailboxType = if ($u.MailboxType) { $u.MailboxType } else { 'unknown' } $groupCount = if ($null -ne $u.GroupCount) { [int]$u.GroupCount } else { $null } $findings = @() if ($licenses.Count -gt 0) { $findings += 'still licensed' } if ($groupCount -gt 0) { $findings += 'still in groups' } if ($mailboxType -eq 'user') { $findings += 'mailbox not shared' } [pscustomobject]@{ DisplayName = $u.DisplayName UserPrincipalName = $u.UserPrincipalName UserType = $u.UserType AccountEnabled = $u.AccountEnabled Reason = $reason LastActivity = if ($u.LastActivity) { ([datetime]$u.LastActivity).ToString('yyyy-MM-dd') } else { 'never/unknown' } Licenses = ($licenses -join '; ') LicenseCount = $licenses.Count GroupCount = $groupCount MailboxType = $mailboxType Findings = ($findings -join '; ') } } } # --------------------------------------------------------------------------- # Graph I/O (kept in functions so tests can dot-source without a tenant) # --------------------------------------------------------------------------- function Get-MailboxTypeMap { <# Returns @{ ok=$bool; map=@{ upn(lower) -> recipient type label } }. Uses Microsoft's mailbox usage report, which is the only way to tell a user mailbox from a shared one without Exchange Online PowerShell. The v1.0 report has no Recipient Type column, so this uses the beta report - still under Reports.Read.All, no extra permission. ok=$false when the tenant conceals user names in reports (rows can't be matched to people) or the column is missing. The caller reports that rather than guessing. #> [CmdletBinding()] param() $uri = "https://graph.microsoft.com/beta/reports/getMailboxUsageDetail(period='D7')" $resp = Invoke-MgGraphRequest -Method GET -Uri $uri -OutputType HttpResponseMessage -ErrorAction Stop $csv = $resp.Content.ReadAsStringAsync().Result $rows = @($csv | ConvertFrom-Csv) if ($rows.Count -eq 0) { return @{ ok = $true; map = @{} } } if (-not ($rows[0].PSObject.Properties.Name -contains 'Recipient Type')) { return @{ ok = $false; map = @{} } } $map = @{} $sawUpn = $false foreach ($r in $rows) { $upn = $r.'User Principal Name' if (-not $upn) { continue } if ($upn -like '*@*') { $sawUpn = $true } $map[$upn.ToLower()] = Get-MailboxTypeLabel -RecipientType $r.'Recipient Type' } if (-not $sawUpn) { return @{ ok = $false; map = @{} } } return @{ ok = $true; map = $map } } function Get-GroupMembershipCount { <# Direct group/role memberships for one account, via /users/{id}/memberOf/$count. Needs only User.Read.All, which this module already requests. Returns $null when the count can't be read, so the caller can say "unknown" honestly instead of printing 0 and implying the account is clean. #> [CmdletBinding()] param([Parameter(Mandatory)][string]$UserId) try { $uri = "https://graph.microsoft.com/v1.0/users/$UserId/memberOf/`$count" $resp = Invoke-MgGraphRequest -Method GET -Uri $uri -Headers @{ ConsistencyLevel = 'eventual' } ` -OutputType HttpResponseMessage -ErrorAction Stop $text = $resp.Content.ReadAsStringAsync().Result $value = 0 if ([int]::TryParse(("$text").Trim(), [ref]$value)) { return $value } return $null } catch { Write-Verbose "memberOf count failed for $UserId : $($_.Exception.Message)" return $null } } function Invoke-OffboardingCheckMain { [CmdletBinding()] param( [int]$InactiveDays, [string]$OutputCsv, [switch]$IncludeGuests, [switch]$PassThru ) Write-Host '' Write-Host 'ServerBridge - Free M365 Offboarding Check (read-only)' -ForegroundColor Green Write-Host '-----------------------------------------------------' -ForegroundColor DarkGray if (-not (Test-GraphSdkPresent)) { return } if (-not (Connect-ScanGraph)) { return } try { $org = Get-MgOrganization -ErrorAction Stop $tenantName = ($org.DisplayName | Select-Object -First 1) Write-Host "Connected to: $tenantName (signed in as $((Get-MgContext).Account))" -ForegroundColor Green $skuMap = @{} foreach ($s in (Get-MgSubscribedSku -All -ErrorAction Stop)) { $skuMap[$s.SkuId] = $s.SkuPartNumber } $select = 'id,displayName,userPrincipalName,userType,accountEnabled,assignedLicenses' $rawUsers = Get-MgUser -All -Property $select -ErrorAction Stop } catch { Write-Host "Graph read failed: $($_.Exception.Message)" -ForegroundColor Red Write-Host 'Confirm you consented to User.Read.All, Organization.Read.All, AuditLog.Read.All and Reports.Read.All.' -ForegroundColor Yellow Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null return } $signal = Resolve-ActivityMap -InactiveDays $InactiveDays $activity = $signal.map $signalAvailable = $signal.available if (-not $signalAvailable) { Write-Host '' Write-Host 'PARTIAL CHECK: only disabled accounts can be judged without an activity signal.' -ForegroundColor Yellow } else { Write-Host "Looking for accounts inactive $InactiveDays+ days or disabled (via $($signal.signalName))..." -ForegroundColor Cyan } # Mailbox types: the only way to spot a mailbox nobody converted to shared. $mailboxMap = @{} try { $mb = Get-MailboxTypeMap if ($mb.ok) { $mailboxMap = $mb.map } else { Write-Host 'Mailbox types unavailable (user names are concealed in reports, or the report changed).' -ForegroundColor Yellow Write-Host 'Mailbox column will read "unknown".' -ForegroundColor DarkGray } } catch { Write-Host "Mailbox report unavailable: $($_.Exception.Message)" -ForegroundColor Yellow } # Narrow to leaver-looking accounts BEFORE the per-user group lookup: one Graph call each. $cutoff = (Get-Date).AddDays(-1 * $InactiveDays) $candidates = foreach ($u in $rawUsers) { $upnKey = if ($u.UserPrincipalName) { $u.UserPrincipalName.ToLower() } else { $null } $last = if ($upnKey) { $activity[$upnKey] } else { $null } $isCandidate = (-not $u.AccountEnabled) -or ($signalAvailable -and (Test-UserDormant -LastActivity $last -Cutoff $cutoff)) if (-not $isCandidate) { continue } if (-not $IncludeGuests -and $u.UserType -eq 'Guest') { continue } [pscustomobject]@{ Id = $u.Id DisplayName = $u.DisplayName UserPrincipalName = $u.UserPrincipalName UserType = $u.UserType AccountEnabled = $u.AccountEnabled AssignedLicenses = $u.AssignedLicenses LastActivity = $last MailboxType = if ($upnKey -and $mailboxMap.ContainsKey($upnKey)) { $mailboxMap[$upnKey] } else { 'unknown' } GroupCount = $null } } $candidates = @($candidates) if ($candidates.Count -gt 0) { Write-Host (" checking group membership for {0} account(s)..." -f $candidates.Count) -ForegroundColor DarkGray foreach ($c in $candidates) { $c.GroupCount = Get-GroupMembershipCount -UserId $c.Id } } $rows = @(Get-OffboardingRow -Users $candidates -SkuMap $skuMap -Cutoff $cutoff ` -ActivitySignalAvailable $signalAvailable -IncludeGuests:$IncludeGuests) Write-Host '' Write-Host 'Accounts to review' -ForegroundColor Green Write-Host '------------------' -ForegroundColor DarkGray if ($rows.Count -eq 0) { Write-Host ' Nothing to review - no leaver-looking accounts found.' -ForegroundColor Green } else { $rows | Sort-Object LicenseCount -Descending | Format-Table UserPrincipalName, Reason, Licenses, GroupCount, MailboxType -AutoSize } $stillLicensed = @($rows | Where-Object { $_.LicenseCount -gt 0 }).Count $notShared = @($rows | Where-Object { $_.MailboxType -eq 'user' }).Count Write-Host (" Accounts to review : {0:N0}" -f $rows.Count) -ForegroundColor White Write-Host (" Still holding licenses : {0:N0}" -f $stillLicensed) -ForegroundColor Yellow Write-Host (" Mailbox not shared : {0:N0}" -f $notShared) -ForegroundColor Yellow Write-Host '' if (-not $OutputCsv) { $safeTenant = ($tenantName -replace '[^\w]', '') $OutputCsv = Join-Path (Get-Location) ("offboarding-check_{0}_{1}.csv" -f $safeTenant, (Get-Date -Format 'yyyyMMdd')) } if ($rows.Count -gt 0) { $rows | Sort-Object LicenseCount -Descending | ForEach-Object { $row = $_.PSObject.Copy() foreach ($name in 'DisplayName', 'UserPrincipalName', 'UserType', 'Licenses', 'MailboxType', 'Findings') { $row.$name = ConvertTo-SafeCsvValue -Value $row.$name } $row } | Export-Csv -Path $OutputCsv -NoTypeInformation -Encoding UTF8 Write-Host 'Full list saved to:' -ForegroundColor Cyan Write-Host " $OutputCsv" -ForegroundColor White Write-Host '' } Write-Host 'Nothing was changed in your tenant. Review each account before acting.' -ForegroundColor DarkGray Write-Host 'A licensed shared mailbox under 50 GB without an archive usually needs no license.' -ForegroundColor DarkGray Write-Host '' Disconnect-MgGraph -ErrorAction SilentlyContinue | Out-Null if ($PassThru) { $rows } } # Run unless dot-sourced (e.g. by Pester tests, where InvocationName is '.'). if ($MyInvocation.InvocationName -ne '.') { Invoke-OffboardingCheckMain -InactiveDays $InactiveDays -OutputCsv $OutputCsv ` -IncludeGuests:$IncludeGuests -PassThru:$PassThru } # SIG # Begin signature block # MII2yAYJKoZIhvcNAQcCoII2uTCCNrUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAuTmN6d+OhbSWX # 4fGvAWuepA7sNzKJTXYnLIjTGV3kxKCCG2MwggXMMIIDtKADAgECAhBUmNLR1FsZ # lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu # dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy # MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv # c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo # b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD # Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH # or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD # PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV # qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70 # ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1 # vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3 # W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK # xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg # trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj # O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7 # swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE # AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ # T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn # LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c # Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF # xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx # AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8 # FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY # lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2 # 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY # uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al # GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk # ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggbBMIIEqaADAgECAhMzAAaJW8dB # dB4thrTTAAAABolbMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwOTE1MTYwNjE3WhcNMjYwOTE4 # MTYwNjE3WjCBgjELMAkGA1UEBhMCVVMxETAPBgNVBAgTCEtlbnR1Y2t5MRIwEAYD # VQQHEwlMZXhpbmd0b24xJTAjBgNVBAoTHExlZSBDcm93ZSBTb2Z0d2FyZSBTb2x1 # dGlvbnMxJTAjBgNVBAMTHExlZSBDcm93ZSBTb2Z0d2FyZSBTb2x1dGlvbnMwggGi # MA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCSd2o228mobihJsbTETtFQiSIC # 8UbmRzlNiSApgpG7cUd3Po8ivrlNphmBVqMexSQ8890yYs2Iqi27XypNC7eHrflt # PNl0g2q08orcJWWN3SoHlr8neihm6T7vUkygzJONHsuHSG1rip5A3VmtxdaNPaHn # TTP29w4wNv8RUUq8rUo1FEYJp1ns63YFDaqFitGIffnWvPyDIX5t/Lu9R8NFxXU+ # OYzRFPKC3Pi2eKnDBVdzAxzMWk5hNapcp57Ps9LIt/xKaM48DAwfjekjL0qIM7oy # KgxpJ6UrbyMATX+7Qhpw3GmMQZcwzGGPRGTOGqMHrqpOqIcHvPC0j9xYn/0xEBoC # JT+jCrdh7xt8aGafPcqxDg1ohPlqsdbZKoMSvtzCjoYOLi+/YXr2XvykYfWkWgwg # 3BaiXbjPsJUS6DPFhFnoz4vFcYrUfeBBmvN0s4FAbk4O27/6iMehA/Xpd5BGP5sX # PrXGFjyN/0psyna4yO+4EaFOkTDp72gIDMabIZkCAwEAAaOCAdUwggHRMAwGA1Ud # EwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAG # CCsGAQUFBwMDBhsrBgEEAYI3YfX3xXqCm/n9aIL52tE6goGumFEwHQYDVR0OBBYE # FJQn6rcAFckIFI60xdwIYMH3RYlqMB8GA1UdIwQYMBaAFGslQd77a3z9GIAKLX+P # dl2qcz24MGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFP # QyUyMENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJ # RCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBL # MEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQCx # D2ogYhKLISVDZbdmf9Cam9XrIk3dptSXa+J91tIlShUdV6M2lzL4f5bL+kIGpqRX # y6J1hWQdI+iexz38wG/xG+hkyiC2zRU+VrzKqHdrLR6qgPvb8z2M4wvgtfVEDsSX # GJiR3ZPIxclPxqfMB7wFS3lXiLgor9qshZjteVrfJep7i8SZnnEh6UzftKhFQ5Ou # mn9+iqypnP0IA7N4pdwBQX8Kb7caH7PzCbg+8w9z5T93PxEA2Z9UpLTANXGKR4Kr # LCBfoF0Wrot8K1TZh87peRCNvCapEAFFdJQJjoTFzavSuLPVuBcCWKlhaueZc4pL # kPIyxEhKnk3fXnhsezSbSMFxa0nAWidg/E0VtemcicCaaU/gAw74F4+u5RxZ/b1M # fjkYRNbpB/Kh5G418/z/4uCkAvnRCvRpdU8XizotUGyeXBJshkOoZHc5k7AfXEK+ # 1FUyIl4bv+JQuAZ0Q9WtzRagWH8/5o8YfFL326wzN5UWORBSTWeBRFfB5E0FzG4A # zzqMtyUksU9qNuvMx9nywO35QwauLcqeqXEsLRWS/WZAT3J0ByuFgcXgsJmlfy6i # yFzbC9DczsUlZuyEKFlB5Cqw+BtaO+ZJcjP6LtSA9QWGHGCIdfq8U2xUSNbIG0yu # IdRonMxAo0u+t/KswaU0zI0svOa1TmAGTXhQkH3+4jCCBygwggUQoAMCAQICEzMA # AAAWMZKNkgJle5oAAAAAABYwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9z # b2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYx # ODExMjlaFw0zMTAzMjYxODExMjlaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJp # ZmllZCBDUyBBT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC # AQDKVfrI2+gJMM/0bQ5OVKNdvOASzLbUUMvXuf+Vl7YGuofPaZHVo3gMHF5inT+G # MSpIcfIZ9qtXU1UG68ry8vNbQtOL4Nm30ifXpqI1+ByiAWLO1YT0WnzG7XPOuoTe # eWsNZv5FmjxCsReBZvyzyzCyXZbu1EQfJxWTH4ebUwtAiW9rqMf9eDj/wYhiEfNt # eJV3ZFeibD2ztCHr9JhFdd97XbnCHgQoTIqc02X5xlRKtUGBa++OtHBBjiJ/uwBn # zTkqu4FjpZjQeJtrmda+ur1CT2jflWIB/ypn7u7V9tvW9wJbJYt/H2EtJ0GONWxJ # Z7TEu8jWPindOO3lzPP7UtzS/mVDV94HucWaltmsra6zSG8BoEJ87IM8QSb7vfm/ # O41FhYkUv89WIj5ES2O4kxyiMSfe95CMivCuYrRP2hKvx7egPMrWgDDBkxMLgrKZ # O9hRNUMm8vk3w5b9SogHOyJVhxyFm8aFXfIxgqDF4S0g4bhbhnzljmSlCLlumMZc # XFGDjpF2tNoAu3VGFGYtHtTSNVKvZpgB3b4ynaoDkbPf+Wg4523jt4VneasBgZhC # 1srZI2NCnCBBfgjLq04pqEKAWEohyW2K29KSkkHvt5VaE1ac3Yt+oyiOzMS57tXw # QDJLGvLg/OXFO0VNvczDndfIfXYExB/ab2PuMSwd5VIBOwIDAQABo4IB3DCCAdgw # DgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRrJUHe # +2t8/RiACi1/j3ZdqnM9uDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcC # ARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRv # cnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYB # Af8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkw # ZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIw # MjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVy # aWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3 # DQEBDAUAA4ICAQAG1VBeVHTVRBljlcZD3IiMxwPyMjQyLNaEnVu5mODm2hRBJfH8 # GsBLATmrHAc8F47jmk5CnpUPiIguCbw6Z/KVj4Dsoiq228NSLMLewFfGMri7uwNG # LISC5ccp8vUdADDEIsS2dE+QI9OwkDpv3XuUD7d+hAgcLVcMOl1AsfEZtsZenhGv # SYUrm/FuLq0BqEGL9GXM5c+Ho9q8o+Vn/S+GWQN2y+gkRO15s0kI05nUpq/dOD4r # i9rgVs6tipEd0YZqGgD+CZNiaZWrDTOQbNPncd2F9qOsUa20miYruoT5PwJAaI+Q # QiTE2ZJeMJOkOpzhTUgqVMZwZidEUZKCqudaeQA08WwnkQMfKyHzaU8j48ULcU4h # UwvMsv7fSurOe9GAdRQCPvF8WcSK5oDHe8VVJM4tv6KKCm91HqLx9JamBgRI6R2S # fY3nu26EGznu0rCg/769z8xWm4PVcC2ZaL6VlKVqFp1NsN8YqMyf5t+bbGVb09no # FKcJG/UwyGlxRmQBlfeBUQx5/ytlzZzsEnhrJF9fTAfje8j3OdX5lEnePTFQLRlv # zZFBqUXnIeQKv3fHQjC9m2fo/Z01DII/qp3d8LhGVUW0BCG04fRwHJNH8iqqCG/q # ofMv+kym2AxBDnHzNgRjL60JOFiBgiurvLhYQNhB95KWojFA6shQnggkMTCCB54w # ggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzEL # MAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYG # A1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRp # ZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIw # MTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh # dGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmlu # ZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8Z # iCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1 # AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs # 076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV # +ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5 # +TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJ # s+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv # 9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5Vp # IVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWL # tr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8 # bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+ # qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8B # Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX # 9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w # GQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNV # HSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZz # aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw # SWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBB # dXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUF # BzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jv # c29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmlj # YXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9v # bmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUq # nv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4 # LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW # 8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9 # ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UE # auY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjin # MLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358Z # TFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgP # Cqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNS # yALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww # 94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1Z # OmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghq7MIIatwIBATBxMFoxCzAJ # BgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNV # BAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQCEzMABolbx0F0 # Hi2GtNMAAAAGiVswDQYJYIZIAWUDBAIBBQCggYQwGAYKKwYBBAGCNwIBDDEKMAig # AoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgEL # MQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQgs34oqFnmoU0q1NhF6PEA # pJAnsLAj92D3Hoqq2m0Ti60wDQYJKoZIhvcNAQEBBQAEggGATZx3V5kuT7q729Gn # z8bU51PWktATsyWcE7FJmIRYCsr03bXiQr2VwVhbnY7qd89u8fJnnTPpgxQcABVu # /P05oe9s85twm5RcNeVwH5V1dS4Fkn//bV+LSZAbnIS4fWzlpkAWGff3scrbbSaj # OOC9UgM3UkdRAh3hDrHpi9JD3MZ60m2lDyJbGowfRd4WUBszIMSRV7MrT5A5sFEe # 5hAXXkMlFONRdn47Fkr/4aDNKH265WoxYQKGumR/zAdzbauMI4W+fOJlkdrwcLUZ # L232rnkOHTl0LX4XhQlW+DyeycYgROwtt6DvOuul4QmjtsaLUYE7UymHG+1U6c8z # IxskfsxdcagovtbkVUKoVyU7aZ7HF8lDqvVlc5U+Qwkz8X6GGmhA3T4OiJFGozJC # t+ltHM298nSbbjFWsr10aAXIvWmVqrAlxwg7BYmecYWgQ7XyE+VnCn6f7K2U98Er # Tkal94U9mEWS+2xTpSCgNjED1DePPjwYpC+Cwgv7PwjuZLVdoYIYFDCCGBAGCisG # AQQBgjcDAwExghgAMIIX/AYJKoZIhvcNAQcCoIIX7TCCF+kCAQMxDzANBglghkgB # ZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJAgEBBgorBgEEAYRZ # CgMBMDEwDQYJYIZIAWUDBAIBBQAEIAatadBOZGW5KEug+YzEpPxQmpAvP/wbELuR # Tcueg7jMAgZqqTODBxcYEzIwMjYwOTE2MjMxMjU2Ljc4OFowBIACAfSggeGkgd4w # gdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT # HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg # VFNTIEVTTjpBNTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1Ymxp # YyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIHgjCCBWqgAwIBAgIT # MwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJV # UzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNy # b3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0 # aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQsw # CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD # VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMc # HtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsD # JP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM # 5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJU # PC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRo # AlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd # 1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQ # VeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2P # xF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm # 3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JB # fdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYy # zR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJ # KwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQG # A1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYI # KwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUw # AwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0w # ezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlm # aWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQw # gYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl # cnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUy # MENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEM # BQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y # 7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IG # G/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWd # QnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8 # y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g # 4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHA # v4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqL # wliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquO # YGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsn # o2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19o # EjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHlzCCBX+g # AwIBAgITMwAAAFZ+j51YCI7pYAAAAAAAVjANBgkqhkiG9w0BAQwFADBhMQswCQYD # VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD # EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0y # NTEwMjMyMDQ2NTFaFw0yNjEwMjIyMDQ2NTFaMIHbMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBP # cGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5 # NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcg # QXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtKWfm/ul # 027/d8Rlb8Mn/g0QUvvLqY2Vsy3tI8U2tFSspTZomZOD3BHT8LkR+RrhMJgb1VjA # KFNysaK9cLSXifPGSIBrPCgs9P4y24lrJEmrV6Q5z4BmqMhIPrZhEvZnWpCS4HO7 # jYSei/nxmC7/1Er+l5Lg3PmSxb8d2IVcARxSw1B4mxB6XI0nkel9wa1dYb2wfGpo # fraFmxZOxT9eNht4LH0RBSVueba6ZNpjS/0gtfm7qiIiyP6p6PRzTTbMnVqsHnV/ # d/rW0zHx+Q+QNZ5wUqKmTZJB9hU853+2pX5rDfK32uNY9/WBOAmzbqgpEdQkbiMa # vUMyUDShmycIvgHdQnS207sTj8M+kJL3tOdahPuPqMwsaCCgdfwwQx0O9TKe7FSv # bAEYs1AnldCl/KHGZCOVvUNqjyL10JLe0/+GD9/ynqXGWFpXOjaunvZ/cKROhjN4 # M5e6xx0b2miqcPii4/ii2ZheKallJET7CKlpFShs3wyg6F/fojQxQvPnbWD4Nyx6 # lhjWjwmoLcx6w1FSCtavLCly33BLRSlTU4qKUxaa8d7YN7Eqpn9XO0SY0umOvKFX # rWH7rxl+9iaicitdnTTksAnRjvekdKT3lg7lRMfmfZU8vXNiN0UYJzT9EjqjRm0u # N/h0oXxPhNfPYqeFbyPXGGxzaYUz6zx3qTcCAwEAAaOCAcswggHHMB0GA1UdDgQW # BBS+tjPyu6tZ/h5GsyLvyz1H+FNIWjAfBgNVHSMEGDAWgBRraSg6NS9IY0DPe9iv # Sek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3Rh # bXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggrBgEFBQcw # AoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv # ZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3J0 # MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/ # BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEW # M2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5 # Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAA4DqAXEsO26j/La7Fgn # /Qifit8xuZekqZ57+Ye+sH/hRTbEEjGYrZgsqwR/lUUfKCFpbZF8msaZPQJOR4YY # UEU8XyjLrn8Y1jCSmoxh9l7tWiSoc/JFBw356JAmzGGxeBA2EWSxRuTr1AuZe6nY # aN8/wtFkiHcs8gMadxXBs6DxVhyu5YnhLPQkfumKm3lFftwE7pieV7f1lskmlgsC # 6AeSGCzGPZUgCvcH5Tv/Qe9z7bIImSD3SuzhOIwaP+eKQTYf67TifyJKkWQSdGfT # A6Kcu41k8LB6oPK+MLk1jbxxK5wPqLSL62xjK04SBXHEJSEnsFt0zxWkxP/lgej1 # DxqUnmrYEdkxvzKSHIAqFWSZul/5hI+vJxvFPhsNQBEk4cSulDkJQpcdVi/gmf/m # HFOYhDBjsa15s4L+2sBil3XV/T8RiR66Q8xYvTLRWxd2dVsrOoCwnsU4WIeiC0Ji # nCv1WLHEh7Qyzr9RSr4kKJLWdpNYLhgjkojTmEkAjFO774t3xB7enbvIF0GOsV19 # xnCUzq9EGKyt0gMuaphKlNjJ+aTpjWMZDGo+GOKsnp93Hmftml0Syp3F9+M3y+y6 # WJGUZoIZJq227jDjjEndtpUrh9BdPdVIfVJD/Au81Rzh05UHAivorQ3Os8PELHIg # iOd9TWzbdgmGzcILt/ddVQERMYIHRjCCB0ICAQEweDBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFZ+j51YCI7p # YAAAAAAAVjANBglghkgBZQMEAgEFAKCCBJ8wEQYLKoZIhvcNAQkQAg8xAgUAMBoG # CSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjYwOTE2 # MjMxMjU2WjAvBgkqhkiG9w0BCQQxIgQgonqXovZK2NcWIiLiW9Wu0/wXgE2+uMMq # CBc2LaQyuYswgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGgBCC2DDMlTaTj8JV3 # iTg5Xnpe4CSH60143Z+X9o5NBgMMqDB8MGWkYzBhMQswCQYDVQQGEwJVUzEeMBwG # A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg # UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFZ+j51YCI7pYAAA # AAAAVjCCA2EGCyqGSIb3DQEJEAISMYIDUDCCA0yhggNIMIIDRDCCAiwCAQEwggEJ # oYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4G # A1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUw # IwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5u # U2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29m # dCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5oiMKAQEwBwYFKw4D # AhoDFQD/c/cpFSqQWYBeXggyRJ2ZbvYEEaBnMGWkYzBhMQswCQYDVQQGEwJVUzEe # MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv # ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDANBgkqhkiG9w0BAQsF # AAIFAO5VA4QwIhgPMjAyNjA5MTYxMjAxMDhaGA8yMDI2MDkxNzEyMDEwOFowdzA9 # BgorBgEEAYRZCgQBMS8wLTAKAgUA7lUDhAIBADAKAgEAAgIGNQIB/zAHAgEAAgIS # PDAKAgUA7lZVBAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZCgMCoAow # CAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQBWJ8RZ5Hw5 # zKCP+VbV+P72RbU2Ng/6+0iCyZVghoYWaHWWyPgvDrNEkJ45sVsQwmmRrf0dybSO # q529lRHh0vEtcgvodcesxBTQUAkTweRAmc1OVTgHyQQ26BouxGcJwIGDpWWjjHNF # HLVSL74jcbPVBbHMrfrpaowu3gNPBAZeZyk2NYVAM1vYm37i44oUKpnLZOAwoz6M # k+e+fZJb65jUeWevnVwK9o31ckn/q9pL5OGGWflm2HptvJ6/aEbGJ4ztFVdkPRqg # YADNia3gwEFgaSv/8mqmYw4FXxocAI5qbX6slHQq6cTgl3eVYPBkerYu419pUdQE # wMZmxJsrD1N2MA0GCSqGSIb3DQEBAQUABIICAFJ2Z5s3knkg9owwDxyIzbejj9oX # rT/ZBohQO9AB7bs2ScPCvsG/i52L6dzYlnFsF1HJcvyz39+mOLKa3hbJDGkJqd8g # YwqXYqJGuQfLrKhUdo+Zvpv9CldCNauN7GttdrQr5iISpxnP8FbAue7qCIqVUy2T # DKNpSTuZr8atiz8Au8OaZKjMGqYs/85jb6RuhHKNFDCk60x2oNjvB5H8Ics6IHXV # FUK8pzhcAV9zHnOmC8dz86HxktoYDcDdCP23Y0//90EyOi6al6jsu5Q2usUE8ip1 # Oi5YVmnYjVAntIb/5/DG0CzEc04QgvQ4gxtuWbHRH3Skvykegrfqe9SafY6UhFrj # h8dIL6NPlaFLRweAixR83PSXQYqqVQDjMTWGEfVtvZReWSc4MsQNWBVd7by6sLv7 # TZ0IWhER3MeKLOKOtiY3GBmMGQRE316A6I58YMfWYmqC0H3cnNRvx5BmBUJZzb28 # 8cDddAbJkMOKdnMYFtJX/hJSntcbxeTHh/2FXg3X4DHIVvwOD7jO5FMgJbjFELy2 # K/IOo6TlU9NlcBETKm3zRRmZfWx7PcoxMMgMrqRn6qhtgrP8OyzdMr1n3dj2gT/X # SkT5y1nWIlx2zanF2naCB70hYLiGiLcu4aS4hmXnzu4mGoAMG1cBhgx5f3bTPrRI # Tt4Yl5D2avKLKBS5 # SIG # End signature block |