DeprecatedApiTranslator/vSphereRestApiTranslation.Tests.ps1

BeforeAll {
    function Test-ObjectsAreEqual {
        [CmdletBinding()]
        [OutputType([bool])]
        param (
            [Parameter(Mandatory = $true)]
            [AllowNull()]
            [object]
            $Actual,

            [Parameter(Mandatory = $true)]
            [AllowNull()]
            [object]
            $Expected,

            [Parameter(Mandatory = $false)]
            [type]
            $ExpectedType,

            [Parameter(Mandatory = $false)]
            [int]
            $Depth = 10
        )

        process {
            $result = $true

            if ($null -ne $ExpectedType -and $Actual -IsNot $ExpectedType) {
                Write-Verbose -Message "The actual object's type [$($Actual.GetType())] doesn't match the expected one [$ExpectedType]"
                $result = $false
            }
            elseif ($Expected.GetType().IsPrimitive -or $Expected -Is [string]) {
                Write-Verbose -Message "Primitive type [$($Expected.GetType())] found"
                $result = ($Actual -eq $Expected)
            }
            else {
                Write-Verbose -Message "Complex type [$($Expected.GetType())] found"
                $expectedProperties = $Expected | Get-Member -MemberType Properties

                foreach ($property in $expectedProperties) {
                    Write-Verbose -Message "Asserting property $($property.Name)"

                    $expectedValue = $Expected | Select-Object -ExpandProperty $property.Name
                    $actualValue = $Actual | Select-Object -ExpandProperty $property.Name

                    Write-Verbose -Message "Expected value = $expectedValue"
                    Write-Verbose -Message "Actual value = $actualValue"

                    if ($expectedValue -eq $actualValue) {
                        Write-Verbose -Message "Values are equal"
                        continue
                    }
                    elseif ($Depth -eq -1) {
                        $result = $true
                    }
                    else {
                        $areObjectsEqual = Test-ObjectsAreEqual -Expected $expectedValue -Actual $actualValue -Depth ($Depth - 1)
                        if (!$areObjectsEqual) {
                            $result = $false
                            break
                        }
                    }
                }
            }

            return $result
        }
    }
}

