Functions/Gherkin.ErrorRecord.ps1

function New-StepErrorRecord {
    [CmdletBinding()]
    [OutputType([System.Management.Automation.ErrorRecord])]
    Param (
        [Parameter(Position = 0, Mandatory = $True)]
        [string]$ErrorId,

        [Parameter(Position = 1, Mandatory = $True)]
        [string]$Message,

        [Parameter(Position = 2, Mandatory = $True)]
        [System.Management.Automation.Errorcategory]$ErrorCategory,

        [Parameter(Position = 3, Mandatory = $True, ValueFromPipeline = $True)]
        [Object]$TargetObject
    )

    $Exception = New-Object Exception $Message

    New-Object System.Management.Automation.ErrorRecord $Exception, $ErrorId, $ErrorCategory, $TargetObject
}

function New-StepFailedErrorRecord {
    [CmdletBinding()]
    [OutputType([System.Management.Automation.ErrorRecord])]
    Param(
        [Parameter(Position = 0, Mandatory = $True)]
        [Gherkin.Ast.Step]$Step,

        [Parameter(Position = 1, Mandatory = $True)]
        [string]$FeaturePath,

        [Parameter(Position = 2, Mandatory = $True, ValueFromPipeline = $True)]
        [System.Management.Automation.ErrorRecord]$ErrorRecord
    )

    $Message = if ($ErrorRecord.TargetObject) {
        $ErrorRecord.TargetObject
    }
    else {
        $ErrorRecord.Exception.Message
    }

    $ErrorDetails = @{
        ErrorId = 'PesterGherkinStepFailed'
        Message = $Message
        ErrorCategory = $ErrorRecord.CategoryInfo.Category
        TargetObject = @{
            File             = $ErrorRecord.InvocationInfo.ScriptName
            Line             = $ErrorRecord.InvocationInfo.ScriptLineNumber
            LineText         = $ErrorRecord.InvocationInfo.Line
            FeaturePath      = $FeaturePath
            ScriptStackTrace = $ErrorRecord.ScriptStackTrace
            Step             = $Step
        }
    }

    New-StepErrorRecord @ErrorDetails
}

function New-StepPendingErrorRecord {
    [CmdletBinding()]
    [OutputType([System.Management.Automation.ErrorRecord])]
    Param(
        [Parameter(Position = 0, Mandatory = $True)]
        [string]$LineText,

        [Parameter(Position = 1, Mandatory = $True)]
        [string]$StepDefinitionFilePath,

        [Parameter(Position = 2, Mandatory = $True)]
        [int]$Line
    )

    $ErrorDetails = @{
        ErrorId       = 'PesterGherkinStepPending'
        Message       = 'TODO: (Pester::Pending)'
        ErrorCategory = [System.Management.Automation.ErrorCategory]::NotImplemented
        TargetObject  = @{
            File     = $StepDefinitionFilePath
            Line     = $Line
            LineText = $LineText
        }
    }

    New-StepErrorRecord @ErrorDetails
}

function New-StepSkippedErrorRecord {
    [CmdletBinding()]
    [OutputType([System.Management.Automation.ErrorRecord])]
    Param(
        [Parameter(Position = 0, Mandatory = $True)]
        [string]$LineText,

        [Parameter(Position = 1, Mandatory = $True)]
        [string]$StepDefinitionFilePath,

        [Parameter(Position = 2, Mandatory = $True)]
        [int]$Line,

        [Parameter(Position = 3, Mandatory = $True)]
        [string]$FeaturePath,

        [Parameter(Position = 4, Mandatory = $True)]
        [Gherkin.Ast.Step]$Step
    )

    $ErrorDetails = @{
        ErrorId       = 'PesterGherkinStepSkipped'
        Message       = 'Step skipped due to previous failing, pending, or undefined steps.'
        ErrorCategory = [System.Management.Automation.ErrorCategory]::ObjectNotFound
        TargetObject = @{
            File        = $StepDefinitionFilePath
            Line        = $Line
            LineText    = $LineText
            FeaturePath = $FeaturePath
            Step        = $Step
        }
    }

    New-StepErrorRecord @ErrorDetails
}

