AzStackHciNetwork/AzStackHciNetwork.psm1

<#############################################################
 # #
 # Copyright (C) Microsoft Corporation. All rights reserved. #
 # #
 #############################################################>

 $MetaData = @{
    "OperationType" =  @("Deployment", "AddNode", "Upgrade", "PreUpdate")
    "UIName" = 'Azure Stack HCI Network'
    "UIDescription" = 'Check network requirements'
}
function Test-AzStackHciNetwork
{
    param (
        [parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        $Parameters,

        [parameter(Mandatory = $true)]
        [ValidateSet('AddNode','Deployment','Upgrade', 'PreUpdate')]
        $OperationType,

        [parameter(Mandatory = $false)]
        [ValidateSet('Small','Medium','Large')]
        [String]
        $HardwareClass = "Medium",

        [parameter(Mandatory = $false)]
        [ValidateSet('Standard','Stretch','RackAware')]
        [String]
        $ClusterPattern = "Standard",

        [parameter(Mandatory = $false)]
        [switch]
        $FailFast
    )
    try
    {
        # Import Module via Helper in case this is update
        [EnvironmentValidator]::EnvironmentValidatorImport($Parameters)
        $ENV:EnvChkrOp = $OperationType
        if (Get-Command -Name IsDHCPEnabled -ErrorAction SilentlyContinue)
        {
            $dhcpEnabled = IsDHCPEnabled -Parameters $Parameters
        }
        else
        {
            $dhcpEnabled = $false
        }

        Trace-Execution "DHCP Enabled (ECE): $dhcpEnabled"

        $networkRole = $Parameters.Roles["Network"].PublicConfiguration
        $mgmtNetValue = $networkRole.NetworkDefinitions.Node.Networks.Network | Where-Object { $_.Name -eq "Management"}
        $mgmtSubnetValue =  $mgmtNetValue.IPv4.Subnet

        $hostNetworkRole = $Parameters.Roles["HostNetwork"].PublicConfiguration
        $atcHostNetworkConfiguration = $hostNetworkRole.PublicInfo.ATCHostNetwork.Configuration | ConvertFrom-JSON

        $physicalMachinesPublicConfig = $Parameters.Roles["BareMetal"].PublicConfiguration
        $nodesCount = $physicalMachinesPublicConfig.Nodes.Node.Count

        [PSObject[]] $allIntentInfoForTesting = @()

        switch ($OperationType)
        {
            { $_ -in @("AddNode", "Upgrade", "PreUpdate") }
            {
                $allIntentInfoForTesting = CreateAtcHostIntentsInfoFromSystem
            }
            default
            {
                $allIntentInfoForTesting = $atcHostNetworkConfiguration.Intents

                if (($null -eq $allIntentInfoForTesting) -or ($allIntentInfoForTesting.Count -eq 0))
                {
                    # If no intents are provided in these scenarios, we will try to get info from the running system.
                    $allIntentInfoForTesting = CreateAtcHostIntentsInfoFromSystem
                }
            }
        }

        # At this point, we should have the valid intent info from ECE or the running system.
        if ($allIntentInfoForTesting.Count -eq 0)
        {
            throw "No ATC Host Intents found. Please provide ATC Host Intents in the configuration."
        }

        [PSObject[]] $storageNetworkDefinition = $atcHostNetworkConfiguration.storageNetworks

        [System.Collections.Hashtable] $storageNetworksVlanIdInfo = @{}
        foreach ($storagenetworkInfo in $storageNetworkDefinition)
        {
            $storageNetworksVlanIdInfo.Add($storagenetworkInfo.networkAdapterName, $storagenetworkInfo.VlanId)
        }

        Trace-Execution "Starting network validation for $($OperationType), detail output can be found in $($env:LocalRootFolderPath)\MASLogs\AzStackHciEnvironmentChecker*"

        $IpPools = New-Object System.Collections.ArrayList

        $ipPool = [PSCustomObject]@{
            StartingAddress = $mgmtNetValue.IPv4.StartAddress # Infra IP Pool Starting Address
            EndingAddress   = $mgmtNetValue.IPv4.EndAddress # Infra IP Pool Ending Address
        }

        $IpPools.Add($ipPool) | Out-Null

        $AdditionalInfrastructureSubnetsValue = $null
        if ($hostNetworkRole.PublicInfo.AdditionalInternalSubnets)
        {
            try
            {
                $AdditionalInfrastructureSubnetsText = $hostNetworkRole.PublicInfo.AdditionalInternalSubnets.configuration
                $AdditionalInfrastructureSubnetsValue = ConvertFrom-JSON $AdditionalInfrastructureSubnetsText -ErrorAction Stop
            }
            catch
            {
                # In case of upgrade, the parameter won't have any value in it but just a string "[AdditionalInternalSubnets]""
                Trace-Execution "Failed to parse AdditionalInfrastructureSubnets.Configuration. $_. Ignore error and continue."
            }
        }

        if ($AdditionalInfrastructureSubnetsValue)
        {
            foreach ($pool in $AdditionalInfrastructureSubnetsValue)
            {
                $ipPool = [PSCustomObject]@{
                    StartingAddress = $pool.StartingAddress # Infra IP Pool Starting Address
                    EndingAddress   = $pool.EndingAddress # Infra IP Pool Ending Address
                }

                $IpPools.Add($ipPool) | Out-Null
            }
        }

        Trace-Execution "Trying to get IP pools information"

        foreach ($ipPool in $ipPools)
        {
            $startingAddress = $ipPool.StartingAddress
            $endingAddress = $ipPool.EndingAddress
            Trace-Execution "Found pool with StartingAddress: $startingAddress EndingAddress: $endingAddress"
        }

        Trace-Execution "Starting $($OperationType) Network Validation"

        switch ($OperationType)
        {
            { $_ -in @("Deployment", "Upgrade", "PreUpdate") }
            {
                # Network Valdiation Checks
                [System.Boolean] $isProxyEnabled= $false
                $proxySettings = Get-ASProxySettings -Parameters $Parameters
                $isProxyEnabled = $proxySettings -and ($proxySettings.HTTP -or $proxySettings.HTTPS)

                $psSession = [EnvironmentValidator]::NewPsSessionAllHosts($Parameters)

                $ConnectionCredential = [EnvironmentValidator]::GetDomainAdminCredential($Parameters)
                $allStampNodes = [EnvironmentValidator]::GetAllHostNicIps($Parameters)
                $testNode = $allStampNodes[-1]

                if (Test-WSMan -ComputerName $testNode -Credential $ConnectionCredential -Authentication Default -ErrorAction SilentlyContinue)
                {
                    Trace-Execution "Attempting PsSession $testNode with domain credentials"
                }
                else
                {
                    Trace-Execution "Attempting PsSession $testNode with local credentials"
                    $ConnectionCredential = [EnvironmentValidator]::GetLocalAdminCredential($Parameters)
                    if ($null -eq $ConnectionCredential)
                    {
                        throw "Unable to create a valid session to $testNode. No local admin credential found."
                    }
                }

                $param = @{
                    IpPools = $IpPools
                    ManagementSubnetValue = $mgmtSubnetValue
                    HostNetworkInfo = $atcHostNetworkConfiguration
                    ATCHostIntents = $allIntentInfoForTesting
                    ProxyEnabled = $isProxyEnabled
                    PSSession = $psSession
                    PassThru = $true
                    dhcpEnabled = $dhcpEnabled
                    OutputPath = "$($env:LocalRootFolderPath)\MASLogs\"
                    OperationType = $OperationType
                    HardwareClass = $HardwareClass
                    ClusterPattern = $ClusterPattern
                    NodesInCluster = $nodesCount
                }

                $RegistrationCloudName = $Parameters.Roles["Cloud"].PublicConfiguration.PublicInfo.RegistrationCloudName
                if ($RegistrationCloudName -ieq 'Azure.local')
                {
                    $param += @{
                        RegionName = 'AzureLocal'
                    }
                }

                [array]$Result = AzStackHci.EnvironmentChecker\Invoke-AzStackHciNetworkValidation @param

                # If this is a CI environment downgrade inbox driver test result
                if (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\SQMClient -Name IsCIEnv -ErrorAction SilentlyContinue)
                {
                    Trace-Execution "CI Environment. Downgrade inbox driver result severity from CRITICAL to WARNING"
                    $Result | Where-Object Name -eq 'AzStackHci_Network_Test_AdapterDriver' | Where-Object { if ($_.Severity -eq "CRITICAL") { $_.Severity = "WARNING" } }

                    if (($ClusterPattern -eq 'RackAware') -and ((Get-WmiObject -Class Win32_ComputerSystem).Model -eq "Virtual Machine"))
                    {
                        Trace-Execution "CI Virtual RackAware Environment. Downgrade network intent result severity from CRITICAL to WARNING"
                        $Result | Where-Object Name -eq 'AzStackHci_Network_Test_NetworkIntentRequirement' | Where-Object { if ($_.Severity -eq "CRITICAL") { $_.Severity = "WARNING" } }
                    }
                }

                return [EnvironmentValidator]::ParseResult($Result, 'Network', $FailFast)
            }
            "AddNode"
            {
                $AddNodeNode = [EnvironmentValidator]::GetNodeContext($Parameters) | Select-Object -first 1
                $psSession =  [EnvironmentValidator]::NewPsSessionByHost($Parameters, $AddNodeNode, $false)
                # nodeToIPMap can be retrieved straight from Get-NetworkMgmtIPv4FromECEForAllHosts from NetworkHelpers.psm1
                $nodeToIPMap = Get-NetworkMgmtIPv4FromECEForAllHosts -Parameters $Parameters
                # Add the node to the map if it's not already there
                # so we can run prior to node being added to orchestrator
                if ($AddNodeNode -notin $nodeToIPMap.Keys)
                {
                    $runtimeParameters = $Parameters.RunInformation['RuntimeParameter']
                    # IpAddress is not a runtime parameter during repairnode
                    # get from network helper instead
                    if ($dhcpEnabled -or ([string]::IsNullOrEmpty($runtimeParameters['IpAddress'])))
                    {
                        $Ipv4OrHostName = ([EnvironmentValidator]::GetHostNicIpByName($Parameters,$runtimeParameters['NodeName']) | Select-Object -First 1)
                    }
                    else
                    {
                        $Ipv4OrHostName = $runtimeParameters['IpAddress']
                    }
                    $nodeToIPMap.Add($AddNodeNode, $Ipv4OrHostName)
                }

                # Check to see if BrownfieldUpgrade or GreenfieldDeployment
                $InstallationMethod = Get-InstallationMethod -Parameters $Parameters

                $param = @{
                    IpPools = $IpPools
                    ManagementSubnetValue = $mgmtSubnetValue
                    PSSession = $psSession
                    ATCHostIntents = $allIntentInfoForTesting
                    NodeToManagementIPMap = $nodeToIPMap
                    PassThru = $true
                    dhcpEnabled = $dhcpEnabled
                    OutputPath = "$($env:LocalRootFolderPath)\MASLogs\"
                    OperationType = $OperationType
                    HardwareClass = $HardwareClass
                    ClusterPattern = $ClusterPattern
                    InstallationMethod = $InstallationMethod
                    NodesInCluster = $nodesCount
                }

                $RegistrationCloudName = $Parameters.Roles["Cloud"].PublicConfiguration.PublicInfo.RegistrationCloudName
                if ($RegistrationCloudName -ieq 'Azure.local')
                {
                    $param += @{
                        RegionName = 'AzureLocal'
                    }
                }

                [array]$Result = AzStackHci.EnvironmentChecker\Invoke-AzStackHciNetworkValidation @param

                # If this is a CI environment downgrade inbox driver test result
                if (Get-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\SQMClient -Name IsCIEnv -ErrorAction SilentlyContinue)
                {
                    Trace-Execution "CI Environment. Downgrade inbox driver result severity from CRITICAL to WARNING"
                    $Result | Where-Object Name -eq 'AzStackHci_Network_Test_AdapterDriver' | Where-Object { if ($_.Severity -eq "CRITICAL") { $_.Severity = "WARNING" } }
                }

                return ([EnvironmentValidator]::ParseResult($Result, 'Network', $FailFast))
            }
            default
            {
                Trace-Execution "No interface found for $OperationType"
            }
        }
    }
    catch
    {
        Trace-Execution "Validator failed. $_"
        Trace-Execution "$($_.ScriptStackTrace)"
        throw $_
    }
    finally
    {
        $PsSession | Microsoft.PowerShell.Core\Remove-PSSession -ErrorAction SilentlyContinue
    }
}

function CreateAtcHostIntentsInfoFromSystem
{
    [PSObject[]] $atcHostIntents = Get-NetIntent
    [PSObject[]] $allIntentInfo = @()

    foreach ($intent in $atcHostIntents)
    {
        [PSObject] $currentIntentInfo = New-Object PSObject
        $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "Name" -Value $intent.IntentName

        [String[]] $currentIntentType = @()
        if ($intent.IsManagementIntentSet)
        {
            $currentIntentType += "Management"
        }
        if ($intent.IsStorageIntentSet)
        {
            $currentIntentType += "Storage"
        }
        if ($intent.IsComputeIntentSet)
        {
            $currentIntentType += "Compute"
        }
        $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "TrafficType" -Value $currentIntentType
        $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "Adapter" -Value $intent.NetAdapterNamesAsList

        # Check if the intent has any overrides, note that we only convert the overrides that we supported right now
        if (($null -ne $intent.AdapterAdvancedParametersOverride.NetworkDirect) -or ($null -ne $intent.AdapterAdvancedParametersOverride.JumboPacket))
        {
            [PSObject] $tempAdapterOverride = New-Object PSObject

            if ($null -ne $intent.AdapterAdvancedParametersOverride.JumboPacket)
            {
                $tempAdapterOverride | Add-Member -MemberType NoteProperty -Name "JumboPacket" -Value $intent.AdapterAdvancedParametersOverride.JumboPacket
            }
            else
            {
                $tempAdapterOverride | Add-Member -MemberType NoteProperty -Name "JumboPacket" -Value $null
            }

            if ($null -ne $intent.AdapterAdvancedParametersOverride.NetworkDirect)
            {

                $tempAdapterOverride | Add-Member -MemberType NoteProperty -Name "NetworkDirect" -Value $intent.AdapterAdvancedParametersOverride.NetworkDirect
            }
            else
            {
                $tempAdapterOverride | Add-Member -MemberType NoteProperty -Name "NetworkDirect" -Value $null
            }

            if ($null -ne $intent.AdapterAdvancedParametersOverride.NetworkDirectTechnology)
            {
                $tempAdapterOverride | Add-Member -MemberType NoteProperty -Name "NetworkDirectTechnology" -Value $intent.AdapterAdvancedParametersOverride.NetworkDirectTechnology
            }
            else
            {
                $tempAdapterOverride | Add-Member -MemberType NoteProperty -Name "NetworkDirectTechnology" -Value $null
            }

            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "AdapterPropertyOverrides" -Value $tempAdapterOverride
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "OverrideAdapterProperty" -Value $true
        }
        else
        {
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "AdapterPropertyOverrides" -Value $null
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "OverrideAdapterProperty" -Value $false
        }

        if (($null -ne $intent.QosPolicyOverride.PriorityValue8021Action_SMB) -or ($null -ne $intent.QosPolicyOverride.PriorityValue8021Action_Cluster) -or ($null -ne $intent.QosPolicyOverride.BandwidthPercentage_SMB))
        {
            [PSObject] $tempQosOverride = New-Object PSObject

            if ($null -ne $intent.QosPolicyOverride.PriorityValue8021Action_SMB)
            {
                $tempQosOverride | Add-Member -MemberType NoteProperty -Name "PriorityValue8021Action_SMB" -Value $intent.QosPolicyOverride.PriorityValue8021Action_SMB
            }
            else
            {
                $tempQosOverride | Add-Member -MemberType NoteProperty -Name "PriorityValue8021Action_SMB" -Value $null
            }

            if ($null -ne $intent.QosPolicyOverride.PriorityValue8021Action_Cluster)
            {
                $tempQosOverride | Add-Member -MemberType NoteProperty -Name "PriorityValue8021Action_Cluster" -Value $intent.QosPolicyOverride.PriorityValue8021Action_Cluster
            }
            else
            {
                $tempQosOverride | Add-Member -MemberType NoteProperty -Name "PriorityValue8021Action_Cluster" -Value $null
            }

            if ($null -ne $intent.QosPolicyOverride.BandwidthPercentage_SMB)
            {
                $tempQosOverride | Add-Member -MemberType NoteProperty -Name "BandwidthPercentage_SMB" -Value $intent.QosPolicyOverride.BandwidthPercentage_SMB
            }
            else
            {
                $tempQosOverride | Add-Member -MemberType NoteProperty -Name "BandwidthPercentage_SMB" -Value $null
            }

            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "QoSPolicyOverrides" -Value $tempQosOverride
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "OverrideQoSPolicy" -Value $true
        }
        else
        {
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "QoSPolicyOverrides" -Value $null
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "OverrideQoSPolicy" -Value $false
        }

        if (($null -ne $intent.SwitchConfigOverride.EnableIov) -or ($null -ne $intent.SwitchConfigOverride.LoadBalancingAlgorithm))
        {
            [PSObject] $tempVMSwitchOverride = New-Object PSObject

            if ($null -ne $intent.SwitchConfigOverride.EnableIov)
            {
                $tempVMSwitchOverride | Add-Member -MemberType NoteProperty -Name "EnableIov" -Value $intent.SwitchConfigOverride.EnableIov
            }
            else
            {
                $tempVMSwitchOverride | Add-Member -MemberType NoteProperty -Name "EnableIov" -Value $null
            }

            if ($null -ne $intent.SwitchConfigOverride.LoadBalancingAlgorithm)
            {
                $tempVMSwitchOverride | Add-Member -MemberType NoteProperty -Name "LoadBalancingAlgorithm" -Value $intent.SwitchConfigOverride.LoadBalancingAlgorithm
            }
            else
            {
                $tempVMSwitchOverride | Add-Member -MemberType NoteProperty -Name "LoadBalancingAlgorithm" -Value $null
            }

            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "VirtualSwitchConfigurationOverrides" -Value $tempVMSwitchOverride
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "OverrideVirtualSwitchConfiguration" -Value $true
        }
        else
        {
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "VirtualSwitchConfigurationOverrides" -Value $null
            $currentIntentInfo | Add-Member -MemberType NoteProperty -Name "OverrideVirtualSwitchConfiguration" -Value $false
        }

        $allIntentInfo += $currentIntentInfo
    }

    return $allIntentInfo
}

Export-ModuleMember -Function Test-AzStackHciNetwork -Variable MetaData
# SIG # Begin signature block
# MIIoUgYJKoZIhvcNAQcCoIIoQzCCKD8CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCV8vhj5PCmL8X5
# UWe7UfsbKIeFI/pgAt1Ft0uNuzHFh6CCDYUwggYDMIID66ADAgECAhMzAAAEA73V
# lV0POxitAAAAAAQDMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p
# bmcgUENBIDIwMTEwHhcNMjQwOTEyMjAxMTEzWhcNMjUwOTExMjAxMTEzWjB0MQsw
# CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u
# ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQCfdGddwIOnbRYUyg03O3iz19XXZPmuhEmW/5uyEN+8mgxl+HJGeLGBR8YButGV
# LVK38RxcVcPYyFGQXcKcxgih4w4y4zJi3GvawLYHlsNExQwz+v0jgY/aejBS2EJY
# oUhLVE+UzRihV8ooxoftsmKLb2xb7BoFS6UAo3Zz4afnOdqI7FGoi7g4vx/0MIdi
# kwTn5N56TdIv3mwfkZCFmrsKpN0zR8HD8WYsvH3xKkG7u/xdqmhPPqMmnI2jOFw/
# /n2aL8W7i1Pasja8PnRXH/QaVH0M1nanL+LI9TsMb/enWfXOW65Gne5cqMN9Uofv
# ENtdwwEmJ3bZrcI9u4LZAkujAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE
# AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQU6m4qAkpz4641iK2irF8eWsSBcBkw
# VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh
# dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzUwMjkyNjAfBgNVHSMEGDAW
# gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw
# MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx
# XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB
# AFFo/6E4LX51IqFuoKvUsi80QytGI5ASQ9zsPpBa0z78hutiJd6w154JkcIx/f7r
# EBK4NhD4DIFNfRiVdI7EacEs7OAS6QHF7Nt+eFRNOTtgHb9PExRy4EI/jnMwzQJV
# NokTxu2WgHr/fBsWs6G9AcIgvHjWNN3qRSrhsgEdqHc0bRDUf8UILAdEZOMBvKLC
# rmf+kJPEvPldgK7hFO/L9kmcVe67BnKejDKO73Sa56AJOhM7CkeATrJFxO9GLXos
# oKvrwBvynxAg18W+pagTAkJefzneuWSmniTurPCUE2JnvW7DalvONDOtG01sIVAB
# +ahO2wcUPa2Zm9AiDVBWTMz9XUoKMcvngi2oqbsDLhbK+pYrRUgRpNt0y1sxZsXO
# raGRF8lM2cWvtEkV5UL+TQM1ppv5unDHkW8JS+QnfPbB8dZVRyRmMQ4aY/tx5x5+
# sX6semJ//FbiclSMxSI+zINu1jYerdUwuCi+P6p7SmQmClhDM+6Q+btE2FtpsU0W
# +r6RdYFf/P+nK6j2otl9Nvr3tWLu+WXmz8MGM+18ynJ+lYbSmFWcAj7SYziAfT0s
# IwlQRFkyC71tsIZUhBHtxPliGUu362lIO0Lpe0DOrg8lspnEWOkHnCT5JEnWCbzu
# iVt8RX1IV07uIveNZuOBWLVCzWJjEGa+HhaEtavjy6i7MIIHejCCBWKgAwIBAgIK
# YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw
# OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE
# BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD
# VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la
# UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc
# 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D
# dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+
# lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk
# kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6
# A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd
# X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL
# 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd
# sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3
# T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS
# 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI
# bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL
# BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD
# uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv
# c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3
# dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf
# MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h
# cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA
# YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn
# 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7
# v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b
# pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/
# KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy
# CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp
# mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi
# hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb
# BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS
# oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL
# gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX
# cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCGiMwghofAgEBMIGVMH4x
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt
# b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p
# Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAQDvdWVXQ87GK0AAAAA
# BAMwDQYJYIZIAWUDBAIBBQCgga4wGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw
# HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILi9
# cX/mcSsVvUs89emfHWIw3L2cOkhBPvaUWu463SaZMEIGCisGAQQBgjcCAQwxNDAy
# oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEagBhodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20wDQYJKoZIhvcNAQEBBQAEggEAK+498GAJF7XOoFBsnCJ3BEvHsfWiDm9bTWRS
# 67gik82JHilisrC9vCcJTSfpY81CC01ZuMI88zAhm3zHOOTqCkeB7kHerleqSKFm
# kjUZGHJ1ZuzZlKMi3NVdKx7qb9cdyyspObeQVuLLu28JWRzunvpEXomAqPcIpKwc
# ojbOqvmQJkJXf1pj3Qu/tYyv5tleTOeOS64aFvmICAgrYq/ATZDF+qAY+tZp8ts8
# j71e4OoC3FR+flH711PJOeBsoNMjiyLHob9n+2HgSgqoyph86HiZUgQMRuzm2evE
# 5YSey0rWrjSt85uXIbsy3kuIRGMXBSSd1caSaflYliv5I3cDMaGCF60wghepBgor
# BgEEAYI3AwMBMYIXmTCCF5UGCSqGSIb3DQEHAqCCF4YwgheCAgEDMQ8wDQYJYIZI
# AWUDBAIBBQAwggFaBgsqhkiG9w0BCRABBKCCAUkEggFFMIIBQQIBAQYKKwYBBAGE
# WQoDATAxMA0GCWCGSAFlAwQCAQUABCBl3+1GvnfYCw7+cdGTrqUK4KzIODLFwghA
# XERyjGH4UQIGaC3IotDeGBMyMDI1MDYxMDE1NDgzMS45MjRaMASAAgH0oIHZpIHW
# MIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL
# EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsT
# Hm5TaGllbGQgVFNTIEVTTjozNjA1LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9z
# b2Z0IFRpbWUtU3RhbXAgU2VydmljZaCCEfswggcoMIIFEKADAgECAhMzAAAB91gg
# dQTK+8L0AAEAAAH3MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYD
# VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy
# b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w
# IFBDQSAyMDEwMB4XDTI0MDcyNTE4MzEwNloXDTI1MTAyMjE4MzEwNlowgdMxCzAJ
# BgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25k
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNVBAsTJE1pY3Jv
# c29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEnMCUGA1UECxMeblNoaWVs
# ZCBUU1MgRVNOOjM2MDUtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt
# ZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
# 0OdHTBNom6/uXKaEKP9rPITkT6QxF11tjzB0Nk1byDpPrFTHha3hxwSdTcr8Y0a3
# k6EQlwqy6ROz42e0R5eDW+dCoQapipDIFUOYp3oNuqwX/xepATEkY17MyXFx6rQW
# 2NcWUJW3Qo2AuJ0HOtblSpItQZPGmHnGqkt/DB45Fwxk6VoSvxNcQKhKETkuzrt8
# U6DRccQm1FdhmPKgDzgcfDPM5o+GnzbiMu6y069A4EHmLMmkecSkVvBmcZ8VnzFH
# TDkGLdpnDV5FXjVObAgbSM0cnqYSGfRp7VGHBRqyoscvR4bcQ+CV9pDjbJ6S5rZn
# 1uA8hRhj09Hs33HRevt4oWAVYGItgEsG+BrCYbpgWMDEIVnAgPZEiPAaI8wBGemE
# 4feEkuz7TAwgkRBcUzLgQ4uvPqRD1A+Jkt26+pDqWYSn0MA8j0zacQk9q/AvciPX
# D9It2ez+mqEzgFRRsJGLtcf9HksvK8Jsd6I5zFShlqi5bpzf1Y4NOiNOh5QwW1pI
# vA5irlal7qFhkAeeeZqmop8+uNxZXxFCQG3R3s5pXW89FiCh9rmXrVqOCwgcXFIJ
# QAQkllKsI+UJqGq9rmRABJz5lHKTFYmFwcM52KWWjNx3z6odwz2h+sxaxewToe9G
# qtDx3/aU+yqNRcB8w0tSXUf+ylN4uk5xHEpLpx+ZNNsCAwEAAaOCAUkwggFFMB0G
# A1UdDgQWBBTfRqQzP3m9PZWuLf1p8/meFfkmmDAfBgNVHSMEGDAWgBSfpxVdAF5i
# XYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSgUqBQhk5odHRwOi8vd3d3Lm1pY3Jv
# c29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBUaW1lLVN0YW1wJTIwUENB
# JTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEEYDBeMFwGCCsGAQUFBzAChlBodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFRp
# bWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNydDAMBgNVHRMBAf8EAjAAMBYGA1Ud
# JQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF
# AAOCAgEAN0ajafILeL6SQIMIMAXM1Qd6xaoci2mOrpR8vKWyyTsL3b83A7XGLiAb
# QxTrqnXvVWWeNst5YQD8saO+UTgOLJdTdfUADhLXoK+RlwjfndimIJT9MH9tUYXL
# zJXKhZM09ouPwNsrn8YOLIpdAi5TPyN8Cl11OGZSlP9r8JnvomW00AoJ4Pl9rlg0
# G5lcQknAXqHa9nQdWp1ZxXqNd+0JsKmlR8tcANX33ClM9NnaClJExLQHiKeHUUWt
# qyLMl65TW6wRM7XlF7Y+PTnC8duNWn4uLng+ON/Z39GO6qBj7IEZxoq4o3avEh9b
# a43UU6TgzVZaBm8VaA0wSwUe/pqpTOYFWN62XL3gl/JC2pzfIPxP66XfRLIxafjB
# VXm8KVDn2cML9IvRK02s941Y5+RR4gSAOhLiQQ6A03VNRup+spMa0k+XTPAi+2aM
# H5xa1Zjb/K8u9f9M05U0/bUMJXJDP++ysWpJbVRDiHG7szaca+r3HiUPjQJyQl2N
# iOcYTGV/DcLrLCBK2zG503FGb04N5Kf10XgAwFaXlod5B9eKh95PnXKx2LNBgLwG
# 85anlhhGxxBQ5mFsJGkBn0PZPtAzZyfr96qxzpp2pH9DJJcjKCDrMmZziXazpa5V
# VN36CO1kDU4ABkSYTXOM8RmJXuQm7mUF3bWmj+hjAJb4pz6hT5UwggdxMIIFWaAD
# AgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3Nv
# ZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0yMTA5MzAxODIy
# MjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNo
# aW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29y
# cG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEw
# MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA5OGmTOe0ciELeaLL1yR5
# vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9uT4XYDP/XE/HZveVU3Fa4n5KWv64
# NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZrBxTzxXb1hlDcwUTIcVxRMTegCjhu
# je3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk2pg7uhp7M62AW36MEBydUv626GIl
# 3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxRnOlwaQ3KNi1wjjHINSi947SHJMPg
# yY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uDRedGbsoy1cCGMFxPLOJiss254o2I
# 5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGaRnXNxF803RKJ1v2lIH1+/NmeRd+2
# ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fzpk03dJQcNIIP8BDyt0cY7afomXw/
# TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG4tG9ahhaYQFzymeiXtcodgLiMxhy
# 16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGUlNi5UPkLiWHzNgY1GIRH29wb0f2y
# 1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLEhReTwDwV2xo3xwgVGD94q0W29R6H
# XtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0wggHZMBIGCSsGAQQBgjcVAQQFAgMB
# AAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+gpE8RjUpzxD/LwTuMB0GA1UdDgQW
# BBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNVHSAEVTBTMFEGDCsGAQQBgjdMg30B
# ATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYB
# BAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQFMAMB
# Af8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9lJBb186aGMQwVgYDVR0fBE8wTTBL
# oEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9jcmwvcHJvZHVjdHMv
# TWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3JsMFoGCCsGAQUFBwEBBE4wTDBKBggr
# BgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNS
# b29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJKoZIhvcNAQELBQADggIBAJ1Vffwq
# reEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEGk5c9MTO1OdfCcTY/2mRsfNB1OW27
# DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2LpypglYAA7AFvonoaeC6Ce5732pv
# vinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7ndn/OOPcbzaN9l9qRWqveVtihVJ9Ak
# vUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSFQrP8DJ6LGYnn8AtqgcKBGUIZUnWK
# NsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy87JGA0j3mSj5mO0+7hvoyGtmW9I/2
# kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8x1RtnWN0SCyxTkctwRQEcb9k+SS+
# c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2fpCjcZxkoJLo4S5pu+yFUa2pFEUep
# 8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz/gq77EFmPWn9y8FBSX5+k77L+Dvk
# txW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQKBqJC4822rpM+Zv/Cuk0+CQ1Zyvg
# DbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAxM328y+l7vzhwRNGQ8cirOoo6CGJ/
# 2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGbyoYIDVjCCAj4CAQEwggEBoYHZpIHW
# MIHTMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH
# UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQL
# EyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJzAlBgNVBAsT
# Hm5TaGllbGQgVFNTIEVTTjozNjA1LTA1RTAtRDk0NzElMCMGA1UEAxMcTWljcm9z
# b2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIaAxUAb28KDG/xXbNB
# jmM7/nqw3bgrEOaggYMwgYCkfjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAx
# MDANBgkqhkiG9w0BAQsFAAIFAOvypPYwIhgPMjAyNTA2MTAxMjM1MDJaGA8yMDI1
# MDYxMTEyMzUwMlowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA6/Kk9gIBADAHAgEA
# AgIdvTAHAgEAAgIUMzAKAgUA6/P2dgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgor
# BgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUA
# A4IBAQBgdbrIWUbRlhzl3hSsDHhOncHPU3GYRyf0+eyzVSphCCQMxNxBgn1HBOJs
# PqKei8zOZRF989PL6yu3Pd0P5RMb7/F7+Dmcj0Wyt1k1tH1q9BQDjJPXK3ZdFzw+
# Gm03ve75WapAnPiNfkMqZmDQapFW+Jo0fco1Fr12xAsqmKvXGMVEXmPNREplZDt0
# Ho1VFL84fze9b+eXoV8qPQ8VpA+8TUWtI/kCaGpGWgB30UJNlJUwek6R/Uz7WPVK
# VBZkkNnirc1sX3Tp/NmTzGXd4O6yR10zNUikhfoQkhLIZ1o31i9yPcL0ilhyo+r8
# +mUG1IYiLiV4TdWAVvbLiMkbWtXfMYIEDTCCBAkCAQEwgZMwfDELMAkGA1UEBhMC
# VVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRp
# bWUtU3RhbXAgUENBIDIwMTACEzMAAAH3WCB1BMr7wvQAAQAAAfcwDQYJYIZIAWUD
# BAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAvBgkqhkiG9w0B
# CQQxIgQgUJqpwKKtndWGr6JXeoeXCq/mgdwqOUg0R7H0qYmwWOowgfoGCyqGSIb3
# DQEJEAIvMYHqMIHnMIHkMIG9BCAh2pjaa3ca0ecYuhu60uYHP/IKnPbedbVQJ5So
# IH5Z4jCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAAB
# 91ggdQTK+8L0AAEAAAH3MCIEIDs1pkgIQ02VR9ca/osTmDWRil6pAff0703IFPia
# tRKQMA0GCSqGSIb3DQEBCwUABIICAHnQJf9kp3UoIiTYKhs6GrxG3w+IFBW/c0af
# xLEY5Y0ZXV78Zkp3C1DlSMZbsL0X/rArBC3Cv3Zf2J4RUW6s72yikyOT54/INjZa
# jsLdOX4cIu7oylvc6feghmQi8bClenhi1lji3lTJZP6xmAZqmDwqldo2+E/j7rPs
# XcAKl8qgek0hVXtgLyKODJs+o0LkO23MhZuw6/jb9wthSp0BlROmiFcV76RMj08j
# D8lqWlGhUrrulgyJ0R5BjAWfFTRmlSOmL+2WFvoi0bonXIwdGKRX4euDMiVG3fKM
# U5ta1foEsUBIwRFAbX1+NK0CRmgA095M2A4TFyAaPwjMa+fhDMuTlrnA5bsKifg2
# y57TdJnw/ze5WsEtg6HNDUAi5vCGUAAGnwxNRM+ER3kJ+E7zyNLBxmWU2IRXTCtf
# 3ieKEIbyOtpq72yUa9506L4Zgn6dVFbDaeG58QTspfTjt5UYtAQEgND3SZQDqV3Z
# eM1RmAm1p/1UQNjJJ7eyq2WCMfVmsUk9zYbepO32KxTz41jQK/HNAewV0OHdTeGN
# hxxYDpHl+g4GYp1eQB0bkt6Z52oAsZy8oHX+Hu5CBBn8iCpPZq24BLfn8z420Grs
# ji9jJtswYxARwYB+G1/H7sgJ5zzY6nVm3nRL7fwK25nZ/cIKL9x/GIrTqOopPA62
# 3bn51kmp
# SIG # End signature block