Skip to content

Instantly share code, notes, and snippets.

@ThioJoe
Last active April 20, 2025 04:35
Show Gist options
  • Save ThioJoe/56e1c4951be2c1a19b126ec619ec26c4 to your computer and use it in GitHub Desktop.
Save ThioJoe/56e1c4951be2c1a19b126ec619ec26c4 to your computer and use it in GitHub Desktop.
PowerShell script to allocate and pass through GPU to Hyper-V Virtual Machine
# Script to easily set resource allocation for GPUs to be passed through into a Hyper-V VM
#
# Author: ThioJoe / https://github.com/thiojoe
#
### Instructions for copying drivers to VM - Will likely need to do this before running this script
# NOTE: Instead of manually copying the files, if you have an Nvidia GPU you can use my other script called "Copy-GPU-Drivers-VM.ps1" to do it automatically
# 1. Open C:\Windows\System32 on host machine and copy any files beginning with "nv" (Except nvspinfo.exe and NvAgent.dll , which are unrelated)
# 2. Place those files into the System32 folder on the VM
# 3. On the VM, create the following directory: C:\Windows\System32\HostDriverStore\FileRepository
# 4. For Nvidia GPUs, open C:\Windows\System32\DriverStore\FileRepository, copy any folders beginning with "nv_" (The number of folders should match the number of GPUs, or at least number of different models of GPU)
# 5. Place those copied folders into the new HostDriverStore\FileRepository folder on the VM
# 6. Shut down VM and run this script.
# Ask for user input for VM Name
do {
Write-Host ""
$vm = Read-Host "Enter your Hyper-V VM Name"
$vmObject = Get-VM -Name $vm -ErrorAction SilentlyContinue
if (-not $vmObject) {
Write-Host "VM with name '$vm' not found. Please check the name and ensure you're running this script as administrator." -ForegroundColor Red
} else {
Write-Host "VM '$vm' found successfully." -ForegroundColor Green
}
} while (-not $vmObject)
# Ask for user input for number of GPUs
$numGPUs = Read-Host "`nEnter the number of GPUs (1 or 2)"
# Gets info about the GPUs and whether they are partitionable
Write-Host "`nRetrieving information about partitionable GPUs..." -ForegroundColor Yellow
$partitionableGPUs = Get-VMHostPartitionableGpu
# Displaying GPU information
foreach ($gpu in $partitionableGPUs) {
Write-Host "Partitionable GPU found: $($gpu.Name)" -ForegroundColor Yellow
}
# Pausing for user to review GPU information
Write-Host "`nPress Enter to proceed with the configuration..." -ForegroundColor Cyan
$null = Read-Host
# Get existing GPU adapters
$existingAdapters = Get-VMGpuPartitionAdapter -VMName $vm
# Loop through each GPU based on user input
for ($i=0; $i -lt $numGPUs; $i++) {
$targetGpu = $partitionableGPUs[$i]
$instancePath = $targetGpu.Name
Write-Host "Configuring GPU $i with Instance Path: $instancePath" -ForegroundColor Yellow
# Check if adapters with this instance path already exist
$matchingAdapters = $existingAdapters | Where-Object { $_.InstancePath -eq $instancePath }
$adapterCount = $matchingAdapters | Measure-Object | Select-Object -ExpandProperty Count
if ($adapterCount -gt 1) {
# Multiple adapters found - ask user if they want to remove them
Write-Host "`nWARNING: $adapterCount GPU adapters found with the same instance path." -ForegroundColor Red
Write-Host "This indicates duplicate assignments which may not be desired." -ForegroundColor Red
$removeChoice = Read-Host "Do you want to remove all existing adapters and create a fresh one? (Y/N)"
if ($removeChoice -eq "Y" -or $removeChoice -eq "y") {
Write-Host "Removing existing GPU adapters..." -ForegroundColor Yellow
foreach ($adapter in $matchingAdapters) {
Remove-VMGpuPartitionAdapter -VMName $vm -AdapterId $adapter.Id
Write-Host "Removed adapter with ID: $($adapter.Id)" -ForegroundColor Yellow
}
# Add new GPU adapter
Write-Host "Adding fresh GPU partition adapter for VM '$vm'..." -ForegroundColor Yellow
Add-VMGpuPartitionAdapter -VMName $vm -InstancePath $instancePath
# Get the newly added adapter
$gpus = Get-VMGpuPartitionAdapter -VMName $vm
$existingAdapter = $gpus | Where-Object { $_.InstancePath -eq $instancePath }
$adapterId = $existingAdapter.Id
} else {
# User chose not to remove - use the first adapter
Write-Host "Using the first existing adapter for configuration." -ForegroundColor Yellow
$adapterId = $matchingAdapters[0].Id
}
} elseif ($adapterCount -eq 1) {
Write-Host "One GPU adapter for instance path $instancePath already exists. Using existing adapter." -ForegroundColor Yellow
$adapterId = $matchingAdapters[0].Id
} else {
# Add new GPU adapter
Write-Host "Adding GPU partition adapter for VM '$vm'..." -ForegroundColor Yellow
Add-VMGpuPartitionAdapter -VMName $vm -InstancePath $instancePath
# Get the newly added adapter
$gpus = Get-VMGpuPartitionAdapter -VMName $vm
$existingAdapter = $gpus | Where-Object { $_.InstancePath -eq $instancePath }
$adapterId = $existingAdapter.Id
}
# Configure GPU adapter (whether existing or new)
Write-Host "Setting configurations for GPU partition adapter..." -ForegroundColor Yellow
Set-VMGpuPartitionAdapter -VMName $vm -AdapterId $adapterId `
-MinPartitionVRAM $targetGpu.MinPartitionVRAM `
-MaxPartitionVRAM $targetGpu.MaxPartitionVRAM `
-OptimalPartitionVRAM $targetGpu.OptimalPartitionVRAM `
-MinPartitionEncode $targetGpu.MinPartitionEncode `
-MaxPartitionEncode $targetGpu.MaxPartitionEncode `
-OptimalPartitionEncode $targetGpu.OptimalPartitionEncode `
-MinPartitionDecode $targetGpu.MinPartitionDecode `
-MaxPartitionDecode $targetGpu.MaxPartitionDecode `
-OptimalPartitionDecode $targetGpu.OptimalPartitionDecode `
-MinPartitionCompute $targetGpu.MinPartitionCompute `
-MaxPartitionCompute $targetGpu.MaxPartitionCompute `
-OptimalPartitionCompute $targetGpu.OptimalPartitionCompute
Write-Host "GPU configuration completed for adapter ID: $adapterId`n" -ForegroundColor Green
}
# Additional VM settings
Write-Host "Setting additional VM configurations for '$vm'..." -ForegroundColor Yellow
Set-VM -GuestControlledCacheTypes $true -VMName $vm
Set-VM -LowMemoryMappedIoSpace 1GB -VMName $vm
Set-VM -HighMemoryMappedIoSpace 32GB -VMName $vm
Write-Host "Additional VM configurations set." -ForegroundColor Green
Write-Host "`n--------------------------------------------------------------------------"
Write-Host "Script execution complete. If there were no errors, your VM '$vm' is now configured with GPU passthrough.`n" -ForegroundColor Green
# SIG # Begin signature block
# MII6kAYJKoZIhvcNAQcCoII6gTCCOn0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBF5RiZ8NiD+X12
# aJHOzeZpozXXfpNauEMHGPYJy4tXLqCCIrQwggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggbuMIIE1qADAgECAhMzAALtvQ7r
# mviBJqoOAAAAAu29MA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDIwHhcNMjUwMzA1MTEyNjUwWhcNMjUwMzA4
# MTEyNjUwWjBsMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHV3lvbWluZzERMA8GA1UE
# BxMIU2hlcmlkYW4xGzAZBgNVBAoTElRoaW8gU29mdHdhcmUsIExMQzEbMBkGA1UE
# AxMSVGhpbyBTb2Z0d2FyZSwgTExDMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
# igKCAYEAqxZlpsKXMGXjrF+aj89M+goMOvNaHBaP7KPiZg7iJpKu1UdkeOEV/wP2
# ZFFJCe1LrbWzu+G6GidWtLGlUJM9RoXlALXBGAQp5z04Z4DVPi/l9PldiCb2VFPG
# tSCoGPrg7tPVQUCJOU+tfWxp4m5R2pLlfw4IFjMHELeEvAQRHktGvwJWZi+korzY
# 8qVbxmEyGg7K0uV6OeSDjFnb3WvwFSFjM549vzDbrnqCxHqATyLkN+cx5O9C95rA
# sfdtyFyzo+xxrxw+GBVAMWzEWtZ+YgNvkUMpDSTFQxzQN8ZWuYh/VFEs0rBlj6XJ
# 22Et0xBBbMrbjrN6WU3dRYUJOs9pJig635Xl8fQqWSSz7pF8EU8bwmsRynnJJVbp
# FAWajhd+a8RWLKNwZ8W1RVaa1Q4STaP9BSg0w3aTvIJYYXNzU/tF8y74H6R8IRnK
# sY4WPXfcKCu3yDhQT2rhg/LvquHFOrJoUP4FL55kfrwigcJVNvNh6ahBC0T+6Khq
# T4wl7iADAgMBAAGjggIZMIICFTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIH
# gDA8BgNVHSUENTAzBgorBgEEAYI3YQEABggrBgEFBQcDAwYbKwYBBAGCN2GCyITf
# TKbD3mqByam9GIO77qlmMB0GA1UdDgQWBBSr2AYaNAh3/xAG094Qu1ypBXm4pjAf
# BgNVHSMEGDAWgBQkRZmhd5AqfMPKg7BuZBaEKvgsZzBnBgNVHR8EYDBeMFygWqBY
# hlZodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQl
# MjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDAyLmNybDCBpQYIKwYB
# BQUHAQEEgZgwgZUwZAYIKwYBBQUHMAKGWGh0dHA6Ly93d3cubWljcm9zb2Z0LmNv
# bS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIw
# QU9DJTIwQ0ElMjAwMi5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1p
# Y3Jvc29mdC5jb20vb2NzcDBmBgNVHSAEXzBdMFEGDCsGAQQBgjdMg30BATBBMD8G
# CCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3Mv
# UmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQBMA0GCSqGSIb3DQEBDAUAA4ICAQDJ9pqA
# Y7jUMmDWd+BP3PFlOxgqV5BCgRNplIjgpFNxOK6ynHukwZImPrcD8momkzqLIKg0
# aoV/PcQHAT3hZFbtSdV9oUZl7Y/aKFDA6HE1LjLg2BWP9xHtdJUq34DQR4o070Xm
# mo6IPhNkE4NwBCZr1kgM57dbf5NQ+FQWwVW0e2a7mUr1/CiG3mCOoNYABDGIcLKH
# aKR7x2KUO315e09i4BjYUenVvgdMlOsmnOjs7kATvPf15n3cyFwagk1OntbGyVl/
# 5ge9npMsBAWINYy/w50sMF1zANh2OhxY4aZrCsANlukOcJiG+qZs1bY5O3AK3zFz
# t0Mvao4+q5sR5pi+L8fVF/buQaIXjKGLhRS3l4B1cwGCMa4hLrtsj2erD9RogaUM
# WIXm8sbl5pq8ZCRQzOGblc9rz70aXMKQ9UKaECwkEApx4NM9Uyiey5CmG9PuEtSP
# XIPDt7YEJVQQA/oxV1/PgmsBUeUp0z879B5hnCi6GoouYE2Q8LZQc30MvkvE4y18
# vfsZVvBoWwz5cnLFucxs1tcuPfhMkIHMBp7kKQRZ8FlCycHnYs9DWtPe5TDR5Qtc
# RSsy17uk3jaqZO+rtWq0kzBU2/gRMBcF9+IoYrWW6T0wjvc/QZk8lWoE3sbne2yF
# pRyLX2roNbQGpVrYm0Tbp5ObzxM45zAeFj2vdjCCBu4wggTWoAMCAQICEzMAAu29
# Duua+IEmqg4AAAAC7b0wDQYJKoZIhvcNAQEMBQAwWjELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0
# IElEIFZlcmlmaWVkIENTIEFPQyBDQSAwMjAeFw0yNTAzMDUxMTI2NTBaFw0yNTAz
# MDgxMTI2NTBaMGwxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdXeW9taW5nMREwDwYD
# VQQHEwhTaGVyaWRhbjEbMBkGA1UEChMSVGhpbyBTb2Z0d2FyZSwgTExDMRswGQYD
# VQQDExJUaGlvIFNvZnR3YXJlLCBMTEMwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
# ggGKAoIBgQCrFmWmwpcwZeOsX5qPz0z6Cgw681ocFo/so+JmDuImkq7VR2R44RX/
# A/ZkUUkJ7UuttbO74boaJ1a0saVQkz1GheUAtcEYBCnnPThngNU+L+X0+V2IJvZU
# U8a1IKgY+uDu09VBQIk5T619bGniblHakuV/DggWMwcQt4S8BBEeS0a/AlZmL6Si
# vNjypVvGYTIaDsrS5Xo55IOMWdvda/AVIWMznj2/MNuueoLEeoBPIuQ35zHk70L3
# msCx923IXLOj7HGvHD4YFUAxbMRa1n5iA2+RQykNJMVDHNA3xla5iH9UUSzSsGWP
# pcnbYS3TEEFsytuOs3pZTd1FhQk6z2kmKDrfleXx9CpZJLPukXwRTxvCaxHKeckl
# VukUBZqOF35rxFYso3BnxbVFVprVDhJNo/0FKDTDdpO8glhhc3NT+0XzLvgfpHwh
# GcqxjhY9d9woK7fIOFBPauGD8u+q4cU6smhQ/gUvnmR+vCKBwlU282HpqEELRP7o
# qGpPjCXuIAMCAwEAAaOCAhkwggIVMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQD
# AgeAMDwGA1UdJQQ1MDMGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhsrBgEEAYI3YYLI
# hN9MpsPeaoHJqb0Yg7vuqWYwHQYDVR0OBBYEFKvYBho0CHf/EAbT3hC7XKkFebim
# MB8GA1UdIwQYMBaAFCRFmaF3kCp8w8qDsG5kFoQq+CxnMGcGA1UdHwRgMF4wXKBa
# oFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29m
# dCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENBJTIwMDIuY3JsMIGlBggr
# BgEFBQcBAQSBmDCBlTBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1Ml
# MjBBT0MlMjBDQSUyMDAyLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3Au
# bWljcm9zb2Z0LmNvbS9vY3NwMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAEwDQYJKoZIhvcNAQEMBQADggIBAMn2
# moBjuNQyYNZ34E/c8WU7GCpXkEKBE2mUiOCkU3E4rrKce6TBkiY+twPyaiaTOosg
# qDRqhX89xAcBPeFkVu1J1X2hRmXtj9ooUMDocTUuMuDYFY/3Ee10lSrfgNBHijTv
# Reaajog+E2QTg3AEJmvWSAznt1t/k1D4VBbBVbR7ZruZSvX8KIbeYI6g1gAEMYhw
# sodopHvHYpQ7fXl7T2LgGNhR6dW+B0yU6yac6OzuQBO89/XmfdzIXBqCTU6e1sbJ
# WX/mB72ekywEBYg1jL/DnSwwXXMA2HY6HFjhpmsKwA2W6Q5wmIb6pmzVtjk7cArf
# MXO3Qy9qjj6rmxHmmL4vx9UX9u5BoheMoYuFFLeXgHVzAYIxriEuu2yPZ6sP1GiB
# pQxYhebyxuXmmrxkJFDM4ZuVz2vPvRpcwpD1QpoQLCQQCnHg0z1TKJ7LkKYb0+4S
# 1I9cg8O3tgQlVBAD+jFXX8+CawFR5SnTPzv0HmGcKLoaii5gTZDwtlBzfQy+S8Tj
# LXy9+xlW8GhbDPlycsW5zGzW1y49+EyQgcwGnuQpBFnwWULJwediz0Na097lMNHl
# C1xFKzLXu6TeNqpk76u1arSTMFTb+BEwFwX34ihitZbpPTCO9z9BmTyVagTexud7
# bIWlHItfaug1tAalWtibRNunk5vPEzjnMB4WPa92MIIHWjCCBUKgAwIBAgITMwAA
# AASWUEvS2+7LiAAAAAAABDANBgkqhkiG9w0BAQwFADBjMQswCQYDVQQGEwJVUzEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3Nv
# ZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMB4XDTIxMDQxMzE3
# MzE1MloXDTI2MDQxMzE3MzE1MlowWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlm
# aWVkIENTIEFPQyBDQSAwMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# AOHOoOgzomOmwDsAj2wZUBdrY6N3JFGbmm+WaKzJ0aeKzpsGQ4k2yKcxZGf5PJOI
# rwSVdcOf2/6MpCPnlwKmmsTHcgDtDKHZxFuyJ30Pq05MpBMx8UWwjYOig7E52HP2
# HS+yCIiZYvJOdbqWhyy+wmJvWDXNEhWL5WhY9jtB4zvcvzUZnFjY2pmTpUY8VtnF
# oFLFHWs0h4EQnpPO1dmzP9e2/qPFl1FvdSKYIEWrJomeuVhBR1ym8oZti24QSumV
# pkKBXhPhlqylghiv6v+EYk2jDYR11r1r/v/yOfFLTsVYtw2itX0OmC8iCBh8w+Ap
# rXKxor8bqav3K6x7pxjQe//0JrpdmT/R3DpmP2qbYFJ8E/ttIPwN+4g37rlcOskt
# i6NP5Kf42/ifLxOBTKiIsMRgci+PNjzFQQt6nfzWxUGvDJo+np7FPhxKr/Wq/gG3
# CsLpm2aiSSpkKxmkjXVn5NjaHYHFjpqu48oW8cGTo5y49P28J7FDXDQHtPb/qoqM
# 8kEHrPAN1Fz3EUG/BvnNMmjtiAon1kyu8krslCfPJNZrTdtgjX7W44rYgHmn6GfV
# ZoZ+UX2/kvyuWq1b03C7pLeT3Uw0MZeeexCBOgPulxQaXbIzs5C83RIexC5PD1Tz
# I0HzwoCrSfOHNe33dgvfqcRdZREFBV2P2LQi/jZrPXFlAgMBAAGjggIOMIICCjAO
# BgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFCRFmaF3
# kCp8w8qDsG5kFoQq+CxnMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwEgYDVR0TAQH/BAgwBgEB
# /wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBwBgNVHR8EaTBn
# MGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNy
# b3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0ElMjAy
# MDIxLmNybDCBrgYIKwYBBQUHAQEEgaEwgZ4wbQYIKwYBBQUHMAKGYWh0dHA6Ly93
# d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSUQlMjBW
# ZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIwMjAyMS5jcnQwLQYIKwYB
# BQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG
# 9w0BAQwFAAOCAgEAZy04XZWzDSKJHSrc0mvIqPqRDveQnN1TsmP4ULCCHHTMpNoS
# Tsy7fzNVl30MhJQ5P0Lci81+t03Tm+SfpzvLdKc88Iu2WLzIjairwEDudLDDiZ90
# 94Qj6acTTYaBhVcc9lMokOG9rzq3LCyvUzhBV1m1DCTm0fTzNMGbAASIbuJOlVS8
# RA3tBknkF/2ROzx304OOC7n7eCCqmJp79QrqLKd4JRWLFXoC5zFmVGfFLTvRfEAo
# gKLiWIS+TpQpLIA2/b3vx0ISxZ3pX4OnULmyBbKgfSJQqJ2CiWfx2jGb2LQO8vRD
# kSuHMZb03rQlwB2soklx9LnhP0/dsFRtHLL+VXVMo+sla5ttr5SmAJFyDSrwzgfP
# rOIfk4EoZVGtgArthVp+yc5U0m6ZNCBPERLmJpLshPwU5JPd1gzMez8C55+CfuX5
# L2440NPDnsH6TIYfErj3UCqpmeNCOFtlMiSjDE23rdeiRYpkqgwoYJwgepcJaXtI
# H26Pe1O6a6W3wSqegdpNn+2Pk41q0GDfjnXDzskAHcRhjwcCUmiRt6IXZJQsYACe
# WpwsXmJe0o0ORLmumrYyHlYTdCnzyxT6WM+QkFPiQth+/ceHfzumDhUfWmHuePwh
# rqe3UVCHy0r9f49Az3OhJX92MlsZaFo/MnmN5B62RWgJUTMIQF8j0N6xF/cwggee
# MIIFhqADAgECAhMzAAAAB4ejNKN7pY4cAAAAAAAHMA0GCSqGSIb3DQEBDAUAMHcx
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBG
# BgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0
# aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMTA0MDEyMDA1MjBaFw0zNjA0MDEy
# MDE1MjBaMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y
# YXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25p
# bmcgUENBIDIwMjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCy8MCv
# GYgo4t1UekxJbGkIVQm0Uv96SvjB6yUo92cXdylN65Xy96q2YpWCiTas7QPTkGnK
# 9QMKDXB2ygS27EAIQZyAd+M8X+dmw6SDtzSZXyGkxP8a8Hi6EO9Zcwh5A+wOALNQ
# bNO+iLvpgOnEM7GGB/wm5dYnMEOguua1OFfTUITVMIK8faxkP/4fPdEPCXYyy8NJ
# 1fmskNhW5HduNqPZB/NkWbB9xxMqowAeWvPgHtpzyD3PLGVOmRO4ka0WcsEZqyg6
# efk3JiV/TEX39uNVGjgbODZhzspHvKFNU2K5MYfmHh4H1qObU4JKEjKGsqqA6Rzi
# ybPqhvE74fEp4n1tiY9/ootdU0vPxRp4BGjQFq28nzawuvaCqUUF2PWxh+o5/TRC
# b/cHhcYU8Mr8fTiS15kRmwFFzdVPZ3+JV3s5MulIf3II5FXeghlAH9CvicPhhP+V
# aSFW3Da/azROdEm5sv+EUwhBrzqtxoYyE2wmuHKws00x4GGIx7NTWznOm6x/niqV
# i7a/mxnnMvQq8EMse0vwX2CfqM7Le/smbRtsEeOtbnJBbtLfoAsC3TdAOnBbUkbU
# fG78VRclsE7YDDBUbgWt75lDk53yi7C3n0WkHFU4EZ83i83abd9nHWCqfnYa9qIH
# PqjOiuAgSOf4+FRcguEBXlD9mAInS7b6V0UaNwIDAQABo4ICNTCCAjEwDgYDVR0P
# AQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBTZQSmwDw9jbO9p
# 1/XNKZ6kSGow5jBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRt
# MBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYD
# VR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWG
# c2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUy
# MElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIw
# QXV0aG9yaXR5JTIwMjAyMC5jcmwwgcMGCCsGAQUFBwEBBIG2MIGzMIGBBggrBgEF
# BQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNy
# b3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZp
# Y2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MC0GCCsGAQUFBzABhiFodHRwOi8v
# b25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJKoZIhvcNAQEMBQADggIBAH8l
# Kp7+1Kvq3WYK21cjTLpebJDjW4ZbOX3HD5ZiG84vjsFXT0OB+eb+1TiJ55ns0BHl
# uC6itMI2vnwc5wDW1ywdCq3TAmx0KWy7xulAP179qX6VSBNQkRXzReFyjvF2BGt6
# FvKFR/imR4CEESMAG8hSkPYso+GjlngM8JPn/ROUrTaeU/BRu/1RFESFVgK2wMz7
# fU4VTd8NXwGZBe/mFPZG6tWwkdmA/jLbp0kNUX7elxu2+HtHo0QO5gdiKF+YTYd1
# BGrmNG8sTURvn09jAhIUJfYNotn7OlThtfQjXqe0qrimgY4Vpoq2MgDW9ESUi1o4
# pzC1zTgIGtdJ/IvY6nqa80jFOTg5qzAiRNdsUvzVkoYP7bi4wLCj+ks2GftUct+f
# GUxXMdBUv5sdr0qFPLPB0b8vq516slCfRwaktAxK1S40MCvFbbAXXpAZnU20FaAo
# Dwqq/jwzwd8Wo2J83r7O3onQbDO9TyDStgaBNlHzMMQgl95nHBYMelLEHkUnVVVT
# UsgC0Huj09duNfMaJ9ogxhPNThgq3i8w3DAGZ61AMeF0C1M+mU5eucj1Ijod5O2M
# MPeJQ3/vKBtqGZg4eTtUHt/BPjN74SsJsyHqAdXVS5c+ItyKWg3Eforhox9k3Wgt
# WTpgV4gkSiS4+A09roSdOI4vrRw+p+fL4WrxSK5nMYIXMjCCFy4CAQEwcTBaMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYD
# VQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAyAhMzAALtvQ7r
# mviBJqoOAAAAAu29MA0GCWCGSAFlAwQCAQUAoF4wEAYKKwYBBAGCNwIBDDECMAAw
# GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwLwYJKoZIhvcNAQkEMSIEICQFdIgk
# Q8vySK41ih1cRyFRzHViHCZ0JgEXrzSqzy+AMA0GCSqGSIb3DQEBAQUABIIBgCW5
# SruTGhAqxTlV9RsNcPVVj3IvbuSK6GaNSizmyQgLCFhps6sRiupt97fPorrCkTmX
# tLad5pb1KyQddI9n0j9d4/b83eaKvsgP6+k2grl0H41ECKLF8lFCMvmQdeOSJZuw
# XqEaxA6ex3xMGHqxXtk86YdUiyx6/41BIqi6LoNCsZMR64RL+FyLH5q8Khiegsc4
# i4Baq38qHfhdV4sC3LM6ZNbRiftHZ0ZlJ5vfrhrbx1xeFQ9tVOIY5zSZyQHpqAuW
# lU5A4rjW2+nvB+dfJ9PXEx8EAXhPWXLjoGrc0Hq5YAoxid1UafImFEUZ5feHzu82
# ruUamgsrpqDeWdUyRHulKJjRE1M3PpN/SlCjtzmaroG1d4k0N+bD2oDLdXntZJRt
# Zdfnvus429yzSZYQree48F4E8Vu7oZ01NGQ1bjHUjSMfxJFhSjy/g1JQC6b7toDw
# +0l1Vig0fYXwXaO75V6hKy2CSs/0gE32DR2wU5BsCsBJnweqLkilt6aQsz6Qj6GC
# FLIwghSuBgorBgEEAYI3AwMBMYIUnjCCFJoGCSqGSIb3DQEHAqCCFIswghSHAgED
# MQ8wDQYJYIZIAWUDBAIBBQAwggFqBgsqhkiG9w0BCRABBKCCAVkEggFVMIIBUQIB
# AQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQCAQUABCC37nNTwZDvfS+x4grM7Mfj
# dXQwaP/1ue32wHJLbnnsEgIGZ7jUk3ESGBMyMDI1MDMwNTE2NTQxNS44MDhaMASA
# AgH0oIHppIHmMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ
# MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx
# JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo3QTFBLTA1RTAtRDk0NzE1MDMGA1UE
# AxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmg
# gg8pMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0B
# AQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJv
# b3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcN
# MzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1l
# c3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# AJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg
# 2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+
# Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtc
# CEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTa
# vwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ
# 4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhD
# BieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7
# gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5Jht
# YUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8
# KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0h
# WdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAO
# BgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1
# L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIB
# FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9y
# eS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUA
# YgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcn
# z1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRp
# b24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCB
# lAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVy
# aWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAy
# MC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWl
# uLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviw
# pnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+I
# fvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccO
# iQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1
# jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i7
# 9dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ
# /u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5OD
# IRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOm
# kFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jj
# gs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG
# 2GwYe6ZoAF1bMIIHnzCCBYegAwIBAgITMwAAAER45LNw/Hbb6gAAAAAARDANBgkq
# hkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3Rh
# bXBpbmcgQ0EgMjAyMDAeFw0yNDA0MTgxNzU5MjFaFw0yNTA0MTcxNzU5MjFaMIHj
# MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk
# bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRN
# aWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsTHm5T
# aGllbGQgVFNTIEVTTjo3QTFBLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0
# IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHkwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQCkOm8duCg12uPg10xT6Cq6p3rqkaoYZrIyu9Rs
# j1pFsoU1aG2xh5IVMn8JX+rE3DVagmANFwKQ/lLext/45uMFC71vLxqQCw6VBXgA
# Ovg/D2631BjEYa7WRkb/OTOQqEOBEjRwLfLier4O+FCWZDy5BlpZzWBsSHcV5OrW
# rrhdeWD4EZILdKOqJFXiM3hRz/OO+cua3HfZwcA4Q9WYNFex2pyIAfShiUhMjCr2
# YGRFFwOFyzv27f/qXBYdAlkmQXlZsPQAWmnHnbvDyNg/b6fHBQSoSjW6h/2m5Ghh
# +D72RQQ6Sv3UYA7MvoQYNXHp8CnlQtlUI8t4muRefT/jwVXRSzpgQtaMhD6v7nnY
# du1CSzdV58TOa523bre4iYyzA5skuxDOaJFDkYlvRRftfTRgBfyhIj9EJpmkS89w
# /kJgO+4OxXDLvta0uQo2R+N8ixVx5odrLuK0O2oCEZF0xzR9THbYUSBb0peaAXbz
# iUHlSp92N1L6wO24DdKfjY12/CSLxFpXIdaO3Cp8zUOxPpLNAoT2AYvU8JAY6yQM
# NFEbQWF2qJ+wrVrPLlRvuYt7EvLNOZKUGvSAp83fYsou1x803cFSQfixHLcGo/7z
# eZ92SeTbtId2vGpGJwiWSrNXVIE0BTOzVrbAUZl3rTUw61SiHop8eSqXfIpqQH7S
# 7GhgnQIDAQABo4IByzCCAccwHQYDVR0OBBYEFCCPw+UF492FV00UbbZlYYgv0MOu
# MB8GA1UdIwQYMBaAFGtpKDo1L0hjQM972K9J6T7ZPdshMGwGA1UdHwRlMGMwYaBf
# oF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29m
# dCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcmww
# eQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUFBzAChl1odHRwOi8vd3d3Lm1pY3Jvc29m
# dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRp
# bWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcnQwDAYDVR0TAQH/BAIwADAWBgNVHSUB
# Af8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4AwZgYDVR0gBF8wXTBRBgwr
# BgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMAgGBmeBDAEEAjANBgkqhkiG
# 9w0BAQwFAAOCAgEAFgi00QwJ/iM7fbqNgXFAC8IwZ+aLZGFJzVDNcFg7qM20LvnL
# jor98X8hdORnEmU08uQ0B5FqrbDFoXKZNKFrWnv81NlkwOkMnlEGLQIAVzBgRHOK
# LtKgyc864JkON4Cxt2eBpdv3EGwjYjb6jSCME5XEfl2isP6fNivL5zYFuyXTmtTi
# c25M3eEt0PiAgfX34kvHkexN44XzMT+mixR93L2ohq7bgP6I//Zmn5Ol7dBlzJXf
# NpQyWLCVuEiIqB5jaYmAj3umgG3hU6ykUgXyx2i15rtflJc/ddUKlB9p2Hh/Up+O
# 7cTw0A4BjvtYs5ogqWurdaGzWrStMkB+yGgv78iNYJ8mEBoN1ylhP95BbhXltF75
# 4yRx6N09tX8sN9gwc8ukv1PRNYQ3fskSURMlikW7IiG7OBH4Fx3ZVWo/TtksXZau
# XF2Ie3Mb5h1QamrP2il9Ym4szqyMGlv7eMEI3D1B2uXgC1bOFzxMZxpQLQ2M+xix
# ycurfC2ptjv5KJyTw2BxqUSBvzwSNgvDRfrrYo+ODKX7owxH0stNbvWPdrP/ElhS
# eDZvAyI9CrhT0FRhNtVIx0kEVywCwpBOCtcEjQy0u16kWk3JK5lv0bVx0Bcb88Uo
# cU8xjgv2LmWxlYey+aMpdy6nb/ZYEBvr6sZE276zm7wSgr+DM9VZqq/rZgExggPU
# MIID0AIBATB4MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWVzdGFt
# cGluZyBDQSAyMDIwAhMzAAAARHjks3D8dtvqAAAAAABEMA0GCWCGSAFlAwQCAQUA
# oIIBLTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIE
# ILpjxVG8ii379DFA/Yq/by/tbgOyj+Df6Q+kD6aV2E8KMIHdBgsqhkiG9w0BCRAC
# LzGBzTCByjCBxzCBoAQgdWVJ7Gn31DnkMwnvpWJjMD7VtGgYCMppdl2knxpf5ZYw
# fDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5n
# IENBIDIwMjACEzMAAABEeOSzcPx22+oAAAAAAEQwIgQgh4ir7L6OSnsS7N0Z58NF
# w8CJZK6BqOkWzz9C0LGCymYwDQYJKoZIhvcNAQELBQAEggIAm69ytnxXe8J3Ahva
# wZb8J9BGqMUXh3wTn5GV6JmOSIo2tnN9/IkSrWzV0v9wHyAdBlOJrmjVXQXwGHVM
# iB1Hggv69DpkzI/zUY+n72g2n268u14JV5gpdHRO3pwhAnTtgFnRcG/hVcYA+dsw
# iXX6BnU2n4kDi5H9mu4IAvbo2ZMRZ6mpEBR5FmHWZQEUsYkm4HdPZ3r0SJthRCrx
# 15PGXzOovv782D/YWHVS5sTJAvKiO9xZ8+TWUbR63jewO409iilILxzOEXH849vY
# uuPz06ZyKsyIxP1ynfQFIlFmn9AKrLGHfkVrd3UsggtjkG+vkY/6Im8sizPzjck2
# +5wR+MWfN6ewSvdup7W5lFG98zxcvraq1k+AizTsy/xUtksEMYpqaa5LAVwNtyEt
# y8fJTixNJbW0mDykRVuc5IOKsKn8HkrCygBDLcd9efQJwtLpNUdgCE06HyWb9b1l
# 7qepKN+SlQQ5TAGJHE7BxyhhUUJljgUPODPohOUDoEBNXIXSsaXtO21PPqVMiPDU
# 23kNvPqCPCXqRpnl3+9ONF7NGb32zpE1duWP/sp0fIHebPgKxqBGvatjWhhEL7Ou
# fdFQ+68Hz5fPISSCqPU/GImcVZaigYSqN9CwAeRYA11XzUJHVMFjE2ZoSMZ7aAYJ
# Eum6QMACbY+AFgHkcHs/hfvqChU=
# SIG # End signature block
@tomikcz987
Copy link

