param(
    [Parameter(Mandatory = $true)]
    [string]$Action,

    [Parameter(ValueFromRemainingArguments = $true)]
    [string[]]$Arguments
)

function Exit-WithUsage {
    Write-Error "Usage: upgradeClientHelper.ps1 <Action> [arguments]"
    exit 64
}

function Get-Argument {
    param(
        [int]$Index,
        [string]$Name
    )

    if ($null -eq $Arguments -or $Arguments.Length -le $Index -or [string]::IsNullOrEmpty($Arguments[$Index])) {
        Write-Error "Missing argument: $Name"
        exit 64
    }

    return $Arguments[$Index]
}

function Write-UpgradeLog {
    param(
        [string]$Message
    )

    $path = $null
    if (![string]::IsNullOrEmpty($env:FW_UPGRADE_HELPER_LOG)) {
        $path = $env:FW_UPGRADE_HELPER_LOG
    } elseif (![string]::IsNullOrEmpty($env:FW_UPGRADE_LOG)) {
        $path = $env:FW_UPGRADE_LOG
    }
    if ([string]::IsNullOrEmpty($path)) {
        return
    }

    $stamp = Get-Date -Format 'yyyy-MM-dd HH:mm:ss.fff'
    $line = '"{0} == PS helper: {1}"' -f $stamp, $Message
    try {
        Add-Content -Path $path -Value $line -ErrorAction SilentlyContinue
    } catch {
    }
}

function Trim-Log {
    $path = Get-Argument 0 'Path'
    $maxBytes = [int64](Get-Argument 1 'MaxBytes')

    if (Test-Path $path) {
        $item = Get-Item $path
        if ($item.Length -gt $maxBytes) {
            $bytes = [System.IO.File]::ReadAllBytes($path)
            [System.IO.File]::WriteAllBytes($path, $bytes[($bytes.Length - $maxBytes)..($bytes.Length - 1)])
        }
    }
}

function Test-LockStale {
    $path = Get-Argument 0 'Path'
    $maxAgeMinutes = [int](Get-Argument 1 'MaxAgeMinutes')

    if (!(Test-Path $path)) {
        exit 0
    }

    $heartbeat = Join-Path $path 'heartbeat.txt'
    $created = Join-Path $path 'created.txt'

    if (Test-Path $heartbeat) {
        $stamp = (Get-Item $heartbeat).LastWriteTime
    } elseif (Test-Path $created) {
        $stamp = (Get-Item $created).LastWriteTime
    } else {
        $stamp = (Get-Item $path).LastWriteTime
    }

    $age = ((Get-Date) - $stamp).TotalMinutes
    if ($age -gt $maxAgeMinutes) {
        exit 0
    }

    exit 1
}

function Test-MsiAvailable {
    $created = $false
    $mutex = $null

    try {
        $mutex = New-Object System.Threading.Mutex($true, 'Global\_MSIExecute', [ref]$created)
        if ($created) {
            Write-UpgradeLog 'Windows Installer mutex is available.'
            $mutex.ReleaseMutex()
            exit 0
        }

        Write-UpgradeLog 'Windows Installer mutex is busy.'
        exit 1
    } catch {
        Write-UpgradeLog ('Windows Installer mutex check failed: {0}' -f $_.Exception.Message)
        exit 1
    } finally {
        if ($mutex) {
            $mutex.Dispose()
        }
    }
}

function Read-MsiVersion {
    $path = Get-Argument 0 'MsiPath'

    try {
        if (Test-Path $path) {
            $item = Get-Item $path
            Write-UpgradeLog ('Reading MSI ProductVersion from {0}; size {1} bytes.' -f $path, $item.Length)
        } else {
            Write-UpgradeLog ('MSI path does not exist while reading ProductVersion: {0}' -f $path)
        }

        $installer = New-Object -ComObject WindowsInstaller.Installer
        $database = $installer.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $null, $installer, @($path, 0))
        $view = $database.OpenView("SELECT Value FROM Property WHERE Property = 'ProductVersion'")
        $view.Execute()
        $record = $view.Fetch()
        if ($record) {
            $version = $record.StringData(1)
            Write-UpgradeLog ('MSI ProductVersion read successfully: {0}' -f $version)
            $version
            exit 0
        }

        Write-UpgradeLog ('MSI ProductVersion record was not found in {0}.' -f $path)
        exit 1
    } catch {
        Write-UpgradeLog ('MSI ProductVersion read failed: {0}' -f $_.Exception.Message)
        Write-Error $_.Exception.Message
        exit 1
    }
}

function Get-PackageField {
    param(
        [string]$PackageName,
        [string]$FieldName
    )

    $package = Get-Package -Name $PackageName -ErrorAction SilentlyContinue
    if ($package) {
        Write-UpgradeLog ('Found package: {0}; version {1}' -f $package.Name, $package.Version)
        $package.$FieldName
        exit 0
    }

    Write-UpgradeLog ('Package not found by Get-Package: {0}' -f $PackageName)

    $application = Get-InstalledApplication $PackageName
    if ($application) {
        Write-UpgradeLog ('Found application in uninstall registry: {0}; version {1}; key {2}' -f $application.DisplayName, $application.DisplayVersion, $application.PSChildName)
        if ($FieldName -eq 'Name') {
            $application.DisplayName
        } elseif ($FieldName -eq 'Version') {
            $application.DisplayVersion
        } else {
            $application.$FieldName
        }
        exit 0
    }

    if ($PackageName -eq 'FileWave Client') {
        $fwcldVersion = Get-FwcldVersion
        if ($fwcldVersion) {
            Write-UpgradeLog ('Found FileWave Client version from installed fwcld.exe: {0}' -f $fwcldVersion)
            if ($FieldName -eq 'Name') {
                'FileWave Client'
            } elseif ($FieldName -eq 'Version') {
                $fwcldVersion
            } else {
                $fwcldVersion
            }
            exit 0
        }
    }

    Write-UpgradeLog ('Application not found in uninstall registry: {0}' -f $PackageName)
    exit 1
}

