Functions/Update-CrlDateTimeStamp.ps1

<#
 
.SYNOPSIS
    Set the file system timestamp of published certificate revocation list (CRL) files to the ThisUpdate value embedded in the CRL.
 
.PARAMETER Path
    One or more folders or CRL files to process. When omitted, CRL publication locations are discovered automatically from the local certification authority (CA) configuration in the registry.
 
.PARAMETER DelaySeconds
    The number of seconds to wait before processing files. Use this when the function is triggered by an event to allow the CA to finish writing files. The default value is 0.
 
.PARAMETER RetryCount
    The number of times to retry a file that is locked or in use. The default value is 3.
 
.PARAMETER RetryDelaySeconds
    The number of seconds to wait between retries. The default value is 5.
 
.PARAMETER RegisterScheduledTask
    Registers a scheduled task on the local CA server that runs this function whenever security event ID 4872 (Certificate Services published the CRL) is logged. A daily trigger is also added as a safety net. The event log source used by the function is also registered. The task imports the ADCSTools module from its current installation path, so run this command again after the module is updated or moved.
 
.PARAMETER TaskName
    The name of the scheduled task to register. The default value is Update-CrlDateTimeStamp.
 
.EXAMPLE
    Update-CrlDateTimeStamp
 
    Running this PowerShell command discovers CRL publication folders from the local CA configuration and sets the timestamp of each CRL file to its ThisUpdate value.
 
.EXAMPLE
    Update-CrlDateTimeStamp -Path '\\fs1.corp.example.net\pki\', '\\fs2.corp.example.net\pki\'
 
    Running this PowerShell command processes all CRL files in the specified folders without reading the local CA configuration.
 
.EXAMPLE
    Update-CrlDateTimeStamp -WhatIf
 
    Running this PowerShell command reports which CRL files would be updated without making any changes.
 
.EXAMPLE
    Update-CrlDateTimeStamp -RegisterScheduledTask
 
    Running this PowerShell command registers a scheduled task running as SYSTEM that imports the ADCSTools module and runs Update-CrlDateTimeStamp with a 5 second delay each time security event ID 4872 is logged, and once daily as a backup.
 
.DESCRIPTION
    When a CA publishes CRL files to multiple file shares, or when several web servers serve the same CRL, the last write time of each copy differs slightly. IIS derives the ETag and Last-Modified HTTP headers from the file's last write time, so identical CRLs served by load-balanced web servers return different ETags. This causes unnecessary cache misses and conditional request failures.
 
    This function sets the last write time and creation time of each CRL file to the ThisUpdate value contained in the CRL itself. Because ThisUpdate is part of the signed CRL, every copy of the same CRL receives an identical timestamp regardless of which server wrote it or when. The operation is idempotent and safe to run repeatedly.
 
    Publication locations are discovered from the CRLPublicationURLs registry value of the active CA. Only entries flagged for base CRL (1) or delta CRL (64) publication that refer to file system paths are used. LDAP and HTTP entries are ignored. All CRL files in each discovered folder are processed, which covers renewed CA keys and delta CRLs without special handling.
 
    Each run writes a single summary event to the Application event log using the source Update-CrlDateTimeStamp. Event ID 1000 (Information) is logged when the run completes without issues, event ID 1001 (Warning) when a location was not accessible or a file could not be updated, and event ID 1002 (Error) when the function terminates unexpectedly. No events are written when the WhatIf parameter is specified. The event log source is registered by the RegisterScheduledTask parameter. If the source does not exist and cannot be created, a warning is displayed and the run continues.
 
    Security event ID 4872 is only logged when success auditing is enabled for the Certification Services subcategory (auditpol /set /subcategory:"Certification Services" /success:enable) and the CA audit filter includes revocation and CRL publishing (certutil -setreg CA\AuditFilter 127 followed by a restart of the CertSvc service).
 
.INPUTS
    None. This function does not accept pipeline input.
 
.OUTPUTS
    PSCustomObject. Returns an object for each CRL file processed with the file path, ThisUpdate value, previous last write time, and result.
 
.LINK
    https://github.com/richardhicks/adcstools/blob/main/Functions/Update-CrlDateTimeStamp.ps1
 
.LINK
    https://www.richardhicks.com/
 
.NOTES
    Version: 1.0
    Creation Date: September 2, 2026
    Last Updated: September 2, 2026
    Author: Richard Hicks
    Organization: Richard M. Hicks Consulting, Inc.
    Contact: rich@richardhicks.com
    Website: https://www.richardhicks.com/
 
#>


