AMPowerShellTemplate.psm1
<#
.Synopsis This function creates a new PowerShell Module, PowerShell Manifest file and default Pester tests including default PSScriptAnalyser tests for all files. .DESCRIPTION Long description .EXAMPLE New-AMPowerShellModule -Name MyModule -Path C:\MyPath\ -Author 'Flemming Rohde' -CompanyName Automize -Copyright 2018 -ModuleVersion 1.0.0.0 -Description testing -Verbose .EXAMPLE Another example of how to use this cmdlet .INPUTS Inputs to this cmdlet (if any) .OUTPUTS Output from this cmdlet (if any) .NOTES General notes .COMPONENT The component this cmdlet belongs to .ROLE The role this cmdlet belongs to .FUNCTIONALITY The functionality that best describes this cmdlet #> Function New-AMPowerShellModule { [CmdletBinding(SupportsShouldProcess = $true)] param( [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Name, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Path, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Author, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$CompanyName, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Copyright, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$ModuleVersion, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Description ) Begin { } Process { if ($pscmdlet.ShouldProcess("PowerShell Module name: $Name", "New")) { $ModuleFolderPath = New-Item -Path $Path -Name $Name -ItemType Directory -Verbose $VersionFolderPath = New-Item -Path $ModuleFolderPath -Name $ModuleVersion -ItemType Directory -Verbose New-Item -Path $VersionFolderPath -Name 'Tests' -ItemType Directory -Verbose Out-File -FilePath "$VersionFolderPath\$Name.psm1" -Encoding utf8 -Verbose $ModulePath = (Get-Module -Name AMPowerShellTemplate).path $CurrentLocation = Get-Location Push-Location -Path $ModulePath.Substring(0, $ModulePath.LastIndexOf("\")) $Parameters = Get-Content -Path .\DefaultTests.json | ConvertFrom-Json $Parameters.DefaultTests.Module.Content | Out-File -FilePath "$VersionFolderPath\Tests\$Name.tests.ps1" -Encoding utf8 $ModuleManifestParams = @{ RootModule = "$Name.psm1" Path = "$VersionFolderPath\$Name.psd1" GUID = [System.Guid]::NewGuid() Author = $Author CompanyName = $CompanyName Copyright = $Copyright ModuleVersion = $ModuleVersion Description = $Description FunctionsToExport = @() CmdletsToExport = @() AliasesToExport = @() Verbose = $true } New-ModuleManifest @ModuleManifestParams Push-Location $VersionFolderPath Invoke-Pester ".\Tests\$Name.tests.ps1" Set-Location $CurrentLocation } } End { } } <# .Synopsis This function creates a new PowerShell Script and default Pester tests including default PSScriptAnalyser tests for all files. .DESCRIPTION Long description .EXAMPLE New-AMPowerShellScript -Name MyScript -Path C:\MyPath -Verbose .EXAMPLE Another example of how to use this cmdlet .INPUTS Inputs to this cmdlet (if any) .OUTPUTS Output from this cmdlet (if any) .NOTES General notes .COMPONENT The component this cmdlet belongs to .ROLE The role this cmdlet belongs to .FUNCTIONALITY The functionality that best describes this cmdlet #> Function New-AMPowerShellScript { [CmdletBinding(SupportsShouldProcess = $true)] param( [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Name, [Parameter(Mandatory = $true)][ValidateNotNullOrEmpty()][String]$Path ) Begin { } Process { if ($pscmdlet.ShouldProcess("PowerShell Script name: $Name", "New")) { $ScriptFolderPath = New-Item -Path $Path -Name $Name -ItemType Directory -Verbose Out-File -FilePath "$ScriptFolderPath\$Name.ps1" -Encoding utf8 -Verbose $ModulePath = (Get-Module -Name AMPowerShellTemplate).path $CurrentLocation = Get-Location Push-Location -Path $ModulePath.Substring(0, $ModulePath.LastIndexOf("\")) $Parameters = Get-Content -Path .\DefaultTests.json | ConvertFrom-Json Push-Location $ScriptFolderPath $Parameters.DefaultTests.Script.Content | Out-File -FilePath ".\$Name.tests.ps1" -Encoding utf8 Invoke-Pester Set-Location $CurrentLocation } } End { } } Export-ModuleMember -Function New-AMPowerShellModule Export-ModuleMember -Function New-AMPowerShellScript # SIG # Begin signature block # MIIcbQYJKoZIhvcNAQcCoIIcXjCCHFoCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU81VFtM7Dj+2jYZnV4hmkCghd # /LugghecMIIFJTCCBA2gAwIBAgIQBvr9sL154xnLx2xzI6KkMjANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE2MTAxNDAwMDAwMFoXDTE5MTAy # MzEyMDAwMFowYjELMAkGA1UEBhMCREsxEzARBgNVBAgTClN5ZGRhbm1hcmsxEDAO # BgNVBAcTB0tvbGRpbmcxFTATBgNVBAoTDEF1dG9taXplIFAvUzEVMBMGA1UEAxMM # QXV0b21pemUgUC9TMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw9ot # S4zzE1kP2SFLvYVXeM16FNJOMaESNYXUuE9rrzXUDyBpLA9EiCvOvnAaii1XvFfg # 6OJpCppnNzrJCZ3rTdHm7Lf/P7LCQUk3Pc6xI5jHcLKUaINFo529+2yVqNPzqMJ/ # OgT2nxQiU6BaEwauK5xEbRwF/Fu3jZMvC7+1TM3MjO6aGnoey0kYaHrXdY+lqTlp # QJ287vrYrJIsYZfrlYkEQTJe5wMx8QL6KvkMfXxeFoUVz9SIS9CPsYhHRYlEAWhD # hgV+x/8l3Kpiu8lrsfpqQndS/rfS46sIhtmI2ppc2kWqvcXfAvxzVF/3P5p0JbbF # hPBrjKE6V6C/nhKvHwIDAQABo4IBxTCCAcEwHwYDVR0jBBgwFoAUWsS5eyoKo6Xq # cQPAYPkt9mV1DlgwHQYDVR0OBBYEFLZGaqf5X3DRHeeZ1xZYk5xr4MKDMA4GA1Ud # DwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWgM6Ax # hi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNy # bDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1j # cy1nMS5jcmwwTAYDVR0gBEUwQzA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcCARYc # aHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAIBgZngQwBBAEwgYQGCCsGAQUF # BwEBBHgwdjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tME4G # CCsGAQUFBzAChkJodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRT # SEEyQXNzdXJlZElEQ29kZVNpZ25pbmdDQS5jcnQwDAYDVR0TAQH/BAIwADANBgkq # hkiG9w0BAQsFAAOCAQEANMxgqONAb/uyja3uk0w1n/9pNE82rs8Mt6HrB4N6Xe2Y # EHD01OXq97y1wikMG/G5rD8N16S9LtQpI3YqmjukuKr96Rm8oPapw13hTyYYPouV # Wkxm/jzEmvp6rkLXR4cX4+VRHbepyZRv3ATzH/3B9zu/wM54AmNShgpSobYC6YR1 # RdeaDI9kbQbv4x0qlkAGTiF4O5bzX3EQyOgx8LTF1WuKVQySTNukrC36XaCZ1TgG # 1lG5M3/AV0Aw6f6RvzPZqwAypj2/ncuRJ19ElsMmXd7f3CMO/gJKV2yhr90yS0ik # DHb1vm6mdP1QnBe/em2i40GF4tvCOKZAGm6+YLdruDCCBTAwggQYoAMCAQICEAQJ # GBtf1btmdVNDtW+VUAgwDQYJKoZIhvcNAQELBQAwZTELMAkGA1UEBhMCVVMxFTAT # BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEk # MCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTEzMTAyMjEy # MDAwMFoXDTI4MTAyMjEyMDAwMFowcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERp # Z2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMo # RGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQTCCASIwDQYJ # KoZIhvcNAQEBBQADggEPADCCAQoCggEBAPjTsxx/DhGvZ3cH0wsxSRnP0PtFmbE6 # 20T1f+Wondsy13Hqdp0FLreP+pJDwKX5idQ3Gde2qvCchqXYJawOeSg6funRZ9PG # +yknx9N7I5TkkSOWkHeC+aGEI2YSVDNQdLEoJrskacLCUvIUZ4qJRdQtoaPpiCwg # la4cSocI3wz14k1gGL6qxLKucDFmM3E+rHCiq85/6XzLkqHlOzEcz+ryCuRXu0q1 # 6XTmK/5sy350OTYNkO/ktU6kqepqCquE86xnTrXE94zRICUj6whkPlKWwfIPEvTF # jg/BougsUfdzvL2FsWKDc0GCB+Q4i2pzINAPZHM8np+mM6n9Gd8lk9ECAwEAAaOC # Ac0wggHJMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0 # cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0 # cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNV # HR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRB # c3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5j # b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsME8GA1UdIARIMEYwOAYKYIZI # AYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20v # Q1BTMAoGCGCGSAGG/WwDMB0GA1UdDgQWBBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAf # BgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkqhkiG9w0BAQsFAAOC # AQEAPuwNWiSz8yLRFcgsfCUpdqgdXRwtOhrE7zBh134LYP3DPQ/Er4v97yrfIFU3 # sOH20ZJ1D1G0bqWOWuJeJIFOEKTuP3GOYw4TS63XX0R58zYUBor3nEZOXP+QsRsH # DpEV+7qvtVHCjSSuJMbHJyqhKSgaOnEoAjwukaPAJRHinBRHoXpoaK+bp1wgXNlx # sQyPu6j4xRJon89Ay0BEpRPw5mQMJQhCMrI2iiQC/i9yfhzXSUWW6Fkd6fp0ZGuy # 62ZD2rOwjNXpDd32ASDOmTFjPQgaGLOBm0/GkxAG/AeB+ova+YJJ92JuoVP6EpQY # hS6SkepobEQysmah5xikmmRR7zCCBmowggVSoAMCAQICEAMBmgI6/1ixa9bV6uYX # 8GYwDQYJKoZIhvcNAQEFBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lD # ZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGln # aUNlcnQgQXNzdXJlZCBJRCBDQS0xMB4XDTE0MTAyMjAwMDAwMFoXDTI0MTAyMjAw # MDAwMFowRzELMAkGA1UEBhMCVVMxETAPBgNVBAoTCERpZ2lDZXJ0MSUwIwYDVQQD # ExxEaWdpQ2VydCBUaW1lc3RhbXAgUmVzcG9uZGVyMIIBIjANBgkqhkiG9w0BAQEF # AAOCAQ8AMIIBCgKCAQEAo2Rd/Hyz4II14OD2xirmSXU7zG7gU6mfH2RZ5nxrf2uM # nVX4kuOe1VpjWwJJUNmDzm9m7t3LhelfpfnUh3SIRDsZyeX1kZ/GFDmsJOqoSyyR # icxeKPRktlC39RKzc5YKZ6O+YZ+u8/0SeHUOplsU/UUjjoZEVX0YhgWMVYd5SEb3 # yg6Np95OX+Koti1ZAmGIYXIYaLm4fO7m5zQvMXeBMB+7NgGN7yfj95rwTDFkjePr # +hmHqH7P7IwMNlt6wXq4eMfJBi5GEMiN6ARg27xzdPpO2P6qQPGyznBGg+naQKFZ # OtkVCVeZVjCT88lhzNAIzGvsYkKRrALA76TwiRGPdwIDAQABo4IDNTCCAzEwDgYD # VR0PAQH/BAQDAgeAMAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH # AwgwggG/BgNVHSAEggG2MIIBsjCCAaEGCWCGSAGG/WwHATCCAZIwKAYIKwYBBQUH # AgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwggFkBggrBgEFBQcCAjCC # AVYeggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABp # AGYAaQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBw # AHQAYQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQ # AC8AQwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQBy # AHQAeQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0 # ACAAbABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwBy # AHAAbwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBl # AG4AYwBlAC4wCwYJYIZIAYb9bAMVMB8GA1UdIwQYMBaAFBUAEisTmLKZB+0e36K+ # Vw0rZwLNMB0GA1UdDgQWBBRhWk0ktkkynUoqeRqDS/QeicHKfTB9BgNVHR8EdjB0 # MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVk # SURDQS0xLmNybDA4oDagNIYyaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lD # ZXJ0QXNzdXJlZElEQ0EtMS5jcmwwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzAB # hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9j # YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3J0MA0G # CSqGSIb3DQEBBQUAA4IBAQCdJX4bM02yJoFcm4bOIyAPgIfliP//sdRqLDHtOhcZ # cRfNqRu8WhY5AJ3jbITkWkD73gYBjDf6m7GdJH7+IKRXrVu3mrBgJuppVyFdNC8f # cbCDlBkFazWQEKB7l8f2P+fiEUGmvWLZ8Cc9OB0obzpSCfDscGLTYkuw4HOmksDT # jjHYL+NtFxMG7uQDthSr849Dp3GdId0UyhVdkkHa+Q+B0Zl0DSbEDn8btfWg8cZ3 # BigV6diT5VUW8LsKqxzbXEgnZsijiwoc5ZXarsQuWaBh3drzbaJh6YoLbewSGL33 # VVRAA5Ira8JRwgpIr7DUbuD0FAo6G+OPPcqvao173NhEMIIGzTCCBbWgAwIBAgIQ # Bv35A5YDreoACus/J7u6GzANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJVUzEV # MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t # MSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEw # MDAwMDAwWhcNMjExMTEwMDAwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM # RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD # ExhEaWdpQ2VydCBBc3N1cmVkIElEIENBLTEwggEiMA0GCSqGSIb3DQEBAQUAA4IB # DwAwggEKAoIBAQDogi2Z+crCQpWlgHNAcNKeVlRcqcTSQQaPyTP8TUWRXIGf7Syc # +BZZ3561JBXCmLm0d0ncicQK2q/LXmvtrbBxMevPOkAMRk2T7It6NggDqww0/hhJ # gv7HxzFIgHweog+SDlDJxofrNj/YMMP/pvf7os1vcyP+rFYFkPAyIRaJxnCI+QWX # faPHQ90C6Ds97bFBo+0/vtuVSMTuHrPyvAwrmdDGXRJCgeGDboJzPyZLFJCuWWYK # xI2+0s4Grq2Eb0iEm09AufFM8q+Y+/bOQF1c9qjxL6/siSLyaxhlscFzrdfx2M8e # CnRcQrhofrfVdwonVnwPYqQ/MhRglf0HBKIJAgMBAAGjggN6MIIDdjAOBgNVHQ8B # Af8EBAMCAYYwOwYDVR0lBDQwMgYIKwYBBQUHAwEGCCsGAQUFBwMCBggrBgEFBQcD # AwYIKwYBBQUHAwQGCCsGAQUFBwMIMIIB0gYDVR0gBIIByTCCAcUwggG0BgpghkgB # hv1sAAEEMIIBpDA6BggrBgEFBQcCARYuaHR0cDovL3d3dy5kaWdpY2VydC5jb20v # c3NsLWNwcy1yZXBvc2l0b3J5Lmh0bTCCAWQGCCsGAQUFBwICMIIBVh6CAVIAQQBu # AHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMAYQB0 # AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4AYwBl # ACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAAUwAg # AGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAAQQBn # AHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkAYQBi # AGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIAYQB0 # AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUALjAL # BglghkgBhv1sAxUwEgYDVR0TAQH/BAgwBgEB/wIBADB5BggrBgEFBQcBAQRtMGsw # JAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcw # AoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElE # Um9vdENBLmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNl # cnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDov # L2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDAd # BgNVHQ4EFgQUFQASKxOYspkH7R7for5XDStnAs0wHwYDVR0jBBgwFoAUReuir/SS # y4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQEFBQADggEBAEZQPsm3KCSnOB22Wymv # Us9S6TFHq1Zce9UNC0Gz7+x1H3Q48rJcYaKclcNQ5IK5I9G6OoZyrTh4rHVdFxc0 # ckeFlFbR67s2hHfMJKXzBBlVqefj56tizfuLLZDCwNK1lL1eT7EF0g49GqkUW6aG # MWKoqDPkmzmnxPXOHXh2lCVz5Cqrz5x2S+1fwksW5EtwTACJHvzFebxMElf+X+Ee # vAJdqP77BzhPDcZdkbkPZ0XN1oPt55INjbFpjE/7WeAjD9KqrgB87pxCDs+R1ye3 # Fu4Pw718CqDuLAhVhSK46xgaTfwqIa1JMYNHlXdx3LEbS0scEJx3FMGdTy9alQgp # ECYxggQ7MIIENwIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNl # cnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdp # Q2VydCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBAhAG+v2wvXnjGcvH # bHMjoqQyMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKACgAChAoAAMBkG # CSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEE # AYI3AgEVMCMGCSqGSIb3DQEJBDEWBBTLsy+CRFtzl5cFruzEXLC4XgiPDDANBgkq # hkiG9w0BAQEFAASCAQAuqo+6MFG1OugvwgpNDC4OD6O8FHjShgJ3JZWBiSkkDcrX # MIX00vP9Z81PXujFPH82L72byk2KddJUT6GWg6tPcBiIoS9kyeZVd24GVz8cE4WZ # 8Oh4MItrYEfrYtUAxrB+eeMK7hxG2nc2VFG8BR/nQ1eMfNAxjIwLp7FvuFLAdeAD # jVQcpejztnA3D9YdMuv+m7ZQQN0d7L3B3H5TUQBmuH+UmGRicapxaJCIozC5Xaxm # mva4UGV4fdo9XjLk2zl0Cx5BnBffBo9gZK4uTbhDdDXUcCFydM+jufPE1qGcfDAG # rklrowzjSPkL21M4E4KaBzoSDQ9PagGXaBfFZxIXoYICDzCCAgsGCSqGSIb3DQEJ # BjGCAfwwggH4AgEBMHYwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0 # IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNl # cnQgQXNzdXJlZCBJRCBDQS0xAhADAZoCOv9YsWvW1ermF/BmMAkGBSsOAwIaBQCg # XTAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqGSIb3DQEJBTEPFw0xODA0 # MTkxMDE0NTFaMCMGCSqGSIb3DQEJBDEWBBT2AgHntDGVkoQl/A9wLlhlkauZUTAN # BgkqhkiG9w0BAQEFAASCAQB6Ouhdrtq/7vUoViITKNtZ5fnZs4eumrck8LbZWIE8 # wvBWEZzRFm6nOr+U0yW9Ei5UCQxN1L4BCxwAD+oxQyJfcdTpxfh92jg+SeHQzcGg # Yrz+kyi3zCpSooO/F2sgyIxvx/ex35Y3Ub8h3uwEeAmBBhsX6dpAkikkZOeGqKke # +uvAsc4p+pESWNBRGHhNoppYGZ85RLNFgBnErZcJe+U7lmzDrtNYkd6G8/yTNHH5 # 1CKH+V6+S3lCki+iSrRlfb1/Pb3CndhwK2kSPu+Skdiz4KQfURX3x4tEJtJ8yfbx # LQexkYiZu6iO+GjMNOOjwdaPO1CcRFCB0v1CRI22jHsp # SIG # End signature block |