Describe 'Test Output translation' {
    Context 'Output Object Translation' {
        It 'Translates GetVM Operation Output' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/vm/{vm}' -operationVerb 'get'

            $vmInfoJson = '{"value":{"instant_clone_frozen":false,"cdroms":[{"value":{"start_connected":false,"backing":{"device_access_type":"PASSTHRU","type":"CLIENT_DEVICE"},"allow_guest_control":true,"label":"CD/DVD drive 1","state":"NOT_CONNECTED","type":"SATA","sata":{"bus":0,"unit":0}},"key":"16000"}],"memory":{"size_MiB":4,"hot_add_enabled":false},"disks":[{"value":{"scsi":{"bus":0,"unit":0},"backing":{"vmdk_file":"[local-0] testvm/testvm.vmdk","type":"VMDK_FILE"},"label":"Hard disk 1","type":"SCSI","capacity":8589934592},"key":"2000"}],"parallel_ports":[],"sata_adapters":[{"value":{"bus":0,"label":"SATA controller 0","type":"AHCI"},"key":"15000"}],"cpu":{"hot_remove_enabled":false,"count":2,"hot_add_enabled":false,"cores_per_socket":2},"scsi_adapters":[{"value":{"scsi":{"bus":0,"unit":7},"label":"SCSI controller 0","sharing":"NONE","type":"LSILOGICSAS"},"key":"1000"}],"power_state":"POWERED_OFF","floppies":[],"identity":{"name":"testvm","instance_uuid":"501d5a5f-8e1b-770a-8e76-ba9eb8c77043","bios_uuid":"421d24e8-732f-693d-653e-0492a4dea3b2"},"name":"testvm","nics":[{"value":{"start_connected":true,"backing":{"network_name":"VM Network","type":"STANDARD_PORTGROUP","network":"network-19"},"mac_address":"00:50:56:9d:2a:b5","mac_type":"ASSIGNED","allow_guest_control":true,"wake_on_lan_enabled":true,"label":"Network adapter 1","state":"NOT_CONNECTED","type":"E1000E"},"key":"4000"}],"boot":{"delay":0,"efi_legacy_boot":false,"retry_delay":10000,"enter_setup_mode":false,"network_protocol":"IPV4","type":"EFI","retry":false},"serial_ports":[],"boot_devices":[],"guest_OS":"WINDOWS_SERVER_2019","hardware":{"upgrade_policy":"NEVER","upgrade_status":"NONE","version":"VMX_19"}}}'
            $vmInfoObject = $vmInfoJson | ConvertFrom-JsonX -Depth 100

            $expectedJson = '{"instant_clone_frozen":false,"cdroms":{"16000":{"start_connected":false,"backing":{"device_access_type":"PASSTHRU","type":"CLIENT_DEVICE"},"allow_guest_control":true,"label":"CD/DVD drive 1","state":"NOT_CONNECTED","type":"SATA","sata":{"bus":0,"unit":0}}},"memory":{"size_MiB":4,"hot_add_enabled":false},"disks":{"2000":{"scsi":{"bus":0,"unit":0},"backing":{"vmdk_file":"[local-0] testvm/testvm.vmdk","type":"VMDK_FILE"},"label":"Hard disk 1","type":"SCSI","capacity":8589934592}},"parallel_ports":{},"sata_adapters":{"15000":{"bus":0,"label":"SATA controller 0","type":"AHCI"}},"cpu":{"hot_remove_enabled":false,"count":2,"hot_add_enabled":false,"cores_per_socket":2},"scsi_adapters":{"1000":{"scsi":{"bus":0,"unit":7},"label":"SCSI controller 0","sharing":"NONE","type":"LSILOGICSAS"}},"power_state":"POWERED_OFF","floppies":{},"identity":{"name":"testvm","instance_uuid":"501d5a5f-8e1b-770a-8e76-ba9eb8c77043","bios_uuid":"421d24e8-732f-693d-653e-0492a4dea3b2"},"name":"testvm","nics":{"4000":{"start_connected":true,"backing":{"network_name":"VM Network","type":"STANDARD_PORTGROUP","network":"network-19"},"mac_address":"00:50:56:9d:2a:b5","mac_type":"ASSIGNED","allow_guest_control":true,"wake_on_lan_enabled":true,"label":"Network adapter 1","state":"NOT_CONNECTED","type":"E1000E"}},"boot":{"delay":0,"efi_legacy_boot":false,"retry_delay":10000,"enter_setup_mode":false,"network_protocol":"IPV4","type":"EFI","retry":false},"serial_ports":{},"boot_devices":[],"guest_OS":"WINDOWS_SERVER_2019","hardware":{"upgrade_policy":"NEVER","upgrade_status":"NONE","version":"VMX_19"}}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-OutputBody $operationTranslationSchema $vmInfoObject

            # Assert
            Test-ObjectsAreEqual $actual $expected | Should -BeTrue
        }

        It 'Translates Appliance ListServices Operation Output' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/services' -operationVerb 'get'

            $servicesJson = '{"value":[{"value":{"description":"/etc/rc.local.shutdown Compatibility","state":"STOPPED"},"key":"appliance-shutdown"},{"value":{"description":"The tftp server serves files using the trivial file transfer protocol.","state":"STOPPED"},"key":"atftpd"}]}'
            $servicesObject = $servicesJson | ConvertFrom-JsonX -Depth 100

            $expectedJson = '{"appliance-shutdown":{"description":"/etc/rc.local.shutdown Compatibility","state":"STOPPED"},"atftpd":{"description":"The tftp server serves files using the trivial file transfer protocol.","state":"STOPPED"}}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-OutputBody $operationTranslationSchema $servicesObject

            # Assert
            Test-ObjectsAreEqual $actual $expected | Should -BeTrue
        }

        It 'Should translate GetChainCertificateManagementTrustedRootChains Operation Output with one element correctly' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/certificate-management/vcenter/trusted-root-chains/{chain}' -operationVerb 'get'

            $certChainJson = '{"value":{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-----END CERTIFICATE-----"]}}}'
            $certChainObject = $certChainJson | ConvertFrom-JsonX -Depth 100

            $expectedJson = '{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-----END CERTIFICATE-----"]}}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-OutputBody $operationTranslationSchema $certChainObject

            # Assert
            Test-ObjectsAreEqual $actual $expected | Should -BeTrue
        }

        It 'Should translate GetChainCertificateManagementTrustedRootChains Operation Output with more than one element correctly' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/certificate-management/vcenter/trusted-root-chains/{chain}' -operationVerb 'get'

            $certChainJson = '{"value":{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-1-----END CERTIFICATE-----", "-----BEGIN CERTIFICATE-----trusted-root-chains-2-----END CERTIFICATE-----"]}}}'
            $certChainObject = $certChainJson | ConvertFrom-JsonX -Depth 100

            $expectedJson = '{"cert_chain":{"cert_chain":["-----BEGIN CERTIFICATE-----trusted-root-chains-1-----END CERTIFICATE-----", "-----BEGIN CERTIFICATE-----trusted-root-chains-2-----END CERTIFICATE-----"]}}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-OutputBody $operationTranslationSchema $certChainObject

            # Assert
            Test-ObjectsAreEqual $actual $expected | Should -BeTrue
        }
    }
}

