Tests/DCCMPA703-DSC.Tests.ps1
|
#Requires -Modules Pester <# .SYNOPSIS DCCMPA-703 DSC Configuration and Push Tests .DESCRIPTION Pester tests for DSC configuration compilation on localhost and push to remote machine 100.106.191.184 with credentials Dell/Dell@123. .NOTES Run with: Invoke-Pester -Path <this file> -Output Detailed #> BeforeAll { $script:ModuleName = "DellBIOSProvider" $script:ModuleVersion = "2.10.2" $script:RemoteNode = "100.106.191.184" $script:TestPassword = "Dell@123" $script:RemoteUser = "Dell" $script:ConfigOutputDir = Join-Path $env:TEMP "DCCMPA703_PesterDSC" # Cleanup previous test output if (Test-Path $script:ConfigOutputDir) { Remove-Item $script:ConfigOutputDir -Recurse -Force -ErrorAction SilentlyContinue } New-Item -ItemType Directory -Path $script:ConfigOutputDir -Force | Out-Null # Build credentials $secPwd = ConvertTo-SecureString $script:TestPassword -AsPlainText -Force $script:Credential = New-Object System.Management.Automation.PSCredential($script:RemoteUser, $secPwd) # Test remote connectivity $script:RemoteReachable = $false try { $tcp = Test-NetConnection -ComputerName $script:RemoteNode -Port 5985 -WarningAction SilentlyContinue if ($tcp.TcpTestSucceeded) { $session = New-PSSession -ComputerName $script:RemoteNode -Credential $script:Credential -ErrorAction Stop $script:RemoteReachable = $true Remove-PSSession $session } } catch { } Write-Host "Remote $($script:RemoteNode) reachable: $($script:RemoteReachable)" -ForegroundColor $(if ($script:RemoteReachable) { 'Green' } else { 'Yellow' }) } AfterAll { if (Test-Path $script:ConfigOutputDir) { Remove-Item $script:ConfigOutputDir -Recurse -Force -ErrorAction SilentlyContinue } } Describe "DSC Module and Resource Availability" { It "DellBIOSProvider module should be available" { $mod = Get-Module -Name $script:ModuleName -ListAvailable | Where-Object { $_.Version -eq $script:ModuleVersion } $mod | Should -Not -BeNullOrEmpty } It "Should have DSC resources registered" { $resources = Get-DscResource -Module $script:ModuleName -ErrorAction SilentlyContinue $resources.Count | Should -BeGreaterThan 0 } } Describe "DSC Configuration Compilation - Local (localhost)" { It "Should compile POSTBehavior DSC config for localhost" { Configuration LocalPOSTBehavior { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "localhost" { POSTBehavior PostSettings { Category = "POSTBehavior" Numlock = "Disabled" } } } $outPath = Join-Path $script:ConfigOutputDir "LocalPOSTBehavior" LocalPOSTBehavior -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\localhost.mof" | Should -BeTrue } It "Should compile POSTBehavior DSC config with password for localhost" { Configuration LocalPOSTBehaviorPwd { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "localhost" { POSTBehavior PostSettings { Category = "POSTBehavior" Numlock = "Disabled" Password = $script:TestPassword } } } $outPath = Join-Path $script:ConfigOutputDir "LocalPOSTBehaviorPwd" LocalPOSTBehaviorPwd -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\localhost.mof" | Should -BeTrue } It "Should compile PowerManagement DSC config with password for localhost" { Configuration LocalPowerMgmt { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "localhost" { PowerManagement PwrSettings { Category = "PowerManagement" BlockDefinition = "1" AutoOnHr = 15 AutoOnMn = 42 Password = $script:TestPassword } } } $outPath = Join-Path $script:ConfigOutputDir "LocalPowerMgmt" LocalPowerMgmt -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\localhost.mof" | Should -BeTrue } It "Should compile Security DSC config with password for localhost" { Configuration LocalSecurity { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "localhost" { Security SecSettings { Category = "Security" Password = $script:TestPassword } } } $outPath = Join-Path $script:ConfigOutputDir "LocalSecurity" LocalSecurity -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\localhost.mof" | Should -BeTrue } It "Should compile all 19 categories combined for localhost" { Configuration LocalAllCategories { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "localhost" { POSTBehavior P1 { Category = "POSTBehavior"; Password = $script:TestPassword } PowerManagement P2 { Category = "PowerManagement"; BlockDefinition = "1"; Password = $script:TestPassword } Security P3 { Category = "Security"; Password = $script:TestPassword } SystemConfiguration P4 { Category = "SystemConfiguration"; Password = $script:TestPassword } Performance P5 { Category = "Performance"; Password = $script:TestPassword } AdvancedBootOptions P6 { Category = "AdvancedBootOptions"; Password = $script:TestPassword } MiscellaneousDevices P7 { Category = "MiscellaneousDevices"; Password = $script:TestPassword } Wireless P8 { Category = "Wireless"; Password = $script:TestPassword } Maintenance P9 { Category = "Maintenance"; Password = $script:TestPassword } Video P10 { Category = "Video"; Password = $script:TestPassword } SecureBoot P11 { Category = "SecureBoot"; Password = $script:TestPassword } TPMSecurity P12 { Category = "TPMSecurity"; Password = $script:TestPassword } VirtualizationSupport P13 { Category = "VirtualizationSupport"; Password = $script:TestPassword } SystemLogs P14 { Category = "SystemLogs"; Password = $script:TestPassword } StealthModeControl P15 { Category = "StealthModeControl"; Password = $script:TestPassword } IntelSoftwareGuardExtensions P16 { Category = "IntelSoftwareGuardExtensions"; Password = $script:TestPassword } SupportAssistSystemResolution P17 { Category = "SupportAssistSystemResolution"; Password = $script:TestPassword } AdvancedConfigurations P18 { Category = "AdvancedConfigurations"; Password = $script:TestPassword } BIOSSetupAdvancedMode P19 { Category = "BIOSSetupAdvancedMode"; Password = $script:TestPassword } } } $outPath = Join-Path $script:ConfigOutputDir "LocalAllCategories" LocalAllCategories -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\localhost.mof" | Should -BeTrue (Get-Item "$outPath\localhost.mof").Length | Should -BeGreaterThan 1000 } } Describe "DSC Local Push - localhost" { It "Should push POSTBehavior config to localhost" { $mofPath = Join-Path $script:ConfigOutputDir "LocalPOSTBehavior" if (-not (Test-Path "$mofPath\localhost.mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } Start-DscConfiguration -Path $mofPath -Wait -Force -ErrorAction Stop } It "Should push POSTBehavior with password config to localhost" { $mofPath = Join-Path $script:ConfigOutputDir "LocalPOSTBehaviorPwd" if (-not (Test-Path "$mofPath\localhost.mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } Start-DscConfiguration -Path $mofPath -Wait -Force -ErrorAction Stop } It "Should push PowerManagement with password config to localhost" { $mofPath = Join-Path $script:ConfigOutputDir "LocalPowerMgmt" if (-not (Test-Path "$mofPath\localhost.mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } Start-DscConfiguration -Path $mofPath -Wait -Force -ErrorAction Stop } It "Should push Security with password config to localhost" { $mofPath = Join-Path $script:ConfigOutputDir "LocalSecurity" if (-not (Test-Path "$mofPath\localhost.mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } Start-DscConfiguration -Path $mofPath -Wait -Force -ErrorAction Stop } It "Should push all 19 categories combined config to localhost" { $mofPath = Join-Path $script:ConfigOutputDir "LocalAllCategories" if (-not (Test-Path "$mofPath\localhost.mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } Start-DscConfiguration -Path $mofPath -Wait -Force -ErrorAction Stop } } Describe "DSC Configuration Compilation - Remote (100.106.191.184)" { It "Should compile POSTBehavior for remote node" { Configuration RemotePOSTBehavior { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "100.106.191.184" { POSTBehavior PostSettings { Category = "POSTBehavior" Numlock = "Disabled" Password = $script:TestPassword } } } $outPath = Join-Path $script:ConfigOutputDir "RemotePOSTBehavior" RemotePOSTBehavior -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\100.106.191.184.mof" | Should -BeTrue } It "Should compile all 19 categories for remote node" { Configuration RemoteAllCategories { Import-DscResource -ModuleName @{ModuleName="DellBIOSProvider"; RequiredVersion="2.10.2"} Node "100.106.191.184" { POSTBehavior P1 { Category = "POSTBehavior"; Password = $script:TestPassword } PowerManagement P2 { Category = "PowerManagement"; BlockDefinition = "1"; Password = $script:TestPassword } Security P3 { Category = "Security"; Password = $script:TestPassword } SystemConfiguration P4 { Category = "SystemConfiguration"; Password = $script:TestPassword } Performance P5 { Category = "Performance"; Password = $script:TestPassword } AdvancedBootOptions P6 { Category = "AdvancedBootOptions"; Password = $script:TestPassword } MiscellaneousDevices P7 { Category = "MiscellaneousDevices"; Password = $script:TestPassword } Wireless P8 { Category = "Wireless"; Password = $script:TestPassword } Maintenance P9 { Category = "Maintenance"; Password = $script:TestPassword } Video P10 { Category = "Video"; Password = $script:TestPassword } SecureBoot P11 { Category = "SecureBoot"; Password = $script:TestPassword } TPMSecurity P12 { Category = "TPMSecurity"; Password = $script:TestPassword } VirtualizationSupport P13 { Category = "VirtualizationSupport"; Password = $script:TestPassword } SystemLogs P14 { Category = "SystemLogs"; Password = $script:TestPassword } StealthModeControl P15 { Category = "StealthModeControl"; Password = $script:TestPassword } IntelSoftwareGuardExtensions P16 { Category = "IntelSoftwareGuardExtensions"; Password = $script:TestPassword } SupportAssistSystemResolution P17 { Category = "SupportAssistSystemResolution"; Password = $script:TestPassword } AdvancedConfigurations P18 { Category = "AdvancedConfigurations"; Password = $script:TestPassword } BIOSSetupAdvancedMode P19 { Category = "BIOSSetupAdvancedMode"; Password = $script:TestPassword } } } $outPath = Join-Path $script:ConfigOutputDir "RemoteAllCategories" RemoteAllCategories -OutputPath $outPath -ErrorAction Stop | Out-Null Test-Path "$outPath\100.106.191.184.mof" | Should -BeTrue } } Describe "DSC Remote Push - 100.106.191.184 (Dell/Dell@123)" { BeforeAll { if (-not $script:RemoteReachable) { Write-Host "Remote machine not reachable - push tests will be skipped" -ForegroundColor Yellow } } It "Should push POSTBehavior config to remote with credentials" { if (-not $script:RemoteReachable) { Set-ItResult -Skipped -Because "Remote machine $($script:RemoteNode) not reachable" return } $mofPath = Join-Path $script:ConfigOutputDir "RemotePOSTBehavior" if (-not (Test-Path "$mofPath\$($script:RemoteNode).mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } { Start-DscConfiguration -Path $mofPath -Wait -Force -Credential $script:Credential -ErrorAction Stop } | Should -Not -Throw } It "Should push all 19 categories config to remote with credentials" { if (-not $script:RemoteReachable) { Set-ItResult -Skipped -Because "Remote machine $($script:RemoteNode) not reachable" return } $mofPath = Join-Path $script:ConfigOutputDir "RemoteAllCategories" if (-not (Test-Path "$mofPath\$($script:RemoteNode).mof")) { Set-ItResult -Skipped -Because "MOF not compiled" return } { Start-DscConfiguration -Path $mofPath -Wait -Force -Credential $script:Credential -ErrorAction Stop } | Should -Not -Throw } It "Should test DSC configuration status on remote" { if (-not $script:RemoteReachable) { Set-ItResult -Skipped -Because "Remote machine $($script:RemoteNode) not reachable" return } $status = Test-DscConfiguration -ComputerName $script:RemoteNode -Credential $script:Credential -ErrorAction SilentlyContinue # We just verify the command runs without throwing - the result depends on BIOS state $true | Should -BeTrue } } Describe "DSC Module Provider Tests (Local)" { BeforeAll { Import-Module $script:ModuleName -Force -ErrorAction SilentlyContinue } It "DellSmbios PSDrive should be available after import" { $drive = Get-PSDrive -Name DellSmbios -ErrorAction SilentlyContinue $drive | Should -Not -BeNullOrEmpty } It "Should list BIOS categories from DellSmbios drive" { $items = Get-ChildItem -Path "DellSmbios:\" -ErrorAction Stop $items.Count | Should -BeGreaterThan 10 } It "Should list POSTBehavior attributes" { $attrs = Get-ChildItem -Path "DellSmbios:\POSTBehavior" -ErrorAction Stop $attrs.Count | Should -BeGreaterThan 0 } It "Should get Numlock attribute value" { $val = Get-Item -Path "DellSmbios:\POSTBehavior\Numlock" -ErrorAction Stop $val | Should -Not -BeNullOrEmpty } It "Should list Security attributes" { $attrs = Get-ChildItem -Path "DellSmbios:\Security" -ErrorAction Stop $attrs.Count | Should -BeGreaterThan 0 } It "Should get AdminPassword attribute" { $val = Get-Item -Path "DellSmbios:\Security\AdminPassword" -ErrorAction Stop $val | Should -Not -BeNullOrEmpty } It "Set-Dell1stBootdevice should accept SecureString Password parameter" { $cmd = Get-Command Set-Dell1stBootdevice -ErrorAction Stop $cmd.Parameters['Password'].ParameterType | Should -Be ([System.Security.SecureString]) } It "Set-DellAutoOnForSelectDays should accept SecureString Password parameter" { $cmd = Get-Command Set-DellAutoOnForSelectDays -ErrorAction Stop $cmd.Parameters['Password'].ParameterType | Should -Be ([System.Security.SecureString]) } } # SIG # Begin signature block # MIIpLQYJKoZIhvcNAQcCoIIpHjCCKRoCAQExDzANBglghkgBZQMEAgMFADCBmwYK # KwYBBAGCNwIBBKCBjDCBiTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63 # JNLGKX7zUQIBAAIBAAIBAAIBAAIBADBRMA0GCWCGSAFlAwQCAwUABEAd5LMUogff # SCHnX72odIiJPGkN5tmD/ZXKzAxKaqnvNCqbmpoiZhGXgXnS9K9p10MlhLSf10fk # ubksORcjuzDvoIIOHzCCBrAwggSYoAMCAQICEAitQLJg0pxMn17Nqb2TrtkwDQYJ # KoZIhvcNAQEMBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQg # VHJ1c3RlZCBSb290IEc0MB4XDTIxMDQyOTAwMDAwMFoXDTM2MDQyODIzNTk1OVow # aTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQD # EzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4 # NCAyMDIxIENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW0L0LQ # KK14t13VOVkbsYhC9TOM6z2Bl3DFu8SFJjCfpI5o2Fz16zQkB+FLT9N4Q/QX1x7a # +dLVZxpSTw6hV/yImcGRzIEDPk1wJGSzjeIIfTR9TIBXEmtDmpnyxTsf8u/LR1oT # pkyzASAl8xDTi7L7CPCK4J0JwGWn+piASTWHPVEZ6JAheEUuoZ8s4RjCGszF7pNJ # cEIyj/vG6hzzZWiRok1MghFIUmjeEL0UV13oGBNlxX+yT4UsSKRWhDXW+S6cqgAV # 0Tf+GgaUwnzI6hsy5srC9KejAw50pa85tqtgEuPo1rn3MeHcreQYoNjBI0dHs6EP # bqOrbZgGgxu3amct0r1EGpIQgY+wOwnXx5syWsL/amBUi0nBk+3htFzgb+sm+YzV # svk4EObqzpH1vtP7b5NhNFy8k0UogzYqZihfsHPOiyYlBrKD1Fz2FRlM7WLgXjPy # 6OjsCqewAyuRsjZ5vvetCB51pmXMu+NIUPN3kRr+21CiRshhWJj1fAIWPIMorTmG # 7NS3DVPQ+EfmdTCN7DCTdhSmW0tddGFNPxKRdt6/WMtyEClB8NXFbSZ2aBFBE1ia # 3CYrAfSJTVnbeM+BSj5AR1/JgVBzhRAjIVlgimRUwcwhGug4GXxmHM14OEUwmU// # Y09Mu6oNCFNBfFg9R7P6tuyMMgkCzGw8DFYRAgMBAAGjggFZMIIBVTASBgNVHRMB # Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRoN+Drtjv4XxGG+/5hewiIZfROQjAfBgNV # HSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYD # VR0lBAwwCgYIKwYBBQUHAwMwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNl # cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy # dXN0ZWRSb290RzQuY3JsMBwGA1UdIAQVMBMwBwYFZ4EMAQMwCAYGZ4EMAQQBMA0G # CSqGSIb3DQEBDAUAA4ICAQA6I0Q9jQh27o+8OpnTVuACGqX4SDTzLLbmdGb3lHKx # AMqvbDAnExKekESfS/2eo3wm1Te8Ol1IbZXVP0n0J7sWgUVQ/Zy9toXgdn43ccsi # 91qqkM/1k2rj6yDR1VB5iJqKisG2vaFIGH7c2IAaERkYzWGZgVb2yeN258TkG19D # +D6U/3Y5PZ7Umc9K3SjrXyahlVhI1Rr+1yc//ZDRdobdHLBgXPMNqO7giaG9OeE4 # Ttpuuzad++UhU1rDyulq8aI+20O4M8hPOBSSmfXdzlRt2V0CFB9AM3wD4pWywiF1 # c1LLRtjENByipUuNzW92NyyFPxrOJukYvpAHsEN/lYgggnDwzMrv/Sk1XB+JOFX3 # N4qLCaHLC+kxGv8uGVw5ceG+nKcKBtYmZ7eS5k5f3nqsSc8upHSSrds8pJyGH+PB # VhsrI/+PteqIe3Br5qC6/To/RabE6BaRUotBwEiES5ZNq0RA443wFSjO7fEYVgcq # LxDEDAhkPDOPriiMPMuPiAsNvzv0zh57ju+168u38HcT5ucoP6wSrqUvImxB+YJc # FWbMbA7KxYbD9iYzDAdLoNMHAmpqQDBISzSoUSC7rRuFCOJZDW3KBVAr6kocnqX9 # oKcfBnTn8tZSkP2vhUgh+Vc7tJwD7YZF9LRhbr9o4iZghurIr6n+lB3nYxs6hlZ4 # TjCCB2cwggVPoAMCAQICEAMx+1XPXJY1+uD8jHZg+r4wDQYJKoZIhvcNAQELBQAw # aTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQD # EzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4 # NCAyMDIxIENBMTAeFw0yNTExMDUwMDAwMDBaFw0yNjExMDQyMzU5NTlaMIHvMRMw # EQYLKwYBBAGCNzwCAQMTAlVTMRkwFwYLKwYBBAGCNzwCAQITCERlbGF3YXJlMR0w # GwYDVQQPDBRQcml2YXRlIE9yZ2FuaXphdGlvbjEQMA4GA1UEBRMHNTI4MDM5NDEL # MAkGA1UEBhMCVVMxDjAMBgNVBAgTBVRleGFzMRMwEQYDVQQHEwpSb3VuZCBSb2Nr # MR8wHQYDVQQKExZEZWxsIFRlY2hub2xvZ2llcyBJbmMuMRgwFgYDVQQLEw9DbGll # bnQgU29mdHdhcmUxHzAdBgNVBAMTFkRlbGwgVGVjaG5vbG9naWVzIEluYy4wggGi # MA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDB86C71b+hpK5bDr5p4DSU5tsP # R2rZ6NDZHMHZNnuKtQ4IpTssP9f2bSanG1QaM1vl96+V1/Emp30Nb/IPj7soGUQU # OYr7aVt+lJf2nSVm+rhe9bfI4nnsabrJ0ReieGaGyAjauc6/s2EnGR5mlBPb+D+z # 8ZMzpWe8eDe1q7jPT38f01RdEeTSlm0j4ks5Fzxiqa9dzKz8rAnwYf3CZqaHOgtF # gx8IgZdzm1QGpPWowO1TZHpzGJrh0ofoC+pASWHkmyoqMV2+ffKlG2jjhX0xUYVX # XoSaifQSK4m6K1FR+xaeHUfSkkWOapp9V2BHZua/PTyVVctwTudQoAgffh5ut+cw # uzG76pbknyZkOtH7gy1LzMSLZ4NOGlPHhINqdyDE0gZdMGwFrINW3EHdzRnPFjAn # yPc9J8wl9nDBmwRCcnPZ9nk6g1UqFma809jepWXRLURl60mylQfWYR6wp/RJZ4qi # A3A6nKmsQGLT19frtcNKfuzXCyyLZcVecrNth9cCAwEAAaOCAgIwggH+MB8GA1Ud # IwQYMBaAFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB0GA1UdDgQWBBSK75aqntZTZxM3 # mp6PiOWeaUfy9DA9BgNVHSAENjA0MDIGBWeBDAEDMCkwJwYIKwYBBQUHAgEWG2h0 # dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8EBAMCB4AwEwYDVR0l # BAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZNaHR0cDovL2NybDMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2 # U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv # bS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFD # QTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcwAYYYaHR0cDovL29j # c3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8vY2FjZXJ0cy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEz # ODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBWKrYN # PoqBrPpTEXVVQYsX1jenSDv4n7+o4SYvQU7rYa9iGkqtQJhvtDzBHzbCBGqKJK4e # E1nLx1g9gNwL4EIxDBnE0EF2sn1ovueI7nMhnkmSCWVgKRw/7sHPOohPjpI9/N94 # LAqJbag4uWNSW+7dQUv0n/0DlI+BIUNMyUM4LeUvlsbZMqHmTEwX5DKiD7uCjYs5 # y7H7TaOkxgXLVft0SZXzIBjLv+vv3lAZ7c93voKkPt9Vvg/a3CBMxxZf/TNatGD1 # tnVXKfnd1+64nYtbTsueR9YMNcIjB22o1ILPcOPDPS4jVwTSSyW8dRg9wOPwMmRd # RPt1PCvkQxBsEaf9jFvdqe7LqS7B28D9iq78W3lBkVAlZ2jCrpjy0CT6GVKmlrY9 # IUOfWb1n1dKJnQMgepPCG93OpMu5x9bXRDzR3PinnIvT69qgVr378KuapiGMM/PA # u5z9KdLALQVtxxW7+SF3AQh3pV0PGMO62ac9qTo/Zu1SMpoB6yJMhYe37Rk1WFzA # C9DZoDqcluhjm/t7Jtb8ysi7VV2Hebzvhy0T+2ZME0JX5b80nzbHnY4HQiJfwcDD # 4nmywQTBStR68TUw8xPgyEZRITukqsV/4sKFJKGioIYBPVwH/xh1Wo2r0u5lJzUA # I6q8pn1IxzkiIBW3f9FhCgWmYBgNU9BguBzYQjGCGkEwgho9AgEBMH0waTELMAkG # A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdp # Q2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIx # IENBMQIQAzH7Vc9cljX64PyMdmD6vjANBglghkgBZQMEAgMFAKCBnDAQBgorBgEE # AYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3 # AgELMQ4wDAYKKwYBBAGCNwIBFTBPBgkqhkiG9w0BCQQxQgRA8g917lVdnsDZldzF # Ms/OBbLNbHLMXhM0qN5fHQMd6f9jSpihttZvtYC/Hx0qoAXB8if7ifMKr/tSlFhX # mv+X9jANBgkqhkiG9w0BAQEFAASCAYAWtnmYa+Jqf1QAC7xS4+NrLeTtMfTtgCs6 # 2/HToToz1O/rxUC4U3be2TElseOMTgEbrHSamsro6+aL4+/pGOyWuMkLlQutnveo # dvmdpClCcPC6a6iBJ5Lup0KgQ4wsdjeDsIK//ZCO8iB9m5v6s72D2eK99ITGf9dc # m9HSrZIUjy+AisbovoaZplG/Y7rEGtDPgDN7XaXS1IQ58l/GxNlyOsrao4LtqYTl # fZ0O+VLtiidM0bfu1bZSJ2CJjkKOIp7r7xLwqJ6RfkYbTN8taRzMX6qB1hVD18fA # OUeowFacGPuFEtrOItwr3RZ1btH4qRM8A+RS6mQHQHQbsQx/nFRAWOLO6vDscT35 # CPdYm5mIzCzW9WFlCOHzBbEp4WZb+63h1cZkQAcPbmWdZz6Tm4bdwNaunmRuRAOM # 5KIAiNO9tb5CgHGK44A1WbCIA1uC8e7uqC6AvOC7P0Jhc0+cVh/q3nR5BR6rkV52 # pbln8V+weFOuiDvFugD1BlpfnjIyycqhghd2MIIXcgYKKwYBBAGCNwMDATGCF2Iw # ghdeBgkqhkiG9w0BBwKgghdPMIIXSwIBAzEPMA0GCWCGSAFlAwQCAQUAMHcGCyqG # SIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQg # 4RTH93DGMSfi3Z9/DNBfRui637/hjhrfx+Dc36b/2fICEBvoDJkzNFUbluPPxEu8 # U5IYDzIwMjYwNjI1MDczMDQ0WqCCEzowggbtMIIE1aADAgECAhAKgO8YS43xBYLR # xHanlXRoMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5E # aWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1l # U3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBDQTEwHhcNMjUwNjA0MDAwMDAw # WhcNMzYwOTAzMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNl # cnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFNIQTI1NiBSU0E0MDk2IFRpbWVz # dGFtcCBSZXNwb25kZXIgMjAyNSAxMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEA0EasLRLGntDqrmBWsytXum9R/4ZwCgHfyjfMGUIwYzKomd8U1nH7C8Dr # 0cVMF3BsfAFI54um8+dnxk36+jx0Tb+k+87H9WPxNyFPJIDZHhAqlUPt281mHrBb # ZHqRK71Em3/hCGC5KyyneqiZ7syvFXJ9A72wzHpkBaMUNg7MOLxI6E9RaUueHTQK # WXymOtRwJXcrcTTPPT2V1D/+cFllESviH8YjoPFvZSjKs3SKO1QNUdFd2adw44wD # cKgH+JRJE5Qg0NP3yiSyi5MxgU6cehGHr7zou1znOM8odbkqoK+lJ25LCHBSai25 # CFyD23DZgPfDrJJJK77epTwMP6eKA0kWa3osAe8fcpK40uhktzUd/Yk0xUvhDU6l # vJukx7jphx40DQt82yepyekl4i0r8OEps/FNO4ahfvAk12hE5FVs9HVVWcO5J4dV # mVzix4A77p3awLbr89A90/nWGjXMGn7FQhmSlIUDy9Z2hSgctaepZTd0ILIUbWuh # KuAeNIeWrzHKYueMJtItnj2Q+aTyLLKLM0MheP/9w6CtjuuVHJOVoIJ/DtpJRE7C # e7vMRHoRon4CWIvuiNN1Lk9Y+xZ66lazs2kKFSTnnkrT3pXWETTJkhd76CIDBbTR # ofOsNyEhzZtCGmnQigpFHti58CSmvEyJcAlDVcKacJ+A9/z7eacCAwEAAaOCAZUw # ggGRMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOQ7/PIx7f391/ORcWMZUEPPYYzo # MB8GA1UdIwQYMBaAFO9vU0rp5AZ8esrikFb2L9RJ7MtOMA4GA1UdDwEB/wQEAwIH # gDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCBlQYIKwYBBQUHAQEEgYgwgYUwJAYI # KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBdBggrBgEFBQcwAoZR # aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGlt # ZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEuY3J0MF8GA1UdHwRYMFYwVKBS # oFCGTmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRp # bWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0ExLmNybDAgBgNVHSAEGTAXMAgG # BmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcNAQELBQADggIBAGUqrfEcJwS5 # rmBB7NEIRJ5jQHIh+OT2Ik/bNYulCrVvhREafBYF0RkP2AGr181o2YWPoSHz9iZE # N/FPsLSTwVQWo2H62yGBvg7ouCODwrx6ULj6hYKqdT8wv2UV+Kbz/3ImZlJ7YXwB # D9R0oU62PtgxOao872bOySCILdBghQ/ZLcdC8cbUUO75ZSpbh1oipOhcUT8lD8QA # GB9lctZTTOJM3pHfKBAEcxQFoHlt2s9sXoxFizTeHihsQyfFg5fxUFEp7W42fNBV # N4ueLaceRf9Cq9ec1v5iQMWTFQa0xNqItH3CPFTG7aEQJmmrJTV3Qhtfparz+BW6 # 0OiMEgV5GWoBy4RVPRwqxv7Mk0Sy4QHs7v9y69NBqycz0BZwhB9WOfOu/CIJnzkQ # TwtSSpGGhLdjnQ4eBpjtP+XB3pQCtv4E5UCSDag6+iX8MmB10nfldPF9SVD7weCC # 3yXZi/uuhqdwkgVxuiMFzGVFwYbQsiGnoa9F5AaAyBjFBtXVLcKtapnMG3VH3EmA # p/jsJ3FVF3+d1SVDTmjFjLbNFZUWMXuZyvgLfgyPehwJVxwC+UpX2MSey2ueIu9T # HFVkT+um1vshETaWyQo8gmBto/m3acaP9QsuLj3FNwFlTxq25+T4QwX9xa6ILs84 # ZPvmpovq90K8eWyG2N01c4IhSOxqt81nMIIGtDCCBJygAwIBAgIQDcesVwX/IZku # QEMiDDpJhjANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM # RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD # ExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjUwNTA3MDAwMDAwWhcNMzgw # MTE0MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIElu # Yy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJT # QTQwOTYgU0hBMjU2IDIwMjUgQ0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC # CgKCAgEAtHgx0wqYQXK+PEbAHKx126NGaHS0URedTa2NDZS1mZaDLFTtQ2oRjzUX # MmxCqvkbsDpz4aH+qbxeLho8I6jY3xL1IusLopuW2qftJYJaDNs1+JH7Z+QdSKWM # 06qchUP+AbdJgMQB3h2DZ0Mal5kYp77jYMVQXSZH++0trj6Ao+xh/AS7sQRuQL37 # QXbDhAktVJMQbzIBHYJBYgzWIjk8eDrYhXDEpKk7RdoX0M980EpLtlrNyHw0Xm+n # t5pnYJU3Gmq6bNMI1I7Gb5IBZK4ivbVCiZv7PNBYqHEpNVWC2ZQ8BbfnFRQVESYO # szFI2Wv82wnJRfN20VRS3hpLgIR4hjzL0hpoYGk81coWJ+KdPvMvaB0WkE/2qHxJ # 0ucS638ZxqU14lDnki7CcoKCz6eum5A19WZQHkqUJfdkDjHkccpL6uoG8pbF0LJA # QQZxst7VvwDDjAmSFTUms+wV/FbWBqi7fTJnjq3hj0XbQcd8hjj/q8d6ylgxCZSK # i17yVp2NL+cnT6Toy+rN+nM8M7LnLqCrO2JP3oW//1sfuZDKiDEb1AQ8es9Xr/u6 # bDTnYCTKIsDq1BtmXUqEG1NqzJKS4kOmxkYp2WyODi7vQTCBZtVFJfVZ3j7OgWmn # hFr4yUozZtqgPrHRVHhGNKlYzyjlroPxul+bgIspzOwbtmsgY1MCAwEAAaOCAV0w # ggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFO9vU0rp5AZ8esrikFb2 # L9RJ7MtOMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB # /wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYI # KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1 # aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RH # NC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29t # L0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIw # CwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQAXzvsWgBz+Bz0RdnEwvb4L # yLU0pn/N0IfFiBowf0/Dm1wGc/Do7oVMY2mhXZXjDNJQa8j00DNqhCT3t+s8G0iP # 5kvN2n7Jd2E4/iEIUBO41P5F448rSYJ59Ib61eoalhnd6ywFLerycvZTAz40y8S4 # F3/a+Z1jEMK/DMm/axFSgoR8n6c3nuZB9BfBwAQYK9FHaoq2e26MHvVY9gCDA/JY # sq7pGdogP8HRtrYfctSLANEBfHU16r3J05qX3kId+ZOczgj5kjatVB+NdADVZKON # /gnZruMvNYY2o1f4MXRJDMdTSlOLh0HCn2cQLwQCqjFbqrXuvTPSegOOzr4EWj7P # tspIHBldNE2K9i697cvaiIo2p61Ed2p8xMJb82Yosn0z4y25xUbI7GIN/TpVfHIq # Q6Ku/qjTY6hc3hsXMrS+U0yy+GWqAXam4ToWd2UQ1KYT70kZjE4YtL8Pbzg0c1ug # MZyZZd/BdHLiRu7hAWE6bTEm4XYRkA6Tl4KSFLFk43esaUeqGkH/wyW4N7Oigizw # JWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx3zEdmcif/sYQsfch28bZeUz2rtY/ # 9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8BlqmyIjlgp2+VqsS9/wQD7yFylIz0scm # bKvFoW2jNrbM1pD2T7m3XDCCBY0wggR1oAMCAQICEA6bGI750C3n79tQ4ghAGFow # DQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0 # IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNl # cnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIz # NTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG # A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3Rl # ZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAv+aQc2je # u+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2ms2uexuEDcQwH/MbpDgW61bG # l20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBE # EC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7Ik/ghYZs06wXGXuxbGrzryc/N # rDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7XeOtyU9e5TXnMcvak17cjo+A # 2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWCPhCRcKtVgkEy19sEcypukQF8 # IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfdpCe8oU85tRFYF/ckXEaPZPfB # aYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucOY67m1O+SkjqePdwA5EUlibaa # RBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3u3/y1YxwLEFgqrFjGESVGnZi # fvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXe # eqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2PsIV/EIFFrb7GrhotPwtZFX50g # /KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEAAaOCATowggE2MA8GA1UdEwEB # /wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8uZz/nupiuHA9PMB8GA1UdIwQY # MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1UdDwEB/wQEAwIBhjB5BggrBgEF # BQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBD # BggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8MDqgOKA2hjRodHRwOi8vY3Js # My5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMBEGA1Ud # IAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22 # Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdtvRoU9BNKei8ttzjv9P+Aufih # 9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYD # E3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1RmppVLC4oVaO7KTVPeix3P0c # 2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88n # q2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b0VysGMNNn3O3AamfV6peKOK5 # lDGCA3wwggN4AgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0 # LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGlu # ZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMQIQCoDvGEuN8QWC0cR2p5V0aDANBglg # hkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZI # hvcNAQkFMQ8XDTI2MDYyNTA3MzA0NFowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQU # 3WIwrIYKLTBr2jixaHlSMAf7QX4wLwYJKoZIhvcNAQkEMSIEILOB13ApYy6yEVcW # zT0fSkiKKRnczdJkezIgpm/LCAkBMDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIEqg # P6Is11yExVyTj4KOZ2ucrsqzP+NtJpqjNPFGEQozMA0GCSqGSIb3DQEBAQUABIIC # ADPnrScQAdfDSZV4bbJdTAuoy2RGe0z1a7qjKXmZ+lrwiIgwCyq74/3BNZiAV/Jt # lwo9/yNkfzo5I10u1EEtd82/wQ2G8rH2SZwd7qAI53mHxuXqCYZn6kA4G7skOBD6 # nF4tcRRCrOujTBN4EqELc3yzjybJ3UhFXIRMgDcGvPzmR9MhBUb/cRmA96XdX6z8 # Txrpnc8VMAw8i+40gPpCU4ynmh5QVrYaC5o/YgJmgzyGtdkODkKsK8+DwdLeOS+3 # +hNkMyLbzhhsufipjkYlwue1POQXPhRbXeHM771pU0SlZRWGeXesEz35BDdomtHm # gSCAnUm+idI+4MZpsKSnvGQ4EQ37UuhKvdiTUlM5kpUFmw0PBbQV0+nybpMt62UH # 0bnJuJm/QVxTwu1mEl1//bQP24tVAz17uWB+izyzqu2vambgT4VM8dKlghynE8vi # zr6JWxLviOzrrvyuSnR9ILkpPACnW/yXw8E9hFkC0PKllF3njwXGaAuAmZ7zekLA # VRGddw1FBowt7IT7x/qDyySReAoZ4vP+vO+0NcVyrzh2QJs4pO85v77AZc/Iem0j # N2RmVptEPuoNOH9wCrZkVTYGCvIQcZ+gkdQBfe+bvi1Hw7m7UFs5VkgkURycnnTm # ohxznZd6rlq82JSFiTgx/AoKPnbL6FGiqvbCwqF0zCVq # SIG # End signature block |