private/Test-LnvSignature.ps1
|
function Test-LnvSignature { <# .SYNOPSIS Verifies if a file is digitally signed by Lenovo .DESCRIPTION Tests whether a file or files in a folder have a valid digital signature from Lenovo. Supports multiple signature types: Uses Get-AuthenticodeSignature for Authenticode validation and custom XML parsing for XML Digital Signature validation. When a folder path is provided, searches for all signable files within it. .PARAMETER Path Path to a file or folder to verify. If a folder is provided, searches for signable files within it. .PARAMETER IncludeCatalog When specified, also checks for catalog signatures if direct signature not found. Useful for driver files (.sys, .inf) that use catalog signing. .PARAMETER Detailed Returns detailed signature information instead of just boolean .OUTPUTS System.Boolean (default) or PSCustomObject (with -Detailed) When a folder is provided, returns results for all signable files found. .EXAMPLE Test-LnvSignature -Path "C:\Temp\update.exe" Returns True if file has direct Lenovo signature .EXAMPLE Test-LnvSignature -Path "C:\Updates" -Detailed Tests all signable files in the folder and returns detailed info for each #> [CmdletBinding()] [OutputType([System.Boolean], ParameterSetName = 'Simple')] [OutputType([PSCustomObject], ParameterSetName = 'Detailed')] param( [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)] [ValidateScript({ if (-not (Test-Path $_)) { throw "Path not found: $_" } return $true })] [Alias('FilePath', 'FullName', 'FolderPath')] [string]$Path, [Parameter(Mandatory = $false)] [switch]$IncludeCatalog, [Parameter(Mandatory = $false)] [switch]$Detailed, [Parameter(Mandatory = $false)] [switch]$Recurse ) begin { # Signable file types $script:SignableExtensions = @(".exe", ".dll", ".sys", ".msi", ".cab", ".cat", ".inf", ".xml") $script:CatalogTypes = @(".sys", ".inf") $script:XmlTypes = @(".xml") Write-Verbose "Test-LnvSignature: Using Lenovo validator: $Script:LenovoValidatorAvailable" } process { $item = Get-Item -Path $Path -ErrorAction Stop # If it's a folder, find all signable files in it if ($item.PSIsContainer) { Write-Verbose "Folder detected, searching for signable files..." $searchParams = @{ Path = $item.FullName File = $true ErrorAction = 'SilentlyContinue' } if ($Recurse) { $searchParams['Recurse'] = $true } # Get all files and filter by extension $filesToCheck = Get-ChildItem @searchParams | Where-Object { $script:SignableExtensions -contains $_.Extension.ToLower() } if ($filesToCheck.Count -eq 0) { Write-Verbose "No signable files found in folder: $($item.FullName)" if ($Detailed) { Write-Output ([PSCustomObject]@{ PSTypeName = 'Lenovo.SignatureInfo' FileName = $item.Name FilePath = $item.FullName IsLnvSigned = $false SignatureType = "None" TrustStatus = $null Publisher = $null Thumbprint = $null ValidFrom = $null ValidUntil = $null IsOldCertificate = $false CatalogFiles = @() CatalogCount = 0 FileSize = 0 TestDuration = 0 TestTime = Get-Date Success = $false ErrorMessage = "No signable files found in folder" }) } else { Write-Output $false } return } Write-Verbose "Found $($filesToCheck.Count) signable file(s) to check" # Check each file and return results #$allSigned = $true foreach ($file in $filesToCheck) { # Recursively call Test-LnvSignature for each file $splatParams = @{ Path = $file.FullName IncludeCatalog = $IncludeCatalog Detailed = $Detailed } Test-LnvSignature @splatParams } return } # Single file validation try { $file = Get-Item -Path $Path -ErrorAction Stop # Check if file type is signable if ($script:SignableExtensions -notcontains $file.Extension.ToLower()) { if ($Detailed) { Write-Output ([PSCustomObject]@{ PSTypeName = 'Lenovo.SignatureInfo' FileName = $file.Name FilePath = $file.FullName IsLnvSigned = $false SignatureType = 'Unsupported' TrustStatus = $null Publisher = $null Thumbprint = $null ValidFrom = $null ValidUntil = $null IsOldCertificate = $false WinVerifyTrustStatus = $null CatalogFiles = @() CatalogCount = 0 FileSize = $file.Length TestDuration = 0 TestTime = Get-Date Success = $false ErrorMessage = "File type '$($file.Extension)' is not signable" }) } else { Write-Output $false } return } Write-Verbose "Testing signature for: $($file.FullName)" $startTime = Get-Date $isLenovo = $false $signatureType = 'None' $trustStatus = $null $publisher = $null $thumbprint = $null $validFrom = $null $validUntil = $null $isOldCert = $false $winVerifyStatus = $null $catalogFilesList = @() $errorMessage = $null # XML file validation using XMLFileValidator if ($script:XmlTypes -contains $file.Extension.ToLower()) { Write-Verbose "Validating XML file with XML-DSig validator" if ($Script:LenovoValidatorAvailable) { try { $xmlValidator = New-Object Lenovo.CertificateValidation.XMLFileValidator $oldCertRef = $false $trust = $xmlValidator.GetTrustStatus($file.FullName, [ref]$oldCertRef) $trustStatus = $trust.ToString() $isOldCert = $oldCertRef if ($trust.ToString() -eq 'FileTrusted') { $isLenovo = $true $signatureType = 'XMLDSig-Lenovo' Write-Verbose "XML file is Lenovo-signed (Lenovo validator)" } else { Write-Verbose "XML validation result: $trustStatus" $signatureType = "XMLDSig-$trustStatus" } } catch { $errorMessage = $_.Exception.Message Write-Verbose "Lenovo XML validator failed: $errorMessage" $signatureType = 'XMLDSig-Error' } } # Fallback to manual XML-DSig parsing if Lenovo validator not available or failed if (-not $isLenovo -and -not $Script:LenovoValidatorAvailable) { try { [xml]$xmlContent = Get-Content -Path $file.FullName -Raw -ErrorAction Stop $ns = @{ ds = 'http://www.w3.org/2000/09/xmldsig#' } $signatureNode = Select-Xml -Xml $xmlContent -XPath '//ds:Signature' -Namespace $ns if ($signatureNode) { Write-Verbose "Found XML-DSig signature, checking certificate" $x509Cert = Select-Xml -Xml $xmlContent -XPath '//ds:X509Certificate' -Namespace $ns if ($x509Cert -and $x509Cert.Node.'#text') { $certBytes = [Convert]::FromBase64String($x509Cert.Node.'#text') $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2 -ArgumentList @(,$certBytes) if ($cert.Subject -match 'Lenovo') { $isLenovo = $true $signatureType = 'XMLDSig-Fallback' $publisher = $cert.Subject $thumbprint = $cert.Thumbprint $validFrom = $cert.NotBefore $validUntil = $cert.NotAfter Write-Verbose "XML file is Lenovo-signed (fallback parser)" } } } } catch { Write-Verbose "Error parsing XML signature: $($_.Exception.Message)" } } } else { Write-Verbose "Validating Authenticode signature" # Use Lenovo FileValidator if available if ($Script:LenovoValidatorAvailable) { try { $oldCertRef = $false $winVerifyRef = [uint32]0 $trust = [Lenovo.CertificateValidation.FileValidator]::GetTrustStatus( $file.FullName, [ref]$oldCertRef, [ref]$winVerifyRef ) $trustStatus = $trust.ToString() $isOldCert = $oldCertRef $winVerifyStatus = "0x$($winVerifyRef.ToString('X8'))" if ($trust.ToString() -eq 'FileTrusted') { $isLenovo = $true $signatureType = 'Authenticode-Lenovo' Write-Verbose "File is Lenovo-trusted (Lenovo validator)" } else { Write-Verbose "Lenovo validator result: $trustStatus (WinVerify: $winVerifyStatus)" $signatureType = "Authenticode-$trustStatus" } } catch { $errorMessage = $_.Exception.Message Write-Verbose "Lenovo validator failed: $errorMessage" $signatureType = 'Authenticode-Error' } } # Fallback: Use Get-AuthenticodeSignature if Lenovo validator not available or failed if (-not $isLenovo) { try { $signature = Get-AuthenticodeSignature -FilePath $file.FullName -ErrorAction Stop if ($signature -and $signature.Status -eq 'Valid' -and $signature.SignerCertificate) { # Verify certificate chain $chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain $chain.ChainPolicy.RevocationMode = 'Online' $chain.ChainPolicy.VerificationFlags = 'NoFlag' if ($chain.Build($signature.SignerCertificate)) { # Check if it's a Lenovo certificate if ($signature.SignerCertificate.Subject -match 'O=Lenovo' -or $signature.SignerCertificate.Subject -match 'CN=Lenovo') { $isLenovo = $true $signatureType = if ($Script:LenovoValidatorAvailable) { 'Authenticode-Fallback' } else { 'Authenticode' } $publisher = $signature.SignerCertificate.Subject $thumbprint = $signature.SignerCertificate.Thumbprint $validFrom = $signature.SignerCertificate.NotBefore $validUntil = $signature.SignerCertificate.NotAfter Write-Verbose "File is Lenovo-signed (Get-AuthenticodeSignature)" } else { Write-Verbose "File is signed but not by Lenovo: $($signature.SignerCertificate.Subject)" } } else { Write-Verbose "Certificate chain validation failed" } } else { Write-Verbose "No valid Authenticode signature found (Status: $($signature.Status))" } } catch { Write-Verbose "Get-AuthenticodeSignature failed: $($_.Exception.Message)" } } # Check catalog signature if requested and no direct signature found if ($IncludeCatalog -and -not $isLenovo -and ($script:CatalogTypes -contains $file.Extension.ToLower())) { Write-Verbose "Checking for catalog signature..." try { # Use FileValidator.IsCatalogSigned if available if ($Script:LenovoValidatorAvailable) { $catFilesRef = New-Object 'string[]' 0 $isCatalogSigned = [Lenovo.CertificateValidation.FileValidator]::IsCatalogSigned( $file.FullName, [ref]$catFilesRef ) if ($isCatalogSigned -and $catFilesRef -and $catFilesRef.Count -gt 0) { Write-Verbose "File is catalog-signed. Catalog files: $($catFilesRef -join ', ')" # Verify the catalog files are Lenovo-signed foreach ($catFile in $catFilesRef) { if (Test-Path $catFile) { $catSig = Get-AuthenticodeSignature -FilePath $catFile -ErrorAction SilentlyContinue if ($catSig.Status -eq 'Valid' -and $catSig.SignerCertificate.Subject -match 'Lenovo') { $isLenovo = $true $signatureType = 'Catalog-Lenovo' $publisher = $catSig.SignerCertificate.Subject $thumbprint = $catSig.SignerCertificate.Thumbprint $validFrom = $catSig.SignerCertificate.NotBefore $validUntil = $catSig.SignerCertificate.NotAfter $catalogFilesList += $catFile Write-Verbose "Found Lenovo-signed catalog: $catFile" break } } } } } # Fallback: Manual catalog search if (-not $isLenovo) { $dir = Split-Path $file.FullName -Parent $catalogFiles = Get-ChildItem -Path $dir -Filter '*.cat' -ErrorAction SilentlyContinue foreach ($catFile in $catalogFiles) { try { $catSignature = Get-AuthenticodeSignature -FilePath $catFile.FullName -ErrorAction SilentlyContinue if ($catSignature.Status -eq 'Valid' -and $catSignature.SignerCertificate.Subject -match 'Lenovo') { $isLenovo = $true $signatureType = 'Catalog-Fallback' $publisher = $catSignature.SignerCertificate.Subject $thumbprint = $catSignature.SignerCertificate.Thumbprint $validFrom = $catSignature.SignerCertificate.NotBefore $validUntil = $catSignature.SignerCertificate.NotAfter $catalogFilesList += $catFile.FullName Write-Verbose "Found Lenovo-signed catalog: $($catFile.Name)" break } } catch { Write-Verbose "Error checking catalog file $($catFile.Name): $($_.Exception.Message)" } } } } catch { Write-Verbose "Catalog signature check failed: $($_.Exception.Message)" } } } $duration = ((Get-Date) - $startTime).TotalMilliseconds # Log result if ($isLenovo) { Write-Verbose " File is signed by Lenovo ($signatureType): $($file.Name)" } else { Write-Verbose " File is NOT signed: $($file.Name)" } # Return result if ($Detailed) { $result = [PSCustomObject]@{ PSTypeName = 'Lenovo.SignatureInfo' FileName = $file.Name FilePath = $file.FullName IsLnvSigned = $isLenovo SignatureType = $signatureType TrustStatus = $trustStatus Publisher = $publisher Thumbprint = $thumbprint ValidFrom = $validFrom ValidUntil = $validUntil IsOldCertificate = $isOldCert WinVerifyTrustStatus = $winVerifyStatus CatalogFiles = $catalogFilesList CatalogCount = $catalogFilesList.Count FileSize = $file.Length TestDuration = $duration TestTime = Get-Date Success = $true ErrorMessage = $errorMessage } Write-Output $result } else { Write-Output $isLenovo } } catch { Write-Error "Failed to verify signature for '$Path': $($_.Exception.Message)" if ($Detailed) { Write-Output ([PSCustomObject]@{ PSTypeName = 'Lenovo.SignatureInfo' FileName = [System.IO.Path]::GetFileName($Path) FilePath = $Path IsLnvSigned = $false SignatureType = 'Error' TrustStatus = $null Publisher = $null Thumbprint = $null ValidFrom = $null ValidUntil = $null IsOldCertificate = $false WinVerifyTrustStatus = $null CatalogFiles = @() CatalogCount = 0 FileSize = 0 TestDuration = 0 TestTime = Get-Date Success = $false ErrorMessage = $_.Exception.Message }) } else { Write-Output $false } } } end { Write-Verbose "Test-LnvSignature Completed. " } } # SIG # Begin signature block # MIItugYJKoZIhvcNAQcCoIItqzCCLacCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUJQPn70do/ao7GnhuDsvjXtxW # puyggibcMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B # AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw # ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz # 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS # 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7 # bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI # SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH # trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14 # Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2 # h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt # 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR # iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER # ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K # Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd # BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS # y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC # hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS # b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV # HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh # hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO # 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo # 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h # UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x # aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFkDCCA3ig # AwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMw # ODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Y # q3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lX # FllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxe # TsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbu # yntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I # 9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmg # Z92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse # 5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKy # Ebe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwh # HbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/ # Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwID # AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4E # FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2p # bL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY # ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdN # Oj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4 # i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJ # EVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLM # MpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhD # parTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdK # Dd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP # 0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLS # oCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9T # dSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+MIIGsDCCBJigAwIBAgIQCK1AsmDS # nEyfXs2pvZOu2TANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjEwNDI5MDAwMDAwWhcN # MzYwNDI4MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5n # IFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A # MIICCgKCAgEA1bQvQtAorXi3XdU5WRuxiEL1M4zrPYGXcMW7xIUmMJ+kjmjYXPXr # NCQH4UtP03hD9BfXHtr50tVnGlJPDqFX/IiZwZHMgQM+TXAkZLON4gh9NH1MgFcS # a0OamfLFOx/y78tHWhOmTLMBICXzENOLsvsI8IrgnQnAZaf6mIBJNYc9URnokCF4 # RS6hnyzhGMIazMXuk0lwQjKP+8bqHPNlaJGiTUyCEUhSaN4QvRRXXegYE2XFf7JP # hSxIpFaENdb5LpyqABXRN/4aBpTCfMjqGzLmysL0p6MDDnSlrzm2q2AS4+jWufcx # 4dyt5Big2MEjR0ezoQ9uo6ttmAaDG7dqZy3SvUQakhCBj7A7CdfHmzJawv9qYFSL # ScGT7eG0XOBv6yb5jNWy+TgQ5urOkfW+0/tvk2E0XLyTRSiDNipmKF+wc86LJiUG # soPUXPYVGUztYuBeM/Lo6OwKp7ADK5GyNnm+960IHnWmZcy740hQ83eRGv7bUKJG # yGFYmPV8AhY8gyitOYbs1LcNU9D4R+Z1MI3sMJN2FKZbS110YU0/EpF23r9Yy3IQ # KUHw1cVtJnZoEUETWJrcJisB9IlNWdt4z4FKPkBHX8mBUHOFECMhWWCKZFTBzCEa # 6DgZfGYczXg4RTCZT/9jT0y7qg0IU0F8WD1Hs/q27IwyCQLMbDwMVhECAwEAAaOC # AVkwggFVMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFGg34Ou2O/hfEYb7 # /mF7CIhl9E5CMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1Ud # DwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB3BggrBgEFBQcBAQRrMGkw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcw # AoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv # b3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwHAYDVR0gBBUwEzAHBgVngQwB # AzAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBADojRD2NCHbuj7w6mdNW4AIa # pfhINPMstuZ0ZveUcrEAyq9sMCcTEp6QRJ9L/Z6jfCbVN7w6XUhtldU/SfQnuxaB # RVD9nL22heB2fjdxyyL3WqqQz/WTauPrINHVUHmImoqKwba9oUgYftzYgBoRGRjN # YZmBVvbJ43bnxOQbX0P4PpT/djk9ntSZz0rdKOtfJqGVWEjVGv7XJz/9kNF2ht0c # sGBc8w2o7uCJob054ThO2m67Np375SFTWsPK6Wrxoj7bQ7gzyE84FJKZ9d3OVG3Z # XQIUH0AzfAPilbLCIXVzUstG2MQ0HKKlS43Nb3Y3LIU/Gs4m6Ri+kAewQ3+ViCCC # cPDMyu/9KTVcH4k4Vfc3iosJocsL6TEa/y4ZXDlx4b6cpwoG1iZnt5LmTl/eeqxJ # zy6kdJKt2zyknIYf48FWGysj/4+16oh7cGvmoLr9Oj9FpsToFpFSi0HASIRLlk2r # REDjjfAVKM7t8RhWByovEMQMCGQ8M4+uKIw8y4+ICw2/O/TOHnuO77Xry7fwdxPm # 5yg/rBKupS8ibEH5glwVZsxsDsrFhsP2JjMMB0ug0wcCampAMEhLNKhRILutG4UI # 4lkNbcoFUCvqShyepf2gpx8GdOfy1lKQ/a+FSCH5Vzu0nAPthkX0tGFuv2jiJmCG # 6sivqf6UHedjGzqGVnhOMIIGtDCCBJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjAN # BgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg # SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2Vy # dCBUcnVzdGVkIFJvb3QgRzQwHhcNMjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5 # WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV # BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hB # MjU2IDIwMjUgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx # 0wqYQXK+PEbAHKx126NGaHS0URedTa2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz # 4aH+qbxeLho8I6jY3xL1IusLopuW2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJ # gMQB3h2DZ0Mal5kYp77jYMVQXSZH++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQ # bzIBHYJBYgzWIjk8eDrYhXDEpKk7RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6 # bNMI1I7Gb5IBZK4ivbVCiZv7PNBYqHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJ # RfN20VRS3hpLgIR4hjzL0hpoYGk81coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU1 # 4lDnki7CcoKCz6eum5A19WZQHkqUJfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDD # jAmSFTUms+wV/FbWBqi7fTJnjq3hj0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cn # T6Toy+rN+nM8M7LnLqCrO2JP3oW//1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq # 1BtmXUqEG1NqzJKS4kOmxkYp2WyODi7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqg # PrHRVHhGNKlYzyjlroPxul+bgIspzOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1Ud # EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8G # A1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjAT # BgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGG # GGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2Nh # Y2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYD # VR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9 # bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfF # iBowf0/Dm1wGc/Do7oVMY2mhXZXjDNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4 # /iEIUBO41P5F448rSYJ59Ib61eoalhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/ # DMm/axFSgoR8n6c3nuZB9BfBwAQYK9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HR # trYfctSLANEBfHU16r3J05qX3kId+ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2 # o1f4MXRJDMdTSlOLh0HCn2cQLwQCqjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K # 9i697cvaiIo2p61Ed2p8xMJb82Yosn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc # 3hsXMrS+U0yy+GWqAXam4ToWd2UQ1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLi # Ru7hAWE6bTEm4XYRkA6Tl4KSFLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAv # jSabnf7+Pu0VrFgoiovRDiyx3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3J # E3rYkrhLULy7Dc90G6e8BlqmyIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM # 1pD2T7m3XDCCBu0wggTVoAMCAQICEAqA7xhLjfEFgtHEdqeVdGgwDQYJKoZIhvcN # AQELBQAwaTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEw # PwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2 # IFNIQTI1NiAyMDI1IENBMTAeFw0yNTA2MDQwMDAwMDBaFw0zNjA5MDMyMzU5NTla # MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE # AxMyRGlnaUNlcnQgU0hBMjU2IFJTQTQwOTYgVGltZXN0YW1wIFJlc3BvbmRlciAy # MDI1IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDQRqwtEsae0Oqu # YFazK1e6b1H/hnAKAd/KN8wZQjBjMqiZ3xTWcfsLwOvRxUwXcGx8AUjni6bz52fG # Tfr6PHRNv6T7zsf1Y/E3IU8kgNkeECqVQ+3bzWYesFtkepErvUSbf+EIYLkrLKd6 # qJnuzK8Vcn0DvbDMemQFoxQ2Dsw4vEjoT1FpS54dNApZfKY61HAldytxNM89PZXU # P/5wWWURK+IfxiOg8W9lKMqzdIo7VA1R0V3Zp3DjjANwqAf4lEkTlCDQ0/fKJLKL # kzGBTpx6EYevvOi7XOc4zyh1uSqgr6UnbksIcFJqLbkIXIPbcNmA98Oskkkrvt6l # PAw/p4oDSRZreiwB7x9ykrjS6GS3NR39iTTFS+ENTqW8m6THuOmHHjQNC3zbJ6nJ # 6SXiLSvw4Smz8U07hqF+8CTXaETkVWz0dVVZw7knh1WZXOLHgDvundrAtuvz0D3T # +dYaNcwafsVCGZKUhQPL1naFKBy1p6llN3QgshRta6Eq4B40h5avMcpi54wm0i2e # PZD5pPIssoszQyF4//3DoK2O65Uck5Wggn8O2klETsJ7u8xEehGifgJYi+6I03Uu # T1j7FnrqVrOzaQoVJOeeStPeldYRNMmSF3voIgMFtNGh86w3ISHNm0IaadCKCkUe # 2LnwJKa8TIlwCUNVwppwn4D3/Pt5pwIDAQABo4IBlTCCAZEwDAYDVR0TAQH/BAIw # ADAdBgNVHQ4EFgQU5Dv88jHt/f3X85FxYxlQQ89hjOgwHwYDVR0jBBgwFoAU729T # SunkBnx6yuKQVvYv1Ensy04wDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoG # CCsGAQUFBwMIMIGVBggrBgEFBQcBAQSBiDCBhTAkBggrBgEFBQcwAYYYaHR0cDov # L29jc3AuZGlnaWNlcnQuY29tMF0GCCsGAQUFBzAChlFodHRwOi8vY2FjZXJ0cy5k # aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2 # U0hBMjU2MjAyNUNBMS5jcnQwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL2NybDMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5 # NlNIQTI1NjIwMjVDQTEuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG # /WwHATANBgkqhkiG9w0BAQsFAAOCAgEAZSqt8RwnBLmuYEHs0QhEnmNAciH45PYi # T9s1i6UKtW+FERp8FgXRGQ/YAavXzWjZhY+hIfP2JkQ38U+wtJPBVBajYfrbIYG+ # Dui4I4PCvHpQuPqFgqp1PzC/ZRX4pvP/ciZmUnthfAEP1HShTrY+2DE5qjzvZs7J # IIgt0GCFD9ktx0LxxtRQ7vllKluHWiKk6FxRPyUPxAAYH2Vy1lNM4kzekd8oEARz # FAWgeW3az2xejEWLNN4eKGxDJ8WDl/FQUSntbjZ80FU3i54tpx5F/0Kr15zW/mJA # xZMVBrTE2oi0fcI8VMbtoRAmaaslNXdCG1+lqvP4FbrQ6IwSBXkZagHLhFU9HCrG # /syTRLLhAezu/3Lr00GrJzPQFnCEH1Y58678IgmfORBPC1JKkYaEt2OdDh4GmO0/ # 5cHelAK2/gTlQJINqDr6JfwyYHXSd+V08X1JUPvB4ILfJdmL+66Gp3CSBXG6IwXM # ZUXBhtCyIaehr0XkBoDIGMUG1dUtwq1qmcwbdUfcSYCn+OwncVUXf53VJUNOaMWM # ts0VlRYxe5nK+At+DI96HAlXHAL5SlfYxJ7La54i71McVWRP66bW+yERNpbJCjyC # YG2j+bdpxo/1Cy4uPcU3AWVPGrbn5PhDBf3Froguzzhk++ami+r3Qrx5bIbY3TVz # giFI7Gq3zWcwggdWMIIFPqADAgECAhADMlFYfN/evhzf5XYSzZUnMA0GCSqGSIb3 # DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFB # MD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5 # NiBTSEEzODQgMjAyMSBDQTEwHhcNMjUwMzIwMDAwMDAwWhcNMjYwNjAzMjM1OTU5 # WjBeMQswCQYDVQQGEwJVUzEXMBUGA1UECBMOTm9ydGggQ2Fyb2xpbmExFDASBgNV # BAcTC01vcnJpc3ZpbGxlMQ8wDQYDVQQKEwZMZW5vdm8xDzANBgNVBAMTBkxlbm92 # bzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOPjJ/+Kdi4SqmdpYRYm # 5E/ctl9H/KHwC3GK10hQmHGetCCuJkcx+STyvxLIuuzh6CIupbxzDPXQ2x2/5jA6 # 2EROThgMKl/0fV+hwvZhVl45idBUi0qo+91jYeK9kXjjLrxXEsX6A5Uu4Lgl56vr # 8h6cGZg/te9ozF3k2JN80MIzSj/F769/ZpuGq9i4j1HQ7xq/aoXFlrTD86zSC7YG # AVU5PSU06ZOOTMAAvGm7ifKv/xQyeO8EE4acIgFB5a8RRC0JQj19eIRBhtfkh1dy # TX/ocPdsBQICpqo0VXvRb/9iaHj3+r9CWSPtx0kQxRkpHMv/qCtM7kBscljbejLA # VOXuhWKmNemNGIu7UMIZyro3+XzI4s1biJlGp6bTShs02EbmzlyUJTgithsYgC5n # X/WRcaHbshvy5S1EJo8m1fi5v/4bj9OTBUOjaYAVKvOjzYE7QR4PhuN/ww8HpGdR # jLS/eS8Sz3Jxz7EVApPNSzwycDkxAR6Y0w4ymaGy3ZnTOUJjESfwqJvqigjYMcbZ # +LJOqbLE6bQEmQ+tZiclcdoU4FhleAqQlfksb9kLc5GcU23uIp1aKQ1nji6pxMif # IHtE5OcMgJzy60tyX/dPpxBGbR3l6+K02v5KI1/GtrVSWxvJHKlXnIMQ4EcgIZBz # U+NPRgmPG7ZSzYRhpZl/+PrhAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Dr # tjv4XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQUcBJh2GrEdlUHxwi/fkRtYI55VfAw # PgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5k # aWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEF # BQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIx # Q0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQG # CCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy # dC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEu # Y3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBACeB1ob7bkUKbCC40mTr # HpXQHQbaeE7ymacNpXKyHefcQij+Op9DsduyOHNLbEojHm24k8GiGjx3ZnaZGKTh # RQHiijGN+H8Qy27SDvw2MzLnyB7XNg+uCPqIf6xWLdtdQ65T7MaBon6BIX/shzxQ # t+Jpkr1+qcAP6wWCQ0Q0W5I0w5PKb19dMaT26mw6mnGd06pnTvgpCVRnVy8UJtb7 # Ltt7dfE1G0Cz3LdWW9iBVCI73n/DGWhO8fbiK4D4NpdiNnWVfsxhJ7DSb+6RKJXP # eG3GwGbmuyDD3D2N9mJnW/6VYAiBwnewGRqwA6D20QKPB0QFHlqVHwkyoYIynVcE # dfM4K3dtxP8mh6IrEEbWfctNLRgnvRsEE/GnAEmpHxLyzWRx+FILzlaZmRPSyYAO # O8bE4nWNOTKLdpa/OMum6r/qDJmjcLs80aqMlRiG1k4F2grobscDV+lzy65du9+W # a8qUeY6rZsnHK02DGOf4iWLqEgaUf36QH10MUpGgj/dkK5cwLCpA1+/d+mySgEF3 # 1N2RHkf5bRVq0DsR8AGT76npVtpyRdnIlIHksfB0G8dDjioKEzCneATEUkketoL1 # ML+ZOcM8t2uURmjK8ZecklHZF74jmrkYVyve2HrxcHOr2qPuwOkRQ5NLnYluYKQo # Qv4KrbHKxS/bQKd55kJZVzTbMYIGSDCCBkQCAQEwfTBpMQswCQYDVQQGEwJVUzEX # MBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0 # ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhADMlFY # fN/evhzf5XYSzZUnMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgACh # AoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAM # BgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBSuyxF1qVk3gInnqEwtHNdgNBgd # WzANBgkqhkiG9w0BAQEFAASCAgAw8mTx8VkGe59AraBu/vnS4exjiG5o9uroQ8o4 # xFL2tx1Jf5xzlfD5o0F6M1WiblvgJdm2o2XSE6Sx1Ws6PhVmRDc+KYQDLditJf0G # HgCBnsvsao3Q9b61v69k+dMqFWOk3UgxQA5wn98ooAs9y0Sv5olDdv1HWGR4CRQU # EttKZY9/VjD2v0m8YUOgG6Ars9+TfyjVdTIzHJpuoLS7hAbRqhckOe0XQwGhr+C+ # SsE4QKjxZYsg0Dx2qQ0Pw23iIf2J/mdp+waS1Zf7IQEjexfXAvPXGSR0r1926V4B # 4nDjUkDSJmmkAzvCJFfEu3wsAPak5nonpKXqYh3/pj6efH2lKN1cmMB4gK+u6BBs # sfF+z+nGki8Qn4JznPNaVsm3xYFonDxp5+G9/7RIWzMd8dPbRBEUnJGgRUbGdVf1 # Ss8KZh5/TxnDfYb7j+CdyQ7+zQHPT+29RYAR/xi4KO1FHKlkq/ANSx8EtoT4apMJ # uhZDlH/Q1YL4Z+b3+GQ4QtJWa7XV7VcotpibTzF2TQx05OdIyttkArvFn/1JVnmv # IHN106bTJ3gZ8nwxb5c6ixmQaQOD60BJvjMFu6+HnjHOOAxfYWhrBj7YVE9sN+fL # 73SdtomMbXQ2DGxmGUxBpP2wroTm+0Haw5ts09w/ZpAvxOtMa7ZkLDwU/eWopGSG # O5VbDKGCAyYwggMiBgkqhkiG9w0BCQYxggMTMIIDDwIBATB9MGkxCzAJBgNVBAYT # AlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQg # VHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEC # EAqA7xhLjfEFgtHEdqeVdGgwDQYJYIZIAWUDBAIBBQCgaTAYBgkqhkiG9w0BCQMx # CwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0yNjAxMjMxNjQ2NDdaMC8GCSqG # SIb3DQEJBDEiBCCgnN3ebdIKmC4XcWamlVCcyouOlodaRMdP4k02CPczTTANBgkq # hkiG9w0BAQEFAASCAgCHiB3kOk60PduVg0bXvmEuZvYzSnOeHTwCvgu9r2P0NJPw # WbKHWL+HmACOcIdSJbdaYQwbvO6m9OilDjuoh1y/HU13F0eBi8v10vahdP+Twjc0 # 7AIGauIRbaDh7RoIVz3YXLY4LuY6AnPtlitlW024P4DP6gf8IpUIbQXcC7CkzgPr # NHJQlDlpPuc1i9CpKlM0UHQWGtcfRBDwRZez+TudvNwF3JHN4PT3SEJW+O8AJJ3Z # JbrBa31+nwP/PYiOnJiyP9+yDLm4B8yZS1NUqsXfg0FoHyKUVTB9Dxlz3Mkve+na # CHgf923RcH0Ii+GkMyTdHzOVkDLu/wpAnyC2WtQ2AFcJaGEDIyumYJXjKrSPIUPh # achkCk28L1k5REEdAEVTWC9+ItyQGL25cCi17TGUihKMYnIAcWK8eDYVoU4dwbWL # a6d1ytXCPj7HiadhMuVfZUcxqwMo552jD06oHz5TN570Isq5oEwNr+RJk9bj4XiO # fUmMuXV5kl4k1IcZaYaooGU8FgV9/PirsN3H3czalsN0CiLCwbGbYd4Rtm436V6M # 3+o+ouIB8+mFII7aFmJ/Emx3V/HWLaZfwaxUJNDK5Tx/VCqhlsr8eLD73Fm34taA # 1RIhROmLD5gYa5Po1/pPDYq+MHpsP4XvztBlzA2O4Xp70tTKLj8c6wcQJ3K75Q== # SIG # End signature block |