public/Set-AppVentiXUserSettingsAssignment.ps1

<#
.SYNOPSIS
    Assigns a user setting to an Active Directory group in AppVentiX.
 
.DESCRIPTION
    Set-AppVentiXUserSettingsAssignment assigns a specific user setting (identified by Id and Type)
    to an Active Directory group. If the AD group does not yet exist in the User Settings Assignments
    file, a new entry is created. If the assignment already exists, no changes are made.
 
    Supports the special built-in group "Everyone" in addition to standard AD groups.
    The function requires a valid AppVentiX license.
 
.PARAMETER Id
    The unique identifier of the user setting to assign.
 
.PARAMETER ADGroup
    The name of the Active Directory group to assign the user setting to.
    Use "Everyone" to assign to all users regardless of group membership.
 
.PARAMETER DomainFQDN
    The fully qualified domain name (FQDN) of the Active Directory domain.
    If not specified, the current domain FQDN is resolved automatically.
 
.PARAMETER ADGroupSID
    The Security Identifier (SID) of the AD group. If not specified, the SID is
    resolved automatically by querying Active Directory.
 
.PARAMETER Type
    The type of user setting to assign. Valid values are:
    EnvironmentVariables, PrinterMapping, DriveMapping, GroupPolicy, RegistrySettings, Shortcuts.
 
.PARAMETER ConfigShare
    The path to the AppVentiX configuration share. Defaults to the value configured in the module.
 
.EXAMPLE
    Set-AppVentiXUserSettingsAssignment -Id "abc123" -ADGroup "Finance" -Type "DriveMapping"
 
    Assigns the drive mapping with Id "abc123" to the Finance AD group.
 
.EXAMPLE
    Set-AppVentiXUserSettingsAssignment -Id "def456" -ADGroup "Everyone" -Type "EnvironmentVariables"
 
    Assigns the environment variable setting with Id "def456" to all users.
 
.NOTES
    Function : Set-AppVentiXUserSettingsAssignment
    Author : John Billekens
    Copyright : (c) John Billekens Consultancy & AppVentiX
    Version : 2026.130.1000
    Requires : Valid AppVentiX license
#>

