ADLAB PowerShell source file: buildup-iis.ps1

(C) Ondrej Sevecek, 2019 - www.sevecek.com, ondrej@sevecek.com



#$global:outClass = 'main'

$libDir = Split-Path -parent $MyInvocation.MyCommand.Definition
& "$libDir\lib-common.ps1" -defaultConfig -rootDir $libDir -outFile iisLib
& "$libDir\lib-modifyActions.ps1"
& "$libDir\lib-buildup.ps1"

$vmName = $args[0]

DBG ("IIS Installation library")
Redirect-TempToOutput
Load-VMConfig

Find-MarkedVolumes

$appTag = 'iis'
$appConfig = $vmConfig.$appTag
$firstAppHost = Get-FirstAppHostInInstance $appTag $appConfig.instance 'waitParams'
$firstAppHostInInstance = Check-FirstAppHostInInstance $appTag $appConfig.instance


#====================
#====================


function global:Get-HostNamesFromBindins ([string] $bindingsStr, [bool] $doNotIncludeLocalmachine = $true)
{
  DBG ('{0}: Parameters: {1}' -f $MyInvocation.MyCommand.Name, (($PSBoundParameters.Keys | ? { $_ -ne 'object' } | % { '{0}={1}' -f $_, $PSBoundParameters[$_]}) -join $multivalueSeparator))
  DBGIF $MyInvocation.MyCommand.Name { Is-EmptyString $bindingsStr }

  [string[]] $bindinds = $bindingsStr.Split(',')
  DBG ('We have bindings: #{0} | {1}', $bindinds.Length, $bindingsStr)
  DBG ('We have the following local computer names: {0}' -f ($global:thisComputerLocalMachineNames -join ','))

  [Collections.ArrayList] $hostNames = @()
  foreach ($oneBindind in $bindinds) {

    DBG ('One binding to process: {0}' -f $oneBindind)

    [string] $hostname = $oneBindind.Split(':')[2].Trim().Trim('.')
    DBG ('Hostname determined: {0}' -f $hostname)

    if (Is-ValidString $hostname) {

      if ($doNotIncludeLocalmachine -and (Contains-Safe $global:thisComputerLocalMachineNames $hostname)) {

        DBG ('Omitting local host machine name from output: {0}' -f $hostname)

      } elseif ($hostname -eq '*') {
      
        DBG ('Omitting wildcard host from the output: {0}' -f $hostName)

      } else {

        # Note: the hostname may already exist if we bind the same hostname on multiple ports
        DBG ('Addind hostname to output: {0} | existAlready = {1}' -f $hostname, (Contains-Safe $hostNames $hostname))
        
        if (-not (Contains-Safe $hostNames $hostname)) {

          [void] $hostNames.Add($hostname)
        }
      }
    }
  }

  DBG ('Returning hostnames: #{0} | {1}' -f $hostNames.Count, ($hostNames -join ','))
  return ,$hostNames
}


#====================
DBG ('Installing IIS requirements. Instance: {0}' -f $appConfig.instance)

$customRoot = Join-Path $global:rootDir 'IIS'

DBG ('Create root IIS folder')
 
$iisRoot = Resolve-VolumePath $appConfig.root

if (Is-ValidString $appConfig.app.aGroup) {

  $iisAdminsAce = 'F${0}@{1}' -f $appConfig.app.aGroup, $appConfig.app.iDomain

} else {

  $iisAdminsAce = $null
}
  

DBGIF $MyInvocation.MyCommand.Name { Test-Path $iisRoot }
Create-NTFSFolderAndShare $iisRoot $null (Add-MultiValue $iisAdminsAce 'RT$Authenticated Users' -unique $true) $null


DBG ('Should we clean the IIS first: {0} | {1}' -f (Is-ValidString $appConfig.cleanIIS), $appConfig.cleanIIS)

if (Is-ValidString $appConfig.cleanIIS) {

  DBGIF $MyInvocation.MyCommand.Name { (Count-MultiValue $appConfig.cleanIIS) -ne 2 }

  $cleanOps = Split-MultiValue $appConfig.cleanIIS
  Clean-IIS $cleanOps[0] $cleanOps[1]
}


