#Be function PesterBe($value, $expected) { return ($expected -eq $value) } function PesterBeFailureMessage($value, $expected) { if (-not (($expected -is [string]) -and ($value -is [string]))) { return "Expected: {$expected}`nBut was: {$value}" } <#joining the output strings to a single string here, otherwise I get Cannot find an overload for "Exception" and the argument count: "4". at line: 63 in C:\Users\nohwnd\github\pester\Functions\Assertions\Should.ps1 This is a quickwin solution, doing the join in the Should directly might be better way of doing this. But I don't want to mix two problems. #> ( Get-CompareStringMessage -Expected $expected -Actual $value ) -join "`n" } function NotPesterBeFailureMessage($value, $expected) { return "Expected: value was {$value}, but should not have been the same" } #BeExactly function PesterBeExactly($value, $expected) { return ($expected -ceq $value) } function PesterBeExactlyFailureMessage($value, $expected) { if (-not (($expected -is [string]) -and ($value -is [string]))) { return "Expected exactly: {$expected}`nBut was: {$value}" } <#joining the output strings to a single string here, otherwise I get Cannot find an overload for "Exception" and the argument count: "4". at line: 63 in C:\Users\nohwnd\github\pester\Functions\Assertions\Should.ps1 This is a quickwin solution, doing the join in the Should directly might be better way of doing this. But I don't want to mix two problems. #> ( Get-CompareStringMessage -Expected $expected -Actual $value -CaseSensitive ) -join "`n" } function NotPesterBeExactlyFailureMessage($value, $expected) { return "Expected: value was {$value}, but should not have been exactly the same" } #common functions function Get-CompareStringMessage { param( [Parameter(Mandatory=$true)] [AllowEmptyString()] [String]$Expected, [Parameter(Mandatory=$true)] [AllowEmptyString()] [String]$Actual, [switch]$CaseSensitive ) $expectedLength = $expected.Length $actualLength = $actual.Length $maxLength = $expectedLength,$actualLength | & $SafeCommands['Sort-Object'] -Descending | & $SafeCommands['Select-Object'] -First 1 $differenceIndex = $null for ($i = 0; $i -lt $maxLength -and ($null -eq $differenceIndex); ++$i){ $differenceIndex = if ($CaseSensitive -and ($expected[$i] -cne $actual[$i])) { $i } elseif ($expected[$i] -ne $actual[$i]) { $i } } [string]$output = $null if ($null -ne $differenceIndex) { if ($expected.Length -ne $actual.Length) { "Expected string length $expectedLength but was $actualLength. Strings differ at index $differenceIndex." } else { "String lengths are both $expectedLength. Strings differ at index $differenceIndex." } "Expected: {{{0}}}" -f ( $expected | Expand-SpecialCharacters ) "But was: {{{0}}}" -f ( $actual | Expand-SpecialCharacters ) $specialCharacterOffset = $null if ($differenceIndex -ne 0) { #count all the special characters before the difference $specialCharacterOffset = ($actual[0..($differenceIndex-1)] | & $SafeCommands['Where-Object'] {"`n","`r","`t","`b","`0" -contains $_} | & $SafeCommands['Measure-Object'] | & $SafeCommands['Select-Object'] -ExpandProperty Count) } '-'*($differenceIndex+$specialCharacterOffset+11)+'^' } } function Expand-SpecialCharacters { param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)] [AllowEmptyString()] [string[]]$InputObject) process { $InputObject -replace "`n","\n" -replace "`r","\r" -replace "`t","\t" -replace "`0", "\0" -replace "`b","\b" } } # SIG # Begin signature block # MIInjAYJKoZIhvcNAQcCoIInfTCCJ3kCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDGTPpFnM9UACmG # LTABB5DPnkbYtfFj5/7m5G0ol4ZteqCCC8MwggXaMIIEwqADAgECAhMzAAABP8rF # 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 # 8f7BcdpMoEFagt3xHzGCGx8wghsbAgEBMIGmMIGOMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTgwNgYDVQQDEy9NaWNyb3NvZnQgV2luZG93cyBU # aGlyZCBQYXJ0eSBDb21wb25lbnQgQ0EgMjAxMgITMwAAAT/KxSgZC4k1WAAAAAAB # PzANBglghkgBZQMEAgEFAKCCARgwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINpt # WDLv/sOZHpEqpSxCMzc3kNcmD52SoyUfHnK1UCVZMFAGCisGAQQBgjcKAxwxQgxA # NTM4NEYwOTczNjdERkU2NDRCMkI5RDRDNTFCRjRDM0I2NUU4NDc0Mjk3QTNFOUM4 # MkQ5RjNCMjZGN0Y3QzZDNjBaBgorBgEEAYI3AgEMMUwwSqAkgCIATQBpAGMAcgBv # AHMAbwBmAHQAIABXAGkAbgBkAG8AdwBzoSKAIGh0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS93aW5kb3dzMA0GCSqGSIb3DQEBAQUABIIBgC+f0v0YDevKTkk5QP/++8iz # ntsUkDe2GyymqmDX8nrgMue3lOzg+t5eM8StdP9imuoWa7A5+fLMUg2RDgjrRc0n # uAJonG1glBUwEedLOSiprSEcY6HwaCCg9ojfnChPUK6RtLJaNU6dpRRdfPDF02Xl # vZesP+P5u2Jcwy3Bu86L2jbaN3IBHI5h5rD7Q8ed1Z3/Md5194w/fuaYhUb02gVT # P7lJx67hNFgTWcENy42cG+lbFnedVjvnh9o1QK10uYjntorwYj+V65Q8O1x+CABV # 0j4igVNp3P4FavmK3JJM+bBV6jCmY71ZgyNUONUrPeE7hC9aAi4k/bDNO57c3oTE # 154LDOsdydMzjgiQWojOXW38WUSgrMUZd1JXJSR+2Bid87hB0Ko5AaeiAVbB16Eg # 1XGVI8Q6aK2vQSyNWlqSlTFfCbALzXglfr8iMZ5R6a2v2RRGxno8fHh8pZr6v0XG # jD7e697KWhx4tLPCduCQAHzt5nPy8s1qCQMBI5wFU6GCF60wghepBgorBgEEAYI3 # AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheCAgEDMQ8wDQYJYIZIAWUDBAIB # BQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGEWQoDATAx # MA0GCWCGSAFlAwQCAQUABCAq0n+a3jKuunCWJTVA2xdUSEwrgQ5A7YxMIcnGJ16m # agIGaon+lzreGBMyMDI2MDkwNTE0NDUxMC45OTRaMASAAgH0oIHZpIHWMIHTMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGll # bGQgVFNTIEVTTjo2RjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgECAhMzAAACHAlVFdfDWQfR # AAEAAAIcMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAy # MDEwMB4XDTI1MDgxNDE4NDgzMVoXDTI2MTExMzE4NDgzMVowgdMxCzAJBgNVBAYT # AlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jvc29mdCBJ # cmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVsZCBUU1Mg # RVNOOjZGMUEtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFt # cCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAow0xEAUa # FIyyLIXeFzeI8IKyBON2u0Dr02ISE5p9G5CUXfnFu2S0E1gWCMvDWpopX6lRxjmg # nqaL3BtnWlBVTo8xUNRZu23ie4YBMAJB7Ut6mnqnHVwvDJxGO4TD3SnrCd+yg35B # 9QFejq3o4+OByvXjynaypZyukcQaLsKQvoxE8ElHH7zcOXEJWmU3rnXzaW/S4SH3 # OPhoUbTTcy6nUgKx5pRWiQ24UEPLYzcxGJjqjkz+GiCWGPFHDMdW86laWvmCslou # QPsN2eBk8dxJcEZmW4l6p4TthoXcfexEA9YdYaMz10aMhZNpdsNaDtDQUMDEC3k1 # D1My69MXSPlUmD9xFyDlkXiVa7BCEp3XcVtqTgzHGwr28JD6oE7zEPYeuZOiuCBX # TZSo/wk3tbDlsESbIPV6inYqrzxiMYqlxfCdzC3Cimh9/NT/Lk9/aU+Iyyc9b3Oa # T0dZ8wgLaVDCGELRMrqyImdFHv0MudctzW/kPsV3Ja9ufpKWujEiN3CW//X8hFa9 # j5ImNeQzcMit3MoSaoGwnbiZJX1IyibIphlqccXFk4oTTSOQBsAUw8U0gwOnM5UJ # D8mBUBd65Np6NBkx2cviJ4I34GyXFCWyy5Ft1QsBYyVfAG3KOhCfPHQf8lQzJvLr # 57YW0bD/xVs4Ag4gTS6KZNyFEfX9jFdRlr0CAwEAAaOCAUkwggFFMB0GA1UdDgQW # BBRa3mOCzB8u7zpvDh8MGKVYLCk7ZDAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJl # pxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5j # b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAx # MCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3Rh # bXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQM # MAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEA # klb6w/deaid3BujQCtWFBe0n9pkyRy+yyWEg70iDwoJ5u0e0O+4GerNzdZb1zTPs # HJ8EGMyo1K7ytL21+pmdFMTl19PC8OJ5Y2p+XKUQy2dD+hggRMmJgDQsgbOCxHYe # O+jg4t+vg61wUrovzzLkH3z0PJXXvoNuBj9Lda9CiNMd60451Kube99ArSf6ZMj3 # t0p4rFbgSazDs+8TJ+8KA5GVaYjPHj9rlMuI3WjohEc9apnQ6hMjMck3jlHZIwlu # VYeUQE0qjmApfMtTAEzbMUdY8sLTunL1GkbDSeKn9O7llBGnNtyM1uM9Mdv1VyWh # 0z/IriQKIjntqqGyoF0HvDHOFZCyUDBPLflyiu7Y1zQ/sPounsb96aBfQdq3h3LO # n6t+m9EnNz/G6MzzWvpJk6YgTHTIqeQN/F/XpiPvbfek3nq/PYbL3au+kBfRUHiC # FXSvt6lor0HC626vUmz9ZNPOxwEWLuccomxsy3JwWH79vsM/7ARqoG5h6d6Nahfa # OuRP4XI9xtdH3Pa/NCLyQjxKXyLxzwQzjddkX2EpTJnlypuhPmEdea59Uz2E303L # xyXSnKBvGsAnyWYAfnejr3YAiL9YrN2l2dn198RpA4DCm9QtZYiwC0q2fuUvui34 # PfPIUZByf7wHuuWu50hY9WLx1kOMI8xyo7AI6TaNrnIwggdxMIIFWaADAgECAhMz # 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 # 7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEwggEBoYHZpIHWMIHTMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGll # bGQgVFNTIEVTTjo2RjFBLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRp # bWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAWmTiA01u5mxq/nVxiRJL # MOskVGeggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv # bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0 # aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDANBgkq # hkiG9w0BAQsFAAIFAO5GR88wIhgPMjAyNjA5MDUwNzQ4MzFaGA8yMDI2MDkwNjA3 # NDgzMVowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA7kZHzwIBADAHAgEAAgIB0jAH # AgEAAgIXqzAKAgUA7keZTwIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgorBgEEAYRZ # CgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUAA4IBAQCK # 2zi0grUMGFl16CDrSse+TJpxTKDaoGXG6caQ/Bp3UDMdwTc1WY48cehX4zpTGjnC # G9XmCeYEdhZvL9pqqQs09hnYxrWkr1y96/J4/GfZvYJEzPfVN9AhseW/Vnn9m7xh # 03SiUD1RT2y6S90O0JcpN5NjnYWLO4bULSa/y3UfRcsNnjlGSp6L3zCRsusptG0U # Ap8WqPRd60z5foOcHJS/ZcAkPMHVlmyg+hmfVRIH/9l1FS9tMxnvmmEMTwV0CyUA # wgJXwCRolj4oSkSUEbtOt4f5OAej3xD5MRiTxvgoYD5nIr0Numujw9Ao6UPYxvYM # fcTatJjRH8Xtiu8jFhRHMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgUENBIDIwMTACEzMAAAIcCVUV18NZB9EAAQAAAhwwDQYJYIZIAWUDBAIBBQCg # ggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0BCQQxIgQg # +SQYJBqI2ypro6w8tzWPaTQiSNEE0+V8had6uJVLnOYwgfoGCyqGSIb3DQEJEAIv # MYHqMIHnMIHkMIG9BCCgIGkmNhdo7+KE7dWhI+E2Ctx2RLWoYvvJodCIciHHaDCB # mDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk # BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAACHAlVFdfD # WQfRAAEAAAIcMCIEICDR1A4vr2+D/HCR6yjPPp74lmyNfgaGLErHTPnWLTXaMA0G # CSqGSIb3DQEBCwUABIICAABhy0mCJvO2iszQEOPDf4b1SVV2LywGrki5mryn4QEH # hODc3aGvfN07Ww5NFeWkxOpeN4aUG7pUhqZhtVUjr+2i1qcaYisnEiq9HVMluAzu # ZAYTO/by8+r6XGSS2c2ELy/WtVAvp6ta9sGlgnvFbtP5Eotax0xiP735+39y3/zk # m3Fa0cZ8aSLGPQvsZ0wHEjKOaFkkkO4lyJW0cB6/7vgsjEmvKAqF6y6pNcKNRuI4 # xLvyEYuUQTSApsXIG0D4PvLhXV1h8W0D4+vxRTLoDV7Ak/CooXdAMcnr2Q5avndx # gegcZwABsyP8OLAO/vBMRAs9U/+0LsGy3EAV6PkBvEF2lRSM5AdJ5Mbe8SuubYpd # 3K1nI309pJKVLWgp7Xl7HjonqKs3wkkw2oqpzXI52AeLl/69zB/TxuzPYv5+DVwJ # NQLML8XfqwNEZ7masmHIAjhKt9j4//jvbV1oB/pAyoknMlTeVuLJyHRnY8+QM6Rc # uykf3RbD4yP6HT2C3JB0lzI7sXvnrxbNdBRVjnmwVpX/quPNyS6VT1O2dwQojyn1 # /xlOTzsIe+zS5sSM1/tzrsfCXjZVCemePfuwCPrB03QCmLSg1ZOe2M4TT4MvU9GD # D9em2I6c/etJAJCMz855CwmOKluB9xx3bVgp5kWn1BGeQlGTDbRTMnrSzjrBtuDw # SIG # End signature block