Public/Update-AWSToolsModule.ps1

<#
.Synopsis
    Updates all installed AWS Tools for PowerShell modules to the latest version.
 
    Note: Users are recommended to use Install-AWSToolsModule which supports installing all modules including
    new modules as they are released. Use Update-AWSToolsModule for a simple invocation that intentionally only updates
    previously installed modules.
 
    A warning will be output for any module that is not available in the version that is specified or resolved. Such modules
    will still be removed if the -Cleanup parameter switch is specified.
 
.Description
    This cmdlet updates all installed AWS Tools for PowerShell modules to the latest version
    or a specified version. It identifies installed modules and updates only those modules,
    downloading the AWS.Tools.zip file and extracting only the necessary modules.
    Modules that are not found in the zip file will trigger warnings.
     
    Note: AWS.Tools.Installer is excluded from this cmdlet and must be managed separately
    using Install-AWSToolsInstaller and Uninstall-AWSToolsInstaller.
 
.Parameter Version
    Specifies the version to update to. Supports exact versions (e.g., 5.0.151) or major
    version wildcards (e.g., 4.*, 5.*). Minor version wildcards (e.g., 5.0.*, 5.1.*) are
    not supported. Latest version is used by default when not specified.
 
.Parameter MaximumVersion
    Specifies the maximum version of the modules to update to. This parameter is deprecated
    and should no longer be used as it will be removed in the next major version.
 
.Parameter SkipPublisherCheck
    This parameter is deprecated and should no longer be used as it will be removed in the next major version.
     
    Allows skipping the publisher validation check.
 
.Parameter AllowClobber
    This parameter is deprecated and should no longer be used as it will be removed in the next major version.
     
    Overrides warning messages about installation conflicts about existing commands on a computer.
 
.Parameter Proxy
    This parameter is deprecated and should no longer be used as it will be removed in the next major version.
     
    Specifies a proxy server for the request, rather than connecting directly to an internet resource.
 
.Parameter ProxyCredential
    This parameter is deprecated and should no longer be used as it will be removed in the next major version.
     
    Specifies a user account that has permission to use the proxy server specified by the Proxy parameter.
 
.Parameter Cleanup
    Switch that uninstalls other versions of installed AWS Tools modules after successful update
    like when using <code>Uninstall-AWSToolsModule -ExceptVersion ...</code>
     
    Otherwise, by default, other versions are preserved.
     
    Please note that ALL AWS Tools modules (except installer) will be uninstalled even when
    only specific modules were updated.
 
.Parameter CleanUpLegacyModuleScope
    Runs a separate cleanup of all instances of AWSPowerShell and AWSPowerShell.NetCore
    found in the specified scope. Warns on failure. The acceptable values for this
    parameter are AllUsers and CurrentUser.
 
.Parameter Scope
    Specifies the installation scope of the module as well as scope for module cleanup.
    The acceptable values for this parameter are AllUsers and CurrentUser.
     
    The AllUsers scope installs modules in a location that is accessible to all users of the
    computer.
     
    The CurrentUser installs modules in a location that is accessible only to the current user
    of the computer.
     
    Default value is 'CurrentUser'.
 
.Parameter SourceZipPath
    Path to a local AWS.Tools.zip file for offline/air-gapped installation. Must be a file path,
    not a directory. Requires either -SourceHashPath for SHA512 validation or -SkipIntegrityCheck
    to bypass validation.
 
.Parameter SourceHashPath
    Path to the SHA512 hash file for validating the integrity of the zip file specified with
    -SourceZipPath. When using -SourceZipPath, you must either provide this parameter for
    validation or use -SkipIntegrityCheck to bypass validation.
 
.Parameter SkipIntegrityCheck
    Switch that bypasses SHA512 validation when specified. By default, SHA512 validation is performed
    to ensure the integrity of downloaded files.
 
.Parameter Path
    Specifies a custom installation path for the modules.
 
.Parameter Force
    Forces update even if the same version is already installed. Without this parameter,
    update is skipped if the target version already exists.
 
.Parameter Prerelease
    Allows updating to prerelease versions. When specified, the Version parameter can include
    a prerelease tag (e.g., 5.0.0-preview001). This switch must be specified when updating to
    prerelease versions; otherwise, an error will be thrown.
 
.Parameter Timeout
    Specifies the timeout in seconds for downloading the AWS.Tools.zip file. Default is 300
    seconds (5 minutes). Increase this value for slower internet connections or when downloading
    large files.
 
.Notes
    This cmdlet sources modules from the AWS CloudFront-hosted AWS.Tools.zip file for improved
    speed and reliability. There is no support for updating AWSPowerShell or
    AWSPowerShell.NetCore as these are legacy modules. AWS.Tools.Installer is also excluded
    and must be managed using Install-AWSToolsInstaller.
 
.Example
    Update-AWSToolsModule -Version 5.*
 
    This example updates all installed AWS Tools modules to the latest version within major version 5.
    Using major version wildcards reduces the risk of breaking changes while still receiving bug fixes
    and new features within the major version.
 
.Example
    Update-AWSToolsModule -WarningAction SilentlyContinue
 
    This example updates all installed AWS Tools modules to the latest version. The WarningAction
    parameter suppresses the production workload warning when you intentionally want the latest version.
 
.Example
    Update-AWSToolsModule -Cleanup -Confirm:$false
 
    This example updates all installed AWS Tools modules to the latest version and removes
    all non-latest AWS Tools for PowerShell modules.
 