DBG ('Process site/app/vdir requirements')

$sites = $appConfig.SelectNodes('./site')
DBG ('Sites required: {0}' -f (Get-CountSafe $sites))

if ((Get-CountSafe $sites) -gt 0) {

  foreach ($oneSite in $sites) {

    $appPoolName = '{0} AppPool' -f $oneSite.desc
    $onePath = Join-Path $iisRoot $oneSite.desc
    DBGIF $MyInvocation.MyCommand.Name { Is-EmptyString $onePath }


    $authMethods = Split-MultiValue $oneSite.auth
    DBG ('Authentication methods requested: # = {0} | {1}' -f $authMethods.Count, ($authMethods -join ','))
    
    $authWinState = $false
    $authDisableWinKernel = $false
    $authBasicState = $false
    $authAnonState = $false
    $authDigestState = $false

    if ($authMethods.Count -gt 0) {

      foreach ($authMethodAndFlags in $authMethods) {
      
        $authMethod = Strip-ValueFlags $authMethodAndFlags
        $authFlags = Get-ValueFlags $authMethodAndFlags

        if ($authMethod -eq 'win') { 
      
          $authWinState = $true
          $authDisableWinKernel = (Has-ValueFlags $authMethodAndFlags U) -and (-not (Has-ValueFlags $authMethodAndFlags K))
          
        } elseif ($authMethod -eq 'dig') {

          $authDigestState = $true
      
        } elseif ($authMethod -eq 'bas') {

          $authBasicState = $true
      
        } elseif ($authMethod -eq 'anon') {

          $authAnonState = $true
        }
      }
    }


    [string] $appPoolAccount = $null
    [string] $appPoolPwd = $null
    DBG ('Try get apppool account if requested')
    DBGSTART
    $appPoolAccountNode = $oneSite.SelectSingleNode('./svc[@appTag="pool"]')
    DBGER $MyInvocation.MyCommand.Name $error
    DBGEND
    
    if (Is-NonNull $appPoolAccountNode) {

      $appPoolAccount = Get-SAMLogin $appPoolAccountNode.login $appPoolAccountNode.domain
      $appPoolPwd = $appPoolAccountNode.pwd
      DBG ('Explicit apppool account specified: {0}' -f $appPoolAccount)
    }


    # Note: netfxVersion will be used in managedRuntimeVersion, so it must come as v1.0, v1.1, v2.0, v4.0
    Create-IISSite $oneSite.desc $onePath $oneSite.ntfs $oneSite.binding $appPoolName $authWinState $authAnonState $authBasicState $authDigestState -authDisableWinKernel $authDisableWinKernel -compressionStates $oneSite.compress -netfxVersion $oneSite.netfxVersion -clientCache $oneSite.clientCache -appPoolAccount $appPoolAccount -appPoolPwd $appPoolPwd -loadProfile $oneSite.loadProfile -sni (Parse-BoolSafe $oneSite.sni)


    if ($authAnonState) {

      $anonymousIdentity = $oneSite.SelectSingleNode('./svc[@appTag="anon"]')
      DBG ('Anonymous authentication enabled. Should we change the IIS anonymous account identity: {0}' -f (Is-NonNull $anonymousIdentity))

      if (Is-NonNull $anonymousIdentity) {

        Change-IISAnonymousIdentity -site $oneSite.desc -subPath "" -login $anonymousIdentity.login -domain $anonymousIdentity.domain -password $anonymousIdentity.pwd
      }
    }


    [string[]] $hostHeaders = Get-HostNamesFromBindins $oneSite.binding -doNotIncludeLocalmachine $true

    DBG ('Should we en-host all the host header bindings: {0}' -f (Parse-BoolSafe $oneSite.selfHost))
    DBG ('Should we disable loopback check for the host header bindings: {0}' -f (Parse-BoolSafe $oneSite.dlpbc))
    Define-DnsHostAliases $hostHeaders -addHosts (Parse-BoolSafe $oneSite.selfHost) -disableLoopbackCheck (Parse-BoolSafe $oneSite.dlpbc)


    if (Is-ValidString $oneSite.src) {

      $contentSrc = Join-Path $customRoot $oneSite.src
      DBG ('Populate default site content as copy: {0} | {1}' -f $onePath, $contentSrc)

      Copy-DeployContent -src $contentSrc -target $onePath -replace $oneSite.replace
    }
  }
}




