# Installiert das Zip-File mit dem Nosergroup.Lan - Zertifikat
# und stellt sicher, dass danach die Zertifikat-Datei sicher zerstört wird
# 
# (c) tom-agplv3@jig.ch
# Dieses Software untersteht der AGPLv3 Lizenz: https://choosealicense.com/licenses/agpl-3.0/
# 
# Wichtig: Bitte beachte die Datei: Hinweis AGPLv3 Lizenz.txt
# 
# 
# - Übernimmt den Pfad zum heruntergeladenen ZIP-File
#   Oder sucht die Datei aufgrund der NPID
# - Entpackt die Zip-Datei
# - Installiert das Zertifikat
# - Löscht die die Zertifikat-Dateien, damit sie nicht rekonstruiert werden können
# 
# 001, 180805, tom-agplv3@jig.ch

[CmdletBinding(SupportsShouldProcess = $true)]
Param (
	[Parameter(Position=0)]
	[String]$ZertifikatZipFile,
	[Parameter(Position=1, Mandatory)]
	[String]$ZertifikatPassword,
	[String]$NPID,
	[Switch]$Wipe = $True,
	# Wird vom cmd genützt
	# 0  Keine Pause am Ende
	# 1  Pause am Ende
	# >1 Sleep am Ende
	[Int]$WaitOnEnd = 1
)



# Die Tools einbinden
# Erkennen, wie das Script aufgerufen wurde
$ScriptCalledFromCommandLine = (Get-PSCallStack)[1].Location -eq '<No file>'
If ($ScriptCalledFromCommandLine) {
	. ("{0}\Tom-Tools.ps1" -f [IO.Path]::GetDirectoryName([IO.Path]::GetDirectoryName([IO.Path]::GetDirectoryName((Get-PSCallStack | select -ExpandProperty ScriptName)))))
}




## Config



If ([String]::IsNullOrEmpty($ZertifikatZipFile) -and [String]::IsNullOrEmpty($NPID)) {
	Log 0 '35-10 E#1: Entweder die NPID oder das ZertifikatZipFile muss angegeben werden'
	Log 1 'Abbruch.' -ForegroundColor Red
	# Beenden und sicherstellen, dass der User die Meldung sieht
	Stop-Script-Wait $WaitOnEnd
}



# Elevate Script
# 200731: ExecutionPolicy übernehmen
# 200806
# 	NoExitElevatedSession
# 	PassParams
If (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
	$NoExitElevatedSession = $False
	$PassParams = $True
	# Relaunch as an elevated process
	If ($PassParams) {
		# Script-Parameter an die elevated Session weitergeben
		[String[]]$ScriptParams = $MyInvocation.BoundParameters.GetEnumerator() | 
			ForEach-Object {
				If ($_.Value -is [Switch]) { "-$($_.Key)" } Else { "-$($_.Key)", "$($_.Value)" }
			}
		$ScriptParams += $MyInvocation.UnboundArguments
	}

	# Die ExecutionPolicy übernehmen
	$MyExecutionPolicy = [String](Get-ExecutionPolicy)
	# Das Arbeitsverzeichnis übernehmen
	$WorkingDir = [IO.Path]::GetDirectoryName((Get-PSCallStack | select -ExpandProperty ScriptName))
	
	If ($NoExitElevatedSession) {
		[String[]]$PowerShellExeParams = @('-NoProfile', '-NoExit', "-ExecutionPolicy $MyExecutionPolicy", '-File', ('"{0}"' -f $MyInvocation.MyCommand.Path))
	} Else {
		[String[]]$PowerShellExeParams = @('-NoProfile', "-ExecutionPolicy $MyExecutionPolicy", '-File', ('"{0}"' -f $MyInvocation.MyCommand.Path))
	}

	$ArgumentList = $PowerShellExeParams + $ScriptParams
	# Die Datei signieren
	Start-Process -FilePath 'PowerShell.exe' -Verb RunAs -WorkingDirectory $WorkingDir -ArgumentList $ArgumentList
	Exit
}
# Now running elevated so launch the script:





## Main


Log 0 '35-20 Platziere die PowerShell-Console' 
## Das PowerShell-Fenster links positionieren
# Die Applikationsfenster-Deltas genüber dem Bildschirm berechnen
$WindowDeltas = Calc-Process-Window-Deltas
Set-Window-LeftRight -WindowDeltas $WindowDeltas -ProcessID $PID -PositionLeft


Log 0 '35-25 Lösche die alten Zertifikate'
Remove-UserNosergroupLan-Certificates



