Private/Render/Render-Markdown.ps1
|
Set-StrictMode -Version Latest function ConvertTo-AzNetMarkdown { [CmdletBinding()] param( [Parameter(Mandatory)][object]$Graph, [object[]]$Errors, [hashtable]$RunMetadata ) $sb = [System.Text.StringBuilder]::new() [void]$sb.AppendLine('# Azure Network Topology') [void]$sb.AppendLine('') [void]$sb.AppendLine("Generated: $($Graph.GeneratedAt)") if ($RunMetadata -and $RunMetadata.ContainsKey('RunId')) { [void]$sb.AppendLine("Run ID: ``$($RunMetadata['RunId'])``") } [void]$sb.AppendLine('') $stats = @(Get-AzNetSubscriptionStat -Graph $Graph) [void]$sb.AppendLine('## Executive summary') [void]$sb.AppendLine('') [void]$sb.AppendLine("| Metric | Value |") [void]$sb.AppendLine("| :--- | ---: |") [void]$sb.AppendLine("| Subscriptions scanned | $($stats.Count) |") [void]$sb.AppendLine("| Virtual Networks | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'VNet' -and -not ($_.Properties.Contains('Stub') -and $_.Properties['Stub']) }).Count) |") [void]$sb.AppendLine("| Subnets | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'Subnet' }).Count) |") [void]$sb.AppendLine("| NICs | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'NIC' }).Count) |") [void]$sb.AppendLine("| VMs | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'VM' }).Count) |") [void]$sb.AppendLine("| NSGs | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'NSG' }).Count) |") [void]$sb.AppendLine("| Route tables | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'RouteTable' }).Count) |") [void]$sb.AppendLine("| Private endpoints | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'PrivateEndpoint' }).Count) |") [void]$sb.AppendLine("| Gateways | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'Gateway' }).Count) |") [void]$sb.AppendLine("| Firewalls | $(@($Graph.Nodes.Values | Where-Object { $_.Type -eq 'Firewall' }).Count) |") [void]$sb.AppendLine("| Peerings | $(@($Graph.Edges | Where-Object { $_.Kind -eq 'peering' }).Count) |") [void]$sb.AppendLine("| Discovery issues | $(if ($Errors) { @($Errors).Count } else { 0 }) |") [void]$sb.AppendLine('') [void]$sb.AppendLine('## Subscriptions') [void]$sb.AppendLine('') [void]$sb.AppendLine("| Name | VNets | Peerings | NICs | NSGs | PEs | Gateways | Status |") [void]$sb.AppendLine("| --- | ---: | ---: | ---: | ---: | ---: | ---: | --- |") foreach ($s in $stats) { [void]$sb.AppendLine("| $(MdEscape $s.Name) | $($s.VNets) | $($s.Peerings) | $($s.NICs) | $($s.NSGs) | $($s.PrivateEndpoints) | $($s.Gateways) | $($s.Status) |") } [void]$sb.AppendLine('') [void]$sb.AppendLine('## Virtual Networks and Peerings') [void]$sb.AppendLine('') [void]$sb.AppendLine("| VNet | Subscription | Region | Address Space | DNS | Stub |") [void]$sb.AppendLine("| --- | --- | --- | --- | --- | :---: |") foreach ($vnet in ($Graph.Nodes.Values | Where-Object { $_.Type -eq 'VNet' } | Sort-Object Name)) { $cidrs = if ($vnet.Properties.Contains('AddressSpace')) { (@($vnet.Properties['AddressSpace']) -join ', ') } else { '' } $dns = if ($vnet.Properties.Contains('DnsServers')) { (@($vnet.Properties['DnsServers']) -join ', ') } else { '' } $stub = if ($vnet.Properties.Contains('Stub') -and $vnet.Properties['Stub']) { 'yes' } else { 'no' } [void]$sb.AppendLine("| $(MdEscape $vnet.Name) | $(MdEscape $vnet.SubscriptionId) | $(MdEscape $vnet.Location) | $(MdEscape $cidrs) | $(MdEscape $dns) | $stub |") } [void]$sb.AppendLine('') $peerings = @($Graph.Edges | Where-Object { $_.Kind -eq 'peering' }) if ($peerings.Count -gt 0) { [void]$sb.AppendLine('### Peerings') [void]$sb.AppendLine('') [void]$sb.AppendLine("| From | To | State | AllowForwardedTraffic | AllowGatewayTransit | UseRemoteGateways |") [void]$sb.AppendLine("| --- | --- | --- | :---: | :---: | :---: |") foreach ($p in ($peerings | Sort-Object From, To)) { $fn = if ($Graph.Nodes.Contains($p.From)) { $Graph.Nodes[$p.From].Name } else { Get-AzNetNameFromId $p.From } $tn = if ($Graph.Nodes.Contains($p.To)) { $Graph.Nodes[$p.To].Name } else { Get-AzNetNameFromId $p.To } $state = if ($p.Properties.Contains('State')) { $p.Properties['State'] } else { '' } $aft = if ($p.Properties.Contains('AllowForwardedTraffic')) { $p.Properties['AllowForwardedTraffic'] } else { '' } $agt = if ($p.Properties.Contains('AllowGatewayTransit')) { $p.Properties['AllowGatewayTransit'] } else { '' } $urg = if ($p.Properties.Contains('UseRemoteGateways')) { $p.Properties['UseRemoteGateways'] } else { '' } [void]$sb.AppendLine("| $(MdEscape $fn) | $(MdEscape $tn) | $(MdEscape $state) | $aft | $agt | $urg |") } [void]$sb.AppendLine('') } [void]$sb.AppendLine('## Subnets') [void]$sb.AppendLine('') [void]$sb.AppendLine("| Subnet | VNet | Prefix | Delegations | Service Endpoints |") [void]$sb.AppendLine("| --- | --- | --- | --- | --- |") foreach ($subnet in ($Graph.Nodes.Values | Where-Object { $_.Type -eq 'Subnet' } | Sort-Object Name)) { $vnet = Get-AzNetVNetForSubnet -Graph $Graph -SubnetId $subnet.Id $vnetName = if ($vnet) { $vnet.Name } else { '' } $prefix = if ($subnet.Properties.Contains('AddressPrefix')) { (@($subnet.Properties['AddressPrefix']) -join ', ') } else { '' } $delegations = '' if ($subnet.Properties.Contains('Delegations') -and $subnet.Properties['Delegations']) { $delegations = (@($subnet.Properties['Delegations'] | ForEach-Object { $_.ServiceName }) -join ', ') } $seps = '' if ($subnet.Properties.Contains('ServiceEndpoints') -and $subnet.Properties['ServiceEndpoints']) { $seps = (@($subnet.Properties['ServiceEndpoints'] | ForEach-Object { $_.Service }) -join ', ') } [void]$sb.AppendLine("| $(MdEscape $subnet.Name) | $(MdEscape $vnetName) | $(MdEscape $prefix) | $(MdEscape $delegations) | $(MdEscape $seps) |") } [void]$sb.AppendLine('') $nsgs = @($Graph.Nodes.Values | Where-Object { $_.Type -eq 'NSG' -and $_.Properties.Contains('Rules') }) if ($nsgs.Count -gt 0) { [void]$sb.AppendLine('## NSG Rules') [void]$sb.AppendLine('') foreach ($nsg in ($nsgs | Sort-Object Name)) { [void]$sb.AppendLine("### $(MdEscape $nsg.Name)") [void]$sb.AppendLine('') [void]$sb.AppendLine("Location: $(MdEscape $nsg.Location) | Subscription: $(MdEscape $nsg.SubscriptionId) | Resource Group: $(MdEscape $nsg.ResourceGroup)") [void]$sb.AppendLine('') [void]$sb.AppendLine("| Priority | Name | Direction | Access | Protocol | Source | SrcPorts | Destination | DstPorts |") [void]$sb.AppendLine("| ---: | --- | --- | --- | --- | --- | --- | --- | --- |") $rules = @($nsg.Properties['Rules']) | Sort-Object Priority foreach ($r in $rules) { $src = ((@($r.SourceAddressPrefix) + @($r.SourceAddressPrefixes) + @($r.SourceAsgIds)) -ne '') -join ', ' $dst = ((@($r.DestinationAddressPrefix) + @($r.DestinationAddressPrefixes) + @($r.DestinationAsgIds)) -ne '') -join ', ' $sp = ((@($r.SourcePortRange) + @($r.SourcePortRanges)) -ne '') -join ', ' $dp = ((@($r.DestinationPortRange) + @($r.DestinationPortRanges)) -ne '') -join ', ' [void]$sb.AppendLine("| $($r.Priority) | $(MdEscape $r.Name) | $($r.Direction) | $($r.Access) | $($r.Protocol) | $(MdEscape $src) | $(MdEscape $sp) | $(MdEscape $dst) | $(MdEscape $dp) |") } [void]$sb.AppendLine('') if ($nsg.Properties.Contains('DefaultRules') -and @($nsg.Properties['DefaultRules']).Count -gt 0) { [void]$sb.AppendLine("<details><summary>Default rules ($(@($nsg.Properties['DefaultRules']).Count))</summary>") [void]$sb.AppendLine('') [void]$sb.AppendLine("| Priority | Name | Direction | Access | Protocol |") [void]$sb.AppendLine("| ---: | --- | --- | --- | --- |") foreach ($r in (@($nsg.Properties['DefaultRules']) | Sort-Object Priority)) { [void]$sb.AppendLine("| $($r.Priority) | $(MdEscape $r.Name) | $($r.Direction) | $($r.Access) | $($r.Protocol) |") } [void]$sb.AppendLine('') [void]$sb.AppendLine('</details>') [void]$sb.AppendLine('') } } } $rts = @($Graph.Nodes.Values | Where-Object { $_.Type -eq 'RouteTable' -and $_.Properties.Contains('Routes') }) if ($rts.Count -gt 0) { [void]$sb.AppendLine('## Route Tables') [void]$sb.AppendLine('') foreach ($rt in ($rts | Sort-Object Name)) { [void]$sb.AppendLine("### $(MdEscape $rt.Name)") [void]$sb.AppendLine('') $bgpDisabled = if ($rt.Properties.Contains('DisableBgpRoutePropagation') -and $rt.Properties['DisableBgpRoutePropagation']) { 'yes' } else { 'no' } [void]$sb.AppendLine("Disable BGP Propagation: $bgpDisabled") [void]$sb.AppendLine('') [void]$sb.AppendLine("| Name | Prefix | Next Hop Type | Next Hop IP |") [void]$sb.AppendLine("| --- | --- | --- | --- |") foreach ($r in @($rt.Properties['Routes'])) { [void]$sb.AppendLine("| $(MdEscape $r.Name) | $(MdEscape $r.AddressPrefix) | $(MdEscape $r.NextHopType) | $(MdEscape $r.NextHopIpAddress) |") } [void]$sb.AppendLine('') } } $gws = @($Graph.Nodes.Values | Where-Object { $_.Type -eq 'Gateway' }) if ($gws.Count -gt 0) { [void]$sb.AppendLine('## Gateways and On-Prem Connectivity') [void]$sb.AppendLine('') [void]$sb.AppendLine("| Gateway | Type | SKU | BGP | ASN | Peering Address |") [void]$sb.AppendLine("| --- | --- | --- | :---: | --- | --- |") foreach ($g in $gws) { $bgpEnabled = if ($g.Properties.Contains('EnableBgp') -and $g.Properties['EnableBgp']) { 'yes' } else { 'no' } $asn = if ($g.Properties.Contains('BgpSettings') -and $g.Properties['BgpSettings']) { $g.Properties['BgpSettings'].Asn } else { '' } $bgpAddr = if ($g.Properties.Contains('BgpSettings') -and $g.Properties['BgpSettings']) { $g.Properties['BgpSettings'].BgpPeeringAddress } else { '' } [void]$sb.AppendLine("| $(MdEscape $g.Name) | $($g.Properties['GatewayType']) / $($g.Properties['VpnType']) | $($g.Properties['Sku']) | $bgpEnabled | $asn | $(MdEscape $bgpAddr) |") } [void]$sb.AppendLine('') } $fws = @($Graph.Nodes.Values | Where-Object { $_.Type -eq 'Firewall' }) if ($fws.Count -gt 0) { [void]$sb.AppendLine('## Firewalls') [void]$sb.AppendLine('') [void]$sb.AppendLine("| Name | SKU | Threat Intel | Policy |") [void]$sb.AppendLine("| --- | --- | --- | --- |") foreach ($f in $fws) { $pol = if ($f.Properties.Contains('PolicyId') -and $f.Properties['PolicyId']) { Get-AzNetNameFromId $f.Properties['PolicyId'] } else { '' } [void]$sb.AppendLine("| $(MdEscape $f.Name) | $($f.Properties['Sku']) | $($f.Properties['ThreatIntelMode']) | $(MdEscape $pol) |") } [void]$sb.AppendLine('') } $pes = @($Graph.Nodes.Values | Where-Object { $_.Type -eq 'PrivateEndpoint' }) if ($pes.Count -gt 0) { [void]$sb.AppendLine('## Private Endpoints and DNS') [void]$sb.AppendLine('') [void]$sb.AppendLine("| Endpoint | Target | Group IDs | FQDNs |") [void]$sb.AppendLine("| --- | --- | --- | --- |") foreach ($pe in $pes) { $target = '' $groups = '' if ($pe.Properties.Contains('Connections') -and $pe.Properties['Connections']) { $conns = @($pe.Properties['Connections']) if ($conns.Count -gt 0) { $target = (@($conns | ForEach-Object { Get-AzNetNameFromId $_.TargetResourceId }) -join ', ') $groups = (@($conns | ForEach-Object { @($_.GroupIds) -join '/' }) -join '; ') } } $fqdns = if ($pe.Properties.Contains('Fqdns')) { (@($pe.Properties['Fqdns']) -join ', ') } else { '' } [void]$sb.AppendLine("| $(MdEscape $pe.Name) | $(MdEscape $target) | $(MdEscape $groups) | $(MdEscape $fqdns) |") } [void]$sb.AppendLine('') } [void]$sb.AppendLine('## Discovery Report') [void]$sb.AppendLine('') if ($Errors -and @($Errors).Count -gt 0) { [void]$sb.AppendLine("| Subscription | Step | Resource | Class | Message |") [void]$sb.AppendLine("| --- | --- | --- | --- | --- |") foreach ($e in $Errors) { [void]$sb.AppendLine("| $(MdEscape $e.SubscriptionId) | $(MdEscape $e.Step) | $(MdEscape $e.ResourceId) | $(MdEscape $e.Class) | $(MdEscape $e.Message) |") } } else { [void]$sb.AppendLine('No discovery issues recorded.') } [void]$sb.AppendLine('') return $sb.ToString() } function MdEscape { param([AllowNull()]$Value) if ($null -eq $Value) { return '' } $s = [string]$Value $s = $s -replace '\|', '\|' $s = $s -replace '\r?\n', ' ' return $s } # SIG # Begin signature block # MII2tAYJKoZIhvcNAQcCoII2pTCCNqECAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCCbfu6Qz5im0ss4 # aUbA0oX/wOsZHWvDWwp2HSuajVkPwKCCG0YwggXMMIIDtKADAgECAhBUmNLR1FsZ # 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 # 03u4aUoqlmZpxJTG9F9urJh4iIAGXKKy7aIwggakMIIEjKADAgECAhMzAABzA2ge # zvWGpRrVAAAAAHMDMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDQwHhcNMjYwNDIzMjIxNzAyWhcNMjYwNDI2 # MjIxNzAyWjBlMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExFzAVBgNV # BAcTDlZpcmdpbmlhIEJlYWNoMRQwEgYDVQQKEwtTZXRoIE1JbGxlcjEUMBIGA1UE # AxMLU2V0aCBNSWxsZXIwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQDi # ofa8qOqz+DSBEh09HxJlxCDciC4+34MKu7Kms9T9bA8/QHSqECW3yIQyNru8sw1l # Ma2Ll+06JZKMlJQqkyfvQ0mVTI01VDwId+jMK234aU9sFv1eBWECr7YGZiWitJFX # 5G+jOe/gb1weLbEr+zMZDc8JniBf3ZFZqlcJ1ZM6FpmeSd72wLC30jiOO8BAC/Ud # sDgG0F0pxsYoOFO6TndsNZEAJrq++3fZNKs/6qVKWKTH0gztUhrouICkUAwSoMIN # 8tXb386pXAgFNbOBeiRRlOho0UKgZhLkJS1vmaa0h+Dtt33pMHMPblwU/1bxG5Fw # 9t6kl99UE4ttVX6/bHudaRgtutWmI4LjmUqvpdy9gd3+3gk3oBjmCYWZJ7DupwN5 # hwg/yFa1gYvpb/midFn5eIP/b6Xfq/2dQYvXLbFFvzGdzUX4BxrbgzYrZKscFcCf # Z77e8v5GaYzogpUk28cofAoTQeccIN22Vgsmm9z9Y025rL5GTYEsPDca0dBhEcUC # AwEAAaOCAdYwggHSMAwGA1UdEwEB/wQCMAAwDgYDVR0PAQH/BAQDAgeAMD0GA1Ud # JQQ2MDQGCisGAQQBgjdhAQAGCCsGAQUFBwMDBhwrBgEEAYI3YYHR5Y4pgv7dj0iB # laOJIoHu469rMB0GA1UdDgQWBBShPhVS/1wDO3h/kmNfjd2bHdNXwjAfBgNVHSME # GDAWgBRrJUHe+2t8/RiACi1/j3ZdqnM9uDBnBgNVHR8EYDBeMFygWqBYhlZodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNyb3NvZnQlMjBJRCUy # MFZlcmlmaWVkJTIwQ1MlMjBBT0MlMjBDQSUyMDA0LmNybDB0BggrBgEFBQcBAQRo # MGYwZAYIKwYBBQUHMAKGWGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # Y2VydHMvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIwQU9DJTIwQ0El # MjAwNC5jcnQwVAYDVR0gBE0wSzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6 # Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAN # BgkqhkiG9w0BAQwFAAOCAgEAWiIv8T27YuG5HzK5ag915ZU/PCqxXAJdW5E4Hn1l # nsNSyoDv5a1cxKptpJlcGiF9Ff7xA6PcmMpzZI4kou7COcsxp7Eb2ZhXBKcdHgqE # CCVdhIMzG8MOOxTPDtcdHlfpIb34s5ecmsHlyEv9/kdV71TOc1fY/FPsw6CpdsYK # +RiC+d5hPEhZvLD8LFn/ttkOltiGcboSmznksFOz+Uy37lNUt2xRuBTXLbYvg220 # tYtCzVCAy8Xv2Y3TWbpqfwXmPFBD/h6YPDzROou9zNM4Rf8Oy5m3C84q9jzkbtGE # Hvp6Nd7/ipAW3LC+5TzSSXBu88f78eK6Bo37KAFitG/gh2iOKEi/uvlDnNc2FJag # VDJMM3ZXAAWghMfnrDWj5pVLSXJoa4L9cnxAlg4t4G3vTkR+xq+QbOX1nxzbmP/i # bFV2fxbhpdJ3OzjjJ6/Ns51MMEBdvnRCI+qIQaUDTa4J2j+qNMwrn7cxaX/4By77 # y62Gzd1Qz50lqSxqCADtUwgEYF78H9dPMtipBzJ0C5tai8e8V9GKLdSzIt90Gx6v # Gou0SpfbFLF+IdCO8SODPPg4o95xeaZtl95yXpDkBt9RNfwVPdfW3EY/vuQgCmWj # qqTbPrrZ9gzNE1MevKd/n/L5gSFgHwYA6OfKbCqM0wBXsbNa1w6ErPhXYY/Cei1O # jJwwggcoMIIFEKADAgECAhMzAAAAFjGSjZICZXuaAAAAAAAWMA0GCSqGSIb3DQEB # DAUAMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRp # b24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25pbmcg # UENBIDIwMjEwHhcNMjYwMzI2MTgxMTI5WhcNMzEwMzI2MTgxMTI5WjBaMQswCQYD # VQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYDVQQD # EyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDA0MIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAylX6yNvoCTDP9G0OTlSjXbzgEsy21FDL17n/ # lZe2BrqHz2mR1aN4DBxeYp0/hjEqSHHyGfarV1NVBuvK8vLzW0LTi+DZt9In16ai # NfgcogFiztWE9Fp8xu1zzrqE3nlrDWb+RZo8QrEXgWb8s8swsl2W7tREHycVkx+H # m1MLQIlva6jH/Xg4/8GIYhHzbXiVd2RXomw9s7Qh6/SYRXXfe125wh4EKEyKnNNl # +cZUSrVBgWvvjrRwQY4if7sAZ805KruBY6WY0Hiba5nWvrq9Qk9o35ViAf8qZ+7u # 1fbb1vcCWyWLfx9hLSdBjjVsSWe0xLvI1j4p3Tjt5czz+1Lc0v5lQ1feB7nFmpbZ # rK2us0hvAaBCfOyDPEEm+735vzuNRYWJFL/PViI+REtjuJMcojEn3veQjIrwrmK0 # T9oSr8e3oDzK1oAwwZMTC4KymTvYUTVDJvL5N8OW/UqIBzsiVYcchZvGhV3yMYKg # xeEtIOG4W4Z85Y5kpQi5bpjGXFxRg46RdrTaALt1RhRmLR7U0jVSr2aYAd2+Mp2q # A5Gz3/loOOdt47eFZ3mrAYGYQtbK2SNjQpwgQX4Iy6tOKahCgFhKIcltitvSkpJB # 77eVWhNWnN2LfqMojszEue7V8EAySxry4PzlxTtFTb3Mw53XyH12BMQf2m9j7jEs # HeVSATsCAwEAAaOCAdwwggHYMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3FQEE # AwIBADAdBgNVHQ4EFgQUayVB3vtrfP0YgAotf492XapzPbgwVAYDVR0gBE0wSzBJ # BgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w # a2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBi # AEMAQTASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFNlBKbAPD2Ns72nX # 9c0pnqRIajDmMHAGA1UdHwRpMGcwZaBjoGGGX2h0dHA6Ly93d3cubWljcm9zb2Z0 # LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBDb2Rl # JTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3JsMH0GCCsGAQUFBwEBBHEwbzBtBggr # BgEFBQcwAoZhaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9N # aWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmclMjBQQ0El # MjAyMDIxLmNydDANBgkqhkiG9w0BAQwFAAOCAgEABtVQXlR01UQZY5XGQ9yIjMcD # 8jI0MizWhJ1buZjg5toUQSXx/BrASwE5qxwHPBeO45pOQp6VD4iILgm8OmfylY+A # 7KIqttvDUizC3sBXxjK4u7sDRiyEguXHKfL1HQAwxCLEtnRPkCPTsJA6b917lA+3 # foQIHC1XDDpdQLHxGbbGXp4Rr0mFK5vxbi6tAahBi/RlzOXPh6PavKPlZ/0vhlkD # dsvoJETtebNJCNOZ1Kav3Tg+K4va4FbOrYqRHdGGahoA/gmTYmmVqw0zkGzT53Hd # hfajrFGttJomK7qE+T8CQGiPkEIkxNmSXjCTpDqc4U1IKlTGcGYnRFGSgqrnWnkA # NPFsJ5EDHysh82lPI+PFC3FOIVMLzLL+30rqznvRgHUUAj7xfFnEiuaAx3vFVSTO # Lb+iigpvdR6i8fSWpgYESOkdkn2N57tuhBs57tKwoP++vc/MVpuD1XAtmWi+lZSl # ahadTbDfGKjMn+bfm2xlW9PZ6BSnCRv1MMhpcUZkAZX3gVEMef8rZc2c7BJ4ayRf # X0wH43vI9znV+ZRJ3j0xUC0Zb82RQalF5yHkCr93x0IwvZtn6P2dNQyCP6qd3fC4 # RlVFtAQhtOH0cByTR/Iqqghv6qHzL/pMptgMQQ5x8zYEYy+tCThYgYIrq7y4WEDY # QfeSlqIxQOrIUJ4IJDEwggeeMIIFhqADAgECAhMzAAAAB4ejNKN7pY4cAAAAAAAH # MA0GCSqGSIb3DQEBDAUAMHcxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xSDBGBgNVBAMTP01pY3Jvc29mdCBJZGVudGl0eSBWZXJp # ZmljYXRpb24gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAyMDAeFw0yMTA0 # MDEyMDA1MjBaFw0zNjA0MDEyMDE1MjBaMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQK # ExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBW # ZXJpZmllZCBDb2RlIFNpZ25pbmcgUENBIDIwMjEwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCy8MCvGYgo4t1UekxJbGkIVQm0Uv96SvjB6yUo92cXdylN # 65Xy96q2YpWCiTas7QPTkGnK9QMKDXB2ygS27EAIQZyAd+M8X+dmw6SDtzSZXyGk # xP8a8Hi6EO9Zcwh5A+wOALNQbNO+iLvpgOnEM7GGB/wm5dYnMEOguua1OFfTUITV # MIK8faxkP/4fPdEPCXYyy8NJ1fmskNhW5HduNqPZB/NkWbB9xxMqowAeWvPgHtpz # yD3PLGVOmRO4ka0WcsEZqyg6efk3JiV/TEX39uNVGjgbODZhzspHvKFNU2K5MYfm # Hh4H1qObU4JKEjKGsqqA6RziybPqhvE74fEp4n1tiY9/ootdU0vPxRp4BGjQFq28 # nzawuvaCqUUF2PWxh+o5/TRCb/cHhcYU8Mr8fTiS15kRmwFFzdVPZ3+JV3s5MulI # f3II5FXeghlAH9CvicPhhP+VaSFW3Da/azROdEm5sv+EUwhBrzqtxoYyE2wmuHKw # s00x4GGIx7NTWznOm6x/niqVi7a/mxnnMvQq8EMse0vwX2CfqM7Le/smbRtsEeOt # bnJBbtLfoAsC3TdAOnBbUkbUfG78VRclsE7YDDBUbgWt75lDk53yi7C3n0WkHFU4 # EZ83i83abd9nHWCqfnYa9qIHPqjOiuAgSOf4+FRcguEBXlD9mAInS7b6V0UaNwID # AQABo4ICNTCCAjEwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0G # A1UdDgQWBBTZQSmwDw9jbO9p1/XNKZ6kSGow5jBUBgNVHSAETTBLMEkGBFUdIAAw # QTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9E # b2NzL1JlcG9zaXRvcnkuaHRtMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMA8G # A1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUyH7SaoUqG8oZmAQHJ89QEE9oqKIw # gYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lv # cHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9v # dCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5jcmwwgcMGCCsGAQUF # BwEBBIG2MIGzMIGBBggrBgEFBQcwAoZ1aHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJZGVudGl0eSUyMFZlcmlmaWNhdGlv # biUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1dGhvcml0eSUyMDIwMjAuY3J0MC0G # CCsGAQUFBzABhiFodHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwDQYJ # KoZIhvcNAQEMBQADggIBAH8lKp7+1Kvq3WYK21cjTLpebJDjW4ZbOX3HD5ZiG84v # jsFXT0OB+eb+1TiJ55ns0BHluC6itMI2vnwc5wDW1ywdCq3TAmx0KWy7xulAP179 # qX6VSBNQkRXzReFyjvF2BGt6FvKFR/imR4CEESMAG8hSkPYso+GjlngM8JPn/ROU # rTaeU/BRu/1RFESFVgK2wMz7fU4VTd8NXwGZBe/mFPZG6tWwkdmA/jLbp0kNUX7e # lxu2+HtHo0QO5gdiKF+YTYd1BGrmNG8sTURvn09jAhIUJfYNotn7OlThtfQjXqe0 # qrimgY4Vpoq2MgDW9ESUi1o4pzC1zTgIGtdJ/IvY6nqa80jFOTg5qzAiRNdsUvzV # koYP7bi4wLCj+ks2GftUct+fGUxXMdBUv5sdr0qFPLPB0b8vq516slCfRwaktAxK # 1S40MCvFbbAXXpAZnU20FaAoDwqq/jwzwd8Wo2J83r7O3onQbDO9TyDStgaBNlHz # MMQgl95nHBYMelLEHkUnVVVTUsgC0Huj09duNfMaJ9ogxhPNThgq3i8w3DAGZ61A # MeF0C1M+mU5eucj1Ijod5O2MMPeJQ3/vKBtqGZg4eTtUHt/BPjN74SsJsyHqAdXV # S5c+ItyKWg3Eforhox9k3WgtWTpgV4gkSiS4+A09roSdOI4vrRw+p+fL4WrxSK5n # MYIaxDCCGsACAQEwcTBaMQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMSswKQYDVQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1Mg # QU9DIENBIDA0AhMzAABzA2gezvWGpRrVAAAAAHMDMA0GCWCGSAFlAwQCAQUAoIGQ # MBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcCAQsxDjAMBgor # BgEEAYI3AgEVMCQGCisGAQQBgjcCAQwxFjAUoA6ADABTAEgAQQAyADUANqECgAAw # LwYJKoZIhvcNAQkEMSIEIKAElONpgjtVpRbqbHmoUT+n4wv8OClAz93ZD0EQ3ffY # MA0GCSqGSIb3DQEBAQUABIIBgMGk5AQOeJW1keLcUafIOdcI8KEzYDkjx7fLGxQy # ZgeEn5OQVyJ7IkYlX4eTXuykBtwyBDShQGbS9SPrqOkDljus8BR7KJuaShnY4fiN # 3BXsDOzLKPyHFq4vylC4OEKKsm2F7a83Nxi+HLvN7L1Ua+f4sP3yR0VFeAPI2ZZ2 # 9aBxM7Tj0bvEar/wS9Ez/ERGD2HV1J/lcLGznnnTVm6+XLt4gxEl4W6nJbnQHCTC # xpmg8tHy8bCvd+U2/5/x6wxD2/lGcETHtimtxmQYIC9sf6XmqShQCBP2wNxeCREL # QWwKXOgo7g7kaRO47xT3rPqzSls0jc72zbTdRn+a6SXaIWI1NFNRYu0foQZY7+dB # 5HApkC6z+TwFCdy2K7etMuZiwXnWEx5IvFWN9JIXE1bVmHGTYXyMKv1aavUvUHC4 # pHVZoMrGuMq8BoymUXHsiVbv5ApD4OksH+jmmNsimH8hFCDVwPRi9NPyWgU3SNLc # +9bskbtpjFgltwDycdThs0Vw4KGCGBEwghgNBgorBgEEAYI3AwMBMYIX/TCCF/kG # CSqGSIb3DQEHAqCCF+owghfmAgEDMQ8wDQYJYIZIAWUDBAIBBQAwggFiBgsqhkiG # 9w0BCRABBKCCAVEEggFNMIIBSQIBAQYKKwYBBAGEWQoDATAxMA0GCWCGSAFlAwQC # AQUABCATVsG1Y1jBwL56SO+Te5e316x2fGoBpScRo38F4uxr6QIGaedYTrGVGBMy # MDI2MDQyNDIyMTg1NC40NDNaMASAAgH0oIHhpIHeMIHbMQswCQYDVQQGEwJVUzET # MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxNaWNyb3NvZnQgQW1lcmlj # YSBPcGVyYXRpb25zMScwJQYDVQQLEx5uU2hpZWxkIFRTUyBFU046NzgwMC0wNUUw # LUQ5NDcxNTAzBgNVBAMTLE1pY3Jvc29mdCBQdWJsaWMgUlNBIFRpbWUgU3RhbXBp # bmcgQXV0aG9yaXR5oIIPITCCB4IwggVqoAMCAQICEzMAAAAF5c8P/2YuyYcAAAAA # AAUwDQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5IFZl # cmlmaWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4XDTIw # MTExOTIwMzIzMVoXDTM1MTExOTIwNDIzMVowYTELMAkGA1UEBhMCVVMxHjAcBgNV # BAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1 # YmxpYyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQCefOdSY/3gxZ8FfWO1BiKjHB7X55cz0RMFvWVGR3eRwV1w # b3+yq0OXDEqhUhxqoNv6iYWKjkMcLhEFxvJAeNcLAyT+XdM5i2CgGPGcb95WJLiw # 7HzLiBKrxmDj1EQB/mG5eEiRBEp7dDGzxKCnTYocDOcRr9KxqHydajmEkzXHOeRG # wU+7qt8Md5l4bVZrXAhK+WSk5CihNQsWbzT1nRliVDwunuLkX1hyIWXIArCfrKM3 # +RHh+Sq5RZ8aYyik2r8HxT+l2hmRllBvE2Wok6IEaAJanHr24qoqFM9WLeBUSudz # +qL51HwDYyIDPSQ3SeHtKog0ZubDk4hELQSxnfVYXdTGncaBnB60QrEuazvcob9n # 4yR65pUNBCF5qeA4QwYnilBkfnmeAjRN3LVuLr0g0FXkqfYdUmj1fFFhH8k8YBoz # rEaXnsSL3kdTD01X+4LfIWOuFzTzuoslBrBILfHNj8RfOxPgjuwNvE6YzauXi4or # p4Sm6tF245DaFOSYbWFK5ZgG6cUY2/bUq3g3bQAqZt65KcaewEJ3ZyNEobv35Nf6 # xN6FrA6jF9447+NHvCjeWLCQZ3M8lgeCcnnhTFtyQX3XgCoc6IRXvFOcPVrr3D9R # PHCMS6Ckg8wggTrtIVnY8yjbvGOUsAdZbeXUIQAWMs0d3cRDv09SvwVRd61evQID # AQABo4ICGzCCAhcwDgYDVR0PAQH/BAQDAgGGMBAGCSsGAQQBgjcVAQQDAgEAMB0G # A1UdDgQWBBRraSg6NS9IY0DPe9ivSek+2T3bITBUBgNVHSAETTBLMEkGBFUdIAAw # QTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9E # b2NzL1JlcG9zaXRvcnkuaHRtMBMGA1UdJQQMMAoGCCsGAQUFBwMIMBkGCSsGAQQB # gjcUAgQMHgoAUwB1AGIAQwBBMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAU # yH7SaoUqG8oZmAQHJ89QEE9oqKIwgYQGA1UdHwR9MHsweaB3oHWGc2h0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElkZW50aXR5 # JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5 # JTIwMjAyMC5jcmwwgZQGCCsGAQUFBwEBBIGHMIGEMIGBBggrBgEFBQcwAoZ1aHR0 # cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNyb3NvZnQlMjBJ # ZGVudGl0eSUyMFZlcmlmaWNhdGlvbiUyMFJvb3QlMjBDZXJ0aWZpY2F0ZSUyMEF1 # dGhvcml0eSUyMDIwMjAuY3J0MA0GCSqGSIb3DQEBDAUAA4ICAQBfiHbHfm21WhV1 # 50x4aPpO4dhEmSUVpbixNDmv6TvuIHv1xIs174bNGO/ilWMm+Jx5boAXrJxagRhH # QtiFprSjMktTliL4sKZyt2i+SXncM23gRezzsoOiBhv14YSd1Klnlkzvgs29XNjT # +c8hIfPRe9rvVCMPiH7zPZcw5nNjthDQ+zD563I1nUJ6y59TbXWsuyUsqw7wXZoG # zZwijWT5oc6GvD3HDokJY401uhnj3ubBhbkR83RbfMvmzdp3he2bvIUztSOuFzRq # rLfEvsPkVHYnvH1wtYyrt5vShiKheGpXa2AWpsod4OJyT4/y0dggWi8g/tgbhmQl # ZqDUf3UqUQsZaLdIu/XSjgoZqDjamzCPJtOLi2hBwL+KsCh0Nbwc21f5xvPSwym0 # Ukr4o5sCcMUcSy6TEP7uMV8RX0eH/4JLEpGyae6Ki8JYg5v4fsNGif1OXHJ2IWG+ # 7zyjTDfkmQ1snFOTgyEX8qBpefQbF0fx6URrYiarjmBprwP6ZObwtZXJ23jK3Fg/ # 9uqM3j0P01nzVygTppBabzxPAh/hHhhls6kwo3QLJ6No803jUsZcd4JQxiYHHc+Q # /wAMcPUnYKv/q2O444LO1+n6j01z5mggCSlRwD9faBIySAcA9S8h22hIAcRQqIGE # jolCK9F6nK9ZyX4lhthsGHumaABdWzCCB5cwggV/oAMCAQICEzMAAABXJNOV4KLp # yTEAAAAAAFcwDQYJKoZIhvcNAQEMBQAwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoT # FU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1Ymxp # YyBSU0EgVGltZXN0YW1waW5nIENBIDIwMjAwHhcNMjUxMDIzMjA0NjUzWhcNMjYx # MDIyMjA0NjUzWjCB2zELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24x # EDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlv # bjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UE # CxMeblNoaWVsZCBUU1MgRVNOOjc4MDAtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNy # b3NvZnQgUHVibGljIFJTQSBUaW1lIFN0YW1waW5nIEF1dGhvcml0eTCCAiIwDQYJ # KoZIhvcNAQEBBQADggIPADCCAgoCggIBALFspQqTCH24syS2NZD1ztnJl9h0Vr0W # wJnikmeXse/4wspnVexGqfiHNoqkbVg5CinuYC+iVfNMLZ+QtqhySz8VGBSjRt1J # B5ACNtTKAjfmFp4U/Cv2Lj4m+vuve9I3W3hSiImTFsHeYZ6V/Sd43rXrhHV26fw3 # xQSteSbg9yTs1rhdrLkAj4KmI0D5P4KavtygirVyUW10gkifWLSE1NiB8Jn3RO5d # j32deeMNONaaPnw3k49ICTs3Ffyb+ekNDPsNfYwCqPyOTxM6y1dSD0J5j+KK9V+E # WyV5PDjV8jjn1zsStlS6TcYJJStcgHs2xT9rs6ooWl5FtYfRkCxhDShEp3s8IHUW # izTWmLZvAE/6WR2Cd+ZmVapGXTCHJKUByZPxdX0i8gynirR+EwuHHNxEilDICLat # O2WZu+CQrH4Zq0NYo1TQ4tUpZ/kAWpoAu1r4mW5EJ3HkEavQ2PuoQDcDq2rAGVIl # a9pD7o9Yxwzl81BuDvUEyu9D/6F0qmQDdaE791HxfCUxpgMYPpdWTzs+dDGPehwQ # 8P92yP8ARjby5Ony1Z68RjeQebpxf5WL441myFHcgT1UJzzil7tPEkR22NfTNR6F # l+jzWb/r80nqlXllhynSowtxo1Y22xqYviS24smikUsBKqOPbSS77uvXEO3VrG5L # GouE1EZ1Y9pjAgMBAAGjggHLMIIBxzAdBgNVHQ4EFgQUjoPJXi01DgIJSGfm416Y # g+0SkqcwHwYDVR0jBBgwFoAUa2koOjUvSGNAz3vYr0npPtk92yEwbAYDVR0fBGUw # YzBhoF+gXYZbaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWlj # cm9zb2Z0JTIwUHVibGljJTIwUlNBJTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIw # LmNybDB5BggrBgEFBQcBAQRtMGswaQYIKwYBBQUHMAKGXWh0dHA6Ly93d3cubWlj # cm9zb2Z0LmNvbS9wa2lvcHMvY2VydHMvTWljcm9zb2Z0JTIwUHVibGljJTIwUlNB # JTIwVGltZXN0YW1waW5nJTIwQ0ElMjAyMDIwLmNydDAMBgNVHRMBAf8EAjAAMBYG # A1UdJQEB/wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDBmBgNVHSAEXzBd # MFEGDCsGAQQBgjdMg30BATBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jv # c29mdC5jb20vcGtpb3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wCAYGZ4EMAQQCMA0G # CSqGSIb3DQEBDAUAA4ICAQBydcB2POmZOUlAQz2NuXf7vWCVWmjWu9bsY1+HMjv1 # yeLjxDQkjsJEU5zaIDy8Uw9BYN8+ExX/9k/9CBUsXbVlbU44c65/liyJ83kWsFIU # whVazwSShFlbIZviIO/5weyWyTfPPpbSJgWy+ZE9UrQS3xulJLAHA2zUkMMPdAlF # 4RrngcZZ0r45AF9aIYjdestWwdrNK70MfArHqZdgrgXn03w6zBs1v7czceWGitg/ # DlsHqk1mXBpSTuGI2TSPN3E60IIXx5f/AFzh4/HFi98BBZbUELNsXkWAG9ynZ5e6 # CFiil1mgWCWOT90D7Igvg0zKe3o3WCk629/en94K/sC/zLOf2d7yFmTySb9fKjcO # NH1Db3kZ8MzEJ8fHTNmxrl10Gecuz/Gl0+ByTKN+PambZ+F0MIlBPww6fvjFC9JI # I73fw3qO169+9TxTz2G+E26GYY1dcffsAhw6DqTQgbflbl1O/MrSXSs0NSb9nBD9 # RfR/f8Ei7DA1L1jBO7vZhhJTjw2TzFa/ALgRLi3W00hHWi8LGQaZc8SwXIMYWfwr # N9MgYbhN0Iak9WA2dqWuekXsTwNkmrD3E6E+oCYCehNOgZmds0Ezb1jo7OV0Kh22 # Ll3KHg3MHtlGguxAzhg/BpixPS4qrULLkAjO7+yNsUfrD2U9gMf/OR4yJDPtzM0y # tTGCB0Mwggc/AgEBMHgwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGlt # ZXN0YW1waW5nIENBIDIwMjACEzMAAABXJNOV4KLpyTEAAAAAAFcwDQYJYIZIAWUD # BAIBBQCgggScMBEGCyqGSIb3DQEJEAIPMQIFADAaBgkqhkiG9w0BCQMxDQYLKoZI # hvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTI2MDQyNDIyMTg1NFowLwYJKoZIhvcN # AQkEMSIEIIirjWttXGraVMP6+/3BUgV9T0+TeFGx9KLBJp4+jpw4MIG5BgsqhkiG # 9w0BCRACLzGBqTCBpjCBozCBoAQg9TyfZLUFbkxliGyizuH9VVDpVFNvQEQhKQ2Z # hUx421IwfDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29mdCBD # b3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZXN0 # YW1waW5nIENBIDIwMjACEzMAAABXJNOV4KLpyTEAAAAAAFcwggNeBgsqhkiG9w0B # CRACEjGCA00wggNJoYIDRTCCA0EwggIpAgEBMIIBCaGB4aSB3jCB2zELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0 # IEFtZXJpY2EgT3BlcmF0aW9uczEnMCUGA1UECxMeblNoaWVsZCBUU1MgRVNOOjc4 # MDAtMDVFMC1EOTQ3MTUwMwYDVQQDEyxNaWNyb3NvZnQgUHVibGljIFJTQSBUaW1l # IFN0YW1waW5nIEF1dGhvcml0eaIjCgEBMAcGBSsOAwIaAxUA/S8xOZxCUQFBNkrN # 8Wiij1x5y8OgZzBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jvc29m # dCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGlt # ZXN0YW1waW5nIENBIDIwMjAwDQYJKoZIhvcNAQELBQACBQDtlctKMCIYDzIwMjYw # NDI0MTA1ODE4WhgPMjAyNjA0MjUxMDU4MThaMHQwOgYKKwYBBAGEWQoEATEsMCow # CgIFAO2Vy0oCAQAwBwIBAAICJyQwBwIBAAICEtowCgIFAO2XHMoCAQAwNgYKKwYB # BAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGG # oDANBgkqhkiG9w0BAQsFAAOCAQEAgXnjp7hX3NZnFeFJvf9FP4It962C+jwuMdxa # 1KAvTBtay1dI3WqsatsKXe+n2Dhi5UyU+tSVAPbh9VtH6db/7ZYY1It0FUgNStYz # NYNU+ifSMG/CBDSV1VZnOustI6L8xKoQoXZbr9wk7/6VDxxB1yEEkt7WjkJI7t/9 # AznBqPOmzozCDvrTZYSn7V+AKWjyaqXnOSeoM2wuRkzhTwI1ya/IQatRf8QI/h7K # ZnyrLwIjz9ZruFU9cCsGXz1EjcCHFHFYMJNYQ3e8Z/yaYaT2nqfw67SrhuoWG9sk # 5R89d9blNFsAg7pVUhKyhkvta/BBTGPcuTMignyOB2mMz+Ls7jANBgkqhkiG9w0B # AQEFAASCAgArBbcHNKU2KRzrOIsXis341v8ZbGIglLepm6xvQyd8gqLmF75Iv3dK # F7AxXwrqth9gFlaOJZXis7GrXmSHwCP8dCh3yFg006w6vQI7paVRirUWIcqxYg63 # XUtnwne6QO5q06IIrSgSSTdq32Z23VvfilAUt63fYnzT1YMirf01BBXCxLGd6O6A # 6r+4CdWGNyTmVJyMPjy/6zCc4HXAdPSosZfoe2MPZRmhJN+d2kjsKdNtmRFz4TO+ # SJ3T9CmbX+i5r6YOX3hDGAILv2lRuc8Kc4G4mXEq5MatgWkSwgAGTlMDEd0gEJPq # mUjkSLsKp5q/EuJGx4Qw6QCWBlU8SlymjoppYRipV8fziqlfDTYuXoitPmdeqoJu # lhxnzZ7qGYFO6qCCoIbLeoI9NHOlVPi6tbHrC9zBBDapZzUkwfVW5cW/RnPGmOlf # Dyoa3+zT9ClBsUzJeljZ/KI3+XnBookCnru4LKq8/b/3htGvKyHnapqjvgxZizFC # rQHGxexT7PhDCziCs/Fp+QtW1gYp+IVeokCWYdPcX/6aoqLuh8BA/PJEItm/BMnV # ufJrEGRjng2stwFXvQrk+ixH0ymO2jiOZL8uFKEjxDUBp4HWLhl2W0508+W8/y7U # 56+/U9Y/lD0NWjZ6E0xi5eaU96mNyBIM/s8H8kEi27M8MQNyYh9f1g== # SIG # End signature block |