Samples/E2E-hub-devices/common/common.ps1

# ------------------------------------------------------------------
# Lenovo Copyright
#
# (C) Copyright Lenovo 2026 - present.
#
# LIMITED AND RESTRICTED RIGHTS NOTICE:
# If data or software is delivered pursuant a General Services
# Administration (GSA) contract, use, reproduction, or disclosure
# is subject to restrictions set forth in Contract No. GS-35F-05925.
# ------------------------------------------------------------------

function PrintProgerss()
{
    param (
        [Parameter(Mandatory = $true)]
        [int] $Count
    )
    if ($Count -le 20)
    {
        Write-Host "." -NoNewline
        $Count ++
    }
    else
    {
        Write-Host "."
        $Count = 0
    }
    return $Count
}

function GetJobList()
{
    [CmdletBinding()]
    param (
        [Parameter()]
        [System.Object] $Jobs
    )

    [int[]]$jobList = @()
    if (($Jobs -is [System.String]) -and ($jobID = [int]$Jobs))
    {
        $jobList += $jobID
    }
    elseif ($Jobs -is [System.Collections.IEnumerable])
    {
        foreach ($item in $Jobs)
        {
            if ($jobID = [int]$item)
            {
                $jobList += $jobID
            }
        }
    }
    else
    {
        Write-Host $Jobs | Format-List
        throw "Invalid input for Jobs parameter. Expected a single job ID or a collection of job IDs."
    }
    return $jobList
}

function IsJobCompleted()
{
    param (
        [Parameter(Mandatory = $true)]
        [System.String] $Job
    )
    return (-not $Job.ToLower().Contains("running"))
}

function WaitForTasksToEnd ()
{
    [CmdletBinding()]
    param (
        [Parameter()]
        [System.Object] $JobsToWaitFor
    )
    $jobList = GetJobList -Jobs $JobsToWaitFor
    [bool]$isCompleted = $true
    $counter = 0
    $sleepSeconds = 2

    do {
        $isCompleted = $true
        foreach ($jobID in $jobList)
        {
            $job = Get-LXC1Job -Id $jobID
            if (-not (IsJobCompleted -Job $job.Response.status))
            {
                $isCompleted = $false
                break
            }
        }
        if (-not $isCompleted)
        {
            Write-Host ("Elapsed {0} secs ... Sleeping for another {1} seconds." -f ($counter * $sleepSeconds), $sleepSeconds)
            Start-Sleep -Seconds $sleepSeconds
            $counter++
        }
    } while (-not $isCompleted)
}

