DSInternals.Passkeys.psm1

# Load PS host-specific assemblies
if ($PSVersionTable.PSVersion.Major -ge 6) {
    # PowerShell Core
    Add-Type -Path "$PSScriptRoot/net6.0/DSInternals.Win32.WebAuthn.dll" -ErrorAction Stop
}
else {
    # PowerShell Desktop
    Add-Type -Path "$PSScriptRoot/net48/DSInternals.Win32.WebAuthn.dll" -ErrorAction Stop
}

# Needed for [Microsoft.Graph.PowerShell.Models.MicrosoftGraphFido2AuthenticationMethod] type
Import-Module -Name Microsoft.Graph.Identity.SignIns -ErrorAction Stop

<#
.SYNOPSIS
Retrieves creation options required to generate and register a Microsoft Entra ID-compatible passkey.
 
.PARAMETER UserId
The unique identifier of user.
 
.PARAMETER ChallengeTimeout
Overrides the timeout of the server-generated challenge returned in the request.
The default value is 5 minutes, with the accepted range being between 5 minutes and 30 days.
 
.EXAMPLE
PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All'
PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com'
 
.EXAMPLE
PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All'
PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' -ChallengeTimeout (New-TimeSpan -Minutes 10)
 
.NOTES
Self-service operations aren't supported.
More info at https://learn.microsoft.com/en-us/graph/api/fido2authenticationmethod-creationoptions
 
#>

function Get-PasskeyRegistrationOptions
{
    [CmdletBinding()]
    [OutputType([DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions])]
    param(
        [Parameter(Mandatory = $true)]
        [Alias('User')]
        [string] $UserId,

        [Parameter(Mandatory = $false)]
        [Alias('Timeout')]
        [timespan] $ChallengeTimeout = (New-TimeSpan -Minutes 5)
    )
    try {
        # Generate the user-specific URL, e.g., https://graph.microsoft.com/beta/users/af4cf208-16e0-429d-b574-2a09c5f30dea/authentication/fido2Methods/creationOptions
        [string] $credentialOptionsUrl = '/beta/users/{0}/authentication/fido2Methods/creationOptions' -f [uri]::EscapeDataString($UserId)

        [string] $response = Invoke-MgGraphRequest -Method GET `
                                                   -Uri $credentialOptionsUrl `
                                                   -Body @{ challengeTimeoutInMinutes = $ChallengeTimeout.TotalMinutes } `
                                                   -OutputType Json

        # Parse JSON response
        return [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions]::Create($response)
    }
    catch {
        # TODO: PS Error Record ($PSCmdlet.ThrowTerminatingError())
        throw
    }
}

<#
.SYNOPSIS
Registers a new passkey in Microsoft Entra ID.
 
.PARAMETER UserId
The unique identifier of user.
 
.PARAMETER Passkey
The passkey to be registered.
 
.PARAMETER DisplayName
Custom name given to the registered passkey.
 
.PARAMETER ChallengeTimeout
Overrides the timeout of the server-generated challenge returned in the request.
The default value is 5 minutes, with the accepted range being between 5 minutes and 30 days.
 
.EXAMPLE
PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All'
PS \> Register-Passkey -UserId 'AdeleV@contoso.com' -DisplayName 'YubiKey 5 Nano'
 
.EXAMPLE
PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All'
PS \> Register-Passkey -UserId 'AdeleV@contoso.com' -DisplayName 'YubiKey 5 Nano' -ChallengeTimeout (New-TimeSpan -Minutes 10)
 
.EXAMPLE
PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All'
PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' | New-Passkey -DisplayName 'YubiKey 5 Nano' | Register-Passkey -UserId 'AdeleV@contoso.com'
 
.NOTES
More info at https://learn.microsoft.com/en-us/graph/api/authentication-post-fido2methods
 
#>

function Register-Passkey
{
    [CmdletBinding(DefaultParameterSetName = 'New')]
    [OutputType([Microsoft.Graph.PowerShell.Models.MicrosoftGraphFido2AuthenticationMethod])]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'Existing')]
        [Parameter(Mandatory = $true, ParameterSetName = 'New')]
        [Alias('User')]
        [string] $UserId,

        [Parameter(Mandatory = $true, ParameterSetName = 'Existing', ValueFromPipeline = $true)]
        [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse]
        $Passkey,

        [Parameter(Mandatory = $true, ParameterSetName = 'New')]
        [string] $DisplayName,

        [Parameter(Mandatory = $false, ParameterSetName = 'New')]
        [Alias('Timeout')]
        [timespan] $ChallengeTimeout = (New-TimeSpan -Minutes 5)
    )
    process
    {
        # TODO: Write-Error
        switch ($PSCmdlet.ParameterSetName) {
            'Existing' {
                # Generate the user-specific URL, e.g., https://graph.microsoft.com/beta/users/af4cf208-16e0-429d-b574-2a09c5f30dea/authentication/fido2Methods
                [string] $registrationUrl = '/beta/users/{0}/authentication/fido2Methods' -f [uri]::EscapeDataString($UserId)

                [string] $response = Invoke-MgGraphRequest `
                                        -Method POST `
                                        -Uri $registrationUrl `
                                        -OutputType Json `
                                        -ContentType 'application/json' `
                                        -Body $Passkey.ToString()

                return [Microsoft.Graph.PowerShell.Models.MicrosoftGraphFido2AuthenticationMethod]::FromJsonString($response)
            }
            'New' {
                [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions] $registrationOptions =
                    Get-PasskeyRegistrationOptions -UserId $UserId -ChallengeTimeout $ChallengeTimeout

                [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse] $passkey =
                    New-Passkey -Options $registrationOptions -DisplayName $DisplayName

                # Recursive call with the 'Existing' parameter set
                return Register-Passkey -UserId $UserId -Passkey $passkey
            }
        }
    }
}

