Set-StrictMode -Version Latest InModuleScope Pester { Describe 'Get-PesterResult' { } Describe 'It - Implementation' { $testState = New-PesterState -Path $TestDrive It 'Throws an error if It is called outside of Describe' { $scriptBlock = { ItImpl -Pester $testState 'Tries to enter a test without entering a Describe first' { } } $scriptBlock | Should Throw 'The It command may only be used inside a Describe block.' } $testState.EnterDescribe('Mocked Describe') # We call EnterTest() directly here because if we actually nest calls to ItImpl, the outer call will catch the error we're trying to # verify with Should Throw. (Another option would be to nest the ItImpl calls, and look for a failed test result in $testState.) $testState.EnterTest('Outer Test') It 'Throws an error if you try to enter It from inside another It' { $scriptBlock = { ItImpl -Pester $testState 'Enters the second It' { } } $scriptBlock | Should Throw 'You already are in It, you cannot enter It twice' } $testState.LeaveTest() It 'Throws an error if you fail to pass in a test block' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' } $scriptBlock | Should Throw 'No test script block is provided. (Have you put the open curly brace on the next line?)' } It 'Does not throw an error if It is called inside a Describe, and adds a successful test result.' { $scriptBlock = { ItImpl -Pester $testState 'Enters an It block inside a Describe' { } } $scriptBlock | Should Not Throw $testState.TestResult[-1].Passed | Should Be $true $testState.TestResult[-1].ParameterizedSuiteName | Should BeNullOrEmpty } It 'Does not throw an error if the -Pending switch is used, and no script block is passed' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' -Pending } $scriptBlock | Should Not Throw } It 'Does not throw an error if the -Skip switch is used, and no script block is passed' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' -Skip } $scriptBlock | Should Not Throw } It 'Does not throw an error if the -Ignore switch is used, and no script block is passed' { $scriptBlock = { ItImpl -Pester $testState 'Some Name' -Ignore } $scriptBlock | Should Not Throw } It 'Creates a pending test for an empty (whitespace and comments only) script block' { $scriptBlock = { # Single-Line comment <# Multi- Line- Comment #> } { ItImpl -Pester $testState 'Some Name' $scriptBlock } | Should Not Throw $testState.TestResult[-1].Result | Should Be 'Pending' } It 'Adds a failed test if the script block throws an exception' { $scriptBlock = { ItImpl -Pester $testState 'Enters an It block inside a Describe' { throw 'I am a failed test' } } $scriptBlock | Should Not Throw $testState.TestResult[-1].Passed | Should Be $false $testState.TestResult[-1].ParameterizedSuiteName | Should BeNullOrEmpty $testState.TestResult[-1].FailureMessage | Should Be 'I am a failed test' } $script:counterNameThatIsReallyUnlikelyToConflictWithAnything = 0 It 'Calls the output script block for each test' { $outputBlock = { $script:counterNameThatIsReallyUnlikelyToConflictWithAnything++ } ItImpl -Pester $testState 'Does something' -OutputScriptBlock $outputBlock { } ItImpl -Pester $testState 'Does something' -OutputScriptBlock $outputBlock { } ItImpl -Pester $testState 'Does something' -OutputScriptBlock $outputBlock { } $script:counterNameThatIsReallyUnlikelyToConflictWithAnything | Should Be 3 } Remove-Variable -Scope Script -Name counterNameThatIsReallyUnlikelyToConflictWithAnything Context 'Parameterized Tests' { # be careful about variable naming here; with InModuleScope Pester, we can create the same types of bugs that the v3 # scope isolation fixed for everyone else. (Naming this variable $testCases gets hidden later by parameters of the # same name in It.) $cases = @( @{ a = 1; b = 1; expectedResult = 2} @{ a = 1; b = 2; expectedResult = 3} @{ a = 5; b = 4; expectedResult = 9} @{ a = 1; b = 1; expectedResult = 'Intentionally failed' } ) $suiteName = 'Adds and to get . is not a parameter.' ItImpl -Pester $testState -Name $suiteName -TestCases $cases { param ($a, $b, $expectedResult) ($a + $b) | Should Be $expectedResult } It 'Creates test result records with the ParameterizedSuiteName property set' { for ($i = -1; $i -ge -4; $i--) { $testState.TestResult[$i].ParameterizedSuiteName | Should Be $suiteName } } It 'Expands parameters in parameterized test suite names' { for ($i = -1; $i -ge -4; $i--) { $expectedName = "Adds $($cases[$i]['a']) and $($cases[$i]['b']) to get $($cases[$i]['expectedResult']). is not a parameter." $testState.TestResult[$i].Name | Should Be $expectedName } } It 'Logs the proper successes and failures' { $testState.TestResult[-1].Passed | Should Be $false for ($i = -2; $i -ge -4; $i--) { $testState.TestResult[$i].Passed | Should Be $true } } } } Describe 'Get-OrderedParameterDictionary' { $_testScriptBlock = { param ( $1, $c, $0, $z, $a, ${Something.Really/Weird } ) } $hashtable = @{ '1' = 'One' '0' = 'Zero' z = 'Z' a = 'A' c = 'C' 'Something.Really/Weird ' = 'Weird' } $dictionary = Get-OrderedParameterDictionary -ScriptBlock $_testScriptBlock -Dictionary $hashtable It 'Reports keys and values in the same order as the param block' { ($dictionary.Keys -join ',') | Should Be '1,c,0,z,a,Something.Really/Weird ' ($dictionary.Values -join ',') | Should Be 'One,C,Zero,Z,A,Weird' } } Describe 'Remove-Comments' { It 'Removes single line comments' { Remove-Comments -Text 'code #comment' | Should Be 'code ' } It 'Removes multi line comments' { Remove-Comments -Text 'code <#comment comment#> code' | Should Be 'code code' } } } $thisScriptRegex = [regex]::Escape($MyInvocation.MyCommand.Path) Describe 'Get-PesterResult' { $getPesterResult = InModuleScope Pester { ${function:Get-PesterResult} } Context 'failed tests in Tests file' { #the $script scriptblock below is used as a position marker to determine #on which line the test failed. $errorRecord = $null try{'something' | should be 'nothing'}catch{ $errorRecord=$_} ; $script={} $result = & $getPesterResult 0 $errorRecord It 'records the correct stack line number' { $result.Stacktrace | should match "at line: $($script.startPosition.StartLine) in $thisScriptRegex" } It 'records the correct error record' { $result.ErrorRecord -is [System.Management.Automation.ErrorRecord] | Should be $true $result.ErrorRecord.Exception.Message | Should match 'Expected: {nothing}' } } It 'Does not modify the error message from the original exception' { $object = New-Object psobject $message = 'I am an error.' Add-Member -InputObject $object -MemberType ScriptMethod -Name ThrowSomething -Value { throw $message } $errorRecord = $null try { $object.ThrowSomething() } catch { $errorRecord = $_ } $pesterResult = & $getPesterResult 0 $errorRecord $pesterResult.FailureMessage | Should Be $errorRecord.Exception.Message } Context 'failed tests in another file' { $errorRecord = $null $testPath = Join-Path $TestDrive test.ps1 $escapedTestPath = [regex]::Escape($testPath) Set-Content -Path $testPath -Value "`r`n'One' | Should Be 'Two'" try { & $testPath } catch { $errorRecord = $_ } $result = & $getPesterResult 0 $errorRecord It 'records the correct stack line number' { $result.Stacktrace | should match "at line: 2 in $escapedTestPath" } It 'records the correct error record' { $result.ErrorRecord -is [System.Management.Automation.ErrorRecord] | Should be $true $result.ErrorRecord.Exception.Message | Should match 'Expected: {Two}' } } } # SIG # Begin signature block # MIInjwYJKoZIhvcNAQcCoIIngDCCJ3wCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCT7hodUcKmASqq # 77kpXQ+Mw6bkME7fkMjDJzx4xtoeSqCCC8MwggXaMIIEwqADAgECAhMzAAABP8rF # KBkLiTVYAAAAAAE/MA0GCSqGSIb3DQEBCwUAMIGOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU # aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMjAeFw0yNTExMTMxOTU5NDJaFw0y # NjExMTAxOTU5NDJaMIGEMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMS4wLAYDVQQDEyVNaWNyb3NvZnQgV2luZG93cyAzcmQgcGFydHkgQ29tcG9u # ZW50MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEA2Zy0BnZmL5lF9IDS # IFBJ81NqCWCPLo2bRGJObUnrlezQw+FWEDU9+poMEyRjgbgafifNKY4TJ3e9Od4p # q56xMXBcGYVIe546gz4p68MQG4iXqqSBB4kk5jwk5U7igTCfZIga6PFElV6Wm7kv # Bdw14NVgdJZZDdmIc9TdaWbxrxAda9IMjZNQYfJZ/WVinf0mPnYM2hQwj4Gl4DGC # 0/KO6U+ayXHAtcS9qj2UJYB7rCyteNydGWHaMa5B8fzOpSNS3ioJfYcBwSjfcBRD # pemnEb5BcIF10FVuNA4foeMz5emIZaGGl8XxVC9K79Xwkc571Sv899qEdYP8ZFW9 # yVXY8l1ptvk4nD52nq9ld4HjWA+FHmhbhKggbjEVymQee7fOgEWKE3Uc73YnTMGf # TXzDwH9jYip5fwls08LWs0HCINu/iA/OG/vm1jrJdK5wcBgX2B0fZPdwgLTEgs0R # rSIyv9WucI0S6XffXJuUH+lziAX7RmCPhy5kZR1R3LB0GnBlAgMBAAGjggG3MIIB # szATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUt3RSDxhJIhKufhwaOyWL # 3nMDoeUwVAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5k # IE9wZXJhdGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwODA5KzUwNjIzOTAfBgNV # HSMEGDAWgBRhcaeHr/9p1SF2T1KTKAC+eRKrhDB0BgNVHR8EbTBrMGmgZ6BlhmNo # dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBX # aW5kb3dzJTIwVGhpcmQlMjBQYXJ0eSUyMENvbXBvbmVudCUyMENBJTIwMjAxMi5j # cmwwgYEGCCsGAQUFBwEBBHUwczBxBggrBgEFBQcwAoZlaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBXaW5kb3dzJTIwVGhp # cmQlMjBQYXJ0eSUyMENvbXBvbmVudCUyMENBJTIwMjAxMi5jcnQwDAYDVR0TAQH/ # BAIwADANBgkqhkiG9w0BAQsFAAOCAQEAk+iGdVNjQ2VMiNXhflILGybQmTUMM+qd # BZ3KErdJ9wkVTN/fMukvmp9y1iF8Sz1NUqDNqiKLofcL0XukOu5W3zAofFlAs2tR # vf0ArWKgRP5gjpqXeo3xWRM/1LBYTDhwDmylfh36AnfErB+aHyoIr9an+2KqeIqj # 5VvFPgwJ1n6ZTXZMhjvYnIol/P+vwVroo2XKwbOL1/c79xRj7X8Lqw+7sVoIA9/P # ytqdSDV1ClBjltkRpdgwvbSDPzycfvN8V5pPFfkrqrcIHjaL2pe76nqRsEIPqiVQ # SmqiaJV6iprCSDGJYC4/4EMLIDZ4uf+m0XHW3Qzlr7RLlMdsJKny7jCCBeEwggPJ # oAMCAQICCmELqsEAAAAAAAkwDQYJKoZIhvcNAQELBQAwgYgxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290 # IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDEwMB4XDTEyMDQxODIzNDgzOFoXDTI3 # MDQxODIzNTgzOFowgY4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xODA2BgNVBAMTL01pY3Jvc29mdCBXaW5kb3dzIFRoaXJkIFBhcnR5IENvbXBv # bmVudCBDQSAyMDEyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAo5ww # hAmnYy7PCkfw6iT5ozAgD15XMSaBmjEHslDUzmcJCGUKWqVLrtXtEC7npZm1n2gv # mItYAqwgtCnEcb0oHKX9PJtk5MXr32ElvPDuaL/Rp8t+KgKBTmRcDFOGeVcZN2G3 # mPkMoE4iWZv5Gy1nPCc8VpBm4/1/ZX0Phr01R+iKzPTajulqTqunVeyiiR7VM0VT # y/med73NLPkFuH90AR3o+xjhQ9EN6arcN2+9/rgP7R1NAUZOCqz8gujsVoMTjjoB # 7RRkdOpksmYQtmhtyHAAfVBILj1D7uAklcbNjsf9uOSVz91++5VeoQHNQ7EH16Qw # 7puGGipuwQtZonRviwIDAQABo4IBQzCCAT8wEAYJKwYBBAGCNxUBBAMCAQAwHQYD # VR0OBBYEFGFxp4ev/2nVIXZPUpMoAL55EquEMBkGCSsGAQQBgjcUAgQMHgoAUwB1 # AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaA # FNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9j # cmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8y # MDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAt # MDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQBaimfazNX9DSZBd78KRni0s94S # aSt3I8JlLwFf0gP0YbpQnS6MOXLzbD5qsR52bey384LczLvFaXAoc2YXP1Tr7gEW # SMRG2RuAroE6jQ95bWiwnuotPznTyjh+vV58CG4Z3MbC9DgzaGHiUkeD4QABVtK6 # y4eCBTEKQYtO539fX+1f0zktReuiE7/9HsKYQXFhFl/ICnAlfFlpMSTkcecKuwQX # 959yHsnSuxq+PQL+CQyyQ7RZGplTk5YhX+DWtyYBQpU2rCf9vvSFd2g9GL30vpiI # IhGGUhbzRewDlxBwh6NwQ3E828mGAxcM9XNbxn3hXGTt18VI1+0y4tGq08+n9ldO # Yfl362fyiLPeANoDj9CKNDc+HdhiuNKx8+Evi3I7gZZ8b/zsZnZyYBsk8qCJbVtt # AC7vKN2GhwXCtLnlvmTCKvJKFVyY4sQnhf9S42J+D7ICC9dmxwqy0z0gBBRQMlmD # Cn2b7Vo4EgFSui9eIHKOSvH953ECjDvhB77Jc/TdR9i077SkszC5iT52yrkAmFZ+ # q+qKuKXQOKtpdxMLFC/pqkEf97q9Ois0iu4Kq2PmY/eIJI4gDSs7nePCSVKsnx8O # OTtd1G5QauZ9UjqqfDMVKQ0mXgFYp06pPXqEb3Q/YJ/kMk82AK9tcdM+pkZlX4F0 # 8f7BcdpMoEFagt3xHzGCGyIwghseAgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU # aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMgITMwAAAT/KxSgZC4k1WAAAAAAB # PzANBglghkgBZQMEAgEFAKCCARgwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIPcF # 1DBbIpQrtIPkD+dKZy7GsBYaSp3FxK7V6e7PdZtHMFAGCisGAQQBgjcKAxwxQgxA # M0JCNEY3Q0YzMEUzNEEyNkI1N0U5MEZDMjJDRjVDQjQyQjEwRUFCMDU3QjM5OTZE # MUJFM0JEOUVCMTc2RkZFRjBaBgorBgEEAYI3AgEMMUwwSqAkgCIATQBpAGMAcgBv # AHMAbwBmAHQAIABXAGkAbgBkAG8AdwBzoSKAIGh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS93aW5kb3dzMA0GCSqGSIb3DQEBAQUABIIBgGtCCPRx28e3dBTd/I2PgBvp # yJh38iixyGTuNe9VI/bPHeym4lgRpWD+SzI+aqx44Clm9AsMP1R+3p16s4Ipwa8e # 2CIzcne1CoswhVbYVSFsTTpM3XflugdQu8FySXLBNLOXCCytSwgNyKIna1YyC4zs # p+3ty8nvqn8Ks/OXo6B0Gjmrdc/iil92CRFhUHUSj1hF6aKFJ2iDA9XzY5xaK3mj # BIJBc5u4rrvHvqChLZqkyIQ++PP5NYaRTfjgoVv/VVYcjiETngIhhTx00ZIxWe5Y # ZuDnHRi2ZNOHVNTDXXGUbwHRaitIi7wrKWk/gZTGKFwGuU1qgb46dq+gZ+Cq6Rhd # J+ITteaDtoByVtRj6WHgoT/IAEljk88p19MF6HNfry8mm9dhCSHCgiXqLa0SxORz # fxxZMVezOPFIAaz5iVkqyGbsvhF1XgWq1vbMTKxEMX2EiCsMpz2EJzkQdHL/ReVr # JaUjPgNK0Z8cWgpkIhlprkIE2PlYkRcszRKZmgD0dqGCF7AwghesBgorBgEEAYI3 # AwMBMYIXnDCCF5gGCSqGSIb3DQEHAqCCF4kwgheFAgEDMQ8wDQYJYIZIAWUDBAIB # BQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAx # MA0GCWCGSAFlAwQCAQUABCBu7TY5qknTsQhYvbNjPEsRRXtPpyhVrtDHdh0dJDKx # EQIGanOQpn5uGBMyMDI2MDgwODE4MzQ0NS40MjRaMASAAgH0oIHZpIHWMIHTMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGll # bGQgVFNTIEVTTjoyRDFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaCCEf4wggcoMIIFEKADAgECAhMzAAACEtEIBjzKGE+q # AAEAAAISMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMB4XDTI1MDgxNDE4NDgxNVoXDTI2MTExMzE4NDgxNVowgdMxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJ # cmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1Mg # RVNOOjJEMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt # cCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAr0zToDkp # WQtsZekS0cV0quDdKSTGkovvBaZH0OAIEi0O3CcO77JiX8c4Epq9uibHVZZ1W/Lo # ufE172vkRXO+QYNtWWorECJ2AcZQ10bpAltkhZNiXlVJ8L3QzhKgrXrmMkm2J+/g # 81U23JPcO4wXHEftonT3wpd//936rjmwxMm7NkbsygbJf+4AVBMNr4aMPQhBd76o # d0KMB6WrvyEGOOU0893OFufS5EDey4n44WgaxJE0Vnv3/OOvuOw5Kp1KPqjjYJ+L # 9ywLuBMtcDfLpNQO/h1eFEoMrbiEM67TOfNlXfxbDz4MlsYvLioxgd2Xzey1QxrV # 1+i+JyVDJMiSe9gKOuzpiQQFE19DUPgsidyjLTzXEhSVLBlRor0eCVf7gC6Rfk8N # Y3rO2sggOL79vU5FuDKTh/sIOtcUHeHC42jBGB+tfdKC1KOBR+UlN9aOzg8mpUNI # 2FgqQvirVP9ppbeMUfvp2wA9voyTiRWvDgzCxo8xlJ1nscYTHIQrmkF9j/Ca0IDm # t8fvOn64nnlJOGUYZYHMC1l0xtgkYTE1ESUqqkawKk7iqbxdnLyycS+dR+zaxPud # MDLrQFz8lgfy9obk0D8HC2dzhWpYNn5hdkoPEzgCqQUOp8v3Qj/sd4anyupe5KoC # kjABOP3yhSQ4W9Z+DrJnhM/rbsXC7oTv26cCAwEAAaOCAUkwggFFMB0GA1UdDgQW # BBRSBblSxb5cYKYOwvd/VfoXOfu33jAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJl # pxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx # MCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3Rh # bXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEA # XnSAkmX79Rc7lxS1wOozXJ7V0ou5DntVcOJplIkDjvEN8BIQph4U+gSOLZuVReP/ # z9YdUiUkcPwL1PM245/kEX1EegpxNc8HDA6hKCHg0ALNEcuxnGOlgKLokXfUer1D # 5hiW8PABM9R+neiteTgPaaRlJFvGTYvotc0uqGiES5hMQhL8RNFhpS9RcIWHtnQG # EnrdOUvCAhs4FeViawcmLTKv+1870c/MeTHi0QDdeR+7/Wg4qhkJ2k1iEHJdmYf8 # rIV0NRBZcdRTTdHee35SXP5neNCfAkjDIuZycRud6jzPLCNLiNYzGXBswzJygj4E # eSORT7wMvaFuKeRAXoXC3wwYvgIsI1zn3DGY625Y+yZSi8UNSNHuri36Zv9a+Q4v # JwDpYK36S0TB2pf7xLiiH32nk7YK73Rg98W6fZ2INuzYzZ7Ghgvfffkj4EUXg1E0 # EffY1pEqkbpDTP7h/DBqtzoPXsyw2MUh+7yvWcq2BGZSuca6CY6X4ioMuc5PWpsm # vOOli7ARNA7Ab8kKdCc2gNDLacglsweZEc9/VQB6hls/b6Kk32nkwuHExKlaeoSV # rKB5U9xlp1+c8J/7GJj4Rw7AiQ8tcp+WmfyD8KxX2QlKbDi4SUjnglv4617R8+a/ # cDWJyaMt8279Wn7f2yMedN7kfGIQ5SZj66RdhdlZOq8wggdxMIIFWaADAgECAhMz # AAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJV # UzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9v # dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0z # MDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u # MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjAN # BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP9 # 7pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMM # tY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gm # U3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl3GoPz130 # /o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP # 3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7 # vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+A # utuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz # 1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6 # EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/Zc # UlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZy # acaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJ # KwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVd # AF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8G # CCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3Mv # UmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQC # BAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYD # VR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZF # aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9v # Q2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcw # AoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJB # dXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cB # MSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7 # bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/ # SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2 # EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2Fz # Lixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0 # /fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9 # swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJ # Xk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+ # pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW # 4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N # 7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDWTCCAkECAQEwggEBoYHZpIHWMIHTMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGll # bGQgVFNTIEVTTjoyRDFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUA5VHBr4h00EN7jUdQ33SE # +qbk/8CggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkq # hkiG9w0BAQsFAAIFAO4hWpQwIhgPMjAyNjA4MDgwNzM0NDRaGA8yMDI2MDgwOTA3 # MzQ0NFowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA7iFalAIBADAKAgEAAgIGLwIB # /zAHAgEAAgISQDAKAgUA7iKsFAIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEE # AYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IB # AQBRrb9UbSS0JIPaMpdYLsXVbK1P/KG3uR1+k5Qzz8rEt4wi715wXYWWQLSDrdxD # iRd27hzJck7DT4a/HLZ5nu9OQwKf4nIzHQe2t/lOaomytfQ2qa2U5o0cYd+zjhHB # 1GviMBA2oBSz2gzYixTksPK2XIIqquN7BN37KyMfjgId4x0iDx9FzQWoR3y0xgRt # TfLOaj+ZGeJyJeypVlz3JAwpf46sqyhbznKxOsQNz+sYySgAFdeaTgWv/TbwCMZB # 3jHOgcw2WBnUz3lXqwm03uJFhce6akeDqrMJyZXnhP7YzXMkv8V4XoN780Y8DsIo # hY/eHdACEkR7a82WXbpErF8pMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMx # EzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUt # U3RhbXAgUENBIDIwMTACEzMAAAIS0QgGPMoYT6oAAQAAAhIwDQYJYIZIAWUDBAIB # BQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQx # IgQgb62b/hAVmwQH0x9WBZTyaPqks2kXPdjBQotUHGyFfxcwgfoGCyqGSIb3DQEJ # EAIvMYHqMIHnMIHkMIG9BCBz+X5GvO7WngknH4BZeYU+BzBL1Jy5oJ8wVlTNIxfY # gzCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAw # DgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24x # JjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACEtEI # BjzKGE+qAAEAAAISMCIEINuHf7S/1aLgkhLjCEId9iymkKt879g86/yO0eE0lkit # MA0GCSqGSIb3DQEBCwUABIICAGFeP5+/gxnFNWOUAREz2jDTv0YRaCU+LX7nII5Z # yWh2yzP4kfLAfj1H2fWI5DVaUmZ+Pe8tFdWpe2JOlK50K8tZu3Igf+gSAgzyD6AW # 2ZIEvTAUo5lCNWEk1/J95s9Za0A91Q3/e2OnvLa8Ies3W85l8cpAioRGooJZHp4n # 1RCgPGWCLNrPbBqLfrrXeFvgxgqKVa6UtUiKrR9Eu2UKNwnymJt0/axaXnfGKIzt # NxnKDMCaCUHb6e0ffhpz+QNNjuFCbXWpJ2ZAjiruHh0FJFTPqPon8ObLJpd8Lsfd # RhNedficBOe4tFx703cUAFkbHSGmZSdemykWFOG75fY1AW5JgIOO4ghaSIdo3CbY # wdBaHDce2R/uyq0Zx2Uuz7i8U9yOpnVWmDTAcH2lRKhENWNdKJzzIebQERMCItLZ # Tjz4f1tlrdzX9EZ8Fg0SpmnWQ/F5ozG6OVt3pw+J/nqmQowwzuKM+SKcfksB+XhE # oMDf6AS57ncVsihCZmCMHdqV9h2UgN7deshQn/4Fssmqp1wqzdohreD0w+Dg4poy # n6PlGv/akrWywMZoCBL4pq6X3OJC4XqhMGQHb4owqptHVWiXe64w5UTbzV5W2/E2 # 0nDsWjjqPH/XjLPocoOwo7LRlMCYJELUTLzzdmUGjoSb8oDC95M/OdA1XviFCEN0 # /oKW # SIG # End signature block