.Example
    Update-AWSToolsModule -Version 4.1.754 -Cleanup
 
    This example updates all installed AWS Tools modules to version 4.1.754 and removes
    all other versions.
 
.Example
    Update-AWSToolsModule -Force
 
    This example forces update of currently-installed AWS Tools modules even if the same version is already
    installed.
 
.Example
    Update-AWSToolsModule -Scope AllUsers
 
    This example updates AWS Tools modules in the system-wide location accessible to all users.
 
.Example
    Update-AWSToolsModule -SourceZipPath "C:\Downloads\AWS.Tools.zip"
 
    This example updates AWS Tools modules from a local zip file for offline scenarios.
 
.Example
    Update-AWSToolsModule -Path "C:\DevModules"
 
    This example updates AWS Tools modules in a custom directory for testing or development.
 
.Example
    Update-AWSToolsModule -WhatIf
 
    This example performs a what-if analysis to preview what would be updated without making
    changes.
 
.Example
    Update-AWSToolsModule -CleanUpLegacyModuleScope CurrentUser -Confirm:$false
 
    This example updates AWS Tools modules and cleans up legacy AWSPowerShell modules from the
    current user scope.
#>

function Update-AWSToolsModule {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium', DefaultParameterSetName = 'ManagedCloudFront')]
    Param(
        [Parameter(ParameterSetName = 'ManagedCloudFront', Position = 0)]
        [Parameter(ParameterSetName = 'Legacy', Position = 0)]
        [string]
        [Alias('RequiredVersion')]
        $Version,

        [Parameter(ParameterSetName = 'Legacy')]
        [Version]
        $MaximumVersion,

        [Parameter()]
        [Switch]
        $Cleanup,

        [Parameter()]
        [ValidateSet('CurrentUser', 'AllUsers')]
        [string]
        $CleanUpLegacyModuleScope,

        [Parameter()]
        [ValidateSet('CurrentUser', 'AllUsers')]
        [string]
        $Scope = 'CurrentUser',

        [Parameter(ParameterSetName = 'SourceZipPath', Mandatory)]
        [string]
        $SourceZipPath,
        
        [Parameter(ParameterSetName = 'SourceZipPath')]
        [string]
        $SourceHashPath,
        
        [Parameter()]
        [Switch]
        $SkipIntegrityCheck,

        [Parameter()]
        [string]
        $Path,

        [Parameter()]
        [Switch]
        $Force,

        [Parameter()]
        [int]
        $Timeout = $script:Config.network.DefaultTimeout,

        [Parameter()]
        [switch]
        $SkipPublisherCheck,

        [Parameter()]
        [switch]
        $AllowClobber,

        [Parameter()]
        [uri]
        $Proxy,

        [Parameter()]
        [pscredential]
        $ProxyCredential,

        [Parameter(ParameterSetName = 'ManagedCloudFront')]
        [Alias('AllowPrerelease')]
        [switch]
        $Prerelease
    )

    Begin {
        # Initialize progress bar with ID to prevent it from being overridden by other progress bars
        Write-Progress -Id 1 -Activity "Update-AWSToolsModule" -Status "Initializing..." -PercentComplete 0
        
        # Parameter validation for version constraints
        if ($PSCmdlet.ParameterSetName -eq 'ManagedCloudFront' -or $PSCmdlet.ParameterSetName -eq 'Legacy') {
            # Deprecation warning for restored parameter
            if ($MaximumVersion) {
                Write-Warning "The MaximumVersion parameter is deprecated and should no longer be used as it will be removed in the next major version."
            }
            
            # Deprecation warnings for ignored legacy parameters
            if ($SkipPublisherCheck) {
                Write-Warning "The SkipPublisherCheck parameter is deprecated and should no longer be used as it will be removed in the next major version."
            }
            
            if ($AllowClobber) {
                Write-Warning "The AllowClobber parameter is deprecated and should no longer be used as it will be removed in the next major version."
            }
            
            if ($Proxy) {
                Write-Warning "The Proxy parameter is deprecated and should no longer be used as it will be removed in the next major version."
            }
            
            if ($ProxyCredential) {
                Write-Warning "The ProxyCredential parameter is deprecated and should no longer be used as it will be removed in the next major version."
            }
            
            # Note: Production workload warning is handled by Install-AWSToolsModule
            # No need to duplicate the warning here since Update-AWSToolsModule delegates to Install-AWSToolsModule
            
            # 1.0.3-compatible validation: Version and MaximumVersion can be used together
            if ($MaximumVersion -and $Version) {
                # Validate MaximumVersion >= Version (1.0.3 behavior)
                $versionObj = [Version]$Version
                if ($MaximumVersion -lt $versionObj) {
                    $PSCmdlet.ThrowTerminatingError(
                        [System.Management.Automation.ErrorRecord]::new(
                            ([System.ArgumentException]"Parameter MaximumVersion ('$MaximumVersion') cannot be less than Version ('$Version')."),
                            'InvalidParameterCombination',
                            [System.Management.Automation.ErrorCategory]::InvalidArgument,
                            $MaximumVersion
                        )
                    )
                }
            }

            # Resolve version using standard logic
            $resolveVersionParams = @{
                Name = 'AWS.Tools'
                Version = $Version
                Timeout = $Timeout
            }
            if ($Prerelease) {
                $resolveVersionParams.Prerelease = $true
            }
            
            try {
                $Version = Resolve-AWSToolsVersion @resolveVersionParams
            }
            catch {
                $PSCmdlet.ThrowTerminatingError($_)
            }
            
            $targetVersionToInstall = if ($Version) { $Version.ToString() } else { "latest" }
        }
        else {
            # SourceZipPath - version will be determined from zip contents during installation
            $targetVersionToInstall = "from local zip file"
        }
        
        Write-Verbose ("[$($MyInvocation.MyCommand)] ParameterSetName=$($PSCmdlet.ParameterSetName) " +
            "ConfirmPreference=$ConfirmPreference WhatIfPreference=$WhatIfPreference " +
            "VerbosePreference=$VerbosePreference Version=$Version Cleanup=$Cleanup")
    }

    Process {
        $ErrorActionPreference = 'Stop'

        try {
            # Update progress - starting version check and preparation
            Write-Progress -Id 1 -Activity "Update-AWSToolsModule" -Status "Getting installed modules..." -PercentComplete 10
            
            # Get target installation path
            if ($Path) {
                $targetPath = $Path
                Write-Verbose ("[$($MyInvocation.MyCommand)] Using specified installation path: " +
                    "$targetPath")
            }
            else {
                $targetPath = Get-PSModulePath -Scope $Scope
                Write-Verbose ("[$($MyInvocation.MyCommand)] Using $Scope scope installation " +
                    "path: $targetPath")
            }
            
            # Get installed AWS.Tools modules (excluding installer)
            $getAWSToolsModuleParams = @{
                Name = 'AWS.Tools'
            }
            if ($Path) {
                $getAWSToolsModuleParams.Path = $Path
            }
            
            $installedModules = Get-AWSToolsModule @getAWSToolsModuleParams
            
            if (-not $installedModules -or $installedModules.Count -eq 0) {
                Write-Host "No AWS.Tools modules found to update. Use Install-AWSToolsModule to install AWS.Tools modules."
                return
            }
            
            # Get unique module names without regard for version
            $moduleNames = $installedModules | Select-Object -ExpandProperty Name -Unique
            
            Write-Verbose ("[$($MyInvocation.MyCommand)] Found $($moduleNames.Count) installed AWS.Tools modules to update")
            
            # Inform users about the number of modules being updated and that Install-AWSToolsModule is needed for new modules
            Write-Host "Updating $($moduleNames.Count) installed AWS.Tools modules. Note: Use Install-AWSToolsModule to install new AWS modules that may have been released since your last update."
            
            # Build target description for ShouldProcess
            if ($PSCmdlet.ParameterSetName -eq 'ManagedCloudFront' -or $PSCmdlet.ParameterSetName -eq 'Legacy') {
                $versionText = " to version $targetVersionToInstall"
            }
            else {
                $versionText = " from local zip file"
            }
            
            $moduleText = "all installed AWS Tools modules"
            
            $target = "$moduleText$versionText in $targetPath"
            
            # Add WhatIf information message
            if ($WhatIfPreference) {
                Write-Host "What if: Would update $moduleText$versionText in $targetPath"
            }
            
            # Initialize installedVersion variable
            $installedVersion = $null
            
            # Prepare parameters for Install-AWSToolsModule
            $installParams = @{
                Name = $moduleNames
            }
            
            # Add common parameters
            if ($PSBoundParameters.ContainsKey('Cleanup')) {
                $installParams.Cleanup = $Cleanup
            }
            
            if ($PSBoundParameters.ContainsKey('CleanUpLegacyModuleScope')) {
                $installParams.CleanUpLegacyModuleScope = $CleanUpLegacyModuleScope
            }
            
            if ($PSBoundParameters.ContainsKey('Scope')) {
                $installParams.Scope = $Scope
            }
            
            if ($PSBoundParameters.ContainsKey('Path')) {
                $installParams.Path = $Path
            }
            
            if ($PSBoundParameters.ContainsKey('Force')) {
                $installParams.Force = $Force
            }
            
            if ($PSBoundParameters.ContainsKey('Timeout')) {
                $installParams.Timeout = $Timeout
            }
            
            if ($PSBoundParameters.ContainsKey('SkipIntegrityCheck')) {
                $installParams.SkipIntegrityCheck = $SkipIntegrityCheck
            }
            
            # Add parameter set specific parameters
            # Note: Pass the original Version string parameter, not the resolved version object
            # Install-AWSToolsModule will handle version resolution internally
            if (($PSCmdlet.ParameterSetName -eq 'ManagedCloudFront' -or $PSCmdlet.ParameterSetName -eq 'Legacy') -and $PSBoundParameters.ContainsKey('Version')) {
                # Get the original version string from PSBoundParameters
                $installParams.Version = $PSBoundParameters['Version']
            }
            
            if ($PSCmdlet.ParameterSetName -eq 'Legacy' -and $PSBoundParameters.ContainsKey('MaximumVersion')) {
                $installParams.MaximumVersion = $MaximumVersion
            }
            
            if ($PSCmdlet.ParameterSetName -eq 'ManagedCloudFront' -and $PSBoundParameters.ContainsKey('Prerelease')) {
                $installParams.Prerelease = $Prerelease
            }
            
            if ($PSCmdlet.ParameterSetName -eq 'SourceZipPath') {
                $installParams.SourceZipPath = $SourceZipPath
                
                if ($PSBoundParameters.ContainsKey('SourceHashPath')) {
                    $installParams.SourceHashPath = $SourceHashPath
                }
            }
            
            # Always pass WhatIf and Confirm preferences
            if ($PSBoundParameters.ContainsKey('WhatIf')) {
                $installParams.WhatIf = $WhatIfPreference
            }
            
            if ($PSBoundParameters.ContainsKey('Confirm')) {
                $installParams.Confirm = $ConfirmPreference -ne 'None'
            }
            
            # Always call Install-AWSToolsModule, but ShouldProcess will control actual execution
            # through the -WhatIf parameter that's already been added to $installParams
            Write-Verbose ("[$($MyInvocation.MyCommand)] Calling Install-AWSToolsModule with " +
                "parameters: $($installParams.Keys -join ', ')")
            
            # This will display the ShouldProcess prompt if -WhatIf is not specified
            # If -WhatIf is specified, it will be passed to Install-AWSToolsModule
            # Suppress the return value to prevent "True" from being output to the pipeline
            $null = $PSCmdlet.ShouldProcess($target, "Update AWS Tools modules")
            
            # Always call Install-AWSToolsModule - the -WhatIf parameter will be passed through
            # and will control whether Install-AWSToolsModule actually makes changes
            Install-AWSToolsModule @installParams
        }
        catch {
            $PSCmdlet.ThrowTerminatingError($_)
        }
    }

    End {
        # Complete progress bar
        Write-Progress -Id 1 -Activity "Update-AWSToolsModule" -Completed
        
        Write-Verbose "[$($MyInvocation.MyCommand)] End"
    }
}