<#
.SYNOPSIS
Creates a new Microsoft Entra ID-compatible passkey.
 
.PARAMETER Options
Options required to generate a Microsoft Entra ID-compatible passkey.
 
.PARAMETER DisplayName
Custom name given to the registered passkey.
 
.EXAMPLE
PS \> Connect-MgGraph -Scopes 'UserAuthenticationMethod.ReadWrite.All'
PS \> Get-PasskeyRegistrationOptions -UserId 'AdeleV@contoso.com' | New-Passkey -DisplayName 'YubiKey 5 Nano' | Register-Passkey -UserId 'AdeleV@contoso.com'
 
#>

function New-Passkey
{
    [CmdletBinding()]
    [OutputType([DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse])]
    param(
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnCredentialCreationOptions]
        $Options,

        [Parameter(Mandatory = $true)]
        [string] $DisplayName
    )

    process
    {
        try {
            [DSInternals.Win32.WebAuthn.WebAuthnApi] $api = [DSInternals.Win32.WebAuthn.WebAuthnApi]::new()
            [DSInternals.Win32.WebAuthn.PublicKeyCredential] $credential = $api.AuthenticatorMakeCredential($Options.PublicKeyOptions)
            return [DSInternals.Win32.WebAuthn.MicrosoftGraphWebauthnAttestationResponse]::new($credential, $DisplayName)
        }
        catch {
            # TODO: PS Error Record (Write-Error)
            throw
        }
    }
}

New-Alias -Name Register-MgUserAuthenticationFido2Method -Value Register-Passkey