function New-UndefinedStepErrorRecord {
    [CmdletBinding()]
    [OutputType([System.Management.Automation.ErrorRecord])]
    Param (
        [Parameter(Position = 0, Mandatory = $True)]
        [string]$LineText,

        [Parameter(Position = 1, Mandatory = $True)]
        [string]$StepDefinitionFilePath,

        [Parameter(Position = 2, Mandatory = $True)]
        [int]$Line,

        [Parameter(Position = 3, Mandatory = $True)]
        [string]$FeaturePath,

        [Parameter(Position = 4, Mandatory = $True)]
        [Gherkin.Ast.Step]$Step
    )

    $ErrorDetails = @{
        ErrorId       = 'PesterGherkinStepUndefined'
        Message       = 'No matching step definition found.'
        ErrorCategory = [System.Management.Automation.ErrorCategory]::ObjectNotFound
        TargetObject = @{
            File        = $StepDefinitionFilePath
            Line        = $Line
            LineText    = $LineText
            FeaturePath = $FeaturePath
            Step        = $Step
        }
    }

    New-StepErrorRecord @ErrorDetails
}

function Set-StepPending {
    <#
    .SYNOPSIS
        Using Set-StepPending inside of Step Definition ScriptBlocks will cause those steps to be marked as
        Pending by the Pester Gherkin test runner.
 
    .DESCRIPTION
        If Set-StepPending is used inside of a Step Definition ScriptBlock, the step will be marked as pending,
        as well as any scenarios making use of the step which are not already failed.
 
    .EXAMPLE Mark a Gherkin step as Pending
        Given '^this step is not yet implemented$' {
            Set-StepPending
        }
 
        If you define a step definition such as the above, the output for this step will be:
 
            Given this step is not yet implemented
              TODO: (Pester:Pending)
 
 
    #>


    [CmdletBinding()]Param()

    Assert-DescribeInProgress -CommandName Set-StepPending
    $PendingStepDetails = @{
        StepDefinitionFilePath = $MyInvocation.ScriptName
        Line                   = $MyInvocation.ScriptLineNumber
        LineText               = $MyInvocation.Line.TrimEnd([System.Environment]::NewLine)
    }

    throw (New-StepPendingErrorRecord @PendingStepDetails)
}

function Set-StepSkipped {
    <#
    .SYNOPSIS
        Sets a step as skipped.
 
    .DESCRIPTION
        This function creates an ErrorRecord with an Exception object, allowing Pester to
        capture a stack trace for a skipped step, which could be a useful aid in debugging
        the Pester test framework, more so than debugging user tests. Otherwise, all that
        would be necessary is to call New-StepSkippedErrorRecord.
 
    .EXAMPLE Mark a Gherkin step as Skipped
        $Step | Set-StepSkipped $Scenario.FeaturePath
 
        This is called in the Gherkin Pester test runner to set a step as skipped,
        which provides a stack trace to aid in debugging Pester more than the test suite itself.
 
 
    #>

    [CmdletBinding()]
    Param(
        [Parameter(Position = 0, Mandatory = $True)]
        [string]$FeaturePath,

        [Parameter(Position = 1, Mandatory = $True, ValueFromPipeline = $True)]
        [Gherkin.Ast.Step]$Step
    )

    Assert-DescribeInProgress -CommandName Set-StepUndefined
    $SkippedStepDetails = @{
        StepDefinitionFilePath = $MyInvocation.ScriptName
        Line                   = $MyInvocation.ScriptLineNumber
        LineText               = $MyInvocation.Line.TrimEnd([System.Environment]::NewLine)
        Step                   = $Step
        FeaturePath            = $FeaturePath
    }

    throw (New-StepSkippedErrorRecord @SkippedStepDetails)
}

function Set-StepUndefined {
    <#
    .SYNOPSIS
        Sets a step as undefined.
 
    .DESCRIPTION
        This function creates an ErrorRecord with an Exception object, allowing Pester to
        capture a stack trace for an undefined step, which could be a useful aid in debugging
        the Pester test framework, more so than debugging user tests. Otherwise, all that
        would be necessary is to call New-UndefiniedStepErrorRecord.
 
    .EXAMPLE Mark a Gherkin step as Undefined
        $Step | Set-StepUndefined $Scenario.FeaturePath
 
        This is called in the Gherkin Pester test runner to set a step as undefined,
        which provides a stack trace to aid in debugging Pester more than the test suite itself.
 
 
    #>

    [CmdletBinding()]
    Param(
        [Parameter(Position = 0, Mandatory = $true)]
        [string]$FeaturePath,

        [Parameter(Position = 1, Mandatory = $True, ValueFromPipeline = $True)]
        [Gherkin.Ast.Step]$Step
    )

    Assert-DescribeInProgress -CommandName Set-StepUndefined
    $UndefinedStepDetails = @{
        StepDefinitionFilePath = $MyInvocation.ScriptName
        Line                   = $MyInvocation.ScriptLineNumber
        LineText               = $MyInvocation.Line.TrimEnd([System.Environment]::NewLine)
        Step                   = $Step
        FeaturePath            = $FeaturePath
    }

    throw (New-UndefinedStepErrorRecord @UndefinedStepDetails)
}