function Test-InstalledVersion {
    $expected = Get-Argument 0 'ExpectedVersion'
    $version = (Get-Package -Name 'FileWave Client' -ErrorAction SilentlyContinue).Version

    if (!$version) {
        Write-UpgradeLog 'Installed FileWave Client version was not found by Get-Package.'
        $application = Get-InstalledApplication 'FileWave Client'
        if ($application) {
            Write-UpgradeLog ('Found installed FileWave Client in uninstall registry; version {0}; key {1}' -f $application.DisplayVersion, $application.PSChildName)
            $version = $application.DisplayVersion
        }
    }

    if (!$version) {
        $version = Get-FwcldVersion
        if ($version) {
            Write-UpgradeLog ('Found installed FileWave Client version from installed fwcld.exe: {0}' -f $version)
        }
    }

    if (!$version) {
        Write-UpgradeLog 'Installed FileWave Client version was not found by Get-Package, uninstall registry, or fwcld.exe -V.'
        exit 1
    }

    $version

    if (Test-VersionMatches $version $expected) {
        Write-UpgradeLog ('Installed FileWave Client version {0} matches expected version {1}.' -f $version, $expected)
        exit 0
    }

    Write-UpgradeLog ('Installed FileWave Client version {0} does not match expected version {1}.' -f $version, $expected)
    exit 2
}

function Test-VersionMatches {
    param(
        [string]$Version,
        [string]$Expected
    )

    if ($Version -eq $Expected) {
        return $true
    }

    try {
        $actualVersion = [version]$Version
        $expectedVersion = [version]$Expected

        if ($actualVersion -eq $expectedVersion) {
            return $true
        }

        if ($expectedVersion.Revision -lt 0) {
            return $actualVersion.Major -eq $expectedVersion.Major -and
                $actualVersion.Minor -eq $expectedVersion.Minor -and
                $actualVersion.Build -eq $expectedVersion.Build
        }
    } catch {
    }

    return $false
}

function Get-InstalledApplication {
    param(
        [string]$DisplayName
    )

    $paths = @(
        'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
        'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
    )

    Get-ItemProperty $paths -ErrorAction SilentlyContinue |
        Where-Object { $_.DisplayName -eq $DisplayName } |
        Select-Object -First 1
}

function Get-FwcldVersion {
    $paths = Get-FwcldPaths

    foreach ($path in $paths) {
        if (!(Test-Path $path)) {
            Write-UpgradeLog ('fwcld.exe candidate not found: {0}' -f $path)
            continue
        }

        $fileVersion = Get-FwcldFileVersion $path
        if ($fileVersion) {
            return $fileVersion
        }

        try {
            $output = & $path -V 2>&1
            $exitCode = $LASTEXITCODE
            Write-UpgradeLog ('fwcld.exe -V at {0} exited with {1}; output: {2}' -f $path, $exitCode, ($output -join ' '))
            if ($exitCode -ne 0) {
                continue
            }

            foreach ($line in $output) {
                if ($line -match '\b(\d+(?:\.\d+){1,3})\b') {
                    return $Matches[1]
                }
            }
        } catch {
            Write-UpgradeLog ('fwcld.exe -V failed at {0}: {1}' -f $path, $_.Exception.Message)
        }
    }

    return $null
}

function Get-FwcldPaths {
    @(
        'C:\Program Files\FileWave\client\fwcld.exe',
        'C:\Program Files\FileWave\fwcld.exe',
        'C:\Program Files (x86)\FileWave\fwcld.exe'
    )
}

function Get-FwcldFileVersion {
    param(
        [string]$Path
    )

    try {
        $versionInfo = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($Path)
        foreach ($candidate in @($versionInfo.ProductVersion, $versionInfo.FileVersion)) {
            if ([string]::IsNullOrWhiteSpace($candidate)) {
                continue
            }

            Write-UpgradeLog ('fwcld.exe version resource at {0}: {1}' -f $Path, $candidate)
            if ($candidate -match '\b(\d+(?:\.\d+){1,3})\b') {
                return $Matches[1]
            }
        }
    } catch {
        Write-UpgradeLog ('Could not read fwcld.exe version resource at {0}: {1}' -f $Path, $_.Exception.Message)
    }

    return $null
}

function Test-MsiLogMissingSource {
    $path = Get-Argument 0 'MsiLogPath'

    if (!(Test-Path $path)) {
        exit 1
    }

    $patterns = @(
        '\b1706\b',
        'no valid source',
        'installation source',
        'source for this product',
        'network resource',
        'SourceList',
        'cannot find.*\.msi',
        'use source',
        'failed to resolve source'
    )

    $text = Get-Content -Path $path -Raw -ErrorAction SilentlyContinue
    foreach ($pattern in $patterns) {
        if ($text -match $pattern) {
            Write-UpgradeLog ('MSI log missing-source pattern matched: {0}' -f $pattern)
            exit 0
        }
    }

    Write-UpgradeLog 'MSI log did not contain missing-source patterns.'
    exit 1
}

