Add-AaddsResourceForestTrust.ps1

<#PSScriptInfo
 
.VERSION 1.1.1
 
.GUID f554e230-0ef6-4e57-8555-16064d86ebd4
 
.AUTHOR aaddsfb@microsoft.com
 
.COMPANYNAME Microsoft Corporation
 
.COPYRIGHT (c) Microsoft Corporation
 
.TAGS Azure-AD-Domain-Services ResourceForest
 
.LICENSEURI
 
.PROJECTURI
 
.ICONURI
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
    07/19/2020 - Initial release
#>


<#
 
.SYNOPSIS
    Adds a trusts to a Azure AD Domain Services resource forest.
 
.DESCRIPTION
    Adds a trusts to a Azure AD Domain Services resource forest.
 
.PARAMETER ManagedDomainFqdn [MANADATORY]
    The fqdn of the managed domain (aadds.corp.contoso.com).
 
.PARAMETER TrustFriendlyName [MANDATORY]
    The friendly name of the trust relationship.
 
.PARAMETER TrustFqdn [MANADATORY]
    The FQDN of the trusted forest.
 
.PARAMETER TrustDnsIps [MANDATORY]
    A comma delimited list DNS servers for the
    trusted domain listed as IPv4 addresses.
 
.PARAMETER TrustPassword [MANDATORY]
    The complex password the trust relationship uses.
 
.PARAMETER Credential [OPTIONAL]
    The credentials used to authenticate to Azure.
#>

[CmdletBinding()]
Param (

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

    [Parameter(
        Mandatory = $true,
        Position = 1)]
    [string]
    $TrustFqdn,

    [Parameter(
        Mandatory = $true,
        Position = 2)]
    [string]
    $TrustFriendlyName,

    [Parameter(
        Mandatory = $true,
        Position = 3)]
    [string]
    $TrustDnsIps,

    [Parameter(
        Mandatory = $true,
        Position = 4)]
    [string]
    $TrustPassword,

    [Parameter(
        Mandatory = $false,
        Position = 5)]
    [pscredential]
    $Credentials
)
Process {
    # Create empty trust settings
    $TrustSettingsValue = [System.Collections.ArrayList]@()
    $azProfile = $null

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

    # Collect credentials from the user for authentication
    if ($null -ne $creds)
    {
        $creds = Get-Credential -ErrorAction SilentlyContinue
        $azProfile = Connect-AzAccount -Credential $creds -ErrorAction SilentlyContinue
    }
    else
    {
        $azProfile = Connect-AzAccount -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
    }

    Write-Host -ForegroundColor Green "[Success!]"
    Write-Host "INFO: Authenticated to Azure as $($azProfile.Account.Id)..."

    Write-Host "Getting Entra Domain Services instance..." -NoNewline
    $aadds = Get-AzResource -Name $ManagedDomainFqdn -ExpandProperties -ErrorAction SilentlyContinue | Where-Object { $_.ResourceType -eq "Microsoft.AAD/domainServices" }

    if ($null -eq $aadds)
    {
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: Could not find an Entra Domain Services resource with the name $ManagedDomainFqdn."

        Return
    }

    Write-Host -ForegroundColor Green "[Success!]"

    #region PREREQ CHECKS
    Write-Host ([string]::Empty)
    Write-Host "Checking prerequisites..."

    Write-Host "Validating service status..." -NoNewline
    if ($null -ne $aadds.Properties.ReplicaSets)
    {
        $replicaSetCount = $aadds.Properties.ReplicaSets.Count
    }
    else
    {
        $replicaSetCount = 0
    }

    $serviceStatus = $null
    if ($replicaSetCount -eq 1)
    {
        $serviceStatus = $aadds.Properties.ReplicaSets[0].serviceStatus
    }
    elseif ($replicaSetCount -gt 1)
    {
        $syncOwner = $aadds.Properties.SyncOwner
        $primaryReplicaSet = $aadds.Properties.ReplicaSets | Where-Object { $_.ReplicaSetId -eq $syncOwner }
        $serviceStatus = $primaryReplicaSet.serviceStatus
    }

    if ($serviceStatus -ne "Running")
    {
        $pass = $false
        Write-Host -ForegroundColor Red "[Failed!]"
        Write-Host -ForegroundColor Red "ERROR: The managed domain $($aadds.Name) must be running (Status:$($aadds.properties.serviceStatus))."
    }
    else
    {
        Write-Host -ForegroundColor Green "[Pass!]"
    }

    Write-Host "Checking for duplicate trust name..." -NoNewline
    $duplicateFound = $false
    $tempTrustSettingsValue = $aadds.Properties.resourceForestSettings.settings
    if (0 -lt $tempTrustSettingsValue.Count)
    {
        foreach ($tempTrustValue in $tempTrustSettingsValue)
        {
            #check for matching #fqdn
            if ($TrustFqdn -eq $tempTrustValue.trustedDomainFqdn)
            {
                $pass = $false
                $duplicateFound = $true
                Write-Host -ForegroundColor red "[Failed!]"
                Write-Host -ForegroundColor Red "ERROR: The trust $($TrustFqdn) already exist in the managed domain $($aadds.Name)."

                break;
            }
        }
    }

    if ($duplicateFound -eq $false)
    {
        Write-Host -ForegroundColor Green "[Pass!]"
    }

    if ($pass -eq $false)
    {
        Write-Host -ForegroundColor Red "ERROR: One or more prerequisites checks failed."

        Return
    }
    #endregion PREREQ CHECKS

    # Add any existing trusts to prevent Azure from deleting them
    foreach ($tempTrustValue in $tempTrustSettingsValue)
    {
        $TrustSettingsValue.Add($tempTrustValue)
    }

    # Add the new trust for Azure to create
    $TrustSettingsValue.Add(
        @{
            "friendlyName"      = $TrustFriendlyName;
            "trustedDomainFqdn" = $TrustFqdn;
            "remoteDNSIps"      = $TrustDnsIps;
            "trustPassword"     = $TrustPassword
        }
    )

    Write-host ([string]::Empty)
    $answer = Read-host -Prompt "Type 'Yes' to confirm you want to add the trust $TrustFqdn to the managed domain $($aadds.Name)"
    if ("Yes" -cne $answer)
    {
        Write-Host "User canceled."

        Return
    }

    # Assign the trust values to the trust settings
    $trustSettings = @{"settings" = $TrustSettingsValue }

    # Assign the trust settings to the ResourceForestSettings
    $resourceForestSettings = @{"resourceForestSettings" = $trustSettings }

    $actionStart = Get-Date

    Write-Host ([string]::Empty)
    Write-Host "Sending request to Azure. This action may take up to five minutes to complete. Please wait..."
    Set-AzResource -ResourceId $aadds.ResourceId -ApiVersion "2020-01-01" -Properties $resourceForestSettings -force

    $actionStop = Get-Date

    Write-Host "Elapsed Time: " ($actionStop - $actionStart)
} # End Process