# SIG # Begin signature block
# MIIZbgYJKoZIhvcNAQcCoIIZXzCCGVsCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU5NytLadw5oWklGhNDVhPOKjY
# 9J+gghR8MIIE/jCCA+agAwIBAgIQDUJK4L46iP9gQCHOFADw3TANBgkqhkiG9w0B
# AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD
# VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz
# c3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4XDTIxMDEwMTAwMDAwMFoXDTMxMDEw
# NjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMTCCASIwDQYJKoZIhvcN
# AQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1DQikRcpja1HXOhFCvQp1dU2UtAxQ
# tSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4/2cLnGP9NmqB+in43Stwhd4CGPN4
# bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT0dHTWjaPxqPhLxs6t2HWc+xObTOK
# fF1FLUuxUOZBOjdWhtyTI433UCXoZObd048vV7WHIOsOjizVI9r0TXhG4wODMSlK
# XAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j6BqrW7EdMMKbaYK02/xWVLwfoYer
# vnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4Gdb+DUmEvQECAwEAAaOCAbgwggG0
# MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG
# AQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9bAcBMCkwJwYIKwYBBQUHAgEWG2h0
# dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAfBgNVHSMEGDAWgBT0tuEgHf4prtLk
# YaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6sGa+vCgtHUQ23eNqerwwcQYDVR0f
# BGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl
# ZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz
# c3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6
# Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRFRpbWVzdGFtcGluZ0NB
# LmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzctemaI7znGucgDo5nRv1CclF0CiNH
# o6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZO73+RAJmTe1ppA/2uHDPYuj1UUp4
# eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO/PT+t2R3Y18jUmmDgvoaU+2QzI2h
# F3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUIAHa8gQ74wOFcz8QRcucbZEnYIpp1
# FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahzQ1HavWPWH1ub9y4bTxMd90oNcX6X
# t/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5nePk2mOHLKNpbh6aKLzCCBQ0wggP1
# oAMCAQICEAPBBFtdmcD9x4iXgGyKU+cwDQYJKoZIhvcNAQELBQAwcjELMAkGA1UE
# BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj
# ZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUg
# U2lnbmluZyBDQTAeFw0yMTAxMjgwMDAwMDBaFw0yNDAxMzEyMzU5NTlaMEsxCzAJ
# BgNVBAYTAkNaMQ4wDAYDVQQHEwVQcmFoYTEVMBMGA1UECgwMSmFrdWIgSmFyZcWh
# MRUwEwYDVQQDDAxKYWt1YiBKYXJlxaEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
# ggEKAoIBAQC154nkzSQ95K1yCflVL3iFQhzw/25ht4o506hK7ATFgvP71ZI+YHce
# gvVoMtaMhJp2/EzXsgxDF7EZBR4Hl9vNbIpLAFSVCK4GBD0DxNCDFrJTPtNohgsA
# STNMcK6t0iunh7MEkaYt1yPgiISA1vcQUMKi51WSUxeWnsUNTkJDZkyM61fETbhy
# CI66xLItaf3OWdyjiOFPq2n8yx+eg1w7GCC/eNYVAjzqtSmiE/xv6Qoj7z9qFyS1
# pAO4cxDRLAD9IcCiYmHOJVgsho3/u4QNNm72ghz7iiRAO5lDoBcZIiLS5RKxJwMG
# nnYbIiAuISZmv4PtrkcSu81Lzmtu81idAgMBAAGjggHEMIIBwDAfBgNVHSMEGDAW
# gBRaxLl7KgqjpepxA8Bg+S32ZXUOWDAdBgNVHQ4EFgQUF2nEZEX1uTrPSD3h5VSJ
# 8g9ef20wDgYDVR0PAQH/BAQDAgeAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGA1Ud
# HwRwMG4wNaAzoDGGL2h0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3Vy
# ZWQtY3MtZzEuY3JsMDWgM6Axhi9odHRwOi8vY3JsNC5kaWdpY2VydC5jb20vc2hh
# Mi1hc3N1cmVkLWNzLWcxLmNybDBLBgNVHSAERDBCMDYGCWCGSAGG/WwDATApMCcG
# CCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQB
# MIGEBggrBgEFBQcBAQR4MHYwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj
# ZXJ0LmNvbTBOBggrBgEFBQcwAoZCaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB
# /wQCMAAwDQYJKoZIhvcNAQELBQADggEBANuuPZ7LhU/v1GDprUhYch3/fov3sIxp
# wshFvufWbGxUYzxEVQSsZLdFVUzAdsCz3fKInY2ihCwqIoU5vbwKFvV1zvizat/r
# aNn5aa8H34NjEXPHQiyNykOk9CdFgk+zZn+YpeyzBMAEvQR4uB4eDv1USWkwdXPB
# VVZcjM0xEsx9H/ZZRSEGS0x3ue+shvZdPRzoWcuiK8hNcbFZr15hMGi4s0F9IxTZ
# QzoSpNJsBA/vMmkbp2SWeENn49BNx8q760e+ELMfuSBltKs8S2hB9TLrpko3nIvp
# l1323zyR6ZpWK1/FHbGkHRsSJKvOOBdlSL08+KM2kNzXez88eUae+1YwggUwMIIE
# GKADAgECAhAECRgbX9W7ZnVTQ7VvlVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNV
# BAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdp
# Y2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAe
# Fw0xMzEwMjIxMjAwMDBaFw0yODEwMjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUw
# EwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20x
# MTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcg
# Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9ML
# MUkZz9D7RZmxOttE9X/lqJ3bMtdx6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWs
# DnkoOn7p0WfTxvspJ8fTeyOU5JEjlpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeK
# iUXULaGj6YgsIJWuHEqHCN8M9eJNYBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5Tsx
# HM/q8grkV7tKtel05iv+bMt+dDk2DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sI
# ZD5SlsHyDxL0xY4PwaLoLFH3c7y9hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/Rnf
# JZPRAgMBAAGjggHNMIIByTASBgNVHRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQE
# AwIBhjATBgNVHSUEDDAKBggrBgEFBQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYB
# BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0
# cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENB
# LmNydDCBgQYDVR0fBHoweDA6oDigNoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29t
# L0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDA6oDigNoY0aHR0cDovL2NybDMu
# ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAE
# SDBGMDgGCmCGSAGG/WwAAgQwKjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGln
# aWNlcnQuY29tL0NQUzAKBghghkgBhv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPA
# YPkt9mV1DlgwHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZI
# hvcNAQELBQADggEBAD7sDVoks/Mi0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0P
# xK+L/e8q3yBVN7Dh9tGSdQ9RtG6ljlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK
# 95xGTlz/kLEbBw6RFfu6r7VRwo0kriTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6
# aGivm6dcIFzZcbEMj7uo+MUSaJ/PQMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lF
# luhZHen6dGRrsutmQ9qzsIzV6Q3d9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmC
# SfdibqFT+hKUGIUukpHqaGxEMrJmoecYpJpkUe8wggUxMIIEGaADAgECAhAKoSXW
# 1jIbfkHkBdo2l8IVMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYD
# VQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAi
# BgNVBAMTG0RpZ2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xNjAxMDcxMjAw
# MDBaFw0zMTAxMDcxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp
# Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERp
# Z2lDZXJ0IFNIQTIgQXNzdXJlZCBJRCBUaW1lc3RhbXBpbmcgQ0EwggEiMA0GCSqG
# SIb3DQEBAQUAA4IBDwAwggEKAoIBAQC90DLuS82Pf92puoKZxTlUKFe2I0rEDgdF
# M1EQfdD5fU1ofue2oPSNs4jkl79jIZCYvxO8V9PD4X4I1moUADj3Lh477sym9jJZ
# /l9lP+Cb6+NGRwYaVX4LJ37AovWg4N4iPw7/fpX786O6Ij4YrBHk8JkDbTuFfAnT
# 7l3ImgtU46gJcWvgzyIQD3XPcXJOCq3fQDpct1HhoXkUxk0kIzBdvOw8YGqsLwfM
# /fDqR9mIUF79Zm5WYScpiYRR5oLnRlD9lCosp+R1PrqYD4R/nzEU1q3V8mTLex4F
# 0IQZchfxFwbvPc3WTe8GQv2iUypPhR3EHTyvz9qsEPXdrKzpVv+TAgMBAAGjggHO
# MIIByjAdBgNVHQ4EFgQU9LbhIB3+Ka7S5GGlsqIlssgXNW4wHwYDVR0jBBgwFoAU
# Reuir/SSy4IxLVGLp6chnfNtyA8wEgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8B
# Af8EBAMCAYYwEwYDVR0lBAwwCgYIKwYBBQUHAwgweQYIKwYBBQUHAQEEbTBrMCQG
# CCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKG
# N2h0dHA6Ly9jYWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJv
# b3RDQS5jcnQwgYEGA1UdHwR6MHgwOqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0
# LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9j
# cmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwUAYD
# VR0gBEkwRzA4BgpghkgBhv1sAAIEMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3
# LmRpZ2ljZXJ0LmNvbS9DUFMwCwYJYIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4IB
# AQBxlRLpUYdWac3v3dp8qmN6s3jPBjdAhO9LhL/KzwMC/cWnww4gQiyvd/MrHwwh
# Wiq3BTQdaq6Z+CeiZr8JqmDfdqQ6kw/4stHYfBli6F6CJR7Euhx7LCHi1lssFDVD
# BGiy23UC4HLHmNY8ZOUfSBAYX4k4YU1iRiSHY4yRUiyvKYnleB/WCxSlgNcSR3Cz
# ddWThZN+tpJn+1Nhiaj1a5bA9FhpDXzIAbG5KHW3mWOFIoxhynmUfln8jA/jb7UB
# JrZspe6HUSHkWGCbugwtK22ixH67xCUrRwIIfEmuE7bhfEJCKMYYVs9BNLZmXbZ0
# e/VWMyIvIjayS6JKldj1po5SMYIEXDCCBFgCAQEwgYYwcjELMAkGA1UEBhMCVVMx
# FTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNv
# bTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmlu
# ZyBDQQIQA8EEW12ZwP3HiJeAbIpT5zAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIB
# DDEKMAigAoAAoQKAADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEE
# AYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAjBgkqhkiG9w0BCQQxFgQU1Q0SoeTitlNI
# lF/cYMBW96nRxVUwDQYJKoZIhvcNAQEBBQAEggEAgat8aQ3GcOh5gVXvzimuqiGB
# oAXkBA0djA1erUcIoysLg+mQ75wJd0qZJg+UqmFD522Ejj19zYv7sdonU9AR/AFX
# /eYkT82kcxj0VRCQD5ZLqEzPRFdtW1Eboem0yaC7n3qhaeC6KjR27xzaLMkz1FTm
# 7Mpmom1GdiMp3Qn60TDUg2zT53K8NyatkbZF3V+W5rx1qKNhVt2UHcQUaC7Wd+Dq
# 5qYpBm6obPpljVsQO2ZkzrN+TKKvl8akGdXD06Jyo2PaxNHbKx9ke2ZEGDtVbUwP
# qn49zK7FzIhwyR7ohSQj6QkUuv3E3klR+pc/5zix463lm+A36Qomk7Hino6Wc6GC
# AjAwggIsBgkqhkiG9w0BCQYxggIdMIICGQIBATCBhjByMQswCQYDVQQGEwJVUzEV
# MBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29t
# MTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5n
# IENBAhANQkrgvjqI/2BAIc4UAPDdMA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcN
# AQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjEwNTI5MTIyODAzWjAv
# BgkqhkiG9w0BCQQxIgQgj6/qn3ZwFIHYC7rxIGorj40CBs9BwCgYR2+cHYgEXJIw
# DQYJKoZIhvcNAQEBBQAEggEAnyDKHZGQYzPU5e9NevFdzM5KJgN4Fk9iqN15x6Qx
# zjs60mJ6jEGR3zLxz8nmtyoaJuK8t85XqfdgMCn9Z5ljURjcK50Pn3ypx9hQ2vNP
# I76gNpfv+JREbt73HClZ5jnduTffF5Mumqt9CCkj5QG1pHj5KbZSEAw5eMsVJFCn
# 5LbjB9dssQAbddUdG+WvR2A6oM4lntjveXL22toqnEtD0yyh1PRH+AD++lJ7JtgK
# lllZY5KPvtQfYCUdXUmLLCnBngjrA+/wo5DlFzy5f+n4d1dk/7bZcTUei+4O4tOD
# 9s1kS1m7eck43KyKNPQzRMpqOOcwqlfIB/Fi7r51ja1MKw==
# SIG # End signature block