Export-ModuleMember -Function 'Get-PasskeyRegistrationOptions','New-Passkey','Register-Passkey' `
                    -Alias 'Register-MgUserAuthenticationFido2Method'

# SIG # Begin signature block
# MIIzsgYJKoZIhvcNAQcCoIIzozCCM58CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCA+3c//bO8zbBTO
# NwxQEWZ2ydAHpihOYFMdI+ClzxjqNaCCG68wggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggbbMIIEw6ADAgECAhMzAAJkjMsg
# mbnXW/L3AAAAAmSMMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDIwHhcNMjUwMTE2MDkwMjEyWhcNMjUwMTE5
# MDkwMjEyWjBYMQswCQYDVQQGEwJDWjEPMA0GA1UEBxMGUHJhZ3VlMRswGQYDVQQK
# ExJNaWNoYWVsIEdyYWZuZXR0ZXIxGzAZBgNVBAMTEk1pY2hhZWwgR3JhZm5ldHRl
# cjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAI0pHXI1mwaOh9dk4tRs
# fYgpvXrWHcoeO/wl5qFkbwdow9u0vvJA4HQCkVsu/8dS6uzOx+lVN5gCusXBS3d/
# 4AYChtRiCNDU4j2ji7SlhTIpirxNq871sDKQyifkBqvQ62yOxo0y38vXSSAwrn4h
# R+0WshvyFmluf13Yv1yxRGWz7aUCYsxD4Fv7cnh5sZ+BdRepv+1nZ+40sNT84D4/
# M77urP6ZF7plset/+8CJp5al75ArVk43ZNg+pU15FVh2VtNzyxzueSSw5eSLONfM
# 1ObQfQSE3R2A23V1FuelZptlOy8IYM8WTQYNkt5ngIscm+EzJo0blf6cR+aEdCVM
# H1aC7KYcebK106aiFniYUgr2OnbHeYX2yUuNqyV4+K2O1lTrdpiuQOtf2eIaDabl
# PNkDckvux2A2Piwt/VON+RXqDfavJM2jalPe0Q7OlQo26izRqTKZLaV4ptzrOktu
# AoInXSlF0YT7nlcEUtjwbBhu3ULP9A7ZAZxsKtT+iliSDQIDAQABo4ICGjCCAhYw
# DAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwPQYDVR0lBDYwNAYKKwYBBAGC
# N2EBAAYIKwYBBQUHAwMGHCsGAQQBgjdhgpT9t0iDj4fVMIOWt5ISgY3cy3wwHQYD
# VR0OBBYEFJN50iPkNNhMsHspt3B99QimBjH0MB8GA1UdIwQYMBaAFCRFmaF3kCp8
# w8qDsG5kFoQq+CxnMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBD
# UyUyMEFPQyUyMENBJTIwMDIuY3JsMIGlBggrBgEFBQcBAQSBmDCBlTBkBggrBgEF
# BQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNy
# b3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAyLmNydDAt
# BggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMGYG
# A1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAIBgZn
# gQwBBAEwDQYJKoZIhvcNAQEMBQADggIBADWxgDGraayhGhpO/rVtIs3mQ7ZrKmsG
# A0njH2n4pWGZbtgGBPbrVn9/7ygRG171TUE8CKnezwsiK31o4ynAnh3rjKfnPoh3
# YtGu4BC8bOjY0ykv8qu4UdSVpwGceBLYX3p9EtDkuzu55JxwNbrAkgkbUH3k5EuV
# FjOMdf1J+gT6PkXmhtmAg0cGNt71834Uqr5xOHvE3rStudP7BWQJKJdNacLYIdL8
# iW0bL4A25mGTrieA4ZFXHrfBg1Eu3dOhyRpd8+lKIzg5KRxG0d7SpFHZEwJYAyVp
# aMEmzfq8QCv4aA9cDrIJaHIA0FfIOo1w6vEQ9OISbiDgO/hFGn6VuqLrl3gdiAxV
# bBZCE+XzgLY0XbIhv7MC5XDWNrhMuTIcBlcLaN7Jkqs9aidPmh3oavEPRwpsDbu9
# r6FOLmKbeLhSZDA05HLiUC/UF4rm/hST2nsaIKVyHPM9OH2kuxkTbB7K3jZtmntL
# 1E5fN+seHYxYLH0e7/iSyrbJeTnktzldkPMdZHGTtwcYuhr0tpJ9UneB+XfL6evW
# 3SoZw9qOgMRX/OabKzIF1QIQ/sXQ5526aafeUgjl7OK/6mnYGfMmp3N/6SacAWds
# G3srwa2nne36AZktqrTvOYtC61eApglkVfdfNij4KlUlLAOqDTf+A6F7CZ/m3cG4
# rHgN2CkCECKKMIIHWjCCBUKgAwIBAgITMwAAAASWUEvS2+7LiAAAAAAABDANBgkq
# hkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBT
# aWduaW5nIFBDQSAyMDIxMB4XDTIxMDQxMzE3MzE1MloXDTI2MDQxMzE3MzE1Mlow
# WjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEr
# MCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEFPQyBDQSAwMjCCAiIw
# DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOHOoOgzomOmwDsAj2wZUBdrY6N3
# JFGbmm+WaKzJ0aeKzpsGQ4k2yKcxZGf5PJOIrwSVdcOf2/6MpCPnlwKmmsTHcgDt
# DKHZxFuyJ30Pq05MpBMx8UWwjYOig7E52HP2HS+yCIiZYvJOdbqWhyy+wmJvWDXN
# EhWL5WhY9jtB4zvcvzUZnFjY2pmTpUY8VtnFoFLFHWs0h4EQnpPO1dmzP9e2/qPF
# l1FvdSKYIEWrJomeuVhBR1ym8oZti24QSumVpkKBXhPhlqylghiv6v+EYk2jDYR1
# 1r1r/v/yOfFLTsVYtw2itX0OmC8iCBh8w+AprXKxor8bqav3K6x7pxjQe//0Jrpd
# mT/R3DpmP2qbYFJ8E/ttIPwN+4g37rlcOskti6NP5Kf42/ifLxOBTKiIsMRgci+P
# NjzFQQt6nfzWxUGvDJo+np7FPhxKr/Wq/gG3CsLpm2aiSSpkKxmkjXVn5NjaHYHF
# jpqu48oW8cGTo5y49P28J7FDXDQHtPb/qoqM8kEHrPAN1Fz3EUG/BvnNMmjtiAon
# 1kyu8krslCfPJNZrTdtgjX7W44rYgHmn6GfVZoZ+UX2/kvyuWq1b03C7pLeT3Uw0
# MZeeexCBOgPulxQaXbIzs5C83RIexC5PD1TzI0HzwoCrSfOHNe33dgvfqcRdZREF
# BV2P2LQi/jZrPXFlAgMBAAGjggIOMIICCjAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYB
# BAGCNxUBBAMCAQAwHQYDVR0OBBYEFCRFmaF3kCp8w8qDsG5kFoQq+CxnMFQGA1Ud
# IARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAwe
# CgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBTZQSmw
# Dw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBnMGWgY6Bhhl9odHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVk
# JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNybDCBrgYIKwYBBQUHAQEE
# gaEwgZ4wbQYIKwYBBQUHMAKGYWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv
# cHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWdu
# aW5nJTIwUENBJTIwMjAyMS5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3Nw
# Lm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAZy04XZWzDSKJ
# HSrc0mvIqPqRDveQnN1TsmP4ULCCHHTMpNoSTsy7fzNVl30MhJQ5P0Lci81+t03T
# m+SfpzvLdKc88Iu2WLzIjairwEDudLDDiZ9094Qj6acTTYaBhVcc9lMokOG9rzq3
# LCyvUzhBV1m1DCTm0fTzNMGbAASIbuJOlVS8RA3tBknkF/2ROzx304OOC7n7eCCq
# mJp79QrqLKd4JRWLFXoC5zFmVGfFLTvRfEAogKLiWIS+TpQpLIA2/b3vx0ISxZ3p
# X4OnULmyBbKgfSJQqJ2CiWfx2jGb2LQO8vRDkSuHMZb03rQlwB2soklx9LnhP0/d
# sFRtHLL+VXVMo+sla5ttr5SmAJFyDSrwzgfPrOIfk4EoZVGtgArthVp+yc5U0m6Z
# NCBPERLmJpLshPwU5JPd1gzMez8C55+CfuX5L2440NPDnsH6TIYfErj3UCqpmeNC
# OFtlMiSjDE23rdeiRYpkqgwoYJwgepcJaXtIH26Pe1O6a6W3wSqegdpNn+2Pk41q
# 0GDfjnXDzskAHcRhjwcCUmiRt6IXZJQsYACeWpwsXmJe0o0ORLmumrYyHlYTdCnz
# yxT6WM+QkFPiQth+/ceHfzumDhUfWmHuePwhrqe3UVCHy0r9f49Az3OhJX92MlsZ
# aFo/MnmN5B62RWgJUTMIQF8j0N6xF/cwggeeMIIFhqADAgECAhMzAAAAB4ejNKN7
# pY4cAAAAAAAHMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMTA0MDEyMDA1MjBaFw0zNjA0MDEyMDE1MjBaMGMxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xNDAyBgNVBAMTK01pY3Jv
# c29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25pbmcgUENBIDIwMjEwggIiMA0GCSqG
# SIb3DQEBAQUAA4ICDwAwggIKAoICAQCy8MCvGYgo4t1UekxJbGkIVQm0Uv96SvjB
# 6yUo92cXdylN65Xy96q2YpWCiTas7QPTkGnK9QMKDXB2ygS27EAIQZyAd+M8X+dm
# w6SDtzSZXyGkxP8a8Hi6EO9Zcwh5A+wOALNQbNO+iLvpgOnEM7GGB/wm5dYnMEOg
# uua1OFfTUITVMIK8faxkP/4fPdEPCXYyy8NJ1fmskNhW5HduNqPZB/NkWbB9xxMq
# owAeWvPgHtpzyD3PLGVOmRO4ka0WcsEZqyg6efk3JiV/TEX39uNVGjgbODZhzspH
# vKFNU2K5MYfmHh4H1qObU4JKEjKGsqqA6RziybPqhvE74fEp4n1tiY9/ootdU0vP
# xRp4BGjQFq28nzawuvaCqUUF2PWxh+o5/TRCb/cHhcYU8Mr8fTiS15kRmwFFzdVP
# Z3+JV3s5MulIf3II5FXeghlAH9CvicPhhP+VaSFW3Da/azROdEm5sv+EUwhBrzqt
# xoYyE2wmuHKws00x4GGIx7NTWznOm6x/niqVi7a/mxnnMvQq8EMse0vwX2CfqM7L
# e/smbRtsEeOtbnJBbtLfoAsC3TdAOnBbUkbUfG78VRclsE7YDDBUbgWt75lDk53y
# i7C3n0WkHFU4EZ83i83abd9nHWCqfnYa9qIHPqjOiuAgSOf4+FRcguEBXlD9mAIn
# S7b6V0UaNwIDAQABo4ICNTCCAjEwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcV
# AQQDAgEAMB0GA1UdDgQWBBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBUBgNVHSAETTBL
# MEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t
# L3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1
# AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQH
# J89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0
# aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmww
# gcMGCCsGAQUFBwEBBIG2MIGzMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNy
# b3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZl
# cmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIw
# MjAuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29t
# L29jc3AwDQYJKoZIhvcNAQEMBQADggIBAH8lKp7+1Kvq3WYK21cjTLpebJDjW4Zb
# OX3HD5ZiG84vjsFXT0OB+eb+1TiJ55ns0BHluC6itMI2vnwc5wDW1ywdCq3TAmx0
# KWy7xulAP179qX6VSBNQkRXzReFyjvF2BGt6FvKFR/imR4CEESMAG8hSkPYso+Gj
# lngM8JPn/ROUrTaeU/BRu/1RFESFVgK2wMz7fU4VTd8NXwGZBe/mFPZG6tWwkdmA
# /jLbp0kNUX7elxu2+HtHo0QO5gdiKF+YTYd1BGrmNG8sTURvn09jAhIUJfYNotn7
# OlThtfQjXqe0qrimgY4Vpoq2MgDW9ESUi1o4pzC1zTgIGtdJ/IvY6nqa80jFOTg5
# qzAiRNdsUvzVkoYP7bi4wLCj+ks2GftUct+fGUxXMdBUv5sdr0qFPLPB0b8vq516
# slCfRwaktAxK1S40MCvFbbAXXpAZnU20FaAoDwqq/jwzwd8Wo2J83r7O3onQbDO9
# TyDStgaBNlHzMMQgl95nHBYMelLEHkUnVVVTUsgC0Huj09duNfMaJ9ogxhPNThgq
# 3i8w3DAGZ61AMeF0C1M+mU5eucj1Ijod5O2MMPeJQ3/vKBtqGZg4eTtUHt/BPjN7
# 4SsJsyHqAdXVS5c+ItyKWg3Eforhox9k3WgtWTpgV4gkSiS4+A09roSdOI4vrRw+
# p+fL4WrxSK5nMYIXWTCCF1UCAQEwcTBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVy
# aWZpZWQgQ1MgQU9DIENBIDAyAhMzAAJkjMsgmbnXW/L3AAAAAmSMMA0GCWCGSAFl
# AwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkD
# MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJ
# KoZIhvcNAQkEMSIEIJpBYv55W6BFV7mBdj2dAEV1fmP8ZLqy/0wBi7p23Q+MMA0G
# CSqGSIb3DQEBAQUABIIBgFjLYXKDXNVqdiSyChg36FguDFVML24qpQOBdVwwGRro
# yLtuVljywctpjrQNMedJbfxM08n3za3pP0xdg/JYEbyYnLR651230DKCQrLC+B10
# BkfTTEe1/MMCexpAfFhuejljvNreMz3lZFUF1DGxGOBHKeUzmS41GhtRz8afGjjr
# wgVEZS9pQKKov5LOYd6bOAUpw/A/zGLeMNcFm8Ms/3c7bM5fgPgdTxjkgcoj4ByL
# Ow4/1qJrdFvccL0iPjsUyvFAeadCbiTlHGmMYSq5O9k2LHbCdQx0XFhFO6FDLOCc
# Q+m+MMMci1vxGQi7QbmZYwoJHk2cZQbdHFiAnoCZwKqa9Yfsf7Dk33CKI6crjLkd
# hb4F0TYXz6Ot3RTJne+hKQc/t4xd8NVC86rP3VWZgq22L/3dkhdL0NIEQLcTmlPY
# G24yB4e/UwVPXRLEQnc7evWT17/aQJmSSLCbDRmi/olvNz9t4UeDCs/9veyTNcLb
# xwphPTvxQz8zKkqzI8VmBKGCFLIwghSuBgorBgEEAYI3AwMBMYIUnjCCFJoGCSqG
# SIb3DQEHAqCCFIswghSHAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFqBgsqhkiG9w0B
# CRABBKCCAVkEggFVMIIBUQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUA
# BCBEcPHjsEHu2XIeBNiXxpPeEDku0BUIcsVpsXTpf1M6UQIGZ2STarkJGBMyMDI1
# MDExNjEwMjg1NS45NTNaMASAAgH0oIHppIHmMIHjMQswCQYDVQQGEwJVUzETMBEG
# A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj
# cm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBP
# cGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0OTFB
# LTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBT
# dGFtcGluZyBBdXRob3JpdHmggg8pMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7J
# hwAAAAAABTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRp
# dHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAw
# HhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZH
# d5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv
# 3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYST
# Ncc55EbBT7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgC
# sJ+sozf5EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt
# 4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5r
# O9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEf
# yTxgGjOsRpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjN
# q5eLiiunhKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Sh
# u/fk1/rE3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9
# WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3
# rV69AgMBAAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMC
# AQAwHQYDVR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYE
# VR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJ
# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
# GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl
# bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo
# b3JpdHklMjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAC
# hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m
# dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl
# JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+
# bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBes
# nFqBGEdC2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+C
# zb1c2NP5zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyr
# DvBdmgbNnCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1
# I64XNGqst8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+
# 2BuGZCVmoNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG
# 89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5c
# cnYhYb7vPKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnb
# eMrcWD/26ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDG
# Jgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgB
# xFCogYSOiUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHnzCCBYegAwIBAgITMwAAAENM
# zH30mIta1AAAAAAAQzANBgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg
# UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0yNDA0MTgxNzU5MTla
# Fw0yNTA0MTcxNzU5MTlaMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu
# Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExp
# bWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0OTFBLTA1RTAtRDk0NzE1
# MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRo
# b3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCYCpTwGh/YYGsC
# Bw1Bfzjt10E/fvUWAM3bPMFqjmgQUgDJFoEr9ID5ySOUaVWyzUTNFSm1meso2cv8
# +ccE8fVlwTjdiqwbD0jANyJqCJyc2KO8Y/0lvZmiv7VE1DAmly7BMmBS0130Yajx
# RZA1ASQ3Jj8WFlwWakj+CEoKoJWwRZWPMdDCqFhcaTvSi+8KMNYuRGPViXaUAMLS
# Gr2v3fzaanvZzaroWFHs2rW9vXo9nKkvGa/aDa11roYQWgA+NWbu8skNfnKKo4ag
# 37PZnk5VQTMw+xil3xCQHrQjoLwczARhnRQQprXAjIN7Pz7PQBKPc+BiGNhIvosi
# XgsOaRO4eGPJTXLej0v7g5FFJpnE1vfFtWbxDaSgNiSktRN4aXs+piR3ebeQj5CT
# TgIhlY5EqqUgjrKuDFYmbSnSOsLemD+stF83V0vqvpkqC/NOKYX8px2a8KN33OEn
# h2LMTMw+/B+6fOoZr770JhbJreNMKcJTBt8oQWExfXuFvHcgBVocqK32hoXvhPCR
# QtTx363Ollh8vKeJuZR3M0STpQef32O25SCUa8WxSO6ej3AhzHg9jfpE2/zUxuUM
# 29vkwzinGwLE0igSGc8KYkLgzeeAbve5kAIkoFKytVcwjPc5WsAIHtrI4ibe/TIL
# /ExH82i1iXuyTeDA6B4aoLH8jFOO2QIDAQABo4IByzCCAccwHQYDVR0OBBYEFIFS
# qlmU59vkt1dhEyIJQHCygVA6MB8GA1UdIwQYMBaAFGtpKDo1L0hjQM972K9J6T7Z
# PdshMGwGA1UdHwRlMGMwYaBfoF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGlu
# ZyUyMENBJTIwMjAyMC5jcmwweQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUFBzAChl1o
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUy
# MFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcnQwDAYD
# VR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMC
# B4AwZgYDVR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt
# MAgGBmeBDAEEAjANBgkqhkiG9w0BAQwFAAOCAgEAI+3tMtpW4R3pzYsdyKeYyvhx
# L3VpL9mAlxiSbhLqPrRg6DTRrKy+l1sNtKGxsxbgqztFVgzuvGuGCEwuVJRX1CMn
# YIk965fF1wJGv031rv1VO8GVqtrnlJn1MnBFU1uaNsDrQrTRA2cI+G/SvIaB+cqc
# FJUavTTIJ+j3sPpcHxuaHDAd89P2svCIxBLvccZQOnN7WlAynXRnEvXJCf2nFe0u
# YlqX2JymvlF5jwJBxdD/0HkSZKB8hqo/exOdQjKVOflfJrl2GIYsy8AohRVCruSR
# Dx7xtYgepn9brEmMr9LNTztTnCUmDwRFL3jCkwyTUQJkcLYm3v0C/v5g5UKi0C3R
# Rz/LA5fjZ20imvWjCXh748/NJPi3BdIE4Dc87ol9Pn7RWAwt8R3haGK+MPYOS8zI
# hAzumg81MzEKqGtf02g6yBoRz96QsBmlQW9/Eyd/lixGQgqrskjqDNytS4z5RQj5
# DdiFeftqY/ZrRsLT4cMwI+28qaX5SjqQvsVlInow6VZPS4DorNhlnMCAudUJuuNA
# eIqwdNtK3iz4ydUuzimEBrOBXSrmhcbmnSfHWdeqd+BEDzuP7Cbaeqcf7GdiXwus
# aLs+SxfrmK/bErXmMS0/rXwCWn+JmKDvduaAbu3JLGBDUhcR8OQ2o2ib972jnkRu
# ooRuS0VjKgJM6ZngbGExggPUMIID0AIBATB4MGExCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQ
# dWJsaWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAAQ0zMffSYi1rUAAAA
# AABDMA0GCWCGSAFlAwQCAQUAoIIBLTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQ
# AQQwLwYJKoZIhvcNAQkEMSIEIN+0D1jVE1qzy59ndbQRs3zkVDKp78+b7uH9hiK7
# T6nzMIHdBgsqhkiG9w0BCRACLzGBzTCByjCBxzCBoAQgF07+WGQ6IhpoWuB2oDRy
# iqGOBEeB0p20wOu3uUIFxd4wfDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1Ymxp
# YyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjACEzMAAABDTMx99JiLWtQAAAAAAEMw
# IgQgDPYurT85RNLeifjP+iqlGfldjhGfw0TB4SzvFtALsQ8wDQYJKoZIhvcNAQEL
# BQAEggIAVb6hx2tKjp4mp4NdGVanEB8l34nwB5KblGaQD5f8IPPGQSayuzU+xAvX
# XUPOHnfV/lt3GnUFqjncxs0qw0I3XP1WYuUV5HKXxuk3E4MSNYa/Igf9leiXHY4V
# QTINcEQ5g1WQiLL1JAWHCBjgN9UEi+4EQf6jms6ZLeHM/mTR3fdA5ebIhUveyWkC
# AYsphfs2Ufumx7KEHlI/oSYpeE3/+IbqHl4O4Gsdt5dAoFjrhFthwlpsyrnluWdL
# xMa0OPCMsK6bzuN7ZoT/uNGzBvz5UMw3t6DtIvTmuUXIdqpyKLIu+cZrcSvqHO0C
# BqYlJP5ZUEGkhErSXLNTNJUmAVbT2SdKbT3sD5i2sSjQQHuJcDS05+ExJseuOlGf
# jcmXMWAx44Eeu3B+XdrulYk4r7DX7RUsZLuk/rEX+8c17IYO8KDY5p7Wfjsl8LDW
# 8kpqPV5q4xgW/HdaKL27Zp0pyXLiiz2CDRnQoDMG+TnohtNJ7Ksa3Q6IMJ+acrY+
# rrF7g1WbnbqD6bSnISz4lzFn7JI3htnsG+ZZhr/5/bf1rO5XHWZ5xKqm3aJ7ef9j
# L+A5ED2Sgz8DO7PUCYEM5ws+XAsEbfAfagWwWElsKKd7zHS1tMnxL4+UdzTbH7AE
# 4Mo5fR/gtjxvy2b7LkBFjV9eXjgyDL8acs4XoLKvlWqoScBAXDQ=
# SIG # End signature block