# SIG # Begin signature block
# MIIr7gYJKoZIhvcNAQcCoIIr3zCCK9sCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCaAgWRg4TW1yJY
# JB2miP523Y1nL2QdaThjs1bvO5Vd/6CCEXgwggiIMIIHcKADAgECAhM2AAABzxvV
# 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
# AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCDp0fkarIq6yKyjYftj
# imC3zCEfrm/SNhr3KXim3qbEYDBCBgorBgEEAYI3AgEMMTQwMqAUgBIATQBpAGMA
# cgBvAHMAbwBmAHShGoAYaHR0cDovL3d3dy5taWNyb3NvZnQuY29tMA0GCSqGSIb3
# DQEBAQUABIIBAJBYcOWQDrNc25mSybaF9TyvqZjFylYyQW4+Hba5v2/o2usD8PQZ
# zJudAs0ZNtH3LzDS+qfKHD2AJNGaN7DLZVjguQWRahdkrVZbOPLYzgmheW5Taczp
# CGsBAliNNgU0nSRBuAyDc3Cz5ltQxsYFrtAvFwmYy4jMQKBHG0bqXFIpANdYJiTO
# UcBrp0KNL64HNCdBhzCHi70jQDtNs7NxnuVBN9qxVqBoY3FOMzIUhbQgjj1kny9S
# OO7MB1pN+0CCmXzxJHwSuzywyth2E8hu2a6l5fTlZYg+ye4iH8zqanplV93crJFL
# 2Ajb7Y+k56NBtOU0bHoc6VZAYfpZKcqJPZmhgheUMIIXkAYKKwYBBAGCNwMDATGC
# F4Awghd8BgkqhkiG9w0BBwKgghdtMIIXaQIBAzEPMA0GCWCGSAFlAwQCAQUAMIIB
# UgYLKoZIhvcNAQkQAQSgggFBBIIBPTCCATkCAQEGCisGAQQBhFkKAwEwMTANBglg
# hkgBZQMEAgEFAAQgnldx+vzLwmR26ykC9V6gpf2enqdB2Dhh2Igsc3oL1tkCBmUo
# b1hRNhgTMjAyMzEwMTcwNzI3MjMuMzAzWjAEgAIB9KCB0aSBzjCByzELMAkGA1UE
# BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0
# IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkEw
# MDAtMDVFMC1EOTQ3MSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2
# aWNloIIR6jCCByAwggUIoAMCAQICEzMAAAHQdwiq76MXxt0AAQAAAdAwDQYJKoZI
# hvcNAQELBQAwfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAO
# BgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEm
# MCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTAwHhcNMjMwNTI1
# MTkxMjE0WhcNMjQwMjAxMTkxMjE0WjCByzELMAkGA1UEBhMCVVMxEzARBgNVBAgT
# Cldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0
# aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOkEwMDAtMDVFMC1EOTQ3MSUw
# IwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIICIjANBgkqhkiG
# 9w0BAQEFAAOCAg8AMIICCgKCAgEA3zJX59+X7zNFwFEpiOaohtFMT4tuR5EsgYM5
# N86WDt9dXdThBBc9EKQCtt7NXSRa4weYA/kjMOc+hMMQuAq11PSmkOFjR6h64Vn7
# aYKNzJCXsfX65jvTJXVH41BuerCFumFRemI1/va09SQ3Qgx26OZ2YmrDIoBimsBm
# 9h6g+/5I0Ueu0b1Ye0OJ2rQFbuOmX+TC74kdMTeXDRttMcAcILbWmBJOV5VC2gR+
# Tp189nlqCMfkowzuwbeQbgAVmPEr5kUHwck9nKaRM047f37NMaeAdXAB1Q8JRsGb
# r/UX3N53XcYBaygPDFh2yRdPmllFGCAUfBctoLhVR6B3js3uyLG8r0a2sf//N4GK
# qPHOWf9f7u5Iy3E4IqYsmfFxEbCxBAieaMdQQS2OgI5m4AMw3TZdi3no/qiG3Qa/
# 0lLyhAvl8OMYxTDk1FVilnprdpIcJ3VHwTUezc7tc/S9Fr+0wGP7/r+qTYQHqITz
# AhSXPmpOrjA/Eyks1hY8OWgA5Jg/ZhrgvOsr0ipCCODGss6FHbHk9J35PGNHz47X
# cNlp3o5esyx7mF8HA2rtjtQzLqInnTVY0xd+1BJmE/qMQvzhV1BjwxELfbc4G0fY
# PBy7VHxHljrDhA+cYG+a8Mn7yLLOx/3HRxXCIiHM80IGJ7C8hBnqaGQ5CoUjEeXg
# geinL/0CAwEAAaOCAUkwggFFMB0GA1UdDgQWBBQz4QGFktKAPpTrSE34ybcpdJJ0
# UTAfBgNVHSMEGDAWgBSfpxVdAF5iXYP05dJlpxtTNRnpcjBfBgNVHR8EWDBWMFSg
# UqBQhk5odHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3Nv
# ZnQlMjBUaW1lLVN0YW1wJTIwUENBJTIwMjAxMCgxKS5jcmwwbAYIKwYBBQUHAQEE
# YDBeMFwGCCsGAQUFBzAChlBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NlcnRzL01pY3Jvc29mdCUyMFRpbWUtU3RhbXAlMjBQQ0ElMjAyMDEwKDEpLmNy
# dDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB
# /wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAgEAl4fnJApGWgNOkjVvqsbUvYB0KeMe
# xvoHYpJ4CiLRK/KLZFyK5lj2K2q0VgZWPdZahoopR8iJWd4jQVG2jRJmigBjGeWH
# EuyGVCj2qtY1NJrMpfvKINLfQv2duvmrcd77IR6xULkoMEx2Vac7+5PAmJwWKMXY
# SNbhoah+feZqi77TLMRDf9bKO1Pm91Oiwq8ubsMHM+fo/Do9BlF92/omYPgLNMUz
# ek9EGvATXnPy8HMqmDRGjJFtlQCq5ob1h/Dgg03F4DjZ5wAUBwX1yv3ywGxxRktV
# zTra+tv4mhwRgJKwhpegYvD38LOn7PsPrBPa94V/VYNILETKB0bjGol7KxphrLmJ
# y59wME4LjGrcPUfFObybVkpbtQhTuT9CxL0EIjGddrEErEAJDQ07Pa041TY4yFIK
# GelzzMZXDyA3I8cPG33m+MuMAMTNkUaFnMaZMfuiCH9i/m+4Cx7QcVwlieWzFu1s
# FAti5bW7q1MAb9EoI6Q7WxKsP7g4FgXqwk/mbctzXPeu4hmkI8mEB+h/4fV3PLJp
# tp+lY8kkcdrMJ1t4a+kMet1P8WPRy+hTYaxohRA+2USq58L717zFUFCBJAexlBHj
# eoXmPIBy7dIy1d8sw4kAPEfKeWBoBgFbfTBMIACTWNYh7x//L84SUmRTZB/LL0c7
# Tv4t07yq42/GccIwggdxMIIFWaADAgECAhMzAAAAFcXna54Cm0mZAAAAAAAVMA0G
# 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
# bnMxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjpBMDAwLTA1RTAtRDk0NzElMCMG
# A1UEAxMcTWljcm9zb2Z0IFRpbWUtU3RhbXAgU2VydmljZaIjCgEBMAcGBSsOAwIa
# AxUAvLfIU/CilF/dZVORakT/Qn7vTImggYMwgYCkfjB8MQswCQYDVQQGEwJVUzET
# MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T
# dGFtcCBQQ0EgMjAxMDANBgkqhkiG9w0BAQsFAAIFAOjYM2EwIhgPMjAyMzEwMTYy
# MjEwNDFaGA8yMDIzMTAxNzIyMTA0MVowdDA6BgorBgEEAYRZCgQBMSwwKjAKAgUA
# 6NgzYQIBADAHAgEAAgIvEjAHAgEAAgIT0zAKAgUA6NmE4QIBADA2BgorBgEEAYRZ
# CgQCMSgwJjAMBgorBgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0G
# CSqGSIb3DQEBCwUAA4IBAQACpqa0p9KHge9yy7rTC8pnT3NQ+SN/7gjMfoJ9gDWc
# HbeGiy7TkmPB7+LlUavBz6AFQEo718yAGMSqHZGKuzF5XKtcwKv8wGHRu7HgJruU
# U+di76Jo9qr/kPFq3jMMWyhpOjRPIkbLVYuA9REseZFDUZDCC3PXImRtviTwwBKJ
# YiykR/tonSgguLTuxvczumTNcujoXGM9jVIPqE5CP4VorOv853gOxDtUXUID+6WD
# lXXLEjpHd6UQEagCYljBQDsq1Aoux5B3x8i/19cnXYugzMmse+CWv7GrasSm0pWY
# uQLCfuDwQtnklydwcZfy5nefwoQbh1F7UAYeanLHic/fMYIEDTCCBAkCAQEwgZMw
# fDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1Jl
# ZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMd
# TWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIwMTACEzMAAAHQdwiq76MXxt0AAQAA
# AdAwDQYJYIZIAWUDBAIBBQCgggFKMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRAB
# BDAvBgkqhkiG9w0BCQQxIgQgNovj8arWgwQ5ipnXoTgNN3BuuMxmtbiHX1wAE6K9
# HpowgfoGCyqGSIb3DQEJEAIvMYHqMIHnMIHkMIG9BCAIlUAGX7TT/zHdRNmMPnwV
# 2vcOn45k2eVgHq600j8J1zCBmDCBgKR+MHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI
# EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv
# ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD
# QSAyMDEwAhMzAAAB0HcIqu+jF8bdAAEAAAHQMCIEIMOhJcRBcKOL1Jhw1LuCxmPP
# /+VdOkwyVJjVaqzge4IHMA0GCSqGSIb3DQEBCwUABIICABgnn8hCO6vmGT2Si/3T
# clRmuzfZoOXUp2eAQbQ+ObzL5vqNXOG3k8qM6ZpYUTwA4jB6aHfih6M6ndGTkAsk
# yCTA9a1vf9MDDrJ+57oo5+7tfJ70VnoYnXU+NJD3smorCJYlYNx6eY1Z617X69qV
# ep+IYdKTnMtCXMXPwNAXAUVMGz48+KljbrbqFjqGdANi4ndlNn5F014lgHHFu1MK
# NpxZ0OwZtRM6lJDyzR28GytgCYItB5JlBpSonCtkRf5XdV6c789XZOOHYSlqGJoZ
# AAgrXUcDxey//OjcZ7xRv36Wx95WaZKWIRxOHUJ8je1eNFS84t94fG5a2Zbg+Efj
# 1ww7Fxe3bfEKUHMH3yLrwAKnuPtN9urmmhTErkNfgMJ/VEbXjkUMwYJgu2/oVNSn
# KdoHYEUVPvVh65PJbi0MJBXmOoaaaY8O4XhGSKqZygm3wzMqFC/NB4CqI18al4M0
# AV0kB1VQHR1CvqxJdj1A490BReTblCg76+y+chJeCPR2pPaLL35taa01tVa8hJHQ
# SgPrqIvKZgc7JYj5+dxCSsru5XNzhozuiE24s/+uOpR6gZ1P8/9L9HL65BwQp13v
# mM6IrUUUrn4g1orjWyja2MWNuOCM8ny1+GoAytKF3NJ+JAYDHyIgjp95QiXeiWHf
# HgN2p1IQ23K63lK4cZ9o0PYP
# SIG # End signature block