blob: e5a693ca864bc2ca750812289bbefda91c277b53 [file] [log] [blame]
David Pinedo2912bf72016-02-04 17:04:44 -07001# Copyright (c) 2015-2016 The Khronos Group Inc.
2# Copyright (c) 2015-2016 Valve Corporation
3# Copyright (c) 2015-2016 LunarG, Inc.
David Pinedoca905612016-01-04 16:31:57 -07004#
David Pinedo2912bf72016-02-04 17:04:44 -07005# Permission is hereby granted, free of charge, to any person obtaining a copy
6# of this software and/or associated documentation files (the "Materials"), to
7# deal in the Materials without restriction, including without limitation the
8# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
9# sell copies of the Materials, and to permit persons to whom the Materials are
10# furnished to do so, subject to the following conditions:
David Pinedoca905612016-01-04 16:31:57 -070011#
David Pinedo2912bf72016-02-04 17:04:44 -070012# The above copyright notice(s) and this permission notice shall be included in
13# all copies or substantial portions of the Materials.
David Pinedoca905612016-01-04 16:31:57 -070014#
David Pinedo2912bf72016-02-04 17:04:44 -070015# THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
David Pinedoca905612016-01-04 16:31:57 -070016# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
David Pinedo2912bf72016-02-04 17:04:44 -070017# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18#
19# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
20# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
22# USE OR OTHER DEALINGS IN THE MATERIALS.
David Pinedoca905612016-01-04 16:31:57 -070023#
24# Author: David Pinedo <david@LunarG.com>
David Pinedo2912bf72016-02-04 17:04:44 -070025# Author: Mark Young <mark@LunarG.com>
David Pinedoca905612016-01-04 16:31:57 -070026#
27
David Pinedo2912bf72016-02-04 17:04:44 -070028
David Pinedoca905612016-01-04 16:31:57 -070029# This Powershell script is used by the Vulkan Run Time Installer/Uninstaller to:
30# - Copy the most recent vulkan-<majorabi>-*.dll in C:\Windows\System32
31# to vulkan-<majorabi>.dll
32# - Copy the most recent version of vulkaninfo-<abimajor>-*.exe in
33# C:\Windows\System32 to vulkaninfo.exe
Mark Younga84173b2016-01-15 15:09:39 -070034# - The same thing is done for those files in C:\Windows\SysWOW64 on a 64-bit
35# target.
David Pinedoca905612016-01-04 16:31:57 -070036# - Set the layer registry entries to point to the layer json files
37# in the Vulkan SDK associated with the most recent vulkan*dll.
38#
Mark Young5a569042016-01-20 16:33:18 -070039# This script takes the following parameters:
Mark Younga84173b2016-01-15 15:09:39 -070040# $majorabi : a single string number specifying the major abi version.
Mark Young5a569042016-01-20 16:33:18 -070041# $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS.
David Pinedoca905612016-01-04 16:31:57 -070042#
43
Mark Younga84173b2016-01-15 15:09:39 -070044Param(
45 [string]$majorabi,
46 [int]$ossize
47)
David Pinedoca905612016-01-04 16:31:57 -070048
David Pinedo0f2e7c82016-03-29 13:46:12 -060049# Start logging
50$log=$Env:Temp+"\VulkanRT"
51New-Item -ItemType Directory -Force -Path $log | Out-Null
David Pinedo49a8e0b2016-03-29 16:26:50 -060052$logascii=$log+"\ConfigLayersAndVulkanDLL.log"
53$log=$log+"\ConfigLayersAndVulkanDLL16.log"
David Pinedo0f2e7c82016-03-29 13:46:12 -060054echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log
55(Get-Date).ToString() >>$log
56
David Pinedoca905612016-01-04 16:31:57 -070057$vulkandll = "vulkan-"+$majorabi+".dll"
Mark Young0a1c0d02016-02-12 12:07:45 -070058$windrive = $env:SYSTEMDRIVE
59$winfolder = $env:SYSTEMROOT
David Pinedoc8b740a2016-03-16 14:41:56 -060060$script:VulkanDllList=@()
David Pinedoca905612016-01-04 16:31:57 -070061
David Pinedo226f7612016-03-15 11:07:19 -060062function notNumeric ($x) {
63 try {
64 0 + $x | Out-Null
65 return $false
66 } catch {
67 return $true
68 }
69}
70
David Pinedoca905612016-01-04 16:31:57 -070071# The name of the versioned vulkan dll file is one of the following:
72#
David Pinedo8cf6a9d2016-01-12 16:14:53 -070073# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>-<prebuildno>
74# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>
75# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prebuildno>
David Pinedoca905612016-01-04 16:31:57 -070076# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
David Pinedoca905612016-01-04 16:31:57 -070077#
David Pinedo8cf6a9d2016-01-12 16:14:53 -070078# <major>, <minor>, <patch>, <buildno> and <prebuildno> are 1 to 10 numeric digits.
79# <prerelease> is any combination of alpha and numeric characters.
80# If <prerelease> and/or <prebuildno> are present, this identifies a prerelease,
81# and the vulkan dll file will be considered less recent than one with the same
82# <major>, <minor>, <patch>, <buildno> numbers without the <prerelease> and/or
83# <prebuildno>.
David Pinedoca905612016-01-04 16:31:57 -070084
85
86# We first create an array, with one array element for each vulkan-*dll in
Mark Younga84173b2016-01-15 15:09:39 -070087# C:\Windows\System32 (and C:\Windows\SysWOW64 on 64-bit systems), with each element
88# containing:
David Pinedo97c3cea2016-04-04 11:43:50 -060089# <major>=<minor>=<patch>=<buildno>=<prebuildno>=<prerelease>=
David Pinedoca905612016-01-04 16:31:57 -070090# filename
David Pinedo8cf6a9d2016-01-12 16:14:53 -070091# @<major>@<minor>@<patch>@<buildno>@<prerelease>@<prebuildno>@
David Pinedoca905612016-01-04 16:31:57 -070092# [Note that the above three lines are one element in the array.]
93# The build identifiers separated by "=" are suitable for sorting, i.e.
David Pinedo8cf6a9d2016-01-12 16:14:53 -070094# expanded to 10 digits with leading 0s. If <prerelease> or <prebuildno> are
95# not specified, "zzzzzzzzzz" is substituted for them, so that they sort
David Pinedo97c3cea2016-04-04 11:43:50 -060096# to a position after those that do specify them. Note that <prerelease>
97# is "less significant" in the sort than <prebuildno>, and that <prerelease> is
98# always treated as an alpha string, even though it may contain numeric characters.
David Pinedoca905612016-01-04 16:31:57 -070099# The build identifiers separated by "@" are the original values extracted
100# from the file name. They are used later to find the path to the SDK
101# install directory for the given filename.
102
David Pinedo226f7612016-03-15 11:07:19 -0600103
Mark Youngcee30c82016-01-20 14:48:21 -0700104function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)
Mark Young7f16a962016-01-15 12:35:39 -0700105{
David Pinedo0f2e7c82016-03-29 13:46:12 -0600106 echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log
107
Mark Young7f16a962016-01-15 12:35:39 -0700108 # Push the current path on the stack and go to $dir
109 Push-Location -Path $dir
David Pinedo2912bf72016-02-04 17:04:44 -0700110
David Pinedoc8b740a2016-03-16 14:41:56 -0600111 # Create a list for all the DLLs in the folder.
112 # First Initialize the list to empty
113 $script:VulkanDllList = @()
David Pinedo2912bf72016-02-04 17:04:44 -0700114
David Pinedo0f2e7c82016-03-29 13:46:12 -0600115 # Find all vulkan dll files in this directory
Mark Young7f16a962016-01-15 12:35:39 -0700116 dir -name vulkan-$majorabi-*.dll |
David Pinedoca905612016-01-04 16:31:57 -0700117 ForEach-Object {
David Pinedo0f2e7c82016-03-29 13:46:12 -0600118 echo "File $_" >>$log
David Pinedo226f7612016-03-15 11:07:19 -0600119 if ($_ -match "=" -or
120 $_ -match "@" -or
121 $_ -match " " -or
122 ($_.Split('-').count -lt 6) -or
123 ($_.Split('-').count -gt 8))
124 {
125 # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than
126 # 7 dashes, it wasn't installed by the Vulkan Run Time.
127 # Note that we need to use return inside of ForEach-Object is to continue with iteration.
David Pinedo0f2e7c82016-03-29 13:46:12 -0600128 echo "Rejected $_ - bad format" >>$log
David Pinedo226f7612016-03-15 11:07:19 -0600129 return
130 }
David Pinedo0f2e7c82016-03-29 13:46:12 -0600131
132 # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time
133 $vulkaninfo=$_ -replace ".dll",".exe"
134 $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo"
135 if (-not (Test-Path $vulkaninfo)) {
136 echo "Rejected $_ - vulkaninfo not present" >>$log
137 return
138 }
139
David Pinedoca905612016-01-04 16:31:57 -0700140 $major=$_.Split('-')[2]
141 $majorOrig=$major
142 $minor=$_.Split('-')[3]
143 $minorOrig=$minor
144 $patch=$_.Split('-')[4]
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700145 $patchOrig=$patch
146 $buildno=$_.Split('-')[5]
David Pinedoca905612016-01-04 16:31:57 -0700147
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700148 if ($buildno -match ".dll") {
David Pinedo226f7612016-03-15 11:07:19 -0600149 # prerelease and prebuildno are not in the name
150 # Extract buildno, and set prerelease and prebuildno to "z"s
151 $buildno=$buildno -replace ".dll",""
152 $buildnoOrig=$buildno
153 $prerelease="z"*10
154 $prereleaseOrig=""
155 $prebuildno="z"*10
156 $prebuildnoOrig=""
David Pinedoca905612016-01-04 16:31:57 -0700157 } else {
David Pinedo226f7612016-03-15 11:07:19 -0600158 # Extract buildno, prerelease, and prebuildno
David Pinedoca905612016-01-04 16:31:57 -0700159 $f=$_ -replace ".dll",""
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700160 $buildno=$f.Split('-')[5]
David Pinedoc066bcf2016-01-13 16:22:19 -0700161 $buildnoOrig=$buildno
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700162 $prerelease=$f.Split('-')[6]
163 $prebuildno=$f.Split('-')[7]
164 if ($prebuildno.Length -eq 0) {
David Pinedoca905612016-01-04 16:31:57 -0700165 if ($prerelease -match "^[0-9]") {
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700166 # prerelease starts with a digit, it must be the prebuildno
167 $prebuildno=$prerelease
David Pinedoca905612016-01-04 16:31:57 -0700168 $prerelease=""
169 }
170 }
David Pinedoca905612016-01-04 16:31:57 -0700171 $prereleaseOrig=$prerelease
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700172 $prebuildnoOrig=$prebuildno
David Pinedoca905612016-01-04 16:31:57 -0700173
174 if ($prerelease.Length -eq 0) {
175 $prerelease="z"*10
176 }
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700177 if ($prebuildno.Length -eq 0) {
178 $prebuildno="z"*10
David Pinedoca905612016-01-04 16:31:57 -0700179 }
180 }
David Pinedo0f2e7c82016-03-29 13:46:12 -0600181 echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700182
David Pinedo226f7612016-03-15 11:07:19 -0600183 # Make sure fields that are supposed to be numbers are numbers
David Pinedo0f2e7c82016-03-29 13:46:12 -0600184 if (notNumeric($major)) {
185 echo "Rejected $_ - bad major" >>$log
186 return
187 }
188 if (notNumeric($minor)) {
189 echo "Rejected $_ - bad minor" >>$log
190 return
191 }
192 if (notNumeric($patch)) {
193 echo "Rejected $_ - bad patch" >>$log
194 return
195 }
196 if (notNumeric($buildno)) {
197 echo "Rejected $_ - bad buildno" >>$log
198 return
199 }
David Pinedo226f7612016-03-15 11:07:19 -0600200 if (notNumeric($prebuildno)) {
David Pinedo0f2e7c82016-03-29 13:46:12 -0600201 if ($prebuildno -ne "z"*10) {
202 echo "Rejected $_ - bad prebuildno" >>$log
203 return
204 }
David Pinedo226f7612016-03-15 11:07:19 -0600205 }
206
David Pinedoca905612016-01-04 16:31:57 -0700207 $major = $major.padleft(10,'0')
208 $minor = $minor.padleft(10,'0')
209 $patch = $patch.padleft(10,'0')
David Pinedoca905612016-01-04 16:31:57 -0700210 $buildno = $buildno.padleft(10,'0')
David Pinedo97c3cea2016-04-04 11:43:50 -0600211 $prerelease = $prerelease.padright(10,'z')
David Pinedo8cf6a9d2016-01-12 16:14:53 -0700212 $prebuildno = $prebuildno.padleft(10,'0')
David Pinedoca905612016-01-04 16:31:57 -0700213
214 # Add a new element to the $VulkanDllList array
David Pinedo0f2e7c82016-03-29 13:46:12 -0600215 echo "Adding $_ to Vulkan dll list " >>$log
David Pinedo97c3cea2016-04-04 11:43:50 -0600216 $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prebuildno=$prerelease= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"
David Pinedoca905612016-01-04 16:31:57 -0700217 }
218
Mark Young7f16a962016-01-15 12:35:39 -0700219 # If $VulkanDllList contains at least one element, there's at least one vulkan*.dll file.
220 # Copy the most recent vulkan*.dll (named in the last element of $VulkanDllList) to vulkan-$majorabi.dll.
David Pinedoca905612016-01-04 16:31:57 -0700221
David Pinedoc8b740a2016-03-16 14:41:56 -0600222 if ($script:VulkanDllList.Length -gt 0) {
David Pinedoca905612016-01-04 16:31:57 -0700223
Mark Young7f16a962016-01-15 12:35:39 -0700224 # Sort the list. The most recent vulkan-*.dll will be in the last element of the list.
David Pinedoc8b740a2016-03-16 14:41:56 -0600225 [array]::sort($script:VulkanDllList)
David Pinedoca905612016-01-04 16:31:57 -0700226
Mark Young7f16a962016-01-15 12:35:39 -0700227 # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL.
228 # The most recent vulkanDLL is the second word in the last element of the
229 # sorted $VulkanDllList. Copy it to $vulkandll.
David Pinedoc8b740a2016-03-16 14:41:56 -0600230 $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1]
David Pinedo0f2e7c82016-03-29 13:46:12 -0600231 echo "copy $mrVulkanDll $vulkandll" >>$log
Mark Young7f16a962016-01-15 12:35:39 -0700232 copy $mrVulkanDll $vulkandll
David Pinedoca905612016-01-04 16:31:57 -0700233
Mark Young7f16a962016-01-15 12:35:39 -0700234 # Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe.
235 # We create the source file name for the copy from $mrVulkanDll.
236 $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe"
237 $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo"
David Pinedo0f2e7c82016-03-29 13:46:12 -0600238 echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log
Mark Young7f16a962016-01-15 12:35:39 -0700239 copy $mrVulkaninfo vulkaninfo.exe
David Pinedo2912bf72016-02-04 17:04:44 -0700240
Mark Young7f16a962016-01-15 12:35:39 -0700241 # Create the name used in the registry for the SDK associated with $mrVulkanDll.
David Pinedoc8b740a2016-03-16 14:41:56 -0600242 $major=$script:VulkanDllList[-1].Split('@')[1]
243 $minor=$script:VulkanDllList[-1].Split('@')[2]
244 $patch=$script:VulkanDllList[-1].Split('@')[3]
245 $buildno=$script:VulkanDllList[-1].Split('@')[4]
246 $prerelease=$script:VulkanDllList[-1].Split('@')[5]
247 $prebuildno=$script:VulkanDllList[-1].Split('@')[6]
David Pinedo2912bf72016-02-04 17:04:44 -0700248
Mark Youngcee30c82016-01-20 14:48:21 -0700249 $sdktempname="VulkanSDK"+$major + "." + $minor + "." + $patch + "." + $buildno
Mark Young7f16a962016-01-15 12:35:39 -0700250 if ($prerelease -ne "") {
Mark Youngcee30c82016-01-20 14:48:21 -0700251 $sdktempname=$sdktempname + "." + $prerelease
Mark Young7f16a962016-01-15 12:35:39 -0700252 }
253 if ($prebuildno -ne "") {
Mark Youngcee30c82016-01-20 14:48:21 -0700254 $sdktempname=$sdktempname + "." + $prebuildno
Mark Young7f16a962016-01-15 12:35:39 -0700255 }
David Pinedo0f2e7c82016-03-29 13:46:12 -0600256 echo "sdkname = $sdktempname" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700257 }
David Pinedo2912bf72016-02-04 17:04:44 -0700258
Mark Youngcee30c82016-01-20 14:48:21 -0700259 # Return to our previous folder
260 Pop-Location
261
262 # Only update the overall script-scope SDK name if we're told to
263 if ($writeSdkName -ne 0) {
264 $script:sdkname = $sdktempname
265 }
266
267 return
David Pinedoca905612016-01-04 16:31:57 -0700268}
269
Mark Younga84173b2016-01-15 15:09:39 -0700270# We only care about SYSWOW64 if we're targeting a 64-bit OS
Mark Young02d4d422016-01-19 15:29:34 -0700271if ($ossize -eq 64) {
Mark Younga84173b2016-01-15 15:09:39 -0700272 # Update the SYSWOW64 Vulkan DLLS/EXEs
David Pinedo0f2e7c82016-03-29 13:46:12 -0600273 echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log
Mark Young0a1c0d02016-02-12 12:07:45 -0700274 UpdateVulkanSysFolder $winfolder\SYSWOW64 0
Mark Younga84173b2016-01-15 15:09:39 -0700275}
276
277# Update the SYSTEM32 Vulkan DLLS/EXEs
David Pinedo0f2e7c82016-03-29 13:46:12 -0600278echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log
Mark Young0a1c0d02016-02-12 12:07:45 -0700279UpdateVulkanSysFolder $winfolder\SYSTEM32 1
David Pinedoca905612016-01-04 16:31:57 -0700280
281# Create an array of vulkan sdk install dirs
282
David Pinedo0f2e7c82016-03-29 13:46:12 -0600283echo "Creating array of of Vulkan SDK Install dirs" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700284$mrVulkanDllInstallDir=""
285$VulkanSdkDirs=@()
David Pinedo2912bf72016-02-04 17:04:44 -0700286Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
David Pinedoca905612016-01-04 16:31:57 -0700287 ForEach-Object {
288 $regkey=$_ -replace ".*\\",""
289 if ($_ -match "\\VulkanSDK") {
290 # Get the install path from UninstallString
291 $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString
292 $tmp=$tmp -replace "\\Uninstall.exe.*",""
293 $tmp=$tmp -replace ".*=.",""
David Pinedo0f2e7c82016-03-29 13:46:12 -0600294 echo "Adding $tmp to VulkanSDKDirs" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700295 $VulkanSdkDirs+=$tmp
Mark Youngcee30c82016-01-20 14:48:21 -0700296 if ($regkey -eq $script:sdkname) {
David Pinedoca905612016-01-04 16:31:57 -0700297 # Save away the sdk install dir for the the most recent vulkandll
David Pinedo0f2e7c82016-03-29 13:46:12 -0600298 echo "Setting mrVulkanDllInstallDir to $tmp" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700299 $mrVulkanDllInstallDir=$tmp
300 }
301 }
302 }
303
David Pinedoc8b740a2016-03-16 14:41:56 -0600304
305# Search list of sdk install dirs for an sdk compatible with $script:sdkname.
306# We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK.
307if ($mrVulkanDllInstallDir -eq "") {
David Pinedo0f2e7c82016-03-29 13:46:12 -0600308 echo "Searching VulkanDllList" >>$log
David Pinedoc8b740a2016-03-16 14:41:56 -0600309 ForEach ($idx in ($script:VulkanDllList.Length-1)..0) {
David Pinedo0f2e7c82016-03-29 13:46:12 -0600310 $tmp=$script:VulkanDllList[$idx]
David Pinedoc8b740a2016-03-16 14:41:56 -0600311 $vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1]
312 $vulkanDllMinor=$script:VulkanDllList[$idx].Split('@')[2]
313 $vulkanDllPatch=$script:VulkanDllList[$idx].Split('@')[3]
314 $vulkanDllBuildno=$script:VulkanDllList[$idx].Split('@')[4]
315 $vulkanDllPrerelease=$script:VulkanDllList[$idx].Split('@')[5]
316 $vulkanDllPrebuildno=$script:VulkanDllList[$idx].Split('@')[6]
317 $regEntry="VulkanSDK"+$vulkanDllMajor+"."+$vulkanDllMinor+"."+$vulkanDllPatch+"."+$vulkanDllBuildno
318 if ($vulkanDllPrerelease) {
319 $regEntry=$regEntry+"."+$vulkanDllPrerelease
320 }
321 if ($vulkanDllPrebuildno) {
322 $regEntry=$regEntry+"."+$vulkanDllPrebuildno
323 }
David Pinedo0f2e7c82016-03-29 13:46:12 -0600324 echo "Comparing $regEntry" >>$log
David Pinedoc8b740a2016-03-16 14:41:56 -0600325 $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue
326 $instDir=$rval
327 $instDir=$instDir -replace "\\Uninstall.exe.*",""
328 $instDir=$instDir -replace ".*=.",""
329 if ($rval) {
330 $rval=$rval -replace ".* DisplayVersion=",""
331 $rval=$rval -replace ";.*",""
332 $reMajor=$rval.Split('.')[0]
333 $reMinor=$rval.Split('.')[1]
334 $rePatch=$rval.Split('.')[2]
335 if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {
David Pinedo0f2e7c82016-03-29 13:46:12 -0600336 echo "Setting mrVulkanDllInstallDir to $instDir" >>$log
David Pinedoc8b740a2016-03-16 14:41:56 -0600337 $mrVulkanDllInstallDir=$instDir
338 break
339 }
340 }
341 }
342}
343
David Pinedoca905612016-01-04 16:31:57 -0700344# Add C:\Vulkan\SDK\0.9.3 to list of SDK install dirs.
345# We do this because there is in a bug in SDK 0.9.3 in which layer
346# reg entries were not removed on uninstall. So we'll try to clean up
347# and remove them now.
348# This works only if 0.9.3 was installed to the default location.
349# If it was not installed to the default location, those entries will
350# need to be cleaned up manually.
351
352$VulkanSdkDirs+="C:\VulkanSDK\0.9.3"
Mark Young0a1c0d02016-02-12 12:07:45 -0700353$VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3"
David Pinedoca905612016-01-04 16:31:57 -0700354
David Pinedo2dc30bb2016-04-07 15:54:59 -0600355# Remove layer registry values associated with all installed Vulkan SDKs.
David Pinedoca905612016-01-04 16:31:57 -0700356# Note that we remove only those entries created by Vulkan SDKs. If other
357# layers were installed that are not from an SDK, we don't mess with them.
358
David Pinedo2dc30bb2016-04-07 15:54:59 -0600359echo "Removing old layer registry values from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700360Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
361 ForEach-Object {
362 $regval=$_
363 ForEach ($sdkdir in $VulkanSdkDirs) {
364 if ($regval -like "$sdkdir\*.json") {
David Pinedofe7d8f72016-01-19 21:19:11 -0700365 Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval
David Pinedo2dc30bb2016-04-07 15:54:59 -0600366 echo "Removed registry value $regval" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700367 }
368 }
369 }
David Pinedo2dc30bb2016-04-07 15:54:59 -0600370# Remove 32-bit layer registry value if we're targeting a 64-bit OS
Mark Young02d4d422016-01-19 15:29:34 -0700371if ($ossize -eq 64) {
372 Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
373 ForEach-Object {
374 $regval=$_
375 ForEach ($sdkdir in $VulkanSdkDirs) {
376 if ($regval -like "$sdkdir\*.json") {
Mark Youngcee30c82016-01-20 14:48:21 -0700377 Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval
David Pinedo2dc30bb2016-04-07 15:54:59 -0600378 echo "Removed WOW6432Node registry value $regval" >>$log
Mark Young02d4d422016-01-19 15:29:34 -0700379 }
380 }
381 }
382}
David Pinedoca905612016-01-04 16:31:57 -0700383
384
David Pinedo2dc30bb2016-04-07 15:54:59 -0600385# Create layer registry values associated with Vulkan SDK from which $mrVulkanDll is from
David Pinedoca905612016-01-04 16:31:57 -0700386
David Pinedo2dc30bb2016-04-07 15:54:59 -0600387echo "Creating new layer registry values" >>$log
David Pinedoca905612016-01-04 16:31:57 -0700388if ($mrVulkanDllInstallDir -ne "") {
David Pinedo2dc30bb2016-04-07 15:54:59 -0600389
390 # Create registry keys if they don't exist
391 if (-not (Test-Path -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers)) {
392 echo "Creating new registry key HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
393 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null
394 }
395 if ($ossize -eq 64) {
396 if (-not (Test-Path -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers)) {
397 echo "Creating new registry key HKLM\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers" >>$log
398 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null
399 }
400 }
401
402
Mark Young02d4d422016-01-19 15:29:34 -0700403 if ($ossize -eq 64) {
Mark Youngb4ab6512016-02-09 15:30:34 -0700404
David Pinedo2dc30bb2016-04-07 15:54:59 -0600405 # Create registry values in normal registry location for 64-bit items on a 64-bit OS
Mark Youngb4ab6512016-02-09 15:30:34 -0700406 Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |
407 ForEach-Object {
David Pinedo2dc30bb2016-04-07 15:54:59 -0600408 echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log
Mark Youngb4ab6512016-02-09 15:30:34 -0700409 New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null
410 }
411
David Pinedo2dc30bb2016-04-07 15:54:59 -0600412 # Create registry values for the WOW6432Node registry location for 32-bit items on a 64-bit OS
David Pinedo4e5ac882016-02-05 09:48:26 -0700413 Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
Mark Young02d4d422016-01-19 15:29:34 -0700414 ForEach-Object {
David Pinedo2dc30bb2016-04-07 15:54:59 -0600415 echo "Creating WOW6432Node registry value $mrVulkanDllInstallDir\Bin32\$_" >>$log
Mark Youngcee30c82016-01-20 14:48:21 -0700416 New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
Mark Young02d4d422016-01-19 15:29:34 -0700417 }
Mark Youngb4ab6512016-02-09 15:30:34 -0700418
419 } else {
420
David Pinedo2dc30bb2016-04-07 15:54:59 -0600421 # Create registry values in normal registry location for 32-bit items on a 32-bit OS
Mark Youngb4ab6512016-02-09 15:30:34 -0700422 Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
423 ForEach-Object {
David Pinedo2dc30bb2016-04-07 15:54:59 -0600424 echo "Creating registry value $mrVulkanDllInstallDir\Bin\$_" >>$log
Mark Youngb4ab6512016-02-09 15:30:34 -0700425 New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
426 }
427
Mark Young02d4d422016-01-19 15:29:34 -0700428 }
David Pinedoca905612016-01-04 16:31:57 -0700429}
David Pinedo8b1b7802016-03-22 14:33:50 -0600430
David Pinedo49a8e0b2016-03-29 16:26:50 -0600431# Final log output
David Pinedo0f2e7c82016-03-29 13:46:12 -0600432echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log
433(Get-Date).ToString() >>$log
434
David Pinedo49a8e0b2016-03-29 16:26:50 -0600435# Convert logfile to ascii
436cat $log | out-File -encoding ascii -filepath $logascii
437remove-item $log
438
David Pinedo0f2e7c82016-03-29 13:46:12 -0600439
440
David Pinedo8b1b7802016-03-22 14:33:50 -0600441# SIG # Begin signature block
442# MIIcZgYJKoZIhvcNAQcCoIIcVzCCHFMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
443# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
David Pinedo2dc30bb2016-04-07 15:54:59 -0600444# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUQ4I+TKoMwtXHArekRd5/bX04
445# sreggheVMIIFHjCCBAagAwIBAgIQDmYEpPtQ2iBY4vC2AGq6uzANBgkqhkiG9w0B
David Pinedo8b1b7802016-03-22 14:33:50 -0600446# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
447# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
448# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE1MDQzMDAwMDAwMFoXDTE2MDcw
449# NjEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD
450# VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE
451# AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
452# jaLJm/Joxsn/IeopiGY3XPeSZeIhjSjSlQUkDyIyDGcBG7CvfiSsXIw3EgdGkjQg
453# yBcW5YsPz9bPGPUjo5go7CwZaRkhW7/LmSkAlx0UAv8EMLuJrAZ3jBNZvpPPqfWd
454# zgi/Rkm2gWQ6eSKouy7IjcLk+EwkeBbB+UBnYfMp0BfCPzR3mPgGAJH6efAmEaqQ
455# FBCrX97joYgDqp3v8u42jALLl/Ict/GNMHLxP+QWagIHIICCRgS6s02OsildLF6R
456# nqJOOG/43f2qUD4Cab65kzlI+0+uQyOl1UlxNxp0XareghGTqECsYA03j64Esxyo
457# 2xrNbV2LJm9crTX6QthxywIDAQABo4IBuzCCAbcwHwYDVR0jBBgwFoAUWsS5eyoK
458# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFOSdVsqodGWApfCjHtAcn8sAzLBGMA4G
459# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg
460# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx
461# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
462# ZC1jcy1nMS5jcmwwQgYDVR0gBDswOTA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC
463# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBhAYIKwYBBQUHAQEEeDB2
464# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUH
465# MAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1
466# cmVkSURDb2RlU2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEB
467# CwUAA4IBAQCIt1S8zfvzMQEVmdAssjrwqBaq78xhtGPLjkNF06EvtWoV6VMLI/A6
468# 45KoULsaXeYuszLxNI+OT/b4HfD0e2LxImaTDZRmCLeIs+2pMLSlWDSV4okm8Vk2
469# rObLBlgiI1x0PiMa1le9D832COWM4EJcH7pxM+9JfiHYMLlZbcfNEVgv6Dhhl4MG
470# mOTMTl7vQNNQaJ1coNVf9m5Bez1DV9Iu2Cgd8BHp1oLVCQCHjVv0Ifj48RIPi4SQ
471# khzalrnrf+L/BWRDhpLnxYasazdV5WfrMHurPuBvYUiLQNkU9SqKgRk9XrzDAfMe
472# gPbGybMr0kqtbE/A/cDcTVnvRuTZnhXSMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1
473# U0O1b5VQCDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
474# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD
475# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcN
476# MjgxMDIyMTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
477# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2Vy
478# dCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B
479# AQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid
480# 2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sj
481# lOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjf
482# DPXiTWAYvqrEsq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzL
483# fnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR
484# 93O8vYWxYoNzQYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckw
485# EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI
486# KwYBBQUHAwMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
487# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj
488# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw
489# OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
490# RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp
491# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIE
492# MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYI
493# YIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQY
494# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1a
495# JLPzItEVyCx8JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUP
496# UbRupY5a4l4kgU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1
497# UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjF
498# Emifz0DLQESlE/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM
499# 1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhs
500# RDKyZqHnGKSaZFHvMIIGajCCBVKgAwIBAgIQAwGaAjr/WLFr1tXq5hfwZjANBgkq
501# hkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
502# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBB
503# c3N1cmVkIElEIENBLTEwHhcNMTQxMDIyMDAwMDAwWhcNMjQxMDIyMDAwMDAwWjBH
504# MQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxJTAjBgNVBAMTHERpZ2lD
505# ZXJ0IFRpbWVzdGFtcCBSZXNwb25kZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
506# ggEKAoIBAQCjZF38fLPggjXg4PbGKuZJdTvMbuBTqZ8fZFnmfGt/a4ydVfiS457V
507# WmNbAklQ2YPOb2bu3cuF6V+l+dSHdIhEOxnJ5fWRn8YUOawk6qhLLJGJzF4o9GS2
508# ULf1ErNzlgpno75hn67z/RJ4dQ6mWxT9RSOOhkRVfRiGBYxVh3lIRvfKDo2n3k5f
509# 4qi2LVkCYYhhchhoubh87ubnNC8xd4EwH7s2AY3vJ+P3mvBMMWSN4+v6GYeofs/s
510# jAw2W3rBerh4x8kGLkYQyI3oBGDbvHN0+k7Y/qpA8bLOcEaD6dpAoVk62RUJV5lW
511# MJPzyWHM0AjMa+xiQpGsAsDvpPCJEY93AgMBAAGjggM1MIIDMTAOBgNVHQ8BAf8E
512# BAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCCAb8G
513# A1UdIASCAbYwggGyMIIBoQYJYIZIAYb9bAcBMIIBkjAoBggrBgEFBQcCARYcaHR0
514# cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCCAWQGCCsGAQUFBwICMIIBVh6CAVIA
515# QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA
516# YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A
517# YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA
518# UwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAA
519# QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA
520# YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA
521# YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA
522# LjALBglghkgBhv1sAxUwHwYDVR0jBBgwFoAUFQASKxOYspkH7R7for5XDStnAs0w
523# HQYDVR0OBBYEFGFaTSS2STKdSip5GoNL9B6Jwcp9MH0GA1UdHwR2MHQwOKA2oDSG
524# Mmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEu
525# Y3JsMDigNqA0hjJodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
526# cmVkSURDQS0xLmNybDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6
527# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMu
528# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcnQwDQYJKoZIhvcN
529# AQEFBQADggEBAJ0lfhszTbImgVybhs4jIA+Ah+WI//+x1GosMe06FxlxF82pG7xa
530# FjkAneNshORaQPveBgGMN/qbsZ0kfv4gpFetW7easGAm6mlXIV00Lx9xsIOUGQVr
531# NZAQoHuXx/Y/5+IRQaa9YtnwJz04HShvOlIJ8OxwYtNiS7Dgc6aSwNOOMdgv420X
532# Ewbu5AO2FKvzj0OncZ0h3RTKFV2SQdr5D4HRmXQNJsQOfxu19aDxxncGKBXp2JPl
533# VRbwuwqrHNtcSCdmyKOLChzlldquxC5ZoGHd2vNtomHpigtt7BIYvfdVVEADkitr
534# wlHCCkivsNRu4PQUCjob4489yq9qjXvc2EQwggbNMIIFtaADAgECAhAG/fkDlgOt
535# 6gAK6z8nu7obMA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
536# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
537# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBa
538# Fw0yMTExMTAwMDAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
539# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
540# ZXJ0IEFzc3VyZWQgSUQgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
541# ggEBAOiCLZn5ysJClaWAc0Bw0p5WVFypxNJBBo/JM/xNRZFcgZ/tLJz4FlnfnrUk
542# FcKYubR3SdyJxArar8tea+2tsHEx6886QAxGTZPsi3o2CAOrDDT+GEmC/sfHMUiA
543# fB6iD5IOUMnGh+s2P9gww/+m9/uizW9zI/6sVgWQ8DIhFonGcIj5BZd9o8dD3QLo
544# Oz3tsUGj7T++25VIxO4es/K8DCuZ0MZdEkKB4YNugnM/JksUkK5ZZgrEjb7Szgau
545# rYRvSISbT0C58Uzyr5j79s5AXVz2qPEvr+yJIvJrGGWxwXOt1/HYzx4KdFxCuGh+
546# t9V3CidWfA9ipD8yFGCV/QcEogkCAwEAAaOCA3owggN2MA4GA1UdDwEB/wQEAwIB
547# hjA7BgNVHSUENDAyBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEF
548# BQcDBAYIKwYBBQUHAwgwggHSBgNVHSAEggHJMIIBxTCCAbQGCmCGSAGG/WwAAQQw
549# ggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9zc2wtY3Bz
550# LXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUA
551# cwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMA
552# bwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYA
553# IAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQA
554# IAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUA
555# bQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkA
556# dAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAA
557# aABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG
558# /WwDFTASBgNVHRMBAf8ECDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
559# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
560# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
561# Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
562# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5k
563# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQW
564# BBQVABIrE5iymQftHt+ivlcNK2cCzTAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
565# pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEARlA+ybcoJKc4HbZbKa9Sz1LpMUer
566# Vlx71Q0LQbPv7HUfdDjyslxhopyVw1Dkgrkj0bo6hnKtOHisdV0XFzRyR4WUVtHr
567# uzaEd8wkpfMEGVWp5+Pnq2LN+4stkMLA0rWUvV5PsQXSDj0aqRRbpoYxYqioM+Sb
568# OafE9c4deHaUJXPkKqvPnHZL7V/CSxbkS3BMAIke/MV5vEwSV/5f4R68Al2o/vsH
569# OE8Nxl2RuQ9nRc3Wg+3nkg2NsWmMT/tZ4CMP0qquAHzunEIOz5HXJ7cW7g/DvXwK
570# oO4sCFWFIrjrGBpN/CohrUkxg0eVd3HcsRtLSxwQnHcUwZ1PL1qVCCkQJjGCBDsw
571# ggQ3AgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
572# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI
573# QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEA5mBKT7UNogWOLwtgBqursw
574# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
575# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
David Pinedo2dc30bb2016-04-07 15:54:59 -0600576# IwYJKoZIhvcNAQkEMRYEFAoOC46C6ArmxtlmLsUTidSbkN3rMA0GCSqGSIb3DQEB
577# AQUABIIBADXG8YUKEPQHyMUpBvGWwb5VeZ8oWPyiSSE649GXu5tHDn+N2lhDPngR
578# Cksh4FpF56hP4RgTzH/Nmxf2D4kZUzPCrs2Il1S+U0ZoFpoAwrN8dbnvw2Wvf7ns
579# LZHXKG9eIaMYx6r/nn+VV8qvL/25fZ8oNyIFCYy4FYRLmla5g1+Vmtg6anHj89c+
580# EMSIwR8BR5UlAagfhfKJQHYMz4xkdqMrR6ZDsMHvYjbOg3MILrrdgomH2R5JKAHK
581# IaD3EqM+Tgu8LH1MMt/hIf4RS/lgqT12qM88J64dyhquaM1BUzw5dnwb+h3aAF2O
582# ZJ4IhONECJbJf8wVT8rTUA+6uUm/Y6ihggIPMIICCwYJKoZIhvcNAQkGMYIB/DCC
David Pinedo8b1b7802016-03-22 14:33:50 -0600583# AfgCAQEwdjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
584# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1
585# cmVkIElEIENBLTECEAMBmgI6/1ixa9bV6uYX8GYwCQYFKw4DAhoFAKBdMBgGCSqG
David Pinedo2dc30bb2016-04-07 15:54:59 -0600586# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2MDQwNzIxNTM0
587# OFowIwYJKoZIhvcNAQkEMRYEFERKj5qmhGjIIeKV/myZFhJ/EUO7MA0GCSqGSIb3
588# DQEBAQUABIIBAJYQytkxzpn/UVwVJ0tsompGzVKSEgjuqAiI2jA0LiQwWM9iBHpG
589# 8ijDH6Dh+Fqa1JSsynyFixF26SuHeDoY/LX14HhRPDEkBa70qt9h9gc/73f9AzUy
590# eSbxwRhlF/UAyk0E3fbK1of431HxfvcdhnvCIDW8orfiG5v7gS0Mub4C70TlMXTp
591# b6XT1orYqnih9j4EVCYWZwv+EsOADRHW7o1RvIC2gI2dzmAkMSEjehk3we6u8KXI
592# xkggPOXy5O8TFgFdjvKU6XaoTTCklKWFIQIRG9r5m//Qj3jwzwN/03gLPphi6zze
593# 8fAJmClDyH+kHivSSfFnFUB7elvajTvasQE=
David Pinedo8b1b7802016-03-22 14:33:50 -0600594# SIG # End signature block