Public/PrivilegedAccess/Save-EntraOpsPrivilegedEAMEnrichmentToWatchLists.ps1
|
<# .SYNOPSIS Get information of EntraOps Privileged EAM to add related entries to watchlist templates of HighValueAssets, IdentityCorrelation and VIP Users. .DESCRIPTION Get information from EntraOps Privileged EAM to collect content and create the following watchlists: - "High Value Assets" - The High Value Assets watchlist lists devices, resources, and other assets that have critical value in the organization, it includes the identified privileged devices from EntraOps and resources from Get-EntraOpsControlObjects. - "VIP Users" - The VIP Users watchlist lists user accounts of employees that have high impact value in the organization, it includes the identified privileged users from EntraOps. - "Identity Correlation" - The Identity Correlation watchlist lists related user accounts that belong to the same person, it includes the users which has been identified by using custom security attribute to connect privileged and regular work accounts. .PARAMETER TenantId Tenant ID of the Microsoft Entra ID tenant. Default is the current tenant ID. .PARAMETER SentinelResourceGroupName Resource group name of the Microsoft Sentinel workspace. .PARAMETER SentinelSubscriptionId Subscription ID of the Microsoft Sentinel workspace. .PARAMETER SentinelWorkspaceName Name of the Microsoft Sentinel workspace. .PARAMETER RbacSystems Array of RBAC systems to be processed. Default is Azure, EntraID, IdentityGovernance, DeviceManagement, ResourceApps. AzureBilling and Defender remain available as explicit opt-in values. .PARAMETER WatchListTemplates Define scope of WatchList templates which should be updated. Default is "All". Supported templates are "VIPUsers", "HighValueAssets", "IdentityCorrelation". .EXAMPLE Save data of EntraOps Privileged EAM insights to WatchList in Microsoft Sentinel Workspace for correlation between work and privileged accounts. Save-EntraOpsPrivilegedEAMEnrichmentToWatchLists WatchListTemplates "IdentityCorrelation" -SentinelSubscriptionId "3f72a077-c32a-423c-8503-41b93d3b0737" -SentinelResourceGroupName "EntraOpsResourceGroup" -SentinelWorkspaceName "EntraOpsWorkspace" #> function Save-EntraOpsPrivilegedEAMEnrichmentToWatchLists { [CmdletBinding()] param ( [Parameter(Mandatory = $false)] [ValidateSet("Object", "RoleClassification")] [System.String]$UserClassificationSource = "RoleClassification" , [Parameter(Mandatory = $false)] [System.String]$ImportPath = $DefaultFolderClassifiedEam , [Parameter(Mandatory = $True)] [System.String]$SentinelResourceGroupName , [Parameter(Mandatory = $True)] [System.String]$SentinelSubscriptionId , [Parameter(Mandatory = $True)] [System.String]$SentinelWorkspaceName , [Parameter(Mandatory = $false)] [ValidateSet("Azure", "AzureBilling", "EntraID", "IdentityGovernance", "DeviceManagement", "ResourceApps", "Defender")] [object]$RbacSystems = ("Azure", "EntraID", "IdentityGovernance", "DeviceManagement", "ResourceApps") , [Parameter(Mandatory = $False)] [ValidateSet("None", "All", "VIPUsers", "HighValueAssets", "IdentityCorrelation")] [object]$WatchListTemplates = "All" ) # --- Path safety: ensure ImportPath is under the expected base directory --- $ResolvedImportPath = [System.IO.Path]::GetFullPath($ImportPath) $ResolvedBaseFolder = [System.IO.Path]::GetFullPath($EntraOpsBaseFolder) if (-not (Test-EntraOpsPathWithinRoot -Path $ImportPath -Root $EntraOpsBaseFolder -AllowRoot)) { throw "Security check failed: ImportPath '$ResolvedImportPath' is not under the expected base directory '$ResolvedBaseFolder'." } try { Import-Module "SentinelEnrichment" -ErrorAction Stop } catch { throw "Issue to import SentinelEnrichment modul!" } #region EntraOps Classification data $Privileges = foreach ($Rbac in $RbacSystems) { try { Get-Content -Path "$($ImportPath)/$($Rbac)/$($Rbac).json" -ErrorAction Stop | ConvertFrom-Json -Depth 10 } catch { Write-Warning "No information found for $Rbac in file $($ImportPath)/$($Rbac)/$($Rbac).json" continue } } #endregion #region VIP Users if ($WatchListTemplates -eq "All" -or $WatchListTemplates -contains "VIPUsers") { $WatchListName = "VIP Users" $WatchListAlias = "VIPUsers" function Get-VIPUsers { $NewVipUserWatchlistItems = New-Object System.Collections.ArrayList Write-Host "Collecting data for VIPUsers" $PrivilegedUsers = $Privileges | Where-Object { $_.ObjectType -eq "user" } | Select-Object -unique ObjectId, ObjectUserPrincipalName, ObjectAdminTierLevelName foreach ($PrivilegedUser in $PrivilegedUsers) { $OnPremSid = Invoke-EntraOpsMsGraphQuery -Method Get -Uri "/v1.0/users/$($PrivilegedUser.ObjectId)?`$select=onPremisesSecurityIdentifier" # Set tags $Tags = New-Object System.Collections.ArrayList $Tags.Add("EntraOps") | Out-Null $Tags.Add("Automated Enrichment") | Out-Null if ($UserClassificationSource -eq "Object") { # Get classification by custom security attribute of the privileged user $Classification = ($Privileges | Where-Object { $_.ObjectId -eq $PrivilegedUser.ObjectId } | Select-Object -Unique ObjectAdminTierLevelName)[0] $Tags.Add($($Classification.AdminTierLevelName)) | Out-Null } else { # Get highest classification by assigned roles $Classification = ($Privileges | Where-Object { $_.ObjectId -eq $PrivilegedUser.ObjectId } | Select-Object -ExpandProperty Classification | Sort-Object AdminTierLevel | Select-Object AdminTierLevelName)[0] $Tags.Add($($Classification.AdminTierLevelName)) | Out-Null } # Check if privileged user object has been classified and is different to role classification if ($null -ne $PrivilegedUser.ObjectAdminTierLevelName -and $PrivilegedUser.ObjectAdminTierLevelName -ne $Classification.AdminTierLevelName) { $Tags.Add("TierBreach") | Out-Null } $CurrentItem = @{ "User Identifier" = $PrivilegedUser.ObjectId "User AAD Object Id" = $PrivilegedUser.ObjectId "User On-Prem Sid" = $OnPremSid.onPremisesSecurityIdentifier "User Principal Name" = $PrivilegedUser.ObjectUserPrincipalName "Tags" = $Tags } $NewVipUserWatchlistItems.Add( $CurrentItem ) | Out-Null } return $NewVipUserWatchlistItems } $NewWatchlistItems = New-Object System.Collections.ArrayList $NewWatchlistItems = Get-VIPUsers Write-Verbose "Write information to watchlist: $WatchListName" if ( $null -ne $NewWatchlistItems ) { $SearchKey = "User Identifier" $Parameters = @{ SearchKey = $SearchKey DisplayName = $WatchListName WatchListAlias = $WatchListAlias NewWatchlistItems = $NewWatchlistItems SubscriptionId = $SentinelSubscriptionId ResourceGroupName = $SentinelResourceGroupName WorkspaceName = $SentinelWorkspaceName OverrideTags = $true Identifiers = @("EntraOps", "Automated Enrichment") } Edit-GkSeAzSentinelWatchlist @Parameters } } #endregion #region Identity Correlation if ($WatchListTemplates -eq "All" -or $WatchListTemplates -contains "IdentityCorrelation") { $WatchListName = "Identity Correlation" $WatchListAlias = "IdentityCorrelation" function Get-IdentityCorrelation { $NewIdentityCorrelationWatchlistItems = New-Object System.Collections.ArrayList Write-Host "Collecting data for IdentityCorrelation" $PrivilegedUsers = $Privileges | Where-Object { $_.ObjectType -eq "user" } | Select-Object -unique ObjectId, AssociatedWorkAccount, ObjectUserPrincipalName, ObjectAdminTierLevelName $AssociatedWorkAccounts = $PrivilegedUsers | Select-Object -ExpandProperty AssociatedWorkAccount | Select-Object -Unique foreach ($AssociatedWorkAccount in $AssociatedWorkAccounts) { $WorkAccountDetails = Invoke-EntraOpsMsGraphQuery -Method Get -Uri "/v1.0/users/$($AssociatedWorkAccount)?`$select=id,userPrincipalName,onPremisesSecurityIdentifier,mail,employeeId" $AssociatedPrivilegedUsers = $PrivilegedUsers | Where-Object { $_.AssociatedWorkAccount -eq $AssociatedWorkAccount } | Select-Object -unique ObjectId, ObjectUserPrincipalName, ObjectAdminTierLevelName foreach ($AssociatedPrivilegedUser in $AssociatedPrivilegedUsers) { # Set tags $Tags = New-Object System.Collections.ArrayList $Tags.Add("EntraOps") | Out-Null $Tags.Add("Automated Enrichment") | Out-Null if ($UserClassificationSource -eq "Object") { # Get classification by custom security attribute of the privileged user $Classification = ($Privileges | Where-Object { $_.ObjectId -eq $AssociatedPrivilegedUser.ObjectId } | Select-Object -Unique ObjectAdminTierLevelName)[0] $Tags.Add($($Classification.AdminTierLevelName)) | Out-Null } else { # Get highest classification by assigned roles $Classification = ($Privileges | Where-Object { $_.ObjectId -eq $AssociatedPrivilegedUser.ObjectId } | Select-Object -ExpandProperty Classification | Sort-Object AdminTierLevel | Select-Object AdminTierLevelName)[0] $Tags.Add($($Classification.AdminTierLevelName)) | Out-Null } $CurrentItem = @{ "User Identifier" = $WorkAccountDetails.id "User AAD Object Id" = $WorkAccountDetails.id "User On-Prem Sid" = $WorkAccountDetails.onPremisesSecurityIdentifier "User Principal Name" = $WorkAccountDetails.userPrincipalName "Employee Id" = $WorkAccountDetails.employeeId "Email" = $WorkAccountDetails.mail "Associated Privileged Account ID" = $AssociatedPrivilegedUser.ObjectId "Associated Privileged Account" = $AssociatedPrivilegedUser.ObjectUserPrincipalName "Tags" = $Tags } $NewIdentityCorrelationWatchlistItems.Add( $CurrentItem ) | Out-Null } } return $NewIdentityCorrelationWatchlistItems } $NewWatchlistItems = New-Object System.Collections.ArrayList $NewWatchlistItems = Get-IdentityCorrelation Write-Verbose "Write information to watchlist: $WatchListName" if ( $null -ne $NewWatchlistItems ) { $SearchKey = "Associated Privileged Account ID" $Parameters = @{ SearchKey = $SearchKey DisplayName = $WatchListName WatchListAlias = $WatchListAlias NewWatchlistItems = $NewWatchlistItems SubscriptionId = $SentinelSubscriptionId ResourceGroupName = $SentinelResourceGroupName WorkspaceName = $SentinelWorkspaceName Identifiers = @("EntraOps", "Automated Enrichment") OverrideTags = $true } Edit-GkSeAzSentinelWatchlist @Parameters } } #endregion #region High Value Assets if ($WatchListTemplates -eq "All" -or $WatchListTemplates -contains "HighValueAssets") { $WatchListName = "High Value Assets" $WatchListAlias = "HighValueAssets" function Get-HighValueAssets { Write-Host "Collecting data for High Value Assets" $HighValueAssets = @() $DeviceQuery = 'ExposureGraphNodes | where isnotnull(NodeProperties.rawData.criticalityLevel) and (NodeProperties.rawData.criticalityLevel.criticalityLevel <1) | where (NodeLabel == "device") | extend "Asset Type" == "Device" | mv-apply EntityIds = parse_json(EntityIds) on ( where EntityIds.type =~ "DeviceInventoryId" | extend DeviceId = tostring(EntityIds.DeviceInventoryId) ) | extend DeviceId = tostring(parse_json(EntityIds).id) | project ["AssetType"] = "Device", ["AssetId"] = DeviceId, ["AssetFQDN"] = NodeName, ["AssetName"] = NodeName, ["Tags"] = parse_json(NodeProperties).rawData.criticalityLevel.ruleNames;' $Body = @{ "Query" = $DeviceQuery; } | ConvertTo-Json $Devices = (Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/security/runHuntingQuery" -Body $Body -OutputType PSObject).results $HighValueAssets += $Devices $AzureResourceQuery = 'ExposureGraphNodes | where isnotnull(NodeProperties.rawData.criticalityLevel) and (NodeProperties.rawData.environmentName == "Azure") | mv-apply EntityIds = parse_json(EntityIds) on ( where EntityIds.type =~ "AzureResourceId" | extend ResourceId = tostring(EntityIds.AzureResourceId) ) | extend AzureResourceId = tostring(parse_json(EntityIds).id) | extend IpAddresses = parse_json(NodeProperties).rawData.networkingComponentMetadata.ipAddresses | project ["AssetType"] = "Azure resource", ["AssetId"] = AzureResourceId, ["AssetFQDN"] = NodeName, ["AssetName"] = NodeName, ["IPAddress"] = IpAddresses, ["Tags"] = parse_json(NodeProperties).rawData.criticalityLevel.ruleNames' $Body = @{ "Query" = $AzureResourceQuery; } | ConvertTo-Json $AzureResources = (Invoke-MgGraphRequest -Method POST -Uri "https://graph.microsoft.com/beta/security/runHuntingQuery" -Body $Body -OutputType PSObject).results $HighValueAssets += $AzureResources $NewHighValueAssetWatchlistItems = New-Object System.Collections.ArrayList foreach ($HighValueAsset in $HighValueAssets) { $Tags = New-Object System.Collections.ArrayList $Tags.Add("EntraOps") | Out-Null $Tags.Add("XSPM") | Out-Null $Tags.Add("Automated Enrichment") | Out-Null foreach ($Tag in $HighValueAsset.Tags) { $Tags.Add( $Tag ) | Out-Null } $CurrentItem = @{ "Asset Type" = $HighValueAsset.AssetType "Asset Id" = $HighValueAsset.AssetId "Asset Name" = $HighValueAsset.AssetName "Asset FQDN" = $HighValueAsset.AssetFQDN "IP Address" = $HighValueAsset.IPAddress | ConvertTo-Json -Compress -AsArray "Tags" = $Tags } $NewHighValueAssetWatchlistItems.Add( $CurrentItem ) | Out-Null } return $NewHighValueAssetWatchlistItems } $NewWatchlistItems = New-Object System.Collections.ArrayList $NewWatchlistItems = Get-HighValueAssets Write-Verbose "Write information to watchlist: $WatchListName" if ( $null -ne $NewWatchlistItems ) { $SearchKey = "Asset Id" $Parameters = @{ SearchKey = $SearchKey DisplayName = $WatchListName WatchListAlias = $WatchListAlias NewWatchlistItems = $NewWatchlistItems SubscriptionId = $SentinelSubscriptionId ResourceGroupName = $SentinelResourceGroupName WorkspaceName = $SentinelWorkspaceName Identifiers = @("EntraOps", "Automated Enrichment") OverrideTags = $true } Edit-GkSeAzSentinelWatchlist @Parameters } } #endregion } # SIG # Begin signature block # MIIniAYJKoZIhvcNAQcCoIIneTCCJ3UCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCMeTkozV0kgd/i # SwfWu4J6F3bt3CdDsW4SiUN15npSyaCCIDwwggXJMIIEsaADAgECAhAbtY8lKt8j # AEkoya49fu0nMA0GCSqGSIb3DQEBDAUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK # ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2Vy # dGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5l # dHdvcmsgQ0EwHhcNMjEwNTMxMDY0MzA2WhcNMjkwOTE3MDY0MzA2WjCBgDELMAkG # A1UEBhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAl # BgNVBAsTHkNlcnR1bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMb # Q2VydHVtIFRydXN0ZWQgTmV0d29yayBDQSAyMIICIjANBgkqhkiG9w0BAQEFAAOC # Ag8AMIICCgKCAgEAvfl4+ObVgAxknYYblmRnPyI6HnUBfe/7XGeMycxca6mR5rlC # 5SBLm9qbe7mZXdmbgEvXhEArJ9PoujC7Pgkap0mV7ytAJMKXx6fumyXvqAoAl4Va # qp3cKcniNQfrcE1K1sGzVrihQTib0fsxf4/gX+GxPw+OFklg1waNGPmqJhCrKtPQ # 0WeNG0a+RzDVLnLRxWPa52N5RH5LYySJhi40PylMUosqp8DikSiJucBb+R3Z5yet # /5oCl8HGUJKbAiy9qbk0WQq/hEr/3/6zn+vZnuCYI+yma3cWKtvMrTscpIfcRnNe # GWJoRVfkkIJCu0LW8GHgwaM9ZqNd9BjuiMmNF0UpmTJ1AjHuKSbIawLmtWJFfzcV # WiNoidQ+3k4nsPBADLxNF8tNorMe0AZa3faTz1d1mfX6hhpneLO/lv403L3nUlbl # s+V1e9dBkQXcXWnjlQ1DufyDljmVe2yAWk8TcsbXfSl6RLpSpCrVQUYJIP4ioLZb # MI28iQzV13D4h1L92u+sUS4Hs07+0AnacO+Y+lbmbdu1V0vc5SwlFcieLnhO+Nqc # noYsylfzGuXIkosagpZ6w7xQEmnYDlpGizrrJvojybawgb5CAKT41v4wLsfSRvbl # jnX98sy50IdbzAYQYLuDNbdeZ95H7JlI8aShFf6tjGKOOVVPORa5sWOd/7cCAwEA # AaOCAT4wggE6MA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFLahVDkCw6A/joq8 # +tT4HKbROg79MB8GA1UdIwQYMBaAFAh2zcsH/yT2xc3tu5C84oQ3RnX3MA4GA1Ud # DwEB/wQEAwIBBjAvBgNVHR8EKDAmMCSgIqAghh5odHRwOi8vY3JsLmNlcnR1bS5w # bC9jdG5jYS5jcmwwawYIKwYBBQUHAQEEXzBdMCgGCCsGAQUFBzABhhxodHRwOi8v # c3ViY2Eub2NzcC1jZXJ0dW0uY29tMDEGCCsGAQUFBzAChiVodHRwOi8vcmVwb3Np # dG9yeS5jZXJ0dW0ucGwvY3RuY2EuY2VyMDkGA1UdIAQyMDAwLgYEVR0gADAmMCQG # CCsGAQUFBwIBFhhodHRwOi8vd3d3LmNlcnR1bS5wbC9DUFMwDQYJKoZIhvcNAQEM # BQADggEBAFHCoVgWIhCL/IYx1MIy01z4S6Ivaj5N+KsIHu3V6PrnCA3st8YeDrJ1 # BXqxC/rXdGoABh+kzqrya33YEcARCNQOTWHFOqj6seHjmOriY/1B9ZN9DbxdkjuR # mmW60F9MvkyNaAMQFtXx0ASKhTP5N+dbLiZpQjy6zbzUeulNndrnQ/tjUoCFBMQl # lVXwfqefAcVbKPjgzoZwpic7Ofs4LphTZSJ1Ldf23SIikZbr3WjtP6MZl9M7JYjs # NhI9qX7OAo0FmpKnJ25FspxihjcNpDOO16hO0EoXQ0zF8ads0h5YbBRRfopUofbv # n3l6XYGaFpAP4bvxSgD5+d2+7arszgowggZrMIIEU6ADAgECAhBX5gfP8LabvnxC # XoItEBa/MA0GCSqGSIb3DQEBCwUAMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhB # c3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBDb2RlIFNp # Z25pbmcgMjAyMSBDQTAeFw0yNjEwMDYwODI4MjNaFw0yNzEwMDYwODI4MjJaMIGQ # MQswCQYDVQQGEwJERTEdMBsGA1UECAwUUmhpbmVsYW5kLVBhbGF0aW5hdGUxEjAQ # BgNVBAcMCUxhaG5zdGVpbjEeMBwGA1UECgwVT3BlbiBTb3VyY2UgRGV2ZWxvcGVy # MS4wLAYDVQQDDCVPcGVuIFNvdXJjZSBEZXZlbG9wZXIgVGhvbWFzIE5hdW5oZWlt # MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAphp2ljSmVsRB6gvkEq7A # DUMENpKZiDFoAfF1ktD1nCwaVyI+bJ0ROjHwAn4iJgS+vlBDPOUIw2GLHkiqUhOg # HSwzg6gj45GNmt6zxsKP0zPlhMB/fb0zmz7/F7e3yfKCXLfhbHuk0Es9gJ+8Wmet # 9StVwwSE/K0MpW06GKA9nPWyE4N/ADwigDIj9rsTKJR4cve9w8G1b3zohpUc/qMr # onab+HVw5r9b3sOBnnaXC6zvrX4fovRz1ztwfWjRjILLoFG6mW/TuK5F2ICD3Rhl # 9R2rJWWWhzTDMsQlzvX+/SaM74q3OFpIVNdhvtmWU9pKUBRAyYMijcDqKEFGSzrc # 8JFmGMpP5TuroWF+N21d3px2eARvW1mV0DCfFAH+Og20SH/gVW6/ltQQEkH/z/Zt # 49ARyJrgESLOQtlMCIYSoKISdkk4ml4VUS1E/PcbzXEYj3a7m6DOxcd3WuY03UT9 # cnk3p0LMN6LeLYAZgVY+HRloZlH+kW2SkOHNuWgtXvZhAgMBAAGjggF4MIIBdDAM # BgNVHRMBAf8EAjAAMD0GA1UdHwQ2MDQwMqAwoC6GLGh0dHA6Ly9jY3NjYTIwMjEu # Y3JsLmNlcnR1bS5wbC9jY3NjYTIwMjEuY3JsMHMGCCsGAQUFBwEBBGcwZTAsBggr # BgEFBQcwAYYgaHR0cDovL2Njc2NhMjAyMS5vY3NwLWNlcnR1bS5jb20wNQYIKwYB # BQUHMAKGKWh0dHA6Ly9yZXBvc2l0b3J5LmNlcnR1bS5wbC9jY3NjYTIwMjEuY2Vy # MB8GA1UdIwQYMBaAFN10XUwA23ufoHTKsW73PMAywHDNMB0GA1UdDgQWBBTBvGyH # MXj1dMbVnxuof9oP4PY7cDBLBgNVHSAERDBCMAgGBmeBDAEEATA2BgsqhGgBhvZ3 # AgUBBDAnMCUGCCsGAQUFBwIBFhlodHRwczovL3d3dy5jZXJ0dW0ucGwvQ1BTMBMG # A1UdJQQMMAoGCCsGAQUFBwMDMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsF # AAOCAgEAkC165c7/r6y3VeEEpNXas9bQs6ZpKPdJffHkf9xoPi4kWvAIWGc4ocG1 # DJLb18RXiDYShDmT5sb/6I08FeipKi2DNJkuOq6yOTJ3S7+hNFIZCyd6i7WKO8ea # P5I+FAbyJP4+5coZoMg45bUa9JoocaJCm+5n7WiCfN7/EQpClW5Trm4+ZMbp7EMN # F1uLJgGCMnN0SsoUarp7PHlqupMxMC4Uhhe+lAP2ytcSIU81L97/qjrADbLWqICk # 9il5iGM+aZndguq/cmfH9rJj4GRZHWnG6WwnzYD9+KgYlRI6em+/9dq+IRiXe2Bs # thUuIaFW7U2gWw8tBTEYm1UBLHdJx+L1gjJCLs5KT/wy5wU32wZxNDqPUQejUC1x # GvU3cKqmLgRq+yNf3gFVfzqIoggyM3U9wQvnk7nBtCkpjXS2hdx4yxzcmrlWsDHr # z6+6/jeyQySzbYUlFmKnc4n9Mw2soHOajEua5poFARVRS5KgUBuiiQ21YFNYzWBo # qGuECaaAI/C5rGxapMJ3dAOBnHw6NLqBet+ZXBJEccX5y89MLlOQu+jDmJP8HieR # qDLlwfhVZnw4RY8Rus43NZBwhNlVuOUXqocHKmJhKNlekda3qsJj93eQBQOxKJcc # w5O08q9jukpH2+yzFAj+7ll33DuNUgWptogc4Awtbx3glzcEvJQwggaCMIIEaqAD # AgECAhAo8HfBHDa9/l90MkdwJy4DMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYT # AlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0ZW1zIFMuQS4xJDAiBgNVBAMT # G0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQTAeFw0yNjAzMTEwNzM0NTRaFw0z # NjAyMjcwNzM0NTRaMFAxCzAJBgNVBAYTAlBMMSEwHwYDVQQKDBhBc3NlY28gRGF0 # YSBTeXN0ZW1zIFMuQS4xHjAcBgNVBAMMFUNlcnR1bSBUaW1lc3RhbXAgMjAyNjCC # AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALi9zfBw+xI12hi2F9uNQBNO # STkTIi13fuh3DiWybI5392bBfJw6tO7zDs7UqP/rejVf4xFTU3XNOPsuOFkP5SPF # snWwn3VJL+NhNhsuujvYsQtaQnvNo1wk46reTgws1L8OFEdKaxgyqT4zOQx81mLw # NZSqXNU9Rrb9oAJWJF4Mydz+C1ebu0D0+vgM3tqAQ8TU203fqgKCPqIdHloaFqH9 # eyR+8tnpmy2hnnN59ZOtmsuHeRwf5iTOhlhf0d/qqquLOSIGPgGVL1Hj5XBUox2O # E7tQRr+l/xxNbL6OuwBO4Aa2EbuxYg37cpXv5i2/lTL4NASB/duf9W4fjA3Ro+GP # +bC54n2OYiM3Cq8z92ejx8F5HWO2e4/75eC95B9tMw/eq7109GDyW2+2ut5Bn0o8 # MXJTERkyystWbqcnUkomA97qfiDCwvpWuOMdfTOksXe9S+xDxOJaCbiyTivgPulx # cT+tfQTRXBr5UwtPvc+INnafOEilzVHA11tv+pHcylryxBc08cUihf/ttqkZS0bm # x3VxQay8uohaTp0//ECA9vYGW51SKdJMJhXvKyIdBLy8WYNchTt8yRITv9Adxg9J # qGujh+TnP1bW3aQjFtlEl7SzgNeI8OVA/CJAWWUuRT3Au9ToOpHy/flrrknhN4he # Ew7/6ILMv4HSsj0YZ4otAgMBAAGjggFQMIIBTDB1BggrBgEFBQcBAQRpMGcwOwYI # KwYBBQUHMAKGL2h0dHA6Ly9zdWJjYS5yZXBvc2l0b3J5LmNlcnR1bS5wbC9jdHNj # YTIwMjEuY2VyMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u # Y29tMB8GA1UdIwQYMBaAFL5UAi+/QGxzQ86sCSVOnkNEGu7gMAwGA1UdEwEB/wQC # MAAwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL3N1YmNhLmNybC5jZXJ0dW0ucGwv # Y3RzY2EyMDIxLmNybDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8E # BAMCB4AwIgYDVR0gBBswGTAIBgZngQwBBAIwDQYLKoRoAYb2dwIFAQswHQYDVR0O # BBYEFCM5aiirmhKnpKfyH/lFmr+N/oIDMA0GCSqGSIb3DQEBDAUAA4ICAQBm/pOb # rAveTqYFPCSthxNVwBHTW4TfuBQY2KGCdMlH6ALjVPYf2XARNGMTXScR0JQ2/c2L # xLpoHHhRwxFf3d933DhFS165rYj6iPSQKm41rc9AMpTCjMdmai1aK9o870pOzTzL # RhWFVIxm+5Qf+t4V5z14tPoUsAWdfRKD1Zzvzfe5AHlE9rxOZcGROiULxs3Edf7Z # J8RZI0jzD9juj2oEX2XS7BVKuNCK1W0h1mjapv028yqo8UtZh5/1Ib48Yyp88BDY # Shh5PSGUUuS5tYXVfcduIPBe3PdNTYRYdT5VNxkwLgjMzIcr/6SH2fejFJDjnCxj # vXLuarErJg/IdI+hXdGIBDVOGv1zrkF4ktoQvFZIp5DIAYh0GwyUhc87qqn5UaYT # j2+iyiBDSNh7aGCrkuAnqg7Qh7frhX+QhMGeJ9SpLpnG76qN85hLyjvYR6gRYiLT # j8G4fxjqV400/buPw0rBo9yJZyq/8cGdCOLPOYf9qpefTcrZKeO9pg+UJHx8UABb # aTqizRxm8sUSEycccCCFhIit3AI/3wGuSOADeiA676NcQ7+dsP04YvzvdN7pTZNy # g672WpBDJdg0eItHl4yomvNeIOWh1qs4QqOW6TI8Ocsi4uSDTLorxLUDnBTwKQzz # pxd1YUctEgRh32R0J9FkFkeEruJU94RljFr1uDCCBrkwggShoAMCAQICEQCZo4AK # JlU7ZavcboSms+o5MA0GCSqGSIb3DQEBDAUAMIGAMQswCQYDVQQGEwJQTDEiMCAG # A1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVt # IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3Rl # ZCBOZXR3b3JrIENBIDIwHhcNMjEwNTE5MDUzMjE4WhcNMzYwNTE4MDUzMjE4WjBW # MQswCQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEu # MSQwIgYDVQQDExtDZXJ0dW0gQ29kZSBTaWduaW5nIDIwMjEgQ0EwggIiMA0GCSqG # SIb3DQEBAQUAA4ICDwAwggIKAoICAQCdI88EMCM7wUYs5zNzPmNdenW6vlxNur3r # Lfi+5OZ+U3iZIB+AspO+CC/bj+taJUbMbFP1gQBJUzDUCPx7BNLgid1TyztVLn52 # NKgxxu8gpyTr6EjWyGzKU/gnIu+bHAse1LCitX3CaOE13rbuHbtrxF2tPU8f253Q # gX6eO8yTbGps1Mg+yda3DcTsOYOhSYNCJiL+5wnjZ9weoGRtvFgMHtJg6i671OPX # IciiHO4Lwo2p9xh/tnj+JmCQEn5QU0NxzrOiRna4kjFaA9ZcwSaG7WAxeC/xoZSx # F1oK1UPZtKVt+yrsGKqWONoK6f5EmBOAVEK2y4ATDSkb34UD7JA32f+Rm0wsr5aj # zftDhA5mBipVZDjHpwzv8bTKzCDUSUuUmPo1govD0RwFcTtMXcfJtm1i+P2UNXad # PyYVKRxKQATHN3imsfBiNRdN5kiVVeqP55piqgxOkyt+HkwIA4gbmSc3hD8ke66t # 9MjlcNg73rZZlrLHsAIV/nJ0mmgSjBI/TthoGJDydekOQ2tQD2Dup/+sKQptalDl # ui59SerVSJg8gAeV7N/ia4mrGoiez+SqV3olVfxyLFt3o/OQOnBmjhKUANoKLYlK # mUpKEFI0PfoT8Q1W/y6s9LTI6ekbi0igEbFUIBE8KDUGfIwnisEkBw5KcBZ3XwnH # mfznwlKo8QIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU # 3XRdTADbe5+gdMqxbvc8wDLAcM0wHwYDVR0jBBgwFoAUtqFUOQLDoD+Oirz61Pgc # ptE6Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMDAGA1Ud # HwQpMCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5jcmwwbAYI # KwYBBQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0 # dW0uY29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwv # Y3RuY2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0 # cDovL3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQB1iFgP5Y9Q # KJpTnxDsQ/z0O23JmoZifZdEOEmQvo/79PQg9nLF/GJe6ZiUBEyDBHMtFRK0mXj3 # Qv3gL0sYXe+PPMfwmreJHvgFGWQ7XwnfMh2YIpBrkvJnjwh8gIlNlUl4KENTK5DL # qsYPEtRQCw7R6p4s2EtWyDDr/M58iY2UBEqfUU/ujR9NuPyKk0bEcEi62JGxauFY # zZ/yld13fHaZskIoq2XazjaD0pQkcQiIueL0HKiohS6XgZuUtCKA7S6CHttZEsOb # QJ1j2s0urIDdqF7xaXFVaTHKtAuMfwi0jXtF3JJphrJfc+FFILgCbX/uYBPBlbBI # P4Ht4xxk2GmfzMn7oxPITpigQFJFWuzTMUUgdRHTxaTSKRJ/6Uh7ki/pFjf9sUAS # WgxT69QF9Ki4JF5nBIujxZ2sOU9e1HSCJwOfK07t5nnzbs1LbHuAIGJsRJiQ6HX/ # DW1XFOlXY1rc9HufFhWU+7Uk+hFkJsfzqBz3pRO+5aI6u5abI4Qws4YaeJH7H7M8 # X/YNoaArZbV4Ql+jarKsE0+8XvC4DJB+IVcvC9Ydqahi09mjQse4fxfef0L7E3hh # o2O3bLDM6v60rIRUCi2fJT2/IRU5ohgyTch4GuYWefSBsp5NPJh4QRTP9DC3gc5Q # EKtbrTY0Ka87Web7/zScvLmvQBm8JDFpDjCCBrkwggShoAMCAQICEQDn/2nHOzXO # S5Em2HR8aKWHMA0GCSqGSIb3DQEBDAUAMIGAMQswCQYDVQQGEwJQTDEiMCAGA1UE # ChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl # cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBO # ZXR3b3JrIENBIDIwHhcNMjEwNTE5MDUzMjA3WhcNMzYwNTE4MDUzMjA3WjBWMQsw # CQYDVQQGEwJQTDEhMB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQw # IgYDVQQDExtDZXJ0dW0gVGltZXN0YW1waW5nIDIwMjEgQ0EwggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQDpEh8ENe25XXrFppVBvoplf0530W0lddNmjtv4 # YSh/f7eDQKFaIqc7tHj7ox+u8vIsJZlroakUeMS3i3T8aJRC+eQs4FF0GqvkM6+W # ZO8kmzZfxmZaBYmMLs8FktgFYCzywmXeQ1fEExflee2OpbHVk665eXRHjH7MYZIz # Nnjl2m8Hy8ulB9mR8wL/W0v0pjKNT6G0sfrx1kk+3OGosFUb7yWNnVkWKU4qSxLv # 16kJ6oVJ4BSbZ4xMak6JLeB8szrK9vwGDpvGDnKCUMYL3NuviwH1x4gZG0JAXU3x # 2pOAz91JWKJSAmRy/l0s0l5bEYKolg+DMqVhlOANd8Yh5mkQWaMEvBRE/kAGzIqg # WhwzN2OsKIVtO8mf5sPWSrvyplSABAYa13rMYnzwfg08nljZHghquCJYCa/xHK9a # cev9UD7Y+usr15d7mrszzxhF1JOr1Mpup2chNSBlyOObhlSO16rwrffVrg/SzaKf # SndS5swRhr8bnDqNJY9TNyEYvBYpgF95K7p0g4LguR4A++Z1nFIHWVY5v0fNVZmg # zxD9uVo/gta3onGOQj3JCxgYx0KrCXu4yc9QiVwTFLWbNdHFSjBCt5/8Q9pLuRhV # ocdCunhcHudMS1CGQ/Rn0+7P+fzMgWdRKfEOh/hjLrnQ8BdJiYrZNxvIOhM2aa3z # EDHNwwIDAQABo4IBVTCCAVEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUvlQC # L79AbHNDzqwJJU6eQ0Qa7uAwHwYDVR0jBBgwFoAUtqFUOQLDoD+Oirz61PgcptE6 # Dv0wDgYDVR0PAQH/BAQDAgEGMBMGA1UdJQQMMAoGCCsGAQUFBwMIMDAGA1UdHwQp # MCcwJaAjoCGGH2h0dHA6Ly9jcmwuY2VydHVtLnBsL2N0bmNhMi5jcmwwbAYIKwYB # BQUHAQEEYDBeMCgGCCsGAQUFBzABhhxodHRwOi8vc3ViY2Eub2NzcC1jZXJ0dW0u # Y29tMDIGCCsGAQUFBzAChiZodHRwOi8vcmVwb3NpdG9yeS5jZXJ0dW0ucGwvY3Ru # Y2EyLmNlcjA5BgNVHSAEMjAwMC4GBFUdIAAwJjAkBggrBgEFBQcCARYYaHR0cDov # L3d3dy5jZXJ0dW0ucGwvQ1BTMA0GCSqGSIb3DQEBDAUAA4ICAQC4k1l3yUwV/ZQH # CKCneqAs8EGTnwEUJLdDpokN/dMhKjK0rR5qX8nIIHzxpQR3TAw2IRw1Uxsr2Pli # G3bCFqSdQTUbfaTq6V3vBzEebDru9QFjqlKnxCF2h1jhLNFFplbPJiW+JSnJTh1f # KEqEdKdxgl9rVTvlxfEJ7exOn25MGbd/wGPwuSmMxRJVO0wnqgS7kmoJjNF9zqee # hFSDDP8ZVkWg4EZ2tIS0M3uZmByRr+1Lkwjjt8AtW83mVnZTyTsOb+FNfwJY7DS4 # FmWhkRbgcHRetreoTirPOr/ozyDKhT8MTSTf6Lttg6s6T/u08mDWw6HK04ZRDfQ9 # sb77QV8mKgO44WGP31vXnVKoWVJpFBjPvjL8/Zck/5wXX2iqjOaLStFOR/IQki+E # hn4zlcgVm22ZVCBPF+l8nAwUUShCtKuSU7GmZLKCmmxQMkSiWILTm8EtVD6AxnJh # oq8EnhjEEyUoflkeRF2WhFiVQOmWTwZRr44IxWGkNJC6tTorW5rl2Zl+2e9JLPYf # 3pStAPMDoPKIjVXd6NW2+fZrNUBeDo2eOa5Fn7Brs/HLQff5Xgris5MeUbdVgDrF # 8uxO6cLPvZPo63j62SsNg55pTWk9fUIF9iPoRbb4QurjoY/woI1RAOKtYtTic6aA # Jq3u83RIPpGXBSJKwx4KJAOZnCDCtTGCBqIwggaeAgEBMGowVjELMAkGA1UEBhMC # UEwxITAfBgNVBAoTGEFzc2VjbyBEYXRhIFN5c3RlbXMgUy5BLjEkMCIGA1UEAxMb # Q2VydHVtIENvZGUgU2lnbmluZyAyMDIxIENBAhBX5gfP8LabvnxCXoItEBa/MA0G # CWCGSAFlAwQCAQUAoIGEMBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZI # hvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcC # ARUwLwYJKoZIhvcNAQkEMSIEIGPJ+7PrtHq98ZJZR8qhVwFNc764QzxP//0GUdfC # H+cRMA0GCSqGSIb3DQEBAQUABIIBgJXSVMt9+h0IBmKoPzLL/zesRfiJ6BAhXvgb # 2vRSjNcrWXs8/mSI9htAV9/Tc6wMcIiqpiwk2rgboDP2/MQCKMu9VPA/utIQqwyu # 7h+CcceFkDpt5tJKIlCKid/yRv+TM2Rp7gafFGd0HNZQY5vP0ufRGTcd32UNxL0S # 95HOsfgsyiqdZJc7n2Q4ohIUdTflZcvEECqD9On9x/MpI3CGNdtx93OGeHXBZwFC # Rfvd7V6/kR6QmL84byIRPYQVulK/AF3XxQK2hYVQPnHYRhB8zJcTCdZ3uhDwv/Br # lKYsTdyVNInMUvlyT1X+kEmOuUFLJh9D1FSmo6dJxbYGc/Wlw+sjgsY7jK1Jj+WZ # uiAcu39ytMP/Md5GZ07gluc6xs4Wr4ad2K8A/A2XmmexbZbrTydWluG/o1L2ls4N # tPDHBFOilUiD6V+t1LuV7ZPkSHxB6DkybE6+KnMAv19azsTfJAhVGOAFjaV2vILW # cc+U/AnuyTxTmy6YwSd9lCruaSfu8KGCBAIwggP+BgkqhkiG9w0BCQYxggPvMIID # 6wIBATBqMFYxCzAJBgNVBAYTAlBMMSEwHwYDVQQKExhBc3NlY28gRGF0YSBTeXN0 # ZW1zIFMuQS4xJDAiBgNVBAMTG0NlcnR1bSBUaW1lc3RhbXBpbmcgMjAyMSBDQQIQ # KPB3wRw2vf5fdDJHcCcuAzANBglghkgBZQMEAgIFAKCCAVYwGgYJKoZIhvcNAQkD # MQ0GCyqGSIb3DQEJEAEEMBwGCSqGSIb3DQEJBTEPFw0yNjEwMTMwOTQxMzRaMDcG # CyqGSIb3DQEJEAIvMSgwJjAkMCIEIIW+kOEK0kONfMkotq9IsJqyCBd87PiwEmxY # 05EFJcQ8MD8GCSqGSIb3DQEJBDEyBDD6qFEWYFjvwUPhbdbBG0CQeA4XBY6DtDLd # SIrWtlgzebkpC3l/daJECAo6Vo9GvRYwgZ8GCyqGSIb3DQEJEAIMMYGPMIGMMIGJ # MIGGBBRXFGhBDKha80JO+RZKUTYQ9NONmDBuMFqkWDBWMQswCQYDVQQGEwJQTDEh # MB8GA1UEChMYQXNzZWNvIERhdGEgU3lzdGVtcyBTLkEuMSQwIgYDVQQDExtDZXJ0 # dW0gVGltZXN0YW1waW5nIDIwMjEgQ0ECECjwd8EcNr3+X3QyR3AnLgMwDQYJKoZI # hvcNAQEBBQAEggIAbAI5sTxl+vay1gPCIYGZN2pMXc9Wau4n+FRfo8j3oL3zuqdc # WEiN6AyQRNzFgm7t6aF/hbdaNBA6e3b3FAWbK2yVrDrlpc+Kp7OqCqeoRB00UXDU # vrWQioj9E+OksxNiEzj4CrdhWEF/B/Dwbd9DfZFRUPBp9Wi3r4JpENPhnshAsQ+Z # 0KGoUsuB7glS3Ifgvpkb+MDRFXBAvi3KgFAAIh+H8zNWDVBRClfFyl5o9JI2XNSZ # rhLcwfNuo/In5P4RSxHcZLcNNFLNq6xDkuMtBXvaOw/R14mveHCxBjThOcoAlhv+ # EqbhJExhVPdbhx9hdfb5AjOcFzzf2zCMbxDz3DsSZqZL8j5sLYyvEFWSjvt0qTJJ # 90C70GMOkOMms02Y8/ltea0FBG2I4Aax4p4AN2wztfbX2W3nhmsMg6KOMFGHmHve # h5iOiWQmzz50zxZlG9q+T3TYw8BZ+x8o84zwoSN7OON9W+UpqA0hM/wIyqQ1QdHe # Ptd78YITsqZryFIUlml+6XE0OD1JiM1AGmWbP+fPQ4IvAJp0dmrAjUEUushrHToY # 1DQZlWr2KJj75FNVMwBiAQC/vGrsUCtG0aVOkvnEmkpXzEgXQiLR+oQG+XcKmA3N # lFznwh2BHHSdbpNDNBX6coGGMQAyl8RWdsqGsEMQK4H2Bn3smZCt5V8gxCk= # SIG # End signature block |