Private/Get-OwnerCandidate.ps1

function New-OwnerCandidate {
  param(
    [Parameter(Mandatory = $true)]
    [string]$Candidate,

    [Parameter(Mandatory = $true)]
    [string]$CandidateType,

    [Parameter(Mandatory = $true)]
    [string]$Confidence,

    [Parameter(Mandatory = $true)]
    [string]$Relationship,

    [Parameter(Mandatory = $true)]
    [string]$Signal,

    [Parameter(Mandatory = $true)]
    [string]$EvidenceId,

    [Parameter(Mandatory = $true)]
    [string]$EvidenceSource,

    [string]$EvidenceValue = "",

    [string]$Reason = ""
  )

  return [pscustomobject]@{
    candidate = $Candidate
    candidateType = $CandidateType
    confidence = $Confidence
    relationship = $Relationship
    signal = $Signal
    evidenceId = $EvidenceId
    evidenceSource = $EvidenceSource
    evidenceValue = $EvidenceValue
    reason = $Reason
  }
}

function ConvertTo-OwnerConfidence {
  param([int]$Score)

  if ($Score -ge 80) {
    return "HIGH"
  }

  if ($Score -ge 50) {
    return "MED"
  }

  return "LOW"
}

function Get-OwnerConfidenceRank {
  param([string]$Confidence)

  switch ($Confidence) {
    "HIGH" { return 3 }
    "MED" { return 2 }
    default { return 1 }
  }
}

function ConvertTo-OwnerCandidateType {
  param([string]$ObjectType)

  switch -Regex ($ObjectType) {
    "user|#microsoft\.graph\.user" { return "User" }
    "group|#microsoft\.graph\.group" { return "Group" }
    default {
      if ([string]::IsNullOrWhiteSpace($ObjectType)) {
        return "Unknown"
      }

      return $ObjectType
    }
  }
}

function Get-TagOwnerConfidence {
  param([string]$TagName)

  switch -Regex ($TagName) {
    "^(owner|serviceOwner|technicalOwner|businessOwner|team)$" { return 80 }
    "^(repo|repository|repoName|source|sourceRepo)$" { return 60 }
    "^(application|app|product|service)$" { return 45 }
    default { return 30 }
  }
}

function ConvertTo-OwnerTagNameSet {
  param([string[]]$TagNames)

  $tagNameSet = @{}
  foreach ($tagName in @($TagNames)) {
    if ([string]::IsNullOrWhiteSpace($tagName)) {
      continue
    }

    $tagNameSet[[string]$tagName] = $true
  }

  return $tagNameSet
}

function Test-OwnerTagNameMatch {
  param(
    [string]$TagName,
    [hashtable]$TagNameSet
  )

  if ([string]::IsNullOrWhiteSpace($TagName) -or -not $TagNameSet) {
    return $false
  }

  return $TagNameSet.ContainsKey($TagName)
}

function Resolve-OwnerTagCandidateType {
  param(
    [string]$TagName,
    [hashtable]$UserOwnerTagNameSet,
    [hashtable]$GroupOwnerTagNameSet,
    [hashtable]$TagOwnerTagNameSet
  )

  if (Test-OwnerTagNameMatch -TagName $TagName -TagNameSet $UserOwnerTagNameSet) {
    return "User"
  }

  if (Test-OwnerTagNameMatch -TagName $TagName -TagNameSet $GroupOwnerTagNameSet) {
    return "Group"
  }

  if (Test-OwnerTagNameMatch -TagName $TagName -TagNameSet $TagOwnerTagNameSet) {
    return "Tag"
  }

  return ""
}

function Format-OwnerTagCandidateValue {
  param(
    [string]$TagName,
    [string]$TagValue,
    [string]$CandidateType
  )

  if ($CandidateType -eq "User" -or $CandidateType -eq "Group") {
    return $TagValue
  }

  return ("{0}={1}" -f $TagName, $TagValue)
}

function Get-OwnerCandidateTagEntries {
  param([object]$Tags)

  if (-not $Tags) {
    return @()
  }

  if ($Tags -is [System.Collections.IDictionary]) {
    return @($Tags.Keys | ForEach-Object {
      [pscustomobject]@{
        Name = [string]$_
        Value = [string]$Tags[$_]
      }
    })
  }

  return @($Tags.PSObject.Properties | ForEach-Object {
    [pscustomobject]@{
      Name = [string]$_.Name
      Value = [string]$_.Value
    }
  })
}

function Get-EnterpriseApplicationOwnerTagEntries {
  param([object]$Tags)

  if (-not $Tags) {
    return @()
  }

  if ($Tags -is [System.Collections.IDictionary]) {
    return @(Get-OwnerCandidateTagEntries -Tags $Tags)
  }

  return @($Tags | ForEach-Object {
    $tagText = [string]$_
    if ([string]::IsNullOrWhiteSpace($tagText)) {
      return
    }

    if ($tagText -match "^\s*([^=:]+)\s*[=:]\s*(.+?)\s*$") {
      [pscustomobject]@{
        Name = [string]$Matches[1]
        Value = [string]$Matches[2]
      }
    }
  })
}

function ConvertTo-OwnerCandidateTsvField {
  param([object]$Value)

  if ($null -eq $Value) {
    return ""
  }

  return ([string]$Value) -replace "[`t`r`n]+", " "
}

function Format-OwnerCandidateTable {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory = $true)]
    [object[]]$Candidates
  )

  $rows = @($Candidates |
    Group-Object candidate, candidateType |
    ForEach-Object {
      $groupRows = @($_.Group | Sort-Object @{ Expression = { Get-OwnerConfidenceRank -Confidence ([string]$_.confidence) }; Descending = $true }, evidenceId)
      $bestConfidence = [string]$groupRows[0].confidence
      [pscustomobject]@{
        candidate = [string]$groupRows[0].candidate
        type = [string]$groupRows[0].candidateType
        confidence = $bestConfidence
        relationship = [string](($groupRows | Select-Object -ExpandProperty relationship -Unique) -join ",")
        signal = [string](($groupRows | Select-Object -ExpandProperty signal -Unique) -join ",")
        evidenceId = [string](($groupRows | Select-Object -ExpandProperty evidenceId -First 4) -join ",")
      }
    } |
    Sort-Object @{ Expression = { Get-OwnerConfidenceRank -Confidence ([string]$_.confidence) }; Descending = $true }, candidate)

  $columns = @("candidate", "type", "confidence", "relationship", "signal", "evidenceId")
  $lines = @(
    ($columns -join "`t")
    $rows | ForEach-Object {
      $row = $_
      (($columns | ForEach-Object { ConvertTo-OwnerCandidateTsvField -Value $row.$_ }) -join "`t")
    }
  )

  return ($lines -join [Environment]::NewLine)
}

