public/Get-AppVManagementPackage.ps1

<#
    .SYNOPSIS
        Retrieves App-V packages with AD access entitlements from the Microsoft App-V Management database.
 
    .DESCRIPTION
        The Get-AppVManagementPackage function queries the App-V Management database
        to retrieve complete package information including package metadata, version details,
        applications, shortcuts, file type associations, and AD entitlements.
 
        Each package includes:
        - DeploymentConfigurationXml: Global deployment configuration (one per package)
        - ADGroups: Array of AD entitlements, each with:
          - UserConfigurationXml: The AD group's specific user configuration (if any)
          - DeploymentConfigurationXml: Combined deployment config where the UserConfiguration
            element from the global deployment config is replaced with this AD group's
            UserConfiguration (if UserConfigurationXml exists for the group)
 
    .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 PackageGuid
        Retrieves a specific package by its PackageGuid.
        This can be used to get all versions of a specific package.
 
    .PARAMETER VersionGuid
        Retrieves a specific package version by its VersionGuid.
 
    .PARAMETER Name
        Filters packages by name using wildcards (*).
        Example: "Adobe*" will return all packages starting with "Adobe".
 
    .PARAMETER EnabledOnly
        Returns only enabled packages (Enabled = 1).
 
    .EXAMPLE
        Get-AppVManagementPackage -SQLServer "sql01.domain.local"
        Retrieves all packages with their AD entitlements from the App-V Management database.
 
    .EXAMPLE
        $cred = Get-Credential
        Get-AppVManagementPackage -SQLServer "sql01.domain.local" -SQLCredential $cred
        Retrieves all packages using SQL Server authentication.
 
    .EXAMPLE
        Get-AppVManagementPackage -SQLServer "SQLSRV01" -SQLInstance "INSTANCE01" -EnabledOnly
        Retrieves only enabled packages from a named SQL Server instance.
 
    .EXAMPLE
        Get-AppVManagementPackage -SQLServer "SQLSRV01" -Name "Adobe*"
        Retrieves all packages with names starting with "Adobe".
 
    .EXAMPLE
        Get-AppVManagementPackage -SQLServer "SQLSRV01" -PackageGuid "FB4267F4-6B2B-45E1-A55B-0FE9C69A3DC2"
        Retrieves all versions of a specific package by PackageGuid with AD entitlements.
 
    .NOTES
        Function : Get-AppVManagementPackage
        Author : John Billekens
        Copyright: (c) John Billekens Consultancy
        Version : 2026.0130.1600
        Requires : SqlServer PowerShell module
#>

