Src/Private/Expand-LabModuleCache.ps1
function Expand-LabModuleCache { <# .SYNOPSIS Extracts a cached PowerShell module to the specified destination module path. #> [CmdletBinding()] [OutputType([System.IO.DirectoryInfo])] param ( ## PowerShell module hashtable [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName)] [System.Collections.Hashtable[]] $Module, ## Destination directory path to download the PowerShell module/DSC resource module to [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [System.String] $DestinationPath, ## Removes existing module directory if present [Parameter(ValueFromPipelineByPropertyName)] [System.Management.Automation.SwitchParameter] $Clean, ## Catch all to be able to pass parameter via $PSBoundParameters [Parameter(ValueFromRemainingArguments)] $RemainingArguments ) begin { [ref] $null = $PSBoundParameters.Remove('RemainingArguments'); } process { foreach ($moduleInfo in $Module) { $moduleFileInfo = Get-LabModuleCache @moduleInfo; $moduleSourcePath = $moduleFileInfo.FullName; $moduleDestinationPath = Join-Path -Path $DestinationPath -ChildPath $moduleInfo.Name; if ($Clean -and (Test-Path -Path $moduleDestinationPath -PathType Container)) { Write-Verbose -Message ($localized.CleaningModuleDirectory -f $moduleDestinationPath); Remove-Item -Path $moduleDestinationPath -Recurse -Force -Confirm:$false; } if ((-not $moduleInfo.ContainsKey('Provider')) -or ($moduleInfo.Provider -eq 'PSGallery')) { Write-Verbose -Message ($localized.ExpandingModule -f $moduleDestinationPath); $expandZipArchiveParams = @{ Path = $moduleSourcePath; DestinationPath = $moduleDestinationPath; ExcludeNuSpecFiles = $true; Force = $true; Verbose = $false; WarningAction = 'SilentlyContinue'; Confirm = $false; } [ref] $null = Expand-ZipArchive @expandZipArchiveParams; } #end if PSGallery elseif (($moduleInfo.ContainsKey('Provider')) -and ($moduleInfo.Provider -eq 'GitHub')) { Write-Verbose -Message ($localized.ExpandingModule -f $moduleDestinationPath); $expandGitHubZipArchiveParams = @{ Path = $moduleSourcePath; ## GitHub modules include the module directory. Therefore, we need the parent root directory DestinationPath = Split-Path -Path $moduleDestinationPath -Parent;; Repository = $moduleInfo.Name; Force = $true; Verbose = $false; WarningAction = 'SilentlyContinue'; Confirm = $false; } if ($moduleInfo.ContainsKey('OverrideRepository')) { $expandGitHubZipArchiveParams['OverrideRepository'] = $moduleInfo.OverrideRepository; } [ref] $null = Expand-GitHubZipArchive @expandGitHubZipArchiveParams; } #end if GitHub elseif (($moduleInfo.ContainsKey('Provider')) -and ($moduleInfo.Provider -eq 'FileSystem')) { if ($null -ne $moduleFileInfo) { if ($moduleFileInfo -is [System.IO.FileInfo]) { Write-Verbose -Message ($localized.ExpandingModule -f $moduleDestinationPath); $expandZipArchiveParams = @{ Path = $moduleSourcePath; DestinationPath = $moduleDestinationPath; ExcludeNuSpecFiles = $true; Force = $true; Verbose = $false; WarningAction = 'SilentlyContinue'; Confirm = $false; } [ref] $null = Expand-ZipArchive @expandZipArchiveParams; } elseif ($moduleFileInfo -is [System.IO.DirectoryInfo]) { Write-Verbose -Message ($localized.CopyingModuleDirectory -f $moduleFileInfo.Name, $moduleDestinationPath); ## If the target doesn't exist create it. We may be copying a versioned ## module, i.e. \xJea\0.2.16.6 to \xJea.. if (-not (Test-Path -Path $moduleDestinationPath -PathType Container)) { New-Item -Path $moduleDestinationPath -ItemType Directory -Force; } $copyItemParams = @{ Path = "$moduleSourcePath\*"; Destination = $moduleDestinationPath; Recurse = $true; Force = $true; Verbose = $false; Confirm = $false; } Copy-Item @copyItemParams; } } } #end if FileSystem ## Only output if we found a module during this pass if ($null -ne $moduleFileInfo) { Write-Output -InputObject (Get-Item -Path $moduleDestinationPath); } } #end foreach module } #end process } #end function # SIG # Begin signature block # MIIZhAYJKoZIhvcNAQcCoIIZdTCCGXECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQe2pLu2qwEVauvBnsnFqI3O0 # 2QGgghSSMIIE/jCCA+agAwIBAgIQDUJK4L46iP9gQCHOFADw3TANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4XDTIxMDEwMTAwMDAwMFoXDTMxMDEw # NjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu # MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMTCCASIwDQYJKoZIhvcN # AQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1DQikRcpja1HXOhFCvQp1dU2UtAxQ # tSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4/2cLnGP9NmqB+in43Stwhd4CGPN4 # bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT0dHTWjaPxqPhLxs6t2HWc+xObTOK # fF1FLUuxUOZBOjdWhtyTI433UCXoZObd048vV7WHIOsOjizVI9r0TXhG4wODMSlK # XAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j6BqrW7EdMMKbaYK02/xWVLwfoYer # vnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4Gdb+DUmEvQECAwEAAaOCAbgwggG0 # MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG # AQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9bAcBMCkwJwYIKwYBBQUHAgEWG2h0 # dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAfBgNVHSMEGDAWgBT0tuEgHf4prtLk # YaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6sGa+vCgtHUQ23eNqerwwcQYDVR0f # BGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl # ZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz # c3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6 # Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRFRpbWVzdGFtcGluZ0NB # LmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzctemaI7znGucgDo5nRv1CclF0CiNH # o6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZO73+RAJmTe1ppA/2uHDPYuj1UUp4 # eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO/PT+t2R3Y18jUmmDgvoaU+2QzI2h # F3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUIAHa8gQ74wOFcz8QRcucbZEnYIpp1 # FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahzQ1HavWPWH1ub9y4bTxMd90oNcX6X # t/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5nePk2mOHLKNpbh6aKLzCCBSMwggQL # oAMCAQICEALG08WuKukUkZsdIZFconEwDQYJKoZIhvcNAQELBQAwcjELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUg # U2lnbmluZyBDQTAeFw0xOTA3MDMwMDAwMDBaFw0yMTExMDMxMjAwMDBaMGAxCzAJ # BgNVBAYTAkdCMQ8wDQYDVQQHEwZMb25kb24xHzAdBgNVBAoTFlZpcnR1YWwgRW5n # aW5lIExpbWl0ZWQxHzAdBgNVBAMTFlZpcnR1YWwgRW5naW5lIExpbWl0ZWQwggEi # MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCf7ODTBCSwNQI4uBByfObsMhBA # HqZ3WJ9V/KUZxpDpU81RyEwHh+wUJ3oY2zcAo+zB1D00jM0rnF4cn2jGbYQjWLbo # MmdrlOLlYwdX98XZl1xV/mrpDGIApNWUBW0DAam80WOApQ8JSzRlRIwyXiwVC+nI # iBE6g3Nu2C4O+9li6bryF53tdxGFzeNtmPN10ahDH+L/Ut/fEvDEZOanWrEbcWGW # OhnImWUJwC/1zm6VwzN7QxYHELshnGbbUbl1WVxI/ppWPIFCM5EidGiZ9aVVU7Gv # rQrwGbiTCcHT4cjOzVGu2LJu5/anRewb3K1gZmmEXw8smpS8EaDnCNh1aHV/AgMB # AAGjggHFMIIBwTAfBgNVHSMEGDAWgBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAdBgNV # HQ4EFgQUgxVl5e9BY1X5fCAcAE6ROOqrxngwDgYDVR0PAQH/BAQDAgeAMBMGA1Ud # JQQMMAoGCCsGAQUFBwMDMHcGA1UdHwRwMG4wNaAzoDGGL2h0dHA6Ly9jcmwzLmRp # Z2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8v # Y3JsNC5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcxLmNybDBMBgNVHSAE # RTBDMDcGCWCGSAGG/WwDATAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdp # Y2VydC5jb20vQ1BTMAgGBmeBDAEEATCBhAYIKwYBBQUHAQEEeDB2MCQGCCsGAQUF # BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUHMAKGQmh0dHA6 # Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1cmVkSURDb2Rl # U2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEBCwUAA4IBAQCd # VWWTTAMvCskCwasEVgFg6nDsY1ZcuhUyHqjtv7pfaxGJvAfZjcetPwC/k2021MAc # 4mtqcAbiIp+9HgpWRxbLb0HAEgWwdJNeEf67Po3rLXxUZq7BM9u9jznOr7CnHt0z # pagXNq7b1crlD0byNskJtVmE6ToEJ56d4sdiwXfn4EQDbD/crq75xnRBRc06BQ1x # VZBRwUPT6+bQG+Iu2ZEhQudgbQezVbqIh/N5cdO0soyMVNdRCxA2QaTtx4k7E824 # TwBMOAj/vjjSvH4nlmXrwyvQxRIjSAtIFi/wx9fnO3ooTqCXSakQE/cJADCI3LJG # eSzmxrzLLf4asAXsKS82MIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1U0O1b5VQCDAN # BgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg # SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2Vy # dCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcNMjgxMDIyMTIw # MDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A # MIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid2zLXcep2nQUu # t4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sjlOSRI5aQd4L5 # oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjfDPXiTWAYvqrE # sq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzLfnQ5Ng2Q7+S1 # TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR93O8vYWxYoNz # QYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckwEgYDVR0TAQH/ # BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMw # eQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy # dC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E # aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0 # dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j # cmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3Vy # ZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIEMCowKAYIKwYB # BQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYIYIZIAYb9bAMw # HQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQYMBaAFEXroq/0 # ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1aJLPzItEVyCx8 # JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUPUbRupY5a4l4k # gU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1UcKNJK4kxscn # KqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjFEmifz0DLQESl # E/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM1ekN3fYBIM6Z # MWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhsRDKyZqHnGKSa # ZFHvMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXaNpfCFTANBgkqhkiG9w0BAQsF # ADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL # ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElE # IFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEwMTA3MTIwMDAwWjByMQswCQYD # VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln # aWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgVGlt # ZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvdAy # 7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1NaH7ntqD0jbOI5Je/YyGQmL8T # vFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vjRkcGGlV+Cyd+wKL1oODeIj8O # /36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOoCXFr4M8iEA91z3FyTgqt30A6 # XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe/WZuVmEnKYmEUeaC50ZQ/ZQq # LKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG7z3N1k3vBkL9olMqT4UdxB08 # r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYDVR0OBBYEFPS24SAd/imu0uRh # pbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMBIGA1Ud # EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUF # BwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGln # aWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5j # b20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0MIGBBgNVHR8EejB4MDqgOKA2 # hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290 # Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB # c3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcwOAYKYIZIAYb9bAACBDAqMCgG # CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMAsGCWCGSAGG # /WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGHVmnN793afKpjerN4zwY3QITv # S4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqumfgnoma/Capg33akOpMP+LLR # 2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuByx5jWPGTlH0gQGF+JOGFNYkYk # h2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraSZ/tTYYmo9WuWwPRYaQ18yAGx # uSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh5Fhgm7oMLSttosR+u8QlK0cC # CHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2skuiSpXY9aaOUjGCBFwwggRY # AgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAX # BgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIg # QXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEALG08WuKukUkZsdIZFconEwCQYF # Kw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkD # MQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwIwYJ # KoZIhvcNAQkEMRYEFI8wEHufw4Vx9YCxOH+0V3aIThdkMA0GCSqGSIb3DQEBAQUA # BIIBAF4+GsnxTRfN6t3v3G0PDjyXBdmlr37H8/JZN1VS2MuVDsTs/z0QG9xG0sFe # p5ivi/AckAmyjeGG9j0XCA8xJ4+C1sbwkZWikq1L1wBguEa1Utxp7xagyqxMp9BD # 6weZh5UdNKlHzaiYf1ZfZWrCjkPFpqsAzjWXyj5GeVqpqPdUGebM4JjoRY1YlD+K # JdCAb2B9b67EAYfi5qKya6QWpV1CMms12GmxwcMYeDOxGjBqgfCyTm3JsBurXGko # xZSr7qMuE82yGXUJq7v1/v57THwh7sfmJ8l/m21i6+JMwbg+e1GDQs2E2YulMNr+ # t0dZBre4TCF4InV4wMinXGmuLDGhggIwMIICLAYJKoZIhvcNAQkGMYICHTCCAhkC # AQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG # A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBB # c3N1cmVkIElEIFRpbWVzdGFtcGluZyBDQQIQDUJK4L46iP9gQCHOFADw3TANBglg # hkgBZQMEAgEFAKBpMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN # AQkFMQ8XDTIxMDQyMjExNDA0NFowLwYJKoZIhvcNAQkEMSIEIBSeYL1LqmJtpQEH # GDgsWqVhf146xsoGdao24rCvUh58MA0GCSqGSIb3DQEBAQUABIIBAKCuh9B05IGS # KkDsrjm3XCBOHewmoesTaPL+WgZ5caLDRVxIq1QBFe3XQtHcB9b0cxiIVxb6jM8P # EKp+cQrejXHY64F5VNCQ3VuP4VRy6cfQWw6+E+ryWVTWadIEIKgpBrK73PEIwSKx # 8pO8/d9tYZCcgevoEysJoMzlYes1JsEU49be/VgW92upY9sa56JXwOprVsPb5yFj # RcgZQ9TXrpk+QYzYX0xDtfRIaEpmR8osifZAJJ9vMYU9C9rKqtHq5LRTlDHP8+dd # gr5IuhOIFrC+wJXls/Fw8+8uPDPCUahrAHlNsqW3nsSLb1Dci7JiyJLaxeDroCMT # 4JRxHIFxRs8= # SIG # End signature block |