function Get-OwnerCandidates {
  [CmdletBinding()]
  param(
    [Parameter(Mandatory = $true)]
    [object]$Report,

    [string[]]$UserOwnerTagNames = @("userOwner", "technicalOwner", "businessOwner"),

    [string[]]$GroupOwnerTagNames = @("groupOwner", "ownerGroup", "teamOwner", "team"),

    [string[]]$TagOwnerTagNames = @("owner", "serviceOwner", "costCenter", "costCentre", "cost-center", "cost_center")
  )

  $userOwnerTagNameSet = ConvertTo-OwnerTagNameSet -TagNames $UserOwnerTagNames
  $groupOwnerTagNameSet = ConvertTo-OwnerTagNameSet -TagNames $GroupOwnerTagNames
  $tagOwnerTagNameSet = ConvertTo-OwnerTagNameSet -TagNames $TagOwnerTagNames
  $candidates = @()
  foreach ($owner in @($Report.graph.owners)) {
    $candidateType = ConvertTo-OwnerCandidateType -ObjectType ([string]$owner.objectType)
    if ($candidateType -eq "User") {
      $candidateName = [string]$owner.userPrincipalName
      if ([string]::IsNullOrWhiteSpace($candidateName)) {
        $candidateName = [string]$owner.mail
      }
      if ([string]::IsNullOrWhiteSpace($candidateName)) {
        $candidateName = [string]$owner.displayName
      }
    } else {
      $candidateName = [string]$owner.displayName
    }

    if ([string]::IsNullOrWhiteSpace($candidateName)) {
      $candidateName = [string]$owner.objectId
    }

    $ownerSource = [string]$owner.ownerSource
    if ([string]::IsNullOrWhiteSpace($ownerSource)) {
      $ownerSource = "ServicePrincipal"
    }

    $ownerEvidenceBase = "/servicePrincipals/$($Report.enterpriseApplication.objectId)"
    $ownerReason = "Direct Microsoft Graph owner on the service principal."
    if ($ownerSource -eq "Application" -and -not [string]::IsNullOrWhiteSpace([string]$Report.enterpriseApplication.applicationObjectId)) {
      $ownerEvidenceBase = "/applications/$($Report.enterpriseApplication.applicationObjectId)"
      $ownerReason = "Direct Microsoft Graph owner on the application registration."
    }

    $candidates += New-OwnerCandidate `
      -Candidate $candidateName `
      -CandidateType $candidateType `
      -Confidence (ConvertTo-OwnerConfidence -Score 95) `
      -Relationship "Direct" `
      -Signal "OWNER" `
      -EvidenceId ("{0}/owners/{1}" -f $ownerEvidenceBase, [string]$owner.objectId) `
      -EvidenceSource "$ownerEvidenceBase/owners" `
      -EvidenceValue ([string]$owner.objectId) `
      -Reason $ownerReason
  }

  foreach ($tag in @(Get-EnterpriseApplicationOwnerTagEntries -Tags $Report.enterpriseApplication.tags)) {
    if ([string]::IsNullOrWhiteSpace([string]$tag.Value)) {
      continue
    }

    $candidateType = Resolve-OwnerTagCandidateType `
      -TagName ([string]$tag.Name) `
      -UserOwnerTagNameSet $userOwnerTagNameSet `
      -GroupOwnerTagNameSet $groupOwnerTagNameSet `
      -TagOwnerTagNameSet $tagOwnerTagNameSet

    if ([string]::IsNullOrWhiteSpace($candidateType)) {
      continue
    }

    $candidates += New-OwnerCandidate `
      -Candidate (Format-OwnerTagCandidateValue -TagName ([string]$tag.Name) -TagValue ([string]$tag.Value) -CandidateType $candidateType) `
      -CandidateType $candidateType `
      -Confidence (ConvertTo-OwnerConfidence -Score (Get-TagOwnerConfidence -TagName ([string]$tag.Name))) `
      -Relationship "Direct" `
      -Signal "TAG" `
      -EvidenceId ([string]$Report.enterpriseApplication.objectId) `
      -EvidenceSource "/servicePrincipals/$($Report.enterpriseApplication.objectId)/tags" `
      -EvidenceValue ("{0}={1}" -f $tag.Name, [string]$tag.Value) `
      -Reason "Owner-like tag found directly on the inspected service principal."
  }

  foreach ($memberOf in @($Report.graph.memberOf)) {
    $candidateType = ConvertTo-OwnerCandidateType -ObjectType ([string]$memberOf.objectType)
    $candidateName = [string]$memberOf.displayName
    if ([string]::IsNullOrWhiteSpace($candidateName)) {
      $candidateName = [string]$memberOf.objectId
    }

    $candidates += New-OwnerCandidate `
      -Candidate $candidateName `
      -CandidateType $candidateType `
      -Confidence (ConvertTo-OwnerConfidence -Score 70) `
      -Relationship "Indirect" `
      -Signal "MEMBERSHIP" `
      -EvidenceId ("/servicePrincipals/{0}/memberOf/{1}" -f $Report.enterpriseApplication.objectId, [string]$memberOf.objectId) `
      -EvidenceSource "/servicePrincipals/$($Report.enterpriseApplication.objectId)/memberOf" `
      -EvidenceValue ([string]$memberOf.objectId) `
      -Reason "The service principal is a member of this directory object."
  }

  foreach ($coAssignee in @($Report.azure.coAssignedRoleCandidates)) {
    $candidateType = ConvertTo-OwnerCandidateType -ObjectType ([string]$coAssignee.principalType)
    if ($candidateType -eq "Unknown") {
      continue
    }

    if ($candidateType -eq "User") {
      $candidateName = [string]$coAssignee.principalName
      if ([string]::IsNullOrWhiteSpace($candidateName)) {
        $candidateName = [string]$coAssignee.principalDisplayName
      }
    } else {
      $candidateName = [string]$coAssignee.principalDisplayName
    }

    if ([string]::IsNullOrWhiteSpace($candidateName)) {
      $candidateName = [string]$coAssignee.principalId
    }

    if ([string]::IsNullOrWhiteSpace($candidateName)) {
      continue
    }

    $confidence = if ($candidateType -eq "User") { 65 } elseif ($candidateType -eq "Group") { 60 } else { 45 }
    $candidates += New-OwnerCandidate `
      -Candidate $candidateName `
      -CandidateType $candidateType `
      -Confidence (ConvertTo-OwnerConfidence -Score $confidence) `
      -Relationship "Indirect" `
      -Signal "RBAC" `
      -EvidenceId ([string]$coAssignee.scope) `
      -EvidenceSource ([string]$coAssignee.scope) `
      -EvidenceValue ([string]$coAssignee.roleDefinitionName) `
      -Reason "This principal has Azure RBAC on the same scope as the inspected service principal."
  }

  foreach ($resource in @($Report.azure.resourceDependencies)) {
    if (-not $resource.tags) {
      continue
    }

    foreach ($tag in @(Get-OwnerCandidateTagEntries -Tags $resource.tags)) {
      if ([string]::IsNullOrWhiteSpace([string]$tag.Value)) {
        continue
      }

      $candidateType = Resolve-OwnerTagCandidateType `
        -TagName ([string]$tag.Name) `
        -UserOwnerTagNameSet $userOwnerTagNameSet `
        -GroupOwnerTagNameSet $groupOwnerTagNameSet `
        -TagOwnerTagNameSet $tagOwnerTagNameSet

      if ([string]::IsNullOrWhiteSpace($candidateType)) {
        continue
      }

      $candidates += New-OwnerCandidate `
        -Candidate (Format-OwnerTagCandidateValue -TagName ([string]$tag.Name) -TagValue ([string]$tag.Value) -CandidateType $candidateType) `
        -CandidateType $candidateType `
        -Confidence (ConvertTo-OwnerConfidence -Score (Get-TagOwnerConfidence -TagName ([string]$tag.Name))) `
        -Relationship "Indirect" `
        -Signal "RBAC" `
        -EvidenceId ([string]$resource.resourceId) `
        -EvidenceSource ([string]$resource.resourceId) `
        -EvidenceValue ("{0}={1}" -f $tag.Name, [string]$tag.Value) `
        -Reason "Azure resource tag found on a resource reached through RBAC assigned to the inspected service principal."
    }
  }

  foreach ($activity in @($Report.azure.activityEvidence)) {
    $candidateName = [string]$activity.callerName
    if ([string]::IsNullOrWhiteSpace($candidateName)) {
      $candidateName = [string]$activity.caller
    }
    if ([string]::IsNullOrWhiteSpace($candidateName)) {
      continue
    }

    $candidates += New-OwnerCandidate `
      -Candidate $candidateName `
      -CandidateType "ActivityCaller" `
      -Confidence (ConvertTo-OwnerConfidence -Score 25) `
      -Relationship "Indirect" `
      -Signal "LOG" `
      -EvidenceId ([string]$activity.resourceId) `
      -EvidenceSource ([string]$activity.resourceId) `
      -EvidenceValue ([string]$activity.operationNameValue) `
      -Reason "Recent Azure activity matched the inspected service principal; this is weak ownership evidence."
  }

  $rankedCandidates = @($candidates |
    Sort-Object @{ Expression = { Get-OwnerConfidenceRank -Confidence ([string]$_.confidence) }; Descending = $true }, candidate, evidenceId)

  if ($rankedCandidates.Count -eq 0) {
    return @(
      New-OwnerCandidate `
        -Candidate "No owner candidate found" `
        -CandidateType "NotFound" `
        -Confidence "LOW" `
        -Relationship "None" `
        -Signal "NONE" `
        -EvidenceId "not-found" `
        -EvidenceSource "ownerCandidates" `
        -EvidenceValue "" `
        -Reason "No Graph owners, memberships, Azure RBAC co-assignments, resource owner tags, or activity evidence were found."
    )
  }

  return $rankedCandidates
}

# SIG # Begin signature block
# MII9NAYJKoZIhvcNAQcCoII9JTCCPSECAQExDzANBglghkgBZQMEAgEFADB5Bgor
# BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG
# KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAg1IaaPTYQD9B5
# xBe4ZlcGiX4RAz8Dg/8+wDLba5hCpKCCIfYwggXMMIIDtKADAgECAhBUmNLR1FsZ
# lUgTecgRwIeZMA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVu
# dGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAy
# MDAeFw0yMDA0MTYxODM2MTZaFw00NTA0MTYxODQ0NDBaMHcxCzAJBgNVBAYTAlVT
# MR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jv
# c29mdCBJZGVudGl0eSBWZXJpZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRo
# b3JpdHkgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALORKgeD
# Bmf9np3gx8C3pOZCBH8Ppttf+9Va10Wg+3cL8IDzpm1aTXlT2KCGhFdFIMeiVPvH
# or+Kx24186IVxC9O40qFlkkN/76Z2BT2vCcH7kKbK/ULkgbk/WkTZaiRcvKYhOuD
# PQ7k13ESSCHLDe32R0m3m/nJxxe2hE//uKya13NnSYXjhr03QNAlhtTetcJtYmrV
# qXi8LW9J+eVsFBT9FMfTZRY33stuvF4pjf1imxUs1gXmuYkyM6Nix9fWUmcIxC70
# ViueC4fM7Ke0pqrrBc0ZV6U6CwQnHJFnni1iLS8evtrAIMsEGcoz+4m+mOJyoHI1
# vnnhnINv5G0Xb5DzPQCGdTiO0OBJmrvb0/gwytVXiGhNctO/bX9x2P29Da6SZEi3
# W295JrXNm5UhhNHvDzI9e1eM80UHTHzgXhgONXaLbZ7LNnSrBfjgc10yVpRnlyUK
# xjU9lJfnwUSLgP3B+PR0GeUw9gb7IVc+BhyLaxWGJ0l7gpPKWeh1R+g/OPTHU3mg
# trTiXFHvvV84wRPmeAyVWi7FQFkozA8kwOy6CXcjmTimthzax7ogttc32H83rwjj
# O3HbbnMbfZlysOSGM1l0tRYAe1BtxoYT2v3EOYI9JACaYNq6lMAFUSw0rFCZE4e7
# swWAsk0wAly4JoNdtGNz764jlU9gKL431VulAgMBAAGjVDBSMA4GA1UdDwEB/wQE
# AwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTIftJqhSobyhmYBAcnz1AQ
# T2ioojAQBgkrBgEEAYI3FQEEAwIBADANBgkqhkiG9w0BAQwFAAOCAgEAr2rd5hnn
# LZRDGU7L6VCVZKUDkQKL4jaAOxWiUsIWGbZqWl10QzD0m/9gdAmxIR6QFm3FJI9c
# Zohj9E/MffISTEAQiwGf2qnIrvKVG8+dBetJPnSgaFvlVixlHIJ+U9pW2UYXeZJF
# xBA2CFIpF8svpvJ+1Gkkih6PsHMNzBxKq7Kq7aeRYwFkIqgyuH4yKLNncy2RtNwx
# AQv3Rwqm8ddK7VZgxCwIo3tAsLx0J1KH1r6I3TeKiW5niB31yV2g/rarOoDXGpc8
# FzYiQR6sTdWD5jw4vU8w6VSp07YEwzJ2YbuwGMUrGLPAgNW3lbBeUU0i/OxYqujY
# lLSlLu2S3ucYfCFX3VVj979tzR/SpncocMfiWzpbCNJbTsgAlrPhgzavhgplXHT2
# 6ux6anSg8Evu75SjrFDyh+3XOjCDyft9V77l4/hByuVkrrOj7FjshZrM77nq81YY
# uVxzmq/FdxeDWds3GhhyVKVB0rYjdaNDmuV3fJZ5t0GNv+zcgKCf0Xd1WF81E+Al
# GmcLfc4l+gcK5GEh2NQc5QfGNpn0ltDGFf5Ozdeui53bFv0ExpK91IjmqaOqu/dk
# ODtfzAzQNb50GQOmxapMomE2gj4d8yu8l13bS3g7LfU772Aj6PXsCyM2la+YZr9T
# 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggaoMIIEkKADAgECAhMzAASy5NjH
# +PRKezsKAAAABLLkMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD
# VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ
# RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwODEyMDg1ODE4WhcNMjYwODE1
# MDg1ODE4WjBpMQswCQYDVQQGEwJQTDEXMBUGA1UECB4OAUEA8wBkAHoAawBpAGUx
# DzANBgNVBAcTBldpZWx1bjEXMBUGA1UEChMOc29mdDRwbSBzcCB6b28xFzAVBgNV
# BAMTDnNvZnQ0cG0gc3Agem9vMIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKC
# AYEAiXC7gBUSO8amBSo2+j0tuOkycf07cqnmxd4FeidgU+njUj4DwajTsLkUiq7g
# F2O8XMLDRxHCxW1jtCYH+RQgQU9QS1l0vTC7l/BlU+2FslURQDrnm1qBIx2vRW3S
# sH0JWH6ZnmP1PeuRaemM4OCHSXZKL04KXuM7dEo7zEGwcpXEbIy0Ehn6rSQHLLYR
# oFNK2ND155poVmNnho0AikOfFNQ5Zmt4002eBI1jBbcWaN1vR4N5XQfYUKd2NnWC
# e2q3kUmqax6lCNDdg2hREsUe+uf6qCRLd3BbQpzr5GWxvaJAHeKoXGCf3oFbpjeT
# /JzhxcK9hCmHJxTjMccJrwW9VZ7jeVlMCVXJVRPXURLur/HMU0/EF3c8xPVwtIvX
# rDumUf861dT9gt1jGv9AoJElN/XOK9FLwo12rU8qyki+NV1tOHAiCfhBU5Dny3Gz
# vEuzrgKE/R8/7J2JWL9Pgb28d8mlfPZezueETJHxd3Y6sDT5+PP7oOA3G/+1Q19/
# Tz7JAgMBAAGjggHWMIIB0jAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA9
# BgNVHSUENjA0BgorBgEEAYI3YQEABggrBgEFBQcDAwYcKwYBBAGCN2GCycz3dYGA
# 0Y0Tg469piSB0sq0aDAdBgNVHQ4EFgQUu/Bn01b97e842Q54MLTP04OW0tQwHwYD
# VR0jBBgwFoAUayVB3vtrfP0YgAotf492XapzPbgwZwYDVR0fBGAwXjBcoFqgWIZW
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIw
# SUQlMjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0ElMjAwNC5jcmwwdAYIKwYBBQUH
# AQEEaDBmMGQGCCsGAQUFBzAChlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp
# b3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUy
# MENBJTIwMDQuY3J0MFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o
# dG0wDQYJKoZIhvcNAQEMBQADggIBAIKCdHRzqgKHB6u7eb4VQqKJR1gf0grlY3QR
# kqZC9yNemKXqlg0iL5NYDRsysjzSZyX4rKU/ZTe8qTuruyBprgW3vF80Dmm8S0+t
# m/xbJeet2RRXJHj2NaEoavxrDZ1YWb7Dn+cgrPuQACE5Arhg2lYnwO19R+YOa/R+
# z/cwP4vkeQ0w9zVpl2xdFxmM/MiJWm8DEuNTtlNOE/NstBxMX8VW7nGL8qFreOZP
# 8f78acfGhX76pcHHraQxeihVBT6NHlyyEcUi95TkjUP4jAYaYJ2WzBt5ISZX9yoS
# 0khleUTBwMg0gFbDQz4JoT5tPQwky9C+LLhcIs+om/fCBEW1eyoZAUuW1lQI+bZ6
# EBALlBk5x3uGjyajZTCzVYxWJ6KARyEq1HdYi0se6Nm/FZGxb94yRXwGj7etZrk6
# TvjX4sLsDT1HeAPJ+eT4Ohgdmhzq98bdFqNKXx5NFrafdV+RZ1RiCOc1JBKdDc4g
# os3dzZJ0mctzN9zZpbOIev2keYRf2Q3QA+wJ6B7WMOw0LltK4pBw8UEoFnlr69wN
# Fe8rK/PmxfolP9BKB7n8jWsOlI/B7aP1oodsCH3N3lfuE07wp9YfUQ7squoZ2e4N
# HsHWYVL88f2qfQlrCRMOmhlE1tFqY0gm/sQV2RvJlkUk1m5lgfPT8Z5p3UGEyhWM
# 3bTmqS46MIIGqDCCBJCgAwIBAgITMwAEsuTYx/j0Sns7CgAAAASy5DANBgkqhkiG
# 9w0BAQwFADBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENB
# IDA0MB4XDTI2MDgxMjA4NTgxOFoXDTI2MDgxNTA4NTgxOFowaTELMAkGA1UEBhMC
# UEwxFzAVBgNVBAgeDgFBAPMAZAB6AGsAaQBlMQ8wDQYDVQQHEwZXaWVsdW4xFzAV
# BgNVBAoTDnNvZnQ0cG0gc3Agem9vMRcwFQYDVQQDEw5zb2Z0NHBtIHNwIHpvbzCC
# AaIwDQYJKoZIhvcNAQEBBQADggGPADCCAYoCggGBAIlwu4AVEjvGpgUqNvo9Lbjp
# MnH9O3Kp5sXeBXonYFPp41I+A8Go07C5FIqu4BdjvFzCw0cRwsVtY7QmB/kUIEFP
# UEtZdL0wu5fwZVPthbJVEUA655tagSMdr0Vt0rB9CVh+mZ5j9T3rkWnpjODgh0l2
# Si9OCl7jO3RKO8xBsHKVxGyMtBIZ+q0kByy2EaBTStjQ9eeaaFZjZ4aNAIpDnxTU
# OWZreNNNngSNYwW3Fmjdb0eDeV0H2FCndjZ1gntqt5FJqmsepQjQ3YNoURLFHvrn
# +qgkS3dwW0Kc6+Rlsb2iQB3iqFxgn96BW6Y3k/yc4cXCvYQphycU4zHHCa8FvVWe
# 43lZTAlVyVUT11ES7q/xzFNPxBd3PMT1cLSL16w7plH/OtXU/YLdYxr/QKCRJTf1
# zivRS8KNdq1PKspIvjVdbThwIgn4QVOQ58txs7xLs64ChP0fP+ydiVi/T4G9vHfJ
# pXz2Xs7nhEyR8Xd2OrA0+fjz+6DgNxv/tUNff08+yQIDAQABo4IB1jCCAdIwDAYD
# VR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwPQYDVR0lBDYwNAYKKwYBBAGCN2EB
# AAYIKwYBBQUHAwMGHCsGAQQBgjdhgsnM93WBgNGNE4OOvaYkgdLKtGgwHQYDVR0O
# BBYEFLvwZ9NW/e3vONkOeDC0z9ODltLUMB8GA1UdIwQYMBaAFGslQd77a3z9GIAK
# LX+Pdl2qcz24MGcGA1UdHwRgMF4wXKBaoFiGVmh0dHA6Ly93d3cubWljcm9zb2Z0
# LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDUyUy
# MEFPQyUyMENBJTIwMDQuY3JsMHQGCCsGAQUFBwEBBGgwZjBkBggrBgEFBQcwAoZY
# aHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQl
# MjBJRCUyMFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNydDBUBgNVHSAE
# TTBLMEkGBFUdIAAwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQu
# Y29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMA0GCSqGSIb3DQEBDAUAA4IC
# AQCCgnR0c6oChweru3m+FUKiiUdYH9IK5WN0EZKmQvcjXpil6pYNIi+TWA0bMrI8
# 0mcl+KylP2U3vKk7q7sgaa4Ft7xfNA5pvEtPrZv8WyXnrdkUVyR49jWhKGr8aw2d
# WFm+w5/nIKz7kAAhOQK4YNpWJ8DtfUfmDmv0fs/3MD+L5HkNMPc1aZdsXRcZjPzI
# iVpvAxLjU7ZTThPzbLQcTF/FVu5xi/Kha3jmT/H+/GnHxoV++qXBx62kMXooVQU+
# jR5cshHFIveU5I1D+IwGGmCdlswbeSEmV/cqEtJIZXlEwcDINIBWw0M+CaE+bT0M
# JMvQviy4XCLPqJv3wgRFtXsqGQFLltZUCPm2ehAQC5QZOcd7ho8mo2Uws1WMViei
# gEchKtR3WItLHujZvxWRsW/eMkV8Bo+3rWa5Ok741+LC7A09R3gDyfnk+DoYHZoc
# 6vfG3RajSl8eTRa2n3VfkWdUYgjnNSQSnQ3OIKLN3c2SdJnLczfc2aWziHr9pHmE
# X9kN0APsCege1jDsNC5bSuKQcPFBKBZ5a+vcDRXvKyvz5sX6JT/QSge5/I1rDpSP
# we2j9aKHbAh9zd5X7hNO8KfWH1EO7KrqGdnuDR7B1mFS/PH9qn0JawkTDpoZRNbR
# amNIJv7EFdkbyZZFJNZuZYHz0/Gead1BhMoVjN205qkuOjCCBygwggUQoAMCAQIC
# EzMAAAAWMZKNkgJle5oAAAAAABYwDQYJKoZIhvcNAQEMBQAwYzELMAkGA1UEBhMC
# VVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWlj
# cm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTAeFw0yNjAz
# MjYxODExMjlaFw0zMTAzMjYxODExMjlaMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQK
# ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBW
# ZXJpZmllZCBDUyBBT0MgQ0EgMDQwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIK
# AoICAQDKVfrI2+gJMM/0bQ5OVKNdvOASzLbUUMvXuf+Vl7YGuofPaZHVo3gMHF5i
# nT+GMSpIcfIZ9qtXU1UG68ry8vNbQtOL4Nm30ifXpqI1+ByiAWLO1YT0WnzG7XPO
# uoTeeWsNZv5FmjxCsReBZvyzyzCyXZbu1EQfJxWTH4ebUwtAiW9rqMf9eDj/wYhi
# EfNteJV3ZFeibD2ztCHr9JhFdd97XbnCHgQoTIqc02X5xlRKtUGBa++OtHBBjiJ/
# uwBnzTkqu4FjpZjQeJtrmda+ur1CT2jflWIB/ypn7u7V9tvW9wJbJYt/H2EtJ0GO
# NWxJZ7TEu8jWPindOO3lzPP7UtzS/mVDV94HucWaltmsra6zSG8BoEJ87IM8QSb7
# vfm/O41FhYkUv89WIj5ES2O4kxyiMSfe95CMivCuYrRP2hKvx7egPMrWgDDBkxML
# grKZO9hRNUMm8vk3w5b9SogHOyJVhxyFm8aFXfIxgqDF4S0g4bhbhnzljmSlCLlu
# mMZcXFGDjpF2tNoAu3VGFGYtHtTSNVKvZpgB3b4ynaoDkbPf+Wg4523jt4VneasB
# gZhC1srZI2NCnCBBfgjLq04pqEKAWEohyW2K29KSkkHvt5VaE1ac3Yt+oyiOzMS5
# 7tXwQDJLGvLg/OXFO0VNvczDndfIfXYExB/ab2PuMSwd5VIBOwIDAQABo4IB3DCC
# AdgwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRr
# JUHe+2t8/RiACi1/j3ZdqnM9uDBUBgNVHSAETTBLMEkGBFUdIAAwQTA/BggrBgEF
# BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9z
# aXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMBIGA1UdEwEB/wQI
# MAYBAf8CAQAwHwYDVR0jBBgwFoAU2UEpsA8PY2zvadf1zSmepEhqMOYwcAYDVR0f
# BGkwZzBloGOgYYZfaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwv
# TWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENvZGUlMjBTaWduaW5nJTIwUENB
# JTIwMjAyMS5jcmwwfQYIKwYBBQUHAQEEcTBvMG0GCCsGAQUFBzAChmFodHRwOi8v
# d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElEJTIw
# VmVyaWZpZWQlMjBDb2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3J0MA0GCSqG
# SIb3DQEBDAUAA4ICAQAG1VBeVHTVRBljlcZD3IiMxwPyMjQyLNaEnVu5mODm2hRB
# JfH8GsBLATmrHAc8F47jmk5CnpUPiIguCbw6Z/KVj4Dsoiq228NSLMLewFfGMri7
# uwNGLISC5ccp8vUdADDEIsS2dE+QI9OwkDpv3XuUD7d+hAgcLVcMOl1AsfEZtsZe
# nhGvSYUrm/FuLq0BqEGL9GXM5c+Ho9q8o+Vn/S+GWQN2y+gkRO15s0kI05nUpq/d
# OD4ri9rgVs6tipEd0YZqGgD+CZNiaZWrDTOQbNPncd2F9qOsUa20miYruoT5PwJA
# aI+QQiTE2ZJeMJOkOpzhTUgqVMZwZidEUZKCqudaeQA08WwnkQMfKyHzaU8j48UL
# cU4hUwvMsv7fSurOe9GAdRQCPvF8WcSK5oDHe8VVJM4tv6KKCm91HqLx9JamBgRI
# 6R2SfY3nu26EGznu0rCg/769z8xWm4PVcC2ZaL6VlKVqFp1NsN8YqMyf5t+bbGVb
# 09noFKcJG/UwyGlxRmQBlfeBUQx5/ytlzZzsEnhrJF9fTAfje8j3OdX5lEnePTFQ
# LRlvzZFBqUXnIeQKv3fHQjC9m2fo/Z01DII/qp3d8LhGVUW0BCG04fRwHJNH8iqq
# CG/qofMv+kym2AxBDnHzNgRjL60JOFiBgiurvLhYQNhB95KWojFA6shQnggkMTCC
# B54wggWGoAMCAQICEzMAAAAHh6M0o3uljhwAAAAAAAcwDQYJKoZIhvcNAQEMBQAw
# dzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjFI
# MEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZlcmlmaWNhdGlvbiBSb290IENl
# cnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIxMDQwMTIwMDUyMFoXDTM2MDQw
# MTIwMTUyMFowYzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jw
# b3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0IElEIFZlcmlmaWVkIENvZGUgU2ln
# bmluZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALLw
# wK8ZiCji3VR6TElsaQhVCbRS/3pK+MHrJSj3Zxd3KU3rlfL3qrZilYKJNqztA9OQ
# acr1AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3NJlfIaTE/xrweLoQ71lzCHkD7A4A
# s1Bs076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4V9NQhNUwgrx9rGQ//h890Q8JdjLL
# w0nV+ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a8+Ae2nPIPc8sZU6ZE7iRrRZywRmr
# KDp5+TcmJX9MRff241UaOBs4NmHOyke8oU1TYrkxh+YeHgfWo5tTgkoSMoayqoDp
# HOLJs+qG8Tvh8SnifW2Jj3+ii11TS8/FGngEaNAWrbyfNrC69oKpRQXY9bGH6jn9
# NEJv9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lXezky6Uh/cgjkVd6CGUAf0K+Jw+GE
# /5VpIVbcNr9rNE50Sbmy/4RTCEGvOq3GhjITbCa4crCzTTHgYYjHs1NbOc6brH+e
# KpWLtr+bGecy9CrwQyx7S/BfYJ+ozst7+yZtG2wR461uckFu0t+gCwLdN0A6cFtS
# RtR8bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLefRaQcVTgRnzeLzdpt32cdYKp+dhr2
# ogc+qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpXRRo3AgMBAAGjggI1MIICMTAOBgNV
# HQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNlBKbAPD2Ns
# 72nX9c0pnqRIajDmMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNo
# dHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5o
# dG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAf
# BgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHeg
# dYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0
# JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUl
# MjBBdXRob3JpdHklMjAyMDIwLmNybDCBwwYIKwYBBQUHAQEEgbYwgbMwgYEGCCsG
# AQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01p
# Y3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRp
# ZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQwLQYIKwYBBQUHMAGGIWh0dHA6
# Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2NzcDANBgkqhkiG9w0BAQwFAAOCAgEA
# fyUqnv7Uq+rdZgrbVyNMul5skONbhls5fccPlmIbzi+OwVdPQ4H55v7VOInnmezQ
# EeW4LqK0wja+fBznANbXLB0KrdMCbHQpbLvG6UA/Xv2pfpVIE1CRFfNF4XKO8XYE
# a3oW8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzwk+f9E5StNp5T8FG7/VEURIVWArbA
# zPt9ThVN3w1fAZkF7+YU9kbq1bCR2YD+MtunSQ1Rft6XG7b4e0ejRA7mB2IoX5hN
# h3UEauY0byxNRG+fT2MCEhQl9g2i2fs6VOG19CNep7SquKaBjhWmirYyANb0RJSL
# WjinMLXNOAga10n8i9jqeprzSMU5ODmrMCJE12xS/NWShg/tuLjAsKP6SzYZ+1Ry
# 358ZTFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9HBqS0DErVLjQwK8VtsBdekBmdTbQV
# oCgPCqr+PDPB3xajYnzevs7eidBsM71PINK2BoE2UfMwxCCX3mccFgx6UsQeRSdV
# VVNSyALQe6PT12418xon2iDGE81OGCreLzDcMAZnrUAx4XQLUz6ZTl65yPUiOh3k
# 7Yww94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmzIeoB1dVLlz4i3IpaDcR+iuGjH2Td
# aC1ZOmBXiCRKJLj4DT2uhJ04ji+tHD6n58vhavFIrmcxghqUMIIakAIBATBxMFox
# CzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzAp
# BgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQCEzMABLLk
# 2Mf49Ep7OwoAAAAEsuQwDQYJYIZIAWUDBAIBBQCgXjAQBgorBgEEAYI3AgEMMQIw
# ADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAvBgkqhkiG9w0BCQQxIgQgRRs3
# tfHykB1de6EmpehFLEXaH06RgYU0JK8BuQf5yCgwDQYJKoZIhvcNAQEBBQAEggGA
# WnJGMpqTvOQIlqlCdSuOSdt9BSJS+VCjhwyNY7PysYxAOe0wmCIK0UknxlB+20p0
# bu7j2LzO/OCoQjyd0hYlvlxXGTT+uuLXp/7zH6zmnA2dZj1nkocF35y4QkcexBXF
# mjHPyc2mHhlOHhTVDRO0e7v4yTzYHKnU+rO3UU1qNpkLRd4mkqf51QaWsYn1rpVp
# 5x5DgPMtOnkF2+2HabWf5Dhd+YPE3cmZ+qwlO0IDX76DoI80CwNcP6+guF8QVE7F
# O9wxqq6LqHGx9SrQzyDDoy/w+Z0kS2RS+bvdWiXIJPkFVnjs27vAzWgX18csK08v
# GGGuBPFjOYzLP/tUsALELNQPoXY2d+QdcG7BrELCtDEH9n02GIOinC1KRfZE+33w
# W51U2VtPpzxoOfutxwr1BKrifUNH382QC3EKzPALF3QLZvSca45t0RzGXPj6dbgt
# hHO3QBhArY8iWLkYPglk0HPf5p0mcXB1gdQyXUlPanA0SCTs2EnyXCeB5pVQsW3l
# oYIYFDCCGBAGCisGAQQBgjcDAwExghgAMIIX/AYJKoZIhvcNAQcCoIIX7TCCF+kC
# AQMxDzANBglghkgBZQMEAgEFADCCAWIGCyqGSIb3DQEJEAEEoIIBUQSCAU0wggFJ
# AgEBBgorBgEEAYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIARb40SjHAKsde72kp4F
# +TlkgOO394fGxIwJthcx8BBGAgZqaJ6Bku8YEzIwMjYwODEzMjA1NjI0Ljc3OVow
# BIACAfSggeGkgd4wgdsxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9u
# MRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp
# b24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNhIE9wZXJhdGlvbnMxJzAlBgNV
# BAsTHm5TaGllbGQgVFNTIEVTTjpBNTAwLTA1RTAtRDk0NzE1MDMGA1UEAxMsTWlj
# cm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHmggg8hMIIH
# gjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAABTANBgkqhkiG9w0BAQwFADB3
# MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMUgw
# RgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIFJvb3QgQ2Vy
# dGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAxMTE5MjAzMjMxWhcNMzUxMTE5
# MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBv
# cmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBp
# bmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ5851Jj
# /eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBvf7KrQ5cMSqFSHGqg2/qJhYqO
# QxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDsfMuIEqvGYOPURAH+Ybl4SJEE
# Snt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbBT7uq3wx3mXhtVmtcCEr5ZKTk
# KKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5EeH5KrlFnxpjKKTavwfFP6Xa
# GZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6ovnUfANjIgM9JDdJ4e0qiDRm
# 5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fjJHrmlQ0EIXmp4DhDBieKUGR+
# eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOsRpeexIveR1MPTVf7gt8hY64X
# NPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiunhKbq0XbjkNoU5JhtYUrlmAbp
# xRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE3oWsDqMX3jjv40e8KN5YsJBn
# czyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8cIxLoKSDzCCBOu0hWdjzKNu8
# Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMBAAGjggIbMIICFzAOBgNVHQ8B
# Af8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFGtpKDo1L0hjQM97
# 2K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBBMD8GCCsGAQUFBwIBFjNodHRw
# Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0w
# EwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBDAEEw
# DwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQT2io
# ojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3Br
# aW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24lMjBS
# b290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBlAYIKwYB
# BQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29mdC5j
# b20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0
# aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcnQw
# DQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXnTHho+k7h2ESZJRWluLE0Oa/p
# O+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC2IWmtKMyS1OWIviwpnK3aL5J
# edwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5zyEh89F72u9UIw+IfvM9lzDm
# c2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbNnCKNZPmhzoa8PccOiQljjTW6
# GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqst8S+w+RUdie8fXC1jKu3m9KG
# IqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVmoNR/dSpRCxlot0i79dKOChmo
# ONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRSSvijmwJwxRxLLpMQ/u4xXxFf
# R4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7vPKNMN+SZDWycU5ODIRfyoGl5
# 9BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/26ozePQ/TWfNXKBOmkFpvPE8C
# H+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/AAxw9Sdgq/+rY7jjgs7X6fqP
# TXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSOiUIr0Xqcr1nJfiWG2GwYe6Zo
# AF1bMIIHlzCCBX+gAwIBAgITMwAAAFZ+j51YCI7pYAAAAAAAVjANBgkqhkiG9w0B
# AQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0
# aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcg
# Q0EgMjAyMDAeFw0yNTEwMjMyMDQ2NTFaFw0yNjEwMjIyMDQ2NTFaMIHbMQswCQYD
# VQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEe
# MBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3Nv
# ZnQgQW1lcmljYSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046
# QTUwMC0wNUUwLUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRp
# bWUgU3RhbXBpbmcgQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
# CgKCAgEAtKWfm/ul027/d8Rlb8Mn/g0QUvvLqY2Vsy3tI8U2tFSspTZomZOD3BHT
# 8LkR+RrhMJgb1VjAKFNysaK9cLSXifPGSIBrPCgs9P4y24lrJEmrV6Q5z4BmqMhI
# PrZhEvZnWpCS4HO7jYSei/nxmC7/1Er+l5Lg3PmSxb8d2IVcARxSw1B4mxB6XI0n
# kel9wa1dYb2wfGpofraFmxZOxT9eNht4LH0RBSVueba6ZNpjS/0gtfm7qiIiyP6p
# 6PRzTTbMnVqsHnV/d/rW0zHx+Q+QNZ5wUqKmTZJB9hU853+2pX5rDfK32uNY9/WB
# OAmzbqgpEdQkbiMavUMyUDShmycIvgHdQnS207sTj8M+kJL3tOdahPuPqMwsaCCg
# dfwwQx0O9TKe7FSvbAEYs1AnldCl/KHGZCOVvUNqjyL10JLe0/+GD9/ynqXGWFpX
# OjaunvZ/cKROhjN4M5e6xx0b2miqcPii4/ii2ZheKallJET7CKlpFShs3wyg6F/f
# ojQxQvPnbWD4Nyx6lhjWjwmoLcx6w1FSCtavLCly33BLRSlTU4qKUxaa8d7YN7Eq
# pn9XO0SY0umOvKFXrWH7rxl+9iaicitdnTTksAnRjvekdKT3lg7lRMfmfZU8vXNi
# N0UYJzT9EjqjRm0uN/h0oXxPhNfPYqeFbyPXGGxzaYUz6zx3qTcCAwEAAaOCAcsw
# ggHHMB0GA1UdDgQWBBS+tjPyu6tZ/h5GsyLvyz1H+FNIWjAfBgNVHSMEGDAWgBRr
# aSg6NS9IY0DPe9ivSek+2T3bITBsBgNVHR8EZTBjMGGgX6BdhltodHRwOi8vd3d3
# Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBQdWJsaWMlMjBS
# U0ElMjBUaW1lc3RhbXBpbmclMjBDQSUyMDIwMjAuY3JsMHkGCCsGAQUFBwEBBG0w
# azBpBggrBgEFBQcwAoZdaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j
# ZXJ0cy9NaWNyb3NvZnQlMjBQdWJsaWMlMjBSU0ElMjBUaW1lc3RhbXBpbmclMjBD
# QSUyMDIwMjAuY3J0MAwGA1UdEwEB/wQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUH
# AwgwDgYDVR0PAQH/BAQDAgeAMGYGA1UdIARfMF0wUQYMKwYBBAGCN0yDfQEBMEEw
# PwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9j
# cy9SZXBvc2l0b3J5Lmh0bTAIBgZngQwBBAIwDQYJKoZIhvcNAQEMBQADggIBAA4D
# qAXEsO26j/La7Fgn/Qifit8xuZekqZ57+Ye+sH/hRTbEEjGYrZgsqwR/lUUfKCFp
# bZF8msaZPQJOR4YYUEU8XyjLrn8Y1jCSmoxh9l7tWiSoc/JFBw356JAmzGGxeBA2
# EWSxRuTr1AuZe6nYaN8/wtFkiHcs8gMadxXBs6DxVhyu5YnhLPQkfumKm3lFftwE
# 7pieV7f1lskmlgsC6AeSGCzGPZUgCvcH5Tv/Qe9z7bIImSD3SuzhOIwaP+eKQTYf
# 67TifyJKkWQSdGfTA6Kcu41k8LB6oPK+MLk1jbxxK5wPqLSL62xjK04SBXHEJSEn
# sFt0zxWkxP/lgej1DxqUnmrYEdkxvzKSHIAqFWSZul/5hI+vJxvFPhsNQBEk4cSu
# lDkJQpcdVi/gmf/mHFOYhDBjsa15s4L+2sBil3XV/T8RiR66Q8xYvTLRWxd2dVsr
# OoCwnsU4WIeiC0JinCv1WLHEh7Qyzr9RSr4kKJLWdpNYLhgjkojTmEkAjFO774t3
# xB7enbvIF0GOsV19xnCUzq9EGKyt0gMuaphKlNjJ+aTpjWMZDGo+GOKsnp93Hmft
# ml0Syp3F9+M3y+y6WJGUZoIZJq227jDjjEndtpUrh9BdPdVIfVJD/Au81Rzh05UH
# AivorQ3Os8PELHIgiOd9TWzbdgmGzcILt/ddVQERMYIHRjCCB0ICAQEweDBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAIT
# MwAAAFZ+j51YCI7pYAAAAAAAVjANBglghkgBZQMEAgEFAKCCBJ8wEQYLKoZIhvcN
# AQkQAg8xAgUAMBoGCSqGSIb3DQEJAzENBgsqhkiG9w0BCRABBDAcBgkqhkiG9w0B
# CQUxDxcNMjYwODEzMjA1NjI0WjAvBgkqhkiG9w0BCQQxIgQgcRHZoy7VlWKukqXp
# y5U0jyBJXZ2CnGlS1TPojWJvONwwgbkGCyqGSIb3DQEJEAIvMYGpMIGmMIGjMIGg
# BCC2DDMlTaTj8JV3iTg5Xnpe4CSH60143Z+X9o5NBgMMqDB8MGWkYzBhMQswCQYD
# VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD
# EylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMAITMwAA
# AFZ+j51YCI7pYAAAAAAAVjCCA2EGCyqGSIb3DQEJEAISMYIDUDCCA0yhggNIMIID
# RDCCAiwCAQEwggEJoYHhpIHeMIHbMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2Fz
# aGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENv
# cnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25z
# MScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046QTUwMC0wNUUwLUQ5NDcxNTAzBgNV
# BAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBpbmcgQXV0aG9yaXR5
# oiMKAQEwBwYFKw4DAhoDFQD/c/cpFSqQWYBeXggyRJ2ZbvYEEaBnMGWkYzBhMQsw
# CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYD
# VQQDEylNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAN
# BgkqhkiG9w0BAQsFAAIFAO4oNOYwIhgPMjAyNjA4MTMxMjE5NTBaGA8yMDI2MDgx
# NDEyMTk1MFowdzA9BgorBgEEAYRZCgQBMS8wLTAKAgUA7ig05gIBADAKAgEAAgIi
# VQIB/zAHAgEAAgISTTAKAgUA7imGZgIBADA2BgorBgEEAYRZCgQCMSgwJjAMBgor
# BgEEAYRZCgMCoAowCAIBAAIDB6EgoQowCAIBAAIDAYagMA0GCSqGSIb3DQEBCwUA
# A4IBAQAb7WfScQiO3mAIjSuIIuqmo6lPFjGwq4YdaaFIEz2odJfkBtXc98Xsg40G
# E/u2bN5S+jVRU+rZHWsNOvrdaS4iouuZZcwdsuza8QCWQDvzude6pzT+Zqj8WMK6
# MjclWviNOSHN+TiAGOr6ZpE60VEj0EdG9JFFARJn9YdvPNB1bOuB2Yj4dSXsXeYT
# PO1ocI+dGYm5h1FeeuYZ3khf5Kji8pMFq2lqbe16uwPWN/B1+HrDwbpRUnOSzVTE
# WSMe7J+GXQDaS5ySUbnXAVdoPj4BacBKW6vFkAP3ITdx2z938vxirDD7Ht14E9J5
# 1IY1NSd6MBjjIuE3iq2wZJmtkndFMA0GCSqGSIb3DQEBAQUABIICAJY2glD8gJzF
# LZz+xJwCwOYoX0Onue7BYE1hvn6in0k7EFOEspEn1X9f/28usGjgqZauYVh8Rs3S
# yEPMABrdg4Qdhy5J98M1fsbYJI7Ipdly3H1ASCnwDAW+IAhKIQq3Qcz+BQ9RTRnq
# Du1xyaGbxvgOtzmgaY+IbXUFsnbDqf0Rj9cu0ZYut816XctdS5NkMGJ+Azng4Y51
# CxRwETRntb1DcDJnc5JwMYVqqkGJYERemKaIYhrGKDnCQn1mpSQk2g/D0yRSGrh1
# AZ09tSRqpDUvJT2MHmXRFPgbidWWR+d6Bu0qseewnqnujkseMDdcUf9YGsQ8/p8h
# MBZJ1b5MmilM+n0fKJrLT25fUjvK5xS12XZRP3bMAoF/+5e0r+3U6W2FGFxFzbPl
# /TxQ6nwRtIrwC/hG2hSy4E5x2wevpDxAdB/rqHh8LYkRYZnT2zGYjXsFwmiiRUfD
# aeSRMObetNIIxM1hK151cJAStZ+ngbqHmSJ15S6tIjhRlcy8UX42FfT4D24zTfQt
# 0UnjHpCxMHqs8WkQvFMMN5aUBIIRAM336PgcH4RG3kYH4B/D0lYmB974oZL8zXSM
# dRQJqRZ93v0RYnGcOCB9aryGIwhEvOd5Mx1wXWz1Ud367Md31NnpNQc+GLIaer9f
# kqs86eEVszQkVaTwUmeZ28/hOxJ3x8Hl
# SIG # End signature block