Hello, the script is incompatible with windows 10
the Get-VMHostPartitionableGpu command doesn't exist but when removing the "Host" part it looks like this "Get-VMPartitionableGpu" and that works and the last thing when adding graphics to vm "Add-VMGpuPartitionAdapter -VMName $vm -InstancePath $instancePath" doesn't work because it doesn't know -InstancePath $instancePath

@lozhn
Copy link

lozhn commented Jun 8, 2024

Nice gist!

Did you manage to find out what exactly those values mean?

    Set-VMGpuPartitionAdapter -VMName $vm -AdapterId $adapterId -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000

Because I read the docs and couldn't move past the

This is defined by the manufacturer's driver

May be you have experimentaly found what those values mean?

@ThioJoe
Copy link
Author

ThioJoe commented Jun 9, 2024

Nice gist!

Did you manage to find out what exactly those values mean?

    Set-VMGpuPartitionAdapter -VMName $vm -AdapterId $adapterId -MinPartitionVRAM 80000000 -MaxPartitionVRAM 100000000 -OptimalPartitionVRAM 100000000 -MinPartitionEncode 80000000 -MaxPartitionEncode 100000000 -OptimalPartitionEncode 100000000 -MinPartitionDecode 80000000 -MaxPartitionDecode 100000000 -OptimalPartitionDecode 100000000 -MinPartitionCompute 80000000 -MaxPartitionCompute 100000000 -OptimalPartitionCompute 100000000