function Get-AppVManagementPackage {
    [CmdletBinding(DefaultParameterSetName = 'All')]
    param(
        [Parameter(Mandatory = $false, ParameterSetName = 'All')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByPackageGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByVersionGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByName')]
        [ValidateNotNullOrEmpty()]
        [String]$SQLServer = "localhost",

        [Parameter(Mandatory = $false, ParameterSetName = 'All')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByPackageGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByVersionGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByName')]
        [String]$SQLInstance,

        [Parameter(Mandatory = $false, ParameterSetName = 'All')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByPackageGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByVersionGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByName')]
        [ValidateNotNullOrEmpty()]
        [String]$SQLDatabase = 'AppVManagement',

        [Parameter(Mandatory = $false, ParameterSetName = 'All')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByPackageGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByVersionGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByName')]
        [System.Management.Automation.PSCredential]$SQLCredential = [System.Management.Automation.PSCredential]::Empty,

        [Parameter(Mandatory = $true, ParameterSetName = 'ByPackageGuid')]
        [ValidateNotNullOrEmpty()]
        [Guid]$PackageGuid,

        [Parameter(Mandatory = $true, ParameterSetName = 'ByVersionGuid')]
        [ValidateNotNullOrEmpty()]
        [Guid]$VersionGuid,

        [Parameter(Mandatory = $true, ParameterSetName = 'ByName')]
        [ValidateNotNullOrEmpty()]
        [String]$Name,

        [Parameter(Mandatory = $false, ParameterSetName = 'All')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByPackageGuid')]
        [Parameter(Mandatory = $false, ParameterSetName = 'ByName')]
        [Switch]$EnabledOnly
    )

    begin {
        Write-Verbose "Starting function 'Get-AppVManagementPackage'"
        Write-Verbose 'Checking for SqlServer module availability'
        if (-not (Get-Module -Name SqlServer -ListAvailable)) {
            Write-AppVentiXError -Message 'SqlServer module is not installed. Please install it using: Install-Module -Name SqlServer' `
                -ErrorId 'SqlServerModuleNotFound' `
                -Category NotInstalled `
                -Cmdlet $PSCmdlet
        }

        # Import SqlServer module
        try {
            if (-not (Get-Module -Name SqlServer)) {
                Write-Verbose 'Importing SqlServer module'
                Import-Module SqlServer -ErrorAction Stop
                Write-Verbose 'SqlServer module imported successfully'
            } else {
                Write-Verbose 'SqlServer module is already imported'
            }
        } catch {
            Write-AppVentiXError -Message "Failed to import SqlServer module: $($_.Exception.Message)" `
                -ErrorId 'SqlServerModuleImportFailed' `
                -Category InvalidOperation `
                -Cmdlet $PSCmdlet
        }

        # Test SQL connection
        $SQLParams = @{
            SQLServer   = $SQLServer
            SQLDatabase = $SQLDatabase
        }

        if ($PSBoundParameters.ContainsKey('SQLCredential') -and -not [string]::IsNullOrEmpty($SQLCredential.UserName)) {
            $SQLParams.SQLCredential = $SQLCredential
        }
        if ($PSBoundParameters.ContainsKey('SQLInstance')) {
            $SQLParams.SQLInstance = $SQLInstance
        }

        try {
            $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
        }
    }

    process {
        # Build ServerInstance parameter
        $serverInstance = $SQLServer
        if (-not [String]::IsNullOrEmpty($SQLInstance)) {
            $serverInstance = "$SQLServer\$SQLInstance"
            Write-Verbose "Using SQL Server instance: $serverInstance"
        } else {
            Write-Verbose "Using SQL Server: $serverInstance"
        }

        # Build WHERE conditions based on parameters
        $whereConditions = @()

        if ($PSCmdlet.ParameterSetName -eq 'ByPackageGuid') {
            $whereConditions += "pv.PackageGuid = '$PackageGuid'"
            Write-Verbose "Filtering by PackageGuid: $PackageGuid"
        }

        if ($PSCmdlet.ParameterSetName -eq 'ByVersionGuid') {
            $whereConditions += "pv.VersionGuid = '$VersionGuid'"
            Write-Verbose "Filtering by VersionGuid: $VersionGuid"
        }

        if ($PSCmdlet.ParameterSetName -eq 'ByName') {
            # Convert PowerShell wildcard to SQL LIKE pattern
            $sqlPattern = $Name.Replace('*', '%').Replace('?', '_')
            $whereConditions += "pv.Name LIKE '$sqlPattern'"
            Write-Verbose "Filtering by Name: $Name (SQL pattern: $sqlPattern)"
        }

        if ($EnabledOnly) {
            $whereConditions += 'pv.Enabled = 1'
            Write-Verbose 'Filtering for enabled packages only'
        }

        $whereClause = ""
        if ($whereConditions.Count -gt 0) {
            $whereClause = "WHERE " + ($whereConditions -join ' AND ')
        }

        # Query 1: Package metadata with counts
        $packagesQuery = @"
SELECT
    pv.Id,
    pv.PackageGuid,
    pv.VersionGuid,
    pv.Name,
    pv.Description,
    pv.VersionNumber,
    pv.Size,
    CAST(pv.Size / 1024.0 / 1024.0 AS DECIMAL(10,2)) AS SizeMB,
    pv.PackageUrl,
    pv.SequencerArchitecture,
    pv.SupportedOSsFromManifest,
    pv.Enabled,
    pv.TimeAdded,
    pv.TimeChanged,
    pv.TimeEnabled,
    pv.ClientVersion,
    COUNT(DISTINCT a.Id) AS ApplicationCount,
    COUNT(DISTINCT s.Id) AS ShortcutCount,
    COUNT(DISTINCT fta.Id) AS FileTypeAssociationCount
FROM PackageVersions pv
LEFT JOIN Applications a ON pv.Id = a.PackageVersionId
LEFT JOIN Shortcuts s ON pv.Id = s.PackageVersionId
LEFT JOIN FileTypeAssociations fta ON pv.Id = fta.PackageVersionId
$whereClause
GROUP BY
    pv.Id, pv.PackageGuid, pv.VersionGuid, pv.Name, pv.Description,
    pv.VersionNumber, pv.Size, pv.PackageUrl, pv.SequencerArchitecture,
    pv.SupportedOSsFromManifest, pv.Enabled, pv.TimeAdded, pv.TimeChanged,
    pv.TimeEnabled, pv.ClientVersion
ORDER BY pv.Name, pv.VersionNumber;
"@


        # Query 2: DeploymentConfiguration (rows where SID is empty - one per package)
        $deploymentConfigQuery = @"
SELECT
    pe.PackageVersionId,
    pe.UserConfigurationContent AS DeploymentConfigurationXml,
    pe.UserConfigurationTimestamp AS DeploymentConfigurationTimestamp
FROM PackageEntitlements pe
INNER JOIN PackageVersions pv ON pe.PackageVersionId = pv.Id
WHERE (pe.Sid IS NULL OR pe.Sid = '')
$(if ($whereConditions.Count -gt 0) { "AND " + ($whereConditions -join ' AND ') })
ORDER BY pe.PackageVersionId;
"@


        # Query 3: AD Entitlements with UserConfiguration (rows where SID is populated)
        $adEntitlementsQuery = @"
SELECT
    pe.Id AS EntitlementId,
    pe.PackageVersionId,
    pe.Sid,
    pe.UserConfigurationContent AS UserConfigurationXml,
    pe.UserConfigurationTimestamp AS UserConfigurationTimestamp
FROM PackageEntitlements pe
INNER JOIN PackageVersions pv ON pe.PackageVersionId = pv.Id
WHERE pe.Sid IS NOT NULL AND pe.Sid != ''
$(if ($whereConditions.Count -gt 0) { "AND " + ($whereConditions -join ' AND ') })
ORDER BY pe.PackageVersionId, pe.Sid;
"@


        try {
            $sqlParams = @{
                ServerInstance = $serverInstance
                Database       = $SQLDatabase
                Encrypt        = 'Optional'
                MaxCharLength  = [int]::MaxValue
                ErrorAction    = 'Stop'
            }

            if ($PSBoundParameters.ContainsKey('SQLCredential') -and -not [string]::IsNullOrEmpty($SQLCredential.UserName)) {
                $sqlParams['Credential'] = $SQLCredential
                Write-Verbose 'Using SQL Server authentication'
            } else {
                Write-Verbose 'Using Windows Integrated Authentication'
            }

            # Execute packages query
            Write-Verbose "Querying App-V Management Database for packages..."
            $sqlParams['Query'] = $packagesQuery
            Write-Verbose "Query: $packagesQuery"
            $packagesResults = Invoke-Sqlcmd @sqlParams

            if ($null -eq $packagesResults -or $packagesResults.Count -eq 0) {
                Write-Verbose 'No packages found'
                return
            }

            Write-Verbose "Found $($packagesResults.Count) package(s)"

            # Execute deployment config query
            Write-Verbose "Querying App-V Management Database for deployment configurations..."
            $sqlParams['Query'] = $deploymentConfigQuery
            Write-Verbose "Query: $deploymentConfigQuery"
            $deploymentConfigResults = Invoke-Sqlcmd @sqlParams

            # Index deployment configs by PackageVersionId
            $deploymentConfigs = @{}
            if ($deploymentConfigResults) {
                Write-Verbose "Found $($deploymentConfigResults.Count) deployment configuration(s)"
                foreach ($config in $deploymentConfigResults) {
                    $deploymentConfigs[$config.PackageVersionId] = $config
                }
            } else {
                Write-Verbose "No deployment configurations found"
            }

            # Execute AD entitlements query
            Write-Verbose "Querying App-V Management Database for AD entitlements..."
            $sqlParams['Query'] = $adEntitlementsQuery
            Write-Verbose "Query: $adEntitlementsQuery"
            $adEntitlementsResults = Invoke-Sqlcmd @sqlParams

            # Group AD entitlements by PackageVersionId
            $groupedEntitlements = @{}
            if ($adEntitlementsResults) {
                Write-Verbose "Found $($adEntitlementsResults.Count) AD entitlement(s)"
                foreach ($entitlement in $adEntitlementsResults) {
                    $pvId = $entitlement.PackageVersionId
                    if (-not $groupedEntitlements.ContainsKey($pvId)) {
                        $groupedEntitlements[$pvId] = @()
                    }
                    $groupedEntitlements[$pvId] += $entitlement
                }
            } else {
                Write-Verbose "No AD entitlements found"
            }

            # Get AD domain details once
            $DomainDetails = $null
            try {
                $DomainDetails = Get-AdsiADDomain
            } catch {
                Write-Verbose "Could not retrieve AD domain details: $($_.Exception.Message)"
            }

            # Build combined result objects
            $packages = @()

            foreach ($pkg in $packagesResults) {
                $pvId = $pkg.Id

                # Get deployment configuration for this package
                $deployConfig = $null
                $deployConfigTimestamp = $null
                if ($deploymentConfigs.ContainsKey($pvId)) {
                    $config = $deploymentConfigs[$pvId]
                    $deployConfig = if ($config.DeploymentConfigurationXml -is [DBNull]) { $null } else { $config.DeploymentConfigurationXml }
                    $deployConfigTimestamp = if ($config.DeploymentConfigurationTimestamp -is [DBNull]) { $null } else { $config.DeploymentConfigurationTimestamp }
                }

                # Build AD Groups array for this package
                $adGroups = @()
                if ($groupedEntitlements.ContainsKey($pvId)) {
                    foreach ($entitlement in $groupedEntitlements[$pvId]) {
                        $userConfigXml = if ($entitlement.UserConfigurationXml -is [DBNull]) { $null } else { $entitlement.UserConfigurationXml }

                        # Build the combined DeploymentConfigurationXml for this AD group
                        # If the AD group has a UserConfigurationXml, replace the <UserConfiguration> element
                        # in the global DeploymentConfigurationXml with the AD group's UserConfiguration
                        $combinedDeployConfig = $null
                        if ($deployConfig) {
                            if ($userConfigXml) {
                                # Parse both XMLs and merge
                                try {
                                    $deployXml = [xml]$deployConfig
                                    $userXml = [xml]$userConfigXml

                                    # Find the UserConfiguration element in the deployment config
                                    $nsManager = New-Object System.Xml.XmlNamespaceManager($deployXml.NameTable)
                                    $nsManager.AddNamespace("appv", "http://schemas.microsoft.com/appv/2010/deploymentconfiguration")

                                    $existingUserConfig = $deployXml.SelectSingleNode("//appv:UserConfiguration", $nsManager)

                                    if ($existingUserConfig -and $userXml.DocumentElement) {
                                        # Import the new UserConfiguration node into the deployment XML document
                                        $importedNode = $deployXml.ImportNode($userXml.DocumentElement, $true)

                                        # Replace the existing UserConfiguration with the new one
                                        $existingUserConfig.ParentNode.ReplaceChild($importedNode, $existingUserConfig) | Out-Null

                                        $combinedDeployConfig = $deployXml.OuterXml

                                        # Clean up the UserConfiguration element - remove extra attributes that come from standalone XML
                                        # The standalone UserConfiguration XML has attributes like xmlns:xsd, xmlns:xsi, PackageId, DisplayName, xmlns
                                        # that are not present in the embedded UserConfiguration element within DeploymentConfiguration
                                        # Use regex to clean up since .NET XML DOM doesn't easily allow removing default namespace
                                        # Match UserConfiguration opening tag with all its attributes and replace with clean version
                                        $combinedDeployConfig = $combinedDeployConfig -replace '<UserConfiguration[^>]*xmlns="http://schemas\.microsoft\.com/appv/2010/userconfiguration"[^>]*>', '<UserConfiguration>'
                                    } else {
                                        # No UserConfiguration element found to replace, use original
                                        $combinedDeployConfig = $deployConfig
                                    }
                                } catch {
                                    Write-Verbose "Failed to merge UserConfiguration into DeploymentConfiguration for SID $($entitlement.Sid): $($_.Exception.Message)"
                                    # Fall back to original deployment config
                                    $combinedDeployConfig = $deployConfig
                                }
                            } else {
                                # No UserConfigurationXml for this AD group, use the global deployment config as-is
                                $combinedDeployConfig = $deployConfig
                            }
                        }

                        $adGroupItem = [PSCustomObject]@{
                            EntitlementId              = $entitlement.EntitlementId
                            Sid                        = $entitlement.Sid
                            Name                       = ""
                            Domain                     = if ($DomainDetails) { $DomainDetails.DNSRoot } else { "" }
                            UserConfigurationXml       = $userConfigXml
                            UserConfigurationTimestamp = if ($entitlement.UserConfigurationTimestamp -is [DBNull]) { $null } else { $entitlement.UserConfigurationTimestamp }
                            DeploymentConfigurationXml = $combinedDeployConfig
                        }

                        # Try to resolve AD Group name from SID
                        try {
                            $adGroup = Get-AdsiADGroup -Identity $entitlement.Sid
                            if ($adGroup) {
                                $adGroupItem.Name = $adGroup.Name
                            }
                        } catch {
                            Write-Verbose "Failed to resolve AD Group for SID $($entitlement.Sid): $($_.Exception.Message)"
                        }

                        $adGroups += $adGroupItem
                    }
                }

                # Create the combined package object
                $package = [PSCustomObject]@{
                    Id                               = $pkg.Id
                    PackageGuid                      = $pkg.PackageGuid
                    VersionGuid                      = $pkg.VersionGuid
                    Name                             = $pkg.Name
                    Description                      = if ($pkg.Description -is [DBNull]) { $null } else { $pkg.Description }
                    Version                          = $pkg.VersionNumber
                    Size                             = $pkg.Size
                    SizeMB                           = $pkg.SizeMB
                    SizeFormatted                    = "$($pkg.SizeMB) MB"
                    PackageUrl                       = $pkg.PackageUrl
                    SequencerArchitecture            = $pkg.SequencerArchitecture
                    SupportedOSsFromManifest         = if ($pkg.SupportedOSsFromManifest -is [DBNull]) { $null } else { $pkg.SupportedOSsFromManifest }
                    Enabled                          = $pkg.Enabled
                    IsEnabled                        = [bool]$pkg.Enabled
                    TimeAdded                        = $pkg.TimeAdded
                    TimeChanged                      = if ($pkg.TimeChanged -is [DBNull]) { $null } else { $pkg.TimeChanged }
                    TimeEnabled                      = if ($pkg.TimeEnabled -is [DBNull]) { $null } else { $pkg.TimeEnabled }
                    ClientVersion                    = $pkg.ClientVersion
                    ApplicationCount                 = $pkg.ApplicationCount
                    ShortcutCount                    = $pkg.ShortcutCount
                    FileTypeAssociationCount         = $pkg.FileTypeAssociationCount
                    DeploymentConfigurationXml       = $deployConfig
                    DeploymentConfigurationTimestamp = $deployConfigTimestamp
                    ADGroups                         = $adGroups
                }

                $packages += $package
            }

            Write-Verbose "Returning $($packages.Count) package(s) with entitlements"
            return $packages

        } catch {
            Write-AppVentiXError -Message "Failed to query App-V Management database: $($_.Exception.Message)" `
                -ErrorId 'AppVDatabaseQueryFailed' `
                -Category InvalidOperation `
                -TargetObject $serverInstance `
                -Cmdlet $PSCmdlet
        }
    }

    end {
        Write-Verbose "Ending function 'Get-AppVManagementPackage'"
    }
}

# SIG # Begin signature block
# MIImdwYJKoZIhvcNAQcCoIImaDCCJmQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDrbYimH/LCuh8l
# vAgzazp1KqeEWF9VaeJ7Y3DvGGCbNaCCIAowggYUMIID/KADAgECAhB6I67aU2mW
# D5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQK
# Ew9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMTJVNlY3RpZ28gUHVibGljIFRpbWUg
# U3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5
# WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYD
# VQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjCCAaIwDQYJ
# KoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y2ENBq26CK+z2M34mNOSJjNPvIhKA
# VD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeYXIjfa3ajoW3cS3ElcJzkyZlBnwDE
# JuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCxpectRGhhnOSwcjPMI3G0hedv2eNm
# GiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY11XxM2AVZn0GiOUC9+XE0wI7CQKf
# OUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+va8WxTlA+uBvq1KO8RSHUQLgzb1g
# bL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fWlwBp6KNL19zpHsODLIsgZ+WZ1AzC
# s1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+Gyn9/CRezKe7WNyxRf4e4bwUtrYE
# 2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kOLIaFVhf5sMM/caEZLtOYqYadtn03
# 4ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwIDAQABo4IBXDCCAVgwHwYDVR0jBBgw
# FoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYDVR0OBBYEFF9Y7UwxeqJhQo1SgLqz
# YZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNVHRMBAf8ECDAGAQH/AgEAMBMGA1Ud
# JQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgwBgYEVR0gADBMBgNVHR8ERTBDMEGg
# P6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3Rh
# bXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcBAQRwMG4wRwYIKwYBBQUHMAKGO2h0
# dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY1RpbWVTdGFtcGluZ1Jv
# b3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAN
# BgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgMnoEdJVj9TC1ndK/HYiYh9lVUacah
# RoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvIyHI5UkPCbXKspioYMdbOnBWQUn73
# 3qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkkSivt51UlmJElUICZYBodzD3M/SFj
# eCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSKr+nDO+Db8qNcTbJZRAiSazr7KyUJ
# Go1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6ajTqV2ifikkVtB3RNBUgwu/mSiSU
# ice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY2752LmESsRVVoypJVt8/N3qQ1c6F
# ibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9AQO1gQrnh1TA8ldXuJzPSuALOz1Uj
# b0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNHe0pWSGH2opXZYKYG4Lbukg7HpNi/
# KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQaL0cJqlmnx9HCDxF+3BLbUufrV64
# EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWRItFA3DE8MORZeFb6BmzBtqKJ7l93
# 9bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMeYRriWklUPsetMSf2NvUQa/E5vVye
# fQIwggZFMIIELaADAgECAhAIMk+dt9qRb2Pk8qM8Xl1RMA0GCSqGSIb3DQEBCwUA
# MFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMu
# QS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQTAeFw0yNDA0
# MDQxNDA0MjRaFw0yNzA0MDQxNDA0MjNaMGsxCzAJBgNVBAYTAk5MMRIwEAYDVQQH
# DAlTY2hpam5kZWwxIzAhBgNVBAoMGkpvaG4gQmlsbGVrZW5zIENvbnN1bHRhbmN5
# MSMwIQYDVQQDDBpKb2huIEJpbGxla2VucyBDb25zdWx0YW5jeTCCAaIwDQYJKoZI
# hvcNAQEBBQADggGPADCCAYoCggGBAMslntDbSQwHZXwFhmibivbnd0Qfn6sqe/6f
# os3pKzKxEsR907RkDMet2x6RRg3eJkiIr3TFPwqBooyXXgK3zxxpyhGOcuIqyM9J
# 28DVf4kUyZHsjGO/8HFjrr3K1hABNUszP0o7H3o6J31eqV1UmCXYhQlNoW9FOmRC
# 1amlquBmh7w4EKYEytqdmdOBavAD5Xq4vLPxNP6kyA+B2YTtk/xM27TghtbwFGKn
# u9Vwnm7dFcpLxans4ONt2OxDQOMA5NwgcUv/YTpjhq9qoz6ivG55NRJGNvUXsM3w
# 2o7dR6Xh4MuEGrTSrOWGg2A5EcLH1XqQtkF5cZnAPM8W/9HUp8ggornWnFVQ9/6M
# ga+ermy5wy5XrmQpN+x3u6tit7xlHk1Hc+4XY4a4ie3BPXG2PhJhmZAn4ebNSBwN
# Hh8z7WTT9X9OFERepGSytZVeEP7hgyptSLcuhpwWeR4QdBb7dV++4p3PsAUQVHFp
# wkSbrRTv4EiJ0Lcz9P1HPGFoHiFAQQIDAQABo4IBeDCCAXQwDAYDVR0TAQH/BAIw
# ADA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY2NzY2EyMDIxLmNybC5jZXJ0dW0u
# cGwvY2NzY2EyMDIxLmNybDBzBggrBgEFBQcBAQRnMGUwLAYIKwYBBQUHMAGGIGh0
# dHA6Ly9jY3NjYTIwMjEub2NzcC1jZXJ0dW0uY29tMDUGCCsGAQUFBzAChilodHRw
# Oi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY2NzY2EyMDIxLmNlcjAfBgNVHSMEGDAW
# gBTddF1MANt7n6B0yrFu9zzAMsBwzTAdBgNVHQ4EFgQUO6KtBpOBgmrlANVAnyiQ
# C6W6lJwwSwYDVR0gBEQwQjAIBgZngQwBBAEwNgYLKoRoAYb2dwIFAQQwJzAlBggr
# BgEFBQcCARYZaHR0cHM6Ly93d3cuY2VydHVtLnBsL0NQUzATBgNVHSUEDDAKBggr
# BgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQADggIBAEQsN8wg
# PMdWVkwHPPTN+jKpdns5AKVFjcn00psf2NGVVgWWNQBIQc9lEuTBWb54IK6Ga3hx
# QRZfnPNo5HGl73YLmFgdFQrFzZ1lnaMdIcyh8LTWv6+XNWfoyCM9wCp4zMIDPOs8
# LKSMQqA/wRgqiACWnOS4a6fyd5GUIAm4CuaptpFYr90l4Dn/wAdXOdY32UhgzmSu
# xpUbhD8gVJUaBNVmQaRqeU8y49MxiVrUKJXde1BCrtR9awXbqembc7Nqvmi60tYK
# lD27hlpKtj6eGPjkht0hHEsgzU0Fxw7ZJghYG2wXfpF2ziN893ak9Mi/1dmCNmor
# GOnybKYfT6ff6YTCDDNkod4egcMZdOSv+/Qv+HAeIgEvrxE9QsGlzTwbRtbm6gwY
# YcVBs/SsVUdBn/TSB35MMxRhHE5iC3aUTkDbceo/XP3uFhVL4g2JZHpFfCSu2TQr
# rzRn2sn07jfMvzeHArCOJgBW1gPqR3WrJ4hUxL06Rbg1gs9tU5HGGz9KNQMfQFQ7
# 0Wz7UIhezGcFcRfkIfSkMmQYYpsc7rfzj+z0ThfDVzzJr2dMOFsMlfj1T6l22GBq
# 9XQx0A4lcc5Fl9pRxbOuHHWFqIBD/BCEhwniOCySzqENd2N+oz8znKooSISStnkN
# aYXt6xblJF2dx9Dn89FK7d1IquNxOwt0tI5dMIIGYjCCBMqgAwIBAgIRAKQpO24e
# 3denNAiHrXpOtyQwDQYJKoZIhvcNAQEMBQAwVTELMAkGA1UEBhMCR0IxGDAWBgNV
# BAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAxMjU2VjdGlnbyBQdWJsaWMgVGlt
# ZSBTdGFtcGluZyBDQSBSMzYwHhcNMjUwMzI3MDAwMDAwWhcNMzYwMzIxMjM1OTU5
# WjByMQswCQYDVQQGEwJHQjEXMBUGA1UECBMOV2VzdCBZb3Jrc2hpcmUxGDAWBgNV
# BAoTD1NlY3RpZ28gTGltaXRlZDEwMC4GA1UEAxMnU2VjdGlnbyBQdWJsaWMgVGlt
# ZSBTdGFtcGluZyBTaWduZXIgUjM2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEA04SV9G6kU3jyPRBLeBIHPNyUgVNnYayfsGOyYEXrn3+SkDYTLs1crcw/
# ol2swE1TzB2aR/5JIjKNf75QBha2Ddj+4NEPKDxHEd4dEn7RTWMcTIfm492TW22I
# 8LfH+A7Ehz0/safc6BbsNBzjHTt7FngNfhfJoYOrkugSaT8F0IzUh6VUwoHdYDpi
# ln9dh0n0m545d5A5tJD92iFAIbKHQWGbCQNYplqpAFasHBn77OqW37P9BhOASdmj
# p3IijYiFdcA0WQIe60vzvrk0HG+iVcwVZjz+t5OcXGTcxqOAzk1frDNZ1aw8nFhG
# EvG0ktJQknnJZE3D40GofV7O8WzgaAnZmoUn4PCpvH36vD4XaAF2CjiPsJWiY/j2
# xLsJuqx3JtuI4akH0MmGzlBUylhXvdNVXcjAuIEcEQKtOBR9lU4wXQpISrbOT8ux
# +96GzBq8TdbhoFcmYaOBZKlwPP7pOp5Mzx/UMhyBA93PQhiCdPfIVOCINsUY4U23
# p4KJ3F1HqP3H6Slw3lHACnLilGETXRg5X/Fp8G8qlG5Y+M49ZEGUp2bneRLZoyHT
# yynHvFISpefhBCV0KdRZHPcuSL5OAGWnBjAlRtHvsMBrI3AAA0Tu1oGvPa/4yeei
# Ayu+9y3SLC98gDVbySnXnkujjhIh+oaatsk/oyf5R2vcxHahajMCAwEAAaOCAY4w
# ggGKMB8GA1UdIwQYMBaAFF9Y7UwxeqJhQo1SgLqzYZcZojKbMB0GA1UdDgQWBBSI
# YYyhKjdkgShgoZsx0Iz9LALOTzAOBgNVHQ8BAf8EBAMCBsAwDAYDVR0TAQH/BAIw
# ADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEB
# AgEDCDAlMCMGCCsGAQUFBwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZn
# gQwBBAIwSgYDVR0fBEMwQTA/oD2gO4Y5aHR0cDovL2NybC5zZWN0aWdvLmNvbS9T
# ZWN0aWdvUHVibGljVGltZVN0YW1waW5nQ0FSMzYuY3JsMHoGCCsGAQUFBwEBBG4w
# bDBFBggrBgEFBQcwAoY5aHR0cDovL2NydC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVi
# bGljVGltZVN0YW1waW5nQ0FSMzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2Nz
# cC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAYEAAoE+pIZyUSH5ZakuPVKK
# 4eWbzEsTRJOEjbIu6r7vmzXXLpJx4FyGmcqnFZoa1dzx3JrUCrdG5b//LfAxOGy9
# Ph9JtrYChJaVHrusDh9NgYwiGDOhyyJ2zRy3+kdqhwtUlLCdNjFjakTSE+hkC9F5
# ty1uxOoQ2ZkfI5WM4WXA3ZHcNHB4V42zi7Jk3ktEnkSdViVxM6rduXW0jmmiu71Z
# pBFZDh7Kdens+PQXPgMqvzodgQJEkxaION5XRCoBxAwWwiMm2thPDuZTzWp/gUFz
# i7izCmEt4pE3Kf0MOt3ccgwn4Kl2FIcQaV55nkjv1gODcHcD9+ZVjYZoyKTVWb4V
# qMQy/j8Q3aaYd/jOQ66Fhk3NWbg2tYl5jhQCuIsE55Vg4N0DUbEWvXJxtxQQaVR5
# xzhEI+BjJKzh3TQ026JxHhr2fuJ0mV68AluFr9qshgwS5SpN5FFtaSEnAwqZv3IS
# +mlG50rK7W3qXbWwi4hmpylUfygtYLEdLQukNEX1jiOKMIIGgjCCBGqgAwIBAgIQ
# NsKwvXwbOuejs902y8l1aDANBgkqhkiG9w0BAQwFADCBiDELMAkGA1UEBhMCVVMx
# EzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYD
# VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBS
# U0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMjEwMzIyMDAwMDAwWhcNMzgw
# MTE4MjM1OTU5WjBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p
# dGVkMS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIFJvb3Qg
# UjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAiJ3YuUVnnR3d6Lkm
# gZpUVMB8SQWbzFoVD9mUEES0QUCBdxSZqdTkdizICFNeINCSJS+lV1ipnW5ihkQy
# C0cRLWXUJzodqpnMRs46npiJPHrfLBOifjfhpdXJ2aHHsPHggGsCi7uE0awqKggE
# /LkYw3sqaBia67h/3awoqNvGqiFRJ+OTWYmUCO2GAXsePHi+/JUNAax3kpqstbl3
# vcTdOGhtKShvZIvjwulRH87rbukNyHGWX5tNK/WABKf+Gnoi4cmisS7oSimgHUI0
# Wn/4elNd40BFdSZ1EwpuddZ+Wr7+Dfo0lcHflm/FDDrOJ3rWqauUP8hsokDoI7D/
# yUVI9DAE/WK3Jl3C4LKwIpn1mNzMyptRwsXKrop06m7NUNHdlTDEMovXAIDGAvYy
# nPt5lutv8lZeI5w3MOlCybAZDpK3Dy1MKo+6aEtE9vtiTMzz/o2dYfdP0KWZwZIX
# bYsTIlg1YIetCpi5s14qiXOpRsKqFKqav9R1R5vj3NgevsAsvxsAnI8Oa5s2oy25
# qhsoBIGo/zi6GpxFj+mOdh35Xn91y72J4RGOJEoqzEIbW3q0b2iPuWLA911cRxgY
# 5SJYubvjay3nSMbBPPFsyl6mY4/WYucmyS9lo3l7jk27MAe145GWxK4O3m3gEFEI
# kv7kRmefDR7Oe2T1HxAnICQvr9sCAwEAAaOCARYwggESMB8GA1UdIwQYMBaAFFN5
# v1qqK0rPVIDh2JvAnfKyA2bLMB0GA1UdDgQWBBT2d2rdP/0BE/8WoWyCAi/QCj0U
# JTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUEDDAKBggr
# BgEFBQcDCDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOgQYY/aHR0
# cDovL2NybC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25B
# dXRob3JpdHkuY3JsMDUGCCsGAQUFBwEBBCkwJzAlBggrBgEFBQcwAYYZaHR0cDov
# L29jc3AudXNlcnRydXN0LmNvbTANBgkqhkiG9w0BAQwFAAOCAgEADr5lQe1oRLjl
# ocXUEYfktzsljOt+2sgXke3Y8UPEooU5y39rAARaAdAxUeiX1ktLJ3+lgxtoLQhn
# 5cFb3GF2SSZRX8ptQ6IvuD3wz/LNHKpQ5nX8hjsDLRhsyeIiJsms9yAWnvdYOdEM
# q1W61KE9JlBkB20XBee6JaXx4UBErc+YuoSb1SxVf7nkNtUjPfcxuFtrQdRMRi/f
# InV/AobE8Gw/8yBMQKKaHt5eia8ybT8Y/Ffa6HAJyz9gvEOcF1VWXG8OMeM7Vy7B
# s6mSIkYeYtddU1ux1dQLbEGur18ut97wgGwDiGinCwKPyFO7ApcmVJOtlw9FVJxw
# /mL1TbyBns4zOgkaXFnnfzg4qbSvnrwyj1NiurMp4pmAWjR+Pb/SIduPnmFzbSN/
# G8reZCL4fvGlvPFk4Uab/JVCSmj59+/mB2Gn6G/UYOy8k60mKcmaAZsEVkhOFuoj
# 4we8CYyaR9vd9PGZKSinaZIkvVjbH/3nlLb0a7SBIkiRzfPfS9T+JesylbHa1LtR
# V9U/7m0q7Ma2CQ/t392ioOssXW7oKLdOmMBl14suVFBmbzrt5V5cQPnwtd3UOTpS
# 9oCG+ZZheiIvPgkDmA8FzPsnfXW5qHELB43ET7HHFHeRPRYrMBKjkb8/IN7Po0d0
# hQoF4TeMM+zYAJzoKQnVKOLg8pZVPT8wgga5MIIEoaADAgECAhEAmaOACiZVO2Wr
# 3G6EprPqOTANBgkqhkiG9w0BAQwFADCBgDELMAkGA1UEBhMCUEwxIjAgBgNVBAoT
# GVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1bSBDZXJ0
# aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0
# d29yayBDQSAyMB4XDTIxMDUxOTA1MzIxOFoXDTM2MDUxODA1MzIxOFowVjELMAkG
# A1UEBhMCUEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIG
# A1UEAxMbQ2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBMIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAnSPPBDAjO8FGLOczcz5jXXp1ur5cTbq96y34vuTm
# flN4mSAfgLKTvggv24/rWiVGzGxT9YEASVMw1Aj8ewTS4IndU8s7VS5+djSoMcbv
# IKck6+hI1shsylP4JyLvmxwLHtSworV9wmjhNd627h27a8RdrT1PH9ud0IF+njvM
# k2xqbNTIPsnWtw3E7DmDoUmDQiYi/ucJ42fcHqBkbbxYDB7SYOouu9Tj1yHIohzu
# C8KNqfcYf7Z4/iZgkBJ+UFNDcc6zokZ2uJIxWgPWXMEmhu1gMXgv8aGUsRdaCtVD
# 2bSlbfsq7BiqljjaCun+RJgTgFRCtsuAEw0pG9+FA+yQN9n/kZtMLK+Wo837Q4QO
# ZgYqVWQ4x6cM7/G0yswg1ElLlJj6NYKLw9EcBXE7TF3HybZtYvj9lDV2nT8mFSkc
# SkAExzd4prHwYjUXTeZIlVXqj+eaYqoMTpMrfh5MCAOIG5knN4Q/JHuurfTI5XDY
# O962WZayx7ACFf5ydJpoEowSP07YaBiQ8nXpDkNrUA9g7qf/rCkKbWpQ5boufUnq
# 1UiYPIAHlezf4muJqxqIns/kqld6JVX8cixbd6PzkDpwZo4SlADaCi2JSplKShBS
# ND36E/ENVv8urPS0yOnpG4tIoBGxVCARPCg1BnyMJ4rBJAcOSnAWd18Jx5n858JS
# qPECAwEAAaOCAVUwggFRMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFN10XUwA
# 23ufoHTKsW73PMAywHDNMB8GA1UdIwQYMBaAFLahVDkCw6A/joq8+tT4HKbROg79
# MA4GA1UdDwEB/wQEAwIBBjATBgNVHSUEDDAKBggrBgEFBQcDAzAwBgNVHR8EKTAn
# MCWgI6Ahhh9odHRwOi8vY3JsLmNlcnR1bS5wbC9jdG5jYTIuY3JsMGwGCCsGAQUF
# BwEBBGAwXjAoBggrBgEFBQcwAYYcaHR0cDovL3N1YmNhLm9jc3AtY2VydHVtLmNv
# bTAyBggrBgEFBQcwAoYmaHR0cDovL3JlcG9zaXRvcnkuY2VydHVtLnBsL2N0bmNh
# Mi5jZXIwOQYDVR0gBDIwMDAuBgRVHSAAMCYwJAYIKwYBBQUHAgEWGGh0dHA6Ly93
# d3cuY2VydHVtLnBsL0NQUzANBgkqhkiG9w0BAQwFAAOCAgEAdYhYD+WPUCiaU58Q
# 7EP89DttyZqGYn2XRDhJkL6P+/T0IPZyxfxiXumYlARMgwRzLRUStJl490L94C9L
# GF3vjzzH8Jq3iR74BRlkO18J3zIdmCKQa5LyZ48IfICJTZVJeChDUyuQy6rGDxLU
# UAsO0eqeLNhLVsgw6/zOfImNlARKn1FP7o0fTbj8ipNGxHBIutiRsWrhWM2f8pXd
# d3x2mbJCKKtl2s42g9KUJHEIiLni9ByoqIUul4GblLQigO0ugh7bWRLDm0CdY9rN
# LqyA3ahe8WlxVWkxyrQLjH8ItI17RdySaYayX3PhRSC4Am1/7mATwZWwSD+B7eMc
# ZNhpn8zJ+6MTyE6YoEBSRVrs0zFFIHUR08Wk0ikSf+lIe5Iv6RY3/bFAEloMU+vU
# BfSouCReZwSLo8WdrDlPXtR0gicDnytO7eZ5827NS2x7gCBibESYkOh1/w1tVxTp
# V2Na3PR7nxYVlPu1JPoRZCbH86gc96UTvuWiOruWmyOEMLOGGniR+x+zPF/2DaGg
# K2W1eEJfo2qyrBNPvF7wuAyQfiFXLwvWHamoYtPZo0LHuH8X3n9C+xN4YaNjt2yw
# zOr+tKyEVAotnyU9vyEVOaIYMk3IeBrmFnn0gbKeTTyYeEEUz/Qwt4HOUBCrW602
# NCmvO1nm+/80nLy5r0AZvCQxaQ4xggXDMIIFvwIBATBqMFYxCzAJBgNVBAYTAlBM
# MSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0Nl
# cnR1bSBDb2RlIFNpZ25pbmcgMjAyMSBDQQIQCDJPnbfakW9j5PKjPF5dUTANBglg
# hkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MC8GCSqGSIb3DQEJBDEiBCDX3fv9TomsOrkRZd6U8eA81YREKEh5ODoTyH71Dk9i
# mDANBgkqhkiG9w0BAQEFAASCAYBxFoLMiwt/7jSBpTxMeehUestlueA7LmQTmu1a
# uOukRQzL6X5MTnB0JEg71wLwUlCk7i2x2n0ax6YNsCvYVUvuGe89KsW4y4a2GjJQ
# cTsGdGhO6sB06aL5TzyMTF8ISco0ChoQyORxHN0pxG4o06P4+Ti2A4E07n8MHAZB
# xNR1J7BGHjcpvN39mMUs5eOGVZ5KbTuRjSLr/EsfyKLEqUJgsWQfE5MelwLoV2aP
# +VmY+ll2oH/SyUKX44e3dQXrX/pmHfs5WLt1svep3ZE1X8UXcM2L7+QEIttG1rr7
# CjDA3/6h3gMwHWk0Z9dZBanmD8Oi0gEKf0Vj9Y9L4KrOGBLmRNu2w+gQZWpTJgEA
# Fd48yUePMT1QJh5Gys+AxQStRZNE0j3+vAWELDsR0aq+4prHIhQFxRat5/AqXJ2Q
# IvjrxbraHeqSFZUWkzrfPuJOrLo/3B7TH0oe5YbYip26oJQAECdeUtbJfwjGJRgE
# JTSpKOLsQIO+kL32s9ILzOa6+gehggMjMIIDHwYJKoZIhvcNAQkGMYIDEDCCAwwC
# AQEwajBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSww
# KgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNgIRAKQp
# O24e3denNAiHrXpOtyQwDQYJYIZIAWUDBAICBQCgeTAYBgkqhkiG9w0BCQMxCwYJ
# KoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjAxMzAxNjM5NTZaMD8GCSqGSIb3
# DQEJBDEyBDCxrJIasj4/ZNWNGSDnOVo6TltpL4Yzsf53FsBW7ka/fwZi8481SFml
# KBxoHMyVL84wDQYJKoZIhvcNAQEBBQAEggIAnrfHudzJ1KwCjkdVO8RcNc64i9mF
# XCsSr9GbSrYyFtcoEjN92i7HxBJrfOvEaKFWLXUgCZsB2nwiJ7DvCwaJoUBZUob1
# yuzxPihx1KhpEZILjW8cjZHTuU0IzOSIDIvGXs9lE8hKvW0PZTH4GaGYffJjMF//
# fk8oAhaaXJhocTCgwNVGIW4D0/m8Kpjw3XKTWi6ov6UWfEKetYVBV+a6k/XfUiQM
# zxCp+q2/9zruvcnLmbi+4hpdJaa396t0jQS6M/5exiAvLJU7hmITc7H9RKG5NAD7
# o5qVr+O+6QhrgnYsp2ZvrW8hOzClNXjDTzr2q2dHkLxAT714ZBb3mwWe02sBR7uK
# fnk5nhcvGx7EIhHCwZbNoZ/LyU9uZfa+6vI2Zhxr4r+A2cNR5tJzhz9jqLS3+AcJ
# yYILopLHD+L6h0uR9NF816QayCFjUDNeU288ns1e4HBrI3Ml4cEN5awsHzcw62Xe
# iZSuA9dZpe5BAhUPWKu1Dp26VY2FaLGfIhiQtNZf8OJXJQyxCPN+b3zV6EOIKWID
# dx78Oj29Mw9V1TsMD0eTOPO0jKPbe+GG59WT9TBNmpYjnRx2nj7JTTLfTd/iJpBE
# yFs5D/MciRlDMvpwZ4ICirUrYCHZMiybkCN/K2ynuTAVoM6HwDdU9rTqTJM972Jc
# nXwqjHiNz6G26lE=
# SIG # End signature block