function Scrub-FileWaveMsiRegistration {
    $paths = @(
        'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\*',
        'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*'
    )

    $apps = Get-ItemProperty $paths -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like 'FileWave Client*' }
    foreach ($app in $apps) {
        $code = $app.PSChildName -replace '[-{}]', ''
        if ($code.Length -eq 32) {
            $packedCode = -join ($code[7..0] + $code[11..8] + $code[15..12] + $code[17, 16, 19, 18, 21, 20, 23, 22, 25, 24, 27, 26, 29, 28, 31, 30])
            Remove-Item "HKLM:\SOFTWARE\Classes\Installer\Products\$packedCode" -Recurse -Force -ErrorAction SilentlyContinue
            Remove-Item $app.PSPath -Recurse -Force -ErrorAction SilentlyContinue
            Write-Output "Scrubbed old MSI registration for $($app.DisplayName)"
        }
    }
}

function Count-Lines {
    $path = Get-Argument 0 'Path'

    if (Test-Path $path) {
        (Get-Content $path).Length
    } else {
        0
    }
}

if ($Action -ne 'TrimLog') {
    $argumentCount = 0
    if ($null -ne $Arguments) {
        $argumentCount = $Arguments.Length
    }
    Write-UpgradeLog ('Action {0} started with {1} argument(s).' -f $Action, $argumentCount)
}

switch ($Action) {
    'TrimLog' {
        Trim-Log
        exit 0
    }
    'IsLockStale' {
        Test-LockStale
    }
    'MsiAvailable' {
        Test-MsiAvailable
    }
    'ReadMsiVersion' {
        Read-MsiVersion
    }
    'GetPackageName' {
        $name = Get-Argument 0 'PackageName'
        Get-PackageField $name 'Name'
    }
    'GetPackageVersion' {
        $name = Get-Argument 0 'PackageName'
        Get-PackageField $name 'Version'
    }
    'VerifyInstalledVersion' {
        Test-InstalledVersion
    }
    'MsiLogMissingSource' {
        Test-MsiLogMissingSource
    }
    'ScrubFileWaveMsiRegistration' {
        Scrub-FileWaveMsiRegistration
        exit 0
    }
    'CountLines' {
        Count-Lines
        exit 0
    }
    default {
        Exit-WithUsage
    }
}