# SIG # Begin signature block
# MIIutQYJKoZIhvcNAQcCoIIupjCCLqICAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAsbfT4dSDlEEp+
# 1VFMYWMvhpD9Su2y+xZLllefLIpgBKCCE+owggXAMIIEqKADAgECAhAP0bvKeWvX
# +N1MguEKmpYxMA0GCSqGSIb3DQEBCwUAMGwxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xKzApBgNV
# BAMTIkRpZ2lDZXJ0IEhpZ2ggQXNzdXJhbmNlIEVWIFJvb3QgQ0EwHhcNMjIwMTEz
# MDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMM
# RGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQD
# ExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUAA4IC
# DwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Yq3aa
# za57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllV
# cq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT
# +CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd
# 463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+
# EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmgZ92k
# J7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse5w5j
# rubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7
# f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJU
# KSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+wh
# X8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQAB
# o4IBZjCCAWIwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5n
# P+e6mK4cD08wHwYDVR0jBBgwFoAUsT7DaQP4v0cB1JgmGggC72NkK8MwDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMH8GCCsGAQUFBwEBBHMwcTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEkGCCsGAQUFBzAC
# hj1odHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRIaWdoQXNzdXJh
# bmNlRVZSb290Q0EuY3J0MEsGA1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwzLmRp
# Z2ljZXJ0LmNvbS9EaWdpQ2VydEhpZ2hBc3N1cmFuY2VFVlJvb3RDQS5jcmwwHAYD
# VR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcNAQELBQADggEBAEHx
# qRH0DxNHecllao3A7pgEpMbjDPKisedfYk/ak1k2zfIe4R7sD+EbP5HU5A/C5pg0
# /xkPZigfT2IxpCrhKhO61z7H0ZL+q93fqpgzRh9Onr3g7QdG64AupP2uU7SkwaT1
# IY1rzAGt9Rnu15ClMlIr28xzDxj4+87eg3Gn77tRWwR2L62t0+od/P1Tk+WMieNg
# GbngLyOOLFxJy34riDkruQZhiPOuAnZ2dMFkkbiJUZflhX0901emWG4f7vtpYeJa
# 3Cgh6GO6Ps9W7Zrk9wXqyvPsEt84zdp7PiuTUy9cUQBY3pBIowrHC/Q7bVUx8ALM
# R3eWUaNetbxcyEMRoacwggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G
# CSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0zNjA0MjgyMzU5NTla
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
# ODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDVtC9C
# 0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0JAfhS0/TeEP0F9ce
# 2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJrQ5qZ8sU7H/Lvy0da
# E6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhFLqGfLOEYwhrMxe6T
# SXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+FLEikVoQ11vkunKoA
# FdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh3K3kGKDYwSNHR7Oh
# D26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJwZPt4bRc4G/rJvmM
# 1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQayg9Rc9hUZTO1i4F4z
# 8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbIYViY9XwCFjyDKK05
# huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchApQfDVxW0mdmgRQRNY
# mtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRroOBl8ZhzNeDhFMJlP
# /2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IBWTCCAVUwEgYDVR0T
# AQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHwYD
# VR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYY
# aHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2Fj
# ZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNV
# HR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRU
# cnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAEDMAgGBmeBDAEEATAN
# BgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql+Eg08yy25nRm95Ry
# sQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFFUP2cvbaF4HZ+N3HL
# IvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1hmYFW9snjdufE5Btf
# Q/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3RywYFzzDaju4ImhvTnh
# OE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5UbdldAhQfQDN8A+KVssIh
# dXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw8MzK7/0pNVwfiThV
# 9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnPLqR0kq3bPKSchh/j
# wVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatEQOON8BUozu3xGFYH
# Ki8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bnKD+sEq6lLyJsQfmC
# XBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQjiWQ1tygVQK+pKHJ6l
# /aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbqyK+p/pQd52MbOoZW
# eE4wggduMIIFVqADAgECAhADmooc3J4LAjb9FLn2g0iAMA0GCSqGSIb3DQEBCwUA
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
# ODQgMjAyMSBDQTEwHhcNMjUwNjAzMDAwMDAwWhcNMjYwNjAyMjM1OTU5WjCB9jET
# MBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgECEwhEZWxhd2FyZTEd
# MBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNVBAUTBzQxNTI5NTQx
# CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdTZWF0
# dGxlMSIwIAYDVQQKExlBbWF6b24gV2ViIFNlcnZpY2VzLCBJbmMuMRcwFQYDVQQL
# Ew5TREtzIGFuZCBUb29sczEiMCAGA1UEAxMZQW1hem9uIFdlYiBTZXJ2aWNlcywg
# SW5jLjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAKc7ffRFlFB89cU3
# j76EOoK8sFXFunuUhvU6LMeAzgO2fjlMn2l3WJBPZmrHXIicBHmejbJDRgMc+FPd
# oSUR6ZsuVX08txcdv8yHqC+u2BHrj+GRakq7WF148X1PR8kOhkon+qNSh+cxoIHm
# m+Lxg9kZuddkr1m+Fuv79VGj3E9xp4YjbhvVEVbxLs86p812WgVz3eoqvpNXBC0m
# H4eM3FUmNHcDA6ubRR/qh3OGYQHyQs4PeMOGACqcySO+XNRKxMNxIzf+fkQU8cuR
# A8eYl6s0pQ+KlJudGt2psY+5nkTU9TOC99wvRmfuuG+jpG7vEMsuGy26wCOp7hry
# k5kinq/EFImAxdx1WQ3pJuk+rcuSnuOcSieW+zSKEczJOCsbemDbF+9P5Iv0f0nx
# kHPYrrjdgValyxosQENsHeq1HztsE46IbBq2S4I9kGzZcaal5hKT/Yxcom9tBfXq
# oNs1KaL54mC4ddBGx07kAGE0kiHpY5pr4al2lGpOmBH4B5xKmwIDAQABo4ICAjCC
# Af4wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFALy
# CdwoelU9i0FZLXOC5NXeXmVqMD0GA1UdIAQ2MDQwMgYFZ4EMAQMwKTAnBggrBgEF
# BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIH
# gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw
# Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu
# Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB
# Mzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNl
# cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB
# NDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQAD
# ggIBACHYo9QgnoH4+yG1TQT8lxxsYPuy3+FiWd2sZxn/4dwBautbZSLaP5yAKlE0
# o7SFQq5IYV2FVA4c5LwJf3eoF0/8+Bh+SMmAHTteqHcAJ3VK8+VETL/qr9kFQx8j
# cMA3kF2OOaLVWuB5ffEsGCRqCnS2r8r2lCstb/oEqJLyUXkqEDbyJxgkJ0vQp1XD
# agCi68ujhDBwVQPoHmBux2V8TWaOuAT/5kZUJsqwUhBTxYSCKVdIYYkRppaUemJ0
# oULhtxeg1M5zumgLf432qyk6xchohECA1QSXsPflhLZ+eWk3RneSt0fAV/caEBma
# mfVj4OysofDA4bCgZSWFk/16O4PEMsLZhR8FCnFr5lxFYKUgAcnVczo75KSBKp2r
# aoUVAWIw9w1Z1NQljqfZbFUxWCIWLjmXmEbfy3IXeEpvlXidjPVwdqwbleyl0WR/
# ENGBEiy+I4a/ezu+HoA5zK+1b7INjLgxk8m5MnD75k6Pq+XctyTkzEh6F4Whhq7s
# ck16llf7N+i28flIkqzcXuSHxeOZUZb2VNDIcCXiapaxS7cslbP4wafWGEYs2SN3
# +Q398T0fI7uJ4ATp58qdIp6w7Z9PomrVKE0LQMC1P1j9VDiCv7VqnU1cM/2uPpzA
# Lop57Q8mTPr7Mh7nl0/QusIr8V/o6XWwRynumecNqn1oeMlaMYIaITCCGh0CAQEw
# fTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV
# BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hB
# Mzg0IDIwMjEgQ0ExAhADmooc3J4LAjb9FLn2g0iAMA0GCWCGSAFlAwQCAQUAoHww
# EAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYK
# KwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEINNZ/Pvx
# r0RDtCw1EEJpv5QdPb0WfpECwnhfhtA+zUhOMA0GCSqGSIb3DQEBAQUABIIBgEKj
# g5xuew92j2TzydACRk3EiafmnNIUp0U90V6UgKHEK/TZWs/dAyyKZqJmaE9Ubpp9
# 51IdbRBhgDUDT3JkyP9wNfJNe1haZlWRi1alDKU503g0v2mrFps4+QgeH9cEQDSv
# MmiTeIA+soFiM2C0qsW1moA29VxCCvMltfoTC0wBoShWFFEa+gHbMSs6aEtb0ixV
# jEZf6dv8JxWThnm2TZEIzeT+U1TvcnV8tF3be/GXnuf/0ojs5VDYPw8zzDdrjdhT
# DYR1ZQ/XPiLrKaiG9BNwPt4TtrTOpxkFptIdbxb/WWnff3QoBfzsDTN+KKhK+W82
# I+1I6RAX+VoQkSoDwbYaYf2jMwfrfXRQWEWY+kT3P7y0nVNTAMdI/Zp/saXjbYPR
# ouM1Ax6nRDEqMoU8kE3fsZifTrugaWYA4htIqJBg/838iG8PZAR2D7k7CSuU8LOF
# +zO+e3xFDn9+bnuzoAxcASlDntGyZOZafpbr32Neinum06JYFcjZ9QjOKfp4hqGC
# F3cwghdzBgorBgEEAYI3AwMBMYIXYzCCF18GCSqGSIb3DQEHAqCCF1AwghdMAgED
# MQ8wDQYJYIZIAWUDBAIBBQAweAYLKoZIhvcNAQkQAQSgaQRnMGUCAQEGCWCGSAGG
# /WwHATAxMA0GCWCGSAFlAwQCAQUABCDs/ygz4GOSK+GZ5SMFeCvrKGJx1q1R9SOr
# uloyobH0LwIRAOmsxefbxEamSH9ssQeVrt0YDzIwMjYwMjE0MDMxMzU4WqCCEzow
# ggbtMIIE1aADAgECAhAKgO8YS43xBYLRxHanlXRoMA0GCSqGSIb3DQEBCwUAMGkx
# CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4
# RGlnaUNlcnQgVHJ1c3RlZCBHNCBUaW1lU3RhbXBpbmcgUlNBNDA5NiBTSEEyNTYg
# MjAyNSBDQTEwHhcNMjUwNjA0MDAwMDAwWhcNMzYwOTAzMjM1OTU5WjBjMQswCQYD
# VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lD
# ZXJ0IFNIQTI1NiBSU0E0MDk2IFRpbWVzdGFtcCBSZXNwb25kZXIgMjAyNSAxMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EasLRLGntDqrmBWsytXum9R
# /4ZwCgHfyjfMGUIwYzKomd8U1nH7C8Dr0cVMF3BsfAFI54um8+dnxk36+jx0Tb+k
# +87H9WPxNyFPJIDZHhAqlUPt281mHrBbZHqRK71Em3/hCGC5KyyneqiZ7syvFXJ9
# A72wzHpkBaMUNg7MOLxI6E9RaUueHTQKWXymOtRwJXcrcTTPPT2V1D/+cFllESvi
# H8YjoPFvZSjKs3SKO1QNUdFd2adw44wDcKgH+JRJE5Qg0NP3yiSyi5MxgU6cehGH
# r7zou1znOM8odbkqoK+lJ25LCHBSai25CFyD23DZgPfDrJJJK77epTwMP6eKA0kW
# a3osAe8fcpK40uhktzUd/Yk0xUvhDU6lvJukx7jphx40DQt82yepyekl4i0r8OEp
# s/FNO4ahfvAk12hE5FVs9HVVWcO5J4dVmVzix4A77p3awLbr89A90/nWGjXMGn7F
# QhmSlIUDy9Z2hSgctaepZTd0ILIUbWuhKuAeNIeWrzHKYueMJtItnj2Q+aTyLLKL
# M0MheP/9w6CtjuuVHJOVoIJ/DtpJRE7Ce7vMRHoRon4CWIvuiNN1Lk9Y+xZ66laz
# s2kKFSTnnkrT3pXWETTJkhd76CIDBbTRofOsNyEhzZtCGmnQigpFHti58CSmvEyJ
# cAlDVcKacJ+A9/z7eacCAwEAAaOCAZUwggGRMAwGA1UdEwEB/wQCMAAwHQYDVR0O
# BBYEFOQ7/PIx7f391/ORcWMZUEPPYYzoMB8GA1UdIwQYMBaAFO9vU0rp5AZ8esri
# kFb2L9RJ7MtOMA4GA1UdDwEB/wQEAwIHgDAWBgNVHSUBAf8EDDAKBggrBgEFBQcD
# CDCBlQYIKwYBBQUHAQEEgYgwgYUwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
# Z2ljZXJ0LmNvbTBdBggrBgEFBQcwAoZRaHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZEc0VGltZVN0YW1waW5nUlNBNDA5NlNIQTI1NjIw
# MjVDQTEuY3J0MF8GA1UdHwRYMFYwVKBSoFCGTmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydFRydXN0ZWRHNFRpbWVTdGFtcGluZ1JTQTQwOTZTSEEyNTYy
# MDI1Q0ExLmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJ
# KoZIhvcNAQELBQADggIBAGUqrfEcJwS5rmBB7NEIRJ5jQHIh+OT2Ik/bNYulCrVv
# hREafBYF0RkP2AGr181o2YWPoSHz9iZEN/FPsLSTwVQWo2H62yGBvg7ouCODwrx6
# ULj6hYKqdT8wv2UV+Kbz/3ImZlJ7YXwBD9R0oU62PtgxOao872bOySCILdBghQ/Z
# LcdC8cbUUO75ZSpbh1oipOhcUT8lD8QAGB9lctZTTOJM3pHfKBAEcxQFoHlt2s9s
# XoxFizTeHihsQyfFg5fxUFEp7W42fNBVN4ueLaceRf9Cq9ec1v5iQMWTFQa0xNqI
# tH3CPFTG7aEQJmmrJTV3Qhtfparz+BW60OiMEgV5GWoBy4RVPRwqxv7Mk0Sy4QHs
# 7v9y69NBqycz0BZwhB9WOfOu/CIJnzkQTwtSSpGGhLdjnQ4eBpjtP+XB3pQCtv4E
# 5UCSDag6+iX8MmB10nfldPF9SVD7weCC3yXZi/uuhqdwkgVxuiMFzGVFwYbQsiGn
# oa9F5AaAyBjFBtXVLcKtapnMG3VH3EmAp/jsJ3FVF3+d1SVDTmjFjLbNFZUWMXuZ
# yvgLfgyPehwJVxwC+UpX2MSey2ueIu9THFVkT+um1vshETaWyQo8gmBto/m3acaP
# 9QsuLj3FNwFlTxq25+T4QwX9xa6ILs84ZPvmpovq90K8eWyG2N01c4IhSOxqt81n
# MIIGtDCCBJygAwIBAgIQDcesVwX/IZkuQEMiDDpJhjANBgkqhkiG9w0BAQsFADBi
# MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
# d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3Qg
# RzQwHhcNMjUwNTA3MDAwMDAwWhcNMzgwMTE0MjM1OTU5WjBpMQswCQYDVQQGEwJV
# UzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRy
# dXN0ZWQgRzQgVGltZVN0YW1waW5nIFJTQTQwOTYgU0hBMjU2IDIwMjUgQ0ExMIIC
# IjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtHgx0wqYQXK+PEbAHKx126NG
# aHS0URedTa2NDZS1mZaDLFTtQ2oRjzUXMmxCqvkbsDpz4aH+qbxeLho8I6jY3xL1
# IusLopuW2qftJYJaDNs1+JH7Z+QdSKWM06qchUP+AbdJgMQB3h2DZ0Mal5kYp77j
# YMVQXSZH++0trj6Ao+xh/AS7sQRuQL37QXbDhAktVJMQbzIBHYJBYgzWIjk8eDrY
# hXDEpKk7RdoX0M980EpLtlrNyHw0Xm+nt5pnYJU3Gmq6bNMI1I7Gb5IBZK4ivbVC
# iZv7PNBYqHEpNVWC2ZQ8BbfnFRQVESYOszFI2Wv82wnJRfN20VRS3hpLgIR4hjzL
# 0hpoYGk81coWJ+KdPvMvaB0WkE/2qHxJ0ucS638ZxqU14lDnki7CcoKCz6eum5A1
# 9WZQHkqUJfdkDjHkccpL6uoG8pbF0LJAQQZxst7VvwDDjAmSFTUms+wV/FbWBqi7
# fTJnjq3hj0XbQcd8hjj/q8d6ylgxCZSKi17yVp2NL+cnT6Toy+rN+nM8M7LnLqCr
# O2JP3oW//1sfuZDKiDEb1AQ8es9Xr/u6bDTnYCTKIsDq1BtmXUqEG1NqzJKS4kOm
# xkYp2WyODi7vQTCBZtVFJfVZ3j7OgWmnhFr4yUozZtqgPrHRVHhGNKlYzyjlroPx
# ul+bgIspzOwbtmsgY1MCAwEAAaOCAV0wggFZMBIGA1UdEwEB/wQIMAYBAf8CAQAw
# HQYDVR0OBBYEFO9vU0rp5AZ8esrikFb2L9RJ7MtOMB8GA1UdIwQYMBaAFOzX44LS
# cV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF
# BQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp
# Z2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu
# Y29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4oDagNIYy
# aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j
# cmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEB
# CwUAA4ICAQAXzvsWgBz+Bz0RdnEwvb4LyLU0pn/N0IfFiBowf0/Dm1wGc/Do7oVM
# Y2mhXZXjDNJQa8j00DNqhCT3t+s8G0iP5kvN2n7Jd2E4/iEIUBO41P5F448rSYJ5
# 9Ib61eoalhnd6ywFLerycvZTAz40y8S4F3/a+Z1jEMK/DMm/axFSgoR8n6c3nuZB
# 9BfBwAQYK9FHaoq2e26MHvVY9gCDA/JYsq7pGdogP8HRtrYfctSLANEBfHU16r3J
# 05qX3kId+ZOczgj5kjatVB+NdADVZKON/gnZruMvNYY2o1f4MXRJDMdTSlOLh0HC
# n2cQLwQCqjFbqrXuvTPSegOOzr4EWj7PtspIHBldNE2K9i697cvaiIo2p61Ed2p8
# xMJb82Yosn0z4y25xUbI7GIN/TpVfHIqQ6Ku/qjTY6hc3hsXMrS+U0yy+GWqAXam
# 4ToWd2UQ1KYT70kZjE4YtL8Pbzg0c1ugMZyZZd/BdHLiRu7hAWE6bTEm4XYRkA6T
# l4KSFLFk43esaUeqGkH/wyW4N7OigizwJWeukcyIPbAvjSabnf7+Pu0VrFgoiovR
# Diyx3zEdmcif/sYQsfch28bZeUz2rtY/9TCA6TD8dC3JE3rYkrhLULy7Dc90G6e8
# BlqmyIjlgp2+VqsS9/wQD7yFylIz0scmbKvFoW2jNrbM1pD2T7m3XDCCBY0wggR1
# oAMCAQICEA6bGI750C3n79tQ4ghAGFowDQYJKoZIhvcNAQEMBQAwZTELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTEkMCIGA1UEAxMbRGlnaUNlcnQgQXNzdXJlZCBJRCBSb290IENBMB4X
# DTIyMDgwMTAwMDAwMFoXDTMxMTEwOTIzNTk1OVowYjELMAkGA1UEBhMCVVMxFTAT
# BgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEh
# MB8GA1UEAxMYRGlnaUNlcnQgVHJ1c3RlZCBSb290IEc0MIICIjANBgkqhkiG9w0B
# AQEFAAOCAg8AMIICCgKCAgEAv+aQc2jeu+RdSjwwIjBpM+zCpyUuySE98orYWcLh
# Kac9WKt2ms2uexuEDcQwH/MbpDgW61bGl20dq7J58soR0uRf1gU8Ug9SH8aeFaV+
# vp+pVxZZVXKvaJNwwrK6dZlqczKU0RBEEC7fgvMHhOZ0O21x4i0MG+4g1ckgHWMp
# Lc7sXk7Ik/ghYZs06wXGXuxbGrzryc/NrDRAX7F6Zu53yEioZldXn1RYjgwrt0+n
# MNlW7sp7XeOtyU9e5TXnMcvak17cjo+A2raRmECQecN4x7axxLVqGDgDEI3Y1Dek
# LgV9iPWCPhCRcKtVgkEy19sEcypukQF8IUzUvK4bA3VdeGbZOjFEmjNAvwjXWkmk
# wuapoGfdpCe8oU85tRFYF/ckXEaPZPfBaYh2mHY9WV1CdoeJl2l6SPDgohIbZpp0
# yt5LHucOY67m1O+SkjqePdwA5EUlibaaRBkrfsCUtNJhbesz2cXfSwQAzH0clcOP
# 9yGyshG3u3/y1YxwLEFgqrFjGESVGnZifvaAsPvoZKYz0YkH4b235kOkGLimdwHh
# D5QMIR2yVCkliWzlDlJRR3S+Jqy2QXXeeqxfjT/JvNNBERJb5RBQ6zHFynIWIgnf
# fEx1P2PsIV/EIFFrb7GrhotPwtZFX50g/KEexcCPorF+CiaZ9eRpL5gdLfXZqbId
# 5RsCAwEAAaOCATowggE2MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOzX44LS
# cV1kTN8uZz/nupiuHA9PMB8GA1UdIwQYMBaAFEXroq/0ksuCMS1Ri6enIZ3zbcgP
# MA4GA1UdDwEB/wQEAwIBhjB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0
# dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2Vy
# dHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDBFBgNV
# HR8EPjA8MDqgOKA2hjRodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRB
# c3N1cmVkSURSb290Q0EuY3JsMBEGA1UdIAQKMAgwBgYEVR0gADANBgkqhkiG9w0B
# AQwFAAOCAQEAcKC/Q1xV5zhfoKN0Gz22Ftf3v1cHvZqsoYcs7IVeqRq7IviHGmlU
# Iu2kiHdtvRoU9BNKei8ttzjv9P+Aufih9/Jy3iS8UgPITtAq3votVs/59PesMHqa
# i7Je1M/RQ0SbQyHrlnKhSLSZy51PpwYDE3cnRNTnf+hZqPC/Lwum6fI0POz3A8eH
# qNJMQBk1RmppVLC4oVaO7KTVPeix3P0c2PR3WlxUjG/voVA9/HYJaISfb8rbII01
# YBwCA8sgsKxYoA5AY8WYIsGyWfVVa88nq2x2zm8jLfR+cWojayL/ErhULSd+2DrZ
# 8LaHlv1b0VysGMNNn3O3AamfV6peKOK5lDGCA3wwggN4AgEBMH0waTELMAkGA1UE
# BhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2Vy
# dCBUcnVzdGVkIEc0IFRpbWVTdGFtcGluZyBSU0E0MDk2IFNIQTI1NiAyMDI1IENB
# MQIQCoDvGEuN8QWC0cR2p5V0aDANBglghkgBZQMEAgEFAKCB0TAaBgkqhkiG9w0B
# CQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDIxNDAzMTM1OFow
# KwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQU3WIwrIYKLTBr2jixaHlSMAf7QX4wLwYJ
# KoZIhvcNAQkEMSIEIGoKHyvDa75kpKVhqiE51YwLAIPlJm7ABp7mddzPzbnUMDcG
# CyqGSIb3DQEJEAIvMSgwJjAkMCIEIEqgP6Is11yExVyTj4KOZ2ucrsqzP+NtJpqj
# NPFGEQozMA0GCSqGSIb3DQEBAQUABIICAEFOOQ1hTQUN1qQFzQbYZyELBWAvGyk8
# EGJWE4N3Bfwez541SOSimNUHL2xlaFoCVXIy0oSDPL/ClJm+3YqpTM2fUkIc7kym
# PD9h7eRYlgQrSQhZRq+xRcY48NP63FNWSt7CZjB1ekBnFSzgAr1bsIHEY6j4kT9y
# NDzS38lO4t5vxl926+Yb4X7PPGx7HmHxTxmi0bYDlv+fA2Rk8Lu6Z/A4O1dws5Q8
# oXQXhkfZlLFRLxVv1nco4RrTKcbdO6qcu1jlPjivcV1DYTY8O2peKHnzIE0otj9C
# J5WSI7r7Psf9ySsmX6jDF1iRS0fg6S1RSKKF8qcaUz5IHfZJ3C1H0nI7mpcQ/sfX
# GHvOsYt9d//SLnLWAauEjFivrPfsll5EA/eoffsI9JJgJNo8jJesAvU6WYpie8cE
# +Tow5FtVRV3lmpLMlpF2qw0MecarZK9LC6JWkWHLbxhdP0U+w2VMTDr+5BzsJ5wb
# mTQFr/PruhrV9ufVf0l+thx+L4WMIP50uVaAaCzF6zjXRAPks8qY7n5aRrBcuqpw
# vPqRdPOCuvCwipSLwm8bTFWVXL45shpnRwPHDt9smrWT2M6vzOUuc/co1XvqNqlm
# Ez3UcIozITCvY/GeEgwpTV1pwkQhsit+Jl10aoPC4zSsQ3ZEOrJl0T27kLRmrrxd
# Pv2qkz4+kt6R
# SIG # End signature block