function Set-AppVentiXUserSettingsAssignment {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]$Id,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$ADGroup,

        [Parameter(Mandatory = $false)]
        [string]$DomainFQDN,

        [Parameter(Mandatory = $false)]
        [string]$ADGroupSID,

        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [ValidateSet("EnvironmentVariables", "PrinterMapping", "DriveMapping", "GroupPolicy", "RegistrySettings","Shortcuts")]
        [string]$Type,

        [Parameter(DontShow)]
        [ValidateNotNullOrEmpty()]
        [String]$ConfigShare = $Script:AppVentiX.ConfigShare
    )
    $PSDefaultParameterValues['Write-AppVentiXError:Cmdlet'] = $PSCmdlet

    if (Test-AppVentiXIsLicensed -ConfigShare $ConfigShare) {
        $ConfigShare = "$($ConfigShare)".ToLower()
        $UserSettingsAssignmentsFilename = Join-Path -Path $ConfigShare -ChildPath $Script:AppVentiX.UserSettingsAssignmentsFilename

        if ($ADGroup -ieq "Everyone") {
            $ADGroup = "Everyone"
            $ADGroupSID = "23-23-23-23"
            $GroupType = "Built-in"
        } else {
            $GroupType = "AD"
            if ([string]::IsNullOrEmpty($DomainFQDN)) {
                $DomainFQDN = $((Get-AdsiADDomain).DNSRoot).ToUpper()
            }
            if ([string]::IsNullOrEmpty($DomainFQDN)) {
                throw "Unable to determine the domain FQDN."
            } else {
                Write-Verbose "Determined domain FQDN as '$DomainFQDN'."
            }
            if ((-Not [string]::IsNullOrEmpty($DomainFQDN) -and ($ADGroup -notlike "$DomainFQDN\*"))) {
                if ($ADGroup -like "*\*") {
                    $ADGroup = $ADGroup.Split('\')[1]
                }
                $ADGroup = "$DomainFQDN\$ADGroup"
            }
            if ($ADGroup -notlike "*$DomainFQDN*") {
                Write-Warning "The provided ADGroup '$ADGroup' does not contain the domain FQDN '$DomainFQDN'. Assuming it's a group name and prepending the domain."
                if ($ADGroup -like "*\*") {
                    $ADGroup = $ADGroup.Split('\')[1]
                }
                $ADGroup = "$DomainFQDN\$ADGroup"
            }
        }
        Write-Verbose "Processing assignment for AD Group '$ADGroup'."
        try {
            if ([string]::IsNullOrEmpty($ADGroupSID)) {
                $ADGroupSID = Get-AdsiADGroup -Identity $ADGroup.Split('\')[1] | Select-Object -ExpandProperty objectSid
                Write-Verbose "Retrieved SID '$ADGroupSID' for AD Group '$ADGroup'."
            }
            if ([string]::IsNullOrEmpty($ADGroupSID)) {
                throw "AD Group '$ADGroup' was found but has no SID."
            }
            Write-Verbose "Resolved AD Group '$ADGroup' to SID '$ADGroupSID'."
        } catch {
            throw "Failed to resolve AD Group '$ADGroup'. Error: $($_.Exception.Message)"
        }

        # Load or create User Settings Assignments XML
        if (-not (Test-Path -Path $UserSettingsAssignmentsFilename)) {
            Write-Verbose "User Settings Assignments file not found at '$UserSettingsAssignmentsFilename'. Creating new file."
            # Create XML document without BOM for PowerShell 5.x compatibility
            $UserSettingsAssignmentsXml = New-Object System.Xml.XmlDocument
            $rootElement = $UserSettingsAssignmentsXml.CreateElement("UserSettingsAssignments")
            [void]$UserSettingsAssignmentsXml.AppendChild($rootElement)
            $UserSettingsAssignmentsXml.Save($UserSettingsAssignmentsFilename)
            Write-Verbose "Created new User Settings Assignments file at '$UserSettingsAssignmentsFilename'."
            Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "Created new User Settings Assignments file at '$UserSettingsAssignmentsFilename'."
        } else {
            Write-Verbose "Loading User Settings Assignments XML from '$UserSettingsAssignmentsFilename'."
            try {
                $UserSettingsAssignmentsXml = New-Object System.Xml.XmlDocument
                $UserSettingsAssignmentsXml.Load($UserSettingsAssignmentsFilename)
                # Validate XML has proper root element
                if ($null -eq $UserSettingsAssignmentsXml.DocumentElement -or $UserSettingsAssignmentsXml.DocumentElement.Name -ne "UserSettingsAssignments") {
                    throw "Invalid XML structure: UserSettingsAssignments root element not found."
                }
            } catch {
                throw "Failed to load User Settings Assignments XML from '$UserSettingsAssignmentsFilename'. Error: $($_.Exception.Message)"
            }
        }
        Write-Verbose "Searching for existing UserGroup assignment for AD Group '$ADGroup'."
        $AssignmentUserGroup = $UserSettingsAssignmentsXml.DocumentElement.UserGroup | Where-Object { $_.GroupName -ieq $ADGroup }

        if ($AssignmentUserGroup) {
            Write-Verbose "Existing UserGroup assignment found for AD Group '$ADGroup'. No changes made."
            Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "Found existing UserGroup assignment for AD Group '$ADGroup' with AssignmentId '$($AssignmentUserGroup.Id)'."
        } else {
            Write-Verbose "No existing UserGroup assignment found for AD Group '$ADGroup'. Creating new assignment."
            $UserGroupAssignmentId = [Guid]::NewGuid().ToString()
            # Add element Id, GroupName, FriendlyName, ADGroupSID, GroupType = "AD", CreatedDate in yyyy-MM-dd HH:mm:ss format, assignments = @()
            $NewAssignmentUserGroup = $UserSettingsAssignmentsXml.CreateElement("UserGroup")
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "Id" -Value $UserGroupAssignmentId
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "GroupName" -Value $ADGroup
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "FriendlyName" -Value $ADGroup
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "ADGroupSID" -Value $ADGroupSID
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "GroupType" -Value $GroupType
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "CreatedDate" -Value (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignmentUserGroup -Name "Assignments"
            Write-Verbose "Created new UserGroup assignment for AD Group '$ADGroup' with AssignmentId '$UserGroupAssignmentId'."
            [void]$UserSettingsAssignmentsXml.DocumentElement.AppendChild($NewAssignmentUserGroup)
            # Re-query to get the XmlElement object (not the AppendChild return value)
            $AssignmentUserGroup = $UserSettingsAssignmentsXml.DocumentElement.UserGroup | Where-Object { $_.Id -eq $UserGroupAssignmentId }
            Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "Created new UserGroup assignment for AD Group '$ADGroup' with AssignmentId '$UserGroupAssignmentId'."
        }
        Write-Verbose "Checking for existing assignment of UserSettingId '$Id' in group '$ADGroup'."
        #search with xpath in Assignments for UserSettingPath
        $ExistingAssignment = $null
        if ($AssignmentUserGroup.Assignments -and $AssignmentUserGroup.Assignments.Assignment) {
            $ExistingAssignment = $AssignmentUserGroup.Assignments.Assignment | Where-Object { $_.UserSettingId -ieq $Id -and $_.UserSettingType -ieq $Type }
        }

        if ($ExistingAssignment) {
            Write-Warning "An assignment for UserSettingId '$Id' already exists in group '$ADGroup'. No changes made."
            Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "An assignment for $Type $Id already exists in group '$ADGroup'. No changes made."
        } else {
            Write-Verbose "No existing assignment found for UserSettingId '$Id'. Creating new assignment."
            $AssignmentId = [Guid]::NewGuid().ToString()
            $NewAssignment = $UserSettingsAssignmentsXml.CreateElement("Assignment")
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignment -Name "AssignmentId" -Value $AssignmentId
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignment -Name "UserSettingId" -Value $Id
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignment -Name "UserSettingType" -Value $Type
            Add-XmlElement -XmlDocument $UserSettingsAssignmentsXml -ParentNode $NewAssignment -Name "AssignedDate" -Value (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")

            # Ensure we get the Assignments node correctly
            $AssignmentsNode = $AssignmentUserGroup.SelectSingleNode("Assignments")
            if ($null -eq $AssignmentsNode) {
                $AssignmentsNode = $AssignmentUserGroup.ChildNodes | Where-Object { $_.Name -eq "Assignments" }
            }
            # Create Assignments node if it doesn't exist (backward compatibility)
            if ($null -eq $AssignmentsNode) {
                Write-Verbose "Assignments node missing for UserGroup '$($AssignmentUserGroup.GroupName)'. Creating it now."
                $AssignmentsNode = $UserSettingsAssignmentsXml.CreateElement("Assignments")
                [void]$AssignmentUserGroup.AppendChild($AssignmentsNode)
            }
            $AssignmentsNode.AppendChild($NewAssignment) | Out-Null

            # Save XML
            Write-Verbose "Saving User Settings Assignments XML to '$UserSettingsAssignmentsFilename'."
            try {
                $UserSettingsAssignmentsXml.Save($UserSettingsAssignmentsFilename)
                Write-Verbose "Assigned UserSettingId '$Id' to AD Group '$ADGroup'."
                Write-AppVentiXLogEntry -Feature UserSettings -Action $($MyInvocation.MyCommand.Name) -Details "Assigned $Type $Id to AD Group '$ADGroup'"
            } catch {
                throw "Failed to save User Settings Assignments XML to '$UserSettingsAssignmentsFilename'. Error: $($_.Exception.Message)"
            }
        }
        Write-Verbose "Completed processing for Set-AppVentiXUserSettingsAssignment."
    } else {
        Write-Warning "AppVentiX is not licensed. Please provide a valid license to use this function."
    }
}

# SIG # Begin signature block
# MII6vwYJKoZIhvcNAQcCoII6sDCCOqwCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDOxExv9iGZtWBJ
# T2VAtGAJRqA4oFJ4kN4XD26s6kQD+aCCIuQwggXMMIIDtKADAgECAhBUmNLR1FsZ
# 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
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggcGMIIE7qADAgECAhMzAAfM8rDv
# Jyd7QZv4AAAAB8zyMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDIwHhcNMjYwNDAyMjE0MTIwWhcNMjYwNDA1
# MjE0MTIwWjCBgzELMAkGA1UEBhMCTkwxFjAUBgNVBAgTDU5vb3JkLUJyYWJhbnQx
# EjAQBgNVBAcTCVNjaGlqbmRlbDEjMCEGA1UEChMaSm9obiBCaWxsZWtlbnMgQ29u
# c3VsdGFuY3kxIzAhBgNVBAMTGkpvaG4gQmlsbGVrZW5zIENvbnN1bHRhbmN5MIIB
# ojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAql2zC5qD+WbLZzawVOEM6hmw
# E525pZhueIRBk85Br6ZG8FoUZl7WzaPQV6JlW6kukWABJbvNbIKzQnLhu+SmCtBF
# 5OA+rjaAREtoajEbtuL+N7rmNVrPTe7POYz2lgLn3VL/0l+xTMI402gfo/Vvha2H
# ItsKRA93A7FHmWxnnhyA7p2ucpLfJNdNoCK1XsB22sNdhTqV8/TWRTuGzYP+FvTp
# jhdcq/xyy16jKdwIgNOXCCAU9U4EO1TLR1WTTmxQNOWy5dNdP48HYLiACx/d9Gf1
# EVytoAgxmsNon12TmLU/FW1KUddP91DcbCmvEg0Zmab/UBPg0bRRufv8oGeJqnb9
# bcCUxCH99cPAvIe0MLg4qCtRM80fA36yz4/dfIC7xowKEUxhR7/kWUfg+3mKA2nJ
# F6qSv3+llYtt7O6GRPWD40Rk9LGbSQD3+uCuAIBUNqh4Sokq1q+j+8jjU4yBNFBc
# tL1HsI6KXgTLWBO81v+mX+Fs62Euo8AfRByW7HhRAgMBAAGjggIZMIICFTAMBgNV
# HRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA8BgNVHSUENTAzBgorBgEEAYI3YQEA
# BggrBgEFBQcDAwYbKwYBBAGCN2G789NTgYr4ukmC0/31KIOytcN0MB0GA1UdDgQW
# BBQKkf4WVoYJs/qIk34nGHoMkkbjSzAfBgNVHSMEGDAWgBRln1HOhWh/L4pFiKrd
# pzG7Hg0AXjBnBgNVHR8EYDBeMFygWqBYhlZodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBF
# T0MlMjBDQSUyMDAyLmNybDCBpQYIKwYBBQUHAQEEgZgwgZUwZAYIKwYBBQUHMAKG
# WGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0
# JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwMi5jcnQwLQYIKwYB
# BQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDBmBgNVHSAE
# XzBdMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1p
# Y3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQB
# MA0GCSqGSIb3DQEBDAUAA4ICAQC74nf6TvL5WCfrJh27QL0oRpanrcasjQ1NTjWc
# SfyFdOv0IxPLaTcDfmin4wwOwgESPhnSPNWDwFf7tatAOG6pTL4MG2Op+izJPbGa
# ap0Hht3E0qTTsgaoxC2CEgnfeInM2SCKIbf7ymTd76TfqQSDUQdz25Z343yKOPLT
# 5WI/krGe4zCQh+ObMqhTfRTi31YQa+k9fRCALCGcVuu6nrfEC36y5zh8OmxbmawY
# L/CgWg2V5OYx5EA3WXgFnJbgrt3YpL6rxNKcFTvqmqEkc5X1g6CucGXLkAH1x2CC
# HoPQ/D5212vdFoPXLhHjASEbIi5VyzA77rFJF1ahcWO+pHI5YyQ4pvVrPCQ2im1D
# vsihP12hTrlHxdSQnB57pBvKHPRyZdKIxl0eurYdsNIqdspSi0VuWbLB+xUwJhZf
# cSmFBg9uIGVrQrt9MHAKzmcSAJQJn70BmaMmOgR5JbYsDOU4TIRg0p7h5XKWTvso
# 1wGR/Ondg7CdFb68kfjNhUAZtCUNd4HdxcgVqkeaLV6teIpNChYu2EUuzOAG7P1V
# hdz3fhn6WoKU6Yaj6mkIPOcBBJzM3ecoriYrrg2GQePxgWJltU6+zwA2PRrqzUzJ
# Brkln75enYK+/KjaCrNE98LiX2/aHHkFDCxd2fwl47iSkdSR57klynfkL+28Lf2e
# WhjDFzCCBwYwggTuoAMCAQICEzMAB8zysO8nJ3tBm/gAAAAHzPIwDQYJKoZIhvcN
# AQEMBQAwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAw
# MjAeFw0yNjA0MDIyMTQxMjBaFw0yNjA0MDUyMTQxMjBaMIGDMQswCQYDVQQGEwJO
# TDEWMBQGA1UECBMNTm9vcmQtQnJhYmFudDESMBAGA1UEBxMJU2NoaWpuZGVsMSMw
# IQYDVQQKExpKb2huIEJpbGxla2VucyBDb25zdWx0YW5jeTEjMCEGA1UEAxMaSm9o
# biBCaWxsZWtlbnMgQ29uc3VsdGFuY3kwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
# ggGKAoIBgQCqXbMLmoP5ZstnNrBU4QzqGbATnbmlmG54hEGTzkGvpkbwWhRmXtbN
# o9BXomVbqS6RYAElu81sgrNCcuG75KYK0EXk4D6uNoBES2hqMRu24v43uuY1Ws9N
# 7s85jPaWAufdUv/SX7FMwjjTaB+j9W+FrYci2wpED3cDsUeZbGeeHIDuna5ykt8k
# 102gIrVewHbaw12FOpXz9NZFO4bNg/4W9OmOF1yr/HLLXqMp3AiA05cIIBT1TgQ7
# VMtHVZNObFA05bLl010/jwdguIALH930Z/URXK2gCDGaw2ifXZOYtT8VbUpR10/3
# UNxsKa8SDRmZpv9QE+DRtFG5+/ygZ4mqdv1twJTEIf31w8C8h7QwuDioK1EzzR8D
# frLPj918gLvGjAoRTGFHv+RZR+D7eYoDackXqpK/f6WVi23s7oZE9YPjRGT0sZtJ
# APf64K4AgFQ2qHhKiSrWr6P7yONTjIE0UFy0vUewjopeBMtYE7zW/6Zf4WzrYS6j
# wB9EHJbseFECAwEAAaOCAhkwggIVMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQD
# AgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhsrBgEEAYI3Ybvz
# 01OBivi6SYLT/fUog7K1w3QwHQYDVR0OBBYEFAqR/hZWhgmz+oiTficYegySRuNL
# MB8GA1UdIwQYMBaAFGWfUc6FaH8vikWIqt2nMbseDQBeMGcGA1UdHwRgMF4wXKBa
# oFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29m
# dCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDIuY3JsMIGlBggr
# BgEFBQcBAQSBmDCBlTBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1Ml
# MjBFT0MlMjBDQSUyMDAyLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3Au
# bWljcm9zb2Z0LmNvbS9vY3NwMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBALvi
# d/pO8vlYJ+smHbtAvShGlqetxqyNDU1ONZxJ/IV06/QjE8tpNwN+aKfjDA7CARI+
# GdI81YPAV/u1q0A4bqlMvgwbY6n6LMk9sZpqnQeG3cTSpNOyBqjELYISCd94iczZ
# IIoht/vKZN3vpN+pBINRB3PblnfjfIo48tPlYj+SsZ7jMJCH45syqFN9FOLfVhBr
# 6T19EIAsIZxW67qet8QLfrLnOHw6bFuZrBgv8KBaDZXk5jHkQDdZeAWcluCu3dik
# vqvE0pwVO+qaoSRzlfWDoK5wZcuQAfXHYIIeg9D8PnbXa90Wg9cuEeMBIRsiLlXL
# MDvusUkXVqFxY76kcjljJDim9Ws8JDaKbUO+yKE/XaFOuUfF1JCcHnukG8oc9HJl
# 0ojGXR66th2w0ip2ylKLRW5ZssH7FTAmFl9xKYUGD24gZWtCu30wcArOZxIAlAmf
# vQGZoyY6BHkltiwM5ThMhGDSnuHlcpZO+yjXAZH86d2DsJ0VvryR+M2FQBm0JQ13
# gd3FyBWqR5otXq14ik0KFi7YRS7M4Abs/VWF3Pd+GfpagpTphqPqaQg85wEEnMzd
# 5yiuJiuuDYZB4/GBYmW1Tr7PADY9GurNTMkGuSWfvl6dgr78qNoKs0T3wuJfb9oc
# eQUMLF3Z/CXjuJKR1JHnuSXKd+Qv7bwt/Z5aGMMXMIIHWjCCBUKgAwIBAgITMwAA
# AAX7elwyE2HfXQAAAAAABTANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3Nv
# ZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTIxMDQxMzE3
# MzE1M1oXDTI2MDQxMzE3MzE1M1owWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlm
# aWVkIENTIEVPQyBDQSAwMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# ANIamXw/MpCkwOgg21r7IZgaQ6AX+y79d9kVbkqlcEDt2gCy5LkZ50yKEZjBqNHy
# DEK7cEelBwdOsXajpAH6gensbm10x7uOPnbh1AnROJ4IxCwUMpbjLkjpx2hHb3iG
# 7d9ToTBF/+J0JKYePgIdHkeB9rE0a1Spiq5TqEJYYmu90INnR6IrXF9bk9b1typ6
# bfTLe+h+2R2yzbKTGS5FgWmyjJegXWlmV2KTxnUvqmPNIA2jQrxatHddFDLu8R3r
# CKl6Uw090NwHjsUspUk3P++D96IPY9zrnphBWrhcy+ebdTL6WnRIUJg/LhTMRb/4
# mTo8L3HWNc4Wp1Sy8qZc9d/zc0qFN0I4T3agBoUSMIf2A86N4wnVSYFkEa1vNz96
# lhRZMTYjBNojuCLmII+0cLHhsL+yPXMTsmh4oSjHU/TXqEo6Ujc1ZyihnGDLTnTL
# ShaqFewoptpvOBpiGGUwaK0fz6PYsJWrE2ChaRmanVismJyTthVfKDJlpCCtYmoC
# y4BLemWkdK5P9Y1GLLMk4kalq/OELN1y/1eSlARLVBEH0P+EbZyNPbhRVCBiWVfZ
# g/8TlJLFqHRqwkEnpuh8tutcTCQB6k6jLgyoMIvMZP5n5a+8oVzy+90jlC5rtQKr
# uCOxqXukMDVtk7UAcTN77Uk5nT1uqyuctIBA+dUY7MitAgMBAAGjggIOMIICCjAO
# BgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGWfUc6F
# aH8vikWIqt2nMbseDQBeMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB
# /wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBn
# MGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNy
# b3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAy
# MDIxLmNybDCBrgYIKwYBBQUHAQEEgaEwgZ4wbQYIKwYBBQUHMAKGYWh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBW
# ZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwLQYIKwYB
# BQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG
# 9w0BAQwFAAOCAgEARUlg1HdPF+IOR871X6wdUolfKZOlzx0/Yz5Apr1P7rwc5mUQ
# I2JNoCmEd6V6ErUSWif5YYwuQ6v9kez9WEWRwg2MitM70kTHROmELYBo5rHYcw9J
# wkuoVVXIH5jULHDydVh8W7xuREIGENGRA9RTdDDj0M1ntc2x+VWtHUsbZ6HQVUY5
# 8g2BJu7DRHLyR0xt3l8wMndNBOSgwrBJeM+TtJr16sGh9j0tNtNBOj+Fqi8ILPzZ
# lLufgGvC8P9hJ9lZCFuz5Iq+FJ9YxuvrY/3obqoBclDzwoepG575OPG4rIv8z4wF
# ZI+6hK6+30mCAgsyeLOGFDVVR4HaBZ9sW1u2XwU90APc34avbuBMV261Q+a8V0kx
# RFINoM0KvSR8bHR8jH3AiixUDlzg0s3GHi6Qnfq+hnKAwU6Mj3SnHIwupgKuvv4Y
# jA56bylCB6cmBM1lHmrbcil7TH/kKyXkPp8uYwS/sanTjjxM93YO6p/P6Ka1K1Gx
# iwb/X1ptfH1l3QL9TwrSy/2nDC7R6MnklTCkGKgx290JtLkPjUNGBOJFMUkGvlv3
# As2ACN9rjdJ2/TODK9aY+GyWYnTZDOCcmKns6ISC8WJIB226CUCEq0Fq5uUWHcoS
# gaabSfSSZ9Gety43Z85TlMY5bAG0Iq9lps/ziRO9NwWx5kGUcMz8db7u0ucwggee
# MIIFhqADAgECAhMzAAAAB4ejNKN7pY4cAAAAAAAHMA0GCSqGSIb3DQEBDAUAMHcx
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBG
# BgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0
# aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMTA0MDEyMDA1MjBaFw0zNjA0MDEy
# MDE1MjBaMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25p
# bmcgUENBIDIwMjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCy8MCv
# GYgo4t1UekxJbGkIVQm0Uv96SvjB6yUo92cXdylN65Xy96q2YpWCiTas7QPTkGnK
# 9QMKDXB2ygS27EAIQZyAd+M8X+dmw6SDtzSZXyGkxP8a8Hi6EO9Zcwh5A+wOALNQ
# bNO+iLvpgOnEM7GGB/wm5dYnMEOguua1OFfTUITVMIK8faxkP/4fPdEPCXYyy8NJ
# 1fmskNhW5HduNqPZB/NkWbB9xxMqowAeWvPgHtpzyD3PLGVOmRO4ka0WcsEZqyg6
# efk3JiV/TEX39uNVGjgbODZhzspHvKFNU2K5MYfmHh4H1qObU4JKEjKGsqqA6Rzi
# ybPqhvE74fEp4n1tiY9/ootdU0vPxRp4BGjQFq28nzawuvaCqUUF2PWxh+o5/TRC
# b/cHhcYU8Mr8fTiS15kRmwFFzdVPZ3+JV3s5MulIf3II5FXeghlAH9CvicPhhP+V
# aSFW3Da/azROdEm5sv+EUwhBrzqtxoYyE2wmuHKws00x4GGIx7NTWznOm6x/niqV
# i7a/mxnnMvQq8EMse0vwX2CfqM7Le/smbRtsEeOtbnJBbtLfoAsC3TdAOnBbUkbU
# fG78VRclsE7YDDBUbgWt75lDk53yi7C3n0WkHFU4EZ83i83abd9nHWCqfnYa9qIH
# PqjOiuAgSOf4+FRcguEBXlD9mAInS7b6V0UaNwIDAQABo4ICNTCCAjEwDgYDVR0P
# AQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTZQSmwDw9jbO9p
# 1/XNKZ6kSGow5jBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt
# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYD
# VR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWG
# c2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy
# MElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIw
# QXV0aG9yaXR5JTIwMjAyMC5jcmwwgcMGCCsGAQUFBwEBBIG2MIGzMIGBBggrBgEF
# BQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNy
# b3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZp
# Y2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8v
# b25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcNAQEMBQADggIBAH8l
# Kp7+1Kvq3WYK21cjTLpebJDjW4ZbOX3HD5ZiG84vjsFXT0OB+eb+1TiJ55ns0BHl
# uC6itMI2vnwc5wDW1ywdCq3TAmx0KWy7xulAP179qX6VSBNQkRXzReFyjvF2BGt6
# FvKFR/imR4CEESMAG8hSkPYso+GjlngM8JPn/ROUrTaeU/BRu/1RFESFVgK2wMz7
# fU4VTd8NXwGZBe/mFPZG6tWwkdmA/jLbp0kNUX7elxu2+HtHo0QO5gdiKF+YTYd1
# BGrmNG8sTURvn09jAhIUJfYNotn7OlThtfQjXqe0qrimgY4Vpoq2MgDW9ESUi1o4
# pzC1zTgIGtdJ/IvY6nqa80jFOTg5qzAiRNdsUvzVkoYP7bi4wLCj+ks2GftUct+f
# GUxXMdBUv5sdr0qFPLPB0b8vq516slCfRwaktAxK1S40MCvFbbAXXpAZnU20FaAo
# Dwqq/jwzwd8Wo2J83r7O3onQbDO9TyDStgaBNlHzMMQgl95nHBYMelLEHkUnVVVT
# UsgC0Huj09duNfMaJ9ogxhPNThgq3i8w3DAGZ61AMeF0C1M+mU5eucj1Ijod5O2M
# MPeJQ3/vKBtqGZg4eTtUHt/BPjN74SsJsyHqAdXVS5c+ItyKWg3Eforhox9k3Wgt
# WTpgV4gkSiS4+A09roSdOI4vrRw+p+fL4WrxSK5nMYIXMTCCFy0CAQEwcTBaMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYD
# VQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgRU9DIENBIDAyAhMzAAfM8rDv
# Jyd7QZv4AAAAB8zyMA0GCWCGSAFlAwQCAQUAoF4wEAYKKwYBBAGCNwIBDDECMAAw
# GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEIHatiTce
# Rd01irYGk3f+5vtnqXCnFd9IVSny5OaYuI16MA0GCSqGSIb3DQEBAQUABIIBgHq8
# GVGjKHoh1oQ1QOvtRMqRz84nT5oS9dUX8tO5sXi6+R3b4tSh0eAV3PPcAjkH5MZ9
# KIcYk5O+t+wimL7nB4WhbccYsRWtC+A5Gycu9Z1GAPCiomEt3+NuZeeLZLJr7yae
# TLofDNk2uahPiM+eSvwaUApy+GgGMaFUl7JdefhOBNAD153yOdsdiNxWRi/Wv1AY
# q9wsmvHTbXRc0syh2Le6LlQDFu3okrhqQL+TCGQ6tTZ1kIFaWHnzCxnvyApgfYM2
# lLssPeH+16PmROb98ThokqelDtagb+x9yAEueogfnp1jqyz28gGzrDO+a8ewbSDi
# YC9KZopXBzLAdIW6Yxgl06rZu/5NDQ5WrF2EpK4VippJhCvIqtP2B0WOyzavHRCx
# T0kON+KpSCeOZMpcrJUXBHO2i/kpT7iY2VwrN4kCK1Wn5s8erQABWOFg/nGIIKs8
# kZoLpZH1EWpIVX1UoFDAI3TONUIGeqK7M0fqwvbS189w6vt+lwkwrEXdFyNqYKGC
# FLEwghStBgorBgEEAYI3AwMBMYIUnTCCFJkGCSqGSIb3DQEHAqCCFIowghSGAgED
# MQ8wDQYJYIZIAWUDBAIBBQAwggFpBgsqhkiG9w0BCRABBKCCAVgEggFUMIIBUAIB
# AQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCDUuQ3o6oEi8CPkgtOpm7yL
# bfcdQb/dqBpNGTURZRtlgQIGacZcYMdtGBIyMDI2MDQwMzE0MzMzOS43OVowBIAC
# AfSggemkgeYwgeMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw
# DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x
# LTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEn
# MCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjQ1MUEtMDVFMC1EOTQ3MTUwMwYDVQQD
# EyxNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eaCC
# DykwggeCMIIFaqADAgECAhMzAAAABeXPD/9mLsmHAAAAAAAFMA0GCSqGSIb3DQEB
# DAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9v
# dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMDExMTkyMDMyMzFaFw0z
# NTExMTkyMDQyMzFaMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVz
# dGFtcGluZyBDQSAyMDIwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# nnznUmP94MWfBX1jtQYioxwe1+eXM9ETBb1lRkd3kcFdcG9/sqtDlwxKoVIcaqDb
# +omFio5DHC4RBcbyQHjXCwMk/l3TOYtgoBjxnG/eViS4sOx8y4gSq8Zg49REAf5h
# uXhIkQRKe3Qxs8Sgp02KHAznEa/Ssah8nWo5hJM1xznkRsFPu6rfDHeZeG1Wa1wI
# SvlkpOQooTULFm809Z0ZYlQ8Lp7i5F9YciFlyAKwn6yjN/kR4fkquUWfGmMopNq/
# B8U/pdoZkZZQbxNlqJOiBGgCWpx69uKqKhTPVi3gVErnc/qi+dR8A2MiAz0kN0nh
# 7SqINGbmw5OIRC0EsZ31WF3Uxp3GgZwetEKxLms73KG/Z+MkeuaVDQQheangOEMG
# J4pQZH55ngI0Tdy1bi69INBV5Kn2HVJo9XxRYR/JPGAaM6xGl57Ei95HUw9NV/uC
# 3yFjrhc087qLJQawSC3xzY/EXzsT4I7sDbxOmM2rl4uKK6eEpurRduOQ2hTkmG1h
# SuWYBunFGNv21Kt4N20AKmbeuSnGnsBCd2cjRKG79+TX+sTehawOoxfeOO/jR7wo
# 3liwkGdzPJYHgnJ54UxbckF914AqHOiEV7xTnD1a69w/UTxwjEugpIPMIIE67SFZ
# 2PMo27xjlLAHWW3l1CEAFjLNHd3EQ79PUr8FUXetXr0CAwEAAaOCAhswggIXMA4G
# A1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNVHQ4EFgQUa2koOjUv
# SGNAz3vYr0npPtk92yEwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEW
# M2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5
# Lmh0bTATBgNVHSUEDDAKBggrBgEFBQcDCDAZBgkrBgEEAYI3FAIEDB4KAFMAdQBi
# AEMAQTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfP
# UBBPaKiiMIGEBgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlv
# biUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIGU
# BggrBgEFBQcBAQSBhzCBhDCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9z
# b2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJp
# ZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIw
# LmNydDANBgkqhkiG9w0BAQwFAAOCAgEAX4h2x35ttVoVdedMeGj6TuHYRJklFaW4
# sTQ5r+k77iB79cSLNe+GzRjv4pVjJviceW6AF6ycWoEYR0LYhaa0ozJLU5Yi+LCm
# crdovkl53DNt4EXs87KDogYb9eGEndSpZ5ZM74LNvVzY0/nPISHz0Xva71QjD4h+
# 8z2XMOZzY7YQ0Psw+etyNZ1CesufU211rLslLKsO8F2aBs2cIo1k+aHOhrw9xw6J
# CWONNboZ497mwYW5EfN0W3zL5s3ad4Xtm7yFM7Ujrhc0aqy3xL7D5FR2J7x9cLWM
# q7eb0oYioXhqV2tgFqbKHeDick+P8tHYIFovIP7YG4ZkJWag1H91KlELGWi3SLv1
# 0o4KGag42pswjybTi4toQcC/irAodDW8HNtX+cbz0sMptFJK+KObAnDFHEsukxD+
# 7jFfEV9Hh/+CSxKRsmnuiovCWIOb+H7DRon9TlxydiFhvu88o0w35JkNbJxTk4Mh
# F/KgaXn0GxdH8elEa2Imq45gaa8D+mTm8LWVydt4ytxYP/bqjN49D9NZ81coE6aQ
# Wm88TwIf4R4YZbOpMKN0CyejaPNN41LGXHeCUMYmBx3PkP8ADHD1J2Cr/6tjuOOC
# ztfp+o9Nc+ZoIAkpUcA/X2gSMkgHAPUvIdtoSAHEUKiBhI6JQivRepyvWcl+JYbY
# bBh7pmgAXVswggefMIIFh6ADAgECAhMzAAAAXGFMAKan8ukjAAAAAABcMA0GCSqG
# SIb3DQEBDAUAMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt
# cGluZyBDQSAyMDIwMB4XDTI2MDEwODE4NTkwNloXDTI3MDEwNzE4NTkwNlowgeMx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1p
# Y3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNo
# aWVsZCBUU1MgRVNOOjQ1MUEtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQg
# UHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAK41jM5VeZNHd4NtVlUxNoOHqf6e/TgnDjNbq/s5
# M3WhNLEEiHKrpAowFqcDZ5ek7KpDRW9xeBwLlLPdoyCV1fIpHv1swh4tU9C1dIKy
# OusuN32al13lVCrgd8qBqKw8sW/rKenXHaDW94g2HlX5ssQWnVcKpZYIR3UpExCm
# RSQtIVEFloWZvo3PcwatECZTifG3TAhX/bTBKXOFoUpqWk/SFLAj7WxULE3wfyuW
# CH7SMY1mAIkSdcrDdI7/AkSNGFkw9pRIYRftzAKvOqP/LWGcD5rwZvB9nSUJA+Yy
# uNty/HePVUvpV5wWel2F/I/kCksfkJKRe01iGIWLuYbzz34yLP4JyvtrA+IU/Uu8
# BH0JMNkfPi5r8DmviM56Ef0BTt4Q/G6UDDLQEHLA6Xu2kreAox7HBDKAcWll7l3t
# M+K5XMrCS1uH2ujgKQPByl1QcJGDKw065mvxZ3rR/0MuSKihAVGH+aJxnHzYNRMO
# UzkK1yXg2zgd6Nk1Eav4a93tX2Qq5kXpeZba132ohkYvh5vnXkjQVQ9HJwfe+J+0
# 9lUpgNuSHwb/gjzi2Z8+Hg9pwe7okJ2QLQGw5TQRkw/xK7aH02aDBXOTzo1Uft/U
# mEVxbCzFnGFGAjcr0RwfnGFaIyyrF5uZmSsWKCF2o7v7LOjNlneWSSoFaKRhODuK
# Rjw/AgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUrvsyHJEYZEQ5bnTgWgMSJ7ok52kw
# HwYDVR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUwYzBhoF+g
# XYZbaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwUHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNybDB5
# BggrBgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGlt
# ZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB
# /wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBdMFEGDCsG
# AQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0GCSqGSIb3
# DQEBDAUAA4ICAQCFdtA33LEkhAWdgIW55V5nT1ZG/VaQ4M2yBBDuIKUf20fPW0Pq
# luLQtPcodrXGZDeCiON3Op3kUTXAYwBpm+7YPMrJbRlZgMQPsFtbSdHC9bET0NJV
# 8oXDGEWBOQe7lwwH05+Pa17xB2/mmVenWWtrZX11I8BoFjcP2DwZSJ5X1G6TTe6G
# YJl99H58ihs7Tv/TEZP7c8mj6eVeOCsiyKGXpRTYJL9yltt6cKKccmcraVSjMTv4
# 3bmpLLL1WCq+y/T3HEtjXizKXRo5m3TE69UgiosqZ66LeH0dvFB9u1+B7EtDjTPv
# Cyc4n83+W3vm9BqzBmvf3ESgwt4J5KHK+CoyKieaRBdP3rVOLouk3MaFkAFHthWl
# f6rzh/0DopuXxqYby3Eot1c530MqQJ31v72xJMSe5Qs+zK55qsKg22vck6b2mwhD
# /ZNh66YeBsVY2kS9ahkGMtR+OgPz0DnDi+OeR60bwiZHJifwyHMTcGuT9pUnp7nC
# t6e0vIhhtmJ1tlEIMurW4SYtUKiULzP6SLdq8ys1+BUohCht/tgi+ibWfTSno7ve
# BC7xaJi6JskqA/E8PdEzUOWHabwYiSHXlZMbobOTR0Dk3IzaqgUUX+E2xsfmVj2o
# uthvWZ55c1/PfLK1p4yzRe9+rY3V4Ni0ORGUQWhefgkNYspB1jZiXDq8gzGCA9Qw
# ggPQAgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1w
# aW5nIENBIDIwMjACEzMAAABcYUwApqfy6SMAAAAAAFwwDQYJYIZIAWUDBAIBBQCg
# ggEtMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg
# 2IHjY969fNYxBM4+Perng4Zv4DZEFTSEq9F62B+7xa4wgd0GCyqGSIb3DQEJEAIv
# MYHNMIHKMIHHMIGgBCD3umpBh3duMPkt6ItkJtOzRwBRt1Q8I513q8lrfqDu3DB8
# MGWkYzBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg
# Q0EgMjAyMAITMwAAAFxhTACmp/LpIwAAAAAAXDAiBCAZC4LCS8tW/DaWReSE3+mL
# b3T6dQq17TrB+7CUr7DwGjANBgkqhkiG9w0BAQsFAASCAgBP5ar6knD7nrK57A8r
# q5e4GKig+NpYCp1fJnEZomX3LxrK/JNT8nCqfuxMMjEssxae1NVYL/lV0XAQyjBH
# rGmGyGxjsZa7htIcek8wailY0CaYdG68upQp/cUso4aJNZkYpg1hLqdaokdcp/IA
# ENTCJ+6Yq0ddOEM6uZ1eClztheyhaxLeiI4Gmypl24rwgZHhAtLyxu9tvH5T+/8G
# Xb2cQEZdadbV8jUigziZod19s6rh/TNzrHeOmCf/HtlhWJT4TD8Xuuo/CoRtZJDE
# y9+yjRcqg1mG/VqRoljlAX8MD0tfqRHNti4y3qU3EbbFO1r0NOdvaTP/QKSwqQZn
# VFFLvVW6EcDItp/4GhBWTr5ZaD476XRaSZy/mJxDi4aAyFFbj8oJOq+VTp+hm1Lk
# 4r8hQ0n0rczXfDrQDaKxC5wu5YH8qWsH8a0685FrCE+/bWEZtmQaXbqv53w+Rbhj
# vnStR0pbMJyB1nBUwWh/L/DqwZ858PG+jUb+GA1i2Ce7jP8B2/B3BjaHh87hvwHB
# Y+4cALFoi0m6EKbkclpYgfXlwv8BaaoSSdkIrFLkDay9wVAkSau63q/NjpcoSJco
# XNucPv5uwqQ9i/thJTKuBEdHTSVpiPMcN9tb/nKlzSiYrb1W+bLgxsYOBPCb7D50
# JF5ini70rSeJMvK3eKQGYLCkjA==
# SIG # End signature block