Modules/COM-Filters.psm1
#------------------- FUNCTIONS FOR COMPUTE OPS MANAGEMENT FILTERS ----------------------------------------------------------------------------------------------------------------------------------------------- using module .\Constants.psm1 # Public functions Function Get-HPECOMFilter { <# .SYNOPSIS Retrieve the list of saved filter resources. .DESCRIPTION This Cmdlet returns a collection of saved filters that have been saved in the specified region. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.). This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER Name Optional parameter that can be used to specify the name of a saved filter to display. .PARAMETER MatchingResources Optional switch parameter that can be used with -Name to get ressources matching a saved filter. .PARAMETER Filterableproperties Optional switch parameter that can be used to get information about resource properties usable in saved filters. .PARAMETER WhatIf Shows the raw REST API call that would be made to COM instead of sending the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE Get-HPECOMFilter -Region eu-central Return all saved filter resources located in the central european region. .EXAMPLE Get-HPECOMFilter -Region us-west -Name gen11 Return the saved filter resource named 'gen11' located in the Central European region. .EXAMPLE Get-HPECOMFilter -Region us-west -Name gen11 -MatchingResources Return all ressources matching the saved filter named 'gen11'. .EXAMPLE Get-HPECOMFilter -Region us-west -Filterableproperties Return information about resource properties usable in saved filters. .INPUTS No pipeline support #> [CmdletBinding(DefaultParameterSetName = 'Name')] Param( [Parameter (Mandatory)] [ValidateScript({ if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter (ParameterSetName = 'Name')] [Parameter (Mandatory, ParameterSetName = 'MatchingResources')] [String]$Name, [Parameter (ParameterSetName = 'MatchingResources')] [Switch]$MatchingResources, [Parameter (ParameterSetName = 'Filterableproperties')] [Switch]$Filterableproperties, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: {1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose } Process { "[{0}] Bound PS Parameters: {1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose if ($Filterableproperties) { $Uri = (Get-COMFiltersUri) + "/properties" } elseif ($MatchingResources) { $Uri = Get-COMFiltersUri try { [Array]$FilterList = Invoke-HPECOMWebRequest -Method Get -Uri $Uri -Region $Region $FilterID = $FilterList | Where-Object { $_.name -eq $Name } | ForEach-Object id "[{0}] ID found for filter '{1}': '{2}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Name, $FilterID | Write-Verbose if ($Null -eq $FilterID) { Throw "Filter with this name cannot be found!" } $Uri = (Get-COMFiltersUri) + "/" + $FilterID + "/matches" } catch { $PSCmdlet.ThrowTerminatingError($_) } } else { $Uri = Get-COMFiltersUri } try { [Array]$CollectionList = Invoke-HPECOMWebRequest -Method Get -Uri $Uri -Region $Region -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference } catch { $PSCmdlet.ThrowTerminatingError($_) } $ReturnData = @() if ($Null -ne $CollectionList) { if ($name -and -not $MatchingResources) { $CollectionList = $CollectionList | Where-Object name -eq $Name } # Add region to object $CollectionList | Add-Member -type NoteProperty -name region -value $Region if ($MatchingResources) { $ReturnData = Invoke-RepackageObjectWithType -RawObject $CollectionList -ObjectName "COM.Filters.MatchingResources" } elseif ($Filterableproperties) { $ReturnData = Invoke-RepackageObjectWithType -RawObject $CollectionList -ObjectName "COM.Filters.Filterableproperties" } else { $ReturnData = Invoke-RepackageObjectWithType -RawObject $CollectionList -ObjectName "COM.Filters" $ReturnData = $ReturnData | Sort-Object name } return $ReturnData } else { return } } } Function New-HPECOMFilter { <# .SYNOPSIS Create a new saved filter resource in a region. .DESCRIPTION This Cmdlet can be used to create a new saved filter. .PARAMETER Name Name of the external web service to deploy. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.) to deploy the external web service. This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER Filter Parameter to specify a server filter expression such as "serverGeneration eq 'GEN_11'", "state/connected eq 'false" The filter grammar is a subset of OData 4.0 using 'eq', 'ne', 'gt', 'ge', 'lt', 'le' and 'in' operations and 'and', 'or' logics. Servers can be filtered by: - biosFamily - createdAt - firmwareBundleUri - hardware and all nested properties - host and all nested properties - id - name - oneview and all nested properties - platformFamily - processorVendor - resourceUri - serverGeneration - state and all nested properties See https://developer.greenlake.hpe.com/docs/greenlake/services/compute-ops-mgmt/public/openapi/compute-ops-mgmt-latest/operation/get_v1beta2_servers/#tag/servers-v1beta2/operation/get_v1beta2_servers!in=query&path=filter&t=request .PARAMETER FilterTags Parameter to specify a tag filter expression such as 'Location' eq 'Houston', 'App' eq 'RHEL'. .PARAMETER Description Optional parameter to describe the filter. .PARAMETER EnabledForRRP Parameter to Flag the filter for use with scope-based access control (SBAC) used by resource restriction policies in HPE GreenLake. Only administrators with full access to all scopes can create, edit, or delete RRP-enabled filters. The use of some resource properties may be disallowed in RBAC-enabled filters. .PARAMETER DryRun Switch parameter to not create the saved filter but instead to perform validation of the filter name and syntax as if creating the filter. .PARAMETER WhatIf Shows the raw REST API call that would be made to COM instead of sending the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE New-HPECOMFilter -Region us-west -Name Gen11 -EnabledForRRP -Description "Filter for Gen11 servers" -Filter "serverGeneration eq 'GEN_11'" Create a new saved filter named 'Gen11' in the central western US region using the property 'serverGeneration' equal to 'GEN_11'" to create the filter. Also flags the filter for use with resource restriction policies used by scope-based access control (SBAC) (can be created using New-HPEGLResourceRestrictionPolicy). .EXAMPLE New-HPECOMFilter -Region us-west -Name Gen11-RHEL-Workload-Dev -Filter "serverGeneration in ('GEN_11') and host/osName in ('Red Hat Enterprise Linux')" -FilterTags "'Workload' eq 'Dev' and 'Location' eq 'Paris'" Create a new saved filter named 'Gen11-RHEL-Workload-Dev' in the central western US region using multiple filters properties and multiple filter tags properties to create the filter. .EXAMPLE New-HPECOMFilter -Region us-west -Name Powered-Off-servers -Filter "hardware/powerState eq 'OFF'" -DryRun Perform validation of the filter name and syntax of a new filter using the property 'hardware/powerState' equal to 'OFF'". .INPUTS Pipeline input is not supported .OUTPUTS System.Collections.ArrayList A custom status object or array of objects containing the following PsCustomObject keys: * Name - Name of the filter attempted to be created * Region - Name of the region where to create the filter * Status - Status of the creation attempt (Failed for http error return; Complete if creation is successful; Warning if no action is needed) * Details - More information about the status * Exception: Information about any exceptions generated during the operation. #> [CmdletBinding()] Param( [Parameter (Mandatory)] [ValidateScript({ if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter (Mandatory)] [ValidateScript({ $_.Length -lt 256 })] [String]$Name, [Parameter (Mandatory)] [String]$Filter, [String]$FilterTags, [String]$Description, [switch]$EnabledForRRP, [switch]$DryRun, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose $CreateFilterStatus = [System.Collections.ArrayList]::new() } Process { "[{0}] Bound PS Parameters: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose if ($DryRun) { $Uri = (Get-COMFiltersUri) + "?dry-run=true" } else { $Uri = Get-COMFiltersUri } # Build object for the output $objStatus = [pscustomobject]@{ Name = $Name Region = $Region Status = $Null Details = $Null Exception = $Null } try { $FilterResource = Get-HPECOMFilter -Region $Region -Name $Name } catch { $PSCmdlet.ThrowTerminatingError($_) } if ($FilterResource) { "[{0}] Filter '{1}' is already present in the '{2}' region!" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Name, $Region | Write-Verbose if ($WhatIf) { $ErrorMessage = "Filter '{0}': Resource is already present in the '{1}' region! No action needed." -f $Name, $Region Write-warning $ErrorMessage return } else { $objStatus.Status = "Warning" $objStatus.Details = "Filter already exists in the region! No action needed." } } else { # Build payload if ($FilterTags -and -not $Filter) { $payload = ConvertTo-Json @{ name = $Name description = $Description filterResourceType = "compute-ops-mgmt/server" enabledForRRP = [bool]$EnabledForRRP filterTags = $FilterTags } } elseif ($FilterTags -and $Filter) { $payload = ConvertTo-Json @{ name = $Name description = $Description filterResourceType = "compute-ops-mgmt/server" enabledForRRP = [bool]$EnabledForRRP filterTags = $FilterTags filter = $Filter } } else { $payload = ConvertTo-Json @{ name = $Name description = $Description filterResourceType = "compute-ops-mgmt/server" enabledForRRP = [bool]$EnabledForRRP filter = $Filter } } try { $Response = Invoke-HPECOMWebRequest -Region $Region -Uri $Uri -method POST -body $payload -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference if (-not $WhatIf) { "[{0}] Filter creation raw response: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Response | Write-Verbose "[{0}] Filter '{1}' successfully created in '{2}' region" -f $MyInvocation.InvocationName.ToString().ToUpper(), $name, $Region | Write-Verbose $objStatus.Status = "Complete" $objStatus.Details = "Filter successfully created in $Region region" } } catch { if (-not $WhatIf) { $objStatus.Status = "Failed" $objStatus.Details = "Filter cannot be created!" $objStatus.Exception = $Global:HPECOMInvokeReturnData } } } [void] $CreateFilterStatus.add($objStatus) } end { if (-not $WhatIf) { $CreateFilterStatus = Invoke-RepackageObjectWithType -RawObject $CreateFilterStatus -ObjectName "COM.objStatus.NSDE" Return $CreateFilterStatus } } } Function Remove-HPECOMFilter { <# .SYNOPSIS Removes a saved filter resource from a specified region. .DESCRIPTION This Cmdlet removes a saved filter resource from a specific region using its name property. .PARAMETER Name The name of the saved filter to remove. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.) where the saved filter should be removed. This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER WhatIf Displays the raw REST API call that would be made to COM instead of executing the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE Remove-HPECOMFilter -Region eu-central -Name 'Gen11' Removes the saved filter named 'Gen11' from the central EU region. .EXAMPLE Get-HPECOMFilter -Region us-west -Name 'Gen-11-Filter' | Remove-HPECOMFilter Removes the filter 'Gen-11-Filter' from the western US region. .EXAMPLE Get-HPECOMFilter -Region us-west | Where-Object {$_.name -eq 'Gen10-Workload-Dev' -or $_.name -eq 'Gen11-Workload-Dev'} | Remove-HPECOMFilter Removes the filters 'Gen10-Workload-Dev' and 'Gen11-Workload-Dev' from the western US region. .EXAMPLE Get-HPECOMFilter -Region eu-central | Remove-HPECOMFilter Removes all filters from the central EU region. .INPUTS System.Collections.ArrayList A list of filters retrieved from 'Get-HPECOMFilter'. .OUTPUTS System.Collections.ArrayList A custom status object or array of objects containing the following properties: * Name - The name of the filter attempted to be removed. * Region - The name of the region where the filter was removed. * Status - The status of the removal attempt (Failed for HTTP error; Complete if removal is successful; Warning if no action is needed). * Details - Additional information about the status. * Exception - Information about any exceptions generated during the operation. #> [CmdletBinding(DefaultParameterSetName = 'Default')] Param( [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [ValidateScript({ if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [String]$Name, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose $RemoveFilterStatus = [System.Collections.ArrayList]::new() } Process { "[{0}] Bound PS Parameters: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose try { $FiltersResource = Get-HPECOMFilter -Region $Region -Name $Name } catch { $PSCmdlet.ThrowTerminatingError($_) } # Build object for the output $objStatus = [pscustomobject]@{ Name = $Name Region = $Region Status = $Null Details = $Null Exception = $Null } $FilterID = $FiltersResource.id if (-not $FilterID) { # Must return a message if not found if ($WhatIf) { $ErrorMessage = "Filter '{0}': Resource cannot be found in the '{1}' region!" -f $Name, $Region Write-warning $ErrorMessage return } else { $objStatus.Status = "Failed" $objStatus.Details = "Filter cannot be found in the region!" } } else { $Uri = (Get-COMFiltersUri) + "/" + $FilterID # Removal task try { $Response = Invoke-HPECOMWebRequest -Region $Region -Uri $Uri -method DELETE -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference if (-not $WhatIf) { "[{0}] Filter removal raw response: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Response | Write-Verbose "[{0}] Filter '{1}' successfully deleted from '{2}' region" -f $MyInvocation.InvocationName.ToString().ToUpper(), $name, $Region | Write-Verbose $objStatus.Status = "Complete" $objStatus.Details = "Filter successfully deleted from $Region region" } } catch { if (-not $WhatIf) { $objStatus.Status = "Failed" $objStatus.Details = "Filter cannot be deleted!" $objStatus.Exception = $Global:HPECOMInvokeReturnData } } } [void] $RemoveFilterStatus.add($objStatus) } end { if (-not $WhatIf) { $RemoveFilterStatus = Invoke-RepackageObjectWithType -RawObject $RemoveFilterStatus -ObjectName "COM.objStatus.NSDE" Return $RemoveFilterStatus } } } Function Set-HPECOMFilter { <# .SYNOPSIS Update a filter resource in a specified region. If a parameter is not provided, the cmdlet retains the current settings and only updates the provided parameters. .DESCRIPTION This cmdlet modifies a filter resource in a specific region. .PARAMETER Name The name of the filter to update. .PARAMETER Region Specifies the region code of a Compute Ops Management instance provisioned in the workspace (e.g., 'us-west', 'eu-central', etc.) where the filter will be updated. This mandatory parameter can be retrieved using 'Get-HPEGLService -Name "Compute Ops Management" -ShowProvisioned' or 'Get-HPEGLRegion -ShowProvisioned'. Auto-completion (Tab key) is supported for this parameter, providing a list of region codes provisioned in your workspace. .PARAMETER NewName Specifies the new name of the filter. .PARAMETER Filter Specifies a filter expression such as "serverGeneration eq 'GEN_11'" or "state/connected eq 'false'". The filter grammar is a subset of OData 4.0 using 'eq', 'ne', 'gt', 'ge', 'lt', 'le' and 'in' operations, and 'and', 'or' logics. Servers can be filtered by: - `biosFamily` - `createdAt` - `firmwareBundleUri` - `hardware` and all nested properties - `host` and all nested properties - `id` - `name` - `oneview` and all nested properties - `platformFamily` - `processorVendor` - `resourceUri` - `serverGeneration` - `state` and all nested properties For more information, see [HPE GreenLake Documentation](https://developer.greenlake.hpe.com/docs/greenlake/services/compute-ops-mgmt/public/openapi/compute-ops-mgmt-latest/operation/get_v1beta2_servers/#tag/servers-v1beta2/operation/get_v1beta2_servers!in=query&path=filter&t=request). .PARAMETER FilterTags Optional. Specifies a filter expression for tags such as "'Location' eq 'Houston'", "'App' eq 'RHEL'", or "'OS' eq 'Linux'". .PARAMETER Description Optional. Describes the filter. .PARAMETER EnabledForRRP Boolean. Flags the filter for use with resource restriction policies used by scope-based access control (SBAC). Only administrators with full access to all scopes can create, edit, or delete RRP-enabled filters. The use of some resource properties may be disallowed in RRP-enabled filters. .PARAMETER WhatIf Shows the raw REST API call that would be made to COM instead of sending the request. This option is useful for understanding the inner workings of the native REST API calls used by COM. .EXAMPLE Set-HPECOMFilter -Region us-west -Name Gen11 -EnabledForRRP:$True -NewName Gen11-servers Changes the name of the filter named 'Gen11' to 'Gen11-servers' in the western US region and enables it for resource restriction policy. .EXAMPLE Set-HPECOMFilter -Region us-west -Name Gen11-Workload-Dev -FilterTags "'Workload-Dev' eq 'Dev' and 'Discover' eq 'Demo'" Changes the filter expression for tags of a filter named 'Gen11-Workload-Dev' in the western US region. .EXAMPLE Get-HPECOMFilter -Region us-west -Name Gen11-Workload-Dev | Set-HPECOMFilter -Filter "hardware/powerState eq 'OFF'" -Description "My filter for Gen11 servers" Gets the filter named 'Gen11-Workload-Dev' in the western US region and modifies its filter and description properties. .INPUTS System.Collections.ArrayList List of filter(s) from 'Get-HPECOMFilter'. .OUTPUTS System.Collections.ArrayList A custom status object or array of objects containing the following PsCustomObject keys: * Name - The name of the filter that was attempted to be updated. * Region - The region where the filter update was performed. * Status - The result of the update operation (`Complete` if successful, `Failed` if an error occurred, `Warning` if no action was needed). * Details - Additional information about the outcome of the update. * Exception - Any exception details if an error was encountered during the update. #> [CmdletBinding()] Param( [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [ValidateScript({ if (($_ -in $Global:HPECOMRegions.region)) { $true } else { Throw "The COM region '$_' is not provisioned in this workspace! Please specify a valid region code (e.g., 'us-west', 'eu-central'). `nYou can retrieve the region code using: Get-HPEGLService -Name 'Compute Ops Management' -ShowProvisioned. `nYou can also use the Tab key for auto-completion to see the list of provisioned region codes." } })] [ArgumentCompleter({ param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters) # Filter region based on $Global:HPECOMRegions global variable and create completions $Global:HPECOMRegions.region | Where-Object { $_ -like "$wordToComplete*" } | ForEach-Object { [System.Management.Automation.CompletionResult]::new($_, $_, 'ParameterValue', $_) } })] [String]$Region, [Parameter (Mandatory, ValueFromPipelineByPropertyName)] [ValidateScript({ $_.Length -le 100 })] [String]$Name, [ValidateScript({ $_.Length -le 100 })] [String]$NewName, [Parameter (ValueFromPipelineByPropertyName)] [ValidateScript({ $_.Length -le 2000 })] [String]$Filter, [Parameter (ValueFromPipelineByPropertyName)] [ValidateScript({ $_.Length -le 2000 })] [String]$FilterTags, [Parameter (ValueFromPipelineByPropertyName)] [ValidateScript({ $_.Length -le 10000 })] [String]$Description, [Parameter (ValueFromPipelineByPropertyName)] [bool]$EnabledForRRP, [Switch]$WhatIf ) Begin { $Caller = (Get-PSCallStack)[1].Command "[{0}] Called from: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Caller | Write-Verbose $SetFilterStatus = [System.Collections.ArrayList]::new() } Process { "[{0}] Bound PS Parameters: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($PSBoundParameters | out-string) | Write-Verbose try { $FilterResource = Get-HPECOMFilter -Region $Region -Name $Name $FilterID = $FilterResource.id } catch { $PSCmdlet.ThrowTerminatingError($_) } # Build object for the output $objStatus = [pscustomobject]@{ Name = $Name Region = $Region Status = $Null Details = $Null Exception = $Null } "[{0}] Filter ID found: '{1}'" -f $MyInvocation.InvocationName.ToString().ToUpper(), $FilterID | Write-Verbose if (-not $FilterID) { # Must return a message if not found if ($WhatIf) { $ErrorMessage = "Filter '{0}': Resource cannot be found in the '{1}' region!" -f $Name, $Region Write-warning $ErrorMessage return } else { $objStatus.Status = "Failed" $objStatus.Details = "Filter cannot be found in the region!" } } else { $Uri = (Get-COMFiltersUri) + "/" + $FilterID $Payload = @{} $Payload.filterResourceType = "compute-ops-mgmt/server" # Conditionally add properties if ($NewName) { $Payload.name = $NewName } else { $Payload.name = $Name } if (-not $PSBoundParameters.ContainsKey('Description')) { if ($FilterResource.description) { $Payload.description = $FilterResource.description } else { $Payload.description = $Null } } else { $Payload.description = $Description } if (-not $PSBoundParameters.ContainsKey('EnabledForRRP')) { $Payload.enabledForRRP = $FilterResource.enabledForRRP } else { $Payload.enabledForRRP = [bool]$EnabledForRRP } if (-not $PSBoundParameters.ContainsKey('FilterTags')) { if ($FilterResource.filterTags) { $Payload.filterTags = $FilterResource.filterTags } # No need to add 'FilterTags' with a null value if not set # else { # $Payload.filterTags = $Null # } } else { $Payload.filterTags = $FilterTags } if (-not $PSBoundParameters.ContainsKey('Filter')) { if ($FilterResource.filter) { $Payload.filter = $FilterResource.filter } # Filter cannot be $Null } else { $Payload.filter = $Filter } # Convert the hashtable to JSON $jsonPayload = $Payload | ConvertTo-Json # Set resource try { $Response = Invoke-HPECOMWebRequest -Region $Region -Uri $Uri -method PATCH -body $jsonPayload -ContentType "application/merge-patch+json" -WhatIfBoolean $WhatIf -Verbose:$VerbosePreference if (-not $WhatIf) { "[{0}] Filter update raw response: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), $Response | Write-Verbose "[{0}] Filter '{1}' successfully updated in '{2}' region" -f $MyInvocation.InvocationName.ToString().ToUpper(), $name, $Region | Write-Verbose $objStatus.Status = "Complete" $objStatus.Details = "Filter successfully updated in $Region region" } } catch { if (-not $WhatIf) { $objStatus.Status = "Failed" $objStatus.Details = "Filter cannot be updated!" $objStatus.Exception = $Global:HPECOMInvokeReturnData } } } [void] $SetFilterStatus.add($objStatus) } end { if (-not $WhatIf) { $SetFilterStatus = Invoke-RepackageObjectWithType -RawObject $SetFilterStatus -ObjectName "COM.objStatus.NSDE" Return $SetFilterStatus } } } # Private functions (not exported) function Invoke-RepackageObjectWithType { Param ( $RawObject, $ObjectName, [boolean] $WhatIf = $false ) process { if ( $RawObject ) { $OutputObject = @() if ( $WhatIf ) { Return } foreach ( $RawElementObject in $RawObject ) { # "[{0}] Element: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject | out-string) | write-verbose $DataSetType = "HPEGreenLake.$ObjectName" $RawElementObject.PSTypeNames.Insert(0, $DataSetType) # "[{0}] Element PSTypeName set: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject.PSTypeNames[0] | out-string)| write-verbose # "[{0}] Element PSObject TypeNames set: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject.PSObject.TypeNames[0] | out-string)| write-verbose $RawElementObject.PSObject.TypeNames.Insert(0, $DataSetType) # "[{0}] Element PSObject TypeNames set: `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($RawElementObject.PSObject.TypeNames[0] | out-string)| write-verbose $OutputObject += $RawElementObject } # "[{0}] Object typenames : `n{1}" -f $MyInvocation.InvocationName.ToString().ToUpper(), ($OutputObject.PSObject.TypeNames | Out-String) | write-verbose if ($OutputObject.PSObject.TypeNames -notcontains $DataSetType) { # "[{0}] Object typenames added using Add-Member as the object is read only" -f $MyInvocation.InvocationName.ToString().ToUpper() | write-verbose foreach ($item in $OutputObject) { [void]($item | Add-Member -MemberType NoteProperty -Name PSObject.TypeNames -Value @( $DataSetType) -Force) } } return $OutputObject } else { # "[{0}] Null value sent to create object type." -f $MyInvocation.InvocationName.ToString().ToUpper() | Write-Verbose return } } } # Export only public functions and aliases Export-ModuleMember -Function 'Get-HPECOMFilter', 'New-HPECOMFilter', 'Remove-HPECOMFilter', 'Set-HPECOMFilter' -Alias * # SIG # Begin signature block # MIIunwYJKoZIhvcNAQcCoIIukDCCLowCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDgrUJo9kh5eHi9 # EqQHyuMB2fvnJQPCj02fAkuyPcDm8KCCEfYwggVvMIIEV6ADAgECAhBI/JO0YFWU # jTanyYqJ1pQWMA0GCSqGSIb3DQEBDAUAMHsxCzAJBgNVBAYTAkdCMRswGQYDVQQI # DBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoM # EUNvbW9kbyBDQSBMaW1pdGVkMSEwHwYDVQQDDBhBQUEgQ2VydGlmaWNhdGUgU2Vy # dmljZXMwHhcNMjEwNTI1MDAwMDAwWhcNMjgxMjMxMjM1OTU5WjBWMQswCQYDVQQG # EwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMS0wKwYDVQQDEyRTZWN0aWdv # IFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCN55QSIgQkdC7/FiMCkoq2rjaFrEfUI5ErPtx94jGgUW+s # hJHjUoq14pbe0IdjJImK/+8Skzt9u7aKvb0Ffyeba2XTpQxpsbxJOZrxbW6q5KCD # J9qaDStQ6Utbs7hkNqR+Sj2pcaths3OzPAsM79szV+W+NDfjlxtd/R8SPYIDdub7 # P2bSlDFp+m2zNKzBenjcklDyZMeqLQSrw2rq4C+np9xu1+j/2iGrQL+57g2extme # me/G3h+pDHazJyCh1rr9gOcB0u/rgimVcI3/uxXP/tEPNqIuTzKQdEZrRzUTdwUz # T2MuuC3hv2WnBGsY2HH6zAjybYmZELGt2z4s5KoYsMYHAXVn3m3pY2MeNn9pib6q # RT5uWl+PoVvLnTCGMOgDs0DGDQ84zWeoU4j6uDBl+m/H5x2xg3RpPqzEaDux5mcz # mrYI4IAFSEDu9oJkRqj1c7AGlfJsZZ+/VVscnFcax3hGfHCqlBuCF6yH6bbJDoEc # QNYWFyn8XJwYK+pF9e+91WdPKF4F7pBMeufG9ND8+s0+MkYTIDaKBOq3qgdGnA2T # OglmmVhcKaO5DKYwODzQRjY1fJy67sPV+Qp2+n4FG0DKkjXp1XrRtX8ArqmQqsV/ # AZwQsRb8zG4Y3G9i/qZQp7h7uJ0VP/4gDHXIIloTlRmQAOka1cKG8eOO7F/05QID # AQABo4IBEjCCAQ4wHwYDVR0jBBgwFoAUoBEKIz6W8Qfs4q8p74Klf9AwpLQwHQYD # VR0OBBYEFDLrkpr/NZZILyhAQnAgNpFcF4XmMA4GA1UdDwEB/wQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMDMBsGA1UdIAQUMBIwBgYE # VR0gADAIBgZngQwBBAEwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybC5jb21v # ZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNAYIKwYBBQUHAQEE # KDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZI # hvcNAQEMBQADggEBABK/oe+LdJqYRLhpRrWrJAoMpIpnuDqBv0WKfVIHqI0fTiGF # OaNrXi0ghr8QuK55O1PNtPvYRL4G2VxjZ9RAFodEhnIq1jIV9RKDwvnhXRFAZ/ZC # J3LFI+ICOBpMIOLbAffNRk8monxmwFE2tokCVMf8WPtsAO7+mKYulaEMUykfb9gZ # pk+e96wJ6l2CxouvgKe9gUhShDHaMuwV5KZMPWw5c9QLhTkg4IUaaOGnSDip0TYl # d8GNGRbFiExmfS9jzpjoad+sPKhdnckcW67Y8y90z7h+9teDnRGWYpquRRPaf9xH # +9/DUp/mBlXpnYzyOmJRvOwkDynUWICE5EV7WtgwggYaMIIEAqADAgECAhBiHW0M # UgGeO5B5FSCJIRwKMA0GCSqGSIb3DQEBDAUAMFYxCzAJBgNVBAYTAkdCMRgwFgYD # VQQKEw9TZWN0aWdvIExpbWl0ZWQxLTArBgNVBAMTJFNlY3RpZ28gUHVibGljIENv # ZGUgU2lnbmluZyBSb290IFI0NjAeFw0yMTAzMjIwMDAwMDBaFw0zNjAzMjEyMzU5 # NTlaMFQxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxKzAp # BgNVBAMTIlNlY3RpZ28gUHVibGljIENvZGUgU2lnbmluZyBDQSBSMzYwggGiMA0G # CSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQCbK51T+jU/jmAGQ2rAz/V/9shTUxjI # ztNsfvxYB5UXeWUzCxEeAEZGbEN4QMgCsJLZUKhWThj/yPqy0iSZhXkZ6Pg2A2NV # DgFigOMYzB2OKhdqfWGVoYW3haT29PSTahYkwmMv0b/83nbeECbiMXhSOtbam+/3 # 6F09fy1tsB8je/RV0mIk8XL/tfCK6cPuYHE215wzrK0h1SWHTxPbPuYkRdkP05Zw # mRmTnAO5/arnY83jeNzhP06ShdnRqtZlV59+8yv+KIhE5ILMqgOZYAENHNX9SJDm # +qxp4VqpB3MV/h53yl41aHU5pledi9lCBbH9JeIkNFICiVHNkRmq4TpxtwfvjsUe # dyz8rNyfQJy/aOs5b4s+ac7IH60B+Ja7TVM+EKv1WuTGwcLmoU3FpOFMbmPj8pz4 # 4MPZ1f9+YEQIQty/NQd/2yGgW+ufflcZ/ZE9o1M7a5Jnqf2i2/uMSWymR8r2oQBM # dlyh2n5HirY4jKnFH/9gRvd+QOfdRrJZb1sCAwEAAaOCAWQwggFgMB8GA1UdIwQY # MBaAFDLrkpr/NZZILyhAQnAgNpFcF4XmMB0GA1UdDgQWBBQPKssghyi47G9IritU # pimqF6TNDDAOBgNVHQ8BAf8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBADATBgNV # HSUEDDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEsG # A1UdHwREMEIwQKA+oDyGOmh0dHA6Ly9jcmwuc2VjdGlnby5jb20vU2VjdGlnb1B1 # YmxpY0NvZGVTaWduaW5nUm9vdFI0Ni5jcmwwewYIKwYBBQUHAQEEbzBtMEYGCCsG # AQUFBzAChjpodHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl # U2lnbmluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0 # aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEABv+C4XdjNm57oRUgmxP/BP6YdURh # w1aVcdGRP4Wh60BAscjW4HL9hcpkOTz5jUug2oeunbYAowbFC2AKK+cMcXIBD0Zd # OaWTsyNyBBsMLHqafvIhrCymlaS98+QpoBCyKppP0OcxYEdU0hpsaqBBIZOtBajj # cw5+w/KeFvPYfLF/ldYpmlG+vd0xqlqd099iChnyIMvY5HexjO2AmtsbpVn0OhNc # WbWDRF/3sBp6fWXhz7DcML4iTAWS+MVXeNLj1lJziVKEoroGs9Mlizg0bUMbOalO # hOfCipnx8CaLZeVme5yELg09Jlo8BMe80jO37PU8ejfkP9/uPak7VLwELKxAMcJs # zkyeiaerlphwoKx1uHRzNyE6bxuSKcutisqmKL5OTunAvtONEoteSiabkPVSZ2z7 # 6mKnzAfZxCl/3dq3dUNw4rg3sTCggkHSRqTqlLMS7gjrhTqBmzu1L90Y1KWN/Y5J # KdGvspbOrTfOXyXvmPL6E52z1NZJ6ctuMFBQZH3pwWvqURR8AgQdULUvrxjUYbHH # j95Ejza63zdrEcxWLDX6xWls/GDnVNueKjWUH3fTv1Y8Wdho698YADR7TNx8X8z2 # Bev6SivBBOHY+uqiirZtg0y9ShQoPzmCcn63Syatatvx157YK9hlcPmVoa1oDE5/ # L9Uo2bC5a4CH2RwwggZhMIIEyaADAgECAhEAyDHh+zCQwUNyJV9S6gqqvTANBgkq # hkiG9w0BAQwFADBUMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1p # dGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgQ0EgUjM2 # MB4XDTI1MDUyMDAwMDAwMFoXDTI4MDUxOTIzNTk1OVowdzELMAkGA1UEBhMCVVMx # DjAMBgNVBAgMBVRleGFzMSswKQYDVQQKDCJIZXdsZXR0IFBhY2thcmQgRW50ZXJw # cmlzZSBDb21wYW55MSswKQYDVQQDDCJIZXdsZXR0IFBhY2thcmQgRW50ZXJwcmlz # ZSBDb21wYW55MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA37AD03qw # cmuCQyxRB2VBM7SfUf0SmpQb8iaPvGmxw5uoDBY3gdC/3Xq/rfM3ndCn03hNdGyu # cpC7tD4zmel6yYqxyXDVr45Jd2cz9jFXoYTOMcuDV6I6CvU/EnbFxWhv0VCp+2Ip # z4+uJGI6aVlMpFpLbgPjhp9ogd/89HEyi1FkSFoarnvxxaXm93S81k7FD/4Edtvu # muGI4V8p39GfbCiMuHku8BzSQ2g86gWFnOaVhY6h4XWvEmE8LPYkU/STrej28Flg # kSt9f/Jg6+dvRKm92uN2Z760Eql9+DTWkGmGe4YrIyD25XDa07sS9tIpVWzLrGOy # ecaVpJwVVBqCadXDgkgTYKw/UlS+cEqsviT6wREGl4aX/GbeNO6Y4oDTTYkabW3p # eg1ku0v90oDqzoTaWEE5ly2UajvXIgzpFLLXqpR6GYkv/y3ZJV0chBqRtAObebH7 # XOBa5a2kqMBw0gkIZBJHd8+PCPH/U7eJkeKXtGGj2uTudcGjZgOjVcFYdCRnufJd # isrV7bj0Hzghcv3QyRXL3rRjcNb4ccKNnSgF/8cmiTVpvFHTfUKsYdkbM6wsbjXR # dJNADjGOYRms7tKsii3/oXO+2S1Um7yomBZQ2+wVRCY6MrRX1onDKid5t5AyWFtR # u0aQcdBmHG6JeDiQ3Hrb2g9kZhuFkgABVBkCAwEAAaOCAYkwggGFMB8GA1UdIwQY # MBaAFA8qyyCHKLjsb0iuK1SmKaoXpM0MMB0GA1UdDgQWBBQH4rUE0gsy8LW2G3vm # oYtOnZ8zEjAOBgNVHQ8BAf8EBAMCB4AwDAYDVR0TAQH/BAIwADATBgNVHSUEDDAK # BggrBgEFBQcDAzBKBgNVHSAEQzBBMDUGDCsGAQQBsjEBAgEDAjAlMCMGCCsGAQUF # BwIBFhdodHRwczovL3NlY3RpZ28uY29tL0NQUzAIBgZngQwBBAEwSQYDVR0fBEIw # QDA+oDygOoY4aHR0cDovL2NybC5zZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29k # ZVNpZ25pbmdDQVIzNi5jcmwweQYIKwYBBQUHAQEEbTBrMEQGCCsGAQUFBzAChjho # dHRwOi8vY3J0LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ0NB # UjM2LmNydDAjBggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJ # KoZIhvcNAQEMBQADggGBAIax+Yaj5EciDlztft4iAfD2CtIWEF0cxR+UbbvJEs86 # 5wyoO3ZQoujr0FJ+P5fjDKLbamHrEWmyoD2YC4lzecmnFOnY0y4uJ9zBY8B6X6TU # 9e6+TfZtlXd44YffXYAfoLX+uYjVJcZOaMuXF61+CFpjLJjepsD8m1gdj5QUz2sH # 6GOfU6mEm8SHvKpgPMV/yhEKqgjlenY6Ao49RkxnDuvRlMP8SFPB+8bxiLegEdGa # ei8nSr/j5YeDZFevUJ696T4W45QGrwAhBBpbKDz6CzlImC1b2C8Bp02XBAsOQs/u # CIaQv5XxUmVxmb85tDJkd7QfqHo2z1T2NYMkvXUcSClYRuVxxC/frpqcrxS9O9xE # v65BoUztAJSXsTdfpUjWeNOnhq8lrwa2XAD3fbagNF6ElsBiNDSbwHCG/iY4kAya # VpbAYtaa6TfzdI/I0EaCX5xYRW56ccI2AnbaEVKz9gVjzi8hBLALlRhrs1uMFtPj # nZ+oA+rbZZyGZkz3xbUYKTGCG/8wghv7AgEBMGkwVDELMAkGA1UEBhMCR0IxGDAW # BgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMg # Q29kZSBTaWduaW5nIENBIFIzNgIRAMgx4fswkMFDciVfUuoKqr0wDQYJYIZIAWUD # BAIBBQCgfDAQBgorBgEEAYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGC # NwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQx # IgQgiEcYQwL15X1+QhZ+eaShbIvUmfF7RwgZIYjHKTyV18swDQYJKoZIhvcNAQEB # BQAEggIAqaFrttJjBDKPRbNgoexmjmmLwk6A/RJpPGhZfpy0Zyv9+GkYMQ/96+y0 # vyDqpuRB9C2aOUFoUfNcBdMYej8DLTANYcdJbcFJP/okJvHc4bl3x1biFIu/QCzu # kToUgTMTA3U34Zy2XcvKymQbd46RLQjWeaAH1pqte0ywgmvhtDrPHb0jerfdj5zs # F4nSP/xUQwRPAJS/GFjkrH3mlnI6zBUz2f6ZxVrR3PUNj+NMhcITHYtw0xfH+1zi # ZZeveelpjOxIx9eYiJg0GKG7oSp470gKVW9+cj4VYm2Rx/7kHe4GAh/7IjPu+cab # fYLLlIjf0tfs2lueAiLMwh+xvojeP7r3reKBfTQAY7rn0C5vYjN4NTDFEJQWQ9Us # 241z1MbehCQsyG9NLEkRGwH7HU+6qSolVoXfWq8PuRSPIrRSZraJApa0HOJBvvSL # V7V7P6nxWiXLtqDB+y4z31PJ9s9PiXFTo+y80KDU3rdjirYbavb4+SdO2B3G3oRS # gDlfWnZ/pVl7IqM/162vuK77UZElGkJMxoGaIh0ljJ43zry2pgzGtw5HPzUnbhOi # UPoCHSY4tWUo2gzg/NPParxNZyHgMZQGjiZVqsIbCCK0HVSBnRVtgiAJTg0tTzxw # wEp2rgDoKsP2LZk78uzctYAdPckC2PKgtsNX7+05XHd3OK6v5i6hghjpMIIY5QYK # KwYBBAGCNwMDATGCGNUwghjRBgkqhkiG9w0BBwKgghjCMIIYvgIBAzEPMA0GCWCG # SAFlAwQCAgUAMIIBCAYLKoZIhvcNAQkQAQSggfgEgfUwgfICAQEGCisGAQQBsjEC # AQEwQTANBglghkgBZQMEAgIFAAQwPBt26G8Tt7bU5vj6dvIuxjXDTjwDFjTHVCIf # jtTcgRgXJjE5SjMgEs0tEcZWwmgFAhUAjWJ8E+/7auznOV3pRAG8yjy46L4YDzIw # MjUxMDAyMTU0NTA3WqB2pHQwcjELMAkGA1UEBhMCR0IxFzAVBgNVBAgTDldlc3Qg # WW9ya3NoaXJlMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxMDAuBgNVBAMTJ1Nl # Y3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcgU2lnbmVyIFIzNqCCEwQwggZiMIIE # yqADAgECAhEApCk7bh7d16c0CIetek63JDANBgkqhkiG9w0BAQwFADBVMQswCQYD # VQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSwwKgYDVQQDEyNTZWN0 # aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIENBIFIzNjAeFw0yNTAzMjcwMDAwMDBa # Fw0zNjAzMjEyMzU5NTlaMHIxCzAJBgNVBAYTAkdCMRcwFQYDVQQIEw5XZXN0IFlv # cmtzaGlyZTEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTAwLgYDVQQDEydTZWN0 # aWdvIFB1YmxpYyBUaW1lIFN0YW1waW5nIFNpZ25lciBSMzYwggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQDThJX0bqRTePI9EEt4Egc83JSBU2dhrJ+wY7Jg # Reuff5KQNhMuzVytzD+iXazATVPMHZpH/kkiMo1/vlAGFrYN2P7g0Q8oPEcR3h0S # ftFNYxxMh+bj3ZNbbYjwt8f4DsSHPT+xp9zoFuw0HOMdO3sWeA1+F8mhg6uS6BJp # PwXQjNSHpVTCgd1gOmKWf12HSfSbnjl3kDm0kP3aIUAhsodBYZsJA1imWqkAVqwc # Gfvs6pbfs/0GE4BJ2aOnciKNiIV1wDRZAh7rS/O+uTQcb6JVzBVmPP63k5xcZNzG # o4DOTV+sM1nVrDycWEYS8bSS0lCSeclkTcPjQah9Xs7xbOBoCdmahSfg8Km8ffq8 # PhdoAXYKOI+wlaJj+PbEuwm6rHcm24jhqQfQyYbOUFTKWFe901VdyMC4gRwRAq04 # FH2VTjBdCkhKts5Py7H73obMGrxN1uGgVyZho4FkqXA8/uk6nkzPH9QyHIED3c9C # GIJ098hU4Ig2xRjhTbengoncXUeo/cfpKXDeUcAKcuKUYRNdGDlf8WnwbyqUblj4 # zj1kQZSnZud5EtmjIdPLKce8UhKl5+EEJXQp1Fkc9y5Ivk4AZacGMCVG0e+wwGsj # cAADRO7Wga89r/jJ56IDK773LdIsL3yANVvJKdeeS6OOEiH6hpq2yT+jJ/lHa9zE # dqFqMwIDAQABo4IBjjCCAYowHwYDVR0jBBgwFoAUX1jtTDF6omFCjVKAurNhlxmi # MpswHQYDVR0OBBYEFIhhjKEqN2SBKGChmzHQjP0sAs5PMA4GA1UdDwEB/wQEAwIG # wDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMIMEoGA1UdIARD # MEEwNQYMKwYBBAGyMQECAQMIMCUwIwYIKwYBBQUHAgEWF2h0dHBzOi8vc2VjdGln # by5jb20vQ1BTMAgGBmeBDAEEAjBKBgNVHR8EQzBBMD+gPaA7hjlodHRwOi8vY3Js # LnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNUaW1lU3RhbXBpbmdDQVIzNi5jcmww # egYIKwYBBQUHAQEEbjBsMEUGCCsGAQUFBzAChjlodHRwOi8vY3J0LnNlY3RpZ28u # Y29tL1NlY3RpZ29QdWJsaWNUaW1lU3RhbXBpbmdDQVIzNi5jcnQwIwYIKwYBBQUH # MAGGF2h0dHA6Ly9vY3NwLnNlY3RpZ28uY29tMA0GCSqGSIb3DQEBDAUAA4IBgQAC # gT6khnJRIfllqS49Uorh5ZvMSxNEk4SNsi7qvu+bNdcuknHgXIaZyqcVmhrV3PHc # mtQKt0blv/8t8DE4bL0+H0m2tgKElpUeu6wOH02BjCIYM6HLInbNHLf6R2qHC1SU # sJ02MWNqRNIT6GQL0Xm3LW7E6hDZmR8jlYzhZcDdkdw0cHhXjbOLsmTeS0SeRJ1W # JXEzqt25dbSOaaK7vVmkEVkOHsp16ez49Bc+Ayq/Oh2BAkSTFog43ldEKgHEDBbC # Iyba2E8O5lPNan+BQXOLuLMKYS3ikTcp/Qw63dxyDCfgqXYUhxBpXnmeSO/WA4Nw # dwP35lWNhmjIpNVZvhWoxDL+PxDdpph3+M5DroWGTc1ZuDa1iXmOFAK4iwTnlWDg # 3QNRsRa9cnG3FBBpVHnHOEQj4GMkrOHdNDTbonEeGvZ+4nSZXrwCW4Wv2qyGDBLl # Kk3kUW1pIScDCpm/chL6aUbnSsrtbepdtbCLiGanKVR/KC1gsR0tC6Q0RfWOI4ow # ggYUMIID/KADAgECAhB6I67aU2mWD5HIPlz0x+M/MA0GCSqGSIb3DQEBDAUAMFcx # CzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLjAsBgNVBAMT # JVNlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcgUm9vdCBSNDYwHhcNMjEwMzIy # MDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBVMQswCQYDVQQGEwJHQjEYMBYGA1UEChMP # U2VjdGlnbyBMaW1pdGVkMSwwKgYDVQQDEyNTZWN0aWdvIFB1YmxpYyBUaW1lIFN0 # YW1waW5nIENBIFIzNjCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAM2Y # 2ENBq26CK+z2M34mNOSJjNPvIhKAVD7vJq+MDoGD46IiM+b83+3ecLvBhStSVjeY # XIjfa3ajoW3cS3ElcJzkyZlBnwDEJuHlzpbN4kMH2qRBVrjrGJgSlzzUqcGQBaCx # pectRGhhnOSwcjPMI3G0hedv2eNmGiUbD12OeORN0ADzdpsQ4dDi6M4YhoGE9cbY # 11XxM2AVZn0GiOUC9+XE0wI7CQKfOUfigLDn7i/WeyxZ43XLj5GVo7LDBExSLnh+ # va8WxTlA+uBvq1KO8RSHUQLgzb1gbL9Ihgzxmkdp2ZWNuLc+XyEmJNbD2OIIq/fW # lwBp6KNL19zpHsODLIsgZ+WZ1AzCs1HEK6VWrxmnKyJJg2Lv23DlEdZlQSGdF+z+ # Gyn9/CRezKe7WNyxRf4e4bwUtrYE2F5Q+05yDD68clwnweckKtxRaF0VzN/w76kO # LIaFVhf5sMM/caEZLtOYqYadtn034ykSFaZuIBU9uCSrKRKTPJhWvXk4CllgrwID # AQABo4IBXDCCAVgwHwYDVR0jBBgwFoAU9ndq3T/9ARP/FqFsggIv0Ao9FCUwHQYD # VR0OBBYEFF9Y7UwxeqJhQo1SgLqzYZcZojKbMA4GA1UdDwEB/wQEAwIBhjASBgNV # HRMBAf8ECDAGAQH/AgEAMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBEGA1UdIAQKMAgw # BgYEVR0gADBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8vY3JsLnNlY3RpZ28uY29t # L1NlY3RpZ29QdWJsaWNUaW1lU3RhbXBpbmdSb290UjQ2LmNybDB8BggrBgEFBQcB # AQRwMG4wRwYIKwYBBQUHMAKGO2h0dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGln # b1B1YmxpY1RpbWVTdGFtcGluZ1Jvb3RSNDYucDdjMCMGCCsGAQUFBzABhhdodHRw # Oi8vb2NzcC5zZWN0aWdvLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAEtd7IK0ONVgM # noEdJVj9TC1ndK/HYiYh9lVUacahRoZ2W2hfiEOyQExnHk1jkvpIJzAMxmEc6ZvI # yHI5UkPCbXKspioYMdbOnBWQUn733qMooBfIghpR/klUqNxx6/fDXqY0hSU1OSkk # Sivt51UlmJElUICZYBodzD3M/SFjeCP59anwxs6hwj1mfvzG+b1coYGnqsSz2wSK # r+nDO+Db8qNcTbJZRAiSazr7KyUJGo1c+MScGfG5QHV+bps8BX5Oyv9Ct36Y4Il6 # ajTqV2ifikkVtB3RNBUgwu/mSiSUice/Jp/q8BMk/gN8+0rNIE+QqU63JoVMCMPY # 2752LmESsRVVoypJVt8/N3qQ1c6FibbcRabo3azZkcIdWGVSAdoLgAIxEKBeNh9A # QO1gQrnh1TA8ldXuJzPSuALOz1Ujb0PCyNVkWk7hkhVHfcvBfI8NtgWQupiaAeNH # e0pWSGH2opXZYKYG4Lbukg7HpNi/KqJhue2Keak6qH9A8CeEOB7Eob0Zf+fU+CCQ # aL0cJqlmnx9HCDxF+3BLbUufrV64EbTI40zqegPZdA+sXCmbcZy6okx/SjwsusWR # ItFA3DE8MORZeFb6BmzBtqKJ7l939bbKBy2jvxcJI98Va95Q5JnlKor3m0E7xpMe # YRriWklUPsetMSf2NvUQa/E5vVyefQIwggaCMIIEaqADAgECAhA2wrC9fBs656Oz # 3TbLyXVoMA0GCSqGSIb3DQEBDAUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # TmV3IEplcnNleTEUMBIGA1UEBxMLSmVyc2V5IENpdHkxHjAcBgNVBAoTFVRoZSBV # U0VSVFJVU1QgTmV0d29yazEuMCwGA1UEAxMlVVNFUlRydXN0IFJTQSBDZXJ0aWZp # Y2F0aW9uIEF1dGhvcml0eTAeFw0yMTAzMjIwMDAwMDBaFw0zODAxMTgyMzU5NTla # MFcxCzAJBgNVBAYTAkdCMRgwFgYDVQQKEw9TZWN0aWdvIExpbWl0ZWQxLjAsBgNV # BAMTJVNlY3RpZ28gUHVibGljIFRpbWUgU3RhbXBpbmcgUm9vdCBSNDYwggIiMA0G # CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCIndi5RWedHd3ouSaBmlRUwHxJBZvM # WhUP2ZQQRLRBQIF3FJmp1OR2LMgIU14g0JIlL6VXWKmdbmKGRDILRxEtZdQnOh2q # mcxGzjqemIk8et8sE6J+N+Gl1cnZocew8eCAawKLu4TRrCoqCAT8uRjDeypoGJrr # uH/drCio28aqIVEn45NZiZQI7YYBex48eL78lQ0BrHeSmqy1uXe9xN04aG0pKG9k # i+PC6VEfzutu6Q3IcZZfm00r9YAEp/4aeiLhyaKxLuhKKaAdQjRaf/h6U13jQEV1 # JnUTCm511n5avv4N+jSVwd+Wb8UMOs4netapq5Q/yGyiQOgjsP/JRUj0MAT9Yrcm # XcLgsrAimfWY3MzKm1HCxcquinTqbs1Q0d2VMMQyi9cAgMYC9jKc+3mW62/yVl4j # nDcw6ULJsBkOkrcPLUwqj7poS0T2+2JMzPP+jZ1h90/QpZnBkhdtixMiWDVgh60K # mLmzXiqJc6lGwqoUqpq/1HVHm+Pc2B6+wCy/GwCcjw5rmzajLbmqGygEgaj/OLoa # nEWP6Y52Hflef3XLvYnhEY4kSirMQhtberRvaI+5YsD3XVxHGBjlIli5u+NrLedI # xsE88WzKXqZjj9Zi5ybJL2WjeXuOTbswB7XjkZbErg7ebeAQUQiS/uRGZ58NHs57 # ZPUfECcgJC+v2wIDAQABo4IBFjCCARIwHwYDVR0jBBgwFoAUU3m/WqorSs9UgOHY # m8Cd8rIDZsswHQYDVR0OBBYEFPZ3at0//QET/xahbIICL9AKPRQlMA4GA1UdDwEB # /wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MBMGA1UdJQQMMAoGCCsGAQUFBwMIMBEG # A1UdIAQKMAgwBgYEVR0gADBQBgNVHR8ESTBHMEWgQ6BBhj9odHRwOi8vY3JsLnVz # ZXJ0cnVzdC5jb20vVVNFUlRydXN0UlNBQ2VydGlmaWNhdGlvbkF1dGhvcml0eS5j # cmwwNQYIKwYBBQUHAQEEKTAnMCUGCCsGAQUFBzABhhlodHRwOi8vb2NzcC51c2Vy # dHJ1c3QuY29tMA0GCSqGSIb3DQEBDAUAA4ICAQAOvmVB7WhEuOWhxdQRh+S3OyWM # 637ayBeR7djxQ8SihTnLf2sABFoB0DFR6JfWS0snf6WDG2gtCGflwVvcYXZJJlFf # ym1Doi+4PfDP8s0cqlDmdfyGOwMtGGzJ4iImyaz3IBae91g50QyrVbrUoT0mUGQH # bRcF57olpfHhQEStz5i6hJvVLFV/ueQ21SM99zG4W2tB1ExGL98idX8ChsTwbD/z # IExAopoe3l6JrzJtPxj8V9rocAnLP2C8Q5wXVVZcbw4x4ztXLsGzqZIiRh5i111T # W7HV1AtsQa6vXy633vCAbAOIaKcLAo/IU7sClyZUk62XD0VUnHD+YvVNvIGezjM6 # CRpcWed/ODiptK+evDKPU2K6synimYBaNH49v9Ih24+eYXNtI38byt5kIvh+8aW8 # 8WThRpv8lUJKaPn37+YHYafob9Rg7LyTrSYpyZoBmwRWSE4W6iPjB7wJjJpH2930 # 8ZkpKKdpkiS9WNsf/eeUtvRrtIEiSJHN899L1P4l6zKVsdrUu1FX1T/ubSrsxrYJ # D+3f3aKg6yxdbugot06YwGXXiy5UUGZvOu3lXlxA+fC13dQ5OlL2gIb5lmF6Ii8+ # CQOYDwXM+yd9dbmocQsHjcRPsccUd5E9FiswEqORvz8g3s+jR3SFCgXhN4wz7NgA # nOgpCdUo4uDyllU9PzGCBJIwggSOAgEBMGowVTELMAkGA1UEBhMCR0IxGDAWBgNV # BAoTD1NlY3RpZ28gTGltaXRlZDEsMCoGA1UEAxMjU2VjdGlnbyBQdWJsaWMgVGlt # ZSBTdGFtcGluZyBDQSBSMzYCEQCkKTtuHt3XpzQIh616TrckMA0GCWCGSAFlAwQC # AgUAoIIB+TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkF # MQ8XDTI1MTAwMjE1NDUwN1owPwYJKoZIhvcNAQkEMTIEMDrJTI51KqvqZ7keFXdy # exxqP8T03qdrt/fchoPqCc6ndk5YVAKC+6tbh9fRbBmbpjCCAXoGCyqGSIb3DQEJ # EAIMMYIBaTCCAWUwggFhMBYEFDjJFIEQRLTcZj6T1HRLgUGGqbWxMIGHBBTGrlTk # eIbxfD1VEkiMacNKevnC3TBvMFukWTBXMQswCQYDVQQGEwJHQjEYMBYGA1UEChMP # U2VjdGlnbyBMaW1pdGVkMS4wLAYDVQQDEyVTZWN0aWdvIFB1YmxpYyBUaW1lIFN0 # YW1waW5nIFJvb3QgUjQ2AhB6I67aU2mWD5HIPlz0x+M/MIG8BBSFPWMtk4KCYXzQ # kDXEkd6SwULaxzCBozCBjqSBizCBiDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5l # dyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVUaGUgVVNF # UlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBSU0EgQ2VydGlmaWNh # dGlvbiBBdXRob3JpdHkCEDbCsL18Gzrno7PdNsvJdWgwDQYJKoZIhvcNAQEBBQAE # ggIAm3aOCb1uNK0bLf/2PMT7r+DfDIlg7DlxWkPQkhyNSpyQLtYfo7bXJRMFIfPW # AMlb5Oj+e53SHubGniAzCIW4rCv8le+Md+uJUi6G1fZhb03RxslcgIIDYzJuzoRG # X9jFt9syx5sb4XI9XblHZSD1ufF+lY2tEZlzwZGbN8ntA1GSQIBBiCT4c8wM1ZyT # fi2U/cIkA8qeWzQT/v5K+PRJOKPL6Uk5HPsojkcTgp2HcD4Jhpmlkz7mhpifATlQ # x22l86+QAwFtVYRpYprz3W72oUNI2jJhHuquGnqOHYlrpsav2xkZdkIh0IJy2Btb # +MG/0pTDVD7f6+2BCdQ7inlYzDJHr6Yc6FirB0J5N5ACSum8Xdf+VaTJLOK5eHmf # FjGF6+iY7m55lMCX8S4RLz2taZjHsSL4Kfozzoj2rwO7AK9VEd49fcsyMd/iefiF # axnUCVYqq0jXHPw/q934+tXt4rzbYwpI4Muq5Mic/oEG8kli8lBegJmXXNZYqg+V # 7AtT/Ot7fSG/8obavqqgD/m0RbpeIe9GLp0vOU+K4HvvGY+RT3oPXRPMcXbJTDVE # knAUl5DWWNCCv7zA9GetL/psqIDRBs3q9DnJ/vOSFxH2/AMCrcyfL05de1/GYGUf # X3u+bGr5JlxWowVO1bwHfIig2PyV+GdGRddQC1b5DOIQt24= # SIG # End signature block |