public/Import-AppVManagementConnectionGroup.ps1

function Import-AppVManagementConnectionGroup {
    <#
    .SYNOPSIS
        Imports App-V Connection Groups from the Management Database to the AppVentiX configuration.
 
    .DESCRIPTION
        The Import-AppVManagementConnectionGroup function retrieves Connection Groups from the
        App-V Management Database and imports them into the AppVentiX configuration share.
        This function allows you to synchronize Connection Groups from the Management Server
        to make them available for seamless publishing.
 
    .PARAMETER SQLServer
        Specifies the SQL Server hostname or IP address.
        Default value: localhost
 
    .PARAMETER SQLInstance
        Specifies the SQL Server instance name.
        If not specified, the default instance will be used.
 
    .PARAMETER SQLDatabase
        Specifies the App-V Management database name.
        Default value: AppVManagement
 
    .PARAMETER SQLCredential
        Specifies the PSCredential object for SQL Server authentication.
        If not specified, Windows Integrated Authentication will be used.
 
    .PARAMETER MatchConnectionGroupWithMachineGroup
        When specified, packages in a Connection Group are matched to the Machine Group whose Content Share
        contains them, and the resulting publishing task is targeted at that Machine Group. When the packages
        span multiple Machine Groups, the Connection Group is published to 'All Machine Groups'.
 
    .PARAMETER PublishingMachineGroupFriendlyName
        The friendly name(s) of the AppVentiX Machine Group(s) to which the Connection Group's publishing task
        is published. If not specified, the publishing task is published to the same Machine Group the
        Connection Group itself was created for.
 
    .PARAMETER GUI
        When specified, displays a graphical user interface to select Connection Groups to import.
 
    .PARAMETER ConfigShare
        Specifies the AppVentiX configuration share path.
        This parameter is hidden and uses the module's configured ConfigShare by default.
 
    .EXAMPLE
        Import-AppVManagementConnectionGroup -SQLServer "sql01.domain.local"
        Imports all Connection Groups from the specified SQL Server.
 
    .EXAMPLE
        Import-AppVManagementConnectionGroup -SQLServer "sql01.domain.local" -GUI
        Displays a GUI to select specific Connection Groups to import.
 
    .EXAMPLE
        $cred = Get-Credential
        Import-AppVManagementConnectionGroup -SQLServer "sql01.domain.local" -SQLCredential $cred -GUI
        Imports Connection Groups using SQL authentication and GUI selection.
 
    .LINK
        Test-AppVManagementSQLConnection
 
    .LINK
        Get-AppVManagementPackage
 
    .LINK
        Get-AppVManagementConnectionGroup
 
    .LINK
        Import-AppVManagementPackage
 
    .LINK
        New-AppVentiXPublishingTask
 
    .LINK
        New-AppVentiXConnectionGroup
 
    .NOTES
        Function : Import-AppVManagementConnectionGroup
        Author : John Billekens
        Copyright: (c) John Billekens Consultancy & AppVentiX
        Version : 2026.707.1400
       Requires : Valid AppVentiX license
    #>

    [CmdletBinding()]
    param (
        [String]$SQLServer = "localhost",

        [String]$SQLInstance,

        [String]$SQLDatabase = 'AppVManagement',

        [switch]$MatchConnectionGroupWithMachineGroup,

        [String[]]$PublishingMachineGroupFriendlyName,

        [System.Management.Automation.PSCredential]$SQLCredential = [System.Management.Automation.PSCredential]::Empty,

        [switch]$GUI,

        [Parameter(DontShow)]
        [ValidateNotNullOrEmpty()]
        [String]$ConfigShare = $Script:AppVentiX.ConfigShare
    )
    $PSDefaultParameterValues['Write-AppVentiXError:Cmdlet'] = $PSCmdlet
    # Correlation id for this invocation; stamped on every debug entry so one run's log can be grouped.
    $Script:AppVentiXDebugRunId = '{0:yyyyMMddHHmmss}-{1:x4}' -f [datetime]::Now, (Get-Random -Maximum 0x10000)
    if ($Script:AppVentiXDebugLogEnabled) {
        Write-AppVentiXDebugLog -Message 'Import-AppVManagementConnectionGroup started' -Data @{
            SQLServer                            = $SQLServer
            SQLDatabase                          = $SQLDatabase
            MatchConnectionGroupWithMachineGroup = [bool]$MatchConnectionGroupWithMachineGroup
            GUI                                  = [bool]$GUI
            ConfigShare                          = "$ConfigShare"
        }
    }
    if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) {
        try {
            $SQLParams = @{
                SQLServer     = $SQLServer
                SQLInstance   = $SQLInstance
                SQLDatabase   = $SQLDatabase
                SQLCredential = $SQLCredential
            }
            try {
                Write-Verbose "Testing connection to App-V Management database '$SQLDatabase' on server '$SQLServer', instance '$SQLInstance'..."
                $connectionResult = Test-AppVManagementSQLConnection @SQLParams -ErrorAction Stop
                if (-not $connectionResult) {
                    Write-AppVentiXError -Message "Cannot connect to the App-V Management database on server '$SQLServer', database '$SQLDatabase', instance '$SQLInstance'." `
                        -ErrorId 'SQLConnectionFailed' `
                        -Category ConnectionError `
                        -Cmdlet $PSCmdlet
                    return
                }
            } catch {
                Write-AppVentiXError -Message "Cannot connect to the App-V Management database on server '$SQLServer', database '$SQLDatabase', instance '$SQLInstance'." `
                    -ErrorId 'SQLConnectionFailed' `
                    -Category ConnectionError `
                    -Cmdlet $PSCmdlet
                return
            }
            Write-Host "Connected to App-V Management database '$SQLDatabase' on server '$SQLServer', retrieving Connection Groups..."
            Write-AppVentiXDebugLog -Message 'SQL connection verified' -Level Timing
            Write-Verbose "Retrieving AppVentiX Content Share Packages from configuration share '$ConfigShare'..."
            $AppVentiXContentSharePackages = Get-AppVentiXContentSharePackages -ConfigShare $ConfigShare
            $MachineGroups = Get-AppVentiXMachineGroup -ConfigShare $ConfigShare
            Write-AppVentiXDebugLog -Message 'Retrieved Content Store packages and Machine Groups' -Level Timing -Data @{
                ContentSharePackageCount = @($AppVentiXContentSharePackages).Count
                MachineGroupCount        = @($MachineGroups).Count
            }
            if ($AppVManagementConnectionGroup = Get-AppVManagementConnectionGroup @SQLParams) {
                Write-AppVentiXDebugLog -Message 'Retrieved App-V Management Connection Groups from database' -Level Timing -Data @{
                    ConnectionGroupCount = @($AppVManagementConnectionGroup).Count
                }
                if ($GUI.IsPresent -eq $true) {
                    Write-AppVentiXDebugLog -Message 'Displaying GUI for Connection Group selection' -Level Timing
                    $AppVManagementConnectionGroup = @(
                        $AppVManagementConnectionGroup | Select-ObjectFromGrid -Title "Select App-V Management Connection Groups to import" `
                            -ColumnsToShow @('ConnectionGroupId', 'ConnectionGroupName', 'ConnectionGroupEnabled', 'ConnectionGroupPriority', 'ConnectionGroupVersion', 'Description')
                    )
                    Write-AppVentiXDebugLog -Message 'GUI selection completed' -Level Timing -Data @{
                        SelectedConnectionGroupCount = @($AppVManagementConnectionGroup).Count
                    }
                }
                if (-not $AppVManagementConnectionGroup -or $AppVManagementConnectionGroup.Count -eq 0) {
                    Write-AppVentiXDebugLog -Message 'No Connection Groups selected for import' -Level Warning
                    Write-Warning "No App-V Management Connection Groups selected for import."
                    return
                }
                Write-Host "`r`nImporting $($AppVManagementConnectionGroup.Count) App-V Management Connection Groups"
                $ImportResults = [System.Collections.Generic.List[object]]::new()
                foreach ($ConnectionGroup in $AppVManagementConnectionGroup) {
                    Write-Host "`r`n================================" -ForegroundColor Cyan
                    if ($ConnectionGroup.ConnectionGroupEnabled -ne $true) {
                        Write-Host "`r`nSkipping disabled App-V Management Connection Group '$($ConnectionGroup.ConnectionGroupName)'" -ForegroundColor Yellow
                        continue
                    }
                    Write-Host "`r`nImporting App-V Management Connection Group '$($ConnectionGroup.ConnectionGroupName)'" -ForegroundColor Cyan
                    Write-AppVentiXDebugLog -Message 'Processing Connection Group' -Level Timing -Data @{
                        ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                        PackageCount    = @($ConnectionGroup.Packages).Count
                        ADGroups        = @($ConnectionGroup.ADGroups).Count
                    }
                    [PSCustomObject[]]$appVManagementPackages = @()
                    $AppVentiXPackages = @()
                    # Only set when a package's UNC path actually matches a configured Content Store root;
                    # a later package falling back to its source share must not overwrite a real match.
                    $ResolvedContentShare = $null
                    Write-Host "Processing packages for Connection Group" -ForegroundColor Cyan
                    foreach ($appVManagementPackage in $ConnectionGroup.Packages) {
                        Write-Host " => Processing package '$($appVManagementPackage.PackageName)'" -ForegroundColor Cyan

                        $MachineGroupFriendlyName = 'All Machine Groups'
                        if (-not [string]::IsNullOrEmpty($appVManagementPackage.PackageUrl) -and $appVManagementPackage.PackageUrl.StartsWith('\\')) {
                            $fileServer, $fileServerShare, $fileserverPath = $appVManagementPackage.PackageUrl.TrimStart('\\').Split('\', 3)
                            $AppVentiXPackage = @($AppVentiXContentSharePackages | Where-Object {
                                    $_.FullName -like "\\$($fileServer)*\$($fileServerShare)\$($fileserverPath)"
                                })

                            # Same check New-AppVentiXPublishingTask/ConvertTo-AppVentiXRelativePackagePath use: a
                            # package only counts as "in AppVentiX" when its path is literally reachable under a
                            # configured Content Share.
                            $matchedContentShares = @(Get-ContentShareForPackage -Path $appVManagementPackage.PackageUrl -ConfigShare $ConfigShare)
                            $PackagePath = $appVManagementPackage.PackageUrl
                            Write-AppVentiXDebugLog -Message 'Matching Connection Group package with Content Store roots' -Level Timing -Data @{
                                ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                                Package         = "$($appVManagementPackage.PackageName)"
                                PackagePath     = "$PackagePath"
                                Matched         = $matchedContentShares.Count -gt 0
                            }

                            if ($matchedContentShares.Count -eq 0) {
                                Write-Verbose "No configured Content Store matches package '$($appVManagementPackage.PackageName)'."
                            } else {
                                # Longest prefix wins, so a nested Content Share (e.g. "\\srv\content\msix" under
                                # "\\srv\content") is preferred, mirroring ConvertTo-AppVentiXRelativePackagePath.
                                $ContentShare = ($matchedContentShares | Sort-Object -Property @{ Expression = { $_.ContentShare.TrimEnd('\').Length } } -Descending | Select-Object -First 1).ContentShare
                                Write-Verbose "Package matches Content Share '$ContentShare'."
                                if ([string]::IsNullOrEmpty($ResolvedContentShare)) {
                                    $ResolvedContentShare = $ContentShare
                                }
                            }

                            if ($MatchConnectionGroupWithMachineGroup.IsPresent -eq $false) {
                                if ($AppVentiXPackage.Count -eq 0) {
                                    Write-Warning "Package URL: '$($appVManagementPackage.PackageUrl)'"
                                    Write-Warning "Package not found in any of the configured Machine Group Content Shares. Trying to publish to All Machine Groups."
                                }
                            } elseif ($AppVentiXPackage.Count -eq 0) {
                                Write-Warning "Package URL: '$($appVManagementPackage.PackageUrl)'"
                                Write-Warning "Package not found in AppVentiX Content Share Packages. Trying to publish to All Machine Groups."
                            } elseif ($AppVentiXPackage.Count -gt 1) {
                                Write-Warning "Package URL: '$($appVManagementPackage.PackageUrl)'"
                                Write-Warning "Multiple packages found ($($AppVentiXPackage.Count)) in AppVentiX Content Share Packages matching the specified URL."
                                Write-Warning "Trying to publish to All Machine Groups."
                            } else {
                                Write-Host " => Found package in AppVentiX Content Share Packages." -ForegroundColor Green
                                $AppVentiXPackages += $AppVentiXPackage
                            }

                            if (Test-Path -Path $PackagePath -PathType Leaf) {
                                Write-Verbose "Package found in Content Store: $PackagePath"
                                $appVManagementPackages += [PSCustomObject]@{
                                    Path       = $PackagePath
                                    Optional   = $appVManagementPackage.Optional
                                    AnyVersion = $appVManagementPackage.UseAnyVersion
                                }
                                Write-AppVentiXDebugLog -Message 'Resolved Connection Group package path' -Level Timing -Data @{
                                    ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                                    Package         = "$($appVManagementPackage.PackageName)"
                                    PackagePath     = "$PackagePath"
                                }
                            } else {
                                Write-Warning "The package could not be found at path '$PackagePath'. Skipping package '$($appVManagementPackage.PackageName)'."
                                Write-AppVentiXDebugLog -Message 'Connection Group package not found on disk, skipping' -Level Warning -Data @{
                                    ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                                    Package         = "$($appVManagementPackage.PackageName)"
                                    PackagePath     = "$PackagePath"
                                }
                            }
                        } else {
                            Write-Warning "Package URL: '$($appVManagementPackage.PackageUrl)'"
                            Write-Warning "Package is not a valid UNC path. Skipping package."
                            Write-AppVentiXDebugLog -Message 'Connection Group package URL is not a valid UNC path' -Level Warning -Data @{
                                ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                                Package         = "$($appVManagementPackage.PackageName)"
                                PackagePath     = "$($appVManagementPackage.PackageUrl)"
                            }
                            continue
                        }
                    }
                    if ([string]::IsNullOrEmpty($ResolvedContentShare)) {
                        Write-Warning "No configured AppVentiX Content Store matched any package in Connection Group '$($ConnectionGroup.ConnectionGroupName)'. Skipping Connection Group creation."
                        Write-AppVentiXDebugLog -Message 'No Content Store matched any package in Connection Group, skipping' -Level Warning -Data @{
                            ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                        }
                        continue
                    }
                    Write-Host "Creating Connection Group '$($ConnectionGroup.ConnectionGroupName)' with $($appVManagementPackages.Count) packages." -ForegroundColor Cyan
                    try {
                        if ($MatchConnectionGroupWithMachineGroup.IsPresent -eq $true -and $AppVentiXPackages.Count -gt 0) {
                            $MachineGroupFriendlyName = $AppVentiXPackages | Select-Object -ExpandProperty MachineGroup -Unique
                            if (($MachineGroupFriendlyName | Measure-Object).Count -gt 1) {
                                Write-Warning "Packages belong to multiple Machine Groups: $($MachineGroupFriendlyName -join ', ')."
                                Write-Warning "Publishing Connection Group to 'All Machine Groups'."
                                $MachineGroupFriendlyName = 'All Machine Groups'
                            }
                        } else {
                            $MachineGroupFriendlyName = 'All Machine Groups'
                        }
                        Write-Host "Continuing with Machine Group '$MachineGroupFriendlyName'" -ForegroundColor Cyan
                        $AppVentiXConnectionGroup = New-AppVentiXConnectionGroup -Packages $appVManagementPackages `
                            -MachineGroupFriendlyName $MachineGroupFriendlyName `
                            -ConnectionGroupName $ConnectionGroup.ConnectionGroupName `
                            -ContentShare $ResolvedContentShare `
                            -Priority $ConnectionGroup.ConnectionGroupPriority
                        Write-Host "Successfully created Connection Group '$($AppVentiXConnectionGroup.Name)'." -ForegroundColor Green
                        Write-AppVentiXDebugLog -Message 'Created Connection Group' -Level Timing -Data @{
                            ConnectionGroup          = "$($ConnectionGroup.ConnectionGroupName)"
                            MachineGroupFriendlyName = "$($MachineGroupFriendlyName -join ', ')"
                            PackageCount             = @($appVManagementPackages).Count
                        }
                        $publishTaskADGroup = @()
                        foreach ($adGroup in $ConnectionGroup.ADGroups) {
                            if ([string]::IsNullOrEmpty($($adGroup.Name))) {
                                Write-Warning "Skipping empty AD Group for Connection Group '$($ConnectionGroup.ConnectionGroupName)'."
                                continue
                            }
                            $publishTaskADGroup += '{0}\{1}' -f $adGroup.Domain, $adGroup.Name
                        }
                        # Independent from the Connection Group's own Machine Group: defaults to it, but can be overridden.
                        $currentPublishingGroups = $PublishingMachineGroupFriendlyName
                        if ([string]::IsNullOrEmpty($currentPublishingGroups)) {
                            $currentPublishingGroups = $MachineGroupFriendlyName
                        }
                        $params = @{
                            MachineGroupFriendlyName = $currentPublishingGroups
                            Group                    = $publishTaskADGroup
                            Path                     = $AppVentiXConnectionGroup.Path
                        }
                        Write-Verbose "Creating publishing task for Connection Group '$($ConnectionGroup.ConnectionGroupName)' with parameters: $($params | Out-String)"
                        $newTaskId = New-AppVentiXPublishingTask @params
                        Write-AppVentiXDebugLog -Message 'Created publishing task for Connection Group' -Level Timing -Data @{
                            ConnectionGroup                    = "$($ConnectionGroup.ConnectionGroupName)"
                            TaskId                             = "$($newTaskId.Id)"
                            MachineGroupFriendlyName           = "$($MachineGroupFriendlyName -join ', ')"
                            PublishingMachineGroupFriendlyName = "$($currentPublishingGroups -join ', ')"
                        }
                        $ImportResults.Add([PSCustomObject]@{
                                Name = $ConnectionGroup.ConnectionGroupName
                                Id   = $newTaskId.Id
                            })
                    } catch {
                        Write-Warning "Failed to create Connection Group '$($ConnectionGroup.ConnectionGroupName)': $($_.Exception.Message)"
                        Write-AppVentiXDebugLog -Message 'Failed to create Connection Group' -ErrorRecord $_ -Data @{
                            ConnectionGroup = "$($ConnectionGroup.ConnectionGroupName)"
                        }
                    }
                    Write-Host "Finished with the Connection Group '$($ConnectionGroup.ConnectionGroupName)'." -ForegroundColor Cyan
                }
                Write-Host "`r`n================================" -ForegroundColor Cyan
                Write-Host "`r`nFinished processing App-V Management Connection Groups.`r`n" -ForegroundColor Cyan
                Write-AppVentiXDebugLog -Message 'Finished processing App-V Management Connection Groups' -Level Timing -Data @{
                    TotalConnectionGroups = @($AppVManagementConnectionGroup).Count
                    TasksCreated          = $ImportResults.Count
                }
                $ImportResults
            } else {
                Write-AppVentiXDebugLog -Message 'No Connection Groups found in database' -Level Warning
                Write-Warning "No App-V Management Connection Groups found in the database '$SQLDatabase' on server '$SQLServer'."
                Write-Verbose $($_ | Get-ExceptionDetails -AsPlainText)
            }
        } catch {
            Write-AppVentiXDebugLog -Message 'Import failed' -ErrorRecord $_
            $ErrorMessage = @{
                Message      = "Failed to import App-V Management Connection Groups: $($_.Exception.Message)"
                ErrorId      = "ImportAppVManagementConnectionGroupFailed"
                Category     = [System.Management.Automation.ErrorCategory]::NotSpecified
                TargetObject = $_.Exception
            }
            Write-Verbose $($_ | Get-ExceptionDetails -AsPlainText)
            Write-AppVentiXError @ErrorMessage
        } finally {
            # Clear the run id so later unrelated debug entries are not stamped with it.
            $Script:AppVentiXDebugRunId = $null
        }
    } else {
        throw "AppVentiX is not licensed. Please run the license setup before using this function."
    }
}

# SIG # Begin signature block
# MII5zAYJKoZIhvcNAQcCoII5vTCCObkCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCHygu+LfYJGCpk
# XuxtRkb+t+7ac+LLthfVz2/o/zGF4KCCIfAwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggalMIIEjaADAgECAhMzAAPYSYKV
# Ad9dHyDxAAAAA9hJMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQwHhcNMjYwODAzMTQxNTE5WhcNMjYwODA2
# MTQxNTE5WjBoMQswCQYDVQQGEwJOTDEWMBQGA1UECBMNTm9vcmQtSG9sbGFuZDEP
# MA0GA1UEBxMGSGVpbG9vMRcwFQYDVQQKEw5BcHBWZW50aVggQi5WLjEXMBUGA1UE
# AxMOQXBwVmVudGlYIEIuVi4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIB
# gQDMBvk8GVv/OKuFNpoVE3yVe7hkpGgLaq5QJN1HHCgDWU6jHM1M99AR0yNyJkci
# UNP701N6wA/F9ZqwDo/AX574HfqDJG5g7q+5mXHH7McXAmYE2FSVvkP2N9rTytb1
# 00Bsxcgg6bAhdMEtJSpr5Pl6fHBp0uZO9Ha84AkrkFYOkcIyGxnTkjmV4y+oxTMB
# DanTYTVJVfdgzb6QlVIPn0bHeRP2oUvDEBOYdlTQ1Leo3zhrLNl/G+qIBa7gKkSv
# sMoCrCDPz+aCGEcGF+yJEtiTZd7mRaLkIeFY4YQPQg9a8KDmrj6ziX9bFm9Klq6L
# /iM4qyqA2J9b24NZBHZqlGaEyuNINtFd9SYMcAwOo7j/7pn/9FHsGMcbn1wzoJP6
# CGCLz5j/YNT1ZxtX19IHQltDskL/WyYdIi3XHh3IOOUAubpeYGQs4WRxmWGs2+5b
# zf3Uw46HgbC72jQmTrKhS/VzX635WEGQ/4SbgrkLuAp4w1T6rkuwwEc0nH1qJCTJ
# H/ECAwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsG
# A1UdJQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YaL8yC6uh9F6
# gZ2lyVCBwcKCJzAdBgNVHQ4EFgQUjPC3d7gEvKwwvfQEwfoVKqHvSsEwHwYDVR0j
# BBgwFoAUmvFUd3UMhxY3RqCs3nn59H/BeOkwZwYDVR0fBGAwXjBcoFqgWIZWaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQl
# MjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUHAQEE
# aDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENB
# JTIwMDQuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# DQYJKoZIhvcNAQEMBQADggIBAEuJF58u6Pl5xjaytkvPWI4rO8ruvH4JIXNryvyE
# hAr816SPRGym0fyNlotEco5QCwqbHtM0iiG/ynZ9tidzXK5YctOCJ/lfFFzyVnYf
# Q6FWKON1QqybtdnLiQKtpwP9ZFCFIZCFBtJCkIda8ho56YYtTLI0T189JLKdMO0S
# zKhybvo8NpjqYneuDXY82j3FWsKURwjohfIZrIwILI5luRLtIVdbO85Y+oaQEaAX
# vi1Z1ws0xdgIR+wzLKPB6Pf6+347xMeOcq/BI3+s8qagFnsBL0J1U4yZsWCnehdS
# cA7BSwgQRT325pWcYpUCWi4ve1OD4LH8aFv/ejERvstN2WZGYeVYBpH/n/dlgCki
# Y7wgEdbzAFAKEqQfONvzIgz7LINqmhOp5yyN+33FZptvH2x/ZcSvtjp208eQxdz/
# qtSPK239/ZPOQbYUjj5ADGRsSGkQcNnErrCW1ak3no67BOyomlMlUSmzxMNMXbCX
# K14FSbAX9d0PobnKu2PkQBoFsam/lP32ptBTHLMuLzqYNPQgGSVe4CKjinQafNTE
# XPapu3eCnlARfo/wIOwDUpdt9IgZuhUh+hKzM/dS9IfdvakK74I+cpCPDF0RJHvk
# pxX2AxoWX21pAPrJc5+3hiL+X06f+Jc7OGCLf0qkqCr7TyouecM1mqfg7DT/e7kU
# WN0ZMIIGpTCCBI2gAwIBAgITMwAD2EmClQHfXR8g8QAAAAPYSTANBgkqhkiG9w0B
# AQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENBIDA0
# MB4XDTI2MDgwMzE0MTUxOVoXDTI2MDgwNjE0MTUxOVowaDELMAkGA1UEBhMCTkwx
# FjAUBgNVBAgTDU5vb3JkLUhvbGxhbmQxDzANBgNVBAcTBkhlaWxvbzEXMBUGA1UE
# ChMOQXBwVmVudGlYIEIuVi4xFzAVBgNVBAMTDkFwcFZlbnRpWCBCLlYuMIIBojAN
# BgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAzAb5PBlb/zirhTaaFRN8lXu4ZKRo
# C2quUCTdRxwoA1lOoxzNTPfQEdMjciZHIlDT+9NTesAPxfWasA6PwF+e+B36gyRu
# YO6vuZlxx+zHFwJmBNhUlb5D9jfa08rW9dNAbMXIIOmwIXTBLSUqa+T5enxwadLm
# TvR2vOAJK5BWDpHCMhsZ05I5leMvqMUzAQ2p02E1SVX3YM2+kJVSD59Gx3kT9qFL
# wxATmHZU0NS3qN84ayzZfxvqiAWu4CpEr7DKAqwgz8/mghhHBhfsiRLYk2Xe5kWi
# 5CHhWOGED0IPWvCg5q4+s4l/WxZvSpaui/4jOKsqgNifW9uDWQR2apRmhMrjSDbR
# XfUmDHAMDqO4/+6Z//RR7BjHG59cM6CT+ghgi8+Y/2DU9WcbV9fSB0JbQ7JC/1sm
# HSIt1x4dyDjlALm6XmBkLOFkcZlhrNvuW8391MOOh4Gwu9o0Jk6yoUv1c1+t+VhB
# kP+Em4K5C7gKeMNU+q5LsMBHNJx9aiQkyR/xAgMBAAGjggHUMIIB0DAMBgNVHRMB
# Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggr
# BgEFBQcDAwYaKwYBBAGCN2Gi/MgurofReoGdpclQgcHCgicwHQYDVR0OBBYEFIzw
# t3e4BLysML30BMH6FSqh70rBMB8GA1UdIwQYMBaAFJrxVHd1DIcWN0agrN55+fR/
# wXjpMGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUy
# MENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUy
# MFZlcmlmaWVkJTIwQ1MlMjBFT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQBLiRef
# Luj5ecY2srZLz1iOKzvK7rx+CSFza8r8hIQK/Nekj0RsptH8jZaLRHKOUAsKmx7T
# NIohv8p2fbYnc1yuWHLTgif5XxRc8lZ2H0OhVijjdUKsm7XZy4kCracD/WRQhSGQ
# hQbSQpCHWvIaOemGLUyyNE9fPSSynTDtEsyocm76PDaY6mJ3rg12PNo9xVrClEcI
# 6IXyGayMCCyOZbkS7SFXWzvOWPqGkBGgF74tWdcLNMXYCEfsMyyjwej3+vt+O8TH
# jnKvwSN/rPKmoBZ7AS9CdVOMmbFgp3oXUnAOwUsIEEU99uaVnGKVAlouL3tTg+Cx
# /Ghb/3oxEb7LTdlmRmHlWAaR/5/3ZYApImO8IBHW8wBQChKkHzjb8yIM+yyDapoT
# qecsjft9xWabbx9sf2XEr7Y6dtPHkMXc/6rUjytt/f2TzkG2FI4+QAxkbEhpEHDZ
# xK6wltWpN56OuwTsqJpTJVEps8TDTF2wlyteBUmwF/XdD6G5yrtj5EAaBbGpv5T9
# 9qbQUxyzLi86mDT0IBklXuAio4p0GnzUxFz2qbt3gp5QEX6P8CDsA1KXbfSIGboV
# IfoSszP3UvSH3b2pCu+CPnKQjwxdESR75KcV9gMaFl9taQD6yXOft4Yi/l9On/iX
# Ozhgi39KpKgq+08qLnnDNZqn4Ow0/3u5FFjdGTCCBygwggUQoAMCAQICEzMAAAAX
# J0UJC4uHr8YAAAAAABcwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0
# IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAzMjYxODEx
# MzFaFw0zMTAzMjYxODExMzFaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll
# ZCBDUyBFT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCC
# x2T+Aw9mKgGVzJ+Tq0PMn49G3itIsYpbx7ClLSRHFe1RELdPcZ1sIqWOhsSfy6yy
# qEapClGH9Je9FXA1cQgZvvpQbkg+QInVLr/0EPrVBCwrM96lbRI2PxNeCwXG9Lsy
# W2hG6KQgintDmNCBo4zpDIr377plVdSliZm6UB7rHwmvBnR02QT6tnrqWq2ihzB6
# lRJVTEzuh0OafzIMeMnYM0+x+ve5EOLHdfiq+HXiMf9Jb7YLHtYgyHIiJA7bTWLq
# FSLGaTh7ZlbxbsLXA91OOroEpv7OjzFuu3tkpC9FflA4Dp2Euq4+qPmxUqfGp+TX
# 0gLRJp9NJOzzILjcTD3rkFFFbxUv1xyg6avivFDLtoKBhM2Td138umE1pNOacanu
# SYtPHIeQHmB6haFi64avLBLwTTAm/Rbit860cFXR72wq+5Qh4hSmezHqKXERWPpV
# Be+APrJ4Iqc+aPeMmIkoCWZQO22HnLNFUFSXjiwyIbgvlH/LIAJEqTafTzxDZgKh
# lLU7zr6gwsq3WNpcYQI6NuxWnwh3VVDDyF7onQqKs5Ll7bleVN0Y8VvqgE45ppyB
# bvwqN/Run5fMCCRz3aYMY0kZhKO92eP7t4zHqZ5bQMAgZ0tE2Pz/jb0wiykUF/Pc
# oOqqk3vVLiRDYst6vd3GEMNzMpUUvQcvBG46+COIbwIDAQABo4IB3DCCAdgwDgYD
# VR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBSa8VR3dQyH
# FjdGoKzeefn0f8F46TBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYz
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnku
# aHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQIMAYBAf8C
# AQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0fBGkwZzBl
# oGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9z
# b2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAy
# MS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZp
# ZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqGSIb3DQEB
# DAUAA4ICAQCQdVoZ/U0m38l2iKaZFlsxavptpoOLyaR1a9ZK2TSF1kOnFJhMDse6
# KkCgsveoiEjXTVc6Xt86IKHn76Nk5qZB0BXv2iMRQ2giAJmYvZcmstoZqfB2M3Kd
# 5wnJhUJOtF/b6HsqSelY6nhrF06zor1lDmDQixBZcLB9zR1+RKQso1jekNxYuUk+
# HaN3k1S57qk0O//YbkwU0mELCW04N5vICMZx5T5c7Nq/7uLvbVhCdD7f2bZpA4U7
# vOkB1ooB4AaER3pjoJ0Mad5LFyi6Na9p9Zu/hrLeOjU5FItS5YxsqvlfXxAThJ17
# 6CmkYstKRmytSHZ7JhKRfV6e9Zftk/ODb/CK4pGVAVqsOf4337bQGrOHHCQ3IvN9
# gmnUuDh8JdvbheoWPHxIN1GB5sUiY584tXN7xdD8LCSsRqJvQ8e7a3gZWTgViugR
# s1QWq+N0G9Nje6JHlN1CjJehge+H5PGktJja+juGEr0P+ukSkcL6qaZxFQTh3SDI
# 71lvW++3bl/Ezd6SO8N9Udw+reoyvRHCyTiSsplZQSBTVJdPmo3qCpGuyHFtPo5C
# Bn3/FPTiqJd3M9BHoqKd0G9Kmg6fGcAvFwnLNXA2kov727wRljL3ypfqL7iAT/Yn
# pxul6RwHRlcOf9dDGg1RRvr92NP/CWVXIb68geR2rvU/NsfmtjF1wDCCB54wggWG
# oAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkG
# A1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UE
# AxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmlj
# YXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUy
# MFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv
# bjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQ
# Q0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji
# 3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoN
# cHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076I
# u+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ
# 2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+Tcm
# JX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG
# 8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weF
# xhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbc
# Nr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+b
# Gecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxV
# FyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K
# 4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8E
# BAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0p
# nqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJ
# KwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME
# GDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRl
# bnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRo
# b3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAC
# hnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m
# dCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRl
# JTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVv
# Y3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7U
# q+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0
# wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH
# +KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN
# 3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0
# byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSLWjinMLXN
# OAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx
# 0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+
# PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQ
# e6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lD
# f+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBX
# iCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghcyMIIXLgIBATBxMFoxCzAJBgNV
# BAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMT
# Ik1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQCEzMAA9hJgpUB310f
# IPEAAAAD2EkwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIwADAZBgkq
# hkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgJXkv0Shdknur
# KTsbTz3LXfhtvj5IrCRjRKdkh42iC7YwDQYJKoZIhvcNAQEBBQAEggGAl9pc3vdC
# bc0xW90bBzKPDKlZMRncoBx5HZue2bbiwP8m4i3D8UAkDQ2bq0j0XVR6qxaIzrTk
# cNRLUNVQs0wkuFFIN8vX/cHaL6D+iRu4vdzYWw3htL0JiSTHL3gplp9MZkWZEEPo
# vXQs9iSrfRL3livRQf92LPMCiwc6/1Hhu59jozlFIma90H2lvQpnm7tI6vm34Rs9
# M29FMG1fUFgdxXwWafRVe2znrAnw+Ub/YM30i1tK3qRlZNLLedgUXCvT+2l4Sb0B
# 1vEPj4vgDtlqQG3dlsxc/YJTLQBqI3m4pugC4etSrjsFx+6YRsW/bkPePjPc593O
# mgB1ZLDQAr3zwzRkhIgH62HCHiYIN0/OqCURv/5OuIqJX2azVho+glIxGKj1j7c0
# sPVs7P6ZQ5lK0BlUSIXlYwOuRa9cJ601WtknZE8FH6yx6Aky3GNot8VSiZLA8AFW
# +3G+Rxn8EEqv3kVpOYhCg6VciY4d5on/gkuLCgdr7hg0dz0ZkOg5SNjtoYIUsjCC
# FK4GCisGAQQBgjcDAwExghSeMIIUmgYJKoZIhvcNAQcCoIIUizCCFIcCAQMxDzAN
# BglghkgBZQMEAgEFADCCAWoGCyqGSIb3DQEJEAEEoIIBWQSCAVUwggFRAgEBBgor
# BgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIJM3A1bq2kQOSxGoqdAyTomr8erz
# yHhq7ftbCKp9QsnTAgZqNTBkI1MYEzIwMjYwODA0MTk0NTExLjQyOVowBIACAfSg
# gemkgeYwgeMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD
# VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTAr
# BgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUG
# A1UECxMeblNoaWVsZCBUU1MgRVNOOjQ5MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxN
# aWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCCDykw
# ggeCMIIFaqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEBDAUA
# MHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# SDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBD
# ZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0zNTEx
# MTkyMDQyMzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt
# cGluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnnzn
# UmP94MWfBX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb+omF
# io5DHC4RBcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5huXhI
# kQRKe3Qxs8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wISvlk
# pOQooTULFm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/B8U/
# pdoZkZZQbxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh7SqI
# NGbmw5OIRC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMGJ4pQ
# ZH55ngI0Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC3yFj
# rhc087qLJQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1hSuWY
# BunFGNv21Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo3liw
# kGdzPJYHgnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ2PMo
# 27xjlLAHWW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4GA1Ud
# DwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUvSGNA
# z3vYr0npPtk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMA
# QTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBP
# aKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUy
# MFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGUBggr
# BgEFBQcBAQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmlj
# YXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNy
# dDANBgkqhkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4sTQ5
# r+k77iB79cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCmcrdo
# vkl53DNt4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+8z2X
# MOZzY7YQ0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6JCWON
# NboZ497mwYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWMq7eb
# 0oYioXhqV2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv10o4K
# Gag42pswjybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+7jFf
# EV9Hh/+CSxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4MhF/Kg
# aXn0GxdH8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQWm88
# TwIf4R4YZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOCztfp
# +o9Nc+ZoIAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbYbBh7
# pmgAXVswggefMIIFh6ADAgECAhMzAAAAWvYNZ4yF7d0IAAAAAABaMA0GCSqGSIb3
# DQEBDAUAMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFtcGlu
# ZyBDQSAyMDIwMB4XDTI2MDEwODE4NTkwM1oXDTI3MDEwNzE4NTkwM1owgeMxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
# c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs
# ZCBUU1MgRVNOOjQ5MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVi
# bGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEB
# BQADggIPADCCAgoCggIBAO/0O0eWjgUb9rnHcQLRdfWPN4H+91a3YnlaP46E1m4u
# D+JKx6csWMStX79fxLJUAqHJqQWE19UlNMhS9jEB32dAJ4yuWsHyUuM+dphjDz4E
# 5jl4gYGZEmaOrKvNt+KqlFayyg/oTg3BlLRu4aBq8668A5qlHcfsuh6DdSqFID1i
# xJFZzHrZFG1iGBG7U1Bn2ONLDo7jbwX5rMcPduTAUw/c7M3WhSxQBuZpQiz8RQGK
# IqCKfIxgQkKdzpCpU0SWQOE/DgTXbz3c15KMRCdkGlL2zb+lnuSV4sseQm3qflZi
# ZckLyn2xJI8ZXDkq+Ig+b/rsPPIfI8di228WvK1j67JXpyeVCaSUO9ErzlLnTrnj
# QkeXVQIp73xuVBVrmvoTf/v4a7MnrmuKSyIXc5vJUHEGB345+O8omFt1w8b+Xg9D
# 9PKIRqDPEv7HRk0C+Yvxu8FvHJvSocSIZK+v/FmKFOipYnpP76yAmJNnyheucShO
# gk8QiU53USn/+AyMb7xW905gZnyNqb29HeVdQ175pDHJGEz8Cx5wiHeVliGz5hAB
# ucFDylR9z3LSTmB6+3ZuIxeG9BZS46P6ANPkuVuD5m8wgc7GLLzg73CsDF09ukt8
# Uf8dTcMBX3ro+7/k9M6Xt8WPG7IL9v/4DvyMY03tkb9Y9Ri6HWavXRPYRCUePspP
# AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUjmOyQ6twMcP1ZbRytJxI4fnXmcIwHwYD
# VR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+gXYZb
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# UHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5Bggr
# BgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0
# YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM
# MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsGAQQB
# gjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3DQEB
# DAUAA4ICAQCAlM8r+t3hIb2h1lDTAx+iYkQlxFuU7QONeyIFIBZ29xvGl8pehKxE
# rDzIniOpIX/eluUAwQKoaI0zwuKAdR0mrSHXCniMoLNko5W+5r7sXNamKX7QMV3B
# fGOX3gi9qVfxyUe7AHXbqQ8KBQHNYCnNFtQQHgARrlYhtyAKol5ctM0CAc/y3oY7
# bTMsVJvnA5u7DVWPeXoST2KEMDeLBvJYq0IJZ6yMpDOWLZ4UP82bksyShIB/Xdaw
# irIGLdseudryRxVMk313mAcjGRb59+Ittt6otVvYQWqH+PGrTUzEcez8aQuO3umo
# NZjKuFoX5VsPP/gSZse+orhG3zfZk9IDyE3DfUFrhvkv6H0tijK1D0uIGhwMBWSm
# 9ktQ6oeU+aurZFx3MI+LODnHsbRFZAy11uMvwKq+ZNC1Se4tIM1u9piWAhnTPoh6
# mULKikHOVhHaO953tkzDCtjsse5GUKOx9yg9nqHKWMgnODp62/uPPzC/yDEISrXC
# cU7UB7tATr3zWNEdtM4d009iXWI6dV/SdcIIX44rpoLyCLw+nXjxp+fY/dygLO7U
# dSQaVaUFVj3K2nVyuujPspt5Lunc5FvuYPqmi/z8kASmmwbiF+W0P0UTWFaC84MW
# fU2h6MDg5s0oxmdNFK76jXr3wZfdSoV7FCKfq5GdeGoy5UwDQwMC0DGCA9QwggPQ
# AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n
# IENBIDIwMjACEzMAAABa9g1njIXt3QgAAAAAAFowDQYJYIZIAWUDBAIBBQCgggEt
# MBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQgWwMV
# QXwmpXtgzbxxPa3Z0a8AHIx37e3bLwDIW2KSouYwgd0GCyqGSIb3DQEJEAIvMYHN
# MIHKMIHHMIGgBCBiuWRAi+p96PRsBt3TwW3jNozgPQS+Qco1CVm/NaU0QzB8MGWk
# YzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0Eg
# MjAyMAITMwAAAFr2DWeMhe3dCAAAAAAAWjAiBCBsCIKbBVzkK4UpTLbF7yBejMI2
# YtIaiZ1AQn/5jcseOjANBgkqhkiG9w0BAQsFAASCAgB5WUvjdy5Q59+1zT3rMzQY
# 29fstjzNk3tnFW70B5heDPik2FcErURK3naWguwyEW3HGDu5KseubthkTZHTcg1p
# V0zgBvsbG4b+mj/PrrIm3ZjZ/U/FCeAf56ABKYpVwVv+IibPQYhQScwazpTLgISC
# 6QrJqvz8QZ/b5pc3UNzk3KfLjdZ7oL6JG7//i/8Vlqz9x5afkgCFhX0CQvYpZqgh
# iWHsgpDDW58cBPNSEtASKV4luBHkV30Y3Pv3uVfHmYFQLwQlMs0CGOQM5E1zrCUq
# TxDLXhBe9DrO6zmglt64xIhK/lr9fssqp+X8C0GrVo4tjfCeK9YVgQfY6AOmaXQk
# v4AQLuGlThQCH0xXvqkGkgSl0i57+cc9JePWgP9jRzhcw+/k9xtmp7Mte9HVv9R1
# 9jDUxNvnl9o5ET7cI77MAZWNf/vwRNMekEK/3TFEDkbOmkOqXsByJuKkdA5gg2AC
# jH6MYEMo/DLPN7bC/2T2/FesijXg9VyV5Pp+MirymqBDAqeonRUetU8exIzKC4Pe
# ANcPdFnsJDh1LNKbJOFrAOgujk0o6h+7r7AlH58W0EfiO2VpADLZDBC1n3dmexlY
# zpSzev6C5R28A8Xo+G03aC7KAbdzJt9K1XkCIgqPDJ7qVG5HZrgay4y5ssVJO2g2
# ij+23x2Y37jxIpuGNk0JxQ==
# SIG # End signature block