Because I read the docs and couldn't move past the

This is defined by the manufacturer's driver

May be you have experimentaly found what those values mean?

Yea unfortunately I'm not sure myself about the technicality of all those parameters, I mostly just copied values I saw other people using

@mhtvsSFrpHdE
Copy link

It seems I discovered source of the magic...
https://docs.nvidia.com/vgpu/latest/pdf/grid-vgpu-user-guide.pdf
Search in pdf for Get-VMGpuPartitionAdapter and check page 29.

I would do it somehow like this:

$vmName = "my vm name"

Remove-VMGpuPartitionAdapter -VMName $vmName

$hostGpus = Get-VMHostPartitionableGpu
$targetGpu = $hostGpus[0]

Add-VMGpuPartitionAdapter -VMName $vmName `
-MinPartitionVRAM $targetGpu.MinPartitionVRAM `
-MaxPartitionVRAM $targetGpu.MaxPartitionVRAM `
-OptimalPartitionVRAM $targetGpu.OptimalPartitionVRAM `
-MinPartitionEncode $targetGpu.MinPartitionEncode `
-MaxPartitionEncode $targetGpu.MaxPartitionEncode `
-OptimalPartitionEncode $targetGpu.OptimalPartitionEncode `
-MinPartitionDecode $targetGpu.MinPartitionDecode `
-MaxPartitionDecode $targetGpu.MaxPartitionDecode `
-OptimalPartitionDecode $targetGpu.OptimalPartitionDecode `
-MinPartitionCompute $targetGpu.MinPartitionCompute `
-MaxPartitionCompute $targetGpu.MaxPartitionCompute `
-OptimalPartitionCompute $targetGpu.OptimalPartitionCompute

@ThioJoe
Copy link
Author

ThioJoe commented Mar 5, 2025

@mhtvsSFrpHdE Wow incredible find 🧐 I guess the capabilities are already embedded in that object and we can just directly assign them when adding the adapter. I'll have to update the script

@mhtvsSFrpHdE
Copy link

mhtvsSFrpHdE commented Mar 5, 2025

@ThioJoe At the beginning I follow the Microsoft guide and it didn't work
https://learn.microsoft.com/en-us/windows-server/virtualization/hyper-v/partition-assign-vm-gpu?tabs=powershell
At the same time, later I installed and try vGPU in Windows Sandbox, the one doesn't report code 43 and everything is fine.
Nvidia is correct, Microsoft lacks key information on their website.

Now I'm struggling with GPU over Remote desktop... RemoteFX something maybe

@mhtvsSFrpHdE
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment