Akamai.AccountProtector.psm1
|
function Expand-AppSecConfigDetails { [CmdletBinding()] Param( [Parameter()] [string] $ConfigName, [Parameter()] $ConfigID, [Parameter()] [Alias('CreateFromVersion')] [string] $VersionNumber, [Parameter()] [string] $PolicyName, [Parameter()] [string] $PolicyID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey, [Parameter(ValueFromRemainingArguments)] $UnusedArgs ) process { $CommonParams = @{ 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } if ($ConfigName -ne '') { # Check cache if enabled if ($Global:AkamaiOptions.EnableDataCache) { $ConfigID = $Global:AkamaiDataCache.AppSec.Configs.$ConfigName.ConfigID } if (-not $ConfigID) { Write-Debug "Expand-AppSecConfigDetails: '$ConfigName' - Retrieving Config details." $Config = Get-AppSecConfiguration @CommonParams | Where-Object { $_.name -eq $ConfigName } if ($Config) { $ConfigID = $Config.id } else { throw "Security config '$ConfigName' not found" } } # Add to data cache if ($Global:AkamaiOptions.EnableDataCache -and -not $Global:AkamaiDataCache.AppSec.Configs.$ConfigName) { $Global:AkamaiDataCache.AppSec.Configs.$ConfigName = @{ 'ConfigID' = $ConfigID 'Policies' = @{} } } Write-Debug "Expand-AppSecConfigDetails: ConfigID = $ConfigID" } if ($VersionNumber -and $VersionNumber -notmatch '^[0-9]+$') { if (-not $Config) { Write-Debug "Expand-AppSecConfigDetails: '$ConfigID' - Retrieving Config." $Config = Get-AppSecConfiguration -ConfigID $ConfigID @CommonParams } if ($VersionNumber -eq 'latest') { $VersionNumber = $Config.latestVersion } if ($VersionNumber -eq 'production') { if ($null -eq $Config.productionVersion) { throw "No production-active version of config '$($Config.name)'." } else { $VersionNumber = $Config.productionVersion } } if ($VersionNumber -eq 'staging') { if ($null -eq $Config.stagingVersion) { throw "No staging-active version of config '$($Config.name)'." } else { $VersionNumber = $Config.stagingVersion } } Write-Debug "Expand-AppSecConfigDetails: VersionNumber = $VersionNumber." } if ($PolicyName -ne '') { # Check cache if enabled if ($Global:AkamaiOptions.EnableDataCache) { $PolicyID = $Global:AkamaiDataCache.AppSec.Configs.$ConfigName.Policies.$PolicyName.PolicyID } if (-not $PolicyID) { Write-Debug "Expand-AppSecConfigDetails: '$PolicyName' - Retrieving policy details." $Policy = Get-AppSecPolicy -ConfigID $ConfigID -VersionNumber $VersionNumber @CommonParams | Where-Object { $_.policyName -eq $PolicyName } if ($Policy) { $PolicyID = $Policy.policyId } else { throw "Security policy '$PolicyName' not found." } } # Add to data cache if ($Global:AkamaiOptions.EnableDataCache) { # Check for cache entry. It may not exist if ($Global:AkamaiDataCache.AppSec.Configs.$ConfigName) { $Global:AkamaiDataCache.AppSec.Configs.$ConfigName.Policies.$PolicyName = @{ 'PolicyID' = $PolicyID } } else { Write-Debug "Expand-AppSecConfigDetails: Cannot create data cache entry without ConfigName." } } Write-Debug "Expand-AppSecConfigDetails: PolicyID = $PolicyID." } return $ConfigID, $VersionNumber, $PolicyID } } function Get-BodyObject { [CmdletBinding()] Param( [Parameter(Mandatory)] $Source ) if ($Source -is 'String') { # Trim whitespace $Source = $Source.Trim() # Handle JSON array if ($Source.StartsWith('[')) { $BodyObject = ConvertFrom-Json -InputObject $Source -AsArray -NoEnumerate } # Handle standard JSON object elseif ($Source.StartsWith('{') -and $Source.EndsWith('}')) { $BodyObject = ConvertFrom-Json -InputObject $Source } # If none of the above, just use string as-is else { $BodyObject = $Source } } elseif ($Source -is 'Hashtable') { $BodyObject = [PScustomObject] $Source } elseif ($Source -is 'PSCustomObject' -or $Source -is 'Object' -or $Source -is 'Object[]') { $BodyObject = $Source } else { throw "Source param is of an unhandled type '$($Source.GetType().Name)'" } return $BodyObject } function Get-AccountProtectorTransactionalEndpointProtection { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/transactional-endpoint-protection" $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Get-AccountProtectorUserAllowList { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/user-allow-list-id" $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Get-AccountProtectorUserRisk { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/user-risk-response-strategy" $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Get-AppSecPolicyAccountProtector { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-settings" $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Get-AppSecPolicyAccountProtectorOperation { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(ValueFromPipelineByPropertyName)] [string] $OperationID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters if ($OperationID) { $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/transactional-endpoints/account-protection/$OperationID" } else { $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/transactional-endpoints/account-protection" } $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters if ($OperationID) { return $Response.Body.operations[0] } else { return $Response.Body.operations } } catch { throw $_ } } } function Get-AppSecPolicyAccountProtectorRule { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(ValueFromPipelineByPropertyName)] [string] $RuleID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters if ($RuleID) { $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules/$RuleID" } else { $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules" } $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters if ($RuleID) { return $Response.Body } else { return $Response.Body.accountProtectionRules } } catch { throw $_ } } } function Get-AppSecPolicyAccountProtectorRuleSequence { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules/sequence" $RequestParameters = @{ 'Path' = $Path 'Method' = 'GET' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body.sequence } catch { throw $_ } } } function New-AppSecPolicyAccountProtectorOperation { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/transactional-endpoints/account-protection" $RequestParameters = @{ 'Path' = $Path 'Method' = 'POST' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body.operations[0] } catch { throw $_ } } } function New-AppSecPolicyAccountProtectorRule { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $RuleName, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [Alias('ActionId')] [string] $Action, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $ClientListID, [Parameter(ValueFromPipelineByPropertyName)] [string[]] $OperationIDs, [Parameter(ValueFromPipelineByPropertyName)] [switch] $AllOperationsProtected, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules" $Body = @{ 'ruleName' = $RuleName 'actionId' = $Action 'clientListId' = $ClientListID } if ($OperationIDs) { $Body.operationIds = $OperationIDs } if ($AllOperationsProtected.IsPresent) { $Body.areAllOperationsProtected = $true } $RequestParameters = @{ 'Path' = $Path 'Method' = 'POST' 'Body' = $Body | ConvertTo-Json -Depth 10 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Remove-AccountProtectorUserAllowList { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/user-allow-list-id" $RequestParameters = @{ 'Path' = $Path 'Method' = 'DELETE' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Remove-AppSecPolicyAccountProtectorOperation { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $OperationID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/transactional-endpoints/account-protection/$OperationID" $RequestParameters = @{ 'Path' = $Path 'Method' = 'DELETE' 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Remove-AppSecPolicyAccountProtectorRule { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $RuleID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules/$RuleID" $RequestParameters = @{ 'Path' = $Path 'Method' = 'DELETE' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AccountProtectorTransactionalEndpointProtection { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/transactional-endpoint-protection" $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AccountProtectorUserAllowList { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline)] [Alias('listId')] [string] $UserAllowListID, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/user-allow-list-id" $Body = @{ 'userAllowListId' = $UserAllowListID } $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AccountProtectorUserRisk { [CmdletBinding(DefaultParameterSetName = 'Config name')] Param( [Parameter(ParameterSetName = 'Config name', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $null = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/advanced-settings/account-protection/user-risk-response-strategy" $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AppSecPolicyAccountProtector { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-settings" $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AppSecPolicyAccountProtectorOperation { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $OperationID, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/transactional-endpoints/account-protection/$OperationID" $Body = Get-BodyObject -Source $Body # Sanitize 'inline', 'nativeSDK', 'standard' | ForEach-Object { if ($Body.telemetryTypeStates.$_.enabled -and $null -ne $Body.telemetryTypeStates.$_.disabledAction) { $Body.telemetryTypeStates.$_.PSObject.Properties.Remove('disabledAction') } } $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AppSecPolicyAccountProtectorRule { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $RuleID, [Parameter(Mandatory, ValueFromPipeline)] $Body, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) process { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules/$RuleID" $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body } catch { throw $_ } } } function Set-AppSecPolicyAccountProtectorRuleSequence { [CmdletBinding(DefaultParameterSetName = 'Config name & policy name')] Param( [Parameter(ParameterSetName = 'Config name & policy name', Position = 0, Mandatory)] [Parameter(ParameterSetName = 'Config name & policy ID', Position = 0, Mandatory)] [string] $ConfigName, [Parameter(ParameterSetName = 'Config ID & policy name', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [int] $ConfigID, [Parameter(Position = 1, Mandatory, ValueFromPipelineByPropertyName)] [ValidatePattern('^(latest|production|staging|[0-9]+)$')] [Alias('Version')] [string] $VersionNumber, [Parameter(ParameterSetName = 'Config name & policy name', Position = 2, Mandatory)] [Parameter(ParameterSetName = 'Config ID & policy name', Position = 2, Mandatory)] [string] $PolicyName, [Parameter(ParameterSetName = 'Config name & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [Parameter(ParameterSetName = 'Config ID & policy ID', Mandatory, ValueFromPipelineByPropertyName)] [string] $PolicyID, [Parameter(Mandatory, ValueFromPipeline)] [string[]] $Sequence, [Parameter()] [string] $EdgeRCFile, [Parameter()] [string] $Section, [Parameter()] [string] $AccountSwitchKey ) begin { $CollatedSequence = New-Object System.Collections.Generic.List[String] } process { foreach ($RuleID in $Sequence) { $CollatedSequence.Add($RuleID) } } end { [string] $ConfigID, $VersionNumber, $PolicyID = Expand-AppSecConfigDetails @PSBoundParameters $Path = "/appsec/v1/configs/$ConfigID/versions/$VersionNumber/security-policies/$PolicyID/account-protection-rules/sequence" $Body = @{ 'sequence' = $CollatedSequence } $RequestParameters = @{ 'Path' = $Path 'Method' = 'PUT' 'Body' = $Body 'EdgeRCFile' = $EdgeRCFile 'Section' = $Section 'AccountSwitchKey' = $AccountSwitchKey 'Debug' = ($PSBoundParameters.Debug -eq $true) } try { $Response = Invoke-AkamaiRequest @RequestParameters return $Response.Body.sequence } catch { throw $_ } } } # SIG # Begin signature block # MIIKmAYJKoZIhvcNAQcCoIIKiTCCCoUCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCN9xLgD4BEupaR # Or1MNi8Bp599IdauTIsUDZ5uaw18jaCCB1owggdWMIIFPqADAgECAhAGRzH371Sh # X6hjGl1wSSyYMA0GCSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQK # Ew5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBD # b2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjYwMjI1MDAw # MDAwWhcNMjcwMzEwMjM1OTU5WjCB3jETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcG # CysGAQQBgjc8AgECEwhEZWxhd2FyZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6 # YXRpb24xEDAOBgNVBAUTBzI5MzM2MzcxCzAJBgNVBAYTAlVTMRYwFAYDVQQIEw1N # YXNzYWNodXNldHRzMRIwEAYDVQQHEwlDYW1icmlkZ2UxIDAeBgNVBAoTF0FrYW1h # aSBUZWNobm9sb2dpZXMgSW5jMSAwHgYDVQQDExdBa2FtYWkgVGVjaG5vbG9naWVz # IEluYzCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAJeMKuhiUI5WSRdG # IPhNWLpaVPlXbSazhGuvzZxTi623Ht46hiPejDtWB8F8dT2pd+nOWsx5NVgkv7x/ # Tz35cZcWVMDxq/K7wYe9R2GndGgfEL02/j5rslwHr8e6qFzy1axuL/xaGXuBTVrS # Qw25019l1KalUHwInKLIP7Hw1HLPTacyJNNTsYmOpZNqKIiQe9ivzBd7SuPU0cGi # 1YHUk4ZQh6Ig5tBx8XZYjTmzbiQr2WWwk/CufaoIPME5zAvmW99S05rAtOqvoUr7 # eoLUQ/TcMMA6eOliAbO5m0w/pv5YDgzhzt9hQez189zZNOkMO6AcHNitJzzsEvCg # 7fhPHxoXvasRJ0EaCEze0nuVakLPf+mGCLoZYGRctayOn4HP6LEEOGmAnQBZkwFR # 6zxk0hzAMOkK/p7MV9V6QwOuk9q7WKnIdzS/4RjRtXNxXb2fMNyBEwrwJhdmEhWF # 0eS0Wd6Uz3IbSr0+XH8FHLflQXFCkPcZKiGPgSCp8rTP3KHr6wIDAQABo4ICAjCC # Af4wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFKT3 # RICOlmcsnPu7KwUf9HL4YegLMD0GA1UdIAQ2MDQwMgYFZ4EMAQMwKTAnBggrBgEF # BQcCARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMA4GA1UdDwEB/wQEAwIH # gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu # Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB # Mzg0MjAyMUNBMS5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9jYWNl # cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5nUlNB # NDA5NlNIQTM4NDIwMjFDQTEuY3J0MAkGA1UdEwQCMAAwDQYJKoZIhvcNAQELBQAD # ggIBAGSBrSnUReHUzGTy9VC6hy2oDSpu2QNu5j3o/uoaaAy2CgI0hVJRL/OfYinL # R4hJofuNNKORp2MWXpy52L5PCGtD6/Hf92bMkDl1AP6nXuplt5HvkFPh5kVDbQ7o # HfI1Pup2IOpKxb00UNwjtKy+38ZCX0dgkASP2vQFamBCG0eTaGUh/9ZH9rz11Nkr # 9p83Snz/3eW3vOeKAFL3S5RDEMkTvv09540mnzA4J5lKGES2eje/FhwCCQUQBvqC # voNFNZHyXvW9v8KqX/3CcN1LAtGCy4XnkFjQRPyn+o/OJv5M5yX2Rm5kq9dYpWnD # U2xgxMR1BZaDf+uDoqGsLo4OqbPV4Dftp2FDs8DHMD8xP6i/k4htaWShkdyjdijr # 9TBOi+pS9vNlcCKjwLq6aibcbkUk7ef3wxR5imhajsX22vy8Zd9ByAk07BJrccgg # JGczCtiKcD6LZtP3VjnqhYPSQ4jk6wCruqcTCTwwO7FrIROVrWb2Ro+ph+/a5Llj # 5ryLyp+6NAgtNwyrkp2WxZviLbh5AXnmg9Pnwrz64UE93LEjI23AWBJsLFdJTbis # Z/tTgozdVdPZf2Dy2k8xfYZoIq6V1oWiAoQCzb5B9nETV5NGjiMPskJ4GwnlzOvz # +4IgLQjl0V5I08Qw+3uvPQ8rHHMLbKgncTqSxqtZ73kItOztMYIClDCCApACAQEw # fTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNV # BAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hB # Mzg0IDIwMjEgQ0ExAhAGRzH371ShX6hjGl1wSSyYMA0GCWCGSAFlAwQCAQUAoGow # GQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisG # AQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIG33eVWS1ZHig+MWP5MT0ERByrqS0gHv # 3kdGPbPbzoBKMA0GCSqGSIb3DQEBAQUABIIBgFyDUh77yaxbxbPUqxv6gwB4W3YB # 96hDONZBcI2cw+dTPnv53z7AP1TIlUdmG+lUk9P5AWSLela7iqGHGXbXywkBHWVx # 1G4F0GVdHVXhQEX2BDTrVR2EmZt4YZKD94o49T6SEnArQ0k3v13Nu0jHcu9aRtSA # 0T37IC5Mcg3d9HriNNwqoRwWVNR3BS9L9s53A/lwjQFdvp2FgmptIB6sMiM3Rmn6 # iCw3c+QF061d6RQ7kr/nlI3/rgcf/QknyO7Q+vx3urYrK1IF3IKxBchOGzYhn1+J # x6QXm0XDlsXnb4XHFOeDiXsSwtKkCPeO14/Cbzu3YkqKDs3byKvMPhIr136R6iau # M/CsJH8DNQR+DMNtcPknPpOg3Col2XlEEvXXv5I/Sx5/X4XHTk3N6R3OeAiP/+nn # GCpMWxhrD0aCbm+ojgpHvq52SByeTj9tZsTw8o63gPHQuLnRRtLT4NMvNzzpj8jT # KHYCMWqMtUGS1RwFqvirk8UWLXgNbOcFOymLcg== # SIG # End signature block |