blob: dcbf257ced806689be4426f7e166a46d66306197 [file] [log] [blame]
David Pinedo1e368f72016-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 Pinedoc21fdb92016-01-04 16:31:57 -07004#
David Pinedo1e368f72016-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 Pinedoc21fdb92016-01-04 16:31:57 -070011#
David Pinedo1e368f72016-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 Pinedoc21fdb92016-01-04 16:31:57 -070014#
David Pinedo1e368f72016-02-04 17:04:44 -070015# THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
David Pinedoc21fdb92016-01-04 16:31:57 -070016# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
David Pinedo1e368f72016-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 Pinedoc21fdb92016-01-04 16:31:57 -070023#
24# Author: David Pinedo <david@LunarG.com>
David Pinedo1e368f72016-02-04 17:04:44 -070025# Author: Mark Young <mark@LunarG.com>
David Pinedoc21fdb92016-01-04 16:31:57 -070026#
27
David Pinedo1e368f72016-02-04 17:04:44 -070028
David Pinedoc21fdb92016-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 Young4b8b5482016-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 Pinedoc21fdb92016-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 Youngaf87f222016-01-20 16:33:18 -070039# This script takes the following parameters:
Mark Young4b8b5482016-01-15 15:09:39 -070040# $majorabi : a single string number specifying the major abi version.
Mark Youngaf87f222016-01-20 16:33:18 -070041# $ossize : an integer indicating if the target is a 64 (64) or 32 (32) bit OS.
David Pinedoc21fdb92016-01-04 16:31:57 -070042#
43
Mark Young4b8b5482016-01-15 15:09:39 -070044Param(
45 [string]$majorabi,
46 [int]$ossize
47)
David Pinedoc21fdb92016-01-04 16:31:57 -070048
David Pinedoef68bbe2016-03-29 13:46:12 -060049# Start logging
50$log=$Env:Temp+"\VulkanRT"
51New-Item -ItemType Directory -Force -Path $log | Out-Null
52$log=$log+"\ConfigLayersAndVulkanDLL.log"
53echo "ConfigLayersAndVulkanDLL.ps1 $majorabi $ossize" >$log
54(Get-Date).ToString() >>$log
55
David Pinedoc21fdb92016-01-04 16:31:57 -070056$vulkandll = "vulkan-"+$majorabi+".dll"
Mark Young71e2a402016-02-12 12:07:45 -070057$windrive = $env:SYSTEMDRIVE
58$winfolder = $env:SYSTEMROOT
David Pinedod133b782016-03-16 14:41:56 -060059$script:VulkanDllList=@()
David Pinedoc21fdb92016-01-04 16:31:57 -070060
David Pinedoc27e0442016-03-15 11:07:19 -060061function notNumeric ($x) {
62 try {
63 0 + $x | Out-Null
64 return $false
65 } catch {
66 return $true
67 }
68}
69
David Pinedoc21fdb92016-01-04 16:31:57 -070070# The name of the versioned vulkan dll file is one of the following:
71#
David Pinedo3bdbe5d2016-01-12 16:14:53 -070072# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>-<prebuildno>
73# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prerelease>
74# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>-<prebuildno>
David Pinedoc21fdb92016-01-04 16:31:57 -070075# vulkan-<majorabi>-<major>-<minor>-<patch>-<buildno>.dll
David Pinedoc21fdb92016-01-04 16:31:57 -070076#
David Pinedo3bdbe5d2016-01-12 16:14:53 -070077# <major>, <minor>, <patch>, <buildno> and <prebuildno> are 1 to 10 numeric digits.
78# <prerelease> is any combination of alpha and numeric characters.
79# If <prerelease> and/or <prebuildno> are present, this identifies a prerelease,
80# and the vulkan dll file will be considered less recent than one with the same
81# <major>, <minor>, <patch>, <buildno> numbers without the <prerelease> and/or
82# <prebuildno>.
David Pinedoc21fdb92016-01-04 16:31:57 -070083
84
85# We first create an array, with one array element for each vulkan-*dll in
Mark Young4b8b5482016-01-15 15:09:39 -070086# C:\Windows\System32 (and C:\Windows\SysWOW64 on 64-bit systems), with each element
87# containing:
David Pinedo3bdbe5d2016-01-12 16:14:53 -070088# <major>=<minor>=<patch>=<buildno>=<prerelease>=<prebuildno>=
David Pinedoc21fdb92016-01-04 16:31:57 -070089# filename
David Pinedo3bdbe5d2016-01-12 16:14:53 -070090# @<major>@<minor>@<patch>@<buildno>@<prerelease>@<prebuildno>@
David Pinedoc21fdb92016-01-04 16:31:57 -070091# [Note that the above three lines are one element in the array.]
92# The build identifiers separated by "=" are suitable for sorting, i.e.
David Pinedo3bdbe5d2016-01-12 16:14:53 -070093# expanded to 10 digits with leading 0s. If <prerelease> or <prebuildno> are
94# not specified, "zzzzzzzzzz" is substituted for them, so that they sort
David Pinedoc21fdb92016-01-04 16:31:57 -070095# to a position after those that do specify them.
96# The build identifiers separated by "@" are the original values extracted
97# from the file name. They are used later to find the path to the SDK
98# install directory for the given filename.
99
David Pinedoc27e0442016-03-15 11:07:19 -0600100
Mark Youngd6897a32016-01-20 14:48:21 -0700101function UpdateVulkanSysFolder([string]$dir, [int]$writeSdkName)
Mark Younga81e6082016-01-15 12:35:39 -0700102{
David Pinedoef68bbe2016-03-29 13:46:12 -0600103 echo "UpdateVulkanSysFolder $dir $writeSdkName" >>$log
104
Mark Younga81e6082016-01-15 12:35:39 -0700105 # Push the current path on the stack and go to $dir
106 Push-Location -Path $dir
David Pinedo1e368f72016-02-04 17:04:44 -0700107
David Pinedod133b782016-03-16 14:41:56 -0600108 # Create a list for all the DLLs in the folder.
109 # First Initialize the list to empty
110 $script:VulkanDllList = @()
David Pinedo1e368f72016-02-04 17:04:44 -0700111
David Pinedoef68bbe2016-03-29 13:46:12 -0600112 # Find all vulkan dll files in this directory
Mark Younga81e6082016-01-15 12:35:39 -0700113 dir -name vulkan-$majorabi-*.dll |
David Pinedoc21fdb92016-01-04 16:31:57 -0700114 ForEach-Object {
David Pinedoef68bbe2016-03-29 13:46:12 -0600115 echo "File $_" >>$log
David Pinedoc27e0442016-03-15 11:07:19 -0600116 if ($_ -match "=" -or
117 $_ -match "@" -or
118 $_ -match " " -or
119 ($_.Split('-').count -lt 6) -or
120 ($_.Split('-').count -gt 8))
121 {
122 # If a file name contains "=", "@", or " ", or it contains less then 5 dashes or more than
123 # 7 dashes, it wasn't installed by the Vulkan Run Time.
124 # Note that we need to use return inside of ForEach-Object is to continue with iteration.
David Pinedoef68bbe2016-03-29 13:46:12 -0600125 echo "Rejected $_ - bad format" >>$log
David Pinedoc27e0442016-03-15 11:07:19 -0600126 return
127 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600128
129 # If the corresponding vulkaninfo is not present, it wasn't installed by the Vulkan Run Time
130 $vulkaninfo=$_ -replace ".dll",".exe"
131 $vulkaninfo=$vulkaninfo -replace "vulkan","vulkaninfo"
132 if (-not (Test-Path $vulkaninfo)) {
133 echo "Rejected $_ - vulkaninfo not present" >>$log
134 return
135 }
136
David Pinedoc21fdb92016-01-04 16:31:57 -0700137 $major=$_.Split('-')[2]
138 $majorOrig=$major
139 $minor=$_.Split('-')[3]
140 $minorOrig=$minor
141 $patch=$_.Split('-')[4]
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700142 $patchOrig=$patch
143 $buildno=$_.Split('-')[5]
David Pinedoc21fdb92016-01-04 16:31:57 -0700144
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700145 if ($buildno -match ".dll") {
David Pinedoc27e0442016-03-15 11:07:19 -0600146 # prerelease and prebuildno are not in the name
147 # Extract buildno, and set prerelease and prebuildno to "z"s
148 $buildno=$buildno -replace ".dll",""
149 $buildnoOrig=$buildno
150 $prerelease="z"*10
151 $prereleaseOrig=""
152 $prebuildno="z"*10
153 $prebuildnoOrig=""
David Pinedoc21fdb92016-01-04 16:31:57 -0700154 } else {
David Pinedoc27e0442016-03-15 11:07:19 -0600155 # Extract buildno, prerelease, and prebuildno
David Pinedoc21fdb92016-01-04 16:31:57 -0700156 $f=$_ -replace ".dll",""
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700157 $buildno=$f.Split('-')[5]
David Pinedo5da20dd2016-01-13 16:22:19 -0700158 $buildnoOrig=$buildno
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700159 $prerelease=$f.Split('-')[6]
160 $prebuildno=$f.Split('-')[7]
161 if ($prebuildno.Length -eq 0) {
David Pinedoc21fdb92016-01-04 16:31:57 -0700162 if ($prerelease -match "^[0-9]") {
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700163 # prerelease starts with a digit, it must be the prebuildno
164 $prebuildno=$prerelease
David Pinedoc21fdb92016-01-04 16:31:57 -0700165 $prerelease=""
166 }
167 }
David Pinedoc21fdb92016-01-04 16:31:57 -0700168 $prereleaseOrig=$prerelease
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700169 $prebuildnoOrig=$prebuildno
David Pinedoc21fdb92016-01-04 16:31:57 -0700170
171 if ($prerelease.Length -eq 0) {
172 $prerelease="z"*10
173 }
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700174 if ($prebuildno.Length -eq 0) {
175 $prebuildno="z"*10
David Pinedoc21fdb92016-01-04 16:31:57 -0700176 }
177 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600178 echo "Version $majorOrig $minorOrig $patchOrig $buildnoOrig $prereleaseOrig $prebuildnoOrig" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700179
David Pinedoc27e0442016-03-15 11:07:19 -0600180 # Make sure fields that are supposed to be numbers are numbers
David Pinedoef68bbe2016-03-29 13:46:12 -0600181 if (notNumeric($major)) {
182 echo "Rejected $_ - bad major" >>$log
183 return
184 }
185 if (notNumeric($minor)) {
186 echo "Rejected $_ - bad minor" >>$log
187 return
188 }
189 if (notNumeric($patch)) {
190 echo "Rejected $_ - bad patch" >>$log
191 return
192 }
193 if (notNumeric($buildno)) {
194 echo "Rejected $_ - bad buildno" >>$log
195 return
196 }
David Pinedoc27e0442016-03-15 11:07:19 -0600197 if (notNumeric($prebuildno)) {
David Pinedoef68bbe2016-03-29 13:46:12 -0600198 if ($prebuildno -ne "z"*10) {
199 echo "Rejected $_ - bad prebuildno" >>$log
200 return
201 }
David Pinedoc27e0442016-03-15 11:07:19 -0600202 }
203
David Pinedoc21fdb92016-01-04 16:31:57 -0700204 $major = $major.padleft(10,'0')
205 $minor = $minor.padleft(10,'0')
206 $patch = $patch.padleft(10,'0')
David Pinedoc21fdb92016-01-04 16:31:57 -0700207 $buildno = $buildno.padleft(10,'0')
David Pinedo3bdbe5d2016-01-12 16:14:53 -0700208 $prerelease = $prerelease.padleft(10,'0')
209 $prebuildno = $prebuildno.padleft(10,'0')
David Pinedoc21fdb92016-01-04 16:31:57 -0700210
211 # Add a new element to the $VulkanDllList array
David Pinedoef68bbe2016-03-29 13:46:12 -0600212 echo "Adding $_ to Vulkan dll list " >>$log
David Pinedod133b782016-03-16 14:41:56 -0600213 $script:VulkanDllList+="$major=$minor=$patch=$buildno=$prerelease=$prebuildno= $_ @$majorOrig@$minorOrig@$patchOrig@$buildnoOrig@$prereleaseOrig@$prebuildnoOrig@"
David Pinedoc21fdb92016-01-04 16:31:57 -0700214 }
215
Mark Younga81e6082016-01-15 12:35:39 -0700216 # If $VulkanDllList contains at least one element, there's at least one vulkan*.dll file.
217 # Copy the most recent vulkan*.dll (named in the last element of $VulkanDllList) to vulkan-$majorabi.dll.
David Pinedoc21fdb92016-01-04 16:31:57 -0700218
David Pinedod133b782016-03-16 14:41:56 -0600219 if ($script:VulkanDllList.Length -gt 0) {
David Pinedoc21fdb92016-01-04 16:31:57 -0700220
Mark Younga81e6082016-01-15 12:35:39 -0700221 # Sort the list. The most recent vulkan-*.dll will be in the last element of the list.
David Pinedod133b782016-03-16 14:41:56 -0600222 [array]::sort($script:VulkanDllList)
David Pinedoc21fdb92016-01-04 16:31:57 -0700223
Mark Younga81e6082016-01-15 12:35:39 -0700224 # Put the name of the most recent vulkan-*.dll in $mrVulkanDLL.
225 # The most recent vulkanDLL is the second word in the last element of the
226 # sorted $VulkanDllList. Copy it to $vulkandll.
David Pinedod133b782016-03-16 14:41:56 -0600227 $mrVulkanDll=$script:VulkanDllList[-1].Split(' ')[1]
David Pinedoef68bbe2016-03-29 13:46:12 -0600228 echo "copy $mrVulkanDll $vulkandll" >>$log
Mark Younga81e6082016-01-15 12:35:39 -0700229 copy $mrVulkanDll $vulkandll
David Pinedoc21fdb92016-01-04 16:31:57 -0700230
Mark Younga81e6082016-01-15 12:35:39 -0700231 # Copy the most recent version of vulkaninfo-<abimajor>-*.exe to vulkaninfo.exe.
232 # We create the source file name for the copy from $mrVulkanDll.
233 $mrVulkaninfo=$mrVulkanDll -replace ".dll",".exe"
234 $mrVulkaninfo=$mrVulkaninfo -replace "vulkan","vulkaninfo"
David Pinedoef68bbe2016-03-29 13:46:12 -0600235 echo "copy $mrVulkaninfo vulkaninfo.exe" >>$log
Mark Younga81e6082016-01-15 12:35:39 -0700236 copy $mrVulkaninfo vulkaninfo.exe
David Pinedo1e368f72016-02-04 17:04:44 -0700237
Mark Younga81e6082016-01-15 12:35:39 -0700238 # Create the name used in the registry for the SDK associated with $mrVulkanDll.
David Pinedod133b782016-03-16 14:41:56 -0600239 $major=$script:VulkanDllList[-1].Split('@')[1]
240 $minor=$script:VulkanDllList[-1].Split('@')[2]
241 $patch=$script:VulkanDllList[-1].Split('@')[3]
242 $buildno=$script:VulkanDllList[-1].Split('@')[4]
243 $prerelease=$script:VulkanDllList[-1].Split('@')[5]
244 $prebuildno=$script:VulkanDllList[-1].Split('@')[6]
David Pinedo1e368f72016-02-04 17:04:44 -0700245
Mark Youngd6897a32016-01-20 14:48:21 -0700246 $sdktempname="VulkanSDK"+$major + "." + $minor + "." + $patch + "." + $buildno
Mark Younga81e6082016-01-15 12:35:39 -0700247 if ($prerelease -ne "") {
Mark Youngd6897a32016-01-20 14:48:21 -0700248 $sdktempname=$sdktempname + "." + $prerelease
Mark Younga81e6082016-01-15 12:35:39 -0700249 }
250 if ($prebuildno -ne "") {
Mark Youngd6897a32016-01-20 14:48:21 -0700251 $sdktempname=$sdktempname + "." + $prebuildno
Mark Younga81e6082016-01-15 12:35:39 -0700252 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600253 echo "sdkname = $sdktempname" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700254 }
David Pinedo1e368f72016-02-04 17:04:44 -0700255
Mark Youngd6897a32016-01-20 14:48:21 -0700256 # Return to our previous folder
257 Pop-Location
258
259 # Only update the overall script-scope SDK name if we're told to
260 if ($writeSdkName -ne 0) {
261 $script:sdkname = $sdktempname
262 }
263
264 return
David Pinedoc21fdb92016-01-04 16:31:57 -0700265}
266
Mark Young4b8b5482016-01-15 15:09:39 -0700267# We only care about SYSWOW64 if we're targeting a 64-bit OS
Mark Youngb628d162016-01-19 15:29:34 -0700268if ($ossize -eq 64) {
Mark Young4b8b5482016-01-15 15:09:39 -0700269 # Update the SYSWOW64 Vulkan DLLS/EXEs
David Pinedoef68bbe2016-03-29 13:46:12 -0600270 echo "Calling UpdateVulkanSysFolder $winfolder\SYSWOW64 0" >>$log
Mark Young71e2a402016-02-12 12:07:45 -0700271 UpdateVulkanSysFolder $winfolder\SYSWOW64 0
Mark Young4b8b5482016-01-15 15:09:39 -0700272}
273
274# Update the SYSTEM32 Vulkan DLLS/EXEs
David Pinedoef68bbe2016-03-29 13:46:12 -0600275echo "Calling UpdateVulkanSysFolder $winfolder\SYSTEM32 1" >>$log
Mark Young71e2a402016-02-12 12:07:45 -0700276UpdateVulkanSysFolder $winfolder\SYSTEM32 1
David Pinedoc21fdb92016-01-04 16:31:57 -0700277
278# Create an array of vulkan sdk install dirs
279
David Pinedoef68bbe2016-03-29 13:46:12 -0600280echo "Creating array of of Vulkan SDK Install dirs" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700281$mrVulkanDllInstallDir=""
282$VulkanSdkDirs=@()
David Pinedo1e368f72016-02-04 17:04:44 -0700283Get-ChildItem -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall |
David Pinedoc21fdb92016-01-04 16:31:57 -0700284 ForEach-Object {
285 $regkey=$_ -replace ".*\\",""
286 if ($_ -match "\\VulkanSDK") {
287 # Get the install path from UninstallString
288 $tmp=Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regkey -Name UninstallString
289 $tmp=$tmp -replace "\\Uninstall.exe.*",""
290 $tmp=$tmp -replace ".*=.",""
David Pinedoef68bbe2016-03-29 13:46:12 -0600291 echo "Adding $tmp to VulkanSDKDirs" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700292 $VulkanSdkDirs+=$tmp
Mark Youngd6897a32016-01-20 14:48:21 -0700293 if ($regkey -eq $script:sdkname) {
David Pinedoc21fdb92016-01-04 16:31:57 -0700294 # Save away the sdk install dir for the the most recent vulkandll
David Pinedoef68bbe2016-03-29 13:46:12 -0600295 echo "Setting mrVulkanDllInstallDir to $tmp" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700296 $mrVulkanDllInstallDir=$tmp
297 }
298 }
299 }
300
David Pinedod133b782016-03-16 14:41:56 -0600301
302# Search list of sdk install dirs for an sdk compatible with $script:sdkname.
303# We go backwards through VulkanDllList to generate SDK names, because we want the most recent SDK.
304if ($mrVulkanDllInstallDir -eq "") {
David Pinedoef68bbe2016-03-29 13:46:12 -0600305 echo "Searching VulkanDllList" >>$log
David Pinedod133b782016-03-16 14:41:56 -0600306 ForEach ($idx in ($script:VulkanDllList.Length-1)..0) {
David Pinedoef68bbe2016-03-29 13:46:12 -0600307 $tmp=$script:VulkanDllList[$idx]
David Pinedod133b782016-03-16 14:41:56 -0600308 $vulkanDllMajor=$script:VulkanDllList[$idx].Split('@')[1]
309 $vulkanDllMinor=$script:VulkanDllList[$idx].Split('@')[2]
310 $vulkanDllPatch=$script:VulkanDllList[$idx].Split('@')[3]
311 $vulkanDllBuildno=$script:VulkanDllList[$idx].Split('@')[4]
312 $vulkanDllPrerelease=$script:VulkanDllList[$idx].Split('@')[5]
313 $vulkanDllPrebuildno=$script:VulkanDllList[$idx].Split('@')[6]
314 $regEntry="VulkanSDK"+$vulkanDllMajor+"."+$vulkanDllMinor+"."+$vulkanDllPatch+"."+$vulkanDllBuildno
315 if ($vulkanDllPrerelease) {
316 $regEntry=$regEntry+"."+$vulkanDllPrerelease
317 }
318 if ($vulkanDllPrebuildno) {
319 $regEntry=$regEntry+"."+$vulkanDllPrebuildno
320 }
David Pinedoef68bbe2016-03-29 13:46:12 -0600321 echo "Comparing $regEntry" >>$log
David Pinedod133b782016-03-16 14:41:56 -0600322 $rval=Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\$regEntry -ErrorAction SilentlyContinue
323 $instDir=$rval
324 $instDir=$instDir -replace "\\Uninstall.exe.*",""
325 $instDir=$instDir -replace ".*=.",""
326 if ($rval) {
327 $rval=$rval -replace ".* DisplayVersion=",""
328 $rval=$rval -replace ";.*",""
329 $reMajor=$rval.Split('.')[0]
330 $reMinor=$rval.Split('.')[1]
331 $rePatch=$rval.Split('.')[2]
332 if ($reMajor+$reMinor+$rePatch -eq $vulkanDllMajor+$vulkanDllMinor+$vulkanDllPatch) {
David Pinedoef68bbe2016-03-29 13:46:12 -0600333 echo "Setting mrVulkanDllInstallDir to $instDir" >>$log
David Pinedod133b782016-03-16 14:41:56 -0600334 $mrVulkanDllInstallDir=$instDir
335 break
336 }
337 }
338 }
339}
340
David Pinedoc21fdb92016-01-04 16:31:57 -0700341# Add C:\Vulkan\SDK\0.9.3 to list of SDK install dirs.
342# We do this because there is in a bug in SDK 0.9.3 in which layer
343# reg entries were not removed on uninstall. So we'll try to clean up
344# and remove them now.
345# This works only if 0.9.3 was installed to the default location.
346# If it was not installed to the default location, those entries will
347# need to be cleaned up manually.
348
349$VulkanSdkDirs+="C:\VulkanSDK\0.9.3"
Mark Young71e2a402016-02-12 12:07:45 -0700350$VulkanSdkDirs+="$windrive\VulkanSDK\0.9.3"
David Pinedoc21fdb92016-01-04 16:31:57 -0700351
David Pinedoc21fdb92016-01-04 16:31:57 -0700352# Remove layer registry entries associated with all installed Vulkan SDKs.
353# Note that we remove only those entries created by Vulkan SDKs. If other
354# layers were installed that are not from an SDK, we don't mess with them.
355
David Pinedoef68bbe2016-03-29 13:46:12 -0600356echo "Removing old layer registry entries from HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700357Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
358 ForEach-Object {
359 $regval=$_
360 ForEach ($sdkdir in $VulkanSdkDirs) {
361 if ($regval -like "$sdkdir\*.json") {
David Pinedo9bb478f2016-01-19 21:19:11 -0700362 Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -name $regval
David Pinedoef68bbe2016-03-29 13:46:12 -0600363 echo "Removed registry entry $regval" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700364 }
365 }
366 }
Mark Youngb628d162016-01-19 15:29:34 -0700367# Remove 32-bit layer registry entries if we're targeting a 64-bit OS
368if ($ossize -eq 64) {
369 Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | Select-Object -ExpandProperty Property |
370 ForEach-Object {
371 $regval=$_
372 ForEach ($sdkdir in $VulkanSdkDirs) {
373 if ($regval -like "$sdkdir\*.json") {
Mark Youngd6897a32016-01-20 14:48:21 -0700374 Remove-ItemProperty -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -name $regval
David Pinedoef68bbe2016-03-29 13:46:12 -0600375 echo "Removed WOW6432Node registry entry $regval" >>$log
Mark Youngb628d162016-01-19 15:29:34 -0700376 }
377 }
378 }
379}
David Pinedoc21fdb92016-01-04 16:31:57 -0700380
381
382# Create layer registry entries associated with Vulkan SDK from which $mrVulkanDll is from
383
David Pinedoef68bbe2016-03-29 13:46:12 -0600384echo "Creating new layer registry entries in HKLM\SOFTWARE\Khronos\Vulkan\ExplicitLayers" >>$log
David Pinedoc21fdb92016-01-04 16:31:57 -0700385if ($mrVulkanDllInstallDir -ne "") {
Mark Youngb628d162016-01-19 15:29:34 -0700386 if ($ossize -eq 64) {
Mark Young51d35072016-02-09 15:30:34 -0700387
388 # Create registry entires in normal registry location for 64-bit items on a 64-bit OS
389 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null
390 Get-ChildItem $mrVulkanDllInstallDir\Bin -Filter VkLayer*json |
391 ForEach-Object {
392 New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin\$_ -PropertyType DWord -Value 0 | out-null
David Pinedoef68bbe2016-03-29 13:46:12 -0600393 echo "Created registry entry for $mrVulkanDllInstallDir\Bin\$_" >>$log
Mark Young51d35072016-02-09 15:30:34 -0700394 }
395
396 # Create registry entires for the WOW6432Node registry location for 32-bit items on a 64-bit OS
397 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers | out-null
David Pinedo431b82a2016-02-05 09:48:26 -0700398 Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
Mark Youngb628d162016-01-19 15:29:34 -0700399 ForEach-Object {
Mark Youngd6897a32016-01-20 14:48:21 -0700400 New-ItemProperty -Path HKLM:\SOFTWARE\WOW6432Node\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
David Pinedoef68bbe2016-03-29 13:46:12 -0600401 echo "Created WOW6432Node registry entry for $mrVulkanDllInstallDir\Bin32\$_" >>$log
Mark Youngb628d162016-01-19 15:29:34 -0700402 }
Mark Young51d35072016-02-09 15:30:34 -0700403
404 } else {
405
406 # Create registry entires in normal registry location for 32-bit items on a 32-bit OS
407 New-Item -Force -ErrorAction SilentlyContinue -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers | out-null
408 Get-ChildItem $mrVulkanDllInstallDir\Bin32 -Filter VkLayer*json |
409 ForEach-Object {
410 New-ItemProperty -Path HKLM:\SOFTWARE\Khronos\Vulkan\ExplicitLayers -Name $mrVulkanDllInstallDir\Bin32\$_ -PropertyType DWord -Value 0 | out-null
David Pinedoef68bbe2016-03-29 13:46:12 -0600411 echo "Created registry entry for $mrVulkanDllInstallDir\Bin\$_" >>$log
Mark Young51d35072016-02-09 15:30:34 -0700412 }
413
Mark Youngb628d162016-01-19 15:29:34 -0700414 }
David Pinedoc21fdb92016-01-04 16:31:57 -0700415}
David Pinedo0b5e2082016-03-22 14:33:50 -0600416
David Pinedoef68bbe2016-03-29 13:46:12 -0600417echo "ConfigLayersAndVulkanDLL.ps1 completed" >>$log
418(Get-Date).ToString() >>$log
419
420
421
David Pinedo0b5e2082016-03-22 14:33:50 -0600422# SIG # Begin signature block
423# MIIcZgYJKoZIhvcNAQcCoIIcVzCCHFMCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
424# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
David Pinedoef68bbe2016-03-29 13:46:12 -0600425# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUXAaVuJRboqiwfHon/TJIXS0m
426# ohqggheVMIIFHjCCBAagAwIBAgIQDmYEpPtQ2iBY4vC2AGq6uzANBgkqhkiG9w0B
David Pinedo0b5e2082016-03-22 14:33:50 -0600427# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
428# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
429# c3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMB4XDTE1MDQzMDAwMDAwMFoXDTE2MDcw
430# NjEyMDAwMFowZTELMAkGA1UEBhMCVVMxETAPBgNVBAgTCENvbG9yYWRvMRUwEwYD
431# VQQHEwxGb3J0IENvbGxpbnMxFTATBgNVBAoTDEx1bmFyRywgSW5jLjEVMBMGA1UE
432# AxMMTHVuYXJHLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
433# jaLJm/Joxsn/IeopiGY3XPeSZeIhjSjSlQUkDyIyDGcBG7CvfiSsXIw3EgdGkjQg
434# yBcW5YsPz9bPGPUjo5go7CwZaRkhW7/LmSkAlx0UAv8EMLuJrAZ3jBNZvpPPqfWd
435# zgi/Rkm2gWQ6eSKouy7IjcLk+EwkeBbB+UBnYfMp0BfCPzR3mPgGAJH6efAmEaqQ
436# FBCrX97joYgDqp3v8u42jALLl/Ict/GNMHLxP+QWagIHIICCRgS6s02OsildLF6R
437# nqJOOG/43f2qUD4Cab65kzlI+0+uQyOl1UlxNxp0XareghGTqECsYA03j64Esxyo
438# 2xrNbV2LJm9crTX6QthxywIDAQABo4IBuzCCAbcwHwYDVR0jBBgwFoAUWsS5eyoK
439# o6XqcQPAYPkt9mV1DlgwHQYDVR0OBBYEFOSdVsqodGWApfCjHtAcn8sAzLBGMA4G
440# A1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzB3BgNVHR8EcDBuMDWg
441# M6Axhi9odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vc2hhMi1hc3N1cmVkLWNzLWcx
442# LmNybDA1oDOgMYYvaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
443# ZC1jcy1nMS5jcmwwQgYDVR0gBDswOTA3BglghkgBhv1sAwEwKjAoBggrBgEFBQcC
444# ARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBhAYIKwYBBQUHAQEEeDB2
445# MCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wTgYIKwYBBQUH
446# MAKGQmh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFNIQTJBc3N1
447# cmVkSURDb2RlU2lnbmluZ0NBLmNydDAMBgNVHRMBAf8EAjAAMA0GCSqGSIb3DQEB
448# CwUAA4IBAQCIt1S8zfvzMQEVmdAssjrwqBaq78xhtGPLjkNF06EvtWoV6VMLI/A6
449# 45KoULsaXeYuszLxNI+OT/b4HfD0e2LxImaTDZRmCLeIs+2pMLSlWDSV4okm8Vk2
450# rObLBlgiI1x0PiMa1le9D832COWM4EJcH7pxM+9JfiHYMLlZbcfNEVgv6Dhhl4MG
451# mOTMTl7vQNNQaJ1coNVf9m5Bez1DV9Iu2Cgd8BHp1oLVCQCHjVv0Ifj48RIPi4SQ
452# khzalrnrf+L/BWRDhpLnxYasazdV5WfrMHurPuBvYUiLQNkU9SqKgRk9XrzDAfMe
453# gPbGybMr0kqtbE/A/cDcTVnvRuTZnhXSMIIFMDCCBBigAwIBAgIQBAkYG1/Vu2Z1
454# U0O1b5VQCDANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
455# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQD
456# ExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMTMxMDIyMTIwMDAwWhcN
457# MjgxMDIyMTIwMDAwWjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQg
458# SW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2Vy
459# dCBTSEEyIEFzc3VyZWQgSUQgQ29kZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0B
460# AQEFAAOCAQ8AMIIBCgKCAQEA+NOzHH8OEa9ndwfTCzFJGc/Q+0WZsTrbRPV/5aid
461# 2zLXcep2nQUut4/6kkPApfmJ1DcZ17aq8JyGpdglrA55KDp+6dFn08b7KSfH03sj
462# lOSRI5aQd4L5oYQjZhJUM1B0sSgmuyRpwsJS8hRniolF1C2ho+mILCCVrhxKhwjf
463# DPXiTWAYvqrEsq5wMWYzcT6scKKrzn/pfMuSoeU7MRzP6vIK5Fe7SrXpdOYr/mzL
464# fnQ5Ng2Q7+S1TqSp6moKq4TzrGdOtcT3jNEgJSPrCGQ+UpbB8g8S9MWOD8Gi6CxR
465# 93O8vYWxYoNzQYIH5DiLanMg0A9kczyen6Yzqf0Z3yWT0QIDAQABo4IBzTCCAckw
466# EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI
467# KwYBBQUHAwMweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz
468# cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj
469# ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw
470# OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ
471# RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp
472# Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwTwYDVR0gBEgwRjA4BgpghkgBhv1sAAIE
473# MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCgYI
474# YIZIAYb9bAMwHQYDVR0OBBYEFFrEuXsqCqOl6nEDwGD5LfZldQ5YMB8GA1UdIwQY
475# MBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBCwUAA4IBAQA+7A1a
476# JLPzItEVyCx8JSl2qB1dHC06GsTvMGHXfgtg/cM9D8Svi/3vKt8gVTew4fbRknUP
477# UbRupY5a4l4kgU4QpO4/cY5jDhNLrddfRHnzNhQGivecRk5c/5CxGwcOkRX7uq+1
478# UcKNJK4kxscnKqEpKBo6cSgCPC6Ro8AlEeKcFEehemhor5unXCBc2XGxDI+7qPjF
479# Emifz0DLQESlE/DmZAwlCEIysjaKJAL+L3J+HNdJRZboWR3p+nRka7LrZkPas7CM
480# 1ekN3fYBIM6ZMWM9CBoYs4GbT8aTEAb8B4H6i9r5gkn3Ym6hU/oSlBiFLpKR6mhs
481# RDKyZqHnGKSaZFHvMIIGajCCBVKgAwIBAgIQAwGaAjr/WLFr1tXq5hfwZjANBgkq
482# hkiG9w0BAQUFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j
483# MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBB
484# c3N1cmVkIElEIENBLTEwHhcNMTQxMDIyMDAwMDAwWhcNMjQxMDIyMDAwMDAwWjBH
485# MQswCQYDVQQGEwJVUzERMA8GA1UEChMIRGlnaUNlcnQxJTAjBgNVBAMTHERpZ2lD
486# ZXJ0IFRpbWVzdGFtcCBSZXNwb25kZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
487# ggEKAoIBAQCjZF38fLPggjXg4PbGKuZJdTvMbuBTqZ8fZFnmfGt/a4ydVfiS457V
488# WmNbAklQ2YPOb2bu3cuF6V+l+dSHdIhEOxnJ5fWRn8YUOawk6qhLLJGJzF4o9GS2
489# ULf1ErNzlgpno75hn67z/RJ4dQ6mWxT9RSOOhkRVfRiGBYxVh3lIRvfKDo2n3k5f
490# 4qi2LVkCYYhhchhoubh87ubnNC8xd4EwH7s2AY3vJ+P3mvBMMWSN4+v6GYeofs/s
491# jAw2W3rBerh4x8kGLkYQyI3oBGDbvHN0+k7Y/qpA8bLOcEaD6dpAoVk62RUJV5lW
492# MJPzyWHM0AjMa+xiQpGsAsDvpPCJEY93AgMBAAGjggM1MIIDMTAOBgNVHQ8BAf8E
493# BAMCB4AwDAYDVR0TAQH/BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDCCAb8G
494# A1UdIASCAbYwggGyMIIBoQYJYIZIAYb9bAcBMIIBkjAoBggrBgEFBQcCARYcaHR0
495# cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCCAWQGCCsGAQUFBwICMIIBVh6CAVIA
496# QQBuAHkAIAB1AHMAZQAgAG8AZgAgAHQAaABpAHMAIABDAGUAcgB0AGkAZgBpAGMA
497# YQB0AGUAIABjAG8AbgBzAHQAaQB0AHUAdABlAHMAIABhAGMAYwBlAHAAdABhAG4A
498# YwBlACAAbwBmACAAdABoAGUAIABEAGkAZwBpAEMAZQByAHQAIABDAFAALwBDAFAA
499# UwAgAGEAbgBkACAAdABoAGUAIABSAGUAbAB5AGkAbgBnACAAUABhAHIAdAB5ACAA
500# QQBnAHIAZQBlAG0AZQBuAHQAIAB3AGgAaQBjAGgAIABsAGkAbQBpAHQAIABsAGkA
501# YQBiAGkAbABpAHQAeQAgAGEAbgBkACAAYQByAGUAIABpAG4AYwBvAHIAcABvAHIA
502# YQB0AGUAZAAgAGgAZQByAGUAaQBuACAAYgB5ACAAcgBlAGYAZQByAGUAbgBjAGUA
503# LjALBglghkgBhv1sAxUwHwYDVR0jBBgwFoAUFQASKxOYspkH7R7for5XDStnAs0w
504# HQYDVR0OBBYEFGFaTSS2STKdSip5GoNL9B6Jwcp9MH0GA1UdHwR2MHQwOKA2oDSG
505# Mmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRENBLTEu
506# Y3JsMDigNqA0hjJodHRwOi8vY3JsNC5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1
507# cmVkSURDQS0xLmNybDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6
508# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMu
509# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEQ0EtMS5jcnQwDQYJKoZIhvcN
510# AQEFBQADggEBAJ0lfhszTbImgVybhs4jIA+Ah+WI//+x1GosMe06FxlxF82pG7xa
511# FjkAneNshORaQPveBgGMN/qbsZ0kfv4gpFetW7easGAm6mlXIV00Lx9xsIOUGQVr
512# NZAQoHuXx/Y/5+IRQaa9YtnwJz04HShvOlIJ8OxwYtNiS7Dgc6aSwNOOMdgv420X
513# Ewbu5AO2FKvzj0OncZ0h3RTKFV2SQdr5D4HRmXQNJsQOfxu19aDxxncGKBXp2JPl
514# VRbwuwqrHNtcSCdmyKOLChzlldquxC5ZoGHd2vNtomHpigtt7BIYvfdVVEADkitr
515# wlHCCkivsNRu4PQUCjob4489yq9qjXvc2EQwggbNMIIFtaADAgECAhAG/fkDlgOt
516# 6gAK6z8nu7obMA0GCSqGSIb3DQEBBQUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
517# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNV
518# BAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBa
519# Fw0yMTExMTAwMDAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2Vy
520# dCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lD
521# ZXJ0IEFzc3VyZWQgSUQgQ0EtMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
522# ggEBAOiCLZn5ysJClaWAc0Bw0p5WVFypxNJBBo/JM/xNRZFcgZ/tLJz4FlnfnrUk
523# FcKYubR3SdyJxArar8tea+2tsHEx6886QAxGTZPsi3o2CAOrDDT+GEmC/sfHMUiA
524# fB6iD5IOUMnGh+s2P9gww/+m9/uizW9zI/6sVgWQ8DIhFonGcIj5BZd9o8dD3QLo
525# Oz3tsUGj7T++25VIxO4es/K8DCuZ0MZdEkKB4YNugnM/JksUkK5ZZgrEjb7Szgau
526# rYRvSISbT0C58Uzyr5j79s5AXVz2qPEvr+yJIvJrGGWxwXOt1/HYzx4KdFxCuGh+
527# t9V3CidWfA9ipD8yFGCV/QcEogkCAwEAAaOCA3owggN2MA4GA1UdDwEB/wQEAwIB
528# hjA7BgNVHSUENDAyBggrBgEFBQcDAQYIKwYBBQUHAwIGCCsGAQUFBwMDBggrBgEF
529# BQcDBAYIKwYBBQUHAwgwggHSBgNVHSAEggHJMIIBxTCCAbQGCmCGSAGG/WwAAQQw
530# ggGkMDoGCCsGAQUFBwIBFi5odHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9zc2wtY3Bz
531# LXJlcG9zaXRvcnkuaHRtMIIBZAYIKwYBBQUHAgIwggFWHoIBUgBBAG4AeQAgAHUA
532# cwBlACAAbwBmACAAdABoAGkAcwAgAEMAZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMA
533# bwBuAHMAdABpAHQAdQB0AGUAcwAgAGEAYwBjAGUAcAB0AGEAbgBjAGUAIABvAGYA
534# IAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIAdAAgAEMAUAAvAEMAUABTACAAYQBuAGQA
535# IAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcAIABQAGEAcgB0AHkAIABBAGcAcgBlAGUA
536# bQBlAG4AdAAgAHcAaABpAGMAaAAgAGwAaQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkA
537# dAB5ACAAYQBuAGQAIABhAHIAZQAgAGkAbgBjAG8AcgBwAG8AcgBhAHQAZQBkACAA
538# aABlAHIAZQBpAG4AIABiAHkAIAByAGUAZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG
539# /WwDFTASBgNVHRMBAf8ECDAGAQH/AgEAMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
540# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
541# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
542# Y3J0MIGBBgNVHR8EejB4MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
543# RGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMDqgOKA2hjRodHRwOi8vY3JsNC5k
544# aWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0EuY3JsMB0GA1UdDgQW
545# BBQVABIrE5iymQftHt+ivlcNK2cCzTAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
546# pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEARlA+ybcoJKc4HbZbKa9Sz1LpMUer
547# Vlx71Q0LQbPv7HUfdDjyslxhopyVw1Dkgrkj0bo6hnKtOHisdV0XFzRyR4WUVtHr
548# uzaEd8wkpfMEGVWp5+Pnq2LN+4stkMLA0rWUvV5PsQXSDj0aqRRbpoYxYqioM+Sb
549# OafE9c4deHaUJXPkKqvPnHZL7V/CSxbkS3BMAIke/MV5vEwSV/5f4R68Al2o/vsH
550# OE8Nxl2RuQ9nRc3Wg+3nkg2NsWmMT/tZ4CMP0qquAHzunEIOz5HXJ7cW7g/DvXwK
551# oO4sCFWFIrjrGBpN/CohrUkxg0eVd3HcsRtLSxwQnHcUwZ1PL1qVCCkQJjGCBDsw
552# ggQ3AgEBMIGGMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx
553# GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI
554# QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0ECEA5mBKT7UNogWOLwtgBqursw
555# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
556# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
David Pinedoef68bbe2016-03-29 13:46:12 -0600557# IwYJKoZIhvcNAQkEMRYEFLzB0lbx2Z662b5ESDWLj98ew1UOMA0GCSqGSIb3DQEB
558# AQUABIIBADsR0P8QxSNCPshQFDxK9Ezsrk25HyGM9a0SZOaGrL8ZSSZ6PY8Wz/bQ
559# i2we//wLD31wkdzj/VKBdFHTvheQiA3b094RcC+Ii3VsH4esb6gSBVEnfX0Iu5ZJ
560# o9k1L5CNS9nhJ+ydgKFmDS6R3MUCZi613yZpCe9ZFqsgf9UP/gQiZSC29es7WnaX
561# OtPrz5OAO/JTNFDnTO9d+rg/iYeN4ybDtuSp0j6fKQ/DPesmE/MZpcfD+kiRtY9u
562# x7o8IVv/lq0+5sRTaBogeauXVhEaA37jZdo0IbwESl8YvaHj2zstRBcT8AxMuGBW
563# H/FjShnOONEAPrFyFoPi8CFrXbrqJkahggIPMIICCwYJKoZIhvcNAQkGMYIB/DCC
David Pinedo0b5e2082016-03-22 14:33:50 -0600564# AfgCAQEwdjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkw
565# FwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1
566# cmVkIElEIENBLTECEAMBmgI6/1ixa9bV6uYX8GYwCQYFKw4DAhoFAKBdMBgGCSqG
David Pinedoef68bbe2016-03-29 13:46:12 -0600567# SIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2MDMyOTE5NDM0
568# NlowIwYJKoZIhvcNAQkEMRYEFBarBhBOgDzXlhQxxNXSfB14mBngMA0GCSqGSIb3
569# DQEBAQUABIIBACWObtn5lJ8laqfd55xT4EfWbvmPGV04c/CkDF6ziecEQxhCxUYi
570# rw8kV8nEhYa79qE5p3EXe+aZflRo70t21sr3s8GNHUW98pc0goIaC5rKzOVT3X0x
571# VH870qjVWdGMRRTUXlryBAQRv3LL93GyMIL1g1Y4uYKEU9PyrC8L26bsrGQggQEy
572# KxL0hopMSUNNE8glc1nbe/FGDylkHyi33qwNaz0buVLr7xCZQTpIecXat1mfvzPn
573# gsSr3+u9086Asz0QEbVmskhzFLSdd6QKpWjwYXWoyeFqrKlPdL4InHhRKFsEA8fQ
574# xV5A7ORVrXHOpPd+ZUrIhaggYDBqFiGWfmA=
David Pinedo0b5e2082016-03-22 14:33:50 -0600575# SIG # End signature block