Function Update-CrlDateTimeStamp {

    [CmdletBinding(SupportsShouldProcess, DefaultParameterSetName = 'Update')]
    [OutputType([PSCustomObject])]

    Param (

        [Parameter(ParameterSetName = 'Update')]
        [ValidateNotNullOrEmpty()]
        [string[]]$Path,
        [Parameter(ParameterSetName = 'Update')]
        [ValidateRange(0, 300)]
        [int]$DelaySeconds = 0,
        [Parameter(ParameterSetName = 'Update')]
        [ValidateRange(0, 10)]
        [int]$RetryCount = 3,
        [Parameter(ParameterSetName = 'Update')]
        [ValidateRange(1, 60)]
        [int]$RetryDelaySeconds = 5,
        [Parameter(ParameterSetName = 'Register', Mandatory)]
        [switch]$RegisterScheduledTask,
        [Parameter(ParameterSetName = 'Register')]
        [ValidateNotNullOrEmpty()]
        [string]$TaskName = 'Update-CrlDateTimeStamp'

    )

    # Registry location of the CA configuration
    $CertSvcConfigPath = 'HKLM:\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration'

    # CRLPublicationURLs flag bits for file publishing
    $CsUrlServerPublish = 1
    $CsUrlServerPublishDelta = 64

    # Event log source and event IDs
    $EventLogName = 'Application'
    $EventSource = 'Update-CrlDateTimeStamp'
    $EventIdCompleted = 1000
    $EventIdCompletedWithWarnings = 1001
    $EventIdFailed = 1002

    # Warnings collected during the run for the summary event
    $Issues = [System.Collections.Generic.List[string]]::new()

    # Writes a warning to the console and records it for the summary event
    Function Write-CrlTimestampWarning {

        [CmdletBinding()]

        Param (

            [string]$Message

        )

        Write-Warning $Message
        $Issues.Add($Message)

    }

    # Writes an entry to the Application event log. Failures are reported as warnings and never abort the run
    Function Write-CrlTimestampEvent {

        [CmdletBinding()]

        Param (

            [System.Diagnostics.EventLogEntryType]$EntryType,
            [int]$EventId,
            [string]$Message

        )

        If ($WhatIfPreference) {

            Write-Verbose 'Skipping event log entry (WhatIf).'
            Return

        }

        Try {

            If (-Not [System.Diagnostics.EventLog]::SourceExists($EventSource)) {

                [System.Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName)
                Write-Verbose "Created event log source '$EventSource' in the $EventLogName log."

            }

            [System.Diagnostics.EventLog]::WriteEntry($EventSource, $Message, $EntryType, $EventId)
            Write-Verbose "Logged event ID $EventId ($EntryType) to the $EventLogName log."

        }

        Catch {

            Write-Warning "Unable to write to the $EventLogName event log. $($_.Exception.Message)"

        }

    }

    # Reads the tag, length, and content position of the ASN.1 DER element starting at the given offset
    Function Read-Asn1Element {

        [CmdletBinding()]

        Param (

            [byte[]]$Data,
            [int]$Offset

        )

        If ($Offset -ge $Data.Length) {

            Throw 'Unexpected end of ASN.1 data.'

        }

        $Tag = $Data[$Offset]
        $Position = $Offset + 1
        $Length = [int]$Data[$Position]
        $Position++

        # Long form length
        If ($Length -band 0x80) {

            $LengthBytes = $Length -band 0x7F

            If ($LengthBytes -eq 0 -or $LengthBytes -gt 4) {

                Throw 'Unsupported ASN.1 length encoding.'

            }

            $Length = 0

            For ($i = 0; $i -lt $LengthBytes; $i++) {

                $Length = ($Length -shl 8) -bor $Data[$Position]
                $Position++

            }

        }

        If ($Position + $Length -gt $Data.Length) {

            Throw 'ASN.1 element length exceeds available data.'

        }

        Return [PSCustomObject]@{

            Tag           = $Tag
            Length        = $Length
            ContentOffset = $Position
            NextOffset    = $Position + $Length

        }

    }

    # Returns the ThisUpdate value of a DER or PEM encoded CRL file as a UTC DateTime
    Function Get-CrlThisUpdate {

        [CmdletBinding()]
        [OutputType([datetime])]

        Param (

            [string]$FilePath

        )

        $Data = [System.IO.File]::ReadAllBytes($FilePath)

        # Convert PEM encoded CRL to DER
        If ($Data.Length -gt 10 -and [System.Text.Encoding]::ASCII.GetString($Data, 0, 10) -eq '-----BEGIN') {

            $Pem = [System.Text.Encoding]::ASCII.GetString($Data)
            $Base64 = ($Pem -split "`r?`n" | Where-Object { $_ -notmatch '^-----' }) -join ''
            $Data = [System.Convert]::FromBase64String($Base64)

        }

        # CertificateList SEQUENCE
        $CertificateList = Read-Asn1Element -Data $Data -Offset 0

        If ($CertificateList.Tag -ne 0x30) {

            Throw 'File is not a DER encoded CRL.'

        }

        # TBSCertList SEQUENCE
        $TbsCertList = Read-Asn1Element -Data $Data -Offset $CertificateList.ContentOffset

        If ($TbsCertList.Tag -ne 0x30) {

            Throw 'File is not a DER encoded CRL.'

        }

        $Element = Read-Asn1Element -Data $Data -Offset $TbsCertList.ContentOffset

        # Optional version INTEGER
        If ($Element.Tag -eq 0x02) {

            $Element = Read-Asn1Element -Data $Data -Offset $Element.NextOffset

        }

        # Signature AlgorithmIdentifier SEQUENCE
        If ($Element.Tag -ne 0x30) {

            Throw 'Unexpected CRL structure (signature algorithm).'

        }

        $Element = Read-Asn1Element -Data $Data -Offset $Element.NextOffset

        # Issuer Name SEQUENCE
        If ($Element.Tag -ne 0x30) {

            Throw 'Unexpected CRL structure (issuer).'

        }

        $Element = Read-Asn1Element -Data $Data -Offset $Element.NextOffset

        # ThisUpdate Time (UTCTime or GeneralizedTime)
        $TimeString = [System.Text.Encoding]::ASCII.GetString($Data, $Element.ContentOffset, $Element.Length)

        Switch ($Element.Tag) {

            0x17 { $Format = 'yyMMddHHmmss\Z' }
            0x18 { $Format = 'yyyyMMddHHmmss\Z' }
            Default { Throw 'Unexpected CRL structure (ThisUpdate).' }

        }

        Return [datetime]::ParseExact($TimeString, $Format, [System.Globalization.CultureInfo]::InvariantCulture, [System.Globalization.DateTimeStyles]::AssumeUniversal -bor [System.Globalization.DateTimeStyles]::AdjustToUniversal)

    }

    # Returns the file system folders the local CA publishes CRL files to, discovered from the registry
    Function Get-CrlPublicationFolder {

        [CmdletBinding()]
        [OutputType([string])]

        Param ()

        If (-Not (Test-Path -Path $CertSvcConfigPath)) {

            Throw 'Certificate Services configuration not found in the registry. Run this function on a CA server or specify the Path parameter.'

        }

        $CaName = (Get-ItemProperty -Path $CertSvcConfigPath -Name 'Active' -ErrorAction Stop).Active
        $CaConfigPath = Join-Path -Path $CertSvcConfigPath -ChildPath $CaName
        $PublicationUrls = (Get-ItemProperty -Path $CaConfigPath -Name 'CRLPublicationURLs' -ErrorAction Stop).CRLPublicationURLs

        Write-Verbose "Active CA is '$CaName'."

        # Token values used in publication URL templates
        $SanitizedName = $CaName -replace '[\\/:*?"<>|]', '_'
        $Tokens = @{

            '%1' = [System.Net.Dns]::GetHostEntry($env:computername).HostName
            '%2' = $env:computername
            '%3' = $CaName
            '%7' = $SanitizedName

        }

        ForEach ($Entry in $PublicationUrls) {

            # Each entry is <flags>:<template>
            If ($Entry -notmatch '^(\d+):(.+)$') {

                Write-CrlTimestampWarning "Ignoring unrecognized CRLPublicationURLs entry '$Entry'."
                Continue

            }

            $Flags = [int]$Matches[1]
            $Template = $Matches[2]

            # Only locations the CA writes base or delta CRLs to
            If (($Flags -band ($CsUrlServerPublish -bor $CsUrlServerPublishDelta)) -eq 0) {

                Write-Verbose "Skipping '$Template' (not a publishing location)."
                Continue

            }

            # Only file system locations
            If ($Template -match '^(ldap|https?):') {

                Write-Verbose "Skipping '$Template' (not a file system location)."
                Continue

            }

            $FilePath = $Template

            # Convert file URL to file system path
            If ($FilePath -match '^file://(.+)$') {

                $FilePath = $Matches[1]

                If ($FilePath -match '^/*([A-Za-z]:.*)$') {

                    # file:///C:/path or file://C:\path (as written by the CA console)
                    $FilePath = $Matches[1] -replace '/', '\'

                }

                ElseIf ($FilePath -notmatch '^\\\\') {

                    # file://server/share/path
                    $FilePath = '\\' + ($FilePath -replace '/', '\')

                }

            }

            # Expand tokens that may appear in the folder portion of the template
            ForEach ($Token in $Tokens.Keys) {

                $FilePath = $FilePath.Replace($Token, $Tokens[$Token])

            }

            $Folder = Split-Path -Path $FilePath -Parent

            If ([string]::IsNullOrWhiteSpace($Folder)) {

                Write-CrlTimestampWarning "Unable to determine folder for publication entry '$Template'."
                Continue

            }

            Write-Verbose "Discovered CRL publication folder '$Folder'."
            Write-Output $Folder

        }

    }

    # Registers the event log source and a scheduled task that runs this function on security event 4872 and once daily
    Function Register-CrlTimestampTask {

        [CmdletBinding(SupportsShouldProcess)]

        Param (

            [string]$Name

        )

        # Event log source for run summaries
        If ($PSCmdlet.ShouldProcess($EventSource, "Register event log source in the $EventLogName log")) {

            If ([System.Diagnostics.EventLog]::SourceExists($EventSource)) {

                Write-Verbose "Event log source '$EventSource' already exists."

            }

            Else {

                [System.Diagnostics.EventLog]::CreateEventSource($EventSource, $EventLogName)
                Write-Verbose "Registered event log source '$EventSource' in the $EventLogName log."

            }

        }

        # The task starts a new PowerShell session on every run, so the module (or this file when used standalone) must be loaded before the function is called
        $Module = $ExecutionContext.SessionState.Module

        If ($Null -ne $Module) {

            $ManifestPath = Join-Path -Path $Module.ModuleBase -ChildPath "$($Module.Name).psd1"
            $LoadPath = If (Test-Path -Path $ManifestPath) { $ManifestPath } Else { $Module.Path }
            $LoadCommand = "Import-Module -Name '$LoadPath'"

        }

        Else {

            $LoadPath = $PSCommandPath
            $LoadCommand = ". '$LoadPath'"

        }

        $Command = "$LoadCommand; Update-CrlDateTimeStamp -DelaySeconds 5"
        $Arguments = "-NoProfile -NonInteractive -ExecutionPolicy Bypass -Command `"$Command`""
        $Action = New-ScheduledTaskAction -Execute 'powershell.exe' -Argument $Arguments

        # Event trigger for CRL publication (security event 4872)
        $Subscription = @'
<QueryList><Query Id="0" Path="Security"><Select Path="Security">*[System[Provider[@Name='Microsoft-Windows-Security-Auditing'] and EventID=4872]]</Select></Query></QueryList>
'@


        $TriggerClass = Get-CimClass -ClassName MSFT_TaskEventTrigger -Namespace Root/Microsoft/Windows/TaskScheduler
        $EventTrigger = New-CimInstance -CimClass $TriggerClass -ClientOnly
        $EventTrigger.Subscription = $Subscription
        $EventTrigger.Enabled = $true

        # Daily trigger as a safety net
        $DailyTrigger = New-ScheduledTaskTrigger -Daily -At '3:00AM'

        $Principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -LogonType ServiceAccount -RunLevel Highest
        $Settings = New-ScheduledTaskSettingsSet -MultipleInstances IgnoreNew -ExecutionTimeLimit (New-TimeSpan -Minutes 10) -StartWhenAvailable

        If ($PSCmdlet.ShouldProcess($Name, 'Register scheduled task')) {

            Register-ScheduledTask -TaskName $Name -Action $Action -Trigger @($EventTrigger, $DailyTrigger) -Principal $Principal -Settings $Settings -Description 'Sets the timestamp of published CRL files to the CRL ThisUpdate value so ETags match across load-balanced web servers.' -Force | Out-Null
            Write-Verbose "Registered scheduled task '$Name' loading '$LoadPath'."

        }

    }

    # Register scheduled task and exit
    If ($PSCmdlet.ParameterSetName -eq 'Register') {

        Register-CrlTimestampTask -Name $TaskName
        Return

    }

    $Results = [System.Collections.Generic.List[PSCustomObject]]::new()

    Try {

        # Wait for the CA to finish writing files when triggered by an event
        If ($DelaySeconds -gt 0) {

            Write-Verbose "Waiting $DelaySeconds seconds before processing."
            Start-Sleep -Seconds $DelaySeconds

        }

        # Determine locations to process
        If ($PSBoundParameters.ContainsKey('Path')) {

            $Locations = $Path

        }

        Else {

            $Locations = @(Get-CrlPublicationFolder | Select-Object -Unique)

        }

        If ($Locations.Count -eq 0) {

            Throw 'No CRL publication locations were found.'

        }

        # Collect CRL files
        $CrlFiles = ForEach ($Location in $Locations) {

            If (-Not (Test-Path -Path $Location)) {

                Write-CrlTimestampWarning "Location '$Location' is not accessible."
                Continue

            }

            $Item = Get-Item -Path $Location

            If ($Item.PSIsContainer) {

                Get-ChildItem -Path $Location -Filter '*.crl' -File

            }

            Else {

                $Item

            }

        }

        If (-Not $CrlFiles) {

            Write-CrlTimestampWarning 'No CRL files were found.'

        }

        # Process each CRL file
        ForEach ($File in ($CrlFiles | Sort-Object -Property FullName -Unique)) {

            $Result = [PSCustomObject]@{

                Path                     = $File.FullName
                ThisUpdate               = $null
                PreviousLastWriteTimeUtc = $File.LastWriteTimeUtc
                Result                   = $null

            }

            $Attempt = 0

            While ($true) {

                Try {

                    $ThisUpdate = Get-CrlThisUpdate -FilePath $File.FullName
                    $Result.ThisUpdate = $ThisUpdate

                    If ($File.LastWriteTimeUtc -eq $ThisUpdate -and $File.CreationTimeUtc -eq $ThisUpdate) {

                        Write-Verbose "'$($File.FullName)' already has timestamp $($ThisUpdate.ToString('u'))."
                        $Result.Result = 'Unchanged'

                    }

                    ElseIf ($PSCmdlet.ShouldProcess($File.FullName, "Set timestamp to $($ThisUpdate.ToString('u'))")) {

                        $File.LastWriteTimeUtc = $ThisUpdate
                        $File.CreationTimeUtc = $ThisUpdate
                        Write-Verbose "'$($File.FullName)' timestamp set to $($ThisUpdate.ToString('u'))."
                        $Result.Result = 'Updated'

                    }

                    Else {

                        $Result.Result = 'Skipped'

                    }

                    Break

                }

                Catch [System.IO.IOException] {

                    $Attempt++

                    If ($Attempt -gt $RetryCount) {

                        Write-CrlTimestampWarning "Unable to update '$($File.FullName)' after $RetryCount retries. $($_.Exception.Message)"
                        $Result.Result = 'Failed'
                        Break

                    }

                    Write-Verbose "'$($File.FullName)' is in use. Retrying in $RetryDelaySeconds seconds (attempt $Attempt of $RetryCount)."
                    Start-Sleep -Seconds $RetryDelaySeconds

                }

                Catch {

                    Write-CrlTimestampWarning "Unable to update '$($File.FullName)'. $($_.Exception.Message)"
                    $Result.Result = 'Failed'
                    Break

                }

            }

            $Results.Add($Result)
            Write-Output $Result

        }

    }

    Catch {

        Write-CrlTimestampEvent -EntryType Error -EventId $EventIdFailed -Message "CRL timestamp update failed.`r`n`r`n$($_.Exception.Message)"
        Throw

    }

    # Write run summary to the event log
    $Updated = @($Results | Where-Object { $_.Result -eq 'Updated' })
    $Unchanged = @($Results | Where-Object { $_.Result -eq 'Unchanged' })
    $Failed = @($Results | Where-Object { $_.Result -eq 'Failed' })

    $Summary = [System.Collections.Generic.List[string]]::new()
    $Summary.Add('CRL timestamp update completed.')
    $Summary.Add('')
    $Summary.Add('Locations:')
    $Locations | ForEach-Object { $Summary.Add(" $_") }
    $Summary.Add('')
    $Summary.Add("Updated: $($Updated.Count)")
    $Updated | ForEach-Object { $Summary.Add(" $($_.Path) ($($_.ThisUpdate.ToString('u')))") }
    $Summary.Add('')
    $Summary.Add("Unchanged: $($Unchanged.Count)")
    $Unchanged | ForEach-Object { $Summary.Add(" $($_.Path)") }

    If ($Failed.Count -gt 0) {

        $Summary.Add('')
        $Summary.Add("Failed: $($Failed.Count)")
        $Failed | ForEach-Object { $Summary.Add(" $($_.Path)") }

    }

    If ($Issues.Count -gt 0) {

        $Summary.Add('')
        $Summary.Add('Warnings:')
        $Issues | ForEach-Object { $Summary.Add(" $_") }

    }

    If ($Failed.Count -gt 0 -or $Issues.Count -gt 0) {

        Write-CrlTimestampEvent -EntryType Warning -EventId $EventIdCompletedWithWarnings -Message ($Summary -join "`r`n")

    }

    Else {

        Write-CrlTimestampEvent -EntryType Information -EventId $EventIdCompleted -Message ($Summary -join "`r`n")

    }

}

# SIG # Begin signature block
# MIIk6wYJKoZIhvcNAQcCoIIk3DCCJNgCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCC13jiRAEsQJo2P
# /V2tpsSApOqJdjuBccwORammya1wuqCCH6YwggWNMIIEdaADAgECAhAOmxiO+dAt
# 5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0yMjA4MDEwMDAwMDBa
# Fw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
# ZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
# ggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3E
# MB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKy
# unWZanMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsF
# xl7sWxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU1
# 5zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJB
# MtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObUR
# WBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6
# nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxB
# YKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5S
# UUd0viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+x
# q4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjggE6MIIB
# NjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTs1+OC0nFdZEzfLmc/57qYrhwP
# TzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzAOBgNVHQ8BAf8EBAMC
# AYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
# Y2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwRQYDVR0fBD4wPDA6oDigNoY0
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJKoZIhvcNAQEMBQADggEBAHCgv0Nc
# Vec4X6CjdBs9thbX979XB72arKGHLOyFXqkauyL4hxppVCLtpIh3bb0aFPQTSnov
# Lbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP+fT3rDB6mouyXtTP0UNEm0Mh65Zy
# oUi0mcudT6cGAxN3J0TU53/oWajwvy8LpunyNDzs9wPHh6jSTEAZNUZqaVSwuKFW
# juyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiEn2/K2yCNNWAcAgPLILCsWKAOQGPF
# mCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4VC0nftg62fC2h5b9W9FcrBjDTZ9z
# twGpn1eqXijiuZQwggW0MIIDnKADAgECAhAOxitIKuZQm69NGxw+uiH/MA0GCSqG
# SIb3DQEBDAUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5j
# LjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNB
# NDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjYwNTE2MDAwMDAwWhcNMjcwODE3MjM1
# OTU5WjCBhjELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNV
# BAcTDU1pc3Npb24gVmllam8xJDAiBgNVBAoTG1JpY2hhcmQgTS4gSGlja3MgQ29u
# c3VsdGluZzEkMCIGA1UEAxMbUmljaGFyZCBNLiBIaWNrcyBDb25zdWx0aW5nMFkw
# EwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEOooTPiege6mCA4AriPO+Xh3mymiiZ+3k
# kn31uJifB2ojzzfY7VkAVKhgj+rcVBnofnj2b8OhvAJ4YaQ2Iwuc6aOCAgMwggH/
# MB8GA1UdIwQYMBaAFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB0GA1UdDgQWBBQJvGhl
# Ahwi6UKROatrFKBmPLmd5TA+BgNVHSAENzA1MDMGBmeBDAEEATApMCcGCCsGAQUF
# BwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwDgYDVR0PAQH/BAQDAgeA
# MBMGA1UdJQQMMAoGCCsGAQUFBwMDMIG1BgNVHR8Ega0wgaowU6BRoE+GTWh0dHA6
# Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5n
# UlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMFOgUaBPhk1odHRwOi8vY3JsNC5kaWdp
# Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEz
# ODQyMDIxQ0ExLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0
# dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2Vy
# dHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0
# MDk2U0hBMzg0MjAyMUNBMS5jcnQwCQYDVR0TBAIwADANBgkqhkiG9w0BAQwFAAOC
# AgEAbaKnnRcJAMHjuWSc2PG/QhJ0jj4hQVwJIbddYDJNxPmD0cxuuorSiR9gX2nl
# ajqNI9N7Kl+FB3oheRTGh/wp4JgZMpCq0qS0zGJ/N6Js+HmVtbkFaPyYxJMXbIWq
# p9zKkoXtSXkpR6nGZnzYkn3EBcRlu4R6hIJHzM/C2PUztH/Hd4fGIryyD69iHvKx
# zotYdlHHY6+X1ACaQnuCz3TLxs3/CDKhPUXesKcISnXHmm4uCwyVdtGyl7wPuZVk
# +rfCIOeWn+XG5J7L8xwhXCPSJ5fKJ5m8/H5cICLR0I7hI4SUiybE1nG5CZ1hKhbW
# abSfNer1dHH/vSYi80YGXCej/88vZeCGQ9/rrjugsg0yN7WCPqNKjEMTYGWkrt37
# lp4cJqULS+alUbL6x1HBdoBStDE2CFmPivL7cCCtnudqCA6b3XB416/FlRo8t4Lw
# Dc2ty+RDKirWM84Zj3ANTVs5fi43rxClBQwngGdqi5TjriKHGTkEKYRIFTViy6Ie
# JDIboOkCFJU5vM7Curvh4rQnw+aM4CyjwnDwnzwcKQVZC3Iy1T4h/FvmpSgu5ouM
# wjdzaR3cSh4OPDRrfBl1YIOoZEOHcshCaHDC46t8+UyAf70BMlrB7Nj84ORTuKTi
# IlU062VzGeREc1KHJqp/S3/NtArpVUVQEgibRxQ99KJCOV8wggawMIIEmKADAgEC
# AhAIrUCyYNKcTJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVT
# MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
# b20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0Mjkw
# MDAwMDBaFw0zNjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5E
# aWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2Rl
# IFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYw
# n6SOaNhc9es0JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43i
# CH00fUyAVxJrQ5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1
# hz1RGeiQIXhFLqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd
# 6BgTZcV/sk+FLEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObar
# YBLj6Na59zHh3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18eb
# MlrC/2pgVItJwZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYo
# X7BzzosmJQayg9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDz
# d5Ea/ttQokbIYViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8S
# kXbev1jLchApQfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZ
# YIpkVMHMIRroOBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxW
# EQIDAQABo4IBWTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg
# 67Y7+F8Rhvv+YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4c
# D08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUF
# BwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEG
# CCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTAT
# MAcGBWeBDAEDMAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6P
# vDqZ01bgAhql+Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V
# 1T9J9Ce7FoFFUP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+
# 3NiAGhEZGM1hmYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcn
# P/2Q0XaG3RywYFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgU
# kpn13c5UbdldAhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6Q
# B7BDf5WIIIJw8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3
# kuZOX956rEnPLqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKL
# QcBIhEuWTatEQOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47v
# tevLt/B3E+bnKD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0
# qFEgu60bhQjiWQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0
# YW6/aOImYIbqyK+p/pQd52MbOoZWeE4wgga0MIIEnKADAgECAhANx6xXBf8hmS5A
# QyIMOkmGMA0GCSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxE
# aWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMT
# GERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yNTA1MDcwMDAwMDBaFw0zODAx
# MTQyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5j
# LjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNB
# NDA5NiBTSEEyNTYgMjAyNSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
# AoICAQC0eDHTCphBcr48RsAcrHXbo0ZodLRRF51NrY0NlLWZloMsVO1DahGPNRcy
# bEKq+RuwOnPhof6pvF4uGjwjqNjfEvUi6wuim5bap+0lgloM2zX4kftn5B1IpYzT
# qpyFQ/4Bt0mAxAHeHYNnQxqXmRinvuNgxVBdJkf77S2uPoCj7GH8BLuxBG5AvftB
# dsOECS1UkxBvMgEdgkFiDNYiOTx4OtiFcMSkqTtF2hfQz3zQSku2Ws3IfDReb6e3
# mmdglTcaarps0wjUjsZvkgFkriK9tUKJm/s80FiocSk1VYLZlDwFt+cVFBURJg6z
# MUjZa/zbCclF83bRVFLeGkuAhHiGPMvSGmhgaTzVyhYn4p0+8y9oHRaQT/aofEnS
# 5xLrfxnGpTXiUOeSLsJygoLPp66bkDX1ZlAeSpQl92QOMeRxykvq6gbylsXQskBB
# BnGy3tW/AMOMCZIVNSaz7BX8VtYGqLt9MmeOreGPRdtBx3yGOP+rx3rKWDEJlIqL
# XvJWnY0v5ydPpOjL6s36czwzsucuoKs7Yk/ehb//Wx+5kMqIMRvUBDx6z1ev+7ps
# NOdgJMoiwOrUG2ZdSoQbU2rMkpLiQ6bGRinZbI4OLu9BMIFm1UUl9VnePs6BaaeE
# WvjJSjNm2qA+sdFUeEY0qVjPKOWug/G6X5uAiynM7Bu2ayBjUwIDAQABo4IBXTCC
# AVkwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQU729TSunkBnx6yuKQVvYv
# 1Ensy04wHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/
# BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggr
# BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVo
# dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0
# LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjAL
# BglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBABfO+xaAHP4HPRF2cTC9vgvI
# tTSmf83Qh8WIGjB/T8ObXAZz8OjuhUxjaaFdleMM0lBryPTQM2qEJPe36zwbSI/m
# S83afsl3YTj+IQhQE7jU/kXjjytJgnn0hvrV6hqWGd3rLAUt6vJy9lMDPjTLxLgX
# f9r5nWMQwr8Myb9rEVKChHyfpzee5kH0F8HABBgr0UdqirZ7bowe9Vj2AIMD8liy
# rukZ2iA/wdG2th9y1IsA0QF8dTXqvcnTmpfeQh35k5zOCPmSNq1UH410ANVko43+
# Cdmu4y81hjajV/gxdEkMx1NKU4uHQcKfZxAvBAKqMVuqte69M9J6A47OvgRaPs+2
# ykgcGV00TYr2Lr3ty9qIijanrUR3anzEwlvzZiiyfTPjLbnFRsjsYg39OlV8cipD
# oq7+qNNjqFzeGxcytL5TTLL4ZaoBdqbhOhZ3ZRDUphPvSRmMThi0vw9vODRzW6Ax
# nJll38F0cuJG7uEBYTptMSbhdhGQDpOXgpIUsWTjd6xpR6oaQf/DJbg3s6KCLPAl
# Z66RzIg9sC+NJpud/v4+7RWsWCiKi9EOLLHfMR2ZyJ/+xhCx9yHbxtl5TPau1j/1
# MIDpMPx0LckTetiSuEtQvLsNz3Qbp7wGWqbIiOWCnb5WqxL3/BAPvIXKUjPSxyZs
# q8WhbaM2tszWkPZPubdcMIIG7TCCBNWgAwIBAgIQCoDvGEuN8QWC0cR2p5V0aDAN
# BgkqhkiG9w0BAQsFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs
# IEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5n
# IFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkw
# MzIzNTk1OVowYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MTswOQYDVQQDEzJEaWdpQ2VydCBTSEEyNTYgUlNBNDA5NiBUaW1lc3RhbXAgUmVz
# cG9uZGVyIDIwMjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANBG
# rC0Sxp7Q6q5gVrMrV7pvUf+GcAoB38o3zBlCMGMyqJnfFNZx+wvA69HFTBdwbHwB
# SOeLpvPnZ8ZN+vo8dE2/pPvOx/Vj8TchTySA2R4QKpVD7dvNZh6wW2R6kSu9RJt/
# 4QhguSssp3qome7MrxVyfQO9sMx6ZAWjFDYOzDi8SOhPUWlLnh00Cll8pjrUcCV3
# K3E0zz09ldQ//nBZZREr4h/GI6Dxb2UoyrN0ijtUDVHRXdmncOOMA3CoB/iUSROU
# INDT98oksouTMYFOnHoRh6+86Ltc5zjPKHW5KqCvpSduSwhwUmotuQhcg9tw2YD3
# w6ySSSu+3qU8DD+nigNJFmt6LAHvH3KSuNLoZLc1Hf2JNMVL4Q1OpbybpMe46Yce
# NA0LfNsnqcnpJeItK/DhKbPxTTuGoX7wJNdoRORVbPR1VVnDuSeHVZlc4seAO+6d
# 2sC26/PQPdP51ho1zBp+xUIZkpSFA8vWdoUoHLWnqWU3dCCyFG1roSrgHjSHlq8x
# ymLnjCbSLZ49kPmk8iyyizNDIXj//cOgrY7rlRyTlaCCfw7aSUROwnu7zER6EaJ+
# AliL7ojTdS5PWPsWeupWs7NpChUk555K096V1hE0yZIXe+giAwW00aHzrDchIc2b
# Qhpp0IoKRR7YufAkprxMiXAJQ1XCmnCfgPf8+3mnAgMBAAGjggGVMIIBkTAMBgNV
# HRMBAf8EAjAAMB0GA1UdDgQWBBTkO/zyMe39/dfzkXFjGVBDz2GM6DAfBgNVHSME
# GDAWgBTvb1NK6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0l
# AQH/BAwwCgYIKwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzAB
# hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9j
# YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGlu
# Z1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBp
# bmdSU0E0MDk2U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIw
# CwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQBlKq3xHCcEua5gQezRCESe
# Y0ByIfjk9iJP2zWLpQq1b4URGnwWBdEZD9gBq9fNaNmFj6Eh8/YmRDfxT7C0k8FU
# FqNh+tshgb4O6Lgjg8K8elC4+oWCqnU/ML9lFfim8/9yJmZSe2F8AQ/UdKFOtj7Y
# MTmqPO9mzskgiC3QYIUP2S3HQvHG1FDu+WUqW4daIqToXFE/JQ/EABgfZXLWU0zi
# TN6R3ygQBHMUBaB5bdrPbF6MRYs03h4obEMnxYOX8VBRKe1uNnzQVTeLni2nHkX/
# QqvXnNb+YkDFkxUGtMTaiLR9wjxUxu2hECZpqyU1d0IbX6Wq8/gVutDojBIFeRlq
# AcuEVT0cKsb+zJNEsuEB7O7/cuvTQasnM9AWcIQfVjnzrvwiCZ85EE8LUkqRhoS3
# Y50OHgaY7T/lwd6UArb+BOVAkg2oOvol/DJgddJ35XTxfUlQ+8Hggt8l2Yv7roan
# cJIFcbojBcxlRcGG0LIhp6GvReQGgMgYxQbV1S3CrWqZzBt1R9xJgKf47CdxVRd/
# ndUlQ05oxYy2zRWVFjF7mcr4C34Mj3ocCVccAvlKV9jEnstrniLvUxxVZE/rptb7
# IRE2lskKPIJgbaP5t2nGj/ULLi49xTcBZU8atufk+EMF/cWuiC7POGT75qaL6vdC
# vHlshtjdNXOCIUjsarfNZzGCBJswggSXAgEBMH0waTELMAkGA1UEBhMCVVMxFzAV
# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVk
# IEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMQIQDsYrSCrm
# UJuvTRscProh/zANBglghkgBZQMEAgEFAKCBhDAYBgorBgEEAYI3AgEMMQowCKAC
# gAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx
# DjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCDnA0uxeiJLam2LCrxjjphS
# s734GViwizNrJieCctJZ6TALBgcqhkjOPQIBBQAERjBEAiBb8wi0ccyKiwLj8V8J
# Fg+x5o0AP3S80zwa6GyCgOw1lQIgGMyGxq7KPeyrMCNPFzGzAn2OPFFhnEMZRdLT
# o5K+OkmhggMmMIIDIgYJKoZIhvcNAQkGMYIDEzCCAw8CAQEwfTBpMQswCQYDVQQG
# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0
# IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0Ex
# AhAKgO8YS43xBYLRxHanlXRoMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkD
# MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjYwOTAyMjMyMjA1WjAvBgkq
# hkiG9w0BCQQxIgQgqj8kCV1ieHVxG7SXRZJumjhO7NuXdtNdc93Sr5V7Yl8wDQYJ
# KoZIhvcNAQEBBQAEggIAV+hEhOZXHYdirIpBn25h56hP9mRG16904fAsWi2jFImX
# qWS0T8QmleNAG022dttptRgRbw6J9aAgO9s4p1WwDvuEjfGeX1ldrBJbJcyD5HnG
# Ouse6oDOSnzWmj++FUiMHAU114z9e2rL39wnxLaAn+/nzztr+60Lk5mywhmbuFUe
# OHI4pTuQRqQpF49siiBCYrhXDH+xnJ92XWeZFThwxWUlBoecDu4qK3HJ2AamAmfF
# /QtPFh+jakZingBoxozzk0vi5E90PNF+bsOS7bVNhp5wYXsBi2mnIi6OBCm3LmU+
# /WatuaVMOaS4IBYfglhXbusgqTh0VdEJLhAvUJRe3Ab0yBZ6Gywt6aYP1Kd1XNIi
# //5D/Xg8B1R7thAOz4pqHcziuIN14788OJKNMaMwgCoOWweq2lxdnlKdVg34ER4S
# H+/pbGLj89Gmt5jjmUTuRKRRYM2g4lw7DhsuqCzxu+ML1LrLgGi1wV3GEpWlyn1+
# 26jujxFMZIOkqGLnILneiZ3WZ9Ab9j1HSNWvRBWfPHQSUwF+FI7av9RNfQo6LCt+
# +XbJmLYbVSvp1AEIgEfHXqsFWxqRbRVcv3h8fXYv4FgwSIH6Fkv3mRRqp9tjY5co
# dJohh5C8iTFM1ZdkAZr2w6Hl7HwsMo8guZ/SR5Tc3dGrpGx1vm8xAhvj2yhLinU=
# SIG # End signature block