function ConnectLXC1 ()
{
    param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $PortalAddress,

        [Parameter(Mandatory = $true)]
        [ValidateSet("onPremises", "cloud")]
        $PortalType,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [PSCredential]$PortalCredential
    )
    return (Connect-LXC1 -PortalAddress $PortalAddress `
                         -Credential $PortalCredential `
                         -PortalType $PortalType `
                         -Timeout 36000 )
}

#EOF

# SIG # Begin signature block
# MIIonAYJKoZIhvcNAQcCoIIojTCCKIkCAQExDzANBglghkgBZQMEAgIFADCBiQYK
# KwYBBAGCNwIBBKB7MHkwNAYKKwYBBAGCNwIBHjAmAgMBAAAEEB/MO2BZSwhOtyTS
# xil+81ECAQACAQACAQACAQACAQAwQTANBglghkgBZQMEAgIFAAQwnIZ+Pe+fvgtD
# UDoLz/ftKLD2wRG4VwZy2W0GhJEEMJf3979Kd4B4/0Ko8jQCnKc2oIINjjCCBrAw
# ggSYoAMCAQICEAitQLJg0pxMn17Nqb2TrtkwDQYJKoZIhvcNAQEMBQAwYjELMAkG
# A1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRp
# Z2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MB4X
# DTIxMDQyOTAwMDAwMFoXDTM2MDQyODIzNTk1OVowaTELMAkGA1UEBhMCVVMxFzAV
# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVk
# IEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMTCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBANW0L0LQKK14t13VOVkbsYhC9TOM6z2B
# l3DFu8SFJjCfpI5o2Fz16zQkB+FLT9N4Q/QX1x7a+dLVZxpSTw6hV/yImcGRzIED
# Pk1wJGSzjeIIfTR9TIBXEmtDmpnyxTsf8u/LR1oTpkyzASAl8xDTi7L7CPCK4J0J
# wGWn+piASTWHPVEZ6JAheEUuoZ8s4RjCGszF7pNJcEIyj/vG6hzzZWiRok1MghFI
# UmjeEL0UV13oGBNlxX+yT4UsSKRWhDXW+S6cqgAV0Tf+GgaUwnzI6hsy5srC9Kej
# Aw50pa85tqtgEuPo1rn3MeHcreQYoNjBI0dHs6EPbqOrbZgGgxu3amct0r1EGpIQ
# gY+wOwnXx5syWsL/amBUi0nBk+3htFzgb+sm+YzVsvk4EObqzpH1vtP7b5NhNFy8
# k0UogzYqZihfsHPOiyYlBrKD1Fz2FRlM7WLgXjPy6OjsCqewAyuRsjZ5vvetCB51
# pmXMu+NIUPN3kRr+21CiRshhWJj1fAIWPIMorTmG7NS3DVPQ+EfmdTCN7DCTdhSm
# W0tddGFNPxKRdt6/WMtyEClB8NXFbSZ2aBFBE1ia3CYrAfSJTVnbeM+BSj5AR1/J
# gVBzhRAjIVlgimRUwcwhGug4GXxmHM14OEUwmU//Y09Mu6oNCFNBfFg9R7P6tuyM
# MgkCzGw8DFYRAgMBAAGjggFZMIIBVTASBgNVHRMBAf8ECDAGAQH/AgEAMB0GA1Ud
# DgQWBBRoN+Drtjv4XxGG+/5hewiIZfROQjAfBgNVHSMEGDAWgBTs1+OC0nFdZEzf
# Lmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwMw
# dwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2Vy
# dC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDowOKA2oDSGMmh0dHA6
# Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3JsMBwG
# A1UdIAQVMBMwBwYFZ4EMAQMwCAYGZ4EMAQQBMA0GCSqGSIb3DQEBDAUAA4ICAQA6
# I0Q9jQh27o+8OpnTVuACGqX4SDTzLLbmdGb3lHKxAMqvbDAnExKekESfS/2eo3wm
# 1Te8Ol1IbZXVP0n0J7sWgUVQ/Zy9toXgdn43ccsi91qqkM/1k2rj6yDR1VB5iJqK
# isG2vaFIGH7c2IAaERkYzWGZgVb2yeN258TkG19D+D6U/3Y5PZ7Umc9K3SjrXyah
# lVhI1Rr+1yc//ZDRdobdHLBgXPMNqO7giaG9OeE4Ttpuuzad++UhU1rDyulq8aI+
# 20O4M8hPOBSSmfXdzlRt2V0CFB9AM3wD4pWywiF1c1LLRtjENByipUuNzW92NyyF
# PxrOJukYvpAHsEN/lYgggnDwzMrv/Sk1XB+JOFX3N4qLCaHLC+kxGv8uGVw5ceG+
# nKcKBtYmZ7eS5k5f3nqsSc8upHSSrds8pJyGH+PBVhsrI/+PteqIe3Br5qC6/To/
# RabE6BaRUotBwEiES5ZNq0RA443wFSjO7fEYVgcqLxDEDAhkPDOPriiMPMuPiAsN
# vzv0zh57ju+168u38HcT5ucoP6wSrqUvImxB+YJcFWbMbA7KxYbD9iYzDAdLoNMH
# AmpqQDBISzSoUSC7rRuFCOJZDW3KBVAr6kocnqX9oKcfBnTn8tZSkP2vhUgh+Vc7
# tJwD7YZF9LRhbr9o4iZghurIr6n+lB3nYxs6hlZ4TjCCBtYwggS+oAMCAQICEA4N
# SQ+9/yWf5fddvJTWmGgwDQYJKoZIhvcNAQELBQAwaTELMAkGA1UEBhMCVVMxFzAV
# BgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVk
# IEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMTAeFw0yNTA4
# MjIwMDAwMDBaFw0yNjA4MjEyMzU5NTlaMF4xCzAJBgNVBAYTAlVTMRcwFQYDVQQI
# Ew5Ob3J0aCBDYXJvbGluYTEUMBIGA1UEBxMLTW9ycmlzdmlsbGUxDzANBgNVBAoT
# Bkxlbm92bzEPMA0GA1UEAxMGTGVub3ZvMIIBojANBgkqhkiG9w0BAQEFAAOCAY8A
# MIIBigKCAYEAy5eIM5QMR+UMRJIlyLW6kLSSDS92mk9KYxnRrgw2kxTWayrUB1lC
# ICb+RXO4ZCUGpNiSWOizwNd6YExVqCb2/Y7HQ7VSIbwawUqyAX7DRtnhi/hUXcFv
# idKk5qUCuz8p9T8NYgirlxBJd5KZAbx3SBeKKaYtfl6VLw6GpdWxVzRhl/AO21j+
# 8L52t7Eh6md2mizqOgUoJ41XJ15OpnpqY79a0PHeswxukWinUZFAlxtIHg4fCn2/
# wl9hqa6LRyP7+WzroI6fkXJs2slyejY0PCid9nCdSv5CvJeYJ5tRw6yHUVM2gVis
# SAwa4KW954nhZkw94Sx6T65kZ/MZ4dH7kTTmgln33WSHukoIpsF5vICDBsIrbr9i
# PNDw+viT6QrI4CqAOsf75cCstg3vK2b1/TbI/ahJUzAiGHrHi31jq8HAujPryV3a
# oY3e6yLIm7FHLHB1xOdjXfbl5n5roTnQoDHKNk9ybO3SEetoWF5O3QZ1A6gRB15m
# 9RU8HqDpujPbAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4XxGG+/5h
# ewiIZfROQjAdBgNVHQ4EFgQUxU1hosmsl9DA31WV5+iSfCurk8UwPgYDVR0gBDcw
# NTAzBgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5j
# b20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYD
# VR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNl
# cnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBT
# oFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0
# Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEB
# BIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYI
# KwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy
# dXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1Ud
# EwQCMAAwDQYJKoZIhvcNAQELBQADggIBAG6TLs2hwIBSllVyhSUIwkQ1EGtKToXN
# 6R0Inl/BTh2WUpcZMUyDe4A1I8FoXZkhU5/h9f8OPjUQofRS/UBaqdtWL16kS+Aa
# tRxJK/jquscLChs5FOOedmpKmrbSvM7Ej05UHxDRrFgpkhDdFSWKIDSUhTWQVscd
# URFfCWYzcqzBZLumVyCqPxZSppNlloTf9YB+E1FnRDw+//qxnr4YS2a3f0P5yIq3
# Fvyky6vEb8L5guN+7vBgoFf3mLTxgbpLtLEbCdgPCdsuU4wmGQ7508wuwx4jD/x+
# LepZda21uDT//cC6J3HrfyoDUYc9hOtlxVIDxULguUWQOsC7MrXkUEAm73yYiuD4
# 3uFILe49aONrTG8DAyp2+88Y3sZsrqgzxRjAbfCmLvmi8qhwEQ8cVmv6HPzW1cHJ
# ewG+nnAp4jYC+8BoR1rHMSa/Ro4GfOh6fowxaPsalmKiPQyRsHHqvgL0NYsAgQY/
# O4hxN0K/04QOUXA8tSFpdssu9dHJFcGQkem5NTQAoC7mqP10jM0v7I38o2bdluSO
# GoZB2dwbReid2V+DnLeuzc6Torr1Bok3/XjCXq3P6VVjUcor1raTs1+Q1KaL51mA
# rNziqD45eeUPun6KZhoSEbJNW+Xwr/b69pS+VvPhHXG9Mf+L2KIVhMaUQQcMXqIw
# PCohl+fUhzz6MYIaUzCCGk8CAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMO
# RGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29k
# ZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhAODUkPvf8ln+X3XbyU
# 1phoMA0GCWCGSAFlAwQCAgUAoIGMMBAGCisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3
# DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgorBgEEAYI3AgEV
# MD8GCSqGSIb3DQEJBDEyBDAWtDE63FAG9HAhp/wa3E2S/n9m9kvWjrxUwb72rKPp
# 99VIE5ki+oS9DNsZGbVu9gUwDQYJKoZIhvcNAQEBBQAEggGAETkEvg15Mt63lQh/
# O/BwBHZImY/3OUvHhvkjfHTofn89eVRxxSBdiEu0R31/43XNk3CBzK97Db9UyKMg
# Om/pPP/z5qu/JWm8KGICuxeCkgHcjGZFTzX2vP+chqlv4My0hkMu7q6ZUhei38Fe
# arM1+JoEYAjU3AjNl+v6cqF3EperPGGqpBhhUhUBlex/QiimxNdxp8XUDTlV7nE+
# 58RMI+eNS2KVyWgcaWEGgt2QPKPZRkJXhS0z7R5a5O1mOWvRprloAm1vGr7O4EJe
# miyjnvTt9CZ/dcWyy773lHXlBmOWah4XMcY49yZr0YcYYObuXMbZHY1ZJIYC7aTC
# 2Oy+eQWH811RkGjQdMBz09bFMJoaJCuehFD9OjfeTh++d1JSLryErC2DFzRum7m5
# 7lGEs+ZbW8NRV0C2pqpD8Pf8QnBN6PVy+nCAwGQj8K7Q4UeEjXQ9fPQ4VKcSk0GF
# 0g+pFozCkz7Uy4AKWgFvw1PLcFu1CilXdkVHx+nLmQNCpBvmoYIXmDCCF5QGCisG
# AQQBgjcDAwExgheEMIIXgAYJKoZIhvcNAQcCoIIXcTCCF20CAQMxDzANBglghkgB
# ZQMEAgIFADCBiAYLKoZIhvcNAQkQAQSgeQR3MHUCAQEGCWCGSAGG/WwHATBBMA0G
# CWCGSAFlAwQCAgUABDADHlah0agXn0K/MdGYIKPHaH4EtWyLKSoS7V3mCDx+CBkX
# TqZnT3adMsaPMfyhQ88CEQDdMQp1Ds/gmMI557nDWPSTGA8yMDI2MDMyNTE4MTUw
# MlqgghM6MIIG7TCCBNWgAwIBAgIQDCBDSfnQ91n7mC3kCBuIezANBgkqhkiG9w0B
# AQwFADBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/
# BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYg
# U0hBMjU2IDIwMjUgQ0ExMB4XDTI1MDYwNDAwMDAwMFoXDTM2MDkwMzIzNTk1OVow
# YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD
# EzJEaWdpQ2VydCBTSEEzODQgUlNBNDA5NiBUaW1lc3RhbXAgUmVzcG9uZGVyIDIw
# MjUgMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANs5UvuLdLflyQ1R
# 2PrzScab+/eLDNzuFEMnJikV5mC7PmEX87cpfECe5/1KsTUylpo3RQ1hr+N/mtqI
# ieNcsTntLC6BcfBdWs9iUU2XO3YQMW53vm8neW39khGZQq7hscVkqm6VGOnQBkQg
# sgTmohWqF4ZJ/i9eXn3KJg0q05wOVYHfabzDvu2zPrUluCcwIiGztpiD8ghHSmLH
# Jj5fmAbnp0j+zScPYnC9bVqZ+tbjOlslDb+EXMgQM/jbyWzX+ZEzOxeOnLwcKdJW
# WIrGUffOcubGI+HuMlAWzwccq0+WjTGfvubYrPBg5hwqaslS0OHix8KYpuYsEePU
# 0RHxE7ZRBTkVk5CdoTjtc81QFrOo7XXqddlbRWaEDoSMHVHzx0rAMN/cRVXrxRBX
# 9rvg1a9bDleyQAmPsXBvIViHqjxlVMJIsgUVE4AOx3gMSW9IkJeBgwQumQQOMBjf
# 2oTMReH7ibDrNc8JDwUp15h5JtfB8B4CDypNvO3TCHIWco5u8xnAmGeG4rKFGFi/
# aE4GvSQnxTE3PcpdulwwdM5fa3UsL4jpmmEpWkWpxfOKMQGJ6oAcumfPcpD4Fp2+
# 0kYt9Tcj9+fVoaJPt+n5MsUz40qwlrzCu6c20YPLXyEZVJ8ZexuWyK5D6jGw/cya
# Ae/TBxYC6+ZY1O663C8MvnBH6cxTAgMBAAGjggGVMIIBkTAMBgNVHRMBAf8EAjAA
# MB0GA1UdDgQWBBRVnrnnZ8iREEm0NlKNebckxT8t+DAfBgNVHSMEGDAWgBTvb1NK
# 6eQGfHrK4pBW9i/USezLTjAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/BAwwCgYI
# KwYBBQUHAwgwgZUGCCsGAQUFBwEBBIGIMIGFMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wXQYIKwYBBQUHMAKGUWh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZT
# SEEyNTYyMDI1Q0ExLmNydDBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vY3JsMy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRUaW1lU3RhbXBpbmdSU0E0MDk2
# U0hBMjU2MjAyNUNBMS5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9
# bAcBMA0GCSqGSIb3DQEBDAUAA4ICAQAbfgskh9gJasVB51Fp2SSO66XQKqND3IpM
# lePC7ZOUFhYMaRz/VrY0d5bJBADpN07M5rjcjIne1bsR5UCZeCnHU6+XENmC8vpe
# etKXgYDO5AOBwiahqnUHc418q5YN2AnX547PcP+wTvMVJpQGqvw/j02WTvjJ8Wt/
# yKMmLBfi/YFl+FScWS5Y1bOSSpqUqJ58rDGL+wmqpEKQQ5iVlNhevJiy2V31NMF2
# w8vUEE7JIHB74skA3gdZeo5f1sDkIkjUzWn2EFEdmbCeazybtTT8ztYbSsHYlI1n
# px8KuQUStQUe/g/k8Bve1B1+FdFvibxWafM93dxubAOz7fajuf+gFmftMn/JzefA
# /hwAEoR5p8tubelu6helUkWQiKRq/IWwI32wYTuDGPBtlPc8FSqekpY7ipJ8Xdm7
# ooTt93YqAhrAera1/vsUCn+EJWEoIBbw/WVkhuMrCT2DsfoW7AUxDjRba/fcejoC
# Z58lZA6LnSJ/oJlfgavmthvvgS1OQFzlXJRMabqFEF1GRead7FK3dtUIxfUWtMeE
# Q9NoEuF8IMzfrb7mPrY4TyAsF5h9xES/nzyKMWU9F4MFT/te1KlG4uWaXuGHWnRu
# Vowkwb7ZpTOCVaLxmEb8gMn5mCScdP9E/qitOcESaYOKvNbzirgkD2hPR/fSQlb3
# wgwZuCo6xDCCBrQwggScoAMCAQICEA3HrFcF/yGZLkBDIgw6SYYwDQYJKoZIhvcN
# AQELBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcG
# A1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3Rl
# ZCBSb290IEc0MB4XDTI1MDUwNzAwMDAwMFoXDTM4MDExNDIzNTk1OVowaTELMAkG
# A1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdp
# Q2VydCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1
# IENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALR4MdMKmEFyvjxG
# wBysddujRmh0tFEXnU2tjQ2UtZmWgyxU7UNqEY81FzJsQqr5G7A6c+Gh/qm8Xi4a
# PCOo2N8S9SLrC6Kbltqn7SWCWgzbNfiR+2fkHUiljNOqnIVD/gG3SYDEAd4dg2dD
# GpeZGKe+42DFUF0mR/vtLa4+gKPsYfwEu7EEbkC9+0F2w4QJLVSTEG8yAR2CQWIM
# 1iI5PHg62IVwxKSpO0XaF9DPfNBKS7Zazch8NF5vp7eaZ2CVNxpqumzTCNSOxm+S
# AWSuIr21Qomb+zzQWKhxKTVVgtmUPAW35xUUFREmDrMxSNlr/NsJyUXzdtFUUt4a
# S4CEeIY8y9IaaGBpPNXKFifinT7zL2gdFpBP9qh8SdLnEut/GcalNeJQ55IuwnKC
# gs+nrpuQNfVmUB5KlCX3ZA4x5HHKS+rqBvKWxdCyQEEGcbLe1b8Aw4wJkhU1JrPs
# FfxW1gaou30yZ46t4Y9F20HHfIY4/6vHespYMQmUiote8ladjS/nJ0+k6Mvqzfpz
# PDOy5y6gqztiT96Fv/9bH7mQyogxG9QEPHrPV6/7umw052AkyiLA6tQbZl1KhBtT
# asySkuJDpsZGKdlsjg4u70EwgWbVRSX1Wd4+zoFpp4Ra+MlKM2baoD6x0VR4RjSp
# WM8o5a6D8bpfm4CLKczsG7ZrIGNTAgMBAAGjggFdMIIBWTASBgNVHRMBAf8ECDAG
# AQH/AgEAMB0GA1UdDgQWBBTvb1NK6eQGfHrK4pBW9i/USezLTjAfBgNVHSMEGDAW
# gBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAww
# CgYIKwYBBQUHAwgwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhhodHRwOi8v
# b2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNlcnRzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1UdHwQ8MDow
# OKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRS
# b290RzQuY3JsMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATANBgkq
# hkiG9w0BAQsFAAOCAgEAF877FoAc/gc9EXZxML2+C8i1NKZ/zdCHxYgaMH9Pw5tc
# BnPw6O6FTGNpoV2V4wzSUGvI9NAzaoQk97frPBtIj+ZLzdp+yXdhOP4hCFATuNT+
# ReOPK0mCefSG+tXqGpYZ3essBS3q8nL2UwM+NMvEuBd/2vmdYxDCvwzJv2sRUoKE
# fJ+nN57mQfQXwcAEGCvRR2qKtntujB71WPYAgwPyWLKu6RnaID/B0ba2H3LUiwDR
# AXx1Neq9ydOal95CHfmTnM4I+ZI2rVQfjXQA1WSjjf4J2a7jLzWGNqNX+DF0SQzH
# U0pTi4dBwp9nEC8EAqoxW6q17r0z0noDjs6+BFo+z7bKSBwZXTRNivYuve3L2oiK
# NqetRHdqfMTCW/NmKLJ9M+MtucVGyOxiDf06VXxyKkOirv6o02OoXN4bFzK0vlNM
# svhlqgF2puE6FndlENSmE+9JGYxOGLS/D284NHNboDGcmWXfwXRy4kbu4QFhOm0x
# JuF2EZAOk5eCkhSxZON3rGlHqhpB/8MluDezooIs8CVnrpHMiD2wL40mm53+/j7t
# FaxYKIqL0Q4ssd8xHZnIn/7GELH3IdvG2XlM9q7WP/UwgOkw/HQtyRN62JK4S1C8
# uw3PdBunvAZapsiI5YKdvlarEvf8EA+8hcpSM9LHJmyrxaFtoza2zNaQ9k+5t1ww
# ggWNMIIEdaADAgECAhAOmxiO+dAt5+/bUOIIQBhaMA0GCSqGSIb3DQEBDAUAMGUx
# CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3
# dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9v
# dCBDQTAeFw0yMjA4MDEwMDAwMDBaFw0zMTExMDkyMzU5NTlaMGIxCzAJBgNVBAYT
# AlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2Vy
# dC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJ
# KoZIhvcNAQEBBQADggIPADCCAgoCggIBAL/mkHNo3rvkXUo8MCIwaTPswqclLskh
# PfKK2FnC4SmnPVirdprNrnsbhA3EMB/zG6Q4FutWxpdtHauyefLKEdLkX9YFPFIP
# Uh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZanMylNEQRBAu34LzB4TmdDttceItDBvu
# INXJIB1jKS3O7F5OyJP4IWGbNOsFxl7sWxq868nPzaw0QF+xembud8hIqGZXV59U
# WI4MK7dPpzDZVu7Ke13jrclPXuU15zHL2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4
# AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfbBHMqbpEBfCFM1LyuGwN1XXhm2ToxRJoz
# QL8I11pJpMLmqaBn3aQnvKFPObURWBf3JFxGj2T3wWmIdph2PVldQnaHiZdpekjw
# 4KISG2aadMreSx7nDmOu5tTvkpI6nj3cAORFJYm2mkQZK37AlLTSYW3rM9nF30sE
# AMx9HJXDj/chsrIRt7t/8tWMcCxBYKqxYxhElRp2Yn72gLD76GSmM9GJB+G9t+ZD
# pBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0viastkF13nqsX40/ybzTQRESW+UQUOsx
# xcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aLT8LWRV+dIPyhHsXAj6KxfgommfXkaS+Y
# HS312amyHeUbAgMBAAGjggE6MIIBNjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
# BBTs1+OC0nFdZEzfLmc/57qYrhwPTzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
# pyGd823IDzAOBgNVHQ8BAf8EBAMCAYYweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUF
# BzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6
# Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5j
# cnQwRQYDVR0fBD4wPDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp
# Z2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDARBgNVHSAECjAIMAYGBFUdIAAwDQYJ
# KoZIhvcNAQEMBQADggEBAHCgv0NcVec4X6CjdBs9thbX979XB72arKGHLOyFXqka
# uyL4hxppVCLtpIh3bb0aFPQTSnovLbc47/T/gLn4offyct4kvFIDyE7QKt76LVbP
# +fT3rDB6mouyXtTP0UNEm0Mh65ZyoUi0mcudT6cGAxN3J0TU53/oWajwvy8Lpuny
# NDzs9wPHh6jSTEAZNUZqaVSwuKFWjuyk1T3osdz9HNj0d1pcVIxv76FQPfx2CWiE
# n2/K2yCNNWAcAgPLILCsWKAOQGPFmCLBsln1VWvPJ6tsds5vIy30fnFqI2si/xK4
# VC0nftg62fC2h5b9W9FcrBjDTZ9ztwGpn1eqXijiuZQxggOMMIIDiAIBATB9MGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYg
# MjAyNSBDQTECEAwgQ0n50PdZ+5gt5AgbiHswDQYJYIZIAWUDBAICBQCggeEwGgYJ
# KoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjAzMjUx
# ODE1MDJaMCsGCyqGSIb3DQEJEAIMMRwwGjAYMBYEFHK8/aAQf0k0sAccYQ/m15ZQ
# AJh3MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEIDLz47G9oteybU8dG4zdvY+LhHah
# eJ7WEs08qnqe/zXCMD8GCSqGSIb3DQEJBDEyBDAbDrJ8D4AIHXYuK3WHRw+/+639
# wSG84Dz4veadyvyrqT0UsnktNB4KuxwjVEcSq6owDQYJKoZIhvcNAQEBBQAEggIA
# Eg/xQ+ot5PiU8p9Md1lLGAMPuUTfqmZh7jdN628ZRt5LkbjFWIZJ++BDDPSYDPgi
# UXyOp7KwTaxD+fnwnfLaBuptKLOrNyutmYO/0BLKlCB/dhm56M57rHw+jsi3GDai
# DarPP+Rx41dH1KR6k6UHZY8YmeFWoKl2ReWo5DnE6gJiCKl6oacp1xHP2TfIFfHy
# fOn/onc7WSlaXEljHL/H/vrsDITyhkOD06TuV/2I6pyghfqtcsEM5JYvlc4qhAzv
# FMnhnbIYDmNJ/XR4sEJUF1yyjGVfVYnP5aynf3pvNmZId+FKRC+Cc1dVgYs5ygfy
# lUGcTTDhdOsyFwrs+RkQaBlJXZtG/Bcw9HDCY+HGVuYIkAGQled/EsKI7pxPHq60
# 43VpRff63phBAs7tF+ELJSMf65UfYrXd7dTVxbknLUTP+nPioSn4OVrC88R1Obs4
# ZY2T4SavTPyeuDF3JgIkS3giGQdKjcJyfVgI9orKIPCN/hkFpLB64L6emMUhixpU
# kqfKpcjsdGa3FPmJWRItqAtEpN7mJNjAqHoisWLBTyNq2JfW6OhLnDPoL39aWTbt
# y900igUPP084zY5nHoMZrSsidpgPNh95mFqOKahMAr2JerzkBefNCIaX9UeoMu7W
# L+29cJ/IOEkjk37PhxobJ0KriPo1yqMWQfgD7owC3H4=
# SIG # End signature block