dbatools.library.psm1
|
function Get-DbatoolsLibraryPath { [CmdletBinding()] param() if ($PSVersionTable.PSEdition -eq "Core") { Join-Path -Path $PSScriptRoot -ChildPath core } else { Join-Path -Path $PSScriptRoot -ChildPath desktop } } $script:libraryroot = Get-DbatoolsLibraryPath if ($PSVersionTable.PSEdition -ne "Core") { $dir = [System.IO.Path]::Combine($script:libraryroot, "lib") $dir = ("$dir\").Replace('\', '\\') if (-not ("Redirector" -as [type])) { $source = @" using System; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; public class Redirector { public Redirector() { this.EventHandler = new ResolveEventHandler(AssemblyResolve); } public readonly ResolveEventHandler EventHandler; protected Assembly AssemblyResolve(object sender, ResolveEventArgs e) { string[] dlls = { "System.Memory", "System.Runtime", "System.Management.Automation", "System.Runtime.CompilerServices.Unsafe", "Microsoft.Bcl.AsyncInterfaces", "System.Text.Json", "System.Resources.Extensions", "Microsoft.SqlServer.ConnectionInfo", "Microsoft.SqlServer.Smo", "Microsoft.Identity.Client", "System.Diagnostics.DiagnosticSource", "Microsoft.IdentityModel.Abstractions", "Microsoft.Data.SqlClient", "Microsoft.SqlServer.Types", "System.Configuration.ConfigurationManager", "Microsoft.SqlServer.Management.Sdk.Sfc", "Microsoft.SqlServer.Management.IntegrationServices", "Microsoft.SqlServer.Replication", "Microsoft.SqlServer.Rmo", "System.Private.CoreLib", "Azure.Core", "Azure.Identity" }; var name = new AssemblyName(e.Name); var assemblyName = name.Name.ToString(); foreach (string dll in dlls) { if (assemblyName == dll) { string filelocation = "$dir" + dll + ".dll"; //Console.WriteLine(filelocation); return Assembly.LoadFrom(filelocation); } } foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { // maybe this needs to change? var info = assembly.GetName(); if (info.FullName == e.Name) { return assembly; } } return null; } } "@ $null = Add-Type -TypeDefinition $source } try { $redirector = New-Object Redirector [System.AppDomain]::CurrentDomain.add_AssemblyResolve($redirector.EventHandler) } catch { # unsure } } # REMOVED win-sqlclient logic - SqlClient is now directly in lib $sqlclient = [System.IO.Path]::Combine($script:libraryroot, "lib", "Microsoft.Data.SqlClient.dll") try { Import-Module $sqlclient } catch { throw "Couldn't import $sqlclient | $PSItem" } if ($PSVersionTable.PSEdition -ne "Core") { [System.AppDomain]::CurrentDomain.remove_AssemblyResolve($onAssemblyResolveEventHandler) } if ($PSVersionTable.PSEdition -eq "Core") { $names = @( 'Microsoft.SqlServer.Server', 'Azure.Core', 'Azure.Identity', 'Microsoft.IdentityModel.Abstractions', 'Microsoft.SqlServer.Dac', 'Microsoft.SqlServer.Smo', 'Microsoft.SqlServer.SmoExtended', 'Microsoft.SqlServer.SqlWmiManagement', 'Microsoft.SqlServer.WmiEnum', 'Microsoft.SqlServer.Management.RegisteredServers', 'Microsoft.SqlServer.Management.Collector', 'Microsoft.SqlServer.Management.XEvent', 'Microsoft.SqlServer.Management.XEventDbScoped', 'Microsoft.SqlServer.XEvent.XELite' ) } else { $names = @( 'Azure.Core', 'Azure.Identity', 'Microsoft.IdentityModel.Abstractions', 'Microsoft.Data.SqlClient', 'Microsoft.SqlServer.Dac', 'Microsoft.SqlServer.Smo', 'Microsoft.SqlServer.SmoExtended', 'Microsoft.SqlServer.SqlWmiManagement', 'Microsoft.SqlServer.WmiEnum', 'Microsoft.SqlServer.Management.RegisteredServers', 'Microsoft.SqlServer.Management.IntegrationServices', 'Microsoft.SqlServer.Management.Collector', 'Microsoft.SqlServer.Management.XEvent', 'Microsoft.SqlServer.Management.XEventDbScoped', 'Microsoft.SqlServer.XEvent.XELite' ) } if ($Env:SMODefaultModuleName) { # then it's DSC, load other required assemblies $names += "Microsoft.AnalysisServices.Core" $names += "Microsoft.AnalysisServices" $names += "Microsoft.AnalysisServices.Tabular" $names += "Microsoft.AnalysisServices.Tabular.Json" } # XEvent stuff kills CI/CD if ($PSVersionTable.OS -match "ARM64") { $names = $names | Where-Object { $PSItem -notmatch "XE" } } #endregion Names # this takes 10ms $assemblies = [System.AppDomain]::CurrentDomain.GetAssemblies() try { $null = Import-Module ([IO.Path]::Combine($script:libraryroot, "third-party", "bogus", "Bogus.dll")) } catch { Write-Error "Could not import $assemblyPath : $($_ | Out-String)" } try { $null = Import-Module ([IO.Path]::Combine($script:libraryroot, "third-party", "LumenWorks", "LumenWorks.Framework.IO.dll")) } catch { Write-Error "Could not import LumenWorks.Framework.IO.dll : $($_ | Out-String)" } foreach ($name in $names) { # REMOVED win-sqlclient handling and mac-specific logic since files are in standard lib folder $x64only = 'Microsoft.SqlServer.Replication', 'Microsoft.SqlServer.XEvent.Linq', 'Microsoft.SqlServer.BatchParser', 'Microsoft.SqlServer.Rmo', 'Microsoft.SqlServer.BatchParserClient' if ($name -in $x64only -and $env:PROCESSOR_ARCHITECTURE -eq "x86") { Write-Verbose -Message "Skipping $name. x86 not supported for this library." continue } $assemblyPath = [IO.Path]::Combine($script:libraryroot, "lib", "$name.dll") $assemblyfullname = $assemblies.FullName | Out-String if (-not ($assemblyfullname.Contains("$name,"))) { $null = try { $null = Import-Module $assemblyPath } catch { Write-Error "Could not import $assemblyPath : $($_ | Out-String)" } } } # SIG # Begin signature block # MIIt3AYJKoZIhvcNAQcCoIItzTCCLckCAQMxDTALBglghkgBZQMEAgEwewYKKwYB # BAGCNwIBBKBtBGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCAVei+6vHHtCw8L # IbX5j/Y0xy+qWbPJOMqekyaOgYEN2qCCFdswggbXMIIEv6ADAgECAhMzAAZLoWSW # FJDEcMW7AAAABkuhMA0GCSqGSIb3DQEBDAUAMFoxCzAJBgNVBAYTAlVTMR4wHAYD # VQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJ # RCBWZXJpZmllZCBDUyBBT0MgQ0EgMDEwHhcNMjUxMTEyMDcyNTQzWhcNMjUxMTE1 # MDcyNTQzWjBXMQswCQYDVQQGEwJVUzERMA8GA1UECBMIVmlyZ2luaWExDzANBgNV # BAcTBlZpZW5uYTERMA8GA1UEChMIZGJhdG9vbHMxETAPBgNVBAMTCGRiYXRvb2xz # MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEApukbvXKULU6AAnExSkpN # 8/N31RrBAMCRMZVfJaq9aFlqaU0nDTzTFStih8Ql5otvDoHTVXKhaBoPpncarl9b # Y6EhzuH8wskMEgBl8jVDDA7+Zggw3cHxNWg7A3QCNmif9A6Hvlf50mgJsqMeQ7Z/ # wj6yejctrnprLn1oWg/b6yICQ0Y7XU6O4EPAvFyOmuXRIfQ+LS7XjdcsdGOMBzqP # SYj+qWIP+oWKrt90OVh685KpMwlZswmptAiIN8kxxQVWRI/1uLK5w7A3bq868OL4 # pwIMVhSxvE+LepZampNUqtrb8roH0btpD6QSJWgStFjnoBL0/pdZYVIUYodoCKfi # TkM8IMObtgKKGDRmGsPFrHKmJe60ympDkNj/IP0RUAEzcTCGJxg112zyN0YYBIq9 # hdC/Yl2FP8MqfGIHTOKcJuxXIpW3R627uP6Xp1T7cl72akgDiLKpjqVjFDqLe+I9 # /unMlF5qDzX1xpZ3vzHZJdZGPCrOk2cNH5PqlooqcycBAgMBAAGjggIXMIICEzAM # BgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA6BgNVHSUEMzAxBgorBgEEAYI3 # YQEABggrBgEFBQcDAwYZKwYBBAGCN2H5+cEspPS4DoOuxLIcm56wGDAdBgNVHQ4E # FgQUS4SX3I5AZuC/TPSPMTEkGRZCWdcwHwYDVR0jBBgwFoAU6IPEM9fcnwycdpoK # ptTfh6ZeWO4wZwYDVR0fBGAwXjBcoFqgWIZWaHR0cDovL3d3dy5taWNyb3NvZnQu # Y29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSUQlMjBWZXJpZmllZCUyMENTJTIw # QU9DJTIwQ0ElMjAwMS5jcmwwgaUGCCsGAQUFBwEBBIGYMIGVMGQGCCsGAQUFBzAC # hlhodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29m # dCUyMElEJTIwVmVyaWZpZWQlMjBDUyUyMEFPQyUyMENBJTIwMDEuY3J0MC0GCCsG # AQUFBzABhiFodHRwOi8vb25lb2NzcC5taWNyb3NvZnQuY29tL29jc3AwZgYDVR0g # BF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3dy5t # aWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMAgGBmeBDAEE # ATANBgkqhkiG9w0BAQwFAAOCAgEAQrGpCCngAqs+0tWXGEnsDwCq38O2E/i5hOuB # +khbXDh2tgP7PmtqcS15OlnlNIenSr/JJvXRz6NNOGNc09yTJCpM4JYNqvrOBtlv # ar6fjeSrDi9uxEiHPGNF0FIIY7C3VTRGP2dvdIM4QyvgeQjzaNB55Z9vyKRb6NVV # nuzb8xZcBcfZzrj+KIDP1oOGTldODmilTBcHoTHGkG/ATkWkXOcqL2p9hCnoBb7d # gcSS7lN26vk6QNJiRgBGUBnf7piH2cR3y0/yOtMkxMrQarLPys9qkbgVB8moqGcO # EqQrrrf6Is8QsZw10slANUACGXxRG2ghHBdeCecOc0x78d+7LpVluErSKT4smB1F # /UcNYd5yXtlTCzbEGb1PFMxYrb2ki9FURVbTX85Z3pSO+Ie/kih9CU/WCSjK9gMD # /35PrIYvLNBemRDuWJ/8GjOA8nk8nIB3nU77JWRnjvQoC3CJnNM/fNqn8jlm3gLV # JSYH5tjRG9KuUYLQnO/d8cu2v81kuDPiDwux17vAU6Ndocfnm1OmExAsphrvsiQe # yaCj4RPYLY49rK6knvDHevUtp2hQJtxHCzCKXSfMR6NAhK7AaoaOMrLCURCUAQEl # nzDN/oE2z2Sm0jNuwKaMs22bkJ7KXknV+1aQ+FokMBT9Pm4Q2AixVpqMl9SNYWwT # zlG170MwggdaMIIFQqADAgECAhMzAAAABzeMW6HZW4zUAAAAAAAHMA0GCSqGSIb3 # DQEBDAUAMGMxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xNDAyBgNVBAMTK01pY3Jvc29mdCBJRCBWZXJpZmllZCBDb2RlIFNpZ25p # bmcgUENBIDIwMjEwHhcNMjEwNDEzMTczMTU0WhcNMjYwNDEzMTczMTU0WjBaMQsw # CQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSswKQYD # VQQDEyJNaWNyb3NvZnQgSUQgVmVyaWZpZWQgQ1MgQU9DIENBIDAxMIICIjANBgkq # hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAt/fAAygHxbo+jxA04hNI8bz+EqbWvSu9 # dRgAawjCZau1Y54IQal5ArpJWi8cIj0WA+mpwix8iTRguq9JELZvTMo2Z1U6AtE1 # Tn3mvq3mywZ9SexVd+rPOTr+uda6GVgwLA80LhRf82AvrSwxmZpCH/laT08dn7+G # t0cXYVNKJORm1hSrAjjDQiZ1Jiq/SqiDoHN6PGmT5hXKs22E79MeFWYB4y0UlNqW # 0Z2LPNua8k0rbERdiNS+nTP/xsESZUnrbmyXZaHvcyEKYK85WBz3Sr6Et8Vlbdid # /pjBpcHI+HytoaUAGE6rSWqmh7/aEZeDDUkz9uMKOGasIgYnenUk5E0b2U//bQqD # v3qdhj9UJYWADNYC/3i3ixcW1VELaU+wTqXTxLAFelCi/lRHSjaWipDeE/TbBb0z # TCiLnc9nmOjZPKlutMNho91wxo4itcJoIk2bPot9t+AV+UwNaDRIbcEaQaBycl9p # cYwWmf0bJ4IFn/CmYMVG1ekCBxByyRNkFkHmuMXLX6PMXcveE46jMr9syC3M8JHR # ddR4zVjd/FxBnS5HOro3pg6StuEPshrp7I/Kk1cTG8yOWl8aqf6OJeAVyG4lyJ9V # +ZxClYmaU5yvtKYKk1FLBnEBfDWw+UAzQV0vcLp6AVx2Fc8n0vpoyudr3SwZmckJ # uz7R+S79BzMCAwEAAaOCAg4wggIKMA4GA1UdDwEB/wQEAwIBhjAQBgkrBgEEAYI3 # FQEEAwIBADAdBgNVHQ4EFgQU6IPEM9fcnwycdpoKptTfh6ZeWO4wVAYDVR0gBE0w # SzBJBgRVHSAAMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly93d3cubWljcm9zb2Z0LmNv # bS9wa2lvcHMvRG9jcy9SZXBvc2l0b3J5Lmh0bTAZBgkrBgEEAYI3FAIEDB4KAFMA # dQBiAEMAQTASBgNVHRMBAf8ECDAGAQH/AgEAMB8GA1UdIwQYMBaAFNlBKbAPD2Ns # 72nX9c0pnqRIajDmMHAGA1UdHwRpMGcwZaBjoGGGX2h0dHA6Ly93d3cubWljcm9z # b2Z0LmNvbS9wa2lvcHMvY3JsL01pY3Jvc29mdCUyMElEJTIwVmVyaWZpZWQlMjBD # b2RlJTIwU2lnbmluZyUyMFBDQSUyMDIwMjEuY3JsMIGuBggrBgEFBQcBAQSBoTCB # njBtBggrBgEFBQcwAoZhaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9j # ZXJ0cy9NaWNyb3NvZnQlMjBJRCUyMFZlcmlmaWVkJTIwQ29kZSUyMFNpZ25pbmcl # MjBQQ0ElMjAyMDIxLmNydDAtBggrBgEFBQcwAYYhaHR0cDovL29uZW9jc3AubWlj # cm9zb2Z0LmNvbS9vY3NwMA0GCSqGSIb3DQEBDAUAA4ICAQB3/utLItkwLTp4Nfh9 # 9vrbpSsL8NwPIj2+TBnZGL3C8etTGYs+HZUxNG+rNeZa+Rzu9oEcAZJDiGjEWytz # MavD6Bih3nEWFsIW4aGh4gB4n/pRPeeVrK4i1LG7jJ3kPLRhNOHZiLUQtmrF4V6I # xtUFjvBnijaZ9oIxsSSQP8iHMjP92pjQrHBFWHGDbkmx+yO6Ian3QN3YmbdfewzS # vnQmKbkiTibJgcJ1L0TZ7BwmsDvm+0XRsPOfFgnzhLVqZdEyWww10bflOeBKqkb3 # SaCNQTz8nshaUZhrxVU5qNgYjaaDQQm+P2SEpBF7RolEC3lllfuL4AOGCtoNdPOW # rx9vBZTXAVdTE2r0IDk8+5y1kLGTLKzmNFn6kVCc5BddM7xoDWQ4aUoCRXcsBeRh # sclk7kVXP+zJGPOXwjUJbnz2Kt9iF/8B6FDO4blGuGrogMpyXkuwCC2Z4XcfyMjP # DhqZYAPGGTUINMtFbau5RtGG1DOWE9edCahtuPMDgByfPixvhy3sn7zUHgIC/YsO # TMxVuMQi/bgamemo/VNKZrsZaS0nzmOxKpg9qDefj5fJ9gIHXcp2F0OHcVwe3KnE # Xa8kqzMDfrRl/wwKrNSFn3p7g0b44Ad1ONDmWt61MLQvF54LG62i6ffhTCeoFT9Z # 9pbUo2gxlyTFg7Bm0fgOlnRfGDCCB54wggWGoAMCAQICEzMAAAAHh6M0o3uljhwA # AAAAAAcwDQYJKoZIhvcNAQEMBQAwdzELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjFIMEYGA1UEAxM/TWljcm9zb2Z0IElkZW50aXR5 # IFZlcmlmaWNhdGlvbiBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAyMDIwMB4X # DTIxMDQwMTIwMDUyMFoXDTM2MDQwMTIwMTUyMFowYzELMAkGA1UEBhMCVVMxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjE0MDIGA1UEAxMrTWljcm9zb2Z0 # IElEIFZlcmlmaWVkIENvZGUgU2lnbmluZyBQQ0EgMjAyMTCCAiIwDQYJKoZIhvcN # AQEBBQADggIPADCCAgoCggIBALLwwK8ZiCji3VR6TElsaQhVCbRS/3pK+MHrJSj3 # Zxd3KU3rlfL3qrZilYKJNqztA9OQacr1AwoNcHbKBLbsQAhBnIB34zxf52bDpIO3 # NJlfIaTE/xrweLoQ71lzCHkD7A4As1Bs076Iu+mA6cQzsYYH/Cbl1icwQ6C65rU4 # V9NQhNUwgrx9rGQ//h890Q8JdjLLw0nV+ayQ2Fbkd242o9kH82RZsH3HEyqjAB5a # 8+Ae2nPIPc8sZU6ZE7iRrRZywRmrKDp5+TcmJX9MRff241UaOBs4NmHOyke8oU1T # Yrkxh+YeHgfWo5tTgkoSMoayqoDpHOLJs+qG8Tvh8SnifW2Jj3+ii11TS8/FGngE # aNAWrbyfNrC69oKpRQXY9bGH6jn9NEJv9weFxhTwyvx9OJLXmRGbAUXN1U9nf4lX # ezky6Uh/cgjkVd6CGUAf0K+Jw+GE/5VpIVbcNr9rNE50Sbmy/4RTCEGvOq3GhjIT # bCa4crCzTTHgYYjHs1NbOc6brH+eKpWLtr+bGecy9CrwQyx7S/BfYJ+ozst7+yZt # G2wR461uckFu0t+gCwLdN0A6cFtSRtR8bvxVFyWwTtgMMFRuBa3vmUOTnfKLsLef # RaQcVTgRnzeLzdpt32cdYKp+dhr2ogc+qM6K4CBI5/j4VFyC4QFeUP2YAidLtvpX # RRo3AgMBAAGjggI1MIICMTAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMC # AQAwHQYDVR0OBBYEFNlBKbAPD2Ns72nX9c0pnqRIajDmMFQGA1UdIARNMEswSQYE # VR0gADBBMD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtp # b3BzL0RvY3MvUmVwb3NpdG9yeS5odG0wGQYJKwYBBAGCNxQCBAweCgBTAHUAYgBD # AEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTIftJqhSobyhmYBAcnz1AQ # T2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3dy5taWNyb3NvZnQuY29t # L3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHklMjBWZXJpZmljYXRpb24l # MjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHklMjAyMDIwLmNybDCBwwYI # KwYBBQUHAQEEgbYwgbMwgYEGCCsGAQUFBzAChnVodHRwOi8vd3d3Lm1pY3Jvc29m # dC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElkZW50aXR5JTIwVmVyaWZp # Y2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0aG9yaXR5JTIwMjAyMC5j # cnQwLQYIKwYBBQUHMAGGIWh0dHA6Ly9vbmVvY3NwLm1pY3Jvc29mdC5jb20vb2Nz # cDANBgkqhkiG9w0BAQwFAAOCAgEAfyUqnv7Uq+rdZgrbVyNMul5skONbhls5fccP # lmIbzi+OwVdPQ4H55v7VOInnmezQEeW4LqK0wja+fBznANbXLB0KrdMCbHQpbLvG # 6UA/Xv2pfpVIE1CRFfNF4XKO8XYEa3oW8oVH+KZHgIQRIwAbyFKQ9iyj4aOWeAzw # k+f9E5StNp5T8FG7/VEURIVWArbAzPt9ThVN3w1fAZkF7+YU9kbq1bCR2YD+Mtun # SQ1Rft6XG7b4e0ejRA7mB2IoX5hNh3UEauY0byxNRG+fT2MCEhQl9g2i2fs6VOG1 # 9CNep7SquKaBjhWmirYyANb0RJSLWjinMLXNOAga10n8i9jqeprzSMU5ODmrMCJE # 12xS/NWShg/tuLjAsKP6SzYZ+1Ry358ZTFcx0FS/mx2vSoU8s8HRvy+rnXqyUJ9H # BqS0DErVLjQwK8VtsBdekBmdTbQVoCgPCqr+PDPB3xajYnzevs7eidBsM71PINK2 # BoE2UfMwxCCX3mccFgx6UsQeRSdVVVNSyALQe6PT12418xon2iDGE81OGCreLzDc # MAZnrUAx4XQLUz6ZTl65yPUiOh3k7Yww94lDf+8oG2oZmDh5O1Qe38E+M3vhKwmz # IeoB1dVLlz4i3IpaDcR+iuGjH2TdaC1ZOmBXiCRKJLj4DT2uhJ04ji+tHD6n58vh # avFIrmcxghdXMIIXUwIBATBxMFoxCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKzApBgNVBAMTIk1pY3Jvc29mdCBJRCBWZXJpZmll # ZCBDUyBBT0MgQ0EgMDECEzMABkuhZJYUkMRwxbsAAAAGS6EwCwYJYIZIAWUDBAIB # oHwwEAYKKwYBBAGCNwIBDDECMAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEILFJ # waZaqUovFbKC1nlnGYZFmkVLusZ1hrMzhL8aFedoMAsGCSqGSIb3DQEBAQSCAYCZ # 916BBL9WFqPQ44I9pqGvAU+L+5Hv0/zJycA1sMKMsLshTbuIP1uhahKWLLPKj0P1 # Mj/XFuU2GhvKfA9UfQ79rFXBEQeN/drdzyaVATgZaraM/cvmjzT5g1qRalKwWEJU # WkGFR/JbZNXVKE6v3NkNt7Q/GOmAA4/yFtGr8R5mtNmsJ4jBWRsF4HrI/nfmrBlk # U7yhBAloUajuvybErX4HV4m79H2N3U0nOz5+xlhOsONB6w2SfdhJPT0bl445fvTz # DCabK3XRC5bM8YeUiEr11vkrf3liWVj0J8qJ293jOcvc2elEIWYWDW5IBhTGl5lF # rnMRDiyRMzV20aby5a240l619Um8f+gH/K69kiIE6RULoJlLfbnToU4kEQ79kxG2 # 8+DvFQRLMXALWeXyjnFhdAL2xzqudbXpSTu4JP9lCFBJfCTwlWT89HLpOG1gVK0D # tbTDhlBxIoriRqJ1YFh7FIQBGnl3rjBBD3V8KwPX7QzNZC0SRd01K2rFy5R1KHmh # ghS9MIIUuQYKKwYBBAGCNwMDATGCFKkwghSlBgkqhkiG9w0BBwKgghSWMIIUkgIB # AzEPMA0GCWCGSAFlAwQCAQUAMIIBdQYLKoZIhvcNAQkQAQSgggFkBIIBYDCCAVwC # AQEGCisGAQQBhFkKAwEwMTANBglghkgBZQMEAgEFAAQgKkHH2xEuH+nAP/+5WFzW # JnR4HyqcpavCf5kmZeDTc+0CBmkBZDY8KxgTMjAyNTExMTIxMDQ5NTAuNjY0WjAE # gAIB9AIJAMwpOfel1ydPoIHppIHmMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRp # b25zIExpbWl0ZWQxJzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0OTFBLTA1RTAt # RDk0NzE1MDMGA1UEAxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGlu # ZyBBdXRob3JpdHmggg8pMIIHgjCCBWqgAwIBAgITMwAAAAXlzw//Zi7JhwAAAAAA # BTANBgkqhkiG9w0BAQwFADB3MQswCQYDVQQGEwJVUzEeMBwGA1UEChMVTWljcm9z # b2Z0IENvcnBvcmF0aW9uMUgwRgYDVQQDEz9NaWNyb3NvZnQgSWRlbnRpdHkgVmVy # aWZpY2F0aW9uIFJvb3QgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IDIwMjAwHhcNMjAx # MTE5MjAzMjMxWhcNMzUxMTE5MjA0MjMxWjBhMQswCQYDVQQGEwJVUzEeMBwGA1UE # ChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVi # bGljIFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDCCAiIwDQYJKoZIhvcNAQEBBQAD # ggIPADCCAgoCggIBAJ5851Jj/eDFnwV9Y7UGIqMcHtfnlzPREwW9ZUZHd5HBXXBv # f7KrQ5cMSqFSHGqg2/qJhYqOQxwuEQXG8kB41wsDJP5d0zmLYKAY8Zxv3lYkuLDs # fMuIEqvGYOPURAH+Ybl4SJEESnt0MbPEoKdNihwM5xGv0rGofJ1qOYSTNcc55EbB # T7uq3wx3mXhtVmtcCEr5ZKTkKKE1CxZvNPWdGWJUPC6e4uRfWHIhZcgCsJ+sozf5 # EeH5KrlFnxpjKKTavwfFP6XaGZGWUG8TZaiTogRoAlqcevbiqioUz1Yt4FRK53P6 # ovnUfANjIgM9JDdJ4e0qiDRm5sOTiEQtBLGd9Vhd1MadxoGcHrRCsS5rO9yhv2fj # JHrmlQ0EIXmp4DhDBieKUGR+eZ4CNE3ctW4uvSDQVeSp9h1SaPV8UWEfyTxgGjOs # RpeexIveR1MPTVf7gt8hY64XNPO6iyUGsEgt8c2PxF87E+CO7A28TpjNq5eLiiun # hKbq0XbjkNoU5JhtYUrlmAbpxRjb9tSreDdtACpm3rkpxp7AQndnI0Shu/fk1/rE # 3oWsDqMX3jjv40e8KN5YsJBnczyWB4JyeeFMW3JBfdeAKhzohFe8U5w9WuvcP1E8 # cIxLoKSDzCCBOu0hWdjzKNu8Y5SwB1lt5dQhABYyzR3dxEO/T1K/BVF3rV69AgMB # AAGjggIbMIICFzAOBgNVHQ8BAf8EBAMCAYYwEAYJKwYBBAGCNxUBBAMCAQAwHQYD # VR0OBBYEFGtpKDo1L0hjQM972K9J6T7ZPdshMFQGA1UdIARNMEswSQYEVR0gADBB # MD8GCCsGAQUFBwIBFjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL0Rv # Y3MvUmVwb3NpdG9yeS5odG0wEwYDVR0lBAwwCgYIKwYBBQUHAwgwGQYJKwYBBAGC # NxQCBAweCgBTAHUAYgBDAEEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBTI # ftJqhSobyhmYBAcnz1AQT2ioojCBhAYDVR0fBH0wezB5oHegdYZzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9jcmwvTWljcm9zb2Z0JTIwSWRlbnRpdHkl # MjBWZXJpZmljYXRpb24lMjBSb290JTIwQ2VydGlmaWNhdGUlMjBBdXRob3JpdHkl # MjAyMDIwLmNybDCBlAYIKwYBBQUHAQEEgYcwgYQwgYEGCCsGAQUFBzAChnVodHRw # Oi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMElk # ZW50aXR5JTIwVmVyaWZpY2F0aW9uJTIwUm9vdCUyMENlcnRpZmljYXRlJTIwQXV0 # aG9yaXR5JTIwMjAyMC5jcnQwDQYJKoZIhvcNAQEMBQADggIBAF+Idsd+bbVaFXXn # THho+k7h2ESZJRWluLE0Oa/pO+4ge/XEizXvhs0Y7+KVYyb4nHlugBesnFqBGEdC # 2IWmtKMyS1OWIviwpnK3aL5JedwzbeBF7POyg6IGG/XhhJ3UqWeWTO+Czb1c2NP5 # zyEh89F72u9UIw+IfvM9lzDmc2O2END7MPnrcjWdQnrLn1Ntday7JSyrDvBdmgbN # nCKNZPmhzoa8PccOiQljjTW6GePe5sGFuRHzdFt8y+bN2neF7Zu8hTO1I64XNGqs # t8S+w+RUdie8fXC1jKu3m9KGIqF4aldrYBamyh3g4nJPj/LR2CBaLyD+2BuGZCVm # oNR/dSpRCxlot0i79dKOChmoONqbMI8m04uLaEHAv4qwKHQ1vBzbV/nG89LDKbRS # SvijmwJwxRxLLpMQ/u4xXxFfR4f/gksSkbJp7oqLwliDm/h+w0aJ/U5ccnYhYb7v # PKNMN+SZDWycU5ODIRfyoGl59BsXR/HpRGtiJquOYGmvA/pk5vC1lcnbeMrcWD/2 # 6ozePQ/TWfNXKBOmkFpvPE8CH+EeGGWzqTCjdAsno2jzTeNSxlx3glDGJgcdz5D/ # AAxw9Sdgq/+rY7jjgs7X6fqPTXPmaCAJKVHAP19oEjJIBwD1LyHbaEgBxFCogYSO # iUIr0Xqcr1nJfiWG2GwYe6ZoAF1bMIIHnzCCBYegAwIBAgITMwAAAE6jxg4+McN0 # JwAAAAAATjANBgkqhkiG9w0BAQwFADBhMQswCQYDVQQGEwJVUzEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUHVibGlj # IFJTQSBUaW1lc3RhbXBpbmcgQ0EgMjAyMDAeFw0yNTAyMjcxOTQwMTdaFw0yNjAy # MjYxOTQwMTdaMIHjMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQ # MA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9u # MS0wKwYDVQQLEyRNaWNyb3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQx # JzAlBgNVBAsTHm5TaGllbGQgVFNTIEVTTjo0OTFBLTA1RTAtRDk0NzE1MDMGA1UE # AxMsTWljcm9zb2Z0IFB1YmxpYyBSU0EgVGltZSBTdGFtcGluZyBBdXRob3JpdHkw # ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCG35SLumwJbZXe50V9E+km # xeGxDI6BJlO3S+2RwbDkLYOYYhrPBkJa2VRNcgFsxgK3oaKeO65tkNFonbXrvDNB # /3O3GqHoVQ9bKPBmNFaNdpHyJkKdareQNZHE3GF1pskG3i8fcPChwZyB6XrD/rJN # kk4JWLBbtwrR7SBV46ywBe/jYwNFK8LN58uWz3frY8TurxSGN1esl29xiG3B235p # XjX62uGRAAP4RcQw3ZtkXi7f+oo+4lTO0OhGw0K4LkTEMnRfBxMiz/fIhihxB9+p # nM/nifV5f272vj5P/WI9WonNjAawO2E22P4XcNx0rJMb1FIDSHChUFbM9+hUjF0D # s1V1tXBVy+FIhqsPspQpSXGdJdx9AIsLJ6b6NLfb+Mw+Y8Ca5njSJSgXh+RBm31z # 3pW1RGdp7TAQoD3oAeanpaqPmzH0s/ZUUztnOywcmH0LOlDiS9iYYK2aE/oO1jUh # GSl0PqOg17o6Yn+V0zHTM1gjjoiZzHHr6WXQ9mmGjhBhV1JudUBNiSyp4v+9XnGY # yOg3+AurwV0Ve1k++gWFIHBGtPJGG1uZDdI45wTxhQEq/Ukp2TRhSkOCfDMkcRAT # 2Uzd9zF/T8/t2X2ReJkvKMlzAnDphONOjPUUkD/W01VlbjkdDB6OehKVACtYVSyn # 7kg9HRMGxojGsB63pTijQQIDAQABo4IByzCCAccwHQYDVR0OBBYEFPDHuoN0qkrS # 9LcneYsOK78NTWpiMB8GA1UdIwQYMBaAFGtpKDo1L0hjQM972K9J6T7ZPdshMGwG # A1UdHwRlMGMwYaBfoF2GW2h0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2lvcHMv # Y3JsL01pY3Jvc29mdCUyMFB1YmxpYyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENB # JTIwMjAyMC5jcmwweQYIKwYBBQUHAQEEbTBrMGkGCCsGAQUFBzAChl1odHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY3Jvc29mdCUyMFB1Ymxp # YyUyMFJTQSUyMFRpbWVzdGFtcGluZyUyMENBJTIwMjAyMC5jcnQwDAYDVR0TAQH/ # BAIwADAWBgNVHSUBAf8EDDAKBggrBgEFBQcDCDAOBgNVHQ8BAf8EBAMCB4AwZgYD # VR0gBF8wXTBRBgwrBgEEAYI3TIN9AQEwQTA/BggrBgEFBQcCARYzaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraW9wcy9Eb2NzL1JlcG9zaXRvcnkuaHRtMAgGBmeB # DAEEAjANBgkqhkiG9w0BAQwFAAOCAgEAEyZzK6QhrlqvWToBCnCsj2Y+9Z/yaV/U # mGkyv6jqz7CMc3/6r6v/7o9HUwZ38eyltGiNWM9gukO/INW/NAFPAETcqCIZk9kl # jSPJOxS6O6nlkszeG3IA4E0Umihj4llmybRI2woGyJDSd2Uz/YgSQrMWcL+muOWp # /QKRtTVf8D/J4ldEQQh/UiB5g+rL9+JcZcx04Bhn9Z9vPX4Py6EjLCxT2ePht6dC # mLuwOX8+teiAZPWVqV0MRxTXEjIP65cGzuuZNJNLEa1JSFpJPu9Z7djYKbBWloti # WKtJrF9Ls1dy2y2lnys4NQd7oKEly8qWYN6T8qZHV4dcK2vYdttkbs48jpsMlou4 # 00FATj2Xp8mqWyYQGV5QsTgWjdNG7NVfs1INpojbXvRPAlh2oKvkbbP9YkojwsFp # jCn6opUknUjLWElzMnIgilnsXkYwF9EKL0rBr9KTKpGHz2ubm5yNN2m/wOiqHdkx # BfLn0oVfbEEqmw7HDFtdk0Dm6Mk1IXPMD6fKdllno76x/vQFDuoU6GmHjOIzJpjn # AAJaR5tgGPhgJPmOeHeg2AOjQRA/gkhBUmpFFUajW5DeJjdUjpJaHWYb0aYZhfTr # dA7sy7vygcliHx22mP8E7rKxFRh+FuJ9/RZnDCL1WzKXjhDWeffsRohcLeYs7mm2 # YhzfxBUeJXkxggPUMIID0AIBATB4MGExCzAJBgNVBAYTAlVTMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xMjAwBgNVBAMTKU1pY3Jvc29mdCBQdWJsaWMg # UlNBIFRpbWVzdGFtcGluZyBDQSAyMDIwAhMzAAAATqPGDj4xw3QnAAAAAABOMA0G # CWCGSAFlAwQCAQUAoIIBLTAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJ # KoZIhvcNAQkEMSIEIMq0bXNgJlDMJp2nYbLV68C89qaw5f6ykSUV6xVYryT4MIHd # BgsqhkiG9w0BCRACLzGBzTCByjCBxzCBoAQgb7Kn0+8oBR2w3v0490Ap9uSRw7lI # YMrTT0W+u/+WShcwfDBlpGMwYTELMAkGA1UEBhMCVVMxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFB1YmxpYyBSU0Eg # VGltZXN0YW1waW5nIENBIDIwMjACEzMAAABOo8YOPjHDdCcAAAAAAE4wIgQgA2WG # E1IZCZymZI4PtjN4bKJ1pf05a1WCTg6PLmaJ4q8wDQYJKoZIhvcNAQELBQAEggIA # br89/Cpk3lTEPJKIcCSjkJqSXpYHxEkqZ/NOIOhy3u1YJs2OCsh1qlKeSWgOiK0d # Ii3Kh7G9NsqzWzm95eu6Yw7gaoq18X9OV5ukfyB1xmtBamFCGo85G976TOIgY2bs # PChFvSR9YNgeTfAa1uouazOK7+vrNthR0moUrvS8JAtuP44/m+EVtvo/osefsORY # YMoIxIdSTHhSNo98gZgFsAhE7j9ik5vgHAh3NNJ8e/sNovlxl6zjPPOBMrcQkuci # DH7ph5qdgLYL9KmNJ7buajBYuEQ8QQ5AVqMnW4heq71IoA0PBM/2kv/A0U/wypQ1 # S0rPyaMHmgv+W80HJwJHtBltfzWtSiOEU2YCvx9z3vvlqIGUDNot8wM11UvexfEP # FyPECxnGhHsmr0PzfE7e2etQAKQdbbd/AACc+Fwcfq0QTCKjOHN3zsIy/I0M8ZgW # LNTpaE48IZxNfFEY3wN/+zAluUq5KUphkZ4MPTANXWvAQjwMuVdSa2BDBNL+ktiU # zrpKzvUBODon1gnao+SuDO0xl7d9uNYngGAYtKpOG+NOQfvzSQlNjm5yP28+JzFX # VHyEcs/CV2mF6p7vaWW9V9DdWq9T8ZvcRNaBNLW1HIUY49PYDRB+rx/R6cZktluB # pkmtZNNlLmA/TYKr9OHMeudiZtE6In8ubrgwVkd5NGY= # SIG # End signature block |