Describe 'Test Input Body Translation' {
    Context 'FindLibrarySpec Input Object Translation' {
        It 'Translates Input Object' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/content/library/item?action=find' -operationVerb 'post'

            $inputSpec = '{"name":"lib-1"}'
            $inputSpecObject = $inputSpec | ConvertFrom-JsonX -Depth 100

            $expectedJson = '{"spec":{"name":"lib-1"}}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Body

            # Assert
            Test-ObjectsAreEqual $actual $expected | Should -BeTrue
        }

        It 'Translates Body Input Object with client_token moved to header' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/content/library/item/download-session' -operationVerb 'post'

            $libraryItemId = '105dc95e-dd76-4398-91d2-cd0a7183bff3'
            $libraryItemIdOldBodyInput = [PSCustomObject] @{
                'create_spec' = @{
                    'library_item_id' = $libraryItemId
                }
            }
            $libraryItemIdNewBodyInput = [PSCustomObject] @{
                'library_item_id' = $libraryItemId
            }

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $libraryItemIdNewBodyInput -InputType Body

            # Assert
            $actual | Should -Not -BeNullOrEmpty
            $actual.create_spec.library_item_id | Should -Be $libraryItemIdOldBodyInput.create_spec.library_item_id
        }
    }

    Context 'TagCategory Input Object Translation' {
        It "Should translate array with one item to an array of one item" {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/cis/tagging/category' -operationVerb 'post'

            $categoryCreateSpec =  [PSCustomObject] @{
                "associable_types" = @("VirtualMachine")
                "cardinality" = "MULTIPLE"
                "description" = "TestDescription"
                "name" = "TestCategory"
            }

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $categoryCreateSpec -InputType Body

            # Assert
            $actual | Should -Not -Be $null
            $actual.create_spec.associable_types -is [array] | Should -Be $true
            $actual.create_spec.associable_types.Count | Should -Be 1
            $actual.create_spec.associable_types[0] | Should -Be $categoryCreateSpec.associable_types[0]
            $actual.create_spec.cardinality | Should -Be $categoryCreateSpec.cardinality
            $actual.create_spec.description | Should -Be $categoryCreateSpec.description
            $actual.create_spec.name | Should -Be $categoryCreateSpec.name
        }
    }
}


Describe 'Test Input Query Translation' {
    Context 'DatastoreFilterSpec Query Input Translation' {
        It 'Translates Query Input Object' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/datastore' -operationVerb 'get'
            $inputSpec = '{"names":["datastore-0"],"datastores":["ds-2"]}'
            $inputSpecObject = $inputSpec | ConvertFrom-JsonX -Depth 100

            $expectedJson = '{"filter.names":["datastore-0"],"filter.datastores":["ds-2"]}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Query

            # Assert
            $actual."filter.names".Count | Should -Be 1
            $actual."filter.names" | Should -Be $expected."filter.names"
            $actual."filter.datastores" | Should -Be $expected."filter.datastores"
            $actual."filter.types" | Should -Be $null
        }

        It 'Should not translate Appliance Pending Query Params' {
            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/update/pending' -operationVerb 'get'
            $expectedJson = '{"source_type":"test","url":"localhost"}'
            $expected = $expectedJson | ConvertFrom-JsonX -Depth 100

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $expected -InputType Query

            # Assert
            $actual.source_type | Should -Be $expected.source_type
            $actual.url | Should -Be $expected.url
        }
    }
}

Describe 'Test Input Body to Query Translation' {
    Context 'RecoveryBackupLocationSpec Body to Query Input Translation' {
        It 'Translates Body to Query Input Object' {

            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/recovery/backup/system-name?action=list' -operationVerb 'post'
            $inputSpec = '{"location":"https"}'
            $inputSpecObject = $inputSpec | ConvertFrom-JsonX

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Query

            # Assert
            $actual | Should -Not -Be $null
            $actual."loc_spec.location" | Should -Be 'https'
        }
    }

    Context 'RecoveryBackupLocationSpec and RecoveryBackupFilterSpec Body to Query Input Translation' {
        It 'Translates Body to Query Input Object' {

            # Arrange
            . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

            $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/appliance/recovery/backup/system-name/{system_name}/archives?action=list' -operationVerb 'post'
            $inputSpec = '{"loc_spec":{"location":"https"},"filter_spec":{"max_results":10}}'
            $inputSpecObject = $inputSpec | ConvertFrom-JsonX

            # Act
            $actual = Convert-InputStructure $operationTranslationSchema $inputSpecObject -InputType Query

            # Assert
            $actual | Should -Not -Be $null
            $actual."loc_spec.location" | Should -Be 'https'
            $actual."filter_spec.max_results" | Should -Be 10
        }
    }
}

Describe 'Test Input Query to Body Translation' {
    It 'Translates Query to Body Input simple type' {
        # Arrange
        . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

        $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/content/library/item/download-session/{download_session_id}/file?file_name' -operationVerb 'get'

        $fileName = 'my_custom_file_name.json'
        $fileNameBodyInput = [PSCustomObject] @{
            'file_name' = $fileName
        }
        $fileNameQueryInput = $fileName

        # Act
        $actual = Convert-InputStructure $operationTranslationSchema $fileNameQueryInput -InputType Body

        # Assert
        $actual | Should -Not -BeNullOrEmpty
        $actual.file_name | Should -Be $fileNameBodyInput.file_name
    }

    It 'Translates Query to Body Input array type' {
        # Arrange
        . (Join-Path $PSScriptRoot 'vSphereRestApiTranslation.ps1')

        $operationTranslationSchema = Get-OperationTranslationSchema -operationPath '/api/vcenter/inventory/network' -operationVerb 'get'

        $networks = @('network 1', 'network 2')
        $networksBodyInput = [PSCustomObject] @{
            'networks' = $networks
        }
        $networksQueryInput = $networks

        # Act
        $actual = Convert-InputStructure $operationTranslationSchema $networksQueryInput -InputType Body

        # Assert
        $actual | Should -Not -BeNullOrEmpty
        $actual.networks.Count | Should -Be $networksBodyInput.networks.Count
        $actual.networks | Should -Be $networksBodyInput.networks
    }
}