If ([String]::IsNullOrEmpty($ZertifikatZipFile)) {
	Log 0 '35-30 Suche das ZIP-File mit dem Zertifikat'
	$ZertFile = Find-Newest-File 'c:\' "$($NpidFqdn)*.*"
	If ($ZertFile.Count -eq 0) {
		Log 1 "E#2: Das heruntergeladene Zertifikat wurde nicht gefunden" -ForegroundColor Red
		Log 1 "Die Datei müsste dieses Namensmuster haben: $($NpidFqdn)*.*" -ForegroundColor Red
		Log 1 'Abbruch.' -ForegroundColor Red
		# Beenden und sicherstellen, dass der User die Meldung sieht
		Stop-Script-Wait $WaitOnEnd
	}
	$ZertifikatZipFile = $ZertFile[0].FullName
	Log 1 "» $($ZertifikatZipFile)"
}


If (-not (Test-Path -LiteralPath $ZertifikatZipFile -PathType Leaf)) {
	Log 1 "E#3: Das heruntergeladene Zertifikat wurde nicht gefunden" -ForegroundColor Red
	Log 1 "$($ZertifikatZipFile)" -ForegroundColor Red
	Log 1 'Abbruch.' -ForegroundColor Red
	# Beenden und sicherstellen, dass der User die Meldung sieht
	Stop-Script-Wait $WaitOnEnd
}


Log 0 '35-40 Entpacke das ZIP-File mit dem Zertifikat'
$WorkingDir = 'c:\Temp\NoCe\'
If (Test-Path -LiteralPath $WorkingDir -PathType Container) {
	$Res = Remove-Item -Recurse -Force -LiteralPath $WorkingDir
}
Try {
	Expand-Archive -LiteralPath $ZertifikatZipFile -DestinationPath $WorkingDir
} Catch {
	Log 1 "E#6: Fehler beim Entpacken der Zip-Datei:" -ForegroundColor Red
	Log 1 "$ZertifikatZipFile" -ForegroundColor Red
	Log 1 'Die Zip-Datei ist vermutlich defekt' -ForegroundColor Red
	Log 1 'Abbruch.' -ForegroundColor Red
	# Beenden und sicherstellen, dass der User die Meldung sieht
	Stop-Script-Wait $WaitOnEnd
}


Log 0 '35-50 Suche das Zertifikat *.p12'
$Zertifikate = @(Get-ChildItem -LiteralPath $WorkingDir -Filter '*.p12')
If ($Zertifikate.Count -ne 1) {
	Log 1 "E#4: In $($WorkingDir) nicht exakt 1 Zertifikat-Datei gefunden" -ForegroundColor Red
	Log 1 'Abbruch.' -ForegroundColor Red
	# Beenden und sicherstellen, dass der User die Meldung sieht
	Stop-Script-Wait $WaitOnEnd
} Else {
	$Zertifikat = $Zertifikate[0].FullName
	Log 1 "» $($Zertifikat)"
}


Log 0 '35-60 Lösche alle Zertifikate für CN=n*@user.nosergroup.lan'
Remove-UserNosergroupLan-Certificates


Log 0 '35-70 Installiere das neue Zertifikat'
$SecPW = ConvertTo-SecureString $ZertifikatPassword -AsPlainText -Force
$Res = Import-PfxCertificate -FilePath $Zertifikat -CertStoreLocation Cert:\CurrentUser\My -Password $SecPW

# Erfolgsfall
# $Res.GetType().Name == 'X509Certificate2'
If ($Res -eq $null) {
	Log 1 "E#5: Fehler beim Zertifikat-Import" -ForegroundColor Red
	Log 1 'Abbruch.' -ForegroundColor Red
	# Beenden und sicherstellen, dass der User die Meldung sieht
	Stop-Script-Wait $WaitOnEnd
} Else {
	Log 1 'Zertifikat erfolgreich installiert!' -ForegroundColor Cyan
}


## Files sicher löschen?
If ($Wipe) {
	Log 0 '35-80 Lösche die temporären Daten unwiederbringlich'
	$Res = @()
	If (If-File-Exists $ZertifikatZipFile) {
		$Res += $ZertifikatZipFile | Remove-FileSecure -Confirm:$False -DeleteAfterOverwrite
	}
	If (If-File-Exists $Zertifikat) {
		$Res += $Zertifikat | Remove-FileSecure -Confirm:$False -DeleteAfterOverwrite
	}
	
	# Arbeitsverzeichnis löschen
	If (Test-Path -LiteralPath $WorkingDir -PathType Container) {
		$null = Remove-Item -Recurse -Force -LiteralPath $WorkingDir
	}
	$Res
	Log 1 'Erledigt'
} Else {
	Log 0 '35-90 Vorsicht!, die Zertifikat-Dateien existgieren noch!' -ForegroundColor Red
	If (If-File-Exists $ZertifikatZipFile) { Log 1 $ZertifikatZipFile }
	If (If-File-Exists $Zertifikat) { Log 1 $Zertifikat }
}

