New-AaddsNetworkSecurityGroup.ps1

<#PSScriptInfo
 
.VERSION 1.2.0
 
.GUID 7732bb75-a0d5-4769-97ee-c5394b554941
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Azure-AD-Domain-Services NetworkSecurityGroup
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    07/19/2020 - Initial release
    01/09/2024 - Rebrand to Microsoft Entra Domain Services
#>


<#
 
.SYNOPSIS
    Creates a new Azure network security group with the correct networking rules that are compatible with Azure Active
    Directory Domain services. The network security group is created in the same resource group and location as the Azure
    AD Domain Service. The script can optionally link the network security group to the Microsoft Entra Domain Services
    subnet.
 
.DESCRIPTION
    Creates a new Azure network security group with the correct networking rules that are compatible with Azure Active
    Directory Domain services. The network security group is created in the same resource group and location as the Azure
    AD Domain Service. The script can optionally link the network security group to the Microsoft Entra Domain Services
    subnet.
 
.PARAMETER ManagedDomainFqdn
    The fqdn of the managed domain (aadds.cloudcontoso.com).
 
.PARAMETER SubscriptionId
    The Azure subscription that hosts the Microsoft Entra Domain Services resource.
 
.PARAMETER LinkToAaddsSubnet
    Links the newly created network security group to the Microsoft Entra Domain Services subnet.
 
.PARAMETER Credentials
    The credentials used to authenticate to Azure resource manager.
 
#>

[CmdletBinding()]
Param (

    [Parameter(
        Mandatory=$true)]
        [string]
        $ManagedDomainFqdn,

    [Parameter(
        Mandatory=$false)]
        [string]
        $SubscriptionId = $null,

    [Parameter(
        Mandatory=$false)]
        [switch]
        $LinkToAaddsSubnet = $false,

    [Parameter(
        Mandatory=$false)]
        [pscredential]
        $Credentials = $null
)