# SIG # Begin signature block
# MIIohwYJKoZIhvcNAQcCoIIoeDCCKHQCAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAUa+fwg0FUUgog
# eO8Gcgn7HquDbijN7STwXHF0wfUl7KCCDdowggawMIIEmKADAgECAhAIrUCyYNKc
# TJ9ezam9k67ZMA0GCSqGSIb3DQEBDAUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQK
# EwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNV
# BAMTGERpZ2lDZXJ0IFRydXN0ZWQgUm9vdCBHNDAeFw0yMTA0MjkwMDAwMDBaFw0z
# NjA0MjgyMzU5NTlaMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw
# ggIKAoICAQDVtC9C0CiteLdd1TlZG7GIQvUzjOs9gZdwxbvEhSYwn6SOaNhc9es0
# JAfhS0/TeEP0F9ce2vnS1WcaUk8OoVf8iJnBkcyBAz5NcCRks43iCH00fUyAVxJr
# Q5qZ8sU7H/Lvy0daE6ZMswEgJfMQ04uy+wjwiuCdCcBlp/qYgEk1hz1RGeiQIXhF
# LqGfLOEYwhrMxe6TSXBCMo/7xuoc82VokaJNTIIRSFJo3hC9FFdd6BgTZcV/sk+F
# LEikVoQ11vkunKoAFdE3/hoGlMJ8yOobMubKwvSnowMOdKWvObarYBLj6Na59zHh
# 3K3kGKDYwSNHR7OhD26jq22YBoMbt2pnLdK9RBqSEIGPsDsJ18ebMlrC/2pgVItJ
# wZPt4bRc4G/rJvmM1bL5OBDm6s6R9b7T+2+TYTRcvJNFKIM2KmYoX7BzzosmJQay
# g9Rc9hUZTO1i4F4z8ujo7AqnsAMrkbI2eb73rQgedaZlzLvjSFDzd5Ea/ttQokbI
# YViY9XwCFjyDKK05huzUtw1T0PhH5nUwjewwk3YUpltLXXRhTT8SkXbev1jLchAp
# QfDVxW0mdmgRQRNYmtwmKwH0iU1Z23jPgUo+QEdfyYFQc4UQIyFZYIpkVMHMIRro
# OBl8ZhzNeDhFMJlP/2NPTLuqDQhTQXxYPUez+rbsjDIJAsxsPAxWEQIDAQABo4IB
# WTCCAVUwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUaDfg67Y7+F8Rhvv+
# YXsIiGX0TkIwHwYDVR0jBBgwFoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0P
# AQH/BAQDAgGGMBMGA1UdJQQMMAoGCCsGAQUFBwMDMHcGCCsGAQUFBwEBBGswaTAk
# BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAC
# hjVodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9v
# dEc0LmNydDBDBgNVHR8EPDA6MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5j
# b20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNybDAcBgNVHSAEFTATMAcGBWeBDAED
# MAgGBmeBDAEEATANBgkqhkiG9w0BAQwFAAOCAgEAOiNEPY0Idu6PvDqZ01bgAhql
# +Eg08yy25nRm95RysQDKr2wwJxMSnpBEn0v9nqN8JtU3vDpdSG2V1T9J9Ce7FoFF
# UP2cvbaF4HZ+N3HLIvdaqpDP9ZNq4+sg0dVQeYiaiorBtr2hSBh+3NiAGhEZGM1h
# mYFW9snjdufE5BtfQ/g+lP92OT2e1JnPSt0o618moZVYSNUa/tcnP/2Q0XaG3Ryw
# YFzzDaju4ImhvTnhOE7abrs2nfvlIVNaw8rpavGiPttDuDPITzgUkpn13c5Ubdld
# AhQfQDN8A+KVssIhdXNSy0bYxDQcoqVLjc1vdjcshT8azibpGL6QB7BDf5WIIIJw
# 8MzK7/0pNVwfiThV9zeKiwmhywvpMRr/LhlcOXHhvpynCgbWJme3kuZOX956rEnP
# LqR0kq3bPKSchh/jwVYbKyP/j7XqiHtwa+aguv06P0WmxOgWkVKLQcBIhEuWTatE
# QOON8BUozu3xGFYHKi8QxAwIZDwzj64ojDzLj4gLDb879M4ee47vtevLt/B3E+bn
# KD+sEq6lLyJsQfmCXBVmzGwOysWGw/YmMwwHS6DTBwJqakAwSEs0qFEgu60bhQji
# WQ1tygVQK+pKHJ6l/aCnHwZ05/LWUpD9r4VIIflXO7ScA+2GRfS0YW6/aOImYIbq
# yK+p/pQd52MbOoZWeE4wggciMIIFCqADAgECAhAOxvKydqFGoH0ObZNXteEIMA0G
# CSqGSIb3DQEBCwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwg
# SW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcg
# UlNBNDA5NiBTSEEzODQgMjAyMSBDQTEwHhcNMjEwODEwMDAwMDAwWhcNMjMwODEw
# MjM1OTU5WjCBhzELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExEjAQ
# BgNVBAcTCVBhbG8gQWx0bzEVMBMGA1UEChMMVk13YXJlLCBJbmMuMRUwEwYDVQQD
# EwxWTXdhcmUsIEluYy4xITAfBgkqhkiG9w0BCQEWEm5vcmVwbHlAdm13YXJlLmNv
# bTCCAaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAMD6lJG8OWkM12huIQpO
# /q9JnhhhW5UyW9if3/UnoFY3oqmp0JYX/ZrXogUHYXmbt2gk01zz2P5Z89mM4gqR
# bGYC2tx+Lez4GxVkyslVPI3PXYcYSaRp39JsF3yYifnp9R+ON8O3Gf5/4EaFmbeT
# ElDCFBfExPMqtSvPZDqekodzX+4SK1PIZxCyR3gml8R3/wzhb6Li0mG7l0evQUD0
# FQAbKJMlBk863apeX4ALFZtrnCpnMlOjRb85LsjV5Ku4OhxQi1jlf8wR+za9C3DU
# ki60/yiWPu+XXwEUqGInIihECBbp7hfFWrnCCaOgahsVpgz8kKg/XN4OFq7rbh4q
# 5IkTauqFhHaE7HKM5bbIBkZ+YJs2SYvu7aHjw4Z8aRjaIbXhI1G+NtaNY7kSRrE4
# fAyC2X2zV5i4a0AuAMM40C1Wm3gTaNtRTHnka/pbynUlFjP+KqAZhOniJg4AUfjX
# sG+PG1LH2+w/sfDl1A8liXSZU1qJtUs3wBQFoSGEaGBeDQIDAQABo4ICJTCCAiEw
# HwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYEFIhC+HL9
# QlvsWsztP/I5wYwdfCFNMB0GA1UdEQQWMBSBEm5vcmVwbHlAdm13YXJlLmNvbTAO
# BgNVHQ8BAf8EBAMCB4AwEwYDVR0lBAwwCgYIKwYBBQUHAwMwgbUGA1UdHwSBrTCB
# qjBToFGgT4ZNaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3Rl
# ZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5jcmwwU6BRoE+GTWh0
# dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWdu
# aW5nUlNBNDA5NlNIQTM4NDIwMjFDQTEuY3JsMD4GA1UdIAQ3MDUwMwYGZ4EMAQQB
# MCkwJwYIKwYBBQUHAgEWG2h0dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzCBlAYI
# KwYBBQUHAQEEgYcwgYQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0
# LmNvbTBcBggrBgEFBQcwAoZQaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0Rp
# Z2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5j
# cnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEACQAYaQI6Nt2KgxdN
# 6qqfcHB33EZRSXkvs8O9iPZkdDjEx+2fgbBPLUvk9A7T8mRw7brbcJv4PLTYJDFo
# c5mlcmG7/5zwTOuIs2nBGXc/uxCnyW8p7kD4Y0JxPKEVQoIQ8lJS9Uy/hBjyakeV
# ef982JyzvDbOlLBy6AS3ZpXVkRY5y3Va+3v0R/0xJ+JRxUicQhiZRidq2TCiWEas
# d+tLL6jrKaBO+rmP52IM4eS9d4Yids7ogKEBAlJi0NbvuKO0CkgOlFjp1tOvD4sQ
# taHIMmqi40p4Tjyf/sY6yGjROXbMeeF1vlwbBAASPWpQuEIxrNHoVN30YfJyuOWj
# zdiJUTpeLn9XdjM3UlhfaHP+oIAKcmkd33c40SFRlQG9+P9Wlm7TcPxGU4wzXI8n
# Cw/h235jFlAAiWq9L2r7Un7YduqsheJVpGoXmRXJH0T2G2eNFS5/+2sLn98kN2Cn
# J7j6C242onjkZuGL2/+gqx8m5Jbpu9P4IAeTC1He/mX9j6XpIu+7uBoRVwuWD1i0
# N5SiUz7Lfnbr6Q1tHMXKDLFdwVKZos2AKEZhv4SU0WvenMJKDgkkhVeHPHbTahQf
# P1MetR8tdRs7uyTWAjPK5xf5DLEkXbMrUkpJ089fPvAGVHBcHRMqFA5egexOb6sj
# tKncUjJ1xAAtAExGdCh6VD2U5iYxghoDMIIZ/wIBATB9MGkxCzAJBgNVBAYTAlVT
# MRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8GA1UEAxM4RGlnaUNlcnQgVHJ1
# c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBTSEEzODQgMjAyMSBDQTECEA7G
# 8rJ2oUagfQ5tk1e14QgwDQYJYIZIAWUDBAIBBQCggZYwGQYJKoZIhvcNAQkDMQwG
# CisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwKgYKKwYB
# BAGCNwIBDDEcMBqhGIAWaHR0cDovL3d3dy52bXdhcmUuY29tLzAvBgkqhkiG9w0B
# CQQxIgQgfTBHlBsxRV/ly8qB4fKpgXCxtd3619Cj9HfMYu3B+5wwDQYJKoZIhvcN
# AQEBBQAEggGAOk6c7udaFV+8YomZLiqLYdTobJ6r9RXurWab11Y+y8Y7ugCxpXsu
# cI6yBmHKxL6IwMFWq1RJlgZiL6R662k3EUz51lW8x3+WSVJ7QikCqcel/oFTYUkO
# 09axRP+0922X9AKleTbDChQNyn+lUw596y0/4AwN+xpCSLER9FVrGeSFfk9sSTw7
# RGf6lmbwrwRJ2fTfL5S3MnPkxfY1WwgbbVxG+KnYt+EcCpYZ8Q+V5+FHZ3PhEVPt
# MGF/goFbPFDAeOP26VUBeCtXKvbhcX/pqQSAcXbe2C3HaZYVISVUAHmbTh7bvzyz
# iIxoDTE8YBAc8MDqM2NAEIedn98ac9ULKjFw4BCgsdDilnYawUURh8CVg0ykSlqw
# 432YLubWcYNiC00grWwuG4OGn57REkQjAGncRE6qYq9wKic1ebOHPSEvkBTXJuZF
# hjSZsVlnBX57GmKLBTI78y3tcqBbcIg52D4bbR4HUT0Hik0OTfHKDvvHyhYdj9bM
# AQvimPm3N4V6oYIXPjCCFzoGCisGAQQBgjcDAwExghcqMIIXJgYJKoZIhvcNAQcC
# oIIXFzCCFxMCAQMxDzANBglghkgBZQMEAgEFADB4BgsqhkiG9w0BCRABBKBpBGcw
# ZQIBAQYJYIZIAYb9bAcBMDEwDQYJYIZIAWUDBAIBBQAEIOmPQ25L8hTZwAyU46O8
# T2m5vtM56dgna0Sx8/1jeQSoAhEAxInTJN5/pCELHD4fCOC24BgPMjAyMjEwMTMx
# NTE0MzFaoIITBzCCBsAwggSooAMCAQICEAxNaXJLlPo8Kko9KQeAPVowDQYJKoZI
# hvcNAQELBQAwYzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu
# MTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRp
# bWVTdGFtcGluZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0zMzExMjEyMzU5NTlaMEYx
# CzAJBgNVBAYTAlVTMREwDwYDVQQKEwhEaWdpQ2VydDEkMCIGA1UEAxMbRGlnaUNl
# cnQgVGltZXN0YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAz+ylJjrGqfJru43BDZrboegUhXQzGias0BxVHh42bbySVQxh9J0Jdz0V
# lggva2Sk/QaDFteRkjgcMQKW+3KxlzpVrzPsYYrppijbkGNcvYlT4DotjIdCriak
# 5Lt4eLl6FuFWxsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTuxylONQIMe58tySSgeTIAe
# hVbnhe3yYbyqOgd99qtu5Wbd4lz1L+2N1E2VhGjjgMtqedHSEJFGKes+JvK0jM1M
# uWbIu6pQOA3ljJRdGVq/9XtAbm8WqJqclUeGhXk+DF5mjBoKJL6cqtKctvdPbnjE
# KD+jHA9QBje6CNk1prUe2nhYHTno+EyREJZ+TeHdwq2lfvgtGx/sK0YYoxn2Off1
# wU9xLokDEaJLu5i/+k/kezbvBkTkVf826uV8MefzwlLE5hZ7Wn6lJXPbwGqZIS1j
# 5Vn1TS+QHye30qsU5Thmh1EIa/tTQznQZPpWz+D0CuYUbWR4u5j9lMNzIfMvwi4g
# 14Gs0/EH1OG92V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk+tkgbBhRYLqmgQ8JJVPx
# vzvpqwcOagc5YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF47caIyLBuMnnHC1mDjcbu
# 9Sx8e47LZInxscS451NeX1XSfRkpWQNO+l3qRXMchH7XzuLUOncCAwEAAaOCAYsw
# ggGHMA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoG
# CCsGAQUFBwMIMCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNV
# HSMEGDAWgBS6FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQUYore0GH8jzEU
# 7ZcLzT0qlBTfUpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNl
# cnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGlu
# Z0NBLmNybDCBkAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v
# Y3NwLmRpZ2ljZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGln
# aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFt
# cGluZ0NBLmNydDANBgkqhkiG9w0BAQsFAAOCAgEAVaoqGvNG83hXNzD8deNP1oUj
# 8fz5lTmbJeb3coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8adTKmyn7oz/AyQCbEx2w
# mIncePLNfIXNU52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ+uQt1wmJefkJ5ojOfRu4
# aqKbwVNgCeijuJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6X0qPGjpStOq/CUkVNTZZ
# mg9U0rIbf35eCa12VIp0bcrSBWcrduv/mLImlTgZiEQU5QpZomvnIj5EIdI/HMCb
# 7XxIstiSDJFPPGaUr10CU+ue4p7k0x+GAWScAMLpWnR1DT3heYi/HAGXyRkjgNc2
# Wl+WFrFjDMZGQDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg8wXDWd8nYiveQclTuf80
# EGf2JjKYe/5cQpSBlIKdrAqLxksVStOYkEVgM4DgI974A6T2RUflzrgDQkfoQTZx
# d639ouiXdE4u2h4djFrIHprVwvDGIqhPm73YHJpRxC+a9l+nJ5e6li6FV8Bg53hW
# f2rvwpWaSxECyIKcyRoFfLpxtU56mWz06J7UWpjIn7+NuxhcQ/XQKujiYu54BNu9
# 0ftbCqhwfvCXhHjjCANdRyxjqCU4lwHSPzra5eX25pvcfizM/xdMTQCi2NYBDriL
# 7ubgclWJLCcZYfZ3AYwwggauMIIElqADAgECAhAHNje3JFR82Ees/ShmKl5bMA0G
# CSqGSIb3DQEBCwUAMGIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJ
# bmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xITAfBgNVBAMTGERpZ2lDZXJ0
# IFRydXN0ZWQgUm9vdCBHNDAeFw0yMjAzMjMwMDAwMDBaFw0zNzAzMjIyMzU5NTla
# MGMxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjE7MDkGA1UE
# AxMyRGlnaUNlcnQgVHJ1c3RlZCBHNCBSU0E0MDk2IFNIQTI1NiBUaW1lU3RhbXBp
# bmcgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGhjUGSbPBPXJJ
# UVXHJQPE8pE3qZdRodbSg9GeTKJtoLDMg/la9hGhRBVCX6SI82j6ffOciQt/nR+e
# DzMfUBMLJnOWbfhXqAJ9/UO0hNoR8XOxs+4rgISKIhjf69o9xBd/qxkrPkLcZ47q
# UT3w1lbU5ygt69OxtXXnHwZljZQp09nsad/ZkIdGAHvbREGJ3HxqV3rwN3mfXazL
# 6IRktFLydkf3YYMZ3V+0VAshaG43IbtArF+y3kp9zvU5EmfvDqVjbOSmxR3NNg1c
# 1eYbqMFkdECnwHLFuk4fsbVYTXn+149zk6wsOeKlSNbwsDETqVcplicu9Yemj052
# FVUmcJgmf6AaRyBD40NjgHt1biclkJg6OBGz9vae5jtb7IHeIhTZgirHkr+g3uM+
# onP65x9abJTyUpURK1h0QCirc0PO30qhHGs4xSnzyqqWc0Jon7ZGs506o9UD4L/w
# ojzKQtwYSH8UNM/STKvvmz3+DrhkKvp1KCRB7UK/BZxmSVJQ9FHzNklNiyDSLFc1
# eSuo80VgvCONWPfcYd6T/jnA+bIwpUzX6ZhKWD7TA4j+s4/TXkt2ElGTyYwMO1uK
# IqjBJgj5FBASA31fI7tk42PgpuE+9sJ0sj8eCXbsq11GdeJgo1gJASgADoRU7s7p
# XcheMBK9Rp6103a50g5rmQzSM7TNsQIDAQABo4IBXTCCAVkwEgYDVR0TAQH/BAgw
# BgEB/wIBADAdBgNVHQ4EFgQUuhbZbU2FL3MpdpovdYxqII+eyG8wHwYDVR0jBBgw
# FoAU7NfjgtJxXWRM3y5nP+e6mK4cD08wDgYDVR0PAQH/BAQDAgGGMBMGA1UdJQQM
# MAoGCCsGAQUFBwMIMHcGCCsGAQUFBwEBBGswaTAkBggrBgEFBQcwAYYYaHR0cDov
# L29jc3AuZGlnaWNlcnQuY29tMEEGCCsGAQUFBzAChjVodHRwOi8vY2FjZXJ0cy5k
# aWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkUm9vdEc0LmNydDBDBgNVHR8EPDA6
# MDigNqA0hjJodHRwOi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk
# Um9vdEc0LmNybDAgBgNVHSAEGTAXMAgGBmeBDAEEAjALBglghkgBhv1sBwEwDQYJ
# KoZIhvcNAQELBQADggIBAH1ZjsCTtm+YqUQiAX5m1tghQuGwGC4QTRPPMFPOvxj7
# x1Bd4ksp+3CKDaopafxpwc8dB+k+YMjYC+VcW9dth/qEICU0MWfNthKWb8RQTGId
# DAiCqBa9qVbPFXONASIlzpVpP0d3+3J0FNf/q0+KLHqrhc1DX+1gtqpPkWaeLJ7g
# iqzl/Yy8ZCaHbJK9nXzQcAp876i8dU+6WvepELJd6f8oVInw1YpxdmXazPByoyP6
# wCeCRK6ZJxurJB4mwbfeKuv2nrF5mYGjVoarCkXJ38SNoOeY+/umnXKvxMfBwWpx
# 2cYTgAnEtp/Nh4cku0+jSbl3ZpHxcpzpSwJSpzd+k1OsOx0ISQ+UzTl63f8lY5kn
# LD0/a6fxZsNBzU+2QJshIUDQtxMkzdwdeDrknq3lNHGS1yZr5Dhzq6YBT70/O3it
# TK37xJV77QpfMzmHQXh6OOmc4d0j/R0o08f56PGYX/sr2H7yRp11LB4nLCbbbxV7
# HhmLNriT1ObyF5lZynDwN7+YAN8gFk8n+2BnFqFmut1VwDophrCYoCvtlUG3OtUV
# mDG0YgkPCr2B2RP+v6TR81fZvAT6gt4y3wSJ8ADNXcL50CN/AAvkdgIm2fBldkKm
# KYcJRyvmfxqkhQ/8mJb2VVQrH4D6wPIOK+XW+6kvRBVK5xMOHds3OBqhK/bt1nz8
# MIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0BAQwFADBl
# MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
# d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
# b3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQswCQYDVQQG
# EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
# cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G
# CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7J
# IT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxS
# D1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb
# 7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1ef
# VFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoY
# OAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSa
# M0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI
# 8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9L
# BADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfm
# Q6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDr
# McXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15Gkv
# mB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E
# FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGL
# p6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAkBggrBgEF
# BQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAChjdodHRw
# Oi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURSb290Q0Eu
# Y3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9E
# aWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRVHSAAMA0G
# CSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyhhyzshV6p
# Grsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO0Cre+i1W
# z/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo8L8vC6bp
# 8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++hUD38dglo
# hJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5xaiNrIv8S
# uFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMYIDdjCCA3ICAQEwdzBj
# MQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5BgNVBAMT
# MkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0YW1waW5n
# IENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFlAwQCAQUAoIHRMBoGCSqGSIb3
# DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0BCQUxDxcNMjIxMDEzMTUxNDMx
# WjArBgsqhkiG9w0BCRACDDEcMBowGDAWBBTzhyJNhjOCkjWplLy9j5bp/hx8czAv
# BgkqhkiG9w0BCQQxIgQgfi78OuuRgcZcHlVPOs0KTfDD7oZI3gU7vAubhFJhyYww
# NwYLKoZIhvcNAQkQAi8xKDAmMCQwIgQgx/ThvjIoiSCr4iY6vhrE/E/meBwtZNBM
# gHVXoCO1tvowDQYJKoZIhvcNAQEBBQAEggIAxertuL9RRHE7JyE/l0eJsavJAEy0
# AbSGPvNVZN5MpHFAi7Gvxymo8Mai+mLegGaKol7HoJeuVnfZE1bMB1fMlXJ9/x6v
# Qjk31xX7EMsf3cp+d22dMu+eKx39R/cIzHVgpq4Kpv5rkCPp4gEEvXG1+5LEIAHQ
# BFzPWTT6W/2yzj9pEKc30RTYrHQmzbTLnSDYENm/8rGn4xHRX6cWDKpx0Llr/seF
# pgLVl112kqVYCobnDIi1P8gsCsFYsPFtzLosMvqkhlQ/aUlWlBrWAbD1cbPs7L+R
# tXLKrL2rqbrTqjhys77+kmCl9BTU5z0tE+eXUrCVwFLuAX0qN4EIFvWXy2RnVfIP
# Kw4J0kGaLF3uGoz7q6EuLEVSgDdBfBUnR0WyPac+bqwq9qX02K45mK1/eqbF8ZXx
# bkoY3lzLnVSYC1l1rR1/N6xbbm+TDQzf8u81yRJYXGBSy/Hect3nEvtioIzBCRy6
# yz5U4ojRS44ZTpEqqUMGKAG3mK6TVU0sZUolmGCF7I2F1+/ak0FGSnYbzxPCYVcv
# aTFIut6vQj444yFMIlKsSOuqSDQyzqetJZrBqBKBaJ6b0yyOeLB4dkG1zx/rXRh7
# NoBtT486NHRnSRhKMyPt45CshIyl9JNR95qrqP5Goi+ULXElnKxF8uefFXZP1ECD
# whOTWuTMsrtoa5U=
# SIG # End signature block