# SIG # Begin signature block
# MIIXfQYJKoZIhvcNAQcCoIIXbjCCF2oCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDAMnEcmTa/PzvB
# wy0ED5D2ZsF+t8KdkDA5B6ysQr7N4KCCEq8wggVsMIIDVKADAgECAhNUAAAABED2
# iyhK7xCkAAAAAAAEMA0GCSqGSIb3DQEBCwUAMEgxCzAJBgNVBAYTAkNaMRAwDgYD
# VQQIEwdDemVjaGlhMQ0wCwYDVQQHEwRCcm5vMRgwFgYDVQQDEw9TRVZFQ0VLIFJv
# b3QgQ0EwHhcNMTkwMjAzMTQyNTIzWhcNMjMwMjAyMTQyNTIzWjB8MQswCQYDVQQG
# EwJDWjEQMA4GA1UECBMHQ3plY2hpYTEfMB0GA1UECgwWSW5nLiBPbmTFmWVqIMWg
# ZXZlxI1lazEXMBUGA1UEAxMOT25kcmVqIFNldmVjZWsxITAfBgkqhkiG9w0BCQEW
# Em9uZHJlakBzZXZlY2VrLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
# ggEBAKJFsZ8+rfwVZFhT+pb7O/lCvRiFK9DcrjhkfFCiZnZepVCGE+qIFcvPJ9lI
# QB34knfG4poXWFYt6L0nDSQGzjbxeBiXqM9ApVcO+COAs3DLnRms5MA5iDAz4Itf
# W24qbqlg/UnpNYa9UfXMqKgy0Gg5rTYgWTsdicmWEv2nuc5XdiqiJauru+W05mSq
# wit9XNAcSmTrk62Ug6Vf3AxwtphQBqUkou22FLSPNmIBskrNJUwEpUxLKFMxyKBp
# bKGkC7nSXTqnBe6jbUdH1v9yvS+XORNk2Gc+xVYseYhnWR/YwWPW9JMYm//Dctnu
# mDOB44h7x/1vFUUhjQYN/0YhH9sCAwEAAaOCARkwggEVMBMGA1UdJQQMMAoGCCsG
# AQUFBwMDMA4GA1UdDwEB/wQEAwIHgDAbBgkrBgEEAYI3FQoEDjAMMAoGCCsGAQUF
# BwMDMB0GA1UdDgQWBBSqNu1q4LR3rqV1BNFOX0fuqCemajAfBgNVHSMEGDAWgBRu
# bqsMgYFRMHn9gbVafNQPPGvn8DBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vcGtp
# LnNldmVjZWsuY29tL2NhL3NldmVjZWslMjByb290JTIwY2EuY3JsME0GCCsGAQUF
# BwEBBEEwPzA9BggrBgEFBQcwAoYxaHR0cDovL3BraS5zZXZlY2VrLmNvbS9jYS9z
# ZXZlY2VrJTIwcm9vdCUyMGNhLmNlcjANBgkqhkiG9w0BAQsFAAOCAgEAdttbfCaU
# Y4tNjOgUH2HAl1T0iKw2OffYOC0OVHzgYerdvBE8aLN3eGR+VdTYm1ZAJk0XxhW0
# ygFTVEh+2etf/93/nFd6yVedqIW2JyVJlnOMFC+77PMUS2KxAXmpVpT0DpjbSVaC
# CXx9AEuWFu3a1v3R3yh3MiHLm23LWL7BHojmXfzqMcc/bOG7m6Tw83sL7I+xSsn3
# mUon5faK+zD478uIxDiIGXI3jTm8oln2tSuYJ91nihTZFvlIBn06Wp6qDoRFkzLs
# kZn9ZahOGgRrs9SKrM+t3gBhyx5DCHRiIfUCieVX82AIo2JtBO8GJY1aSXj0Yw18
# 9nHGhfSXkNMgtA+qOq1ZPktPaBnpeBs8MZEjTH36vUfkaQm7g8CL2iQxaRcRHVhS
# CMOujrjqUbNMKa3E6sdRiu2FZ/XqWqdZ9zsmgtVoAn9n79WuFCXDHXG+WlG+MBUz
# JSyQCyPOdrrZPbLdr/3iWy9TeX5LzfQrE5oeGYsliLe+u0bl++/PugSCI8+ApsFA
# 1bpXfeiqVOE0DmhtZgmESUynlAGd2GEoxE1OFWXvltZTynZoEF9/A9rpspsmWHAW
# 2KCGsJEQreGVCvZzcLxv2/brNcHFsO0DFWpXaR3ZJDUUzxcDxyVt3Bi1iRSTEQSp
# n92T+bX/VEatPa0OnAMeemB4/xeUNwSObccwggZqMIIFUqADAgECAhADAZoCOv9Y
# sWvW1ermF/BmMA0GCSqGSIb3DQEBBQUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IEFzc3VyZWQgSUQgQ0EtMTAeFw0xNDEwMjIwMDAwMDBaFw0y
# NDEwMjIwMDAwMDBaMEcxCzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEl
# MCMGA1UEAxMcRGlnaUNlcnQgVGltZXN0YW1wIFJlc3BvbmRlcjCCASIwDQYJKoZI
# hvcNAQEBBQADggEPADCCAQoCggEBAKNkXfx8s+CCNeDg9sYq5kl1O8xu4FOpnx9k
# WeZ8a39rjJ1V+JLjntVaY1sCSVDZg85vZu7dy4XpX6X51Id0iEQ7Gcnl9ZGfxhQ5
# rCTqqEsskYnMXij0ZLZQt/USs3OWCmejvmGfrvP9Enh1DqZbFP1FI46GRFV9GIYF
# jFWHeUhG98oOjafeTl/iqLYtWQJhiGFyGGi5uHzu5uc0LzF3gTAfuzYBje8n4/ea
# 8EwxZI3j6/oZh6h+z+yMDDZbesF6uHjHyQYuRhDIjegEYNu8c3T6Ttj+qkDxss5w
# RoPp2kChWTrZFQlXmVYwk/PJYczQCMxr7GJCkawCwO+k8IkRj3cCAwEAAaOCAzUw
# ggMxMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoG
# CCsGAQUFBwMIMIIBvwYDVR0gBIIBtjCCAbIwggGhBglghkgBhv1sBwEwggGSMCgG
# CCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIIBZAYIKwYB
# BQUHAgIwggFWHoIBUgBBAG4AeQAgAHUAcwBlACAAbwBmACAAdABoAGkAcwAgAEMA
# ZQByAHQAaQBmAGkAYwBhAHQAZQAgAGMAbwBuAHMAdABpAHQAdQB0AGUAcwAgAGEA
# YwBjAGUAcAB0AGEAbgBjAGUAIABvAGYAIAB0AGgAZQAgAEQAaQBnAGkAQwBlAHIA
# dAAgAEMAUAAvAEMAUABTACAAYQBuAGQAIAB0AGgAZQAgAFIAZQBsAHkAaQBuAGcA
# IABQAGEAcgB0AHkAIABBAGcAcgBlAGUAbQBlAG4AdAAgAHcAaABpAGMAaAAgAGwA
# aQBtAGkAdAAgAGwAaQBhAGIAaQBsAGkAdAB5ACAAYQBuAGQAIABhAHIAZQAgAGkA
# bgBjAG8AcgBwAG8AcgBhAHQAZQBkACAAaABlAHIAZQBpAG4AIABiAHkAIAByAGUA
# ZgBlAHIAZQBuAGMAZQAuMAsGCWCGSAGG/WwDFTAfBgNVHSMEGDAWgBQVABIrE5iy
# mQftHt+ivlcNK2cCzTAdBgNVHQ4EFgQUYVpNJLZJMp1KKnkag0v0HonByn0wfQYD
# VR0fBHYwdDA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0
# QXNzdXJlZElEQ0EtMS5jcmwwOKA2oDSGMmh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNv
# bS9EaWdpQ2VydEFzc3VyZWRJRENBLTEuY3JsMHcGCCsGAQUFBwEBBGswaTAkBggr
# BgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVo
# dHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURDQS0x
# LmNydDANBgkqhkiG9w0BAQUFAAOCAQEAnSV+GzNNsiaBXJuGziMgD4CH5Yj//7HU
# aiwx7ToXGXEXzakbvFoWOQCd42yE5FpA+94GAYw3+puxnSR+/iCkV61bt5qwYCbq
# aVchXTQvH3Gwg5QZBWs1kBCge5fH9j/n4hFBpr1i2fAnPTgdKG86Ugnw7HBi02JL
# sOBzppLA044x2C/jbRcTBu7kA7YUq/OPQ6dxnSHdFMoVXZJB2vkPgdGZdA0mxA5/
# G7X1oPHGdwYoFenYk+VVFvC7Cqsc21xIJ2bIo4sKHOWV2q7ELlmgYd3a822iYemK
# C23sEhi991VUQAOSK2vCUcIKSK+w1G7g9BQKOhvjjz3Kr2qNe9zYRDCCBs0wggW1
# oAMCAQICEAb9+QOWA63qAArrPye7uhswDQYJKoZIhvcNAQEFBQAwZTELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X
# DTA2MTExMDAwMDAwMFoXDTIxMTExMDAwMDAwMFowYjELMAkGA1UEBhMCVVMxFTAT
# BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEh
# MB8GA1UEAxMYRGlnaUNlcnQgQXNzdXJlZCBJRCBDQS0xMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEA6IItmfnKwkKVpYBzQHDSnlZUXKnE0kEGj8kz/E1F
# kVyBn+0snPgWWd+etSQVwpi5tHdJ3InECtqvy15r7a2wcTHrzzpADEZNk+yLejYI
# A6sMNP4YSYL+x8cxSIB8HqIPkg5QycaH6zY/2DDD/6b3+6LNb3Mj/qxWBZDwMiEW
# icZwiPkFl32jx0PdAug7Pe2xQaPtP77blUjE7h6z8rwMK5nQxl0SQoHhg26Ccz8m
# SxSQrllmCsSNvtLOBq6thG9IhJtPQLnxTPKvmPv2zkBdXPao8S+v7Iki8msYZbHB
# c63X8djPHgp0XEK4aH631XcKJ1Z8D2KkPzIUYJX9BwSiCQIDAQABo4IDejCCA3Yw
# DgYDVR0PAQH/BAQDAgGGMDsGA1UdJQQ0MDIGCCsGAQUFBwMBBggrBgEFBQcDAgYI
# KwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCDCCAdIGA1UdIASCAckwggHFMIIB
# tAYKYIZIAYb9bAABBDCCAaQwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cuZGlnaWNl
# cnQuY29tL3NzbC1jcHMtcmVwb3NpdG9yeS5odG0wggFkBggrBgEFBQcCAjCCAVYe
# ggFSAEEAbgB5ACAAdQBzAGUAIABvAGYAIAB0AGgAaQBzACAAQwBlAHIAdABpAGYA
# aQBjAGEAdABlACAAYwBvAG4AcwB0AGkAdAB1AHQAZQBzACAAYQBjAGMAZQBwAHQA
# YQBuAGMAZQAgAG8AZgAgAHQAaABlACAARABpAGcAaQBDAGUAcgB0ACAAQwBQAC8A
# QwBQAFMAIABhAG4AZAAgAHQAaABlACAAUgBlAGwAeQBpAG4AZwAgAFAAYQByAHQA
# eQAgAEEAZwByAGUAZQBtAGUAbgB0ACAAdwBoAGkAYwBoACAAbABpAG0AaQB0ACAA
# bABpAGEAYgBpAGwAaQB0AHkAIABhAG4AZAAgAGEAcgBlACAAaQBuAGMAbwByAHAA
# bwByAGEAdABlAGQAIABoAGUAcgBlAGkAbgAgAGIAeQAgAHIAZQBmAGUAcgBlAG4A
# YwBlAC4wCwYJYIZIAYb9bAMVMBIGA1UdEwEB/wQIMAYBAf8CAQAweQYIKwYBBQUH
# AQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYI
# KwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFz
# c3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmwz
# LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaG
# NGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RD
# QS5jcmwwHQYDVR0OBBYEFBUAEisTmLKZB+0e36K+Vw0rZwLNMB8GA1UdIwQYMBaA
# FEXroq/0ksuCMS1Ri6enIZ3zbcgPMA0GCSqGSIb3DQEBBQUAA4IBAQBGUD7Jtygk
# pzgdtlspr1LPUukxR6tWXHvVDQtBs+/sdR90OPKyXGGinJXDUOSCuSPRujqGcq04
# eKx1XRcXNHJHhZRW0eu7NoR3zCSl8wQZVann4+erYs37iy2QwsDStZS9Xk+xBdIO
# PRqpFFumhjFiqKgz5Js5p8T1zh14dpQlc+Qqq8+cdkvtX8JLFuRLcEwAiR78xXm8
# TBJX/l/hHrwCXaj++wc4Tw3GXZG5D2dFzdaD7eeSDY2xaYxP+1ngIw/Sqq4AfO6c
# Qg7PkdcntxbuD8O9fAqg7iwIVYUiuOsYGk38KiGtSTGDR5V3cdyxG0tLHBCcdxTB
# nU8vWpUIKRAmMYIEJDCCBCACAQEwXzBIMQswCQYDVQQGEwJDWjEQMA4GA1UECBMH
# Q3plY2hpYTENMAsGA1UEBxMEQnJubzEYMBYGA1UEAxMPU0VWRUNFSyBSb290IENB
# AhNUAAAABED2iyhK7xCkAAAAAAAEMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQB
# gjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIDzfE9Vj
# GX3KDNKv1TG36Ed8UwSlE1+IPX5dHcD/9emQMA0GCSqGSIb3DQEBAQUABIIBAJmw
# +q5cu0o7k7mSI1qx3yTmOPd5lCF7GH8ZRUglYpwWVjsgKFQKKWHK+ZkB0x65geof
# CTyyvHdOCO/mEIaeF179p399inu6M9tF+Jdsry+I2FslGKPxCgXcCxxuyVMh9HG7
# 5KTzR0mMzjJeRPqIHtznhIIRwM+JLfswfU2LqBo/beIw7inKxzgrdC5U8NcJtNfP
# NbFcOq1hLSj06OHYqLfC2NGgZ45Z3wCooL7s2tvU6tYRP+Z/l7N03l+Ho7k0a/P3
# X5mZNrLCdA7IAuo9OXNEz2aO1nnMpqCW+UcAy7QlSMlZJR3+pwjpvr3G9uC95Va/
# tHojmpjpJQTxm+bExxWhggIPMIICCwYJKoZIhvcNAQkGMYIB/DCCAfgCAQEwdjBi
# MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
# d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBBc3N1cmVkIElEIENB
# LTECEAMBmgI6/1ixa9bV6uYX8GYwCQYFKw4DAhoFAKBdMBgGCSqGSIb3DQEJAzEL
# BgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE5MDQyNTE0MzQ0NVowIwYJKoZI
# hvcNAQkEMRYEFObXm7LM9ui2HzI/fd9BieNlkB3BMA0GCSqGSIb3DQEBAQUABIIB
# AAb09es5KWL9w9hkqQ4u8BX7ak2ZU31n1svBsp+w2NAWsOaPHAow45tpG2mQcMEJ
# D58cIdYHUo4WQS63FW8lMtV8gWLSBanSztUxTvL+POXmAOjoTJnRM/I3M+obYldW
# ezY2csRIjywi2/5oSWeyiqTAdX4Hl32tBJYB+MRLJZvKoR5AuKX/l4ZBn7yZ7dKq
# gyX5Tnh9O63l6zv/u83J2WM1XAtQfnZ89o76nWMgLNet2S/SkYe0lricrE+fSxCm
# fLyFmPFsILEqQWhA9FBxaJbHYAPfmR2LnUkKZ5X9h+k5pqUFNRMPzCbeUyS5MbT2
# MYcXNEdSZV/bDfq0OfrEGcg=
# SIG # End signature block