New-BCDevContainer.ps1

# Version 1.0.0.0
function New-BCDevContainer {
  <#
 
.SYNOPSIS
  Creates BC container
.DESCRIPTION
  Creates BC container
.PARAMETER containerName
  Name of container
.PARAMETER BCLicense
  The path to the license file
.PARAMETER version
  The version for the artificates to download
.PARAMETER sqlBackupfile
  The file path to the SQL bakcup file
.Parameter databaseServer
  Name of database server when using external SQL Server (omit if using database inside the container)
.Parameter databaseInstance
  Name of database instance when using external SQL Server (omit if using database inside the container)
.Parameter databaseName
  Name of database to connect to when using external SQL Server (omit if using database inside the container)
 .Parameter includeTestToolkit
  Specify this parameter to add the test toolkit and the standard tests to the container
.Parameter includePerformanceToolkit
  Include the performance toolkit app (only 17.x and later)
.Parameter useTraefik
  Set the necessary options to make the container work behind a traefik proxy as explained here https://www.axians-infoma.com/techblog/running-multiple-nav-bc-containers-on-an-azure-vm/
.Parameter PublicDnsName
  Use this parameter to specify which public dns name is pointing to this container.
  This parameter is necessary if you want to be able to connect to the container from outside the host.
  .Parameter timeout
  Specify the number of seconds to wait for activity. Default is 1800 (30 min.). -1 means wait forever.
.Parameter enableTaskScheduler
  Include this switch if you want to do Enable the Task Scheduler
.Parameter isolation
  Isolation mode for the container (default is process isolation if host and container OS match)
 .Parameter type
  OnPrem or Sandbox (default is Sandbox)
.Parameter useSSL
  Include this switch if you want to use SSL (https) with a self-signed certificate
.Parameter installCertificateOnHost
  Include this switch if you want to use SSL (https) with a self-signed certificate
 
.EXAMPLE
 
  New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0"
 
.EXAMPLE
 
  New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" -sqlBackupfile "C:\DockerShare\mssql\Demo Database NAV (11-0).bak"
 
.EXAMPLE
 
  New-BCDevContainer -containerName BCDev -BCLicense "C:\DockerShare\License\BCDev.flf" -version "16.0" -includeTestToolkit
 
.EXAMPLE
  Remember to activate the SQL login for the database server and to active sql login for the sa user
 
  New-BCDevContainer -containerName $containerName -version 17.3 -databaseServer 'host.docker.internal' -databaseName 'cronus'
 
  Following code might be need to create the user in the database.
  New-NavContainerNavUser `
    -containerName $containerName `
    -Credential $credential `
    -ChangePasswordAtNextLogOn:$false `
    -PermissionSetId SUPER `
    -tenant 'Default'
#>

  [CmdletBinding()]
  param(
    [string] $containerName = 'bcdev', 
    [string] $bcLicense,
    [string] $version,
    [string] $country = 'no',
    [string] $sqlBackupfile,
    [string] $databaseServer,
    [string] $databaseInstance = '',
    [string] $databaseName, 
    [switch] $includeTestToolkit,
    [switch] $includePerformanceToolkit,
    [switch] $includeAL,
    [switch] $includeCSide,
    [switch] $doNotExportObjectsToText,
    [switch] $enableSymbolLoading ,
    [switch] $useTraefik,
    [string] $PublicDnsName,
    [switch] $enableTaskScheduler,
    [ValidateSet('', 'process', 'hyperv')]
    [string] $isolation = "",
    [ValidateSet('', 'OnPrem', 'Sandbox')]
    [string] $type = "OnPrem",
    [switch] $useSSL = $false,
    [switch] $installCertificateOnHost = $false,
    [PSCredential] $credential
  )
  PROCESS {
    try { 
      $RootDrive = (get-location).Drive.Root
      $RootFolderPath = join-path $RootDrive 'DockerShare\'
      $Authentication = 'NavUserPassword' 
      $dbcredentials = New-Object PSCredential -ArgumentList 'sa', $credential.Password
      $additionalParametersString = '-v ' + $RootFolderPath + ':C:\DockerShare'
      if ([string]::IsNullOrEmpty($sqlBackupfile)) {
        $additionalParameters = @(("$additionalParametersString"))
      }
      else {
        $additionalParameters = @(("$additionalParametersString"), ('--env bakfile=' + $sqlBackupfile))
      }
      if ([string]::IsNullOrEmpty($version)) {
        $artifactUrl = Get-BCArtifactUrl -type:$type -country $country -select Latest
      }
      else {
        $artifactUrl = Get-BCArtifactUrl -type:$type -country $country -version $version -select Latest
      }
      if ($useTraefik) {
        $imageName = $artifactUrl
        if ($imageName.Contains('https://bcartifacts.azureedge.net')) {
          $imageName = 'bcimage:' + $imageName.Substring('https://bcartifacts.azureedge.net'.Length + 1).Replace('/', '-')
        }
        else {
          $imageName = 'bcimage:' + $imageName.Substring('https://bcartifacts.blob.core.windows.net'.Length + 1).Replace('/', '-')
        }
      }

      if ([string]::IsNullOrEmpty($databaseName)) {
        New-BCContainer -isolation:$isolation  -accept_eula `
          -doNotCheckHealth `
          -updateHosts `
          -artifactUrl $artifactUrl `
          -imageName $imageName `
          -containerName $containerName `
          -auth $Authentication `
          -Credential $credential `
          -licenseFile $BCLicense `
          -additionalParameters @($additionalParameters) `
          -useBestContainerOS `
          -includeAL:$includeAL `
          -useSSL:$useSSL -installCertificateOnHost:$installCertificateOnHost `
          -assignPremiumPlan `
          -enableTaskScheduler:$enableTaskScheduler `
          -includeTestToolkit:$includeTestToolkit `
          -includePerformanceToolkit:$includePerformanceToolkit `
          -includeCSide:$includeCSide `
          -doNotExportObjectsToText:$doNotExportObjectsToText `
          -enableSymbolLoading:$enableSymbolLoading `
          -useTraefik:$useTraefik `
          -PublicDnsName:$PublicDnsName 
      }
      else {
        New-BCContainer -accept_eula `
          -doNotCheckHealth `
          -updateHosts `
          -artifactUrl $artifactUrl `
          -imageName $imageName `
          -containerName $containerName `
          -databaseInstance $databaseInstance `
          -databaseServer $databaseServer `
          -databaseName $databaseName `
          -databaseCredential $dbcredentials `
          -auth $Authentication `
          -Credential $credential `
          -licenseFile $BCLicense `
          -additionalParameters @($additionalParameters) `
          -useBestContainerOS `
          -includeAL:$includeAL `
          -useSSL:$useSSL -installCertificateOnHost:$installCertificateOnHost `
          -assignPremiumPlan `
          -enableTaskScheduler:$enableTaskScheduler `
          -includeTestToolkit:$includeTestToolkit `
          -includePerformanceToolkit:$includePerformanceToolkit `
          -includeCSide:$includeCSide `
          -doNotExportObjectsToText:$doNotExportObjectsToText `
          -enableSymbolLoading:$enableSymbolLoading `
          -useTraefik:$useTraefik `
          -PublicDnsName:$PublicDnsName 
      } 
    }
    catch [Exception] {
      "New-BCDevContainer :`n`n " + $_.Exception
    }
    finally {
      # Clean up copied backup file after restore completes successfully
    }
  }
}
Export-ModuleMember -Function New-BCDevContainer


# SIG # Begin signature block
# MIIVlQYJKoZIhvcNAQcCoIIVhjCCFYICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU62oevng6JBSTbL+hVUDOc1/H
# QfagghH1MIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B
# 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/VKNmwuWuAh9kcMIIGYDCCBMig
# AwIBAgIRANm8nd1n4WvloMcEQ5z43dkwDQYJKoZIhvcNAQEMBQAwVDELMAkGA1UE
# BhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGln
# byBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNjAeFw0yMTEwMjIwMDAwMDBaFw0y
# NDEwMjEyMzU5NTlaMEcxCzAJBgNVBAYTAk5PMQ4wDAYDVQQIDAVWaWtlbjETMBEG
# A1UECgwKRHluYXBybyBBUzETMBEGA1UEAwwKRHluYXBybyBBUzCCAiIwDQYJKoZI
# hvcNAQEBBQADggIPADCCAgoCggIBAODd7SFuO0KPfAVdjt1o/NGqrIZXT7qOqrrL
# jI+cheKE/mCHJXFyHWAXgvNz5h++mTAG4bHGDYMYGplt+S3INAm2lnkh3kxerfLP
# +kmjaiQ/cT4nXomJkpAXnlVaoSXcJDcWDBDsmkD1+lFjE9nbEdeJOvQ4Q72Cn7OH
# sXthZchhiVJfPP0wywFG/uQsCMXgOqUFJwrpvOLOIqTUTH4+ZiwelFeGq4T+CEtF
# ic8rL8f6/lYotRv1MoRYsmV7iDnrY7e1drswAiv8bQNi842LfQ62uSCS4cYHpPOt
# b3rbqZHzTuL2o9Nqz2NcffwG4mkrKyYiWCvOKKg868z7/jc8uiMSt500SiJyjQA9
# zM0pqH1EbWIUBufpJuSc0TqnxxI0DG9z3m5xGV5Sydz5zfHVWhXP/nXtsf+8dAIT
# 1zUEC4HfMtVO/X3NVaZYmYwpmAuscVJCxdm786XLMTe3Nh18v1RdTn28uxr0JnoR
# wsmPRoYyJkUb3nbh1q+xMHv75QV3KPlfTe1UwpEs7K9YnOfpXLcJhn0u13ENN5Sm
# FNznnfkGxP0jSI5MZ3f2EI7ks1TsjZNeTSznW94hQz36Ttehm8y7uL5ew4jajYeW
# 6OUu/zGhJCpZNP2Hfyi0f06ISyJFWkog1Q3G0udZhUYf31pJ6G42ZxqS5ihdPLmG
# 1dYLGWd9AgMBAAGjggG4MIIBtDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimq
# F6TNDDAdBgNVHQ4EFgQUx2vSVcLaMddlQfJKC3538TBe1ecwDgYDVR0PAQH/BAQD
# AgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4
# QgEBBAQDAgQQMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUH
# AgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBA
# MD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
# U2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0
# dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FS
# MzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAaBgNV
# HREEEzARgQ9wb3N0QGR5bmFwcm8ubm8wDQYJKoZIhvcNAQEMBQADggGBAAe6J7g+
# cJ7iWZ1DyGKy/2Ber7rIqOeiLi16R3xz8l21++ruItAygqW3JBtLj5cAxCAgJJZe
# XlShKQh+fuoSxIWEWCpMC0k8865hZIhjzfX/TKdF4Bs4VsJqha72j412IITjNNnf
# ZxfZninStkY2wA1M7D7YZUYEqnN+9UO8iEVO4SY8aKIm4YCXI5LlpDoonXGqY/yA
# YBUvMRGutUNBoNWToY8xHeavrEZ/S5CUOzaeRByG9NMYtbfLJjV5APo1Aup0hZWj
# 424wSAWt8tkc+wErO/s1yMZqU8lw/ucqXB2WirvJr4zeJMh3RywOscJfxg8WONu0
# UVlHkly6DGurGpqM1ekFIFXVko/RPuaoIhsuTpO9rZTDTcZ5tNej3jzk8scDqOSo
# SsgrEDE3XeVXlyZD2p6P2XJzoSdZwfsHRlY/Ji0gyB9dBuxicOmcKk1fxvVgcjm6
# 6wjiMHOrZa2JiIxYtBVGinEEMU83eyq0deVNO1DqZcuLGAyGH4p96dKEYDGCAwow
# ggMGAgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRl
# ZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIR
# ANm8nd1n4WvloMcEQ5z43dkwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAI
# oAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB
# CzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFOM4bHxuOKgzsavTkA9A
# 5pH5tcEdMA0GCSqGSIb3DQEBAQUABIICAIVd1D0Xr7GX6rR8c3I0hezPj65zuP7E
# kDaEpIQtcm91LYHS/FWreSP2tj3RcSAuQyy54YZj/KrJwuFLBpeHSCISMoF6Gj9x
# POu41l7U4M4bwDYPHL/4Jwfe1QzaKhyQ0zxmpQC46A77eXezd3FMKmAd6JgXf+zl
# Elb2Y9BH+ckD30NabiUJvH7B1LHWLb2KbQNz/v5EfoOoDOY9PgcvgOWfn20bXDv5
# aRVKchCnIz3rxfIz3PnwFrX2SLaiNJwUuFgDKOV8ikn304YDAlhyx35qbqKdFHxK
# MzjnvkaRtLvjSWvIjpiUOkvUcYxpABZqaxe9H8JBETrDTFgmboc4uZVBPUJf7kK3
# PypmHggJFQLRNX7ppLHvJ18bbiDk1DHK8iK1QqpS65emUoI5Izvn9vjmfr7Q0pGy
# lffLvKLCf99JNEGV+/2YdsR4tFzVEX1kygEbayWr7os+rY1RQQIzeuofvlCm11CC
# qy++w/+5orfZ1N2pzkcglXoWXqsZxHqAlmvhQVfEk3Irv+Zbq++KQ9++vX+Zf6l3
# zUQ7G+j0yukrnEuNSJMAKkmBEWT7CTErjciYHt4640NSL6LukvGn5zDZzJuMxv6s
# 8W9NQW8W7hShHqpXWHCNkc1pKVYu9juhDlDVelsB0K7Ag+k3GR0BC31wfqVDKqxR
# k+96NmbuzPeN
# SIG # End signature block