# SIG # Begin signature block
# MII54AYJKoZIhvcNAQcCoII50TCCOc0CAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCpZO/aMx45OVRe
# /suJ4xj1Ey9VrwqGJenyf4BmGwSrUqCCIgQwggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggavMIIEl6ADAgECAhMzAALlxAIH
# ZEJ2kE6HAAAAAuXEMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBFT0MgQ0EgMDQwHhcNMjYwNzA3MDIwNjM2WhcNMjYwNzEw
# MDIwNjM2WjByMQswCQYDVQQGEwJVUzEQMA4GA1UECBMHSW5kaWFuYTEVMBMGA1UE
# BxMMSW5kaWFuYXBvbGlzMRwwGgYDVQQKExNGaWxlV2F2ZSAoVVNBKSBJbmMuMRww
# GgYDVQQDExNGaWxlV2F2ZSAoVVNBKSBJbmMuMIIBojANBgkqhkiG9w0BAQEFAAOC
# AY8AMIIBigKCAYEAnnLCsjp/OwISy1pjgT7pwaQ/5RnuZk+m5ZskD8gy1gaGgOWc
# NOtvj+BXfQGtw3z+vkdQw5KiTlHpNGXWgyXvG2qcTNwDLH2gVQUyhQ/7PUqDT4Ug
# cVNl39cCw6DPBY6tnFuFhoaasqp7zxFREae9vYNEBU7klFshMqc7gAJ4SDUYQF8Y
# kpphIS601L3asmpCy0jHZuX3vGgJkjAUBlBrm0bMjyrSk9Kr3LXzv+RDEc1E34iY
# ziA9EGpgHl7WA+oZpihVGSNduUka85InzYsERv/2nfSnZkio1z2CPdKabgicJlAA
# bMJuatDzzKk6IL8apiKs0JGQlHF/FMSbrCAW/3xSoJptqkHOl6noLmyg8T0XwMv8
# +HPPYnpgueN4tJ7/r9FcQOkIR3h8GodloZhqGuQZnzgHj/jqzMZEQFbjAkPLxYSc
# t1VU5O17/WkTV5ffmUozTUl8SqyEG4LraD+1+7f2JvnzyvlLx+VmqwbL2axItP10
# q1p/jOkVxolUNXZDAgMBAAGjggHUMIIB0DAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB
# /wQEAwIHgDA7BgNVHSUENDAyBgorBgEEAYI3YQEABggrBgEFBQcDAwYaKwYBBAGC
# N2G8ycRpgvKdiAWCxsqSJMvg7XMwHQYDVR0OBBYEFPRmRXZOwX2YOUwYT3yahzio
# rJjvMB8GA1UdIwQYMBaAFJrxVHd1DIcWN0agrN55+fR/wXjpMGcGA1UdHwRgMF4w
# XKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jv
# c29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIwMDQuY3JsMHQG
# CCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZYaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ1Ml
# MjBFT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
# aXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4ICAQBH3yxaIamfxsPWbPPWdZ9TaWns
# fLrhbjfGLH4N6cYdmmJbAOAcbtOIAnIkAMfEdqKE3BGJixatYLGcqK8j1L5MmdmU
# V++sU4GU6xNhoTghnZESRd9Fll2vxX0qLZ0qnHvYQRv2RZsuXvxu8ngOwMiwy0M1
# JSk09Iguq3I3RsdYUNytksNE7yIl+kGQKZBAeH+rkFXLNSCD16FprLBaRi4nNITD
# SSjkWTdN7z9BFfiBgBG8aEfgw5Ns09FxzEJxaqs0DjVfGgl+gBbJJSS5c3bztqCX
# nWRSspU/eXbkfXIAvnJMgRzBO5+6jMYCi7/cgG2XuBRxHqmQFNLcvnasvtbX1Ctc
# ynz5ojuhWXL+JouAW9MUhhnZRKLWFFIVdJTcQ/2NBmYeK/aqtyLeeXrcDZ8vVgka
# ISRBoqJtVD5+BAZ5LppObuEUA5jCkde+pacN9xc/DUavjJXSEQI7B/AFjhDijMdK
# HSRyrcQNWYyVSRZZ3ibRhB4ld5wCa9PwaqRMqcnZlMvlDvSZEmK/hXa/5dDGtdiv
# i52raVgK0xfxFgiypTze8btByxmeVT0yBW2od96lQFct+e0tbOsrUKBZSaXiQpxm
# M2AFYNJCrCapaRwANUVJpkoj3cBmXjgOvyEWtRdL6QzcJ7jf77HlPC2/CqkV9YSH
# l8lfceSwEuyF3ljbxDCCBq8wggSXoAMCAQICEzMAAuXEAgdkQnaQTocAAAAC5cQw
# DQYJKoZIhvcNAQEMBQAwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m
# dCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENT
# IEVPQyBDQSAwNDAeFw0yNjA3MDcwMjA2MzZaFw0yNjA3MTAwMjA2MzZaMHIxCzAJ
# BgNVBAYTAlVTMRAwDgYDVQQIEwdJbmRpYW5hMRUwEwYDVQQHEwxJbmRpYW5hcG9s
# aXMxHDAaBgNVBAoTE0ZpbGVXYXZlIChVU0EpIEluYy4xHDAaBgNVBAMTE0ZpbGVX
# YXZlIChVU0EpIEluYy4wggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCe
# csKyOn87AhLLWmOBPunBpD/lGe5mT6blmyQPyDLWBoaA5Zw062+P4Fd9Aa3DfP6+
# R1DDkqJOUek0ZdaDJe8bapxM3AMsfaBVBTKFD/s9SoNPhSBxU2Xf1wLDoM8Fjq2c
# W4WGhpqyqnvPEVERp729g0QFTuSUWyEypzuAAnhINRhAXxiSmmEhLrTUvdqyakLL
# SMdm5fe8aAmSMBQGUGubRsyPKtKT0qvctfO/5EMRzUTfiJjOID0QamAeXtYD6hmm
# KFUZI125SRrzkifNiwRG//ad9KdmSKjXPYI90ppuCJwmUABswm5q0PPMqTogvxqm
# IqzQkZCUcX8UxJusIBb/fFKgmm2qQc6XqegubKDxPRfAy/z4c89iemC543i0nv+v
# 0VxA6QhHeHwah2WhmGoa5BmfOAeP+OrMxkRAVuMCQ8vFhJy3VVTk7Xv9aRNXl9+Z
# SjNNSXxKrIQbgutoP7X7t/Ym+fPK+UvH5WarBsvZrEi0/XSrWn+M6RXGiVQ1dkMC
# AwEAAaOCAdQwggHQMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMDsGA1Ud
# JQQ0MDIGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhorBgEEAYI3YbzJxGmC8p2IBYLG
# ypIky+DtczAdBgNVHQ4EFgQU9GZFdk7BfZg5TBhPfJqHOKismO8wHwYDVR0jBBgw
# FoAUmvFUd3UMhxY3RqCs3nn59H/BeOkwZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDov
# L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBW
# ZXJpZmllZCUyMENTJTIwRU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUHAQEEaDBm
# MGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2Nl
# cnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEVPQyUyMENBJTIw
# MDQuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wDQYJ
# KoZIhvcNAQEMBQADggIBAEffLFohqZ/Gw9Zs89Z1n1Npaex8uuFuN8Ysfg3pxh2a
# YlsA4Bxu04gCciQAx8R2ooTcEYmLFq1gsZyoryPUvkyZ2ZRX76xTgZTrE2GhOCGd
# kRJF30WWXa/FfSotnSqce9hBG/ZFmy5e/G7yeA7AyLDLQzUlKTT0iC6rcjdGx1hQ
# 3K2Sw0TvIiX6QZApkEB4f6uQVcs1IIPXoWmssFpGLic0hMNJKORZN03vP0EV+IGA
# EbxoR+DDk2zT0XHMQnFqqzQONV8aCX6AFsklJLlzdvO2oJedZFKylT95duR9cgC+
# ckyBHME7n7qMxgKLv9yAbZe4FHEeqZAU0ty+dqy+1tfUK1zKfPmiO6FZcv4mi4Bb
# 0xSGGdlEotYUUhV0lNxD/Y0GZh4r9qq3It55etwNny9WCRohJEGiom1UPn4EBnku
# mk5u4RQDmMKR176lpw33Fz8NRq+MldIRAjsH8AWOEOKMx0odJHKtxA1ZjJVJFlne
# JtGEHiV3nAJr0/BqpEypydmUy+UO9JkSYr+Fdr/l0Ma12K+LnatpWArTF/EWCLKl
# PN7xu0HLGZ5VPTIFbah33qVAVy357S1s6ytQoFlJpeJCnGYzYAVg0kKsJqlpHAA1
# RUmmSiPdwGZeOA6/IRa1F0vpDNwnuN/vseU8Lb8KqRX1hIeXyV9x5LAS7IXeWNvE
# MIIHKDCCBRCgAwIBAgITMwAAABcnRQkLi4evxgAAAAAAFzANBgkqhkiG9w0BAQwF
# ADBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u
# MTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ29kZSBTaWduaW5nIFBD
# QSAyMDIxMB4XDTI2MDMyNjE4MTEzMVoXDTMxMDMyNjE4MTEzMVowWjELMAkGA1UE
# BhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjErMCkGA1UEAxMi
# TWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVPQyBDQSAwNDCCAiIwDQYJKoZIhvcN
# AQEBBQADggIPADCCAgoCggIBAILHZP4DD2YqAZXMn5OrQ8yfj0beK0ixilvHsKUt
# JEcV7VEQt09xnWwipY6GxJ/LrLKoRqkKUYf0l70VcDVxCBm++lBuSD5AidUuv/QQ
# +tUELCsz3qVtEjY/E14LBcb0uzJbaEbopCCKe0OY0IGjjOkMivfvumVV1KWJmbpQ
# HusfCa8GdHTZBPq2euparaKHMHqVElVMTO6HQ5p/Mgx4ydgzT7H697kQ4sd1+Kr4
# deIx/0lvtgse1iDIciIkDttNYuoVIsZpOHtmVvFuwtcD3U46ugSm/s6PMW67e2Sk
# L0V+UDgOnYS6rj6o+bFSp8an5NfSAtEmn00k7PMguNxMPeuQUUVvFS/XHKDpq+K8
# UMu2goGEzZN3Xfy6YTWk05pxqe5Ji08ch5AeYHqFoWLrhq8sEvBNMCb9FuK3zrRw
# VdHvbCr7lCHiFKZ7MeopcRFY+lUF74A+sngipz5o94yYiSgJZlA7bYecs0VQVJeO
# LDIhuC+Uf8sgAkSpNp9PPENmAqGUtTvOvqDCyrdY2lxhAjo27FafCHdVUMPIXuid
# CoqzkuXtuV5U3RjxW+qATjmmnIFu/Co39G6fl8wIJHPdpgxjSRmEo73Z4/u3jMep
# nltAwCBnS0TY/P+NvTCLKRQX89yg6qqTe9UuJENiy3q93cYQw3MylRS9By8Ebjr4
# I4hvAgMBAAGjggHcMIIB2DAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMC
# AQAwHQYDVR0OBBYEFJrxVHd1DIcWN0agrN55+fR/wXjpMFQGA1UdIARNMEswSQYE
# VR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD
# AEEwEgYDVR0TAQH/BAgwBgEB/wIBADAfBgNVHSMEGDAWgBTZQSmwDw9jbO9p1/XN
# KZ6kSGow5jBwBgNVHR8EaTBnMGWgY6Bhhl9odHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUy
# MFNpZ25pbmclMjBQQ0ElMjAyMDIxLmNybDB9BggrBgEFBQcBAQRxMG8wbQYIKwYB
# BQUHMAKGYWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWlj
# cm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENBJTIw
# MjAyMS5jcnQwDQYJKoZIhvcNAQEMBQADggIBAJB1Whn9TSbfyXaIppkWWzFq+m2m
# g4vJpHVr1krZNIXWQ6cUmEwOx7oqQKCy96iISNdNVzpe3zogoefvo2TmpkHQFe/a
# IxFDaCIAmZi9lyay2hmp8HYzcp3nCcmFQk60X9voeypJ6VjqeGsXTrOivWUOYNCL
# EFlwsH3NHX5EpCyjWN6Q3Fi5ST4do3eTVLnuqTQ7/9huTBTSYQsJbTg3m8gIxnHl
# Plzs2r/u4u9tWEJ0Pt/ZtmkDhTu86QHWigHgBoRHemOgnQxp3ksXKLo1r2n1m7+G
# st46NTkUi1LljGyq+V9fEBOEnXvoKaRiy0pGbK1IdnsmEpF9Xp71l+2T84Nv8Iri
# kZUBWqw5/jffttAas4ccJDci832CadS4OHwl29uF6hY8fEg3UYHmxSJjnzi1c3vF
# 0PwsJKxGom9Dx7treBlZOBWK6BGzVBar43Qb02N7okeU3UKMl6GB74fk8aS0mNr6
# O4YSvQ/66RKRwvqppnEVBOHdIMjvWW9b77duX8TN3pI7w31R3D6t6jK9EcLJOJKy
# mVlBIFNUl0+ajeoKka7IcW0+jkIGff8U9OKol3cz0Eeiop3Qb0qaDp8ZwC8XCcs1
# cDaSi/vbvBGWMvfKl+ovuIBP9ienG6XpHAdGVw5/10MaDVFG+v3Y0/8JZVchvryB
# 5Hau9T82x+a2MXXAMIIHnjCCBYagAwIBAgITMwAAAAeHozSje6WOHAAAAAAABzAN
# BgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0
# IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZp
# Y2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjEwNDAx
# MjAwNTIwWhcNMzYwNDAxMjAxNTIwWjBjMQswCQYDVQQGEwJVUzEeMBwGA1UEChMV
# TWljcm9zb2Z0IENvcnBvcmF0aW9uMTQwMgYDVQQDEytNaWNyb3NvZnQgSUQgVmVy
# aWZpZWQgQ29kZSBTaWduaW5nIFBDQSAyMDIxMIICIjANBgkqhkiG9w0BAQEFAAOC
# Ag8AMIICCgKCAgEAsvDArxmIKOLdVHpMSWxpCFUJtFL/ekr4weslKPdnF3cpTeuV
# 8veqtmKVgok2rO0D05BpyvUDCg1wdsoEtuxACEGcgHfjPF/nZsOkg7c0mV8hpMT/
# GvB4uhDvWXMIeQPsDgCzUGzTvoi76YDpxDOxhgf8JuXWJzBDoLrmtThX01CE1TCC
# vH2sZD/+Hz3RDwl2MsvDSdX5rJDYVuR3bjaj2QfzZFmwfccTKqMAHlrz4B7ac8g9
# zyxlTpkTuJGtFnLBGasoOnn5NyYlf0xF9/bjVRo4Gzg2Yc7KR7yhTVNiuTGH5h4e
# B9ajm1OCShIyhrKqgOkc4smz6obxO+HxKeJ9bYmPf6KLXVNLz8UaeARo0BatvJ82
# sLr2gqlFBdj1sYfqOf00Qm/3B4XGFPDK/H04kteZEZsBRc3VT2d/iVd7OTLpSH9y
# CORV3oIZQB/Qr4nD4YT/lWkhVtw2v2s0TnRJubL/hFMIQa86rcaGMhNsJrhysLNN
# MeBhiMezU1s5zpusf54qlYu2v5sZ5zL0KvBDLHtL8F9gn6jOy3v7Jm0bbBHjrW5y
# QW7S36ALAt03QDpwW1JG1Hxu/FUXJbBO2AwwVG4Fre+ZQ5Od8ouwt59FpBxVOBGf
# N4vN2m3fZx1gqn52GvaiBz6ozorgIEjn+PhUXILhAV5Q/ZgCJ0u2+ldFGjcCAwEA
# AaOCAjUwggIxMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEEAwIBADAdBgNV
# HQ4EFgQU2UEpsA8PY2zvadf1zSmepEhqMOYwVAYDVR0gBE0wSzBJBgRVHSAAMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAPBgNV
# HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFMh+0mqFKhvKGZgEByfPUBBPaKiiMIGE
# BgNVHR8EfTB7MHmgd6B1hnNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3Bz
# L2NybC9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3Ql
# MjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3JsMIHDBggrBgEFBQcB
# AQSBtjCBszCBgQYIKwYBBQUHMAKGdWh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
# a2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24l
# MjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNydDAtBggr
# BgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWljcm9zb2Z0LmNvbS9vY3NwMA0GCSqG
# SIb3DQEBDAUAA4ICAQB/JSqe/tSr6t1mCttXI0y6XmyQ41uGWzl9xw+WYhvOL47B
# V09Dgfnm/tU4ieeZ7NAR5bguorTCNr58HOcA1tcsHQqt0wJsdClsu8bpQD9e/al+
# lUgTUJEV80Xhco7xdgRrehbyhUf4pkeAhBEjABvIUpD2LKPho5Z4DPCT5/0TlK02
# nlPwUbv9URREhVYCtsDM+31OFU3fDV8BmQXv5hT2RurVsJHZgP4y26dJDVF+3pcb
# tvh7R6NEDuYHYihfmE2HdQRq5jRvLE1Eb59PYwISFCX2DaLZ+zpU4bX0I16ntKq4
# poGOFaaKtjIA1vRElItaOKcwtc04CBrXSfyL2Op6mvNIxTk4OaswIkTXbFL81ZKG
# D+24uMCwo/pLNhn7VHLfnxlMVzHQVL+bHa9KhTyzwdG/L6uderJQn0cGpLQMStUu
# NDArxW2wF16QGZ1NtBWgKA8Kqv48M8HfFqNifN6+zt6J0GwzvU8g0rYGgTZR8zDE
# IJfeZxwWDHpSxB5FJ1VVU1LIAtB7o9PXbjXzGifaIMYTzU4YKt4vMNwwBmetQDHh
# dAtTPplOXrnI9SI6HeTtjDD3iUN/7ygbahmYOHk7VB7fwT4ze+ErCbMh6gHV1UuX
# PiLciloNxH6K4aMfZN1oLVk6YFeIJEokuPgNPa6EnTiOL60cPqfny+Fq8UiuZzGC
# FzIwghcuAgEBMHEwWjELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBD
# b3Jwb3JhdGlvbjErMCkGA1UEAxMiTWljcm9zb2Z0IElEIFZlcmlmaWVkIENTIEVP
# QyBDQSAwNAITMwAC5cQCB2RCdpBOhwAAAALlxDANBglghkgBZQMEAgEFAKBeMBAG
# CisGAQQBgjcCAQwxAjAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMC8GCSqG
# SIb3DQEJBDEiBCBf2PfXr4F8otV61m8l5wEWboOHsuL9Ii/02TwWuiG24TANBgkq
# hkiG9w0BAQEFAASCAYBl+ljjvKPXOhOm9eINxjGuFydv3iwNjhQaOkx837jAIh25
# 7qQW2ThzwvCXdkf5wE2puFy+F7n6hmBk3Yuco4wdNxS3lvLd+lSFr/MjOGGmffDV
# 4oCdCJHe1Ktuhhh4OuQxYa8eJu15pUaV2sGg4SLZRltBP/7XU0hFkfe6v3oEtR8K
# CUwNeAkuG43FPiNRw10bLYf3+IwH0YvTJv/9gcTSb8XV0SwOW9FxabglWfdY7InB
# EJ9pnTtVU4uQTYv9/EQ3fMqcID66D+9da49mKAfWzBhbpAinaw6jV5pVu0DzHBJ6
# XmqY9s8GYU+BrQ+ruB7Xy+9MH/FPNAQHteMPUuums9OSixvW8c9uBfr+z7C1wTfs
# YcX4L2Nio1Ys79Auc79A7VVJ9kbyHsHSHFpTtv3AcdjRpPEQ75rnC7JnCf8sXrcY
# MuQ9z7YZ+DOzJ94OjhmpvoM2mgbbBnUbxrKf3jZ5XOkqosewQ2pvdDnm1XWkA3Z9
# wYDMpHqfkQ0Tt+1JqyahghSyMIIUrgYKKwYBBAGCNwMDATGCFJ4wghSaBgkqhkiG
# 9w0BBwKgghSLMIIUhwIBAzEPMA0GCWCGSAFlAwQCAQUAMIIBagYLKoZIhvcNAQkQ
# AQSgggFZBIIBVTCCAVECAQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQg
# d5hzvSlrhwVTXrngjHfx18D9Y/qWQZ5ptiMelgnJlZsCBmo1ZzMm9BgTMjAyNjA3
# MDgxNDA3MDIuODA5WjAEgAIB9KCB6aSB5jCB4zELMAkGA1UEBhMCVVMxEzARBgNV
# BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv
# c29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3Bl
# cmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0ExQS0w
# NUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3Rh
# bXBpbmcgQXV0aG9yaXR5oIIPKTCCB4IwggVqoAMCAQICEzMAAAAF5c8P/2YuyYcA
# AAAAAAUwDQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5
# IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4X
# DTIwMTExOTIwMzIzMVoXDTM1MTExOTIwNDIzMVowYTELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
# IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwggIiMA0GCSqGSIb3DQEB
# AQUAA4ICDwAwggIKAoICAQCefOdSY/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVGR3eR
# wV1wb3+yq0OXDEqhUhxqoNv6iYWKjkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGcb95W
# JLiw7HzLiBKrxmDj1EQB/mG5eEiRBEp7dDGzxKCnTYocDOcRr9KxqHydajmEkzXH
# OeRGwU+7qt8Md5l4bVZrXAhK+WSk5CihNQsWbzT1nRliVDwunuLkX1hyIWXIArCf
# rKM3+RHh+Sq5RZ8aYyik2r8HxT+l2hmRllBvE2Wok6IEaAJanHr24qoqFM9WLeBU
# Sudz+qL51HwDYyIDPSQ3SeHtKog0ZubDk4hELQSxnfVYXdTGncaBnB60QrEuazvc
# ob9n4yR65pUNBCF5qeA4QwYnilBkfnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFhH8k8
# YBozrEaXnsSL3kdTD01X+4LfIWOuFzTzuoslBrBILfHNj8RfOxPgjuwNvE6YzauX
# i4orp4Sm6tF245DaFOSYbWFK5ZgG6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNEobv3
# 5Nf6xN6FrA6jF9447+NHvCjeWLCQZ3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOcPVrr
# 3D9RPHCMS6Ckg8wggTrtIVnY8yjbvGOUsAdZbeXUIQAWMs0d3cRDv09SvwVRd61e
# vQIDAQABo4ICGzCCAhcwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEA
# MB0GA1UdDgQWBBRraSg6NS9IY0DPe9ivSek+2T3bITBUBgNVHSAETTBLMEkGBFUd
# IAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9w
# cy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsG
# AQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgw
# FoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50
# aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9y
# aXR5JTIwMjAyMC5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMIGBBggrBgEFBQcwAoZ1
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
# MjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUy
# MEF1dGhvcml0eSUyMDIwMjAuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbHfm21
# WhV150x4aPpO4dhEmSUVpbixNDmv6TvuIHv1xIs174bNGO/ilWMm+Jx5boAXrJxa
# gRhHQtiFprSjMktTliL4sKZyt2i+SXncM23gRezzsoOiBhv14YSd1Klnlkzvgs29
# XNjT+c8hIfPRe9rvVCMPiH7zPZcw5nNjthDQ+zD563I1nUJ6y59TbXWsuyUsqw7w
# XZoGzZwijWT5oc6GvD3HDokJY401uhnj3ubBhbkR83RbfMvmzdp3he2bvIUztSOu
# FzRqrLfEvsPkVHYnvH1wtYyrt5vShiKheGpXa2AWpsod4OJyT4/y0dggWi8g/tgb
# hmQlZqDUf3UqUQsZaLdIu/XSjgoZqDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5xvPS
# wym0Ukr4o5sCcMUcSy6TEP7uMV8RX0eH/4JLEpGyae6Ki8JYg5v4fsNGif1OXHJ2
# IWG+7zyjTDfkmQ1snFOTgyEX8qBpefQbF0fx6URrYiarjmBprwP6ZObwtZXJ23jK
# 3Fg/9uqM3j0P01nzVygTppBabzxPAh/hHhhls6kwo3QLJ6No803jUsZcd4JQxiYH
# Hc+Q/wAMcPUnYKv/q2O444LO1+n6j01z5mggCSlRwD9faBIySAcA9S8h22hIAcRQ
# qIGEjolCK9F6nK9ZyX4lhthsGHumaABdWzCCB58wggWHoAMCAQICEzMAAABbSrWN
# QTJt3HQAAAAAAFswDQYJKoZIhvcNAQEMBQAwYTELMAkGA1UEBhMCVVMxHjAcBgNV
# BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1
# YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwHhcNMjYwMTA4MTg1OTA1WhcN
# MjcwMTA3MTg1OTA1WjCB4zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0
# b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3Jh
# dGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBMaW1p
# dGVkMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046N0ExQS0wNUUwLUQ5NDcxNTAz
# BgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9y
# aXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkFTMFtueUNd57QHQ
# oPkbj/jvm2EXJ9y0LK4RJNZBe+UuLhbH+13apR16riJ156DpVaGI4d+7fAlXhNQZ
# JG2qH0JyvUGaIEq/2K4WmAfIgG7lDHfxmzHCUV5dVL5mokkqddFsM1B1xhKgL/pz
# SFAn88fnQMFENCQ9dXDIWLMutEf0CWsl5SDsEp5PbfN+1Lz8o4ku8QRsc4XqlI5j
# dlWmtlRZtaNbBFOagdpD8Ty+ta0s3IQn5vTz1VbUiStre3gZMHlZvLcIvUrbNicD
# EEi9p+wowXKP065cdxM8owOgVIx5qYb0wo4xvq6gbU+N2cOCws/oQ4xFLOssvuMQ
# PWZsH1FJ31+G3L4dCvq9mCwGfqhTL5hOk1UuyTB21QzzZZgCQ/O2U63cCIvSrJXv
# 9TeP+6re8cyM8zTDTfjQzns16LSDgEJwy3R1uqhz3VWAJvf/fqwdAA2ie2fUc4Xa
# guTzX3RBFLjeKwdWtrwfyx/n4aWohixiIIpfTgdmI7NlbzbqdUjp377yXJN5aamP
# 3RRr249smFWPATeiHq07nXTJKqZIxIsQ3Tuncht7cToEBvbD3etbNvbr52lK2Fso
# XiQCmh+oGxY9fgwS0cpI5+0+ZVMJDju2CGtW4eJr2Nj4eyPTWbgpbha2SZWbcvqE
# xkQIxriyMzEBfP5tf8AmFZN7pNkCAwEAAaOCAcswggHHMB0GA1UdDgQWBBTv8upS
# VZZiFcl1fCBgrHhvwa/StjAfBgNVHSMEGDAWgBRraSg6NS9IY0DPe9ivSek+2T3b
# ITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmcl
# MjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggrBgEFBQcwAoZdaHR0
# cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBQ
# dWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3J0MAwGA1Ud
# EwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQDAgeA
# MGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6
# Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAI
# BgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAAAf7N35cqHg7FdgxYWa2CKVcBAZ
# y06MJQHXD+4GIL85dwfchrj9dt1SErMVtqJNsgTq9hkp3Wni7uco4uRrDKYAxXK4
# 7stKXqssq21kjIuFaNMrTNc7PS7jEur35tG0EQom8DqwPmcnAfUg7rPViLPK4hGh
# qUwKdutSLF9bFCfhMCY3u326T5fYVROERrd7DNHCG0b7HBoBssyTFGZHbgmd9d3V
# XEqj3T6btbO6i/3pS6DHnBl17CIgibVlZOPiUIke6nrv0tw5ru0DEkyKlVpKW1Af
# 1+b1M4pzOV/G1a4FwtTh25l+rCCwguwfs8yRxfXPBDNAPTIC0+GdjP0o0bXbltf6
# KKU57VLxEeq/ZtsGkylqjiRxS9Ajp0yApG8WabV4tuFI05CmUMxMYPW01V00aQj3
# qNS762uhSNYwyLjpNB8EAfG0NOlGEi7/zu8BVDxnpEeEXF6zPgR3klOFohBEDLoZ
# w78mT5DMPOhnRqtEiQiwYnutmA5UCPH1y1/DyUf1F+NzAHfB0YFg0w1UmpClRqLZ
# Np11/mlfNNkQciosQXndKsGMh4iehCs/tTlWVeIxCzF7At0g2sATaXZNHcoGKRv5
# FBHKBtOnyOPbKILQ0JTAb4r6d2CU3lExteMVbpoprn1er5vxfMr8Mr4Am2A6keAm
# /xCuTrYD63A5Us6mMYID1DCCA9ACAQEweDBhMQswCQYDVQQGEwJVUzEeMBwGA1UE
# ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVi
# bGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAFtKtY1BMm3cdAAAAAAA
# WzANBglghkgBZQMEAgEFAKCCAS0wGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJEAEE
# MC8GCSqGSIb3DQEJBDEiBCBsHb9JQo4pkDL825vVdnUa1cIrFMDnbcpIj2SbF2cM
# yzCB3QYLKoZIhvcNAQkQAi8xgc0wgcowgccwgaAEIC8xA1VdnRvTHGUbDxf/cgTJ
# s5u5PprlbV3rUJb5wYPvMHwwZaRjMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVN
# aWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMg
# UlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAAW0q1jUEybdx0AAAAAABbMCIE
# IHL3Q5uuyhOTyjyKPCz8gjU0el0+Zv7sOyUAmfsFbhdJMA0GCSqGSIb3DQEBCwUA
# BIICAF8eernvG6SmBKA9FFbqF2eXQl/EDV8gDat830ndc1yICO0IR2QazBCU5OC4
# lOpYyPPXaOXeeCS3qt5qdbBDEbCxFbJyWy4QDmIqkpefFIGz50TaxVAhdRAhJYip
# ELW7WUAtEtzB9yil9TOQsBkHwOnPOJVqGs1z4ic1wl3ISi7zvgRaebaMzYrJCNWX
# ZehmULe2+Ps1qEaz8mCNjNidRepvkheuUbldacqruWLFQANYekcO6HisZprJuBjI
# Zssjez76hpW4FzFivmi7KjpIlZ362sF/CSbTJQAc8bYxrcll4F9DR3BMiIv6i6wX
# +C2rzzA+Q92MZ44+cUHEtm/nDrkQdKI4BiXnNmqdb7WXQrj/sNgR7CaHabPxx9LC
# zPoxQsOxpIBxuOGWVYDGQgNFO7ClxEBEu5J0TCHXICWYGnFtf5uWbpT9VQjK5A4K
# w7Gkj6o3BFVB9EIhEPaJ2yv1FX3pJBCNgcz0sMTOge3w2nq2vGsnLFz0bz3iq/k2
# F1IkxQcyXYp66SbJRdwWVvcraeN+NfX2sqJFlzEdU2axYzoQx69bVPOjTeW+eI6B
# MjPlSkL5ESEPxT6VvT/S7HmYevnLc8kn+MRfG37oar1tAz8sfYTG2B3SuozUzSTJ
# EyyJl5Q0zHxSI6Iq8YVbkww5L3vO3acb9IMNS13sZFXerzPy
# SIG # End signature block