Log 0 '35-100 Starte den Certificate manager'
. 'certmgr'


Start-Sleep -Sec 10

Stop-Script





# SIG # Begin signature block
# MIImxAYJKoZIhvcNAQcCoIImtTCCJrECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUmSvq/bp75Uy+zXObit137rym
# 5yyggh/VMIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B
# AQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEh
# MB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTIxMDUyNTAwMDAw
# MFoXDTI4MTIzMTIzNTk1OVowVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp
# Z28gTGltaXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n
# IFJvb3QgUjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjeeUEiIE
# JHQu/xYjApKKtq42haxH1CORKz7cfeIxoFFvrISR41KKteKW3tCHYySJiv/vEpM7
# fbu2ir29BX8nm2tl06UMabG8STma8W1uquSggyfamg0rUOlLW7O4ZDakfko9qXGr
# YbNzszwLDO/bM1flvjQ345cbXf0fEj2CA3bm+z9m0pQxafptszSswXp43JJQ8mTH
# qi0Eq8Nq6uAvp6fcbtfo/9ohq0C/ue4NnsbZnpnvxt4fqQx2sycgoda6/YDnAdLv
# 64IplXCN/7sVz/7RDzaiLk8ykHRGa0c1E3cFM09jLrgt4b9lpwRrGNhx+swI8m2J
# mRCxrds+LOSqGLDGBwF1Z95t6WNjHjZ/aYm+qkU+blpfj6Fby50whjDoA7NAxg0P
# OM1nqFOI+rgwZfpvx+cdsYN0aT6sxGg7seZnM5q2COCABUhA7vaCZEao9XOwBpXy
# bGWfv1VbHJxXGsd4RnxwqpQbghesh+m2yQ6BHEDWFhcp/FycGCvqRfXvvdVnTyhe
# Be6QTHrnxvTQ/PrNPjJGEyA2igTqt6oHRpwNkzoJZplYXCmjuQymMDg80EY2NXyc
# uu7D1fkKdvp+BRtAypI16dV60bV/AK6pkKrFfwGcELEW/MxuGNxvYv6mUKe4e7id
# FT/+IAx1yCJaE5UZkADpGtXChvHjjuxf9OUCAwEAAaOCARIwggEOMB8GA1UdIwQY
# MBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQy65Ka/zWWSC8oQEJw
# IDaRXBeF5jAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUE
# DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEMGA1Ud
# HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmlj
# YXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQASv6Hvi3Sa
# mES4aUa1qyQKDKSKZ7g6gb9Fin1SB6iNH04hhTmja14tIIa/ELiueTtTzbT72ES+
# BtlcY2fUQBaHRIZyKtYyFfUSg8L54V0RQGf2QidyxSPiAjgaTCDi2wH3zUZPJqJ8
# ZsBRNraJAlTH/Fj7bADu/pimLpWhDFMpH2/YGaZPnvesCepdgsaLr4CnvYFIUoQx
# 2jLsFeSmTD1sOXPUC4U5IOCFGmjhp0g4qdE2JXfBjRkWxYhMZn0vY86Y6GnfrDyo
# XZ3JHFuu2PMvdM+4fvbXg50RlmKarkUT2n/cR/vfw1Kf5gZV6Z2M8jpiUbzsJA8p
# 1FiAhORFe1rYMIIGGjCCBAKgAwIBAgIQYh1tDFIBnjuQeRUgiSEcCjANBgkqhkiG
# 9w0BAQwFADBWMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
# MS0wKwYDVQQDEyRTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYw
# HhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBUMQswCQYDVQQGEwJHQjEY
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1Ymxp
# YyBDb2RlIFNpZ25pbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
# igKCAYEAmyudU/o1P45gBkNqwM/1f/bIU1MYyM7TbH78WAeVF3llMwsRHgBGRmxD
# eEDIArCS2VCoVk4Y/8j6stIkmYV5Gej4NgNjVQ4BYoDjGMwdjioXan1hlaGFt4Wk
# 9vT0k2oWJMJjL9G//N523hAm4jF4UjrW2pvv9+hdPX8tbbAfI3v0VdJiJPFy/7Xw
# iunD7mBxNtecM6ytIdUlh08T2z7mJEXZD9OWcJkZk5wDuf2q52PN43jc4T9OkoXZ
# 0arWZVeffvMr/iiIROSCzKoDmWABDRzV/UiQ5vqsaeFaqQdzFf4ed8peNWh1OaZX
# nYvZQgWx/SXiJDRSAolRzZEZquE6cbcH747FHncs/Kzcn0Ccv2jrOW+LPmnOyB+t
# AfiWu01TPhCr9VrkxsHC5qFNxaThTG5j4/Kc+ODD2dX/fmBECELcvzUHf9shoFvr
# n35XGf2RPaNTO2uSZ6n9otv7jElspkfK9qEATHZcodp+R4q2OIypxR//YEb3fkDn
# 3UayWW9bAgMBAAGjggFkMIIBYDAfBgNVHSMEGDAWgBQy65Ka/zWWSC8oQEJwIDaR
# XBeF5jAdBgNVHQ4EFgQUDyrLIIcouOxvSK4rVKYpqhekzQwwDgYDVR0PAQH/BAQD
# AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYD
# VR0gBBQwEjAGBgRVHSAAMAgGBmeBDAEEATBLBgNVHR8ERDBCMECgPqA8hjpodHRw
# Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RS
# NDYuY3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5z
# ZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LnA3YzAj
# BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEM
# BQADggIBAAb/guF3YzZue6EVIJsT/wT+mHVEYcNWlXHRkT+FoetAQLHI1uBy/YXK
# ZDk8+Y1LoNqHrp22AKMGxQtgCivnDHFyAQ9GXTmlk7MjcgQbDCx6mn7yIawsppWk
# vfPkKaAQsiqaT9DnMWBHVNIabGqgQSGTrQWo43MOfsPynhbz2Hyxf5XWKZpRvr3d
# MapandPfYgoZ8iDL2OR3sYztgJrbG6VZ9DoTXFm1g0Rf97Aaen1l4c+w3DC+IkwF
# kvjFV3jS49ZSc4lShKK6BrPTJYs4NG1DGzmpToTnwoqZ8fAmi2XlZnuchC4NPSZa
# PATHvNIzt+z1PHo35D/f7j2pO1S8BCysQDHCbM5Mnomnq5aYcKCsdbh0czchOm8b
# kinLrYrKpii+Tk7pwL7TjRKLXkomm5D1Umds++pip8wH2cQpf93at3VDcOK4N7Ew
# oIJB0kak6pSzEu4I64U6gZs7tS/dGNSljf2OSSnRr7KWzq03zl8l75jy+hOds9TW
# SenLbjBQUGR96cFr6lEUfAIEHVC1L68Y1GGxx4/eRI82ut83axHMViw1+sVpbPxg
# 51Tbnio1lB93079WPFnYaOvfGAA0e0zcfF/M9gXr+korwQTh2Prqooq2bYNMvUoU
# KD85gnJ+t0smrWrb8dee2CvYZXD5laGtaAxOfy/VKNmwuWuAh9kcMIIGVzCCBL+g
# AwIBAgIRAJerP2s13dPOpevRLwsJhzgwDQYJKoZIhvcNAQEMBQAwVDELMAkGA1UE
# BhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGln
# byBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNjAeFw0yMjAyMjIwMDAwMDBaFw0y
# NTAyMjEyMzU5NTlaMEIxCzAJBgNVBAYTAkNIMQ0wCwYDVQQIDARCZXJuMREwDwYD
# VQQKDAhBS1JPUyBBRzERMA8GA1UEAwwIQUtST1MgQUcwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQCpEHaWk6un+cfauC+UdCaWrIgc5OZFQIVVqo+wXffW
# GxD1tltMGe4tOmB2Vt+zCQl2pzJ0NZgMtO8a39023XuM0iPbp0o3OjEsWbqP4o2I
# HlJq5vhgn2cJpVDo16bwmbLywtnyNr9V2MRIh+Bil2/BeMPq+F9VHfiDaq6l0w5M
# BkOiNDSqNda+B79ShSoYcsGsYvLQfhFF5Pyh6a46SCtp/1AIaRVw3jnNJtocunCF
# ni7kb1UJP2Q16TEPo3lCxicyZWK0nof+o9KDmUOC84Tj6eat6dodXsW4vyOhoEYZ
# N2CprNBq7Q5crwWOTKNwz3+vNEOmlQlCqSIlrIKOFzBzDp3U2o9to+I8A9rsqY63
# BDrJFVq5KKe2DBRYwBZ5e7B9+MqS0Ug930xZBSDHQQ3DvvOEQgF7fKRQt1/X1g8T
# GO37MmN6sHd31OeM1kbx8lMM4f+DqegGD7IB6N8wKgnOazelyQXni38APNi/fpFA
# xixsFldvmI4Z8QoYqXsEiLDD05JKhUqpgITpRd8gLUiBuzOWs58FEXhx3X1C37iT
# TgyhBP7v4PUWWqe8KWukSPImE4J7y+1cJ7GqOPSLwkLgTuNm/Ko7wJyWfD4/LPNb
# O0a9YEHUTqbHoKIy55sIl7cmaaia5uz1Uzr3hzSVoVu1TwJl9qHdTQOM8/YnG7wQ
# 5wIDAQABo4IBtDCCAbAwHwYDVR0jBBgwFoAUDyrLIIcouOxvSK4rVKYpqhekzQww
# HQYDVR0OBBYEFBm6ziTh2H5Wi50vwBGP3n71Vh8FMA4GA1UdDwEB/wQEAwIHgDAM
# BgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGCWCGSAGG+EIBAQQE
# AwIEEDBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUFBwIBFhdo
# dHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAEwSQYDVR0fBEIwQDA+oDyg
# OoY4aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25p
# bmdDQVIzNi5jcmwweQYIKwYBBQUHAQEEbTBrMEQGCCsGAQUFBzAChjhodHRwOi8v
# Y3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NBUjM2LmNy
# dDAjBggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wFgYDVR0RBA8w
# DYELaXRAYWtyb3MuY2gwDQYJKoZIhvcNAQEMBQADggGBAFGyk9DeEOqnhYFNzxZ7
# HrS40+MelZjeyazVlzG5NfBIzxse6fpiP9C6f0zL//HrrjSkl9UyFNmn+5TfL/kw
# N40hogdDkna7DrsKxLQ1viBFLdJBxjg8Nz0KVgtcbUpi1Qj3H6UI4skLdUSir1iE
# oSR+QGkNzSJSrn2k8jijSMOYldbngzG+D9PzSNp/CjBCA1bTOBepuHVQQCl/5rY1
# bygvNL7Zua/Ca6iuxnAsJOisw9IkngKi3iznXTHQep0ytOOOvZhr3IRkOccy/cyz
# 9KA1jv68aKCsLiGpyUKCg8WqmwzLXCUfqxvouhrHr1yAYn2qHRRoQhiIw8TgghlE
# +PA9qKY6KIlmilX7VejuFScmrBQVkP0OuxLTufXIahY2jnPQfrJLz0U+fUL1YgHa
# 1oi+1rOZ/Z0iX2YXa1rDmrXueN8QNOtZuBEKBKUNSSq8hhH4rk2j7dVcYm1gljkd
# CR8vwGRBoj9oMJgehkTdMU9GAGu9Ny9COnT/J9mRc323HzCCBuwwggTUoAMCAQIC
# EDAPb6zdZph0fKlGNqd4LbkwDQYJKoZIhvcNAQEMBQAwgYgxCzAJBgNVBAYTAlVT
# MRMwEQYDVQQIEwpOZXcgSmVyc2V5MRQwEgYDVQQHEwtKZXJzZXkgQ2l0eTEeMBwG
# A1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMS4wLAYDVQQDEyVVU0VSVHJ1c3Qg
# UlNBIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTE5MDUwMjAwMDAwMFoXDTM4
# MDExODIzNTk1OVowfTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFu
# Y2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEYMBYGA1UEChMPU2VjdGlnbyBMaW1p
# dGVkMSUwIwYDVQQDExxTZWN0aWdvIFJTQSBUaW1lIFN0YW1waW5nIENBMIICIjAN
# BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAyBsBr9ksfoiZfQGYPyCQvZyAIVST
# uc+gPlPvs1rAdtYaBKXOR4O168TMSTTL80VlufmnZBYmCfvVMlJ5LsljwhObtoY/
# AQWSZm8hq9VxEHmH9EYqzcRaydvXXUlNclYP3MnjU5g6Kh78zlhJ07/zObu5pCNC
# rNAVw3+eolzXOPEWsnDTo8Tfs8VyrC4Kd/wNlFK3/B+VcyQ9ASi8Dw1Ps5EBjm6d
# J3VV0Rc7NCF7lwGUr3+Az9ERCleEyX9W4L1GnIK+lJ2/tCCwYH64TfUNP9vQ6oWM
# ilZx0S2UTMiMPNMUopy9Jv/TUyDHYGmbWApU9AXn/TGs+ciFF8e4KRmkKS9G493b
# kV+fPzY+DjBnK0a3Na+WvtpMYMyou58NFNQYxDCYdIIhz2JWtSFzEh79qsoIWId3
# pBXrGVX/0DlULSbuRRo6b83XhPDX8CjFT2SDAtT74t7xvAIo9G3aJ4oG0paH3uhr
# DvBbfel2aZMgHEqXLHcZK5OVmJyXnuuOwXhWxkQl3wYSmgYtnwNe/YOiU2fKsfqN
# oWTJiJJZy6hGwMnypv99V9sSdvqKQSTUG/xypRSi1K1DHKRJi0E5FAMeKfobpSKu
# pcNNgtCN2mu32/cYQFdz8HGj+0p9RTbB942C+rnJDVOAffq2OVgy728YUInXT50z
# vRq1naHelUF6p4MCAwEAAaOCAVowggFWMB8GA1UdIwQYMBaAFFN5v1qqK0rPVIDh
# 2JvAnfKyA2bLMB0GA1UdDgQWBBQaofhhGSAPw0F3RSiO0TVfBhIEVTAOBgNVHQ8B
# Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNVHSUEDDAKBggrBgEFBQcD
# CDARBgNVHSAECjAIMAYGBFUdIAAwUAYDVR0fBEkwRzBFoEOgQYY/aHR0cDovL2Ny
# bC51c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUNlcnRpZmljYXRpb25BdXRob3Jp
# dHkuY3JsMHYGCCsGAQUFBwEBBGowaDA/BggrBgEFBQcwAoYzaHR0cDovL2NydC51
# c2VydHJ1c3QuY29tL1VTRVJUcnVzdFJTQUFkZFRydXN0Q0EuY3J0MCUGCCsGAQUF
# BzABhhlodHRwOi8vb2NzcC51c2VydHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4IC
# AQBtVIGlM10W4bVTgZF13wN6MgstJYQRsrDbKn0qBfW8Oyf0WqC5SVmQKWxhy7VQ
# 2+J9+Z8A70DDrdPi5Fb5WEHP8ULlEH3/sHQfj8ZcCfkzXuqgHCZYXPO0EQ/V1cPi
# vNVYeL9IduFEZ22PsEMQD43k+ThivxMBxYWjTMXMslMwlaTW9JZWCLjNXH8Blr5y
# Umo7Qjd8Fng5k5OUm7Hcsm1BbWfNyW+QPX9FcsEbI9bCVYRm5LPFZgb289ZLXq2j
# K0KKIZL+qG9aJXBigXNjXqC72NzXStM9r4MGOBIdJIct5PwC1j53BLwENrXnd8uc
# Lo0jGLmjwkcd8F3WoXNXBWiap8k3ZR2+6rzYQoNDBaWLpgn/0aGUpk6qPQn1BWy3
# 0mRa2Coiwkud8TleTN5IPZs0lpoJX47997FSkc4/ifYcobWpdR9xv1tDXWU9UIFu
# q/DQ0/yysx+2mZYm9Dx5i1xkzM3uJ5rloMAMcofBbk1a0x7q8ETmMm8c6xdOlMN4
# ZSA7D0GqH+mhQZ3+sbigZSo04N6o+TzmwTC7wKBjLPxcFgCo0MR/6hGdHgbGpm0y
# XbQ4CStJB6r97DDa8acvz7f9+tCjhNknnvsBZne5VhDhIG7GrrH5trrINV0zdo7x
# fCAMKneutaIChrop7rRaALGMq+P5CslUXdS5anSevUiumDCCBvUwggTdoAMCAQIC
# EDlMJeF8oG0nqGXiO9kdItQwDQYJKoZIhvcNAQEMBQAwfTELMAkGA1UEBhMCR0Ix
# GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEY
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSUwIwYDVQQDExxTZWN0aWdvIFJTQSBU
# aW1lIFN0YW1waW5nIENBMB4XDTIzMDUwMzAwMDAwMFoXDTM0MDgwMjIzNTk1OVow
# ajELMAkGA1UEBhMCR0IxEzARBgNVBAgTCk1hbmNoZXN0ZXIxGDAWBgNVBAoTD1Nl
# Y3RpZ28gTGltaXRlZDEsMCoGA1UEAwwjU2VjdGlnbyBSU0EgVGltZSBTdGFtcGlu
# ZyBTaWduZXIgIzQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCkkyhS
# S88nh3akKRyZOMDnDtTRHOxoywFk5IrNd7BxZYK8n/yLu7uVmPslEY5aiAlmERRY
# sroiW+b2MvFdLcB6og7g4FZk7aHlgSByIGRBbMfDCPrzfV3vIZrCftcsw7oRmB78
# 0yAIQrNfv3+IWDKrMLPYjHqWShkTXKz856vpHBYusLA4lUrPhVCrZwMlobs46Q9v
# qVqakSgTNbkf8z3hJMhrsZnoDe+7TeU9jFQDkdD8Lc9VMzh6CRwH0SLgY4anvv3S
# g3MSFJuaTAlGvTS84UtQe3LgW/0Zux88ahl7brstRCq+PEzMrIoEk8ZXhqBzNiuB
# l/obm36Ih9hSeYn+bnc317tQn/oYJU8T8l58qbEgWimro0KHd+D0TAJI3VilU6aj
# oO0ZlmUVKcXtMzAl5paDgZr2YGaQWAeAzUJ1rPu0kdDF3QFAaraoEO72jXq3nnWv
# 06VLGKEMn1ewXiVHkXTNdRLRnG/kXg2b7HUm7v7T9ZIvUoXo2kRRKqLMAMqHZkOj
# GwDvorWWnWKtJwvyG0rJw5RCN4gghKiHrsO6I3J7+FTv+GsnsIX1p0OF2Cs5dNta
# dwLRpPr1zZw9zB+uUdB7bNgdLRFCU3F0wuU1qi1SEtklz/DT0JFDEtcyfZhs43dB
# yP8fJFTvbq3GPlV78VyHOmTxYEsFT++5L+wJEwIDAQABo4IBgjCCAX4wHwYDVR0j
# BBgwFoAUGqH4YRkgD8NBd0UojtE1XwYSBFUwHQYDVR0OBBYEFAMPMciRKpO9Y/PR
# XU2kNA/SlQEYMA4GA1UdDwEB/wQEAwIGwDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB
# /wQMMAoGCCsGAQUFBwMIMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMIMCUwIwYI
# KwYBBQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEAjBEBgNV
# HR8EPTA7MDmgN6A1hjNodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29SU0FU
# aW1lU3RhbXBpbmdDQS5jcmwwdAYIKwYBBQUHAQEEaDBmMD8GCCsGAQUFBzAChjNo
# dHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29SU0FUaW1lU3RhbXBpbmdDQS5j
# cnQwIwYIKwYBBQUHMAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3
# DQEBDAUAA4ICAQBMm2VY+uB5z+8VwzJt3jOR63dY4uu9y0o8dd5+lG3DIscEld9l
# aWETDPYMnvWJIF7Bh8cDJMrHpfAm3/j4MWUN4OttUVemjIRSCEYcKsLe8tqKRfO+
# 9/YuxH7t+O1ov3pWSOlh5Zo5d7y+upFkiHX/XYUWNCfSKcv/7S3a/76TDOxtog3M
# w/FuvSGRGiMAUq2X1GJ4KoR5qNc9rCGPcMMkeTqX8Q2jo1tT2KsAulj7NYBPXyhx
# bBlewoNykK7gxtjymfvqtJJlfAd8NUQdrVgYa2L73mzECqls0yFGcNwvjXVMI8JB
# 0HqWO8NL3c2SJnR2XDegmiSeTl9O048P5RNPWURlS0Nkz0j4Z2e5Tb/MDbE6MNCh
# PUitemXk7N/gAfCzKko5rMGk+al9NdAyQKCxGSoYIbLIfQVxGksnNqrgmByDdefH
# fkuEQ81D+5CXdioSrEDBcFuZCkD6gG2UYXvIbrnIZ2ckXFCNASDeB/cB1PguEc2d
# g+X4yiUcRD0n5bCGRyoLG4R2fXtoT4239xO07aAt7nMP2RC6nZksfNd1H48QxJTm
# fiTllUqIjCfWhWYd+a5kdpHoSP7IVQrtKcMf3jimwBT7Mj34qYNiNsjDvgCHHKv6
# SkIciQPc9Vx8cNldeE7un14g5glqfCsIo0j1FfwET9/NIRx65fWOGtS5QDGCBlkw
# ggZVAgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRl
# ZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIR
# AJerP2s13dPOpevRLwsJhzgwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAI
# oAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB
# CzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFFn8JUCtiXo1AnvYVLCn
# 0Ejf/J+EMA0GCSqGSIb3DQEBAQUABIICAHIhwZDz3Umyl80gmHXgNYbJ69dZQsxz
# Ypci2Q1q7sGUOtgsWQu1TcbVHy1iDTh3bYNcRds5AQ0NeTf4zACy4nhUBboLjV48
# f8vhhBKFTDuxRjSWMoVoCbB++0ELjHqdSZHhezhal+uHF4DFVf14zWhqwjHOAhxR
# uO1cGEkTrPc0TShgkp0W7KrI9LH4MGB1+IRXIY8BRgNYMXwmfgn8RkTz9p15wN/q
# RKcP8vMpobWRm71JGfs3+JA9ZQuEQDox08bAxkv23Inn0BscyU+sFDL7naR6vlAl
# ZDmK5MoNEpebRJYa69X9gt0zQLdsgNEd+ii8daaOfkk9+LvDi0u1DX/AJHgSHq0M
# QIeXlVXlXtEE1DWtXeV4d7fUf0F5AiNQQ5sQv+H9RZtfng3QlzVTc/seH3RG9Bfv
# VCMjTcSnp4MJsZWNK0tV04dURABMN3FJBdMDiz11mk+LxjgGeEL+/z0xlNK1Tm4m
# zjt3K7pJlyrXOfhGgfcYhp00YcVq7Fcl74IvchyZfSgnP6gPXBjmkSm/DA6oaJBm
# yDRxWaCEp+TsRJBt8KE3T1QKdFlZdZ/J6MjorF6wUAMp1Ck3gfO9bl/wrr6LoePs
# 3/4CWusPS6HUN0Zq01htZ4xSlXaZtIktsPqpWVMithlwuEr+VAizMqCPGsQuFg06
# ryXaz8KG/6AFoYIDSzCCA0cGCSqGSIb3DQEJBjGCAzgwggM0AgEBMIGRMH0xCzAJ
# BgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcT
# B1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDElMCMGA1UEAxMcU2Vj
# dGlnbyBSU0EgVGltZSBTdGFtcGluZyBDQQIQOUwl4XygbSeoZeI72R0i1DANBglg
# hkgBZQMEAgIFAKB5MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcN
# AQkFMQ8XDTIzMDcwMzA4MDgxM1owPwYJKoZIhvcNAQkEMTIEMLHafuEJ19R83P7A
# G/Hqx0avdSi1FowlFJV8q70MNEug/NMG1cTOyjOgeaQFqGiOBjANBgkqhkiG9w0B
# AQEFAASCAgAbN+ihc3VtoJ1ZAoHSpIYj9YVUtbY9uMJfDZQ+yAPyxN33emAcScBc
# hH0/74+Y5lgbjpGYi0hw4gjwjBYwjjg0Qx0w1jqMJRr038zseczx0OoL+Dnn9BcP
# viSW/wUOIN1JmZo3ZSZKimUNpKDsrL36dDRXb2An8nWbrorBiZy4bcvfGAV0UdZ4
# S550v4S7snGsHTyw0o8PbcoKG8bXgc4V8+ydJWgw3fmCaha04pv6IAf81yQLPh2h
# +D3pfkWRmc3gg/e57MnygFE9YvaIx5KDhxJgt2bPilZDvQdmE2Rm0ijR2VgcqMp6
# QyUoG1RUWCO2dRb7Sblxtbt3ujzAEo1AljT9B+LUPVd05cFxsygW3KVCck/SKR4y
# WJCKBbmKd2KrNDFCcTQb+TYfPwWQyBn+yJWVC83D3aAE+GRxj17xKRC/AraxbHpy
# a6ZTWU6AZwpKEM2JHY0f2gLoAGkSpEbMhwBR0Gi4l6sCY7x16ZH3Y6Pi0HzxpBL6
# OhyxzMGUYAggSUWUv/uRCLZxSOIgXbZ9nVxo8cbyZyOD8UqfGRyfMFJOrrPLA2p+
# U7j/bvgBtxqQGml+cUpEDW84Ntil+32eRpEbxEmDjn/DRvrPgF6ukLzGy/F3UZNp
# MiAqAfFg6vRXx13WX0vekM067nZJwe/VI2lDbUsrEiHeASiwXbJdoA==
# SIG # End signature block