Process
{
    Set-Item Env:\SuppressAzurePowerShellBreakingChangeWarnings "true"

    [int] $SUBNET_NAME_INDEX = 9
    [int] $VNET_NAME_INDEX = 7

    $subscription = $null
    $azProfile = $null
    $aadds = $null


    #
    # Check for subscriptionID
    if([String]::Empty -ne $SubscriptionId)
    {
        $subscription = $SubscriptionId
    }

    Write-Host ([string]::Empty)
    Write-Host ([string]::Empty)
    Write-Host "Authenticating to Azure... " -NoNewline

    #
    # Collect credentials from the user for authentication
    if($null -eq $Credentials)
    {
        $azProfile = Connect-AzAccount -ErrorAction SilentlyContinue
    }
    else
    {
        $azProfile = Connect-AzAccount -Credential $Credentials -ErrorAction SilentlyContinue
    }

    if($null -eq $azProfile)
    {
        # Authentication failed
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not authenticate to Azure. Check your credentials and try again."
        Return
    }
    else
    {
        Write-Host -ForegroundColor Green "[Success!]"
    }

    Write-Host ("[INFO] Authenticated to Azure as {0}..." -f $azProfile.Context.Account.Id)

    #
    # Check for user provided subscription Id
    Write-Host "Searching for Microsoft Entra Domain Services instance..." -NoNewline
    if($null -eq $subscription)
    {
        #
        # Locate Microsoft Entra Domain Services in a subscription
        # Use the first instance found as there should only be one instance per tenant
        ($AzSubs = Get-AzSubscription) | Out-Null
        foreach($azsub in $AzSubs)
        {
            (Set-AzContext $azsub.Id) | Out-Null

            $aadds = Get-AzResource -Name $ManagedDomainFqdn -ApiVersion "2020-01-01" -ExpandProperties -ErrorAction SilentlyContinue

            if($null -ne $aadds)
            {
                # Found Microsoft Entra Domain Services in this subscription
                # Add to the subscription List
                $subscription = $azsub.Id
                break
            }
        }
    }
    if($null -eq $subscription)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "A subscription could not be located for this user."
        Write-Host -ForegroundColor Red "Ensure the user has the contributor role to the subscription hosting Microsoft Entra Domain Services."
        Return
    }


    #
    # Set the subscription
    Set-AzContext $subscription -ErrorAction SilentlyContinue | Out-Null

    #
    # Get the Microsoft Entra Domain Services instance in the subscription
    $aadds = Get-AzResource -Name $ManagedDomainFqdn -ApiVersion "2020-01-01" -ExpandProperties -ErrorAction SilentlyContinue


    if($null -eq $aadds)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not find a subscription that hosts Microsoft Entra Domain Services."
        return
    }
    else
    {
        Write-Host -ForegroundColor Green "[Found!]"
    }

    #
    # Validate the resource is Microsoft Entra Domain Services
    Write-Host "Validating resource type..." -NoNewline
    if($aadds.ResourceType -ne "Microsoft.AAD/domainServices")
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: The resource is not an Microsoft Entra Domain Services resource (Status:$($aadds.ResourceType))."
    }
    else {Write-Host -ForegroundColor Green "[Pass!]"}

    #
    # Get information about Microsoft Entra Domain Services needed to create the network security group
    Write-Host ("Getting properties of from the Microsoft Entra Domain Services instance {0}." -f $ManagedDomainFqdn)

    # Get the Microsoft Entra Domain Services subnet ID
    Write-Host "Virtual subnet ID: " -NoNewline
    $replicaSetCount = $aadds.Properties.ReplicaSets.Count
    if($replicaSetCount -eq 1)
    {
        $aaddsSubnetId = $aadds.Properties.ReplicaSets[0].SubnetId
    }
    elseif($replicaSetCount -gt 1)
    {
        $syncOwner = $aadds.Properties.SyncOwner
        $primaryReplicaSet = $aadds.Properties.ReplicaSets | Where-Object { $_.ReplicaSetId -eq $syncOwner }
        $aaddsSubnetId = $primaryReplicaSet.SubnetId
    }
    else { $aaddsSubnetId = $null }

    if($null -eq $aaddsSubnetId)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not get the virtual subnet ID for the Microsoft Entra Domain Services instance."
        Return
    }
    else { Write-Host -ForegroundColor Green ("{0}" -f $aaddsSubnetId) }

    # Get the Microsoft Entra Domain Services resource group
    Write-Host "Resource Group: " -NoNewline
    $aaddsResourceGroupName = $aadds.ResourceGroupName
    if($null -eq $aaddsResourceGroupName)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not get the resource group for the Microsoft Entra Domain Services instance."
        Return
    }
    else { Write-Host -ForegroundColor Green ("{0}" -f $aaddsResourceGroupName) }

    # Get the Microsoft Entra Domain Services location
    Write-Host "Location: " -NoNewline
    $aaddsLocation = $aadds.Location
    if($null -eq $aaddsLocation)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not get the location for the Microsoft Entra Domain Services instance."
        Return
    }
    else { Write-Host -ForegroundColor Green ("{0}" -f $aaddsLocation) }

    #
    # Heuristically build the
    # Microsoft Entra Domain Services subnet name
    # Microsoft Entra Domain Services network name
    # Microsoft Entra Domain Services network ID
    $aaddsSubnetParts = $aaddsSubnetId.Split("/", [System.StringSplitOptions]::RemoveEmptyEntries)
    $aaddsSubnetName = $aaddsSubnetParts[$SUBNET_NAME_INDEX]
    Write-Host "Virtual subnet name: " -NoNewline
    if($null -eq $aaddsSubnetName)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not get the location for the Microsoft Entra Domain Services instance."
        Return
    }
    else { Write-Host -ForegroundColor Green ("{0}" -f $aaddsSubnetName) }
    $aaddsVnetParts = $aaddsSubnetParts[0..7]

    $aaddsVnetName = $aaddsVnetParts[$VNET_NAME_INDEX]
    Write-Host "Virtual network name: " -NoNewline
    if($null -eq $aaddsVnetName)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not get the location for the Microsoft Entra Domain Services instance."
        Return
    }
    else { Write-Host -ForegroundColor Green ("{0}" -f $aaddsVnetName) }

    # Get the Microsoft Entra Domain Services virutal network
    Write-Host ("Getting virtual network information for {0}..." -f $aaddsVnetName) -NoNewline
    $aaddsVirtualNetwork = Get-AzVirtualNetwork -Name $aaddsVnetName `
        -ResourceGroupName $aaddsResourceGroupName -ErrorAction SilentlyContinue
    if($null -eq $aaddsVirtualNetwork)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red ("ERROR: Could not get the virtual network information for {0} from Azure ." -f $aaddsVnetName)
        Return
    }
    else { Write-Host -ForegroundColor Green "[Success!]" }

    # Get the Microsoft Entra Domain Services virtual subnet
    Write-Host ("Getting virtual subnet information for {0}..." -f $aaddsSubnetName) -NoNewline
    $aaddsSubnet = Get-AzVirtualNetworkSubnetConfig -ResourceId $aaddsSubnetId
    if($null -eq $aaddsSubnet)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red ("ERROR: Could not get the virtual subnet information for {0} from Azure ." -f $aaddsSubnetName)
        Return
    }
    else { Write-Host -ForegroundColor Green "[Success!]" }

    # Create the default Microsoft Entra Domain Services NSG with rules and link it to Microsoft Entra Domain Services Subnet
    Write-Host "Creating network security group network security group in the $aaddsResourceGroupName resource group..."

    # Build the rules
    Write-Host "Creating Microsoft Entra Domain Services network security group rules..." -NoNewline
    $nsg101 = New-AzNetworkSecurityRuleConfig -Name AllowSyncWithAzureAD `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 101 `
        -SourceAddressPrefix AzureActiveDirectoryDomainServices `
        -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 443

    $nsg201 = New-AzNetworkSecurityRuleConfig -Name AllowRD `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 201 `
        -SourceAddressPrefix CorpNetSaw `
        -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389

    $nsg301 = New-AzNetworkSecurityRuleConfig -Name AllowPSRemoting `
        -Access Allow -Protocol Tcp -Direction Inbound -Priority 301 `
        -SourceAddressPrefix AzureActiveDirectoryDomainServices `
        -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 5986

    if( ($null -eq $nsg101) -or ($null -eq $nsg201) -or ($null -eq $nsg301))
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not create inbound network Microsoft Entra Domain Services network security group rules."
        Return
    }
    else { Write-Host -ForegroundColor Green "[Success!]" }

    #
    # Find an available name for the NSG
    Write-Host "Automatically generating a name for the network security group..." -NoNewline
    $nsgNamePrefix = "aadds-nsg-"
    $nsgName = [String]::Empty
    $rv = $true
    for($inc = 1; $rv -eq $true; $inc++)
    {
        $nsgName = [String]::Concat($nsgNamePrefix,$inc)
        $tempNsg = Get-AzNetworkSecurityGroup -Name  $nsgName -ResourceGroupName $aaddsResourceGroupName -ErrorAction SilentlyContinue
        if($null -eq $tempNsg)
        {
            break
        }

        if($inc -gt 50)
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red "ERROR: There are more than 50 network security groups that begin with aadds-nsg-."
            Write-Host -ForegroundColor Red "ERROR: Remove the unused network security groups and run the script again."
            Return
        }
        $nsgName = $null
        Write-Host "." -NoNewline
    }

    if($null -eq $nsgName)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: There was a problem automatically generating a network security group name."
        Return
    }
    else {Write-Host -ForegroundColor Green "[Success!]" }

    #
    # Save the network security group
    Write-Host "Saving Microsoft Entra Domain Services network security group..." -NoNewline
    $nsg = New-AzNetworkSecurityGroup -Name $nsgName -ResourceGroupName $aaddsResourceGroupName `
        -Location $aaddsLocation -SecurityRules $nsg101,$nsg201,$nsg301

    if($null -eq $nsg)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not create a network security group in the $aaddsResourceGroupName resource group."
        Return
    }
    else {Write-Host -ForegroundColor Green "[Success!]"}

    if($true -eq $LinkToAaddsSubnet)
    {
        #
        # Link the NSG to the subnet
        Write-Host ("Linking the network security group {0} to the virtual subnet {1}..." -f $nsgName, $aaddsSubnetName) -NoNewline
        $addressPrefix = $aaddsSubnet.AddressPrefix
        $aaddsSubnet = $null
        $aaddsSubnet = Set-AzVirtualNetworkSubnetConfig -VirtualNetwork $aaddsVirtualNetwork `
            -AddressPrefix $addressPrefix `
            -Name $aaddsSubnetName `
            -NetworkSecurityGroup $nsg -ErrorAction SilentlyContinue
        if($null -eq $aaddsSubnet)
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red "ERROR: Could not update the the subnet with the new network security group."
            Return
        }
        else {Write-Host -ForegroundColor Green "[Success!]"}

        #
        # Commit the changes to the virtual network
        Write-Host "Saving changes to the subnet and virtual network..." -NoNewline
        $rv = Set-AzVirtualNetwork -VirtualNetwork $aaddsVirtualNetwork -ErrorAction SilentlyContinue
        if($null -eq $rv)
        {
            Write-Host -ForegroundColor Red "[Failed!]"
            Write-Host -ForegroundColor Red "ERROR: Could not save the changes to the virtual network."
            Return
        }
        else {Write-Host -ForegroundColor Green "[Success!]"}
    }

    Write-Host ([string]::Empty)
    Write-Host ([string]::Empty)

    Set-Item Env:\SuppressAzurePowerShellBreakingChangeWarnings "false"
}
# SIG # Begin signature block
# MIIr7gYJKoZIhvcNAQcCoIIr3zCCK9sCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBqXbILPabxftZ4
# qF0Qs1Xvnm+iGX4CdjxQhDbTZ+OgP6CCEXgwggiIMIIHcKADAgECAhM2AAABzxvV
# hIv3HFTwAAIAAAHPMA0GCSqGSIb3DQEBCwUAMEExEzARBgoJkiaJk/IsZAEZFgNH
# QkwxEzARBgoJkiaJk/IsZAEZFgNBTUUxFTATBgNVBAMTDEFNRSBDUyBDQSAwMTAe
# Fw0yMzAzMjAyMDAwMzJaFw0yNDAzMTkyMDAwMzJaMC8xLTArBgNVBAMTJE1pY3Jv
# c29mdCBBenVyZSBEZXBlbmRlbmN5IENvZGUgU2lnbjCCASIwDQYJKoZIhvcNAQEB
# BQADggEPADCCAQoCggEBAOREEBJi/WoqvCPTpdI+NM1fM/zljtamVZMTJaEFhALS
# 3v0oF6vWx7zJy9McdDOyA9wY8x75/uBmwl1n8d5l/cLSD+PExSnU1o/zDyr80He+
# K1yZlVCdYSYsoWDsOeYCI0+sf6O6U2Y2kp+pIVLSf1j7amZd+vkbjHCbxRA28njz
# MCxv66EZS2Sh5yTH+uFi+RzUWMaJltkPurDraCRNKKubmOpAmqbtaPu+FEIs+nyn
# +xzFwefTOGNanTyOs2wmxBJ8VkQGU9tlRlbNrURi/5TtdktoTnM0Vn4M/2MbPlYC
# QBcJtVadNVheejpKNhinXiZw8i9TsGHDOJvuz05Hl7UCAwEAAaOCBYkwggWFMCkG
# CSsGAQQBgjcVCgQcMBowDAYKKwYBBAGCN1sDATAKBggrBgEFBQcDAzA8BgkrBgEE
# AYI3FQcELzAtBiUrBgEEAYI3FQiGkOMNhNW0eITxiz6Fm90Wzp0SgWDigi2HkK4D
# AgFkAgEOMIICdgYIKwYBBQUHAQEEggJoMIICZDBiBggrBgEFBQcwAoZWaHR0cDov
# L2NybC5taWNyb3NvZnQuY29tL3BraWluZnJhL0NlcnRzL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0
# dHA6Ly9jcmwxLmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUy
# MENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwyLmFt
# ZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAw
# MSgyKS5jcnQwUgYIKwYBBQUHMAKGRmh0dHA6Ly9jcmwzLmFtZS5nYmwvYWlhL0JZ
# MlBLSUNTQ0EwMS5BTUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwUgYI
# KwYBBQUHMAKGRmh0dHA6Ly9jcmw0LmFtZS5nYmwvYWlhL0JZMlBLSUNTQ0EwMS5B
# TUUuR0JMX0FNRSUyMENTJTIwQ0ElMjAwMSgyKS5jcnQwga0GCCsGAQUFBzAChoGg
# bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEsQ049QUlBLENOPVB1YmxpYyUy
# MEtleSUyMFNlcnZpY2VzLENOPVNlcnZpY2VzLENOPUNvbmZpZ3VyYXRpb24sREM9
# QU1FLERDPUdCTD9jQUNlcnRpZmljYXRlP2Jhc2U/b2JqZWN0Q2xhc3M9Y2VydGlm
# aWNhdGlvbkF1dGhvcml0eTAdBgNVHQ4EFgQUF8EGJdg3VCco3OMElEnYjfOsKQAw
# DgYDVR0PAQH/BAQDAgeAMEUGA1UdEQQ+MDykOjA4MR4wHAYDVQQLExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xFjAUBgNVBAUTDTIzNjE2OSs1MDAzNjQwggHmBgNVHR8E
# ggHdMIIB2TCCAdWgggHRoIIBzYY/aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3Br
# aWluZnJhL0NSTC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8vY3Js
# MS5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRwOi8v
# Y3JsMi5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFodHRw
# Oi8vY3JsMy5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3JshjFo
# dHRwOi8vY3JsNC5hbWUuZ2JsL2NybC9BTUUlMjBDUyUyMENBJTIwMDEoMikuY3Js
# hoG9bGRhcDovLy9DTj1BTUUlMjBDUyUyMENBJTIwMDEoMiksQ049QlkyUEtJQ1ND
# QTAxLENOPUNEUCxDTj1QdWJsaWMlMjBLZXklMjBTZXJ2aWNlcyxDTj1TZXJ2aWNl
# cyxDTj1Db25maWd1cmF0aW9uLERDPUFNRSxEQz1HQkw/Y2VydGlmaWNhdGVSZXZv
# Y2F0aW9uTGlzdD9iYXNlP29iamVjdENsYXNzPWNSTERpc3RyaWJ1dGlvblBvaW50
# MB8GA1UdIwQYMBaAFJZRhOBrb3v+2Aarw/KF5imuavnUMB8GA1UdJQQYMBYGCisG
# AQQBgjdbAwEGCCsGAQUFBwMDMA0GCSqGSIb3DQEBCwUAA4IBAQAy72n19XEpbA0F
# OW2VYlwvvLf8AVlRHgV5AnFegvbNSGIlfvbTizxYyHrzzldeW/xZxpLMOfnU8Ymo
# Oe3cpJYN6qX99cL50D2F0QibG6eJ4XpVNKDbt1YbaR+ekLgHoATohGFqAeI0LHO8
# jIQBJaICrYeLNXRcP8kXV0BrLtKXPsUojlvSxHzaECg7F2fhKt7WQkVZexhZB6QO
# VGj/VQY9TjWsHi6D5evjT3o819ZINUG1mCKbBFL1pFHMDjFICKlPDFIt9oL2QbZZ
# 27gH2HHcOqCIWeFlrz3qcH+dwcVGEOHz6j5SDMSIWBpS3pebi5kb0jnOu7m6uAz0
# Q8ksXFl/MIII6DCCBtCgAwIBAgITHwAAAFHqj/accwyoOwAAAAAAUTANBgkqhkiG
# 9w0BAQsFADA8MRMwEQYKCZImiZPyLGQBGRYDR0JMMRMwEQYKCZImiZPyLGQBGRYD
# QU1FMRAwDgYDVQQDEwdhbWVyb290MB4XDTIxMDUyMTE4NDQxNFoXDTI2MDUyMTE4
# NTQxNFowQTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FN
# RTEVMBMGA1UEAxMMQU1FIENTIENBIDAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
# MIIBCgKCAQEAyZpSCX0Bno1W1yqXMhT6BUlJZWpa4p3xFeiTHO4vm2Q6C/azR5xw
# xnyYHrkSGDtS2P9X+KDE64V20mmEQkubxnPNeOVnE2RvdPGxgwlq+BhS3ONdVsQP
# j79q7XgHM9HhzB9+qk0PC9KN1zm9p/seyiRS6JF1dbOqRf1pUl7FAVxmgiCFgV8h
# HIb/rDPXig7FDi3S0yEx2CUDVpIq8jEhG8anUFE1WYxM+ni0S5KHwwKPKV4qyGDo
# DO+9AmDoma3Chyu5WDlW5cdtqXTWsGPE3umtnX6AmlldUFLms4OVR4guKf+n5LIB
# CC6bTiocfXPomqYjYTKx7AGMfaVLaaXmhQIDAQABo4IE3DCCBNgwEgYJKwYBBAGC
# NxUBBAUCAwIAAjAjBgkrBgEEAYI3FQIEFgQUEmgkQiFHy9RrvjHPIKTACyN/P0cw
# HQYDVR0OBBYEFJZRhOBrb3v+2Aarw/KF5imuavnUMIIBBAYDVR0lBIH8MIH5Bgcr
# BgEFAgMFBggrBgEFBQcDAQYIKwYBBQUHAwIGCisGAQQBgjcUAgEGCSsGAQQBgjcV
# BgYKKwYBBAGCNwoDDAYJKwYBBAGCNxUGBggrBgEFBQcDCQYIKwYBBQUIAgIGCisG
# AQQBgjdAAQEGCysGAQQBgjcKAwQBBgorBgEEAYI3CgMEBgkrBgEEAYI3FQUGCisG
# AQQBgjcUAgIGCisGAQQBgjcUAgMGCCsGAQUFBwMDBgorBgEEAYI3WwEBBgorBgEE
# AYI3WwIBBgorBgEEAYI3WwMBBgorBgEEAYI3WwUBBgorBgEEAYI3WwQBBgorBgEE
# AYI3WwQCMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAS
# BgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFCleUV5krjS566ycDaeMdQHR
# CQsoMIIBaAYDVR0fBIIBXzCCAVswggFXoIIBU6CCAU+GMWh0dHA6Ly9jcmwubWlj
# cm9zb2Z0LmNvbS9wa2lpbmZyYS9jcmwvYW1lcm9vdC5jcmyGI2h0dHA6Ly9jcmwy
# LmFtZS5nYmwvY3JsL2FtZXJvb3QuY3JshiNodHRwOi8vY3JsMy5hbWUuZ2JsL2Ny
# bC9hbWVyb290LmNybIYjaHR0cDovL2NybDEuYW1lLmdibC9jcmwvYW1lcm9vdC5j
# cmyGgapsZGFwOi8vL0NOPWFtZXJvb3QsQ049QU1FUm9vdCxDTj1DRFAsQ049UHVi
# bGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29uZmlndXJhdGlv
# bixEQz1BTUUsREM9R0JMP2NlcnRpZmljYXRlUmV2b2NhdGlvbkxpc3Q/YmFzZT9v
# YmplY3RDbGFzcz1jUkxEaXN0cmlidXRpb25Qb2ludDCCAasGCCsGAQUFBwEBBIIB
# nTCCAZkwRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2lp
# bmZyYS9jZXJ0cy9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUFBzAChitodHRw
# Oi8vY3JsMi5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0MDcGCCsGAQUF
# BzAChitodHRwOi8vY3JsMy5hbWUuZ2JsL2FpYS9BTUVSb290X2FtZXJvb3QuY3J0
# MDcGCCsGAQUFBzAChitodHRwOi8vY3JsMS5hbWUuZ2JsL2FpYS9BTUVSb290X2Ft
# ZXJvb3QuY3J0MIGiBggrBgEFBQcwAoaBlWxkYXA6Ly8vQ049YW1lcm9vdCxDTj1B
# SUEsQ049UHVibGljJTIwS2V5JTIwU2VydmljZXMsQ049U2VydmljZXMsQ049Q29u
# ZmlndXJhdGlvbixEQz1BTUUsREM9R0JMP2NBQ2VydGlmaWNhdGU/YmFzZT9vYmpl
# Y3RDbGFzcz1jZXJ0aWZpY2F0aW9uQXV0aG9yaXR5MA0GCSqGSIb3DQEBCwUAA4IC
# AQBQECO3Tw/o317Rrd7yadqcswPx1LvIYymkaTN6KcmuRt6HKa0Xe73Ux2/AQ30T
# fgA9GBJngweRykKBusRzyOU17iIubJvy3gA21dwtqtB0DsoEv1U/ptVu2v++doTC
# J/i+GbssVXkgaX8H+6EOGEmT4evp4GbwR4HwWlc+Dvf8HH8PdUA2Z04CvcwIfckS
# ipbNm84jxJ8XjmTFTWscldL9edj2NsY6iGnyJFIyur2PS7VRYyV3p1VAJp91gj1j
# RQtWEyCB8P5g9nE3z8u0ANaU/hjwEQCrdGyravWgnf2JtG+bT26YAokbc8m+32zU
# tXRO+NK3tAjhOu2FdsG3qNrF4sc7y37R/C+7Pcb/cFfhttqsirepZii4xStcjMOD
# YuXzGm3IJs0b0owHG6oKd7ZOGvHpmmh9K8/DLriD/sq8bURD10qi/wuW8zM7IpLg
# 1vcR9dIK2mc0pj44pc6UX0XbttP/VEJgu3lT2eI9VjWtaKjx38xE9woSMyekPRtz
# TwgfuysF9DkJisr+yA4po/FPxpbBw9c/hBf32DH/GFxteS2pmjgKIbMP8sDukmEq
# 3lVvuWNJsybrZwQvQpvaM49fv+JKpLK5YWYEfwksYRR9wU8Hh/ID9hRCEkbUoQ2W
# 7mMpsp2Nbp/kcn4ivfolUy3Q9Yf0scsQ6WTLYpm+AoCUJTGCGcwwghnIAgEBMFgw
# QTETMBEGCgmSJomT8ixkARkWA0dCTDETMBEGCgmSJomT8ixkARkWA0FNRTEVMBMG
# A1UEAxMMQU1FIENTIENBIDAxAhM2AAABzxvVhIv3HFTwAAIAAAHPMA0GCWCGSAFl
# AwQCAQUAoIGuMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC
# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCCaBaI3v6iqEF50riIm
# xJuEwyej/WqhIueCsoauBZdlnDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMA
# cgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3
# DQEBAQUABIIBABlWMrQyil4MYgh2GJyxDWYsJJMJZGbqyzbeo6qAb0kzSOJ95rTX
# mcCV1FDK1YhvShLPrqBPBcxv4Q4dEZ6fz52LJFhsCH8mukA7Gbvx91wAlqYo07hD
# +FwS8ysdUsQtRHV4UhgUjeMFawMDJSFfCvPjXWWLAM1zrnx63eKS3KlhIxy+kSti
# 7CAjDhvkvcGy5k0GTSujMIDVgHnqK0o5V1Pj14B0qIax2P+aoMGEeNbv2g6v/mDp
# iwoXJYOFZtnsJ6UiTcIyc7QQCsg92JQxROXZmCFbgA6jKcmZSpEeafdnhcCyaLRB
# kt3ezR5KxK9/liCJKqNa4+Ukf4nJleu8tLehgheUMIIXkAYKKwYBBAGCNwMDATGC
# F4Awghd8BgkqhkiG9w0BBwKgghdtMIIXaQIBAzEPMA0GCWCGSAFlAwQCAQUAMIIB
# UgYLKoZIhvcNAQkQAQSgggFBBIIBPTCCATkCAQEGCisGAQQBhFkKAwEwMTANBglg
# hkgBZQMEAgEFAAQgXSC3UTYu5jSyt0x+MX0YbSWzEt3DInxnSabPCm2CZusCBmWf
# 1wDEFxgTMjAyNDAxMTUwNzIxMDQuNzEzWjAEgAIB9KCB0aSBzjCByzELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0
# IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkE5
# MzUtMDNFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2
# aWNloIIR6jCCByAwggUIoAMCAQICEzMAAAHRsltAKGwu0kUAAQAAAdEwDQYJKoZI
# hvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjMwNTI1
# MTkxMjE4WhcNMjQwMjAxMTkxMjE4WjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0
# aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkE5MzUtMDNFMC1EOTQ3MSUw
# IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEAmUzaNDnhs9lxXdoC4OZ05QZvFzqbsCSIl7DF
# Ota8KtWSg6WuON0a0hv6R/Bs+lzZxUChpwqjQrZr6ClCwKcK0/7O/3tV9JTRSpo+
# 1O1+KdNEtLkG1ui8Ep/81h2htnOeGV7BmPgWH4Vg4GxaQk8Uc050Qhutm5Fj6emR
# 22T4OB7dQkQgDIYThk0fMCOBu8MFmcHTHOlL1FJatKpfQMQH85GEaYtrUbwxzHZm
# d78l6aoRcL0RvHIAh/00wo1uaumjW3aii9wRQz81LbgjbD1y9/xNHUdmwzKmtGjR
# /oiH4RguP73MLrXjjAj1CA1UqgwjXyGjwxMGHItX3fYLtc1cPhxIQ2TOxGt58SFK
# 87fkX6eU6DDI+EAJielGnZvkz2w26PJBSCu9EoZlvMJ/HyZPUXkEBKU7SDeN3kb/
# UJl8t1HnfNKLDgRPlpHTL0ghYfqoArCnc0MUCRutnE3qFNnqjYR96KaV5sn1VMG7
# Hn0MzD7W4pwmXdBVJZpTP3R/uDp4qkMmh767WMt8KiGn2N83hSE5VQKD/avbxeFu
# yh0f7hdJr06QC+TWkwzdaZUEtDHYzJIM2SuYLcKjnv9605agc8cGu2GKd7qz+clp
# E8yEhp4TViGTsTskCDsWX24iGwB25tzPIY+9ykFnAkeSWr4JMFJp3BRxEmkH+A66
# rPv9S9UCAwEAAaOCAUkwggFFMB0GA1UdDgQWBBQLjvFMxew3B9JprBeF0McR0L0t
# ozAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSg
# UqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3Nv
# ZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEE
# YDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNy
# dDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB
# /wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAm7va0wB1duJmNKqBuXhJyJs+WpBl
# 074gcCqdmOdbNusPKA61qK/ptNEeP9wXA5mJVCvDa8f2rmBWInWXXXFI8ONkMUkr
# Zr/6lpwkIv9jpx99ilR0PpDDmTwAUExtV5HJ2D1DjhBKK+n/9ybNbo+MIx8xOFeG
# rpmFwQLK+C+SkfLynrObRcYTJFjQ/zu1v0Wh2MCTIzJMVaLAaJO1dtbCQJcUnBF8
# XyWvv6pKlK+wmYMN0eIwh0ZD6kITFom1zzGGq/4hdGbiwfTvPQzCTYYyvQUn+oqo
# GaDLsyFbfhAaE86b//aeMEOsaAQrNvZpI/xCFhXXPuWt9JLgkDkhDo9O/liNvQOJ
# OkCEQecPnjJmdCXnNLEsnkAeSo8ROdYmDIbZTK1CnK9OpwagrEij2LEgCEwM4LLC
# Q/mf3E0uwrt+Xya1oTPTWF9uLgMWCwFtIqTbVqbSHlempLmRHhFegTbTN1U5PpgJ
# Vef3gv9GNe2lUoyuf4Mg6CzZq4FcL+UwGgZqv8IEURR5lvVCd87/C5pOpiKAMk6a
# gW7lIzC8q7Wo7krAP5tg5yjDtEIs9b/hUlW6jN/Cfz05YQk1GxTsdJC0+2P+/mcq
# 4pVQs8gGHxSIpwyI1pTPObQ3lPGXyQoxSsKtw7EcVeCWNfMcMPE05qHd5ZK/Tahk
# OeC5sj1XPuYmza4wggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0G
# CSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3Rv
# bjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3Jp
# dHkgMjAxMDAeFw0yMTA5MzAxODIyMjVaFw0zMDA5MzAxODMyMjVaMHwxCzAJBgNV
# BAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4w
# HAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29m
# dCBUaW1lLVN0YW1wIFBDQSAyMDEwMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEA5OGmTOe0ciELeaLL1yR5vQ7VgtP97pwHB9KpbE51yMo1V/YBf2xK4OK9
# uT4XYDP/XE/HZveVU3Fa4n5KWv64NmeFRiMMtY0Tz3cywBAY6GB9alKDRLemjkZr
# BxTzxXb1hlDcwUTIcVxRMTegCjhuje3XD9gmU3w5YQJ6xKr9cmmvHaus9ja+NSZk
# 2pg7uhp7M62AW36MEBydUv626GIl3GoPz130/o5Tz9bshVZN7928jaTjkY+yOSxR
# nOlwaQ3KNi1wjjHINSi947SHJMPgyY9+tVSP3PoFVZhtaDuaRr3tpK56KTesy+uD
# RedGbsoy1cCGMFxPLOJiss254o2I5JasAUq7vnGpF1tnYN74kpEeHT39IM9zfUGa
# RnXNxF803RKJ1v2lIH1+/NmeRd+2ci/bfV+AutuqfjbsNkz2K26oElHovwUDo9Fz
# pk03dJQcNIIP8BDyt0cY7afomXw/TNuvXsLz1dhzPUNOwTM5TI4CvEJoLhDqhFFG
# 4tG9ahhaYQFzymeiXtcodgLiMxhy16cg8ML6EgrXY28MyTZki1ugpoMhXV8wdJGU
# lNi5UPkLiWHzNgY1GIRH29wb0f2y1BzFa/ZcUlFdEtsluq9QBXpsxREdcu+N+VLE
# hReTwDwV2xo3xwgVGD94q0W29R6HXtqPnhZyacaue7e3PmriLq0CAwEAAaOCAd0w
# ggHZMBIGCSsGAQQBgjcVAQQFAgMBAAEwIwYJKwYBBAGCNxUCBBYEFCqnUv5kxJq+
# gpE8RjUpzxD/LwTuMB0GA1UdDgQWBBSfpxVdAF5iXYP05dJlpxtTNRnpcjBcBgNV
# HSAEVTBTMFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wEwYDVR0l
# BAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwCwYDVR0P
# BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU1fZWy4/oolxiaNE9
# lJBb186aGMQwVgYDVR0fBE8wTTBLoEmgR4ZFaHR0cDovL2NybC5taWNyb3NvZnQu
# Y29tL3BraS9jcmwvcHJvZHVjdHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3Js
# MFoGCCsGAQUFBwEBBE4wTDBKBggrBgEFBQcwAoY+aHR0cDovL3d3dy5taWNyb3Nv
# ZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXRfMjAxMC0wNi0yMy5jcnQwDQYJ
# KoZIhvcNAQELBQADggIBAJ1VffwqreEsH2cBMSRb4Z5yS/ypb+pcFLY+TkdkeLEG
# k5c9MTO1OdfCcTY/2mRsfNB1OW27DzHkwo/7bNGhlBgi7ulmZzpTTd2YurYeeNg2
# LpypglYAA7AFvonoaeC6Ce5732pvvinLbtg/SHUB2RjebYIM9W0jVOR4U3UkV7nd
# n/OOPcbzaN9l9qRWqveVtihVJ9AkvUCgvxm2EhIRXT0n4ECWOKz3+SmJw7wXsFSF
# QrP8DJ6LGYnn8AtqgcKBGUIZUnWKNsIdw2FzLixre24/LAl4FOmRsqlb30mjdAy8
# 7JGA0j3mSj5mO0+7hvoyGtmW9I/2kQH2zsZ0/fZMcm8Qq3UwxTSwethQ/gpY3UA8
# x1RtnWN0SCyxTkctwRQEcb9k+SS+c23Kjgm9swFXSVRk2XPXfx5bRAGOWhmRaw2f
# pCjcZxkoJLo4S5pu+yFUa2pFEUep8beuyOiJXk+d0tBMdrVXVAmxaQFEfnyhYWxz
# /gq77EFmPWn9y8FBSX5+k77L+DvktxW/tM4+pTFRhLy/AsGConsXHRWJjXD+57XQ
# KBqJC4822rpM+Zv/Cuk0+CQ1ZyvgDbjmjJnW4SLq8CdCPSWU5nR0W2rRnj7tfqAx
# M328y+l7vzhwRNGQ8cirOoo6CGJ/2XBjU02N7oJtpQUQwXEGahC0HVUzWLOhcGby
# oYIDTTCCAjUCAQEwgfmhgdGkgc4wgcsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpX
# YXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQg
# Q29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlv
# bnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjpBOTM1LTAzRTAtRDk0NzElMCMG
# A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIa
# AxUARyWNhb/hoS0LUQ0dryMwWkr/+yyggYMwgYCkfjB8MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T
# dGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAOlO8k8wIhgPMjAyNDAxMTQy
# MzUyNDdaGA8yMDI0MDExNTIzNTI0N1owdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA
# 6U7yTwIBADAHAgEAAgIcUDAHAgEAAgIUmTAKAgUA6VBDzwIBADA2BgorBgEEAYRZ
# CgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0G
# CSqGSIb3DQEBCwUAA4IBAQBT3nXSp/cfRRjqywDDWdeCnPrd3ct4kdkS4JOnBOQY
# tjOG1k/YyuIV3Do4amuyo8ScQdgoz51HNkt7NkQgjlOWWiLJJ/f6twmM++lWNEIj
# EQnH3fV+VnxAWI5rJQs7VH5DCNfeUn7LrAfSaO28VfpPDBdLNIaF0fQYREPrX6pV
# ssQGqhFONtxUlpfmRT+YW3C4WAvON+i5A7Ed3EQ21UxlgHfI/zTNLgqi8xUgRuqA
# peTbII/Mua3rMy6nLzzLv+F3shn0lsq1Kvn8I9OZ7qGyJqOOyxIu4aIYUI4PHSck
# dZcCGSVv2eX2PnlHeinU3Rg+1ODOueJRGBZyIhopDMKgMYIEDTCCBAkCAQEwgZMw
# fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAHRsltAKGwu0kUAAQAA
# AdEwDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB
# BDAvBgkqhkiG9w0BCQQxIgQghzid+ssCKO2/iqP2iqfBG/8QWiLfi8ssH3mq1+x+
# 64MwgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCDMvGF5AgC7+e3ObEYaz07m
# 9auE8CeqFQN+pPCIiPwHDDCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD
# QSAyMDEwAhMzAAAB0bJbQChsLtJFAAEAAAHRMCIEIDyMtpSUFkrWwpkZBBSmrZ6l
# 8us0fO0Ay4rLD0cTOZq2MA0GCSqGSIb3DQEBCwUABIICACKTPJmZjtb6p+AFOqOy
# we+sjzb7jmEd6j66RioG7olIaC6KXGcY5SItfHYhRUpx70E1YNaCJ+1q0hvgfLHZ
# TQ2X2N1M7w1s912DRsCnWvmDdcfAX44NKIikGZ0Jl1Dk01uRi6XqSIeIak7x8JKo
# K8uMUQvi7yMQ9Wr2M5iWE3eIFDkEZC263vppwx81EUpK8z8mo0+HzjbMbmoTLrmg
# nMz3FCjefFBgzqA3Vh0/DIMnS+VKQDDUZ8D/oJ7lCF6am5jz2s9qSGyG7zi7AENz
# AGEI6Oa99eLyUv4jQNZSMEOVFzXG/Q9P54o5xsyzt+Z94o/Q13Bz/j1cCy/6FsmH
# x+iENGq0XkkizerYs30RpKocg7zkn45eP6+HFxE1f+YZlYFMWHRUZjL88bohVpKE
# vLSauSuEmT3VBdFsn0VvWi4qDLuQ4sdhsoJhhFmQr6THt8CEOZhnVx9djhpeqR1C
# Iaxt/lAaEw/EOOKYFQa5yxVa/vlc4F9A7HAtOjSuF7fMEvH2wV8uN8Efv0OhpZdm
# lv6x9ZxI1GgJRTvBLVpwkxqiyGPQaNO/I5HRLhOzb5JzlU9FDzndd8F//IoNEqXi
# kcMMnINPF+rwG5pQhg0AAnwkSF/LI9QwFsp+Ez5c/Ln5uyFWWC4WaaVPq04NlONe
# HjMQuaf9OMt5Fqx2OcnPr475
# SIG # End signature block