DSInternals.RpcFilters.Bootstrap.psm1

#
# Script module file for the 'DSInternals.RpcFilters' module.
#
# Copyright (c) Michael Grafnetter
#

# Check if the current OS is Windows.
if ($env:OS -ne 'Windows_NT') {
    Write-Error -Message 'The DSInternals.RpcFilters PowerShell module is only supported on Windows.' `
                -Category ([System.Management.Automation.ErrorCategory]::NotImplemented)
}

# Load the platform-specific binaries.
# Note: This operation cannot be done in the module manifest,
# as it only supports restricted language mode.
if ($PSVersionTable.PSVersion.Major -ge 6) {
    [string] $coreModulePath = "$PSScriptRoot/net8.0-windows/DSInternals.Win32.RpcFilters.PowerShell.dll"
    Import-Module -Name $coreModulePath -ErrorAction Stop
}
else {
    [string] $desktopModulePath = "$PSScriptRoot/net48/DSInternals.Win32.RpcFilters.PowerShell.dll"
    Import-Module -Name $desktopModulePath -ErrorAction Stop
}

#region Script cmdlets

<#
.SYNOPSIS
    Gets RPC audit events from the Security log.
 
.PARAMETER ComputerName
    The name of the computer to query.
 
.PARAMETER MaxEvents
    The maximum number of events to retrieve.
 
#>

function Get-RpcFilterEvent {
    [CmdletBinding()]
    [OutputType([DSInternals.Win32.RpcFilters.PowerShell.RpcEventLogRecord])]
    param(
        [Parameter(Mandatory = $false, ValueFromPipeline = $true)]
        [ValidateNotNullOrEmpty()]
        [string] $ComputerName,

        [Parameter(Mandatory = $false)]
        [long] $MaxEvents = [long]::MaxValue
    )

    process {
        [hashtable] $computerNameParameter = @{}

        if ($null -ne $ComputerName) {
            # Use parameter splatting in order to support empty ComputerName
            # The Get-WinEvent command behaves slightly differently with "localhost" as ComputerName value.
            $computerNameParameter = @{ ComputerName = $ComputerName }
        }

        # Fetch the corresponding events and convert them to a human-readable format.
        Get-WinEvent @computerNameParameter -FilterHashtable @{
            LogName = 'Security'
            ProviderName = 'Microsoft-Windows-Security-Auditing'
            Id = '5712' # Event ID 5712: A Remote Procedure Call (RPC) was attempted.
        } -MaxEvents $MaxEvents | ForEach-Object { [DSInternals.Win32.RpcFilters.PowerShell.RpcEventLogRecord] $PSItem }
    }
}

<#
.SYNOPSIS
    Enables security auditing for RPC events.
 
#>

function Enable-RpcFilterAuditing {
    [CmdletBinding()]
    [OutputType('None')]
    param()

    # Run the native command and drop the output
    auditpol.exe /set /subcategory:"RPC Events" /success:enable /failure:enable > $null
}

<#
.SYNOPSIS
    Disables security auditing for RPC events.
 
#>

function Disable-RpcFilterAuditing {
    [CmdletBinding()]
    [OutputType('None')]
    param()

    # Run the native command and drop the output
    auditpol.exe /set /subcategory:"RPC Events" /success:disable /failure:disable > $null
}

<#
.SYNOPSIS
    Gets the current auditing settings for RPC events.
 
#>

function Get-RpcFilterAuditing {
    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param()

    # Run the native command and convert the CSV output to objects
    auditpol.exe /get /subcategory:"RPC Events" /r | ConvertFrom-Csv -Delimiter ','
}

#endregion Script cmdlets

# Define cmdlet aliases
New-Alias -Name 'Add-RpcFilter' -Value 'New-RpcFilter' -Force

# Export cmdlets
Export-ModuleMember -Cmdlet @('Get-RpcFilter', 'New-RpcFilter', 'Remove-RpcFilter') `
                    -Alias @('Add-RpcFilter') `
                    -Function @('Get-RpcFilterEvent', 'Enable-RpcFilterAuditing', 'Disable-RpcFilterAuditing', 'Get-RpcFilterAuditing')

# SIG # Begin signature block
# MIIsMwYJKoZIhvcNAQcCoIIsJDCCLCACAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCBVibtSkmMFxjC5
# QmvOrz8F7lwdNiWMycLk9bIeUdD306CCE6UwggWQMIIDeKADAgECAhAFmxtXno4h
# MuI5B72nd3VcMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0xMzA4MDExMjAwMDBaFw0z
# ODAxMTUxMjAwMDBaMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
# AL/mkHNo3rvkXUo8MCIwaTPswqclLskhPfKK2FnC4SmnPVirdprNrnsbhA3EMB/z
# G6Q4FutWxpdtHauyefLKEdLkX9YFPFIPUh/GnhWlfr6fqVcWWVVyr2iTcMKyunWZ
# anMylNEQRBAu34LzB4TmdDttceItDBvuINXJIB1jKS3O7F5OyJP4IWGbNOsFxl7s
# Wxq868nPzaw0QF+xembud8hIqGZXV59UWI4MK7dPpzDZVu7Ke13jrclPXuU15zHL
# 2pNe3I6PgNq2kZhAkHnDeMe2scS1ahg4AxCN2NQ3pC4FfYj1gj4QkXCrVYJBMtfb
# BHMqbpEBfCFM1LyuGwN1XXhm2ToxRJozQL8I11pJpMLmqaBn3aQnvKFPObURWBf3
# JFxGj2T3wWmIdph2PVldQnaHiZdpekjw4KISG2aadMreSx7nDmOu5tTvkpI6nj3c
# AORFJYm2mkQZK37AlLTSYW3rM9nF30sEAMx9HJXDj/chsrIRt7t/8tWMcCxBYKqx
# YxhElRp2Yn72gLD76GSmM9GJB+G9t+ZDpBi4pncB4Q+UDCEdslQpJYls5Q5SUUd0
# viastkF13nqsX40/ybzTQRESW+UQUOsxxcpyFiIJ33xMdT9j7CFfxCBRa2+xq4aL
# T8LWRV+dIPyhHsXAj6KxfgommfXkaS+YHS312amyHeUbAgMBAAGjQjBAMA8GA1Ud
# EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTs1+OC0nFdZEzf
# Lmc/57qYrhwPTzANBgkqhkiG9w0BAQwFAAOCAgEAu2HZfalsvhfEkRvDoaIAjeNk
# aA9Wz3eucPn9mkqZucl4XAwMX+TmFClWCzZJXURj4K2clhhmGyMNPXnpbWvWVPjS
# PMFDQK4dUPVS/JA7u5iZaWvHwaeoaKQn3J35J64whbn2Z006Po9ZOSJTROvIXQPK
# 7VB6fWIhCoDIc2bRoAVgX+iltKevqPdtNZx8WorWojiZ83iL9E3SIAveBO6Mm0eB
# cg3AFDLvMFkuruBx8lbkapdvklBtlo1oepqyNhR6BvIkuQkRUNcIsbiJeoQjYUIp
# 5aPNoiBB19GcZNnqJqGLFNdMGbJQQXE9P01wI4YMStyB0swylIQNCAmXHE/A7msg
# dDDS4Dk0EIUhFQEI6FUy3nFJ2SgXUE3mvk3RdazQyvtBuEOlqtPDBURPLDab4vri
# RbgjU2wGb2dVf0a1TD9uKFp5JtKkqGKX0h7i7UqLvBv9R0oN32dmfrJbQdA75PQ7
# 9ARj6e/CVABRoIoqyc54zNXqhwQYs86vSYiv85KZtrPmYQ/ShQDnUBrkG5WdGaG5
# nLGbsQAe79APT0JsyQq87kP6OnGlyE0mpTX9iV28hWIdMtKgK1TtmlfB2/oQzxm3
# i0objwG2J5VT6LaJbVu8aNQj6ItRolb58KaAoNYes7wPD1N1KarqE3fk3oyBIa0H
# EEcRrYc9B9F1vM/zZn4wggawMIIEmKADAgECAhAIrUCyYNKcTJ9ezam9k67ZMA0G
# 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
# eE4wggdZMIIFQaADAgECAhANqK80cCX+jsAYDGB/BSyeMA0GCSqGSIb3DQEBCwUA
# MGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UE
# AxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEz
# ODQgMjAyMSBDQTEwHhcNMjYwMTA1MDAwMDAwWhcNMjkwMTA0MjM1OTU5WjBhMQsw
# CQYDVQQGEwJDWjEOMAwGA1UEBxMFUHJhaGExIDAeBgNVBAoTF01nci4gTWljaGFl
# bCBHcmFmbmV0dGVyMSAwHgYDVQQDExdNZ3IuIE1pY2hhZWwgR3JhZm5ldHRlcjCC
# AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJrpm0HI6ak/Uj3iqs64nuUT
# WZAkxHVeJKwnd3XR0Ge/oE1STGkmydGCZ8VR9jMcIHK+kYteESboRguDVk7BTxEv
# SKTEDG0lt1KLr0KUuWI2EUykxtcpR7wOjZ/VBMPeiwPQqccY/ZnwF0H6P43MJSIf
# WYVhTLb5R8ueHkjxRGkMPgIcuV4W3TqIEQKvO9NEMC0Tv2nPXPab5u20QdixQaep
# 05DEBL1cd9L0NYvbgUi8JQ63I/P7fqrlC6zXZb61wDDTNxwtdFIlR7jvAFqhY1bX
# Qfb8bmL4KXH9Sv3hHIDUUfitghKh4RoQWitVTpf+uzLPG0Dr1UH8RbWIYQRXCZhr
# 4RJzmt3+i0f+IZSJkRlXBVhn9GeQTk3yaUwLFyz5evTYh5IBaMNA+1BChpswlB32
# PoOjg4eJr3/nArLKN3UZCy9PQ0F+y0J+T/UkGCyv0Ws+zxiZlR2A6ekjGnP5x+8g
# n2S3Hf0rMCfCgudgT12S8tXPSdI88TzsihLj8iJT9ljgS0bJSjNykYaBK8BXYYJ3
# PvBn7px9G7b7WOPieyp7rTDkmyWBG5+vVIOFjJUgMIMJChsc5f11iHNcdo7FsVwS
# H8MftQ0rUSktj1xK4/p9zwhQpI+eXE0l9YIP08JmVOLtgu2PzXcCT/El+/8+XUw/
# X63cEIgp49URPwtmU0UhAgMBAAGjggIDMIIB/zAfBgNVHSMEGDAWgBRoN+Drtjv4
# XxGG+/5hewiIZfROQjAdBgNVHQ4EFgQUUAbobwgAP24SnIkacVlc4i61qWgwPgYD
# VR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcCARYbaHR0cDovL3d3dy5kaWdp
# Y2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcD
# AzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdpY2VydC5jb20v
# RGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0Ex
# LmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1
# c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwgZQGCCsG
# AQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5j
# b20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdp
# Q2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0
# MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQADggIBAI/LhB69MYV+zYchS+lShCm1
# H7P/sHkhIctl5ClI6fFpsqc7uAZlH2JjUNYDkkIUvoGk5teyJdLXrycGQIVwH26i
# DJm6VDoOOalOjOHh1Om/dP3Cl3XPUM1KRyj39DNnLvPB/5VxIbGoz9yoaTvHAQnu
# B5THrdo0nWyPtDgTF2ItJFVky4Uh9cE/ggCifsDUFMwAVKDZ1YvwNspO/ajwdLTM
# l121TKX3x5eA8KL4bO3LVvE5GQIqQx3PVqTn4jwFlxjDaBh/RE6yo2UwPwIIfTfj
# XTHuziTtFgvVhHKFS55Cxt4h3nCrPEnCfSdG/oNOF8TgLWA873V4T1Qqkdi8aXuA
# BWu5GhemjorxFxqeSLrskfTnGO2a5WQ6hmqmz8jU/Ulau8MvwRN8ZSyDJBYc8iuF
# VL1+abP12QfM/O8VkqYHbeslkC0qndAbJlT6icTd4CPeBXTwXtGY0hixRxcAkq3y
# gKSs7EeGGY6Ytc1pANGDX6PBjVxaf0XfwhkwG35iAA3Ix1muNoB4Nt2HySbkVGDh
# ZT5seWy/D2Z44NTAMcGh7WcBGp0RJ/372LGP58ZgSPp/0EtlhaCX1UoQo7Nv6XsY
# 1qu0RC+G/lOTl1C9o3eya4bf5y0GZlrNgW3U4nxi4UcRwlpmRaH1hbuz5BQoImaz
# mn6pOiSVBvJE8R1OA+9UMYIX5DCCF+ACAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUG
# A1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQg
# RzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEgQ0ExAhANqK80cCX+
# jsAYDGB/BSyeMA0GCWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKA
# AKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEO
# MAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIPj8hxy0aXmDuDqTZ5QViK5K
# yrx2+xkLyh3XLR8CGdkrMA0GCSqGSIb3DQEBAQUABIICAIp07AUWmleR+S2VruyP
# xDgIo8USWmJNSZQ2Vt1v2guylBb2JUv6VRPSZedJ/EiJqRBdyyInQ1x4Y78xtMhM
# WJQ2ovgnIKE8nDIICrk4dNJpNWL/uPTATTUB5XDjiBAujcjjwOOSB9/9ivGDfARF
# UshsMLnckWWFYEKZ3Qa6Kw+/sbtUzUIvtb01ONyyhrK2K+hZD1O87+cf5+FMHANH
# OZ/88HTJk7zYsHsmCkpmVQXsDysYmbOBeLgJyUI2BlYTtUiWy2cAmnu2KPu5/+UP
# A3H9/oqOTrAOMsjiQyLvajn44QYnc61H00xabk2Nar/Nngll6jOgjlDeHW5GRaI6
# mii7XX40XdYHWhShYxC+TeumAAkkkx6ZJami47zg9sCcGuT1nPfTyw3cIeSm2tWL
# 8yFexmZFpHyh77Of5u8sf0rr2Cp6c9OoyfakPWfh06fbVdHu11DLRUkpI5+8KEM+
# DWuTd6N+7j4Ct/HjKBe0EgNVT1tzfyUCi25Q9Jk0CDk+2LBo4jXT89M+8uNwsvXA
# JrQWe7hH2Bsj90sxbC9sWuuwwbRzTUkFDAF5UeizdugcP3HpPOJTKmXoCfJW0uEe
# a95bStpD88foZkjEGAqq78lSIqNeazT8rtFRPfP4MXmQ1pExNJ1gM2/8eDEZ3Yas
# oEHOupj/qza5SH5fQTYw/TWooYIUsTCCFK0GCisGAQQBgjcDAwExghSdMIIUmQYJ
# KoZIhvcNAQcCoIIUijCCFIYCAQMxDzANBglghkgBZQMEAgEFADCCAWkGCyqGSIb3
# DQEJEAEEoIIBWASCAVQwggFQAgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIB
# BQAEIJQwBISuoMmnRnGpSiZnyA9mEC7W9e13WF4aARAe8wGDAgZpStJGbU4YEjIw
# MjYwMTA3MjM1NjQxLjM3WjAEgAIB9KCB6aSB5jCB4zELMAkGA1UEBhMCVVMxEzAR
# BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p
# Y3Jvc29mdCBDb3Jwb3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQg
# T3BlcmF0aW9ucyBMaW1pdGVkMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046NDkx
# QS0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUg
# U3RhbXBpbmcgQXV0aG9yaXR5oIIPKTCCB4IwggVqoAMCAQICEzMAAAAF5c8P/2Yu
# yYcAAAAAAAUwDQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoT
# FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50
# aXR5IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIw
# MB4XDTIwMTExOTIwMzIzMVoXDTM1MTExOTIwNDIzMVowYTELMAkGA1UEBhMCVVMx
# HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9z
# b2Z0IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwggIiMA0GCSqGSIb3
# DQEBAQUAA4ICDwAwggIKAoICAQCefOdSY/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVG
# R3eRwV1wb3+yq0OXDEqhUhxqoNv6iYWKjkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGc
# b95WJLiw7HzLiBKrxmDj1EQB/mG5eEiRBEp7dDGzxKCnTYocDOcRr9KxqHydajmE
# kzXHOeRGwU+7qt8Md5l4bVZrXAhK+WSk5CihNQsWbzT1nRliVDwunuLkX1hyIWXI
# ArCfrKM3+RHh+Sq5RZ8aYyik2r8HxT+l2hmRllBvE2Wok6IEaAJanHr24qoqFM9W
# LeBUSudz+qL51HwDYyIDPSQ3SeHtKog0ZubDk4hELQSxnfVYXdTGncaBnB60QrEu
# azvcob9n4yR65pUNBCF5qeA4QwYnilBkfnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFh
# H8k8YBozrEaXnsSL3kdTD01X+4LfIWOuFzTzuoslBrBILfHNj8RfOxPgjuwNvE6Y
# zauXi4orp4Sm6tF245DaFOSYbWFK5ZgG6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNE
# obv35Nf6xN6FrA6jF9447+NHvCjeWLCQZ3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOc
# PVrr3D9RPHCMS6Ckg8wggTrtIVnY8yjbvGOUsAdZbeXUIQAWMs0d3cRDv09SvwVR
# d61evQIDAQABo4ICGzCCAhcwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQD
# AgEAMB0GA1UdDgQWBBRraSg6NS9IY0DPe9ivSek+2T3bITBUBgNVHSAETTBLMEkG
# BFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkG
# CSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j
# BBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElk
# ZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0
# aG9yaXR5JTIwMjAyMC5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMIGBBggrBgEFBQcw
# AoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3Nv
# ZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0
# ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbH
# fm21WhV150x4aPpO4dhEmSUVpbixNDmv6TvuIHv1xIs174bNGO/ilWMm+Jx5boAX
# rJxagRhHQtiFprSjMktTliL4sKZyt2i+SXncM23gRezzsoOiBhv14YSd1Klnlkzv
# gs29XNjT+c8hIfPRe9rvVCMPiH7zPZcw5nNjthDQ+zD563I1nUJ6y59TbXWsuyUs
# qw7wXZoGzZwijWT5oc6GvD3HDokJY401uhnj3ubBhbkR83RbfMvmzdp3he2bvIUz
# tSOuFzRqrLfEvsPkVHYnvH1wtYyrt5vShiKheGpXa2AWpsod4OJyT4/y0dggWi8g
# /tgbhmQlZqDUf3UqUQsZaLdIu/XSjgoZqDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5
# xvPSwym0Ukr4o5sCcMUcSy6TEP7uMV8RX0eH/4JLEpGyae6Ki8JYg5v4fsNGif1O
# XHJ2IWG+7zyjTDfkmQ1snFOTgyEX8qBpefQbF0fx6URrYiarjmBprwP6ZObwtZXJ
# 23jK3Fg/9uqM3j0P01nzVygTppBabzxPAh/hHhhls6kwo3QLJ6No803jUsZcd4JQ
# xiYHHc+Q/wAMcPUnYKv/q2O444LO1+n6j01z5mggCSlRwD9faBIySAcA9S8h22hI
# AcRQqIGEjolCK9F6nK9ZyX4lhthsGHumaABdWzCCB58wggWHoAMCAQICEzMAAABO
# o8YOPjHDdCcAAAAAAE4wDQYJKoZIhvcNAQEMBQAwYTELMAkGA1UEBhMCVVMxHjAc
# BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0
# IFB1YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwHhcNMjUwMjI3MTk0MDE3
# WhcNMjYwMjI2MTk0MDE3WjCB4zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hp
# bmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjEtMCsGA1UECxMkTWljcm9zb2Z0IElyZWxhbmQgT3BlcmF0aW9ucyBM
# aW1pdGVkMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046NDkxQS0wNUUwLUQ5NDcx
# NTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0
# aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAht+Ui7psCW2V
# 3udFfRPpJsXhsQyOgSZTt0vtkcGw5C2DmGIazwZCWtlUTXIBbMYCt6GinjuubZDR
# aJ2167wzQf9ztxqh6FUPWyjwZjRWjXaR8iZCnWq3kDWRxNxhdabJBt4vH3DwocGc
# gel6w/6yTZJOCViwW7cK0e0gVeOssAXv42MDRSvCzefLls9362PE7q8UhjdXrJdv
# cYhtwdt+aV41+trhkQAD+EXEMN2bZF4u3/qKPuJUztDoRsNCuC5ExDJ0XwcTIs/3
# yIYocQffqZzP54n1eX9u9r4+T/1iPVqJzYwGsDthNtj+F3DcdKyTG9RSA0hwoVBW
# zPfoVIxdA7NVdbVwVcvhSIarD7KUKUlxnSXcfQCLCyem+jS32/jMPmPAmuZ40iUo
# F4fkQZt9c96VtURnae0wEKA96AHmp6Wqj5sx9LP2VFM7ZzssHJh9CzpQ4kvYmGCt
# mhP6DtY1IRkpdD6joNe6OmJ/ldMx0zNYI46Imcxx6+ll0PZpho4QYVdSbnVATYks
# qeL/vV5xmMjoN/gLq8FdFXtZPvoFhSBwRrTyRhtbmQ3SOOcE8YUBKv1JKdk0YUpD
# gnwzJHEQE9lM3fcxf0/P7dl9kXiZLyjJcwJw6YTjToz1FJA/1tNVZW45HQwejnoS
# lQArWFUsp+5IPR0TBsaIxrAet6U4o0ECAwEAAaOCAcswggHHMB0GA1UdDgQWBBTw
# x7qDdKpK0vS3J3mLDiu/DU1qYjAfBgNVHSMEGDAWgBRraSg6NS9IY0DPe9ivSek+
# 2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20v
# cGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBp
# bmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0wazBpBggrBgEFBQcwAoZd
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
# MjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3J0MAwG
# A1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwDgYDVR0PAQH/BAQD
# AgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEwPwYIKwYBBQUHAgEWM2h0
# dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0
# bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBABMmcyukIa5ar1k6AQpwrI9m
# PvWf8mlf1JhpMr+o6s+wjHN/+q+r/+6PR1MGd/HspbRojVjPYLpDvyDVvzQBTwBE
# 3KgiGZPZJY0jyTsUujup5ZLM3htyAOBNFJooY+JZZsm0SNsKBsiQ0ndlM/2IEkKz
# FnC/prjlqf0CkbU1X/A/yeJXREEIf1IgeYPqy/fiXGXMdOAYZ/Wfbz1+D8uhIyws
# U9nj4benQpi7sDl/PrXogGT1laldDEcU1xIyD+uXBs7rmTSTSxGtSUhaST7vWe3Y
# 2CmwVpaLYlirSaxfS7NXctstpZ8rODUHe6ChJcvKlmDek/KmR1eHXCtr2HbbZG7O
# PI6bDJaLuNNBQE49l6fJqlsmEBleULE4Fo3TRuzVX7NSDaaI2170TwJYdqCr5G2z
# /WJKI8LBaYwp+qKVJJ1Iy1hJczJyIIpZ7F5GMBfRCi9Kwa/SkyqRh89rm5ucjTdp
# v8Doqh3ZMQXy59KFX2xBKpsOxwxbXZNA5ujJNSFzzA+nynZZZ6O+sf70BQ7qFOhp
# h4ziMyaY5wACWkebYBj4YCT5jnh3oNgDo0EQP4JIQVJqRRVGo1uQ3iY3VI6SWh1m
# G9GmGYX063QO7Mu78oHJYh8dtpj/BO6ysRUYfhbiff0WZwwi9Vsyl44Q1nn37EaI
# XC3mLO5ptmIc38QVHiV5MYID1DCCA9ACAQEweDBhMQswCQYDVQQGEwJVUzEeMBwG
# A1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQg
# UHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAAAE6jxg4+McN0JwAA
# AAAATjANBglghkgBZQMEAgEFAKCCAS0wGgYJKoZIhvcNAQkDMQ0GCyqGSIb3DQEJ
# EAEEMC8GCSqGSIb3DQEJBDEiBCDR8q3+QZmVeXLTEW9U8M36wAPESezGaUIM0jIG
# +7N1VTCB3QYLKoZIhvcNAQkQAi8xgc0wgcowgccwgaAEIG+yp9PvKAUdsN79OPdA
# KfbkkcO5SGDK009Fvrv/lkoXMHwwZaRjMGExCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJs
# aWMgUlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAATqPGDj4xw3QnAAAAAABO
# MCIEILNQO1sm/uQla+uDitv4ZK3pHMCVnIWLz5N5AQDqoTyXMA0GCSqGSIb3DQEB
# CwUABIICAEnWP1UB5HKZ8GFtqlwOCtVxE8EhRYB7kj9aztr/Nidq5AUJuSmsfCYo
# 4aRVo41+rdYol9EYm1Ce0+bvr8ywKF3HSwff7X/2X91Q3bRFH3XNZII9Tr5IvzOi
# /fOfjJ2+J30xrJdYy1ORw3ckFCG9beKejelBoPk6rlTA3hvJkzjqZtimbzeepfPh
# Vv4t3etBaswmwEOo3tT6cxi2Cpk4lsGnz8q7k28/BcCqHrE8992OP36O+qQucxGO
# 7Fvu7pgx+NeJqh1e52aT5Lr/rQD30IZicADkvgEHDJIV7cIJ93bH4igdNQp12VhA
# RGvqqkUtSnJMfmfSndHuePgJiR4A8g6LVeMVnSlVJhXEvNaTB9k0FXpUiofn/GtZ
# gNhPXEIHjMFeyprJiGAXyrQIpNfVuoN7Y9604Z8PEZnMeGS5wEom7YHpzo5yVagr
# FzlH7Y4RO+U5mWj9WUq3ZGME9RYTFU4whELWu1i5yUpXkqxr4f6Qaq4EmXCGRpLz
# Pdn4kNBi22N9Fu1wLxe77FAyPsb04J9RdKXbKbxRuOthUZJ5fC2vdVOWuMOcItO6
# jlDY4/J/gsWeR7Y9J4Dz105HCIoXrEr6BN0WTuzsteAx5dBOe8R2BhchL4JkVAzi
# bb5CCEq7TI+UNNLEWIftQTRgGV5/XhKkA7KgXtlGTtF/YQnMwRcL
# SIG # End signature block