Private/Tests/New-AvmBicepTestParameterFile.ps1
|
function New-AvmBicepTestParameterFile { [CmdletBinding(SupportsShouldProcess)] [OutputType([string])] param( [Parameter(Mandatory)] [string] $Root, [Parameter(Mandatory)] [string] $DestinationPath, [Parameter(Mandatory)] [System.Collections.Generic.Dictionary[string, string]] $Tokens, [string] $ParameterFile, [System.Collections.IDictionary] $Parameters = @{}, [switch] $DeferResourceLocation, [switch] $DeferTokens ) Set-StrictMode -Version 3.0 $ErrorActionPreference = 'Stop' if (-not [string]::IsNullOrWhiteSpace($ParameterFile) -and $Parameters.psbase.Count -gt 0) { throw [AvmConfigurationException]::new('Use either -ParameterFile or -Parameters, not both.') } if ([string]::IsNullOrWhiteSpace($ParameterFile) -and $Parameters.psbase.Count -eq 0) { return $null } if (-not [string]::IsNullOrWhiteSpace($ParameterFile)) { $path = if ([System.IO.Path]::IsPathRooted($ParameterFile)) { $ParameterFile } else { Join-Path $Root $ParameterFile } if ([System.IO.Path]::GetExtension($path) -cne '.json' -or -not (Test-Path -LiteralPath $path -PathType Leaf)) { throw [AvmConfigurationException]::new( "Bicep test parameter file must be an existing JSON file: $path") } $content = [System.IO.File]::ReadAllText($path, [System.Text.UTF8Encoding]::new($false, $true)) } else { $parameterValues = [ordered]@{} foreach ($name in $Parameters.psbase.Keys) { if ($name -isnot [string] -or [string]::IsNullOrWhiteSpace($name)) { throw [AvmConfigurationException]::new('Bicep test parameter names must be nonempty strings.') } if ($Parameters[$name] -is [System.Security.SecureString]) { throw [AvmConfigurationException]::new( "Bicep test parameter '$name' cannot be a SecureString in a plaintext ARM parameter file.") } $parameterValues[$name] = @{ value = $Parameters[$name] } } $content = [ordered]@{ '$schema' = 'https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#' contentVersion = '1.0.0.0' parameters = $parameterValues } | ConvertTo-Json -Depth 80 -Compress -ErrorAction Stop $path = '<PowerShell parameters>' } if (-not $DeferTokens) { $content = Resolve-AvmBicepTestToken -Content $content -SourcePath $path ` -Tokens $Tokens -DeferResourceLocation:$DeferResourceLocation } try { $parsed = ConvertFrom-AvmStrictJson -Json $content } catch [System.ArgumentException] { throw [AvmConfigurationException]::new("Bicep test parameter file must contain a valid JSON ARM parameters object: $path") } if ($parsed -isnot [System.Collections.IDictionary] -or $parsed['parameters'] -isnot [System.Collections.IDictionary]) { throw [AvmConfigurationException]::new( "Bicep test parameter file must contain an ARM parameters object: $path") } foreach ($name in $parsed['parameters'].psbase.Keys) { $parameter = $parsed['parameters'][$name] if ($parameter -isnot [System.Collections.IDictionary] -or (-not $parameter.Contains('value') -and -not $parameter.Contains('reference'))) { throw [AvmConfigurationException]::new( "Bicep test parameter '$name' must specify value or reference: $path") } } if (-not $PSCmdlet.ShouldProcess($DestinationPath, 'Write temporary ARM test parameters')) { throw [AvmConfigurationException]::new( "Temporary ARM test parameter creation was declined: $DestinationPath") } [System.IO.File]::WriteAllText($DestinationPath, $content, [System.Text.UTF8Encoding]::new($false)) return $DestinationPath } # SIG # Begin signature block # MIInJwYJKoZIhvcNAQcCoIInGDCCJxQCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDbW6gAIbVyhXk4 # T8NMBqkRj4rlvKtAyOgTNFqmVfNA6KCCDLowggX1MIID3aADAgECAhMzAAACHU0Z # yE7XD1dIAAAAAAIdMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBD # b2RlIFNpZ25pbmcgUENBIDIwMjQwHhcNMjYwNDE2MTg1OTQzWhcNMjcwNDE1MTg1 # OTQzWjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYD # VQQDExVNaWNyb3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDQvewXxx9gZZFC6Ys1WBay8BJ8kGA4JQnH5CMafqOASlTpK9H8 # o5ZXTXt0caVQTNMUPt445wXYD+dFtaKWTwDn1I52oUSrC9vJin1Gsqt+zyKJL5Dg # 3eQXbQNR61DmMy20GLTIO3SFed9Rfi/ophgCLGFLDR3r0KvHjwMb/jYWS0celV/4 # Lz27LfAekm8v9E5IXaeiXbAUYZKK090n4CVl3JBtbN+9DtI9SNu/yjvozW52/u7R # X/Ttpa/KDlpuokZ+Zcbvmtd9ur9gFLvZzh41o9MsE/clQtdaFWGvuo6Jua/ntpgk # ey3E5/vBFe+MJPG6phdnuo6r57ZudCudiI1bAgMBAAGjggGbMIIBlzAOBgNVHQ8B # Af8EBAMCB4AwHwYDVR0lBBgwFgYKKwYBBAGCN0wIAQYIKwYBBQUHAwMwHQYDVR0O # BBYEFH6QuMwqcPG0hQlQ6c5jCtTTLrVeMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQL # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzMDAxMis1MDc1NTkw # HwYDVR0jBBgwFoAUf1k/VCHarU/vBeXmo9ctBpQSCDEwYAYDVR0fBFkwVzBVoFOg # UYZPaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0 # JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNybDBtBggrBgEFBQcBAQRh # MF8wXQYIKwYBBQUHMAKGUWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # Y2VydHMvTWljcm9zb2Z0JTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAyMDI0LmNy # dDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQBKTbYOjzwTG/DXGaz9 # s6+fQeaTtDcFmMY+5UyVFCyj7Pv+5i37qfX8lSL/tBIfYQfWsMuBQlfZurJD6r4H # VJ2CeH+1fgiq8dcHdVKoZ3Sa2qXoX3cq9iS8cVb06B7+5/XJ7I0OxHH9fDsvJ3T3 # w5V/ZtAIFmLrl+P0CtG+92uzRsn0nTbdFjOkLMLWPLAU3THohKRlSEMgFJpPkm5n # 5UAZ35xX6FWCrDLsSKb555bTifwa8mJBwdlof0bmfYidH+dxZ1FdDxvLnNl9zeKs # A4kejaaIqqIPguhwAti5Ql7BlTNoJNwxCvBmqW2MQLnCkYN/VVUsR3V2x/rcTNzo # Bf/Z/SpROvdaA2ZOOd1uioXJt3tdLQ7vHpqpib0KfWr/FWXW10q38VxfCnRQBqzb # SuztR7nEMuzX7Ck+B/XaPDXd1qh72+QYyB0Z2VzWmO9zsnb9Uq/dwu8LGeQqnyu6 # 7SDGACvnXii2fb9+US492VTnXSnFKyqwgzUyFMtZK1/sHYTv6bG4TtQUygQxTN+Z # V+aJIlKO2MqZ7bKrAnOzS9m6NgoTdWOq11bTOZwKlIEV/EhV9SWkDmdpR/hPPT2v # 6TEj4F8PT/zHjRezIU5c/DGlt/VhY/pK0XkJtEyMmmS1BMtjU/rqBZVMIm3dnxQs # /TBByr+Cf8Z1r7aifQVQ+WSqzjCCBr0wggSloAMCAQICEzMAAAA5O7Y3Gb8GHWcA # AAAAADkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX # YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg # Q29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBSb290IENlcnRpZmljYXRl # IEF1dGhvcml0eSAyMDExMB4XDTI0MDgwODIwNTQxOFoXDTM2MDMyMjIyMTMwNFow # VzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEo # MCYGA1UEAxMfTWljcm9zb2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAyNDCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBANgBnB7jOMeqlRYHNa265v4IY9fH8TKh # emHfPINe1gpLaV3dhg324WwH06LcHbpnsBukCDNitryo0dtS/EW6I/yEL/bLSY8h # KpbfQuWusBPr9qazYcDxCW/qnjb5JsI1s8bNOg3bVATvQVL4tcf03aTycsz8QeCd # M0l/yHRObJ9QqazM1r6VPEOJ7LL+uEEb73w6QCuhs89a1uv1zerOYMnsneRRwCbp # yW11IcggU0cRKDDq1pjVJzIbIF6+oiXXbReOsgeI8zu1FyQfK0fVkaya8SmVHQ/t # Of23mZ4W9k0Ri22QW9p3UgSC5OUDktKxxcCmGL6tXLfOGSWHIIV4YrTJTT6PNty5 # REojHJuZHArkF9VnHTERWoTjAzfI3kP+5b4alUdhgAZ7ttOu1bVnXfHaqPYl2rPs # 20ji03LOVWsh/radgE17es5hL+t6lV0eVHrVhsssROWJuz2MXMCt7iw7lFPG9LXK # Gjsmonn2gotGdHIuEg5JnJMJVmixd5LRlkmgYRZKzhxSCwyoGIq0PhaA7Y+VPct5 # pCHkijcIIDm0nlkK+0KyepolcqGm0T/GYQRMhHJlGOOmVQop36wUVUYklUy++vDW # eEgEo4s7hxN6mIbf2MSIQ/iIfMZgJxC69oukMUXCrOC3SkE/xIkgpfl22MM1itkZ # 35nNXkMolU1lAgMBAAGjggFOMIIBSjAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGC # NxUBBAMCAQAwHQYDVR0OBBYEFH9ZP1Qh2q1P7wXl5qPXLQaUEggxMBkGCSsGAQQB # gjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU # ci06AjGQQ7kUBU7h6qfHMdEjiTQwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2Ny # bC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0MjAx # MV8yMDExXzAzXzIyLmNybDBeBggrBgEFBQcBAQRSMFAwTgYIKwYBBQUHMAKGQmh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0MjAx # MV8yMDExXzAzXzIyLmNydDANBgkqhkiG9w0BAQwFAAOCAgEAFJQfOChP7onn6fLI # MKrSlN1WYKwDFgAddymOUO3FrM8d7B/W/iQ6DxXsDn7D5W4wMwYeLystcEqfkjz4 # NURRgazyMu5yRzQh4LqjA4tStTcJh1opExo7nn5PuPBYnbu0+THSuVHTe0VTTPVh # ily/piFrDo3axQ9P4C+Ol5yet+2gTfekICS5xS+cYfSIvgn0JksVBVMYVI5QFu/q # hnLhsEFEUzG8fvv0hjgkO+lkpV9ty6GkN4vdnd7ya6Q6aR9y34aiM1qmxaxBi6OU # nyNl6fkuun/diTFnYDLTppOkr/mg5WSfCiDVMNCxtj4wPKC5OmHm1DQIt/MNokbb # H3UGsFP1QbzsLocuSqLCvH09Io3fDPTmscR9Y75G4qX7RTX8AdBPo0I6OEojf39z # uFZt0qOHm65YWQE69cZM2ueE1MB05dNNgHK9gTE7zKvK/fg8B2qjW88MT/WF5V5u # vZGtqa9FSL2RazArA+rDPuf6JGYz4HpgMZHB4S6szWSKYBv0VisCzfxgeU+dquXW # 9bd0auYlOB58DPcOYKdc3Se94g+xL4pcEhbB54JOgAkwYTu/9dLeH2pDqeJZAABV # DWRQCaXfO5LgyKwKCLYXpigrZYCjUSBcr+Ve8PFWMhVTQl0v4q8J/AUmQN5W4n10 # 1cY2L4A7GTQG1h32HHAvfQESWP0xghnDMIIZvwIBATBuMFcxCzAJBgNVBAYTAlVT # MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jv # c29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMjQCEzMAAAIdTRnITtcPV0gAAAAAAh0w # DQYJYIZIAWUDBAIBBQCggZAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJ # KoZIhvcNAQkEMSIEIIe+PElvlASb/Ck07xCju7gu+WFiO02IOlm/AZ5AkyOJMEIG # CisGAQQBgjcCAQwxNDAyoBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20wDQYJKoZIhvcNAQEBBQAEggEAalCCFnINlpTwH6SV # aSCTyaXT6e/+lnzEIlLIpeas7MoF15MqkhrVNgySSszEaeVqZkXhCcfZHf+0ySim # NyyXHUBhyLGrMK1xlJFLytNAWwZOx6JOnoJPlcm8q+qre9pvPzEcKi7Rdf1S72uz # RuGaC/h46vupRAGc0an5WwJmxpiyflPDTi5ELmKSqAdJlPJxLaeNDgQS5XUoupLD # QkgFFSb1KiouV76kfHPrBJLsjLkjhnhsIgFC2N9KYeeIBmK+PpljvGQvojlAB5AT # tdcOKi4tMc3t/PiaMz8PRdKTCqZMT3zvsOwGBQLs+MzKdZILSq5t+RBulDIPhL37 # XNOzO6GCF5MwghePBgorBgEEAYI3AwMBMYIXfzCCF3sGCSqGSIb3DQEHAqCCF2ww # ghdoAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFRBgsqhkiG9w0BCRABBKCCAUAEggE8 # MIIBOAIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCAnwgFR4tTX3Yvt # 8XyM6DGzJFmeWbe85FH3KX/mIHyT4QIGatesWlnbGBIyMDI2MTAyNzE0NTIxMi4w # MlowBIACAfSggdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAl # BgNVBAsTHm5TaGllbGQgVFNTIEVTTjpBMDAwLTA1RTAtRDk0NzElMCMGA1UEAxMc # TWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEeowggcgMIIFCKADAgECAhMz # AAACK7sAUP9NO5qhAAEAAAIrMA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVT # MRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1l # LVN0YW1wIFBDQSAyMDEwMB4XDTI2MDIxOTE5NDAxMVoXDTI3MDUxNzE5NDAxMVow # gcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsT # HE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNVBAsTHm5TaGllbGQg # VFNTIEVTTjpBMDAwLTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUt # U3RhbXAgU2VydmljZTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJfe # aLo4PezJSpCbhCqCSso9tywr9DHd9hy0vz5UzW45jduiiLkbHBq5OBB/okUchNOj # FLuCOoqUrw4UvMvpROXSPEQrm3oO45yAld2+62KahOU5LQLeTIhNcEBeiP+CnqFF # H3PpZGKnUq2SKVvd0lcKNCpP0/YK66Ov5XPyv5n6MOXT2OL+Jz/gbfiveZXCOz/8 # afH0+7fVXytcWJw2IDPGm5trClt3ymp/OVZPa+cbeQX2XoyJERu8ndcctTAdCyHS # 39OtIXH+z/IKqklZgnqgKUbvS2+wUfRpE/zAHhw/8IVrYgu+TbqLc5wkGX6moqMd # NIHL2a/BM8QOWfNyjQ23xHqlI9NdmAGyxweGgp8LRZCY7NjaR5dsCZFNxkzJfPm/ # 8AluagjTLTsFrO+3k2Rd10b1MStBbC2wXIgqsSUOBZ8d4KhO7XC7ZyIPd0rvbPdx # raDOgQPFPaP0FchQpqJPNN1A9GwAxo7d1TTNobAwyXC1InIOHXhgSBmhS7m9Lwy6 # Ayp2s2OmHIvrnIqGOkBZuFiQgc7/S5mO73m0/zNk2pchGHi119Yck8BOf2v5zGTK # 6HbHRUt1/HWWYr1fc2MfQ22ACzkkH/A6WTK653GYVN9ZXJGsvfuKyk5nxo8AWC/J # Hpw1OQamQWjfklGNyI2ZmJTipP1S3L5XmC50WTWPAgMBAAGjggFJMIIBRTAdBgNV # HQ4EFgQUPhaO5BNQlu1t3eOa9mS7QVnZ5TYwHwYDVR0jBBgwFoAUn6cVXQBeYl2D # 9OXSZacbUzUZ6XIwXwYDVR0fBFgwVjBUoFKgUIZOaHR0cDovL3d3dy5taWNyb3Nv # ZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwVGltZS1TdGFtcCUyMFBDQSUy # MDIwMTAoMSkuY3JsMGwGCCsGAQUFBwEBBGAwXjBcBggrBgEFBQcwAoZQaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBUaW1l # LVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUB # Af8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4AwDQYJKoZIhvcNAQELBQAD # ggIBAM78IqxyIQzySvV+ofhOV9ProQ2hOPFfDzXSnISrQ92uAvB+BPfH7WDPsJAe # 1R16+oxDmofIMuGbqlP3XUJiQY37qD4xTt8xhOvp3dLGJ4nAEihaR9HiDtKK0bMw # pTjrkoRh6N912hSCi8L/FxGloAs7mnf8DbjwHKEmIy20FA0O2xP8doIXBEUJRFvL # 9/xzWSTLwXzGQJcXP78y1nl3WVYWPA4jaB5kdar1eKEM6B57mdLaSijlXqfxcbbb # RRN69V/6mCakgfvVcoNUhhMYZkmzrI+V8nZperDUwTg1HqiQ2xjc/UzfUfoMxhF8 # kY0E16nn3mRcaHdjMDdwKLKD6OYnnyH99O+OeAim5QV84OkOMXHSJzVigsA3GEIX # dGFL2pgzsrjQ0SEqyFi5oCQgbZcEpiKDev/T9vSyO+MHCznkBiicybcDypxf/qT1 # V9zSa/122ice5YZ8DZv6oTaqkKeHMZt0MeruI5JkTDTWc26kAx/VzjWT0ihNDbPe # LDrDhlmgs7KDhMoxunWSulPi2uKn/LfQK/mSHKoIM2ppdCkGQ5g43wuC2hDdqZU5 # fuLHmN2ufH+9TFNRKKBe+tZ0vtSTySmZLTO2jZOjLtpPmgHMJO9+P2In8E38TW+E # UGSEkK9ns9W+wxKdNOaTHYVqXaVWTO24Ajjh8P+7Isl1oxBLMIIHcTCCBVmgAwIB # AgITMwAAABXF52ueAptJmQAAAAAAFTANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0 # IFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMTAwHhcNMjEwOTMwMTgyMjI1 # WhcNMzAwOTMwMTgzMjI1WjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGlu # Z3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv # cmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMDCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAOThpkzntHIhC3miy9ckeb0O # 1YLT/e6cBwfSqWxOdcjKNVf2AX9sSuDivbk+F2Az/1xPx2b3lVNxWuJ+Slr+uDZn # hUYjDLWNE893MsAQGOhgfWpSg0S3po5GawcU88V29YZQ3MFEyHFcUTE3oAo4bo3t # 1w/YJlN8OWECesSq/XJprx2rrPY2vjUmZNqYO7oaezOtgFt+jBAcnVL+tuhiJdxq # D89d9P6OU8/W7IVWTe/dvI2k45GPsjksUZzpcGkNyjYtcI4xyDUoveO0hyTD4MmP # frVUj9z6BVWYbWg7mka97aSueik3rMvrg0XnRm7KMtXAhjBcTyziYrLNueKNiOSW # rAFKu75xqRdbZ2De+JKRHh09/SDPc31BmkZ1zcRfNN0Sidb9pSB9fvzZnkXftnIv # 231fgLrbqn427DZM9ituqBJR6L8FA6PRc6ZNN3SUHDSCD/AQ8rdHGO2n6Jl8P0zb # r17C89XYcz1DTsEzOUyOArxCaC4Q6oRRRuLRvWoYWmEBc8pnol7XKHYC4jMYcten # IPDC+hIK12NvDMk2ZItboKaDIV1fMHSRlJTYuVD5C4lh8zYGNRiER9vcG9H9stQc # xWv2XFJRXRLbJbqvUAV6bMURHXLvjflSxIUXk8A8FdsaN8cIFRg/eKtFtvUeh17a # j54WcmnGrnu3tz5q4i6tAgMBAAGjggHdMIIB2TASBgkrBgEEAYI3FQEEBQIDAQAB # MCMGCSsGAQQBgjcVAgQWBBQqp1L+ZMSavoKRPEY1Kc8Q/y8E7jAdBgNVHQ4EFgQU # n6cVXQBeYl2D9OXSZacbUzUZ6XIwXAYDVR0gBFUwUzBRBgwrBgEEAYI3TIN9AQEw # QTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9E # b2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQB # gjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/ # MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJ # oEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01p # Y1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYB # BQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9v # Q2VyQXV0XzIwMTAtMDYtMjMuY3J0MA0GCSqGSIb3DQEBCwUAA4ICAQCdVX38Kq3h # LB9nATEkW+Geckv8qW/qXBS2Pk5HZHixBpOXPTEztTnXwnE2P9pkbHzQdTltuw8x # 5MKP+2zRoZQYIu7pZmc6U03dmLq2HnjYNi6cqYJWAAOwBb6J6Gngugnue99qb74p # y27YP0h1AdkY3m2CDPVtI1TkeFN1JFe53Z/zjj3G82jfZfakVqr3lbYoVSfQJL1A # oL8ZthISEV09J+BAljis9/kpicO8F7BUhUKz/AyeixmJ5/ALaoHCgRlCGVJ1ijbC # HcNhcy4sa3tuPywJeBTpkbKpW99Jo3QMvOyRgNI95ko+ZjtPu4b6MhrZlvSP9pEB # 9s7GdP32THJvEKt1MMU0sHrYUP4KWN1APMdUbZ1jdEgssU5HLcEUBHG/ZPkkvnNt # yo4JvbMBV0lUZNlz138eW0QBjloZkWsNn6Qo3GcZKCS6OEuabvshVGtqRRFHqfG3 # rsjoiV5PndLQTHa1V1QJsWkBRH58oWFsc/4Ku+xBZj1p/cvBQUl+fpO+y/g75LcV # v7TOPqUxUYS8vwLBgqJ7Fx0ViY1w/ue10CgaiQuPNtq6TPmb/wrpNPgkNWcr4A24 # 5oyZ1uEi6vAnQj0llOZ0dFtq0Z4+7X6gMTN9vMvpe784cETRkPHIqzqKOghif9lw # Y1NNje6CbaUFEMFxBmoQtB1VM1izoXBm8qGCA00wggI1AgEBMIH5oYHRpIHOMIHL # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxN # aWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRT # UyBFU046QTAwMC0wNUUwLUQ5NDcxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0 # YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAAmsP3TKQemj/QAZvuWbC+wK2pE5 # oIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO # BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm # MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcN # AQELBQACBQDuirrOMCIYDzIwMjYxMDI3MDU1MzE4WhgPMjAyNjEwMjgwNTUzMTha # MHQwOgYKKwYBBAGEWQoEATEsMCowCgIFAO6Kus4CAQAwBwIBAAICJS8wBwIBAAIC # E0wwCgIFAO6MDE4CAQAwNgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAK # MAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0BAQsFAAOCAQEACHv5IuE7 # 0AEvr6xfvzEaeq9d2R3+uJkq3NpnJUdpzEDt5jjQifMXYWoGcbcK/VXHFuVjrJ8U # YEUH5TSV2SucUT2dQbfQice7C9MJFHQGhK4VqhnMsvSNNb8rWYCGqiUw3QZku/Cr # tilDvff0gfj8bQhGZ17rMElPrMD04eYQ0iS8yTshqFT2Ye4qsuYk7IoaQAyqeevH # 7r1K4rzWMhr38ExLGmomCMdUS9MjHVu1yOXbWL2j2isZxnCh7hyqkbVRIr6G/Jht # 6621cVqMi3JT/Q+HP90mHONfAwDYgyGsNtvvF8L3tcxtEGa5A+GjVfILubQG+Gxc # 01XbqpVtakNNgDGCBA0wggQJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAACK7sAUP9NO5qhAAEAAAIrMA0GCWCGSAFlAwQCAQUAoIIBSjAa # BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEILnPdXdU # AEuWsbnD59DD1LXCHX1IVLUmLvA76OZL9YSIMIH6BgsqhkiG9w0BCRACLzGB6jCB # 5zCB5DCBvQQgcg4j9D+QV+1gD4zY5j7UHHdqMEPr9YMC09Pa8WS/blIwgZgwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAiu7AFD/TTuaoQAB # AAACKzAiBCCRTf1PMnK+ujyTkp6kWnvdhXoP6UrVLTsK9Jl5837ZNTANBgkqhkiG # 9w0BAQsFAASCAgCHllTDIGkGVY1X+Usg81okLxI7PjtdSCyFo06IUTmpE1cl9D4b # 0upxvDtp4zYVgnsphK5HFwjV2xcSqEYXY7SrlDe1XWYAHq7rXAT0lU6bshdszjcl # T5cCSrXGS0qkCr3pCuc6K9KC5XuNOw/MNL8oo74L6RKtg0AlbmH36lc7lkJhf0py # sAQjWf9FkirsTyvxlxiLapJJBKK6fZIo02lyuhI0R244fzb0j3yiW72uDRmQmiuP # MSfXjRUmiFUYHvPKDXthq/+zRcdt4fG1IMUveJMtCCGnMK/9cw5pIsYPpEDxZk7d # /N6lFY+jI1ypNPH9vCY/C3QwGdMrPKxFKJ/LmKr0CKRFv5xxPRATxMLYorjrh0fo # Kzr9fHX/n18K713dVjVnNbIYogE+QgpOPyQHko3KIMMdXZdfO1mMU8X3cJF2QgjI # /k9dqu2+Uf5GIbp2waYLGiCCYkwzHCwDiio2Qc34/+ujgs9aZ8b8/oFOiCbkZRtq # WIM3aMTWB/hvb8jLqMs2U/tUG2QjaqJQDGYzsiZPj2upPtT6/jpACYMt5UNriluD # hhY7vXqid5PidjnMpf46yZSajWwtHaLl8N7S8s7EqJrTmCz9EcJRdGs2VDZS5wih # vsmRKgx5WJvojLKGpm9VrE3K8ZxO9YtapZgdnU2cdUQm82aaLmYe7lWX9A== # SIG # End signature block |