functions/helperfunctions.ps1

function Add-ProvCCTenantLogin {
    [CmdletBinding(       SupportsPaging = $false,
        SupportsShouldProcess = $false,
        PositionalBinding = $false)]
    Param (
        [Parameter(Mandatory = $true)]
        [String]$UserName,
        
        [Parameter(Mandatory = $true)]
        [SecureString]$Password,
        
        [Parameter(Mandatory = $true)]
        [String]$TenantId
    )

    Write-Verbose 'Creating authentication Token and adding Azure RM Account to local environment'
    # $usercred = new-object pscredential ($username, (convertto-securestring $password -asplaintext -force))
    $usercred = new-object pscredential ($username,$password)     
    $authparam = @{
        Tenantid       = $tenantid
        Usercredential = $usercred
    }
    $global:token = Get-ProvAzureAuthContext @authparam
}
function Test-ProvCCTenantLogin {
    [CmdletBinding(       SupportsPaging = $false,
        SupportsShouldProcess = $false,
        PositionalBinding = $false)]
    Param ()    
    Write-Verbose "Testing valid Login to Azure Subscription and Token timeout"
    if ($global:token -ne $null) {
        Write-Verbose ".a valid Token exists"
        if (($TS = new-timespan -start (Get-Date) -end $global:Token.ExpiresDate).Ticks -le '9000000000') {
            Write-Warning "..token will timeout in $($Ts.minutes) minutes, refreshing!"
            Write-Verbose "..constructing Get-ProvAzureAuthContext input parameters"
            [String]$Username = Read-Host "Full qualified username (name@domain)"
            [SecureString]$password = (Convertto-Securestring (Read-Host "Password") -asplaintext -force)
            [String]$tenantid = Read-Host "TenantId (in GUID Format)"
            $usercred = new-object pscredential ('admin@pandora42.onmicrosoft.com', (convertto-securestring 'h?C62JMV8!' -asplaintext -force)) 
            $authparam = @{
                Tenantid       = '5de6aeba-b232-4a78-9dff-35e20bec0b14'
                Usercredential = $usercred
            }
            $global:token = Get-ProvAzureAuthContext @authparam
        }
        else {
            Write-Verbose "..token expires in $($TS.Minutes) (loads of time ... :-))"
        }
        Write-Verbose ".testing if logged in to the correct tenant" 
        if (((Get-AzureRmContext).Tenant.id) -ne ($global:token.Tenantid)) {
            Write-Verbose "Adding AzureRM Account to current session"
            Add-AzureRmAccount -AccessToken $global:token.accesstoken -Accountid $global:token.TenantId |Out-Null
        }
    }
    else {
        write-error "You are not authenticated to an Azure Tenant. Use `"Add-PCCTenantLogin`" to authenticate before running the installer"
        break
    }
}
function Get-ProvCCGalleryModuleUri {
    Param (
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String]$ModuleName
    )
    
    Write-Verbose "Checking if module $ModuleName exists"
    $Url = "https://www.powershellgallery.com/api/v2/Search()?`$filter=IsLatestVersion&searchTerm=%27$ModuleName%27&targetFramework=%27%27&includePrerelease=false&`$skip=0&`$top=40" 

    # This gives you the Moduledetails
    $Moduledetails = Invoke-RestMethod -Method Get -Uri $Url -UseBasicParsing

    # Now lets do some split/trim functions to get the version of the module
    $moduleversion = ((($Moduledetails.id).Split('Version=')[-1]).Trimend(')')).Trim([Char]0x0027)

    # Contruct the module content URL
    $ModuleContentUrl = "https://www.powershellgallery.com/api/v2/package/$ModuleName/$ModuleVersion"

    # And here comes the magic !! - find the blob storage space where the ZIP File of the module is stoired
    (Invoke-WebRequest -Uri $ModuleContentUrl -MaximumRedirection 0 -UseBasicParsing -ErrorAction Ignore).Headers.Location
}
function New-ProvCCConnectionType {
    [CmdletBinding(       SupportsPaging = $false,
        SupportsShouldProcess = $false,
        PositionalBinding = $false)]
    [OutputType('Provance.Azure.PCC.ConnectionType')]
    Param(
        [Parameter(Mandatory = $true)]
        [Object]$AuthContext,

        [String]$apiversion = '2015-10-31',

        [Parameter(Mandatory = $true)]
        [GUID]$Subscriptionid,

        [Parameter(Mandatory = $true)]
        [ValidatenotNullorempty()]
        [String]$ResourceGroupName,

        [Parameter(Mandatory = $true)]
        [ValidatenotNullorempty()]
        [String]$AutomationAccountName,

        [Parameter(Mandatory = $true)]
        [ValidateSet("PCC-Azure-Subscription", "PCC-Azure-LogAnalyticsWorkspace", "PCC-Provance-ITSM", "PCC-Azure-Compute", "PCC-Azure-AutomationAccount")]
        [String]$ConnTypeName
            
    )    
        
    try {
        $url = "https://management.azure.com/subscriptions/$($subscriptionid.guid)/resourceGroups/$($ResourceGroupName)/providers/Microsoft.Automation/automationAccounts/$($AutomationAccountName)/connectionTypes/$($ConnTypeName)?api-version=$apiversion"
        Write-Verbose -Message "Using url: $url"

        #region construct body
        $body = @{}

        switch ($ConnTypeName) {
            'PCC-Azure-Subscription' { 
                $body = @{
                    name       = $ConnTypeName
                    properties = @{
                        isGlobal         = $false
                        fieldDefinitions = @{
                            ApplicationId    = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            ApplicationKey   = @{
                                isEncrypted = $true
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            TenantId         = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            TenantName       = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            TenantFQDN = @{
                                isEncrypted = $false
                                isOptional = $false
                                type = 'System.String'
                            }
                            SubscriptionId   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            SubscriptionName = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            APIVersion       = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                        }
                    }
                }
            }

            'PCC-Azure-AutomationAccount' { 
                $body = @{
                    name       = $ConnTypeName
                    properties = @{
                        isGlobal         = $false
                        fieldDefinitions = @{
                            TenantId         = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            TenantFQDN         = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            SubscriptionId   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            SubscriptionName   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            AARGName   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            AAName   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            ApplicationId    = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            ApplicationKey   = @{
                                isEncrypted = $true
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            APIVersion       = @{
                                isEncrypted = $false
                                isOptional  = $true
                                type        = 'System.String'
                            }
                        }
                    }
                }
            }

            'PCC-Azure-LogAnalyticsWorkspace' {
                $body = @{
                    name       = $ConnTypeName
                    properties = @{
                        isGlobal         = $false
                        fieldDefinitions = @{
                            ApplicationId  = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            ApplicationKey = @{
                                isEncrypted = $true
                                isOptional  = $false
                                type        = "System.String"
                            }
                            TenantId       = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            OMSRGName      = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            SubscriptionId = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            OMSWorkspace   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            APIVersion     = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                        }
                    }
                }
            }

            'PCC-Azure-Compute' {
                $body = @{
                    name       = $ConnTypeName
                    properties = @{
                        isGlobal         = $false
                        fieldDefinitions = @{
                            ApplicationId       = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            ApplicationKey      = @{
                                isEncrypted = $true
                                isOptional  = $false
                                type        = "System.String"
                            }
                            TenantId            = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            SubscriptionId      = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = "System.String"
                            }
                            APIVersionARMVM     = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            APIVersionClassicVM = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                        }
                    }
                }
            }

            'PCC-Provance-ITSM' {
                $body = @{
                    name       = $ConnTypeName
                    properties = @{
                        isGlobal         = $false
                        fieldDefinitions = @{
                            InstanceURL   = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            Username      = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            Password      = @{
                                isEncrypted = $true
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            TenantId      = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            ApplicationId = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                            APIVersion    = @{
                                isEncrypted = $false
                                isOptional  = $false
                                type        = 'System.String'
                            }
                        }
                    }
                }               
            }
        } 

        $body = $body | ConvertTo-Json -Depth 6
        Write-Verbose -Message "Using body: $body"
        #endregion

        #region construct header
        $header = @{
            'Authorization' = "$($AuthContext.tokentype) $($AuthContext.accesstoken)"
            "Content-Type"  = "application/json"
        }
        Write-Verbose -Message "Using header: $header"
        #endregion

        #region invoke rest method
        $Rawdata = Invoke-RestMethod `
            -Method Put `
            -Uri $url `
            -ContentType application/json `
            -Headers $header `
            -Body $body
        #endregion

        return $Rawdata
    }   
    catch {
        Write-Verbose -Message "StatusCode: $_.Exception.Response.StatusCode.value__"
        Write-Verbose -Message "StatusDescription: $_.Exception.Response.StatusDescription"
        Write-Error -Message "Unable to create new connection type `n Error: $($_)" -ErrorAction Stop
    }     
}


# SIG # Begin signature block
# MIIaBQYJKoZIhvcNAQcCoIIZ9jCCGfICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUXF7kuVdjdxk3dFvlwRfLgHKk
# NJSgghSZMIIE0DCCA7igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UE
# BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAY
# BgNVBAoTEUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290
# IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx
# MDUwMzA3MDAwMFowgbQxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw
# EQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjEt
# MCsGA1UECxMkaHR0cDovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9zaXRvcnkvMTMw
# MQYDVQQDEypHbyBEYWRkeSBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IC0g
# RzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC54MsQ1K92vdSTYusw
# ZLiBCGzDBNliF44v/z5lz4/OYuY8UhzaFkVLVat4a2ODYpDOD2lsmcgaFItMzEUz
# 6ojcnqOvK/6AYZ15V8TPLvQ/MDxdR/yaFrzDN5ZBUY4RS1T4KL7QjL7wMDge87Am
# +GZHY23ecSZHjzhHU9FGHbTj3ADqRay9vHHZqm8A29vNMDp5T19MR/gd71vCxJ1g
# O7GyQ5HYpDNO6rPWJ0+tJYqlxvTV0KaudAVkV4i1RFXULSo6Pvi4vekyCgKUZMQW
# OlDxSq7neTOvDCAHf+jfBDnCaQJsY1L6d8EbyHSHyLmTGFBUNUtpTrw700kuH9zB
# 0lL7AgMBAAGjggEaMIIBFjAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
# BjAdBgNVHQ4EFgQUQMK9J47MNIMwojPX+2yz8LQsgM4wHwYDVR0jBBgwFoAUOpqF
# BxBnKLbv9r0FQW4gwZTaD94wNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhho
# dHRwOi8vb2NzcC5nb2RhZGR5LmNvbS8wNQYDVR0fBC4wLDAqoCigJoYkaHR0cDov
# L2NybC5nb2RhZGR5LmNvbS9nZHJvb3QtZzIuY3JsMEYGA1UdIAQ/MD0wOwYEVR0g
# ADAzMDEGCCsGAQUFBwIBFiVodHRwczovL2NlcnRzLmdvZGFkZHkuY29tL3JlcG9z
# aXRvcnkvMA0GCSqGSIb3DQEBCwUAA4IBAQAIfmyTEMg4uJapkEv/oV9PBO9sPpyI
# BslQj6Zz91cxG7685C/b+LrTW+C05+Z5Yg4MotdqY3MxtfWoSKQ7CC2iXZDXtHwl
# TxFWMMS2RJ17LJ3lXubvDGGqv+QqG+6EnriDfcFDzkSnE3ANkR/0yBOtg2DZ2HKo
# cyQetawiDsoXiWJYRBuriSUBAA/NxBti21G00w9RKpv0vHP8ds42pM3Z2Czqrpv1
# KrKQ0U11GIo/ikGQI31bS/6kA1ibRrLDYGCD+H1QQc7CoZDDu+8CL9IVVO5EFdkK
# rqeKM+2xLXY2JtwE65/3YR8V3Idv7kaWKK2hJn0KCacuBKONvPi8BDABMIIFADCC
# A+igAwIBAgIBBzANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNV
# BAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJm
# aWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290
# IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTExMDUwMzA3MDAwMFoXDTMx
# MDUwMzA3MDAwMFowgcYxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMw
# EQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVjaG5vbG9n
# aWVzLCBJbmMuMTMwMQYDVQQLEypodHRwOi8vY2VydHMuc3RhcmZpZWxkdGVjaC5j
# b20vcmVwb3NpdG9yeS8xNDAyBgNVBAMTK1N0YXJmaWVsZCBTZWN1cmUgQ2VydGlm
# aWNhdGUgQXV0aG9yaXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
# AoIBAQDlkGZL7PlGcakgg77pbL9KyUhpgXVObST2yxcT+LBxWYR6ayuFpDS1FuXL
# zOlBcCykLtb6Mn3hqN6UEKwxwcDYav9ZJ6t21vwLdGu4p64/xFT0tDFE3ZNWjKRM
# XpuJyySDm+JXfbfYEh/JhW300YDxUJuHrtQLEAX7J7oobRfpDtZNuTlVBv8KJAV+
# L8YdcmzUiymMV33a2etmGtNPp99/UsQwxaXJDgLFU793OGgGJMNmyDd+MB5FcSM1
# /5DYKp2N57CSTTx/KgqT3M0WRmX3YISLdkuRJ3MUkuDq7o8W6o0OPnYXv32JgIBE
# Q+ct4EMJddo26K3biTr1XRKOIwSDAgMBAAGjggEsMIIBKDAPBgNVHRMBAf8EBTAD
# AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUJUWBaFAmOD07LSy+zWrZtj2z
# ZmMwHwYDVR0jBBgwFoAUfAwyH6fZMH/EfWijYqihzqsHWycwOgYIKwYBBQUHAQEE
# LjAsMCoGCCsGAQUFBzABhh5odHRwOi8vb2NzcC5zdGFyZmllbGR0ZWNoLmNvbS8w
# OwYDVR0fBDQwMjAwoC6gLIYqaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9z
# ZnJvb3QtZzIuY3JsMEwGA1UdIARFMEMwQQYEVR0gADA5MDcGCCsGAQUFBwIBFito
# dHRwczovL2NlcnRzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMA0GCSqG
# SIb3DQEBCwUAA4IBAQBWZcr+8z8KqJOLGMfeQ2kTNCC+Tl94qGuc22pNQdvBE+zc
# MQAiXvcAngzgNGU0+bE6TkjIEoGIXFs+CFN69xpk37hQYcxTUUApS8L0rjpf5Mqt
# JsxOYUPl/VemN3DOQyuwlMOS6eFfqhBJt2nk4NAfZKQrzR9voPiEJBjOeT2pkb9U
# GBOJmVQRDVXFJgt5T1ocbvlj2xSApAer+rKluYjdkf5lO6Sjeb6JTeHQsPTIFwwK
# lhR8Cbds4cLYVdQYoKpBaXAko7nv6VrcPuuUSvC33l8Odvr7+2kDRUBQ7nIMpBKG
# gc0T0U7EPMpODdIm8QC3tKai4W56gf0wrHofx1l7MIIFPDCCBCSgAwIBAgIJALbL
# wjYBUl1HMA0GCSqGSIb3DQEBCwUAMIG0MQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
# QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTEaMBgGA1UEChMRR29EYWRkeS5j
# b20sIEluYy4xLTArBgNVBAsTJGh0dHA6Ly9jZXJ0cy5nb2RhZGR5LmNvbS9yZXBv
# c2l0b3J5LzEzMDEGA1UEAxMqR28gRGFkZHkgU2VjdXJlIENlcnRpZmljYXRlIEF1
# dGhvcml0eSAtIEcyMB4XDTE3MTIxMTIwMzEwMVoXDTE4MDkwNjE1NDIwMFowfTEL
# MAkGA1UEBhMCQ0ExDzANBgNVBAgTBlF1ZWJlYzERMA8GA1UEBxMIR2F0aW5lYXUx
# JDAiBgNVBAoTG1Byb3ZhbmNlIFRlY2hub2xvZ2llcywgSW5jLjEkMCIGA1UEAxMb
# UHJvdmFuY2UgVGVjaG5vbG9naWVzLCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOC
# AQ8AMIIBCgKCAQEAzv3zfbU437wH1fLprlbIGBtCLjMKf2XSIWgPIpymOhJeQP07
# H/dGlg8fy4vUJpWS3jwAAAiQfycR8IyCpGTZf1XiPLsdnw4WIwbaYYe6LylA8xhv
# 8d8Hassqp2LCZbBhm9ueLySqPM+DykABQOFPYbJVj/WDwd8/KaBCGZw0FXsl+AuB
# HeiZ89pjz4oFX+BXrM5/rvVHZuYD6W+UesxxibNrmuMf3JFzfh2Ttr+orMRRCCSt
# v0N87EAOkjZ52fIbsKptMHRaywZO1qGIWFlBSTBcCktMlKjVpbZkVCrY81eMhkzb
# +nOTpvAaUFNEESekdMveZA8XJoYQ3XoFXU8vjwIDAQABo4IBhTCCAYEwDAYDVR0T
# AQH/BAIwADATBgNVHSUEDDAKBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCB4AwNQYD
# VR0fBC4wLDAqoCigJoYkaHR0cDovL2NybC5nb2RhZGR5LmNvbS9nZGlnMnM1LTMu
# Y3JsMF0GA1UdIARWMFQwSAYLYIZIAYb9bQEHFwIwOTA3BggrBgEFBQcCARYraHR0
# cDovL2NlcnRpZmljYXRlcy5nb2RhZGR5LmNvbS9yZXBvc2l0b3J5LzAIBgZngQwB
# BAEwdgYIKwYBBQUHAQEEajBoMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5nb2Rh
# ZGR5LmNvbS8wQAYIKwYBBQUHMAKGNGh0dHA6Ly9jZXJ0aWZpY2F0ZXMuZ29kYWRk
# eS5jb20vcmVwb3NpdG9yeS9nZGlnMi5jcnQwHwYDVR0jBBgwFoAUQMK9J47MNIMw
# ojPX+2yz8LQsgM4wHQYDVR0OBBYEFOwFSw0KFV9Bs1UypkhJ4XNI/N9JMA0GCSqG
# SIb3DQEBCwUAA4IBAQASYv3417VLTHaQ/stRoHy/s4SSSovygnp2luUUChTuXQ9z
# SJxzrXwmNbdVZV1X1LrDWHhxTztwOPwDbV6TNSwKhBMTTSZQ9gJCbfQ/gwaqhvbG
# 3pFN62FcUHZ0B6xfWTqcxQ+eMLdAzbt52HMkLAGfaFKRiIllM079bxTZ6QiSNHQ5
# 76gDm0V16n3zvPFKA7wJyaWAQY2//UPrBP3B1zxElgock21I6OiLLIe7vBvLvvXw
# QuJe/QM+p4sr6OTJGI4OsLI9N4dLpC0gmbz1QCPIvkOQOFsB14bLiqzABSJEkvc8
# C+lF7ABlmdTLnsx+yePeC3Ka9+rKEGyetKKpFFCgMIIFfTCCBGWgAwIBAgIJAO+V
# wvSA4xuTMA0GCSqGSIb3DQEBCwUAMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UECBMH
# QXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZpZWxk
# IFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0YXJm
# aWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQgU2Vj
# dXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTE3MTExNDA3MDAwMFoX
# DTIyMTExNDA3MDAwMFowgYcxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25h
# MRMwEQYDVQQHEwpTY290dHNkYWxlMSQwIgYDVQQKExtTdGFyZmllbGQgVGVjaG5v
# bG9naWVzLCBMTEMxKzApBgNVBAMTIlN0YXJmaWVsZCBUaW1lc3RhbXAgQXV0aG9y
# aXR5IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDm730Ku3SP
# yEahtiafyThSMSvGVFw6JhBrYkQYOcH10SjiERRWLn3DD51isWZDIrkxmTdy/zEt
# 2m0qf2odGk7KRPeO7OMlEbeGS4Cc11H7OvxG6VSADFbYTkrgGREeDgFxPA8WzeaJ
# YFVwJq7kcoFSGN797hHOoYsd/GkD/iqnEjNfYRUcKdaH9b/Yzjwjte6uba5Iepls
# Nx0eXWU+zy7bff21Qb1HQ0P0VTuYCbviRJknhKOZKSGuNhQ9CFDzMQbcbsbyx3+o
# v/iMaIGp7NHNlk/4hR1rFFmMwPRT/m123J8xGpoYBPPMOHyk15bF/1laR3kAr3fh
# bj0OQoUOUFIBAgMBAAGjggGpMIIBpTAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQE
# AwIGwDAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAdBgNVHQ4EFgQUnc8cgP4K1qL8
# WBg+p9NUQO7WFGEwHwYDVR0jBBgwFoAUJUWBaFAmOD07LSy+zWrZtj2zZmMwgYQG
# CCsGAQUFBwEBBHgwdjAqBggrBgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxk
# dGVjaC5jb20vMEgGCCsGAQUFBzAChjxodHRwOi8vY3JsLnN0YXJmaWVsZHRlY2gu
# Y29tL3JlcG9zaXRvcnkvc2ZfaXNzdWluZ19jYS1nMi5jcnQwVAYDVR0fBE0wSzBJ
# oEegRYZDaHR0cDovL2NybC5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5L21h
# c3RlcnN0YXJmaWVsZDJpc3N1aW5nLmNybDBQBgNVHSAESTBHMEUGC2CGSAGG/W4B
# BxcCMDYwNAYIKwYBBQUHAgEWKGh0dHA6Ly9jcmwuc3RhcmZpZWxkdGVjaC5jb20v
# cmVwb3NpdG9yeS8wDQYJKoZIhvcNAQELBQADggEBAFJGgfPKVmOa5BUYGkgzgZUH
# APDVCxA0oDWH0E5+lQB0DlDHgv5G6O4Ju2dqL9TAJfhRAS0i+PaXwLOWbz/yxZc9
# jpCNDbVWIRIZdxzXvR7dOSvRPgWFxW1Msip51ys9TQV2ybVAyA+CjVwuNOALYWrT
# 2ZhQBEp47lbsLRag4VwYpydVkbfKa4Egad+0V0SHQrWxwnMaj/7PT+b8WilhTxTR
# XNWlxRlQ+9wla5Sqwn5PwafeJwv6eGS6nKC00cRPDQ6WDCo46VhOjkmv50J+o93p
# 9LM2hkFuoRMrR5O3D8Zcg1jbab4rTDT+f+Wn5eYn9PwbYB7e4WMjRafylm5E3Hox
# ggTWMIIE0gIBATCBwjCBtDELMAkGA1UEBhMCVVMxEDAOBgNVBAgTB0FyaXpvbmEx
# EzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu
# MS0wKwYDVQQLEyRodHRwOi8vY2VydHMuZ29kYWRkeS5jb20vcmVwb3NpdG9yeS8x
# MzAxBgNVBAMTKkdvIERhZGR5IFNlY3VyZSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkg
# LSBHMgIJALbLwjYBUl1HMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEMMQowCKAC
# gAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsx
# DjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBS+1WyB2BQ3FJgoS30nqkSF
# k/NJHDANBgkqhkiG9w0BAQEFAASCAQBh4EMck0DQJpp+yBDNe/LrKcfwr36Y/PA0
# PN8oo1p0lbKktNJgW1UKjZPAD7xTb9Ea9jjl1GjrgNIDIb3ulRPqBvzqxqffDbJ6
# QJwl1Jk+XaeGl5W0dTw/bCJGsmdKC26GaVw8Z8gwcFlC/fRaapgvrLY2y9WTBDfn
# xQUDv1IRdxmZ5a38gf+XIkez0y+ECIoaJ3Z8AZ6mAnGShuyykN0IvGApkj8npkpz
# m16qIdavMmMDfAjv5xBcLtVNMxzIiTym3sx1onnbYKWz3yTILfHR5dI2wuhYSThK
# fRKwYb/IZ/ZIt3bplsVtWp/hF4apRgH+z5nKAuZSqmWGvJvvwLmEoYICbjCCAmoG
# CSqGSIb3DQEJBjGCAlswggJXAgEBMIHUMIHGMQswCQYDVQQGEwJVUzEQMA4GA1UE
# CBMHQXJpem9uYTETMBEGA1UEBxMKU2NvdHRzZGFsZTElMCMGA1UEChMcU3RhcmZp
# ZWxkIFRlY2hub2xvZ2llcywgSW5jLjEzMDEGA1UECxMqaHR0cDovL2NlcnRzLnN0
# YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvMTQwMgYDVQQDEytTdGFyZmllbGQg
# U2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyAgkA75XC9IDjG5MwCQYF
# Kw4DAhoFAKBdMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkF
# MQ8XDTE4MDUyMDEzNTg1NFowIwYJKoZIhvcNAQkEMRYEFAs/lfcFDjzouweGmHVJ
# QlgGw0qyMA0GCSqGSIb3DQEBAQUABIIBAAfzQl5NkSWKLLtAEdAKVShiVQP74Un/
# jnyGFtTbNhYYKsKdEuE3um+1/9NL8aVFa1Pb7ec/KAU+OZpEF5Rt4sQTfoI7M23h
# xsa7ULFcdeiVhakPljahRScNlQSK9eapansp7o2xVFV0I01PIQv1Spa05koDr7/Z
# 1qc058aNPqQuIi634qxuo1pHzEa0Vd4LfLiYy4OQ0aKsHtPVWHl0fqIcOJkZ23dw
# fEW/0y4be8I4pSyKENkjwSGa171MUgCaP6ZZRvGzjvb/9jmzqiQK2ACZEJS/RJvp
# t0v2D9INqEg9/OWCrVZEDkFw51lmcnRsN4BAuAdIUzdAvilqwFtcKFI=
# SIG # End signature block