From 706bf0777c621f3bb4da188659b1f213257837bc Mon Sep 17 00:00:00 2001 From: Eugenio Naselli Date: Fri, 23 Oct 2026 11:49:29 -0700 Subject: [PATCH] Update Packman to 8.7.0 --- tools/packman/bootstrap/configure.bat | 169 ----- tools/packman/bootstrap/configure.ps1 | 661 ++++++++++++++++++ .../bootstrap/download_file_from_url.ps1 | 53 -- .../fetch_file_from_packman_bootstrap.cmd | 35 - .../bootstrap/generate_temp_file_name.ps1 | 161 ----- .../bootstrap/generate_temp_folder.ps1 | 167 ----- tools/packman/bootstrap/install_package.py | 3 +- tools/packman/packman | 427 ++++++----- tools/packman/packman.cmd | 33 +- tools/packman/packmanconf.py | 38 +- tools/packman/python.bat | 15 +- tools/packman/python.sh | 15 +- tools/repo-deps.packman.xml | 4 +- 13 files changed, 981 insertions(+), 800 deletions(-) delete mode 100644 tools/packman/bootstrap/configure.bat create mode 100644 tools/packman/bootstrap/configure.ps1 delete mode 100644 tools/packman/bootstrap/download_file_from_url.ps1 delete mode 100644 tools/packman/bootstrap/fetch_file_from_packman_bootstrap.cmd delete mode 100644 tools/packman/bootstrap/generate_temp_file_name.ps1 delete mode 100644 tools/packman/bootstrap/generate_temp_folder.ps1 diff --git a/tools/packman/bootstrap/configure.bat b/tools/packman/bootstrap/configure.bat deleted file mode 100644 index 33fb441..0000000 --- a/tools/packman/bootstrap/configure.bat +++ /dev/null @@ -1,169 +0,0 @@ -:: Copyright 2019-2023 NVIDIA CORPORATION -:: -:: Licensed under the Apache License, Version 2.0 (the "License"); -:: you may not use this file except in compliance with the License. -:: You may obtain a copy of the License at -:: -:: http://www.apache.org/licenses/LICENSE-2.0 -:: -:: Unless required by applicable law or agreed to in writing, software -:: distributed under the License is distributed on an "AS IS" BASIS, -:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -:: See the License for the specific language governing permissions and -:: limitations under the License. - -set PM_PACKMAN_VERSION=7.23.1 - -:: Specify where packman command is rooted -set PM_INSTALL_PATH=%~dp0.. - -:: The external root may already be configured and we should do minimal work in that case -if defined PM_PACKAGES_ROOT goto ENSURE_DIR - -:: If the folder isn't set we assume that the best place for it is on the drive that we are currently -:: running from -set PM_DRIVE=%CD:~0,2% - -set PM_PACKAGES_ROOT=%PM_DRIVE%\packman-repo - -:: We use *setx* here so that the variable is persisted in the user environment -echo Setting user environment variable PM_PACKAGES_ROOT to %PM_PACKAGES_ROOT% -setx PM_PACKAGES_ROOT %PM_PACKAGES_ROOT% -if %errorlevel% neq 0 ( goto ERROR ) - -:: The above doesn't work properly from a build step in VisualStudio because a separate process is -:: spawned for it so it will be lost for subsequent compilation steps - VisualStudio must -:: be launched from a new process. We catch this odd-ball case here: -if defined PM_DISABLE_VS_WARNING goto ENSURE_DIR -if not defined VSLANG goto ENSURE_DIR -echo The above is a once-per-computer operation. Unfortunately VisualStudio cannot pick up environment change -echo unless *VisualStudio is RELAUNCHED*. -echo If you are launching VisualStudio from command line or command line utility make sure -echo you have a fresh launch environment (relaunch the command line or utility). -echo If you are using 'linkPath' and referring to packages via local folder links you can safely ignore this warning. -echo You can disable this warning by setting the environment variable PM_DISABLE_VS_WARNING. -echo. - -:: Check for the directory that we need. Note that mkdir will create any directories -:: that may be needed in the path -:ENSURE_DIR -if not exist "%PM_PACKAGES_ROOT%" ( - echo Creating packman packages cache at %PM_PACKAGES_ROOT% - mkdir "%PM_PACKAGES_ROOT%" -) -if %errorlevel% neq 0 ( goto ERROR_MKDIR_PACKAGES_ROOT ) - -:: The Python interpreter may already be externally configured -if defined PM_PYTHON_EXT ( - set PM_PYTHON=%PM_PYTHON_EXT% - goto PACKMAN -) - -set PM_PYTHON_VERSION=3.10.5-1-windows-x86_64 -set PM_PYTHON_BASE_DIR=%PM_PACKAGES_ROOT%\python -set PM_PYTHON_DIR=%PM_PYTHON_BASE_DIR%\%PM_PYTHON_VERSION% -set PM_PYTHON=%PM_PYTHON_DIR%\python.exe - -if exist "%PM_PYTHON%" goto PACKMAN -if not exist "%PM_PYTHON_BASE_DIR%" call :CREATE_PYTHON_BASE_DIR - -set PM_PYTHON_PACKAGE=python@%PM_PYTHON_VERSION%.cab -for /f "delims=" %%a in ('powershell -ExecutionPolicy ByPass -NoLogo -NoProfile -File "%~dp0\generate_temp_file_name.ps1"') do set TEMP_FILE_NAME=%%a -set TARGET=%TEMP_FILE_NAME%.zip -call "%~dp0fetch_file_from_packman_bootstrap.cmd" %PM_PYTHON_PACKAGE% "%TARGET%" -if %errorlevel% neq 0 ( - echo !!! Error fetching python from CDN !!! - goto ERROR -) - -for /f "delims=" %%a in ('powershell -ExecutionPolicy ByPass -NoLogo -NoProfile -File "%~dp0\generate_temp_folder.ps1" -parentPath "%PM_PYTHON_BASE_DIR%"') do set TEMP_FOLDER_NAME=%%a -echo Unpacking Python interpreter ... -"%SystemRoot%\system32\expand.exe" -F:* "%TARGET%" "%TEMP_FOLDER_NAME%" 1> nul -del "%TARGET%" -:: Failure during extraction to temp folder name, need to clean up and abort -if %errorlevel% neq 0 ( - echo !!! Error unpacking python !!! - call :CLEAN_UP_TEMP_FOLDER - goto ERROR -) - -:: If python has now been installed by a concurrent process we need to clean up and then continue -if exist "%PM_PYTHON%" ( - call :CLEAN_UP_TEMP_FOLDER - goto PACKMAN -) else ( - if exist "%PM_PYTHON_DIR%" ( rd /s /q "%PM_PYTHON_DIR%" > nul ) -) - -:: Perform atomic move (allowing overwrite, /y) -move /y "%TEMP_FOLDER_NAME%" "%PM_PYTHON_DIR%" 1> nul -:: Verify that python.exe is now where we expect -if exist "%PM_PYTHON%" goto PACKMAN - -:: Wait a second and try again (can help with access denied weirdness) -timeout /t 1 /nobreak 1> nul -move /y "%TEMP_FOLDER_NAME%" "%PM_PYTHON_DIR%" 1> nul -if %errorlevel% neq 0 ( - echo !!! Error moving python %TEMP_FOLDER_NAME% -> %PM_PYTHON_DIR% !!! - call :CLEAN_UP_TEMP_FOLDER - goto ERROR -) - -:PACKMAN -:: The packman module may already be externally configured -if defined PM_MODULE_DIR_EXT ( - set PM_MODULE_DIR=%PM_MODULE_DIR_EXT% -) else ( - set PM_MODULE_DIR=%PM_PACKAGES_ROOT%\packman-common\%PM_PACKMAN_VERSION% -) - -set PM_MODULE=%PM_MODULE_DIR%\run.py - -if exist "%PM_MODULE%" goto END - -:: Clean out broken PM_MODULE_DIR if it exists -if exist "%PM_MODULE_DIR%" ( rd /s /q "%PM_MODULE_DIR%" > nul ) - -set PM_MODULE_PACKAGE=packman-common@%PM_PACKMAN_VERSION%.zip -for /f "delims=" %%a in ('powershell -ExecutionPolicy ByPass -NoLogo -NoProfile -File "%~dp0\generate_temp_file_name.ps1"') do set TEMP_FILE_NAME=%%a -set TARGET=%TEMP_FILE_NAME% -call "%~dp0fetch_file_from_packman_bootstrap.cmd" %PM_MODULE_PACKAGE% "%TARGET%" -if %errorlevel% neq 0 ( - echo !!! Error fetching packman from CDN !!! - goto ERROR -) - -echo Unpacking ... -"%PM_PYTHON%" -S -s -u -E "%~dp0\install_package.py" "%TARGET%" "%PM_MODULE_DIR%" -if %errorlevel% neq 0 ( - echo !!! Error unpacking packman !!! - goto ERROR -) - -del "%TARGET%" - -goto END - -:ERROR_MKDIR_PACKAGES_ROOT -echo Failed to automatically create packman packages repo at %PM_PACKAGES_ROOT%. -echo Please set a location explicitly that packman has permission to write to, by issuing: -echo. -echo setx PM_PACKAGES_ROOT {path-you-choose-for-storing-packman-packages-locally} -echo. -echo Then launch a new command console for the changes to take effect and run packman command again. -exit /B %errorlevel% - -:ERROR -echo !!! Failure while configuring local machine :( !!! -exit /B %errorlevel% - -:CLEAN_UP_TEMP_FOLDER -rd /S /Q "%TEMP_FOLDER_NAME%" -exit /B - -:CREATE_PYTHON_BASE_DIR -:: We ignore errors and clean error state - if two processes create the directory one will fail which is fine -md "%PM_PYTHON_BASE_DIR%" > nul 2>&1 -exit /B 0 - -:END diff --git a/tools/packman/bootstrap/configure.ps1 b/tools/packman/bootstrap/configure.ps1 new file mode 100644 index 0000000..1ea1ba9 --- /dev/null +++ b/tools/packman/bootstrap/configure.ps1 @@ -0,0 +1,661 @@ +<# +Copyright 2019-2026 NVIDIA CORPORATION + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +#> + +[CmdletBinding()] +param( + [Parameter(Mandatory = $true)] + [string]$PackmanVersion, + [Parameter(Mandatory = $true)] + [string]$PythonVersion, + [string]$PackmanCommonSha256 = "" +) + +Set-StrictMode -Version 2.0 +$ErrorActionPreference = "Stop" + +$PM_PACKMAN_VERSION = $PackmanVersion +$PM_PYTHON_VERSION = $PythonVersion +$PM_PACKMAN_COMMON_SHA256 = $PackmanCommonSha256 +$BOOTSTRAP_ROOT = $PSScriptRoot +$PM_INSTALL_PATH = [System.IO.Path]::GetFullPath((Join-Path $BOOTSTRAP_ROOT "..")) +$SENTINEL_FILE_NAME = ".packman.rdy" +$LOCK_WAIT_LOG_INTERVAL_MS = 5000 + +Add-Type -AssemblyName System.IO.Compression +Add-Type -AssemblyName System.IO.Compression.FileSystem + +[System.Net.ServicePointManager]::SecurityProtocol = ` + [System.Net.ServicePointManager]::SecurityProtocol -bor ` + [System.Net.SecurityProtocolType]::Tls12 + +function Write-Log { + param([string]$Message) + [Console]::Error.WriteLine($Message) +} + +function Write-Failure { + param([string]$Message) + [Console]::Error.WriteLine($Message) +} + +function Get-DefaultPackagesRoot { + $drive = [System.IO.Path]::GetPathRoot($PM_INSTALL_PATH) + if ([string]::IsNullOrEmpty($drive)) { + throw "Unable to resolve install drive from '$PM_INSTALL_PATH'." + } + + return [System.IO.Path]::Combine($drive, "packman-repo") +} + +function Set-UserEnvironmentVariable { + param( + [string]$Name, + [string]$Value + ) + + Write-Log "Setting user environment variable $Name to $Value" + $null = & setx $Name $Value + if ($LASTEXITCODE -ne 0) { + throw "Failed to persist user environment variable $Name." + } +} + +function Write-VisualStudioWarning { + if ($env:PM_DISABLE_VS_WARNING) { + return + } + + if (-not $env:VSLANG) { + return + } + + Write-Log "The above is a once-per-computer operation. Unfortunately VisualStudio cannot pick up environment change" + Write-Log "unless *VisualStudio is RELAUNCHED*." + Write-Log "If you are launching VisualStudio from command line or command line utility make sure" + Write-Log "you have a fresh launch environment (relaunch the command line or utility)." + Write-Log "If you are using 'linkPath' and referring to packages via local folder links you can safely ignore this warning." + Write-Log "You can disable this warning by setting the environment variable PM_DISABLE_VS_WARNING." + Write-Log "" +} + +function Ensure-DirectoryExists { + param([string]$Path) + + if (-not (Test-Path -LiteralPath $Path)) { + New-Item -ItemType Directory -Path $Path -Force | Out-Null + } +} + +function Resolve-NormalizedPath { + param([string]$Path) + + return [System.IO.Path]::GetFullPath($Path) +} + +function Remove-DirectoryIfPresent { + param([string]$Path) + + if (Test-Path -LiteralPath $Path) { + Remove-Item -LiteralPath $Path -Recurse -Force + } +} + +function Get-SentinelPath { + param([string]$DestinationDir) + + return [System.IO.Path]::Combine($DestinationDir, $SENTINEL_FILE_NAME) +} + +function Test-Ready { + param([string]$DestinationDir) + + return Test-Path -LiteralPath (Get-SentinelPath -DestinationDir $DestinationDir) +} + +function Get-PathHash { + param([string]$Path) + + $normalizedPath = [System.IO.Path]::GetFullPath($Path).ToLowerInvariant() + $sha256 = [System.Security.Cryptography.SHA256]::Create() + try { + $bytes = [System.Text.Encoding]::UTF8.GetBytes($normalizedPath) + $hash = $sha256.ComputeHash($bytes) + } + finally { + $sha256.Dispose() + } + + return ([System.BitConverter]::ToString($hash).Replace("-", "")).ToLowerInvariant() +} + +function Get-BytesSha256Hex { + param([byte[]]$Bytes) + + $sha256 = [System.Security.Cryptography.SHA256]::Create() + try { + $hash = $sha256.ComputeHash($Bytes) + } + finally { + $sha256.Dispose() + } + + return ([System.BitConverter]::ToString($hash).Replace("-", "")).ToLowerInvariant() +} + +function Get-LockFilePath { + param( + [string]$PackagesRoot, + [string]$DestinationDir + ) + + $lockRoot = Join-Path $PackagesRoot ".locks" + Ensure-DirectoryExists -Path $lockRoot + return Join-Path $lockRoot ((Get-PathHash -Path $DestinationDir) + ".txt") +} + +function Write-LockMetadata { + param( + [System.IO.FileStream]$LockStream, + [string]$DestinationDir + ) + + $metadata = @( + "target=" + [System.IO.Path]::GetFullPath($DestinationDir) + "pid=" + $PID + "machine=" + $env:COMPUTERNAME + "acquired_utc=" + [DateTime]::UtcNow.ToString("o") + ) -join [Environment]::NewLine + + $LockStream.SetLength(0) + $LockStream.Position = 0 + $writer = New-Object System.IO.StreamWriter($LockStream, [System.Text.Encoding]::UTF8, 1024, $true) + try { + $writer.WriteLine($metadata) + $writer.Flush() + $LockStream.Flush() + } + finally { + $writer.Dispose() + } +} + +function Invoke-WithDestinationFileLock { + param( + [string]$PackagesRoot, + [string]$DestinationDir, + [string]$Label, + [scriptblock]$Body + ) + + $lockPath = Get-LockFilePath -PackagesRoot $PackagesRoot -DestinationDir $DestinationDir + $lockStream = $null + + try { + while ($null -eq $lockStream) { + try { + $lockStream = [System.IO.File]::Open( + $lockPath, + [System.IO.FileMode]::OpenOrCreate, + [System.IO.FileAccess]::ReadWrite, + [System.IO.FileShare]::None + ) + Write-LockMetadata -LockStream $lockStream -DestinationDir $DestinationDir + } + catch [System.IO.IOException] { + if ($null -ne $lockStream) { + $lockStream.Dispose() + $lockStream = $null + } + + Write-Log "Waiting for $Label install lock at $DestinationDir ..." + Start-Sleep -Milliseconds $LOCK_WAIT_LOG_INTERVAL_MS + } + } + + & $Body + } + finally { + if ($null -ne $lockStream) { + $lockStream.Dispose() + } + } +} + +function Invoke-DownloadBytes { + param( + [string]$PackageName, + [string]$DestinationLabel + ) + + $triesLeft = 4 + $delaySeconds = 2 + $sourceUrl = "https://bootstrap.packman.nvidia.com/$PackageName" + + while ($triesLeft -gt 0) { + $triesLeft -= 1 + try { + Write-Log "Fetching $PackageName for $DestinationLabel ..." + $webClient = New-Object System.Net.WebClient + try { + return $webClient.DownloadData($sourceUrl) + } + finally { + $webClient.Dispose() + } + } + catch { + Write-Log "Error downloading $sourceUrl" + Write-Log $_.Exception.ToString() + if ($triesLeft -le 0) { + break + } + + Write-Log "Retrying in $delaySeconds seconds ..." + Start-Sleep -Seconds $delaySeconds + $delaySeconds *= $delaySeconds + } + } + + throw "Failed to download $PackageName." +} + +function Expand-ZipBytes { + param( + [byte[]]$ZipBytes, + [string]$DestinationDir + ) + + $destinationRoot = [System.IO.Path]::GetFullPath($DestinationDir) + $destinationRootWithSeparator = $destinationRoot.TrimEnd([System.IO.Path]::DirectorySeparatorChar) + [System.IO.Path]::DirectorySeparatorChar + $stream = New-Object System.IO.MemoryStream(,$ZipBytes) + try { + $archive = New-Object System.IO.Compression.ZipArchive( + $stream, + [System.IO.Compression.ZipArchiveMode]::Read, + $false + ) + try { + foreach ($entry in $archive.Entries) { + if ([string]::IsNullOrEmpty($entry.FullName)) { + continue + } + + $entryPath = $entry.FullName.Replace("/", [System.IO.Path]::DirectorySeparatorChar) + $targetPath = [System.IO.Path]::GetFullPath([System.IO.Path]::Combine($destinationRoot, $entryPath)) + if (($targetPath -ne $destinationRoot) -and (-not $targetPath.StartsWith($destinationRootWithSeparator, [System.StringComparison]::OrdinalIgnoreCase))) { + throw "Archive entry '$($entry.FullName)' escapes destination '$destinationRoot'." + } + + if ($entry.FullName.EndsWith("/")) { + Ensure-DirectoryExists -Path $targetPath + continue + } + + $targetDir = Split-Path -Parent $targetPath + if (-not [string]::IsNullOrEmpty($targetDir)) { + Ensure-DirectoryExists -Path $targetDir + } + + $entryStream = $entry.Open() + try { + $fileStream = [System.IO.File]::Open($targetPath, [System.IO.FileMode]::Create, [System.IO.FileAccess]::Write, [System.IO.FileShare]::None) + try { + $entryStream.CopyTo($fileStream) + } + finally { + $fileStream.Dispose() + } + } + finally { + $entryStream.Dispose() + } + } + } + finally { + $archive.Dispose() + } + } + finally { + $stream.Dispose() + } +} + +function Write-Sentinel { + param( + [string]$DestinationDir, + [string]$PackageName + ) + + $sentinelPath = Get-SentinelPath -DestinationDir $DestinationDir + $content = @( + "package=$PackageName" + "ready_utc=$([DateTime]::UtcNow.ToString("o"))" + ) + [System.IO.File]::WriteAllLines($sentinelPath, $content) +} + +function Ensure-ZipPackageInstall { + param( + [string]$PackagesRoot, + [string]$DestinationDir, + [string]$PackageName, + [string]$Label, + [string]$ExpectedSha256 = "" + ) + + if (Test-Ready -DestinationDir $DestinationDir) { + return + } + + Invoke-WithDestinationFileLock -PackagesRoot $PackagesRoot -DestinationDir $DestinationDir -Label $Label -Body { + if (Test-Ready -DestinationDir $DestinationDir) { + return + } + + Remove-DirectoryIfPresent -Path $DestinationDir + Ensure-DirectoryExists -Path $DestinationDir + + $zipBytes = Invoke-DownloadBytes -PackageName $PackageName -DestinationLabel $Label + if (-not [string]::IsNullOrEmpty($ExpectedSha256)) { + $actualSha256 = Get-BytesSha256Hex -Bytes $zipBytes + if ($actualSha256 -ne $ExpectedSha256.ToLowerInvariant()) { + throw "Package '$PackageName' must have a sha256 of '$ExpectedSha256' but was found to have '$actualSha256'." + } + } + Write-Log "Unpacking $Label ..." + Expand-ZipBytes -ZipBytes $zipBytes -DestinationDir $DestinationDir + Write-Sentinel -DestinationDir $DestinationDir -PackageName $PackageName + } +} + +function Write-Export { + param( + [string]$Name, + [string]$Value + ) + + [Console]::Out.WriteLine($Name + "=" + $Value) +} + +try { + $pmPackagesRootWasProvided = -not [string]::IsNullOrEmpty($env:PM_PACKAGES_ROOT) + if ($pmPackagesRootWasProvided) { + $pmPackagesRoot = Resolve-NormalizedPath -Path $env:PM_PACKAGES_ROOT + } + else { + $pmPackagesRoot = Resolve-NormalizedPath -Path (Get-DefaultPackagesRoot) + Set-UserEnvironmentVariable -Name "PM_PACKAGES_ROOT" -Value $pmPackagesRoot + Write-VisualStudioWarning + } + + if (-not (Test-Path -LiteralPath $pmPackagesRoot)) { + Write-Log "Creating packman packages cache at $pmPackagesRoot" + Ensure-DirectoryExists -Path $pmPackagesRoot + } + + if ($env:PM_PYTHON_EXT) { + $pmPython = Resolve-NormalizedPath -Path $env:PM_PYTHON_EXT + } + else { + $pmPythonBaseDir = Join-Path $pmPackagesRoot "python" + $pmPythonDir = Join-Path $pmPythonBaseDir $PM_PYTHON_VERSION + $pmPython = Resolve-NormalizedPath -Path (Join-Path $pmPythonDir "python.exe") + Ensure-DirectoryExists -Path $pmPythonBaseDir + Ensure-ZipPackageInstall -PackagesRoot $pmPackagesRoot -DestinationDir $pmPythonDir -PackageName ("python@" + $PM_PYTHON_VERSION + ".zip") -Label "Python interpreter" + } + + if ($env:PM_MODULE_DIR_EXT) { + $pmModuleDir = Resolve-NormalizedPath -Path $env:PM_MODULE_DIR_EXT + } + else { + $pmModuleDir = Resolve-NormalizedPath -Path (Join-Path (Join-Path $pmPackagesRoot "packman-common") $PM_PACKMAN_VERSION) + Ensure-ZipPackageInstall -PackagesRoot $pmPackagesRoot -DestinationDir $pmModuleDir -PackageName ("packman-common@" + $PM_PACKMAN_VERSION + ".zip") -Label "packman" -ExpectedSha256 $PM_PACKMAN_COMMON_SHA256 + } + + $pmModule = Resolve-NormalizedPath -Path (Join-Path $pmModuleDir "run.py") + + Write-Export -Name "PM_INSTALL_PATH" -Value $PM_INSTALL_PATH + Write-Export -Name "PM_PACKAGES_ROOT" -Value $pmPackagesRoot + Write-Export -Name "PM_PYTHON" -Value $pmPython + Write-Export -Name "PM_MODULE_DIR" -Value $pmModuleDir + Write-Export -Name "PM_MODULE" -Value $pmModule + exit 0 +} +catch { + Write-Failure "!!! Failure while configuring local machine :( !!!" + Write-Failure $_.Exception.Message + exit 1 +} + +# SIG # Begin signature block +# MIIofwYJKoZIhvcNAQcCoIIocDCCKGwCAQExDzANBglghkgBZQMEAgEFADB5Bgor +# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG +# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAWwKj2dEbYNg/h +# mA+bs0J3T8vxT2+X/FQuZ4d/HB3WAKCCDbUwggawMIIEmKADAgECAhAIrUCyYNKc +# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK +# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV +# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z +# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg +# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg +# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0 +# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr +# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF +# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F +# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh +# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ +# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay +# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI +# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp +# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro +# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB +# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+ +# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P +# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk +# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC +# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v +# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j +# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED +# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql +# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF +# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h +# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw +# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld +# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw +# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP +# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE +# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn +# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji +# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq +# yK+p/pQd52MbOoZWeE4wggb9MIIE5aADAgECAhAJrnXkyTwXU23cf6lU5rhZMA0G +# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg +# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg +# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjUwNzMwMDAwMDAwWhcNMjgwNzI5 +# MjM1OTU5WjCBhDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFDAS +# BgNVBAcTC1NhbnRhIENsYXJhMRswGQYDVQQKExJOVklESUEgQ29ycG9yYXRpb24x +# EDAOBgNVBAsTBzIwMDhCOUYxGzAZBgNVBAMTEk5WSURJQSBDb3Jwb3JhdGlvbjCC +# AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKa2dMEsbSxk5eQlpZLnH3gh +# gkCcxlFDR/+as8oUqOztXFPrpGWMZkyOu06MNiPycUbVMh6pb8nJjr0ULpqPwd+7 +# lPzZ1RBDiUizSvLW7QkcVrtcpaTzLV5N0aezqj1lXwFWU1MVGan0tXmcrSAaAFJG +# F6ChQbmh5ltEeJd+9ZQenKaH+eYZIPCS4Fk9sQefuuH060+oN4aME1iGyPL/l/cL +# wXnfGFkfy0TdmZDO+IHERhcjqrAFKfYgsDlDsUnOc6smhyRv1RFgsx2W73Mztt7U +# sZ81qORdZDTKztGykoQIC/YYo03iI7BfotTNY9c+81iN8qIsHBhdpRrerEKA/rm7 +# dF8HrGjg7Nn+p75fRrIKZ7v86dOxPJm7s6HjDL/Ww37XwK+yK1XH+o+376bx0mFE +# OhmGczyn8YMUwz8frLHDb+Hi0Z0qLerYaU4Io1hxk6QCciCNToGwSzj+G+Cy1TH4 +# DTtgl4A+GRDFMG9dY745HfRVlxdMlYpIMMfoO1kGIQIDAQABo4ICAzCCAf8wHwYD +# VR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFM8QW3t1WsAl +# sCyglf8KFZDQkFOgMD4GA1UdIAQ3MDUwMwYGZ4EMAQQBMCkwJwYIKwYBBQUHAgEW +# G2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAOBgNVHQ8BAf8EBAMCB4AwEwYD +# VR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCBqjBToFGgT4ZNaHR0cDovL2Ny +# bDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0 +# MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0dHA6Ly9jcmw0LmRpZ2ljZXJ0 +# LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIw +# MjFDQTEuY3JsMIGUBggrBgEFBQcBAQSBhzCBhDAkBggrBgEFBQcwAYYYaHR0cDov +# L29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUFBzAChlBodHRwOi8vY2FjZXJ0cy5k +# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZT +# SEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQAb +# hocVBslPLkweNoXnzDyHjgUHVsdaBSxnKjHDTdOzXpo/a6VkK1VXK1fIhWYy4CcZ +# /wfyeb80+99KnfWWQzgL7nIElm4SkJRIMK8dODX3my4CQR6oSEsOimM1QUr8Gfio +# H98oQe8fhIQUOjnQsWiqbPzukx7ehCYnm2Xbu6nnSuvdzwFjiPykA91IFkVyP4Ex +# kf7JzWrFko4nceMXwtfGLB0jH1L+fmFUlAzXKNVIV/2GlXElSCMGHlUDy18D2hk+ +# nij2DT1Gp+PmSSBCmQVIr+6HJMVXdz3jCtE3nQGKfAT+M8dvvEIq//0+cpkZdJxQ +# ctnHK5qukn8InimLh7fK8B+gu08wPHAhdEAc2eNM5Mmw67iCKN2/9hGvoVQlrtYm +# Ta1YglDOm4G0uSwtGIoa8O4S2uZES75HpAXRtc/hzSCOdeHR52wCMCx91OXrJ1kz +# NxIWIJZCE3NlzwKFObOZKONRiHPpC8oEToY/cxhTIn3Gg/70emY8JMvJoVfyokbu +# NfteFha3Z/5wIoxkcW971JaP2Z2TO1StjGcKEZvUF2OW7PQ7Toh55AowUx2UuSZQ +# MioaOVUrhqxcYWSBobA1Y3mwvuRfAgMqrfQ+eIwWYX+t7qg9fNjTPtxlQViE1H3+ +# cRW9p8uV5rqJXhNzXmKYH8k4AZoUUOMnY//9ZE8TtjGCGiAwghocAgEBMH0waTEL +# MAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhE +# aWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAy +# MDIxIENBMQIQCa515Mk8F1Nt3H+pVOa4WTANBglghkgBZQMEAgEFAKB8MBAGCisG +# AQQBgjcCAQwxAjAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQB +# gjcCAQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCAHZUPKZVXcGpNc +# UB7Q/h1O9rGaDATEYdRrcxwGZovEnjANBgkqhkiG9w0BAQEFAASCAYBOP3Ho+po5 +# XLUDHTLze5ljcJMxgRepN06jPeufsK8S9WVM1gHurmvAfzY8dz2ov68M0rUWfKxF +# 1FdBUHLiFAbdVIozGMViF2noVCjSBFEcz6V7SO+nM2rN24mmeTMY8MUQQbxEQQIr +# A38NtTHpQs0Ab6qp74lMPhpdtO7W9goqYRdDhYqhhUXCrTxMwOYXaa8TmHdfLQXk +# BkvZH52Vf7hrFj907zlTYz7k7pc67BM6VDKG/rXsa+z57yKJBGsh0AIEFqpG3Vzi +# C83j2XIDDi/Gu80kCRjlbzlnvq1aurV1XAMr1kgYEV101L4vI6+BZ/kLCZKlheUc +# wXkdaPlVlY1zrVYgO4qCcubwevXpQdFAqeB12nswn6i5y0uBuOOQhJxzJLmQ2FrE +# qWPB6HDrp08upi+DsIl7xz8qcRHrZLeBMYvdLw7tMSOgIeLfFS/rKj7EdqCcs1h6 +# /aBa3MVPZHnfGzs9rOvtP2uBgrOcAep806q6CqD95bHFHZN+ZsDlRnqhghd2MIIX +# cgYKKwYBBAGCNwMDATGCF2IwghdeBgkqhkiG9w0BBwKgghdPMIIXSwIBAzEPMA0G +# CWCGSAFlAwQCAQUAMHcGCyqGSIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEw +# MTANBglghkgBZQMEAgEFAAQgi8XXHRMZUXNXuWbDRcl5gt8rK6pYDUTm1YrsyNFB +# kqYCEDoW9ExivtX6n5EQMMpBEBUYDzIwMjYwNDIwMTgyOTMyWqCCEzowggbtMIIE +# 1aADAgECAhAKgO8YS43xBYLRxHanlXRoMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNV +# BAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNl +# cnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYgMjAyNSBD +# QTEwHhcNMjUwNjA0MDAwMDAwWhcNMzYwOTAzMjM1OTU5WjBjMQswCQYDVQQGEwJV +# UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFNI +# QTI1NiBSU0E0MDk2IFRpbWVzdGFtcCBSZXNwb25kZXIgMjAyNSAxMIICIjANBgkq +# hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EasLRLGntDqrmBWsytXum9R/4ZwCgHf +# yjfMGUIwYzKomd8U1nH7C8Dr0cVMF3BsfAFI54um8+dnxk36+jx0Tb+k+87H9WPx +# NyFPJIDZHhAqlUPt281mHrBbZHqRK71Em3/hCGC5KyyneqiZ7syvFXJ9A72wzHpk +# BaMUNg7MOLxI6E9RaUueHTQKWXymOtRwJXcrcTTPPT2V1D/+cFllESviH8YjoPFv +# ZSjKs3SKO1QNUdFd2adw44wDcKgH+JRJE5Qg0NP3yiSyi5MxgU6cehGHr7zou1zn +# OM8odbkqoK+lJ25LCHBSai25CFyD23DZgPfDrJJJK77epTwMP6eKA0kWa3osAe8f +# cpK40uhktzUd/Yk0xUvhDU6lvJukx7jphx40DQt82yepyekl4i0r8OEps/FNO4ah +# fvAk12hE5FVs9HVVWcO5J4dVmVzix4A77p3awLbr89A90/nWGjXMGn7FQhmSlIUD +# y9Z2hSgctaepZTd0ILIUbWuhKuAeNIeWrzHKYueMJtItnj2Q+aTyLLKLM0MheP/9 +# w6CtjuuVHJOVoIJ/DtpJRE7Ce7vMRHoRon4CWIvuiNN1Lk9Y+xZ66lazs2kKFSTn +# nkrT3pXWETTJkhd76CIDBbTRofOsNyEhzZtCGmnQigpFHti58CSmvEyJcAlDVcKa +# cJ+A9/z7eacCAwEAAaOCAZUwggGRMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFOQ7 +# /PIx7f391/ORcWMZUEPPYYzoMB8GA1UdIwQYMBaAFO9vU0rp5AZ8esrikFb2L9RJ +# 7MtOMA4GA1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCBlQYI +# KwYBBQUHAQEEgYgwgYUwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0 +# LmNvbTBdBggrBgEFBQcwAoZRaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp +# Z2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIwMjVDQTEu +# Y3J0MF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E +# aWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYyMDI1Q0Ex +# LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJKoZIhvcN +# AQELBQADggIBAGUqrfEcJwS5rmBB7NEIRJ5jQHIh+OT2Ik/bNYulCrVvhREafBYF +# 0RkP2AGr181o2YWPoSHz9iZEN/FPsLSTwVQWo2H62yGBvg7ouCODwrx6ULj6hYKq +# dT8wv2UV+Kbz/3ImZlJ7YXwBD9R0oU62PtgxOao872bOySCILdBghQ/ZLcdC8cbU +# UO75ZSpbh1oipOhcUT8lD8QAGB9lctZTTOJM3pHfKBAEcxQFoHlt2s9sXoxFizTe +# HihsQyfFg5fxUFEp7W42fNBVN4ueLaceRf9Cq9ec1v5iQMWTFQa0xNqItH3CPFTG +# 7aEQJmmrJTV3Qhtfparz+BW60OiMEgV5GWoBy4RVPRwqxv7Mk0Sy4QHs7v9y69NB +# qycz0BZwhB9WOfOu/CIJnzkQTwtSSpGGhLdjnQ4eBpjtP+XB3pQCtv4E5UCSDag6 +# +iX8MmB10nfldPF9SVD7weCC3yXZi/uuhqdwkgVxuiMFzGVFwYbQsiGnoa9F5AaA +# yBjFBtXVLcKtapnMG3VH3EmAp/jsJ3FVF3+d1SVDTmjFjLbNFZUWMXuZyvgLfgyP +# ehwJVxwC+UpX2MSey2ueIu9THFVkT+um1vshETaWyQo8gmBto/m3acaP9QsuLj3F +# NwFlTxq25+T4QwX9xa6ILs84ZPvmpovq90K8eWyG2N01c4IhSOxqt81nMIIGtDCC +# BJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjANBgkqhkiG9w0BAQsFADBiMQswCQYD +# VQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGln +# aWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcN +# MjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5WjBpMQswCQYDVQQGEwJVUzEXMBUG +# A1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQg +# RzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMIICIjANBgkq +# hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx0wqYQXK+PEbAHKx126NGaHS0URed +# Ta2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz4aH+qbxeLho8I6jY3xL1IusLopuW +# 2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJgMQB3h2DZ0Mal5kYp77jYMVQXSZH +# ++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQbzIBHYJBYgzWIjk8eDrYhXDEpKk7 +# RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6bNMI1I7Gb5IBZK4ivbVCiZv7PNBY +# qHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJRfN20VRS3hpLgIR4hjzL0hpoYGk8 +# 1coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU14lDnki7CcoKCz6eum5A19WZQHkqU +# JfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDDjAmSFTUms+wV/FbWBqi7fTJnjq3h +# j0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cnT6Toy+rN+nM8M7LnLqCrO2JP3oW/ +# /1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq1BtmXUqEG1NqzJKS4kOmxkYp2WyO +# Di7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqgPrHRVHhGNKlYzyjlroPxul+bgIsp +# zOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0O +# BBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8GA1UdIwQYMBaAFOzX44LScV1kTN8u +# Zz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3 +# BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0 +# LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp +# Z2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDov +# L2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYD +# VR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4IC +# AQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfFiBowf0/Dm1wGc/Do7oVMY2mhXZXj +# DNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4/iEIUBO41P5F448rSYJ59Ib61eoa +# lhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/DMm/axFSgoR8n6c3nuZB9BfBwAQY +# K9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HRtrYfctSLANEBfHU16r3J05qX3kId +# +ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2o1f4MXRJDMdTSlOLh0HCn2cQLwQC +# qjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K9i697cvaiIo2p61Ed2p8xMJb82Yo +# sn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc3hsXMrS+U0yy+GWqAXam4ToWd2UQ +# 1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLiRu7hAWE6bTEm4XYRkA6Tl4KSFLFk +# 43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovRDiyx3zEd +# mcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8BlqmyIjl +# gp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBY0wggR1oAMCAQIC +# EA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UEBhMCVVMx +# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv +# bTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4XDTIyMDgw +# MTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTATBgNVBAoT +# DERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UE +# AxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0BAQEFAAOC +# Ag8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLhKac9WKt2 +# ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+vp+pVxZZ +# VXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMpLc7sXk7I +# k/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+nMNlW7sp7 +# XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1DekLgV9iPWC +# PhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmkwuapoGfd +# pCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0yt5LHucO +# Y67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP9yGyshG3 +# u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHhD5QMIR2y +# VCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnffEx1P2Ps +# IV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId5RsCAwEA +# AaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LScV1kTN8u +# Zz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA4GA1Ud +# DwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9v +# Y3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGln +# aWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNVHR8EPjA8 +# MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVk +# SURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0BAQwFAAOC +# AQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlUIu2kiHdt +# vRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqai7Je1M/R +# Q0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eHqNJMQBk1 +# RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01YBwCA8sg +# sKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ8LaHlv1b +# 0VysGMNNn3O3AamfV6peKOK5lDGCA3wwggN4AgEBMH0waTELMAkGA1UEBhMCVVMx +# FzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVz +# dGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENBMQIQCoDv +# GEuN8QWC0cR2p5V0aDANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0BCQMxDQYL +# KoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDQyMDE4MjkzMlowKwYLKoZI +# hvcNAQkQAgwxHDAaMBgwFgQU3WIwrIYKLTBr2jixaHlSMAf7QX4wLwYJKoZIhvcN +# AQkEMSIEICaY4QeE6Fmy2B4rhjFiAat3DCIilw2l/8ajeP/XH0wMMDcGCyqGSIb3 +# DQEJEAIvMSgwJjAkMCIEIEqgP6Is11yExVyTj4KOZ2ucrsqzP+NtJpqjNPFGEQoz +# MA0GCSqGSIb3DQEBAQUABIICAHC6pfwLarK8w2Q3D9tKscJgzURlt1TIeGT4eg9L +# Q5RcoCADVfnDY77cFdbzuuR/l0f8iEtBnLlFXcMKNhsn2c3QljZLZoCSG01HADAl +# YdIGO4vnKzC+EfIsButXKZWlBDbHGk45yAF4CpAHX3K27fyjKqD9Jee/owNdeXNE +# HKAqibVWtpbDeu5GoGa/b3lQj8SxIaDZ9Gy8RfNjOFtMaYf+M7deuiyJ657Q6o59 +# Vy99hzxvxoUI6LbyfKi1kL8Uvd+zSpj7H5N9+eCwDThPJqEB0vP9cNYEgnsRGBEh +# GytRuRJvffxiuYTEQkdR03Lr2NcmI93DcliLSPWFhyrR95+b+Z6mipKeNA4rx9fz +# I/IwW4eHEf6Ce99w2ZuDgT7c48BOgzYFQ3wRRMiav9IuRc1BJ3ujXrL3vuZxMQEG +# vNoy5+ivmvf+AwInTd2Qlncqi1XoWiSIwUN9esiRcvWrkSwM04wPd5q0QwXSBG2d +# AHFzKbBeyCnpcnMJz2STXP5uTEeauwpv9seAmF0RXGd7952M+mhdBmft7fILqKZk +# 6DrgTWCm9L5mB6JMXx9tfk7qBu/8AEFRItP/v4Q9x/MQ3OX18s3DIEYlBSIiUWkV +# fEpcEgXJEeFQmANUNx7BjeB2zH5XU5I1MiTGEiXo5uRLl2SYHds5N+q9cQ1AQUnA +# UoAe +# SIG # End signature block diff --git a/tools/packman/bootstrap/download_file_from_url.ps1 b/tools/packman/bootstrap/download_file_from_url.ps1 deleted file mode 100644 index df55745..0000000 --- a/tools/packman/bootstrap/download_file_from_url.ps1 +++ /dev/null @@ -1,53 +0,0 @@ -<# -Copyright 2019 NVIDIA CORPORATION - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -#> - -param( -[Parameter(Mandatory=$true)][string]$source=$null, -[string]$output="out.exe" -) -$filename = $output - -$triesLeft = 4 -$delay = 2 -do -{ - $triesLeft -= 1 - - try - { - Write-Host "Downloading from bootstrap.packman.nvidia.com ..." - $wc = New-Object net.webclient - $wc.Downloadfile($source, $fileName) - exit 0 - } - catch - { - Write-Host "Error downloading $source!" - Write-Host $_.Exception|format-list -force - if ($triesLeft) - { - Write-Host "Retrying in $delay seconds ..." - Start-Sleep -seconds $delay - } - $delay = $delay * $delay - } -} while ($triesLeft -gt 0) -# We only get here if the retries have been exhausted, remove any left-overs: -if (Test-Path $fileName) -{ - Remove-Item $fileName -} -exit 1 \ No newline at end of file diff --git a/tools/packman/bootstrap/fetch_file_from_packman_bootstrap.cmd b/tools/packman/bootstrap/fetch_file_from_packman_bootstrap.cmd deleted file mode 100644 index bf3a88d..0000000 --- a/tools/packman/bootstrap/fetch_file_from_packman_bootstrap.cmd +++ /dev/null @@ -1,35 +0,0 @@ -:: Copyright 2019 NVIDIA CORPORATION -:: -:: Licensed under the Apache License, Version 2.0 (the "License"); -:: you may not use this file except in compliance with the License. -:: You may obtain a copy of the License at -:: -:: http://www.apache.org/licenses/LICENSE-2.0 -:: -:: Unless required by applicable law or agreed to in writing, software -:: distributed under the License is distributed on an "AS IS" BASIS, -:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -:: See the License for the specific language governing permissions and -:: limitations under the License. - -:: You need to specify as input to this command -@setlocal -@set PACKAGE_NAME=%1 -@set TARGET_PATH=%2 - -@echo Fetching %PACKAGE_NAME% ... - -@powershell -ExecutionPolicy ByPass -NoLogo -NoProfile -File "%~dp0download_file_from_url.ps1" ^ - -source "http://bootstrap.packman.nvidia.com/%PACKAGE_NAME%" -output %TARGET_PATH% -:: A bug in powershell prevents the errorlevel code from being set when using the -File execution option -:: We must therefore do our own failure analysis, basically make sure the file exists: -@if not exist %TARGET_PATH% goto ERROR_DOWNLOAD_FAILED - -@endlocal -@exit /b 0 - -:ERROR_DOWNLOAD_FAILED -@echo Failed to download file from S3 -@echo Most likely because endpoint cannot be reached or file %PACKAGE_NAME% doesn't exist -@endlocal -@exit /b 1 \ No newline at end of file diff --git a/tools/packman/bootstrap/generate_temp_file_name.ps1 b/tools/packman/bootstrap/generate_temp_file_name.ps1 deleted file mode 100644 index aa3f004..0000000 --- a/tools/packman/bootstrap/generate_temp_file_name.ps1 +++ /dev/null @@ -1,161 +0,0 @@ -<# -Copyright 2019 NVIDIA CORPORATION - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -#> - -$out = [System.IO.Path]::GetTempFileName() -Write-Host $out -# SIG # Begin signature block -# MIIaVwYJKoZIhvcNAQcCoIIaSDCCGkQCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAK+Ewup1N0/mdf -# 1l4R58rxyumHgZvTmEhrYTb2Zf0zd6CCCiIwggTTMIIDu6ADAgECAhBi50XpIWUh -# PJcfXEkK6hKlMA0GCSqGSIb3DQEBCwUAMIGEMQswCQYDVQQGEwJVUzEdMBsGA1UE -# ChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0 -# IE5ldHdvcmsxNTAzBgNVBAMTLFN5bWFudGVjIENsYXNzIDMgU0hBMjU2IENvZGUg -# U2lnbmluZyBDQSAtIEcyMB4XDTE4MDcwOTAwMDAwMFoXDTIxMDcwOTIzNTk1OVow -# gYMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtT -# YW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMQ8wDQYDVQQL -# DAZJVC1NSVMxGzAZBgNVBAMMEk5WSURJQSBDb3Jwb3JhdGlvbjCCASIwDQYJKoZI -# hvcNAQEBBQADggEPADCCAQoCggEBALEZN63dA47T4i90jZ84CJ/aWUwVtLff8AyP -# YspFfIZGdZYiMgdb8A5tBh7653y0G/LZL6CVUkgejcpvBU/Dl/52a+gSWy2qJ2bH -# jMFMKCyQDhdpCAKMOUKSC9rfzm4cFeA9ct91LQCAait4LhLlZt/HF7aG+r0FgCZa -# HJjJvE7KNY9G4AZXxjSt8CXS8/8NQMANqjLX1r+F+Hl8PzQ1fVx0mMsbdtaIV4Pj -# 5flAeTUnz6+dCTx3vTUo8MYtkS2UBaQv7t7H2B7iwJDakEQKk1XHswJdeqG0osDU -# z6+NVks7uWE1N8UIhvzbw0FEX/U2kpfyWaB/J3gMl8rVR8idPj8CAwEAAaOCAT4w -# ggE6MAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF -# BwMDMGEGA1UdIARaMFgwVgYGZ4EMAQQBMEwwIwYIKwYBBQUHAgEWF2h0dHBzOi8v -# ZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUFBwICMBkMF2h0dHBzOi8vZC5zeW1jYi5j -# b20vcnBhMB8GA1UdIwQYMBaAFNTABiJJ6zlL3ZPiXKG4R3YJcgNYMCsGA1UdHwQk -# MCIwIKAeoByGGmh0dHA6Ly9yYi5zeW1jYi5jb20vcmIuY3JsMFcGCCsGAQUFBwEB -# BEswSTAfBggrBgEFBQcwAYYTaHR0cDovL3JiLnN5bWNkLmNvbTAmBggrBgEFBQcw -# AoYaaHR0cDovL3JiLnN5bWNiLmNvbS9yYi5jcnQwDQYJKoZIhvcNAQELBQADggEB -# AIJKh5vKJdhHJtMzATmc1BmXIQ3RaJONOZ5jMHn7HOkYU1JP0OIzb4pXXkH8Xwfr -# K6bnd72IhcteyksvKsGpSvK0PBBwzodERTAu1Os2N+EaakxQwV/xtqDm1E3IhjHk -# fRshyKKzmFk2Ci323J4lHtpWUj5Hz61b8gd72jH7xnihGi+LORJ2uRNZ3YuqMNC3 -# SBC8tAyoJqEoTJirULUCXW6wX4XUm5P2sx+htPw7szGblVKbQ+PFinNGnsSEZeKz -# D8jUb++1cvgTKH59Y6lm43nsJjkZU77tNqyq4ABwgQRk6lt8cS2PPwjZvTmvdnla -# ZhR0K4of+pQaUQHXVIBdji8wggVHMIIEL6ADAgECAhB8GzU1SufbdOdBXxFpymuo -# MA0GCSqGSIb3DQEBCwUAMIG9MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNp -# Z24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -# BAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -# IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmlj -# YXRpb24gQXV0aG9yaXR5MB4XDTE0MDcyMjAwMDAwMFoXDTI0MDcyMTIzNTk1OVow -# gYQxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEf -# MB0GA1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0d29yazE1MDMGA1UEAxMsU3ltYW50 -# ZWMgQ2xhc3MgMyBTSEEyNTYgQ29kZSBTaWduaW5nIENBIC0gRzIwggEiMA0GCSqG -# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXlUPU3N9nrjn7UqS2JjEEcOm3jlsqujdp -# NZWPu8Aw54bYc7vf69F2P4pWjustS/BXGE6xjaUz0wt1I9VqeSfdo9P3Dodltd6t -# HPH1NbQiUa8iocFdS5B/wFlOq515qQLXHkmxO02H/sJ4q7/vUq6crwjZOeWaUT5p -# XzAQTnFjbFjh8CAzGw90vlvLEuHbjMSAlHK79kWansElC/ujHJ7YpglwcezAR0yP -# fcPeGc4+7gRyjhfT//CyBTIZTNOwHJ/+pXggQnBBsCaMbwDIOgARQXpBsKeKkQSg -# mXj0d7TzYCrmbFAEtxRg/w1R9KiLhP4h2lxeffUpeU+wRHRvbXL/AgMBAAGjggF4 -# MIIBdDAuBggrBgEFBQcBAQQiMCAwHgYIKwYBBQUHMAGGEmh0dHA6Ly9zLnN5bWNk -# LmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMGYGA1UdIARfMF0wWwYLYIZIAYb4RQEH -# FwMwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYB -# BQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwNgYDVR0fBC8wLTAroCmg -# J4YlaHR0cDovL3Muc3ltY2IuY29tL3VuaXZlcnNhbC1yb290LmNybDATBgNVHSUE -# DDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwxGjAY -# BgNVBAMTEVN5bWFudGVjUEtJLTEtNzI0MB0GA1UdDgQWBBTUwAYiSes5S92T4lyh -# uEd2CXIDWDAfBgNVHSMEGDAWgBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG -# 9w0BAQsFAAOCAQEAf+vKp+qLdkLrPo4gVDDjt7nc+kg+FscPRZUQzSeGo2bzAu1x -# +KrCVZeRcIP5Un5SaTzJ8eCURoAYu6HUpFam8x0AkdWG80iH4MvENGggXrTL+QXt -# nK9wUye56D5+UaBpcYvcUe2AOiUyn0SvbkMo0yF1u5fYi4uM/qkERgSF9xWcSxGN -# xCwX/tVuf5riVpLxlrOtLfn039qJmc6yOETA90d7yiW5+ipoM5tQct6on9TNLAs0 -# vYsweEDgjY4nG5BvGr4IFYFd6y/iUedRHsl4KeceZb847wFKAQkkDhbEFHnBQTc0 -# 0D2RUpSd4WjvCPDiaZxnbpALGpNx1CYCw8BaIzGCD4swgg+HAgEBMIGZMIGEMQsw -# CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV -# BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxNTAzBgNVBAMTLFN5bWFudGVjIENs -# YXNzIDMgU0hBMjU2IENvZGUgU2lnbmluZyBDQSAtIEcyAhBi50XpIWUhPJcfXEkK -# 6hKlMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcN -# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw -# LwYJKoZIhvcNAQkEMSIEIPW+EpFrZSdzrjFFo0UT+PzFeYn/GcWNyWFaU/JMrMfR -# MA0GCSqGSIb3DQEBAQUABIIBAA8fmU/RJcF9t60DZZAjf8FB3EZddOaHgI9z40nV -# CnfTGi0OEYU48Pe9jkQQV2fABpACfW74xmNv3QNgP2qP++mkpKBVv28EIAuINsFt -# YAITEljLN/VOVul8lvjxar5GSFFgpE5F6j4xcvI69LuCWbN8cteTVsBGg+eGmjfx -# QZxP252z3FqPN+mihtFegF2wx6Mg6/8jZjkO0xjBOwSdpTL4uyQfHvaPBKXuWxRx -# ioXw4ezGAwkuBoxWK8UG7Qu+7CSfQ3wMOjvyH2+qn30lWEsvRMdbGAp7kvfr3EGZ -# a3WN7zXZ+6KyZeLeEH7yCDzukAjptaY/+iLVjJsuzC6tCSqhgg1EMIINQAYKKwYB -# BAGCNwMDATGCDTAwgg0sBgkqhkiG9w0BBwKggg0dMIINGQIBAzEPMA0GCWCGSAFl -# AwQCAQUAMHcGCyqGSIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglg -# hkgBZQMEAgEFAAQg14BnPazQkW9whhZu1d0bC3lqqScvxb3SSb1QT8e3Xg0CEFhw -# aMBZ2hExXhr79A9+bXEYDzIwMjEwNDA4MDkxMTA5WqCCCjcwggT+MIID5qADAgEC -# AhANQkrgvjqI/2BAIc4UAPDdMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVT -# MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -# b20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBp -# bmcgQ0EwHhcNMjEwMTAxMDAwMDAwWhcNMzEwMTA2MDAwMDAwWjBIMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xIDAeBgNVBAMTF0RpZ2lDZXJ0 -# IFRpbWVzdGFtcCAyMDIxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -# wuZhhGfFivUNCKRFymNrUdc6EUK9CnV1TZS0DFC1JhD+HchvkWsMlucaXEjvROW/ -# m2HNFZFiWrj/ZwucY/02aoH6KfjdK3CF3gIY83htvH35x20JPb5qdofpir34hF0e -# dsnkxnZ2OlPR0dNaNo/Go+EvGzq3YdZz7E5tM4p8XUUtS7FQ5kE6N1aG3JMjjfdQ -# Jehk5t3Tjy9XtYcg6w6OLNUj2vRNeEbjA4MxKUpcDDGKSoyIxfcwWvkUrxVfbENJ -# Cf0mI1P2jWPoGqtbsR0wwptpgrTb/FZUvB+hh6u+elsKIC9LCcmVp42y+tZji06l -# chzun3oBc/gZ1v4NSYS9AQIDAQABo4IBuDCCAbQwDgYDVR0PAQH/BAQDAgeAMAwG -# A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQQYDVR0gBDowODA2 -# BglghkgBhv1sBwEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5j -# b20vQ1BTMB8GA1UdIwQYMBaAFPS24SAd/imu0uRhpbKiJbLIFzVuMB0GA1UdDgQW -# BBQ2RIaOpLqwZr68KC0dRDbd42p6vDBxBgNVHR8EajBoMDKgMKAuhixodHRwOi8v -# Y3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDAyoDCgLoYsaHR0 -# cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwgYUGCCsG -# AQUFBwEBBHkwdzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t -# ME8GCCsGAQUFBzAChkNodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl -# cnRTSEEyQXNzdXJlZElEVGltZXN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUA -# A4IBAQBIHNy16ZojvOca5yAOjmdG/UJyUXQKI0ejq5LSJcRwWb4UoOUngaVNFBUZ -# B3nw0QTDhtk7vf5EAmZN7WmkD/a4cM9i6PVRSnh5Nnont/PnUp+Tp+1DnnvntN1B -# Ion7h6JGA0789P63ZHdjXyNSaYOC+hpT7ZDMjaEXcw3082U5cEvznNZ6e9oMvD0y -# 0BvL9WH8dQgAdryBDvjA4VzPxBFy5xtkSdgimnUVQvUtMjiB2vRgorq0Uvtc4GEk -# JU+y38kpqHNDUdq9Y9YfW5v3LhtPEx33Sg1xfpe39D+E68Hjo0mh+s6nv1bPull2 -# YYlffqe0jmd4+TaY4cso2luHpoovMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXa -# NpfCFTANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln -# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtE -# aWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEw -# MTA3MTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j -# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBT -# SEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEF -# AAOCAQ8AMIIBCgKCAQEAvdAy7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1N -# aH7ntqD0jbOI5Je/YyGQmL8TvFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vj -# RkcGGlV+Cyd+wKL1oODeIj8O/36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOo -# CXFr4M8iEA91z3FyTgqt30A6XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe -# /WZuVmEnKYmEUeaC50ZQ/ZQqLKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG -# 7z3N1k3vBkL9olMqT4UdxB08r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYD -# VR0OBBYEFPS24SAd/imu0uRhpbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuC -# MS1Ri6enIZ3zbcgPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -# MBMGA1UdJQQMMAoGCCsGAQUFBwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0 -# MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln -# aUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcw -# OAYKYIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2Vy -# dC5jb20vQ1BTMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGH -# VmnN793afKpjerN4zwY3QITvS4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqu -# mfgnoma/Capg33akOpMP+LLR2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuBy -# x5jWPGTlH0gQGF+JOGFNYkYkh2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraS -# Z/tTYYmo9WuWwPRYaQ18yAGxuSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh -# 5Fhgm7oMLSttosR+u8QlK0cCCHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2 -# skuiSpXY9aaOUjGCAk0wggJJAgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV -# BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0ECEA1C -# SuC+Ooj/YEAhzhQA8N0wDQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0G -# CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yMTA0MDgwOTExMDlaMCsGCyqG -# SIb3DQEJEAIMMRwwGjAYMBYEFOHXgqjhkb7va8oWkbWqtJSmJJvzMC8GCSqGSIb3 -# DQEJBDEiBCCHEAmNNj2zWjWYRfEi4FgzZvrI16kv/U2b9b3oHw6UVDANBgkqhkiG -# 9w0BAQEFAASCAQCdefEKh6Qmwx7xGCkrYi/A+/Cla6LdnYJp38eMs3fqTTvjhyDw -# HffXrwdqWy5/fgW3o3qJXqa5o7hLxYIoWSULOCpJRGdt+w7XKPAbZqHrN9elAhWJ -# vpBTCEaj7dVxr1Ka4NsoPSYe0eidDBmmvGvp02J4Z1j8+ImQPKN6Hv/L8Ixaxe7V -# mH4VtXIiBK8xXdi4wzO+A+qLtHEJXz3Gw8Bp3BNtlDGIUkIhVTM3Q1xcSEqhOLqo -# PGdwCw9acxdXNWWPjOJkNH656Bvmkml+0p6MTGIeG4JCeRh1Wpqm1ZGSoEcXNaof -# wOgj48YzI+dNqBD9i7RSWCqJr2ygYKRTxnuU -# SIG # End signature block diff --git a/tools/packman/bootstrap/generate_temp_folder.ps1 b/tools/packman/bootstrap/generate_temp_folder.ps1 deleted file mode 100644 index d34fc9c..0000000 --- a/tools/packman/bootstrap/generate_temp_folder.ps1 +++ /dev/null @@ -1,167 +0,0 @@ -<# -Copyright 2019 NVIDIA CORPORATION - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -#> - -param( -[Parameter(Mandatory=$true)][string]$parentPath=$null -) -[string] $name = [System.Guid]::NewGuid() -$out = Join-Path $parentPath $name -New-Item -ItemType Directory -Path ($out) | Out-Null -Write-Host $out - -# SIG # Begin signature block -# MIIaVwYJKoZIhvcNAQcCoIIaSDCCGkQCAQExDzANBglghkgBZQMEAgEFADB5Bgor -# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG -# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCB29nsqMEu+VmSF -# 7ckeVTPrEZ6hsXjOgPFlJm9ilgHUB6CCCiIwggTTMIIDu6ADAgECAhBi50XpIWUh -# PJcfXEkK6hKlMA0GCSqGSIb3DQEBCwUAMIGEMQswCQYDVQQGEwJVUzEdMBsGA1UE -# ChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNVBAsTFlN5bWFudGVjIFRydXN0 -# IE5ldHdvcmsxNTAzBgNVBAMTLFN5bWFudGVjIENsYXNzIDMgU0hBMjU2IENvZGUg -# U2lnbmluZyBDQSAtIEcyMB4XDTE4MDcwOTAwMDAwMFoXDTIxMDcwOTIzNTk1OVow -# gYMxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtT -# YW50YSBDbGFyYTEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMQ8wDQYDVQQL -# DAZJVC1NSVMxGzAZBgNVBAMMEk5WSURJQSBDb3Jwb3JhdGlvbjCCASIwDQYJKoZI -# hvcNAQEBBQADggEPADCCAQoCggEBALEZN63dA47T4i90jZ84CJ/aWUwVtLff8AyP -# YspFfIZGdZYiMgdb8A5tBh7653y0G/LZL6CVUkgejcpvBU/Dl/52a+gSWy2qJ2bH -# jMFMKCyQDhdpCAKMOUKSC9rfzm4cFeA9ct91LQCAait4LhLlZt/HF7aG+r0FgCZa -# HJjJvE7KNY9G4AZXxjSt8CXS8/8NQMANqjLX1r+F+Hl8PzQ1fVx0mMsbdtaIV4Pj -# 5flAeTUnz6+dCTx3vTUo8MYtkS2UBaQv7t7H2B7iwJDakEQKk1XHswJdeqG0osDU -# z6+NVks7uWE1N8UIhvzbw0FEX/U2kpfyWaB/J3gMl8rVR8idPj8CAwEAAaOCAT4w -# ggE6MAkGA1UdEwQCMAAwDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUF -# BwMDMGEGA1UdIARaMFgwVgYGZ4EMAQQBMEwwIwYIKwYBBQUHAgEWF2h0dHBzOi8v -# ZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUFBwICMBkMF2h0dHBzOi8vZC5zeW1jYi5j -# b20vcnBhMB8GA1UdIwQYMBaAFNTABiJJ6zlL3ZPiXKG4R3YJcgNYMCsGA1UdHwQk -# MCIwIKAeoByGGmh0dHA6Ly9yYi5zeW1jYi5jb20vcmIuY3JsMFcGCCsGAQUFBwEB -# BEswSTAfBggrBgEFBQcwAYYTaHR0cDovL3JiLnN5bWNkLmNvbTAmBggrBgEFBQcw -# AoYaaHR0cDovL3JiLnN5bWNiLmNvbS9yYi5jcnQwDQYJKoZIhvcNAQELBQADggEB -# AIJKh5vKJdhHJtMzATmc1BmXIQ3RaJONOZ5jMHn7HOkYU1JP0OIzb4pXXkH8Xwfr -# K6bnd72IhcteyksvKsGpSvK0PBBwzodERTAu1Os2N+EaakxQwV/xtqDm1E3IhjHk -# fRshyKKzmFk2Ci323J4lHtpWUj5Hz61b8gd72jH7xnihGi+LORJ2uRNZ3YuqMNC3 -# SBC8tAyoJqEoTJirULUCXW6wX4XUm5P2sx+htPw7szGblVKbQ+PFinNGnsSEZeKz -# D8jUb++1cvgTKH59Y6lm43nsJjkZU77tNqyq4ABwgQRk6lt8cS2PPwjZvTmvdnla -# ZhR0K4of+pQaUQHXVIBdji8wggVHMIIEL6ADAgECAhB8GzU1SufbdOdBXxFpymuo -# MA0GCSqGSIb3DQEBCwUAMIG9MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNp -# Z24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV -# BAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl -# IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmlj -# YXRpb24gQXV0aG9yaXR5MB4XDTE0MDcyMjAwMDAwMFoXDTI0MDcyMTIzNTk1OVow -# gYQxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEf -# MB0GA1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0d29yazE1MDMGA1UEAxMsU3ltYW50 -# ZWMgQ2xhc3MgMyBTSEEyNTYgQ29kZSBTaWduaW5nIENBIC0gRzIwggEiMA0GCSqG -# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDXlUPU3N9nrjn7UqS2JjEEcOm3jlsqujdp -# NZWPu8Aw54bYc7vf69F2P4pWjustS/BXGE6xjaUz0wt1I9VqeSfdo9P3Dodltd6t -# HPH1NbQiUa8iocFdS5B/wFlOq515qQLXHkmxO02H/sJ4q7/vUq6crwjZOeWaUT5p -# XzAQTnFjbFjh8CAzGw90vlvLEuHbjMSAlHK79kWansElC/ujHJ7YpglwcezAR0yP -# fcPeGc4+7gRyjhfT//CyBTIZTNOwHJ/+pXggQnBBsCaMbwDIOgARQXpBsKeKkQSg -# mXj0d7TzYCrmbFAEtxRg/w1R9KiLhP4h2lxeffUpeU+wRHRvbXL/AgMBAAGjggF4 -# MIIBdDAuBggrBgEFBQcBAQQiMCAwHgYIKwYBBQUHMAGGEmh0dHA6Ly9zLnN5bWNk -# LmNvbTASBgNVHRMBAf8ECDAGAQH/AgEAMGYGA1UdIARfMF0wWwYLYIZIAYb4RQEH -# FwMwTDAjBggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9jcHMwJQYIKwYB -# BQUHAgIwGRoXaHR0cHM6Ly9kLnN5bWNiLmNvbS9ycGEwNgYDVR0fBC8wLTAroCmg -# J4YlaHR0cDovL3Muc3ltY2IuY29tL3VuaXZlcnNhbC1yb290LmNybDATBgNVHSUE -# DDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCAQYwKQYDVR0RBCIwIKQeMBwxGjAY -# BgNVBAMTEVN5bWFudGVjUEtJLTEtNzI0MB0GA1UdDgQWBBTUwAYiSes5S92T4lyh -# uEd2CXIDWDAfBgNVHSMEGDAWgBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG -# 9w0BAQsFAAOCAQEAf+vKp+qLdkLrPo4gVDDjt7nc+kg+FscPRZUQzSeGo2bzAu1x -# +KrCVZeRcIP5Un5SaTzJ8eCURoAYu6HUpFam8x0AkdWG80iH4MvENGggXrTL+QXt -# nK9wUye56D5+UaBpcYvcUe2AOiUyn0SvbkMo0yF1u5fYi4uM/qkERgSF9xWcSxGN -# xCwX/tVuf5riVpLxlrOtLfn039qJmc6yOETA90d7yiW5+ipoM5tQct6on9TNLAs0 -# vYsweEDgjY4nG5BvGr4IFYFd6y/iUedRHsl4KeceZb847wFKAQkkDhbEFHnBQTc0 -# 0D2RUpSd4WjvCPDiaZxnbpALGpNx1CYCw8BaIzGCD4swgg+HAgEBMIGZMIGEMQsw -# CQYDVQQGEwJVUzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV -# BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxNTAzBgNVBAMTLFN5bWFudGVjIENs -# YXNzIDMgU0hBMjU2IENvZGUgU2lnbmluZyBDQSAtIEcyAhBi50XpIWUhPJcfXEkK -# 6hKlMA0GCWCGSAFlAwQCAQUAoHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcN -# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw -# LwYJKoZIhvcNAQkEMSIEIG5YDmcpqLxn4SB0H6OnuVkZRPh6OJ77eGW/6Su/uuJg -# MA0GCSqGSIb3DQEBAQUABIIBAA3N2vqfA6WDgqz/7EoAKVIE5Hn7xpYDGhPvFAMV -# BslVpeqE3apTcYFCEcwLtzIEc/zmpULxsX8B0SUT2VXbJN3zzQ80b+gbgpq62Zk+ -# dQLOtLSiPhGW7MXLahgES6Oc2dUFaQ+wDfcelkrQaOVZkM4wwAzSapxuf/13oSIk -# ZX2ewQEwTZrVYXELO02KQIKUR30s/oslGVg77ALnfK9qSS96Iwjd4MyT7PzCkHUi -# ilwyGJi5a4ofiULiPSwUQNynSBqxa+JQALkHP682b5xhjoDfyG8laR234FTPtYgs -# P/FaeviwENU5Pl+812NbbtRD+gKlWBZz+7FKykOT/CG8sZahgg1EMIINQAYKKwYB -# BAGCNwMDATGCDTAwgg0sBgkqhkiG9w0BBwKggg0dMIINGQIBAzEPMA0GCWCGSAFl -# AwQCAQUAMHcGCyqGSIb3DQEJEAEEoGgEZjBkAgEBBglghkgBhv1sBwEwMTANBglg -# hkgBZQMEAgEFAAQgJhABfkDIPbI+nWYnA30FLTyaPK+W3QieT21B/vK+CMICEDF0 -# worcGsdd7OxpXLP60xgYDzIwMjEwNDA4MDkxMTA5WqCCCjcwggT+MIID5qADAgEC -# AhANQkrgvjqI/2BAIc4UAPDdMA0GCSqGSIb3DQEBCwUAMHIxCzAJBgNVBAYTAlVT -# MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j -# b20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBp -# bmcgQ0EwHhcNMjEwMTAxMDAwMDAwWhcNMzEwMTA2MDAwMDAwWjBIMQswCQYDVQQG -# EwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xIDAeBgNVBAMTF0RpZ2lDZXJ0 -# IFRpbWVzdGFtcCAyMDIxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA -# wuZhhGfFivUNCKRFymNrUdc6EUK9CnV1TZS0DFC1JhD+HchvkWsMlucaXEjvROW/ -# m2HNFZFiWrj/ZwucY/02aoH6KfjdK3CF3gIY83htvH35x20JPb5qdofpir34hF0e -# dsnkxnZ2OlPR0dNaNo/Go+EvGzq3YdZz7E5tM4p8XUUtS7FQ5kE6N1aG3JMjjfdQ -# Jehk5t3Tjy9XtYcg6w6OLNUj2vRNeEbjA4MxKUpcDDGKSoyIxfcwWvkUrxVfbENJ -# Cf0mI1P2jWPoGqtbsR0wwptpgrTb/FZUvB+hh6u+elsKIC9LCcmVp42y+tZji06l -# chzun3oBc/gZ1v4NSYS9AQIDAQABo4IBuDCCAbQwDgYDVR0PAQH/BAQDAgeAMAwG -# A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQQYDVR0gBDowODA2 -# BglghkgBhv1sBwEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5j -# b20vQ1BTMB8GA1UdIwQYMBaAFPS24SAd/imu0uRhpbKiJbLIFzVuMB0GA1UdDgQW -# BBQ2RIaOpLqwZr68KC0dRDbd42p6vDBxBgNVHR8EajBoMDKgMKAuhixodHRwOi8v -# Y3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLXRzLmNybDAyoDCgLoYsaHR0 -# cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC10cy5jcmwwgYUGCCsG -# AQUFBwEBBHkwdzAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29t -# ME8GCCsGAQUFBzAChkNodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNl -# cnRTSEEyQXNzdXJlZElEVGltZXN0YW1waW5nQ0EuY3J0MA0GCSqGSIb3DQEBCwUA -# A4IBAQBIHNy16ZojvOca5yAOjmdG/UJyUXQKI0ejq5LSJcRwWb4UoOUngaVNFBUZ -# B3nw0QTDhtk7vf5EAmZN7WmkD/a4cM9i6PVRSnh5Nnont/PnUp+Tp+1DnnvntN1B -# Ion7h6JGA0789P63ZHdjXyNSaYOC+hpT7ZDMjaEXcw3082U5cEvznNZ6e9oMvD0y -# 0BvL9WH8dQgAdryBDvjA4VzPxBFy5xtkSdgimnUVQvUtMjiB2vRgorq0Uvtc4GEk -# JU+y38kpqHNDUdq9Y9YfW5v3LhtPEx33Sg1xfpe39D+E68Hjo0mh+s6nv1bPull2 -# YYlffqe0jmd4+TaY4cso2luHpoovMIIFMTCCBBmgAwIBAgIQCqEl1tYyG35B5AXa -# NpfCFTANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGln -# aUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtE -# aWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTYwMTA3MTIwMDAwWhcNMzEw -# MTA3MTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j -# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBT -# SEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBMIIBIjANBgkqhkiG9w0BAQEF -# AAOCAQ8AMIIBCgKCAQEAvdAy7kvNj3/dqbqCmcU5VChXtiNKxA4HRTNREH3Q+X1N -# aH7ntqD0jbOI5Je/YyGQmL8TvFfTw+F+CNZqFAA49y4eO+7MpvYyWf5fZT/gm+vj -# RkcGGlV+Cyd+wKL1oODeIj8O/36V+/OjuiI+GKwR5PCZA207hXwJ0+5dyJoLVOOo -# CXFr4M8iEA91z3FyTgqt30A6XLdR4aF5FMZNJCMwXbzsPGBqrC8HzP3w6kfZiFBe -# /WZuVmEnKYmEUeaC50ZQ/ZQqLKfkdT66mA+Ef58xFNat1fJky3seBdCEGXIX8RcG -# 7z3N1k3vBkL9olMqT4UdxB08r8/arBD13ays6Vb/kwIDAQABo4IBzjCCAcowHQYD -# VR0OBBYEFPS24SAd/imu0uRhpbKiJbLIFzVuMB8GA1UdIwQYMBaAFEXroq/0ksuC -# MS1Ri6enIZ3zbcgPMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGG -# MBMGA1UdJQQMMAoGCCsGAQUFBwMIMHkGCCsGAQUFBwEBBG0wazAkBggrBgEFBQcw -# AYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRwOi8v -# Y2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3J0 -# MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGln -# aUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsMy5kaWdp -# Y2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMFAGA1UdIARJMEcw -# OAYKYIZIAYb9bAACBDAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2Vy -# dC5jb20vQ1BTMAsGCWCGSAGG/WwHATANBgkqhkiG9w0BAQsFAAOCAQEAcZUS6VGH -# VmnN793afKpjerN4zwY3QITvS4S/ys8DAv3Fp8MOIEIsr3fzKx8MIVoqtwU0HWqu -# mfgnoma/Capg33akOpMP+LLR2HwZYuhegiUexLoceywh4tZbLBQ1QwRostt1AuBy -# x5jWPGTlH0gQGF+JOGFNYkYkh2OMkVIsrymJ5Xgf1gsUpYDXEkdws3XVk4WTfraS -# Z/tTYYmo9WuWwPRYaQ18yAGxuSh1t5ljhSKMYcp5lH5Z/IwP42+1ASa2bKXuh1Eh -# 5Fhgm7oMLSttosR+u8QlK0cCCHxJrhO24XxCQijGGFbPQTS2Zl22dHv1VjMiLyI2 -# skuiSpXY9aaOUjGCAk0wggJJAgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK -# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNV -# BAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0ECEA1C -# SuC+Ooj/YEAhzhQA8N0wDQYJYIZIAWUDBAIBBQCggZgwGgYJKoZIhvcNAQkDMQ0G -# CyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yMTA0MDgwOTExMDlaMCsGCyqG -# SIb3DQEJEAIMMRwwGjAYMBYEFOHXgqjhkb7va8oWkbWqtJSmJJvzMC8GCSqGSIb3 -# DQEJBDEiBCDvFxQ6lYLr8vB+9czUl19rjCw1pWhhUXw/SqOmvIa/VDANBgkqhkiG -# 9w0BAQEFAASCAQB9ox2UrcUXQsBI4Uycnhl4AMpvhVXJME62tygFMppW1l7QftDy -# LvfPKRYm2YUioak/APxAS6geRKpeMkLvXuQS/Jlv0kY3BjxkeG0eVjvyjF4SvXbZ -# 3JCk9m7wLNE+xqOo0ICjYlIJJgRLudjWkC5Skpb1NpPS8DOaIYwRV+AWaSOUPd9P -# O5yVcnbl7OpK3EAEtwDrybCVBMPn2MGhAXybIHnth3+MFp1b6Blhz3WlReQyarjq -# 1f+zaFB79rg6JswXoOTJhwICBP3hO2Ua3dMAswbfl+QNXF+igKLJPYnaeSVhBbm6 -# VCu2io27t4ixqvoD0RuPObNX/P3oVA38afiM -# SIG # End signature block diff --git a/tools/packman/bootstrap/install_package.py b/tools/packman/bootstrap/install_package.py index 4542c4b..a033759 100644 --- a/tools/packman/bootstrap/install_package.py +++ b/tools/packman/bootstrap/install_package.py @@ -22,7 +22,6 @@ import time import hashlib from typing import Any, Callable, Union - RENAME_RETRY_COUNT = 100 RENAME_RETRY_DELAY = 0.1 @@ -142,7 +141,7 @@ def generate_sha256_for_file(file_path: Union[str, os.PathLike]) -> str: def install_common_module(package_path, install_path): - COMMON_SHA256 = "0a2064434cca0170411c86f23349f9618556dc380d3589a2361db38ffeea9cac" + COMMON_SHA256 = "d6c75a6112b9c341b6f024bef3e141ac24287f20746956860365df103b9a3faa" package_sha256 = generate_sha256_for_file(package_path) if package_sha256 != COMMON_SHA256: raise RuntimeError( diff --git a/tools/packman/packman b/tools/packman/packman index b222d30..0df6c4c 100644 --- a/tools/packman/packman +++ b/tools/packman/packman @@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2019-2023 NVIDIA CORPORATION +# Copyright 2019-2025 NVIDIA CORPORATION # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -13,8 +13,11 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -SAVED_SETTINGS="$-" -set -eu +SAVED_SETTINGS=`echo $-` +# Fail on undefined variables +set -u +# Don't exit on errors +set +e if echo ${PM_VERBOSITY-} | grep -i "debug" > /dev/null ; then set -x @@ -24,169 +27,271 @@ else PM_CURL_SILENT="-s -S" PM_WGET_QUIET="--quiet" fi -export PM_PACKMAN_VERSION=7.23.1 +export PM_PACKMAN_VERSION=8.7.0 -# This is necessary for newer macOS -if [ `uname` == 'Darwin' ]; then - export LC_ALL=en_US.UTF-8 - export LANG=en_US.UTF-8 -fi -# We cannot rely on realpath, it isn't installed on macOS and some Linux distros -get_abs_filename() { - echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" -} +cleanup() { + # Remove temporary variable file if it exists + if [[ -n "${PM_VAR_PATH:-}" && -f "$PM_VAR_PATH" ]]; then + rm -f "$PM_VAR_PATH" + fi + if [[ -n "${PM_VAR_DIR:-}" && -d "$PM_VAR_DIR" ]]; then + rmdir "$PM_VAR_DIR" + fi -# Specify where packman command exists -export PM_INSTALL_PATH="$(get_abs_filename "$(dirname "${BASH_SOURCE}")")" + # Restore the settings we may have altered during our run + if [[ "$SAVED_SETTINGS" == *"e"* ]]; then + set -e + fi -# The packages root may already be configured by the user -if [ -z "${PM_PACKAGES_ROOT:-}" ]; then - # Set variable temporarily in this process so that the following execution will work - if [ `uname` == 'Darwin' ]; then - export PM_PACKAGES_ROOT="${HOME}/Library/Application Support/packman-cache" - else - if [ -z "${XDG_CACHE_HOME:-}" ]; then - export PM_PACKAGES_ROOT="${HOME}/.cache/packman" - else - export PM_PACKAGES_ROOT="${XDG_CACHE_HOME}/packman" - fi - fi -fi + if [[ "$SAVED_SETTINGS" != *"x"* ]]; then + set +x + fi -# Ensure the packages root path exists: -if [ ! -d "$PM_PACKAGES_ROOT" ]; then - echo "Creating packman packages cache at $PM_PACKAGES_ROOT" - mkdir -p -m a+rwx "$PM_PACKAGES_ROOT" -fi - -fetch_file_from_s3() -{ - SOURCE=$1 - SOURCE_URL=http://bootstrap.packman.nvidia.com/$SOURCE - TARGET=$2 - echo "Fetching $SOURCE from bootstrap.packman.nvidia.com ..." - if command -v wget >/dev/null 2>&1; then - wget $PM_WGET_QUIET -O$TARGET $SOURCE_URL - else - curl -o $TARGET $SOURCE_URL $PM_CURL_SILENT - fi -} - -generate_temp_file_name() -{ - if [ `uname` == "Darwin" ]; then - local tmpfile=`mktemp -t packman` - else - local tmpfile=`mktemp -t packman.XXXXXXXX` - fi - echo "$tmpfile" -} - -install_python() -{ - PLATFORM=`uname` - PROCESSOR=`uname -m` - PYTHON_VERSION=3.10.5-1 - - if [ $PLATFORM == 'Darwin' ]; then - PYTHON_PACKAGE=$PYTHON_VERSION-macos-x86_64 - elif [ $PLATFORM == 'Linux' ] && [ $PROCESSOR == 'x86_64' ]; then - PYTHON_PACKAGE=$PYTHON_VERSION-linux-x86_64 - elif [ $PLATFORM == 'Linux' ] && [ $PROCESSOR == 'aarch64' ]; then - PYTHON_PACKAGE=$PYTHON_VERSION-linux-aarch64 - else - echo "Operating system not supported" - exit 1 - fi - - PYTHON_INSTALL_FOLDER="$PM_PACKAGES_ROOT/python/$PYTHON_PACKAGE" - if [ ! -d "$PYTHON_INSTALL_FOLDER" ]; then - mkdir -p "$PYTHON_INSTALL_FOLDER" - fi - - export PM_PYTHON="$PYTHON_INSTALL_FOLDER/python" - - if [ ! -f "$PM_PYTHON" ]; then - PYTHON_PACKAGE_TMP=$(generate_temp_file_name) - fetch_file_from_s3 "python@$PYTHON_PACKAGE.tar.gz" "$PYTHON_PACKAGE_TMP" - if [ "$?" -eq "0" ]; then - echo "Unpacking python" - tar -xf "$PYTHON_PACKAGE_TMP" -C "$PYTHON_INSTALL_FOLDER" - rm "$PYTHON_PACKAGE_TMP" - else - echo "Failed downloading the Python interpreter" - exit $? - fi - fi -} - -# Ensure python is available: -if [ -z "${PM_PYTHON_EXT:-}" ]; then - install_python -else - PM_PYTHON="$PM_PYTHON_EXT" -fi - -# The packman module may be externally configured -if [ -z "${PM_MODULE_DIR_EXT:-}" ]; then - PM_MODULE_DIR="$PM_PACKAGES_ROOT/packman-common/$PM_PACKMAN_VERSION" -else - PM_MODULE_DIR="$PM_MODULE_DIR_EXT" -fi -export PM_MODULE="$PM_MODULE_DIR/run.py" - -# Ensure the packman package exists: -if [ ! -f "$PM_MODULE" ]; then - # Remove a previously corrupt packman-common if it's there - if [ -d "$PM_MODULE_DIR" ]; then - rm -rf "$PM_MODULE_DIR" - fi - PM_MODULE_PACKAGE="packman-common@$PM_PACKMAN_VERSION.zip" - TARGET=$(generate_temp_file_name) - # We always fetch packman from S3: - fetch_file_from_s3 "$PM_MODULE_PACKAGE" "$TARGET" - if [ "$?" -eq "0" ]; then - echo "Unpacking ..." - "$PM_PYTHON" -S -s -u -E "$PM_INSTALL_PATH/bootstrap/install_package.py" "$TARGET" "$PM_MODULE_DIR" - rm "$TARGET" - else - echo "Failure while fetching packman module from S3!" - exit 1 - fi -fi - -# Generate temporary file name for environment variables: -PM_VAR_PATH=`mktemp -u -t tmp.$$.pmvars.XXXXXX` - -if [ $# -ne 0 ] - then - PM_VAR_PATH_ARG=--var-path="$PM_VAR_PATH" -fi - -"$PM_PYTHON" -S -s -u -E "$PM_MODULE" "$@" ${PM_VAR_PATH_ARG:-} -exit_code=$? -# Export the variables if the file was used and remove the file: -if [ -f "$PM_VAR_PATH" ]; then - while read -r line - do - if [ ${#line} -gt 0 ]; then - export "$line" - fi - done < "$PM_VAR_PATH" - rm -f "$PM_VAR_PATH" -fi - -# avoid leaking -e and -u into the host script if they weren't originally set -if [[ ! ( "$SAVED_SETTINGS" =~ e ) ]]; then - set +e -fi - -if [[ ! ( "$SAVED_SETTINGS" =~ u ) ]]; then + # the e setting is always set in source mode so we remove it here so it + # doesn't leak (in regular ./ execution doesn't matter) set +u -fi +} -# Return the exit code from python -if [ "$exit_code" != 0 ]; then - exit "$exit_code" +main() { + # This is necessary for newer macOS + if [ `uname` == 'Darwin' ]; then + export LC_ALL=en_US.UTF-8 + export LANG=en_US.UTF-8 + fi + + # We cannot rely on realpath, it isn't installed on macOS and some Linux distros + get_abs_filename() { + echo "$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" + } + + # Specify where packman command exists + export PM_INSTALL_PATH="$(get_abs_filename "$(dirname "${BASH_SOURCE}")")" + + # The packages root may already be configured by the user + if [ -z "${PM_PACKAGES_ROOT:-}" ]; then + # Set variable temporarily in this process so that the following execution will work + if [ `uname` == 'Darwin' ]; then + export PM_PACKAGES_ROOT="${HOME}/Library/Application Support/packman-cache" + else + if [ -z "${XDG_CACHE_HOME:-}" ]; then + export PM_PACKAGES_ROOT="${HOME}/.cache/packman" + else + export PM_PACKAGES_ROOT="${XDG_CACHE_HOME}/packman" + fi + fi + fi + + # Ensure the packages root path exists: + if [ ! -d "$PM_PACKAGES_ROOT" ]; then + echo "Creating packman packages cache at $PM_PACKAGES_ROOT" + mkdir -p "$PM_PACKAGES_ROOT" || return 1 + fi + + execute_with_retry() + { + local CMD="$1" + local MAX_TRIES=4 + local DELAY=2 + local TRIES=0 + local exit_code + + while [ $TRIES -lt $MAX_TRIES ] + do + ((TRIES++)) + eval $CMD + exit_code=$? + if [ $exit_code -eq 0 ]; then + return 0 + fi + + if [ $TRIES -lt $MAX_TRIES ]; then + echo "Attempt $TRIES failed. Retrying in $DELAY seconds ..." + sleep $DELAY + DELAY=$((DELAY * DELAY)) + echo "Retrying ..." + fi + done + + echo "Command failed after $MAX_TRIES attempts: $CMD" + return $exit_code + } + + fetch_file_from_s3() + { + local SOURCE=$1 + local SOURCE_URL=https://bootstrap.packman.nvidia.com/$SOURCE + local TARGET=$2 + echo "Fetching $SOURCE from bootstrap.packman.nvidia.com ..." + local CMD="curl -o $TARGET $SOURCE_URL $PM_CURL_SILENT" + if command -v wget >/dev/null 2>&1; then + CMD="wget $PM_WGET_QUIET -O$TARGET $SOURCE_URL" + fi + execute_with_retry "$CMD" + return $? + } + + generate_temp_file_name() + { + if [ `uname` == "Darwin" ]; then + local tmpfile=`mktemp -t packman` + else + local tmpfile=`mktemp -t packman.XXXXXXXX` + fi + echo "$tmpfile" + } + + install_python() + { + PLATFORM=`uname` + PROCESSOR=`uname -m` + PYTHON_VERSION=3.12.15-nv1-pf + PYTHON_EXE=python + PYTHON_CONTAINER=tar.gz + + if [ $PLATFORM == 'Darwin' ]; then + PYTHON_PACKAGE=3.12.15-macos-aarch64 + elif [ $PLATFORM == 'Linux' ] && [ $PROCESSOR == 'x86_64' ]; then + PYTHON_PACKAGE=$PYTHON_VERSION-manylinux_2_35-x86_64 + elif [ $PLATFORM == 'Linux' ] && [ $PROCESSOR == 'aarch64' ]; then + PYTHON_PACKAGE=$PYTHON_VERSION-manylinux_2_35-aarch64 + elif [[ $PLATFORM =~ ^MINGW.* ]] && [ $PROCESSOR == 'x86_64' ]; then + PYTHON_PACKAGE=$PYTHON_VERSION-windows-x86_64 + PYTHON_EXE=python.exe + PYTHON_CONTAINER=zip + else + echo "Operating system not supported" + return 1 + fi + + PYTHON_INSTALL_ROOT="$PM_PACKAGES_ROOT/python" + PYTHON_INSTALL_FOLDER="$PYTHON_INSTALL_ROOT/$PYTHON_PACKAGE" + export PM_PYTHON="$PYTHON_INSTALL_FOLDER/$PYTHON_EXE" + + if [ ! -f "$PM_PYTHON" ]; then + mkdir -p "$PYTHON_INSTALL_ROOT" || return 1 + + PYTHON_PACKAGE_TMP="" + PYTHON_INSTALL_STAGING_PARENT="" + PYTHON_INSTALL_STATUS=0 + cleanup_python_install() + { + local CLEANUP_STATUS=0 + if [ -n "$PYTHON_PACKAGE_TMP" ]; then + rm -f "$PYTHON_PACKAGE_TMP" || CLEANUP_STATUS=1 + fi + if [ -n "$PYTHON_INSTALL_STAGING_PARENT" ]; then + rm -rf "$PYTHON_INSTALL_STAGING_PARENT" || CLEANUP_STATUS=1 + fi + return $CLEANUP_STATUS + } + + PYTHON_PACKAGE_TMP=$(generate_temp_file_name) + fetch_file_from_s3 "python@$PYTHON_PACKAGE.$PYTHON_CONTAINER" "$PYTHON_PACKAGE_TMP" || PYTHON_INSTALL_STATUS=1 + + if [ $PYTHON_INSTALL_STATUS -eq 0 ]; then + PYTHON_INSTALL_STAGING_PARENT=$(mktemp -d "$PYTHON_INSTALL_ROOT/$PYTHON_PACKAGE.tmp.XXXXXXXX") || PYTHON_INSTALL_STATUS=1 + fi + + if [ $PYTHON_INSTALL_STATUS -eq 0 ]; then + PYTHON_INSTALL_TMP="$PYTHON_INSTALL_STAGING_PARENT/$PYTHON_PACKAGE" + mkdir "$PYTHON_INSTALL_TMP" || PYTHON_INSTALL_STATUS=1 + fi + + if [ $PYTHON_INSTALL_STATUS -eq 0 ]; then + echo "Unpacking python" + if [ "$PYTHON_CONTAINER" == "zip" ]; then + unzip -q "$PYTHON_PACKAGE_TMP" -d "$PYTHON_INSTALL_TMP" || PYTHON_INSTALL_STATUS=1 + else + tar -xf "$PYTHON_PACKAGE_TMP" -C "$PYTHON_INSTALL_TMP" || PYTHON_INSTALL_STATUS=1 + fi + fi + + if [ $PYTHON_INSTALL_STATUS -eq 0 ]; then + # Move a version-named child into the install root instead of moving the + # unique temp folder directly to $PYTHON_INSTALL_FOLDER. If another + # process has already created $PYTHON_INSTALL_FOLDER, plain mv treats + # that existing folder as a parent and may nest the source inside it. + # Keeping the source basename equal to $PYTHON_PACKAGE makes that + # competing install fail cleanly instead. + mv "$PYTHON_INSTALL_TMP" "$PYTHON_INSTALL_ROOT" 2> /dev/null || { + if [ ! -f "$PM_PYTHON" ]; then + echo "Failed to install Python to '$PYTHON_INSTALL_FOLDER'. Please remove the directory and try again." + PYTHON_INSTALL_STATUS=1 + fi + } + fi + + cleanup_python_install || PYTHON_INSTALL_STATUS=1 + return $PYTHON_INSTALL_STATUS + fi + } + + # Ensure python is available: + if [ -z "${PM_PYTHON_EXT:-}" ]; then + install_python || return 1 + else + PM_PYTHON="$PM_PYTHON_EXT" + fi + + # The packman module may be externally configured + if [ -z "${PM_MODULE_DIR_EXT:-}" ]; then + PM_MODULE_DIR="$PM_PACKAGES_ROOT/packman-common/$PM_PACKMAN_VERSION" + else + PM_MODULE_DIR="$PM_MODULE_DIR_EXT" + fi + export PM_MODULE="$PM_MODULE_DIR/run.py" + + # Ensure the packman package exists: + if [ ! -f "$PM_MODULE" ]; then + # Remove a previously corrupt packman-common if it's there + if [ -d "$PM_MODULE_DIR" ]; then + rm -rf "$PM_MODULE_DIR" || return 1 + fi + PM_MODULE_PACKAGE="packman-common@$PM_PACKMAN_VERSION.zip" + TARGET=$(generate_temp_file_name) + # We always fetch packman from S3: + fetch_file_from_s3 "$PM_MODULE_PACKAGE" "$TARGET" || return 1 + echo "Unpacking ..." + "$PM_PYTHON" -S -s -u -E "$PM_INSTALL_PATH/bootstrap/install_package.py" "$TARGET" "$PM_MODULE_DIR" || return 1 + rm "$TARGET" || return 1 + fi + + # Use a private directory so the variable file cannot be replaced before Python opens it. + PM_VAR_DIR=$(mktemp -d -t tmp.$$.pmvars.XXXXXX) || return 1 + PM_VAR_PATH="$PM_VAR_DIR/variables" + + if [ $# -ne 0 ]; then + PM_VAR_PATH_ARG=--var-path="$PM_VAR_PATH" + else + PM_VAR_PATH_ARG="" + fi + + "$PM_PYTHON" -S -s -u -E "$PM_MODULE" "$@" ${PM_VAR_PATH_ARG:-} || return 1 + # Export the variables if the file was used: + if [ -f "$PM_VAR_PATH" ]; then + while read -r line + do + name=${line%%=*} + if [[ "$line" == *=* && "$name" == PM_* && "$name" != *[!A-Za-z0-9_]* ]]; then + export "$line" + fi + done < "$PM_VAR_PATH" + fi + + # Return success + return 0 +} + +main "$@" +exit_code=$? +cleanup + +# Determine execution context and return accordingly +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + # This is direct execution + exit $exit_code +else + # This is sourced execution + return $exit_code fi diff --git a/tools/packman/packman.cmd b/tools/packman/packman.cmd index e55b2f0..9cd0fcb 100644 --- a/tools/packman/packman.cmd +++ b/tools/packman/packman.cmd @@ -1,9 +1,13 @@ -:: RUN_PM_MODULE must always be at the same spot for packman update to work (batch reloads file during update!) -:: [xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx] -:: Reset errorlevel status (don't inherit from caller) +:: SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +:: SPDX-License-Identifier: Apache-2.0 +:: pad [x] @call :ECHO_AND_RESET_ERROR -:: You can remove this section if you do your own manual configuration of the dev machines +set PM_PACKMAN_VERSION=8.7.0 +set PM_PYTHON_VERSION=3.12.15-nv1-pf-windows-x86_64 +set PM_PACKMAN_COMMON_SHA256=d6c75a6112b9c341b6f024bef3e141ac24287f20746956860365df103b9a3faa + +:: Optional configuration for local dev call :CONFIGURE if %errorlevel% neq 0 ( exit /b %errorlevel% ) @@ -21,8 +25,9 @@ if "%1"=="install" goto :SET_VAR_PATH if %errorlevel% neq 0 ( exit /b %errorlevel% ) :: Marshall environment variables into the current environment if they have been generated and remove temporary file +if not defined PM_VAR_PATH_ARG goto :eof if exist "%PM_VAR_PATH%" ( - for /F "usebackq tokens=*" %%A in ("%PM_VAR_PATH%") do set "%%A" + for /F "usebackq tokens=*" %%A in (`findstr /R /X "PM_[A-Za-z0-9_]*=.*" "%PM_VAR_PATH%"`) do set "%%A" ) if %errorlevel% neq 0 ( goto :VAR_ERROR ) @@ -36,11 +41,11 @@ goto :eof :: Subroutines below :PYTHON_ENV_ERROR -@echo User environment variable PM_PYTHON is not set! Please configure machine for packman or call configure.bat. +@echo User environment variable PM_PYTHON is not set! Please configure machine for packman or call configure.ps1. exit /b 1 :MODULE_ENV_ERROR -@echo User environment variable PM_MODULE is not set! Please configure machine for packman or call configure.bat. +@echo User environment variable PM_MODULE is not set! Please configure machine for packman or call configure.ps1. exit /b 1 :VAR_ERROR @@ -75,11 +80,17 @@ if %errorlevel% equ 0 ( :: trim leading space (this is safe even when PM_OLD_CODE_PAGE has not been set) set PM_OLD_CODE_PAGE=%PM_OLD_CODE_PAGE:~1% if "%PM_OLD_CODE_PAGE%" equ "65001" ( - chcp 437 > nul - set PM_RESTORE_CODE_PAGE=1 + chcp 437 > nul 2>&1 && set PM_RESTORE_CODE_PAGE=1 +) +:: Capture configure.ps1 stdout directly via `for /f` instead of a shared file since those get messy +:: and we can run into race conditions. The trailing `&& echo PM_CONFIGURE_OK=1` sentinel lets us +:: recover the exit status that `for /f` would otherwise swallow. +set PM_CONFIG_ERRORLEVEL=1 +for /f "delims=" %%A in ('powershell -ExecutionPolicy ByPass -NoLogo -NoProfile -File "%~dp0\bootstrap\configure.ps1" -PackmanVersion "%PM_PACKMAN_VERSION%" -PythonVersion "%PM_PYTHON_VERSION%" -PackmanCommonSha256 "%PM_PACKMAN_COMMON_SHA256%" ^&^& echo PM_CONFIGURE_OK^=1') do set "%%A" +if defined PM_CONFIGURE_OK ( + set PM_CONFIG_ERRORLEVEL=0 + set "PM_CONFIGURE_OK=" ) -call "%~dp0\bootstrap\configure.bat" -set PM_CONFIG_ERRORLEVEL=%errorlevel% if defined PM_RESTORE_CODE_PAGE ( :: Restore code page chcp %PM_OLD_CODE_PAGE% > nul diff --git a/tools/packman/packmanconf.py b/tools/packman/packmanconf.py index db220d2..b7c81ec 100644 --- a/tools/packman/packmanconf.py +++ b/tools/packman/packmanconf.py @@ -28,6 +28,25 @@ import os import platform import sys +MIN_PYTHON_VERSION = (3, 10, 0) +MAX_PYTHON_VERSION = (3, 12, 15) + + +def is_valid_python_version(version: tuple[int, int, int] = sys.version_info[:3]): + return MIN_PYTHON_VERSION <= version <= MAX_PYTHON_VERSION + + +def validate_python_version(version: tuple[int, int, int] = sys.version_info[:3]): + if not is_valid_python_version(version): + + def ver_str(pyver): + return ".".join(str(x) for x in pyver) + + raise RuntimeError( + f"This version of packman requires Python {ver_str(MIN_PYTHON_VERSION)} " + f"up to {ver_str(MAX_PYTHON_VERSION)}, but {ver_str(version)} was provided" + ) + def init(): """Call this function to initialize the packman configuration. @@ -46,17 +65,7 @@ def init(): >>> import packmanapi >>> packmanapi.set_verbosity_level(packmanapi.VERBOSITY_HIGH) """ - major = sys.version_info.major - minor = sys.version_info.minor - patch = sys.version_info.micro - if major == 3 and (minor == 10 or (minor == 11 and patch <= 2)): - # we are good - pass - else: - raise RuntimeError( - f"This version of packman requires Python 3.10.0 up to 3.11.2, " - f"but {major}.{minor}.{patch} was provided" - ) + validate_python_version() conf_dir = os.path.dirname(os.path.abspath(__file__)) os.environ["PM_INSTALL_PATH"] = conf_dir packages_root = get_packages_root(conf_dir) @@ -79,7 +88,7 @@ def get_packages_root(conf_dir: str) -> str: ) elif platform_name == "Linux": try: - cache_root = os.environ["XDG_HOME_CACHE"] + cache_root = os.environ["XDG_CACHE_HOME"] except KeyError: cache_root = os.path.join(os.path.expanduser("~"), ".cache") return os.path.join(cache_root, "packman") @@ -98,7 +107,10 @@ def get_module_dir(conf_dir, packages_root: str, version: str) -> str: tf = tempfile.NamedTemporaryFile(delete=False) target_name = tf.name tf.close() - url = f"http://bootstrap.packman.nvidia.com/packman-common@{version}.zip" + # Forced to change to https because some customers will simply not allow http, + # even when it's used in a safe way (with download checksum verification). + # See issue #367 for more background. + url = f"https://bootstrap.packman.nvidia.com/packman-common@{version}.zip" print(f"Downloading '{url}' ...") import urllib.request diff --git a/tools/packman/python.bat b/tools/packman/python.bat index 08df74f..cdfdbc9 100644 --- a/tools/packman/python.bat +++ b/tools/packman/python.bat @@ -1,16 +1,5 @@ -:: Copyright 2019-2020 NVIDIA CORPORATION -:: -:: Licensed under the Apache License, Version 2.0 (the "License"); -:: you may not use this file except in compliance with the License. -:: You may obtain a copy of the License at -:: -:: http://www.apache.org/licenses/LICENSE-2.0 -:: -:: Unless required by applicable law or agreed to in writing, software -:: distributed under the License is distributed on an "AS IS" BASIS, -:: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -:: See the License for the specific language governing permissions and -:: limitations under the License. +:: SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +:: SPDX-License-Identifier: Apache-2.0 @echo off setlocal enableextensions diff --git a/tools/packman/python.sh b/tools/packman/python.sh index 74328bf..cae90e3 100755 --- a/tools/packman/python.sh +++ b/tools/packman/python.sh @@ -1,18 +1,7 @@ #!/bin/bash -# Copyright 2019-2020 NVIDIA CORPORATION - -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at - -# http://www.apache.org/licenses/LICENSE-2.0 - -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. +# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 set -e diff --git a/tools/repo-deps.packman.xml b/tools/repo-deps.packman.xml index 94b3fa2..1765c39 100644 --- a/tools/repo-deps.packman.xml +++ b/tools/repo-deps.packman.xml @@ -1,12 +1,12 @@ - + - +