Framework/Models/SVT/PSCloudService.ps1
# # CloudService.ps1 # Set-StrictMode -Version Latest class PSCloudService { [PSObject] $CloudServiceName [PSObject] $CloudServiceRGName [DeploymentSlot[]] $DeploymentSlots [PSObject] $VirtualIps [PSObject] $UpgradeType [PSObject] $UpgradeDomainCount [Extension[]] $Extensions [string] $CloudServiceResourceType = "Microsoft.ClassicCompute/domainNames" [string] $CloudServiceAPIVersion = "2016-04-01" PSCloudService([string] $cloudServiceName, [string] $cloudServiceRGName) { $this.CloudServiceName = $cloudServiceName; $this.CloudServiceRGName = $cloudServiceRGName; } [void] LoadCloudConfiguration() { $cloudServiceSlots = Get-AzResource -ResourceGroupName $this.CloudServiceRGName ` -Name $this.CloudServiceName ` -ResourceType "$($this.CloudServiceResourceType)/slots" ` -ApiVersion $this.CloudServiceAPIVersion if(($cloudServiceSlots | Measure-Object).Count -gt 0) { $this.DeploymentSlots = @(); $cloudServiceSlots | ForEach-Object { $cloudSlot = $_; $DeploymentSlot = [DeploymentSlot]::new(); $DeploymentSlot.SlotName = $cloudSlot.Name; if(([Helpers]::CheckMember($cloudSlot,"Properties")) -and ([Helpers]::CheckMember($cloudSlot.Properties,"configuration"))) { $DeploymentSlot.CloudCSCFG = [xml]$cloudSlot.Properties.configuration if($null -ne $DeploymentSlot.CloudCSCFG.ServiceConfiguration) { $DeploymentSlot.IsOSAutoUpdateTurnedOn = $false; if($null -ne $DeploymentSlot.CloudCSCFG.ServiceConfiguration.Attributes["osVersion"] -and $DeploymentSlot.CloudCSCFG.ServiceConfiguration.Attributes["osVersion"].value -eq "*") { $DeploymentSlot.IsOSAutoUpdateTurnedOn = $true; } } } if(([Helpers]::CheckMember($cloudSlot,"Properties")) -and ([Helpers]::CheckMember($cloudSlot.Properties,"slotType"))) { $DeploymentSlot.SlotType = $cloudSlot.Properties.slotType } #get roles $cloudServiceRoles = Get-AzResource -ResourceGroupName $this.CloudServiceRGName ` -Name "$($this.CloudServiceName)/$($DeploymentSlot.SlotName)" ` -ResourceType "$($this.CloudServiceResourceType)/slots/roles" ` -ApiVersion $this.CloudServiceAPIVersion if(($cloudServiceRoles | Measure-Object).Count -gt 0) { $DeploymentSlot.Roles = @(); $cloudServiceRoles | ForEach-Object{ $cloudRole = $_; $Role = [Role]::new(); $Role.RoleName = $cloudRole.Name if([Helpers]::CheckMember($cloudRole,"Properties")) { $Role.OSVersion = $cloudRole.Properties.osVersion $cloudRoleProps = $cloudRole.Properties; if([Helpers]::CheckMember($cloudRoleProps,"inputEndpoints") -and ($cloudRoleProps.inputEndpoints | Measure-Object).Count -gt 0) { $Role.InputEndpoints = @(); $cloudRole.Properties.inputEndpoints | ForEach-Object{ $roleInputEP = $_ $InputEndPoint = [InputEndpoint]::new(); if([Helpers]::CheckMember($roleInputEP,"publicIpAddress")) { $InputEndPoint.PublicIPAddress = $roleInputEP.publicIpAddress; } $InputEndPoint.Protocol = $roleInputEP.protocol; $InputEndPoint.PrivatePort = $roleInputEP.privatePort; $InputEndPoint.PublicPort = $roleInputEP.publicPort; if([Helpers]::CheckMember($roleInputEP,"virtualIpName")) { $InputEndPoint.VirtualIPName = $roleInputEP.virtualIpName; } $Role.InputEndpoints += $InputEndPoint; } } } $Role.IsRemoteAccessEnabled = $false; $Role.IsRemoteForwarderEnabled = $false; if($null-ne $DeploymentSlot.CloudCSCFG ` -and $null -ne $DeploymentSlot.CloudCSCFG.ServiceConfiguration ` -and $null -ne $DeploymentSlot.CloudCSCFG.ServiceConfiguration.Role) { foreach($configRole in $DeploymentSlot.CloudCSCFG.ServiceConfiguration.Role) { if($configRole.name -eq $Role.RoleName) { if([Helpers]::CheckMember($configRole,"ConfigurationSettings") -and $null -ne $configRole.ConfigurationSettings ` -and [Helpers]::CheckMember($configRole.ConfigurationSettings,"Setting") ` -and $null -ne $configRole.ConfigurationSettings.Setting) { foreach ($setting in $configRole.ConfigurationSettings.Setting) { if($setting.name -eq "Microsoft.WindowsAzure.Plugins.RemoteAccess.Enabled" -and $setting.value -eq "true") { $Role.IsRemoteAccessEnabled = $true; } elseif($setting.name -eq "Microsoft.WindowsAzure.Plugins.RemoteForwarder.Enabled" -and $setting.value -eq "true") { $Role.IsRemoteForwarderEnabled = $true; } } } } } } $DeploymentSlot.Roles += $Role; } } $this.DeploymentSlots += $DeploymentSlot; } } } hidden [void] LoadCloudConfigurationFromClassicConfig([xml] $CloudServiceResponse) { # Get the results from the API as XML if($null -ne $CloudServiceResponse.hostedservice) { if([Helpers]::CheckMember($CloudServiceResponse.hostedservice, "Deployments")){ if([Helpers]::CheckMember($CloudServiceResponse.hostedservice.Deployments , "Deployment")){ foreach($svc in $CloudServiceResponse.hostedservice.Deployments.Deployment) { $DeploymentSlot = $this.DeploymentSlots | Where-Object { $_.SlotName -eq $svc.DeploymentSlot} if($null -ne $svc.RoleInstanceList) { foreach($instance in $svc.RoleInstanceList.RoleInstance) { [RoleInstance] $roleInstance = [RoleInstance]::new() $roleInstance.RoleName = $instance.RoleName $roleInstance.InstanceName = $instance.InstanceName $roleInstance.PowerState = $instance.PowerState if([Helpers]::CheckMember($instance, "IpAddress")) { $roleInstance.IPAddress = $instance.IpAddress } if([Helpers]::CheckMember($instance, "InstanceEndpoints") -and $null -ne $instance.InstanceEndpoints -and $null -ne $instance.InstanceEndpoints.InstanceEndpoint) { $roleInstance.InstanceEndpoints = [array]($instance.InstanceEndpoints.InstanceEndpoint | Select-Object Name, Vip, PublicPort, LocalPort, Protocol) } $Role = $DeploymentSlot.Roles | Where-Object { $_.RoleName -eq $roleInstance.RoleName} if($null -eq $Role.RoleInstances) { $Role.RoleInstances = @() } if([Helpers]::CheckMember($svc, "RoleList")) { $roleFromClassicObj = $svc.RoleList.Role | Where-Object { $_.RoleName -eq $roleInstance.RoleName } if($null -ne $roleFromClassicObj) { if([Helpers]::CheckMember($roleFromClassicObj, "RoleType")) { $Role.RoleType = $roleFromClassicObj.RoleType } } } $Role.RoleInstances += $roleInstance if([Helpers]::CheckMember($svc, "VirtualIPs") -and [Helpers]::CheckMember($svc.VirtualIPs, "VirtualIP")) { $Role.VirtualIPs = [array]($svc.VirtualIPs.VirtualIP | Select-Object Address, IsDnsProgrammed) } if([Helpers]::CheckMember($svc, "UpgradeDomainCount")) { $Role.UpgradeDomainCount = $svc.UpgradeDomainCount } # Write-Host `nRole Extensions: -ForegroundColor DarkYellow # Write-Host ------------------ $Role.Extensions = @() if(([Helpers]::CheckMember($svc ,"ExtensionConfiguration")) -and ([Helpers]::CheckMember($svc.ExtensionConfiguration,"NamedRoles") )) { foreach($instanceRole in $svc.ExtensionConfiguration.NamedRoles.Role) { if($instanceRole.RoleName -eq $instance.RoleName) { [Extension] $extension = [Extension]::new() $extension.RoleName = $instanceRole.RoleName if($null -ne $instanceRole.Extensions.Extension) { $extension.ExtensionId = ($instanceRole.Extensions.Extension | Select-Object Id ) } $Role.Extensions += $extension } } } } } } } } } } } class RoleInstance { [PSObject] $RoleName [PSObject] $InstanceName [PSObject] $PowerState [PSObject] $IPAddress [PSObject] $InstanceEndpoints } class Role { [string] $RoleName [string] $OSVersion [string] $RoleType [InputEndpoint[]] $InputEndpoints [RoleInstance[]] $RoleInstances [bool] $IsRemoteForwarderEnabled [bool] $IsRemoteAccessEnabled [PSObject] $VirtualIPs [PSObject] $UpgradeDomainCount [Extension[]] $Extensions } class InputEndpoint { [string] $PublicIPAddress [string] $PrivatePort [string] $PublicPort [string] $Protocol [string] $VirtualIPName } class Extension { [PSObject] $RoleName [PSObject] $ExtensionId } class DeploymentSlot { [string] $SlotName [PSObject] $CloudCSCFG [Role[]] $Roles [bool] $IsOSAutoUpdateTurnedOn [string] $SlotType } # SIG # Begin signature block # MIIjhwYJKoZIhvcNAQcCoIIjeDCCI3QCAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDGDsKLJewq7G4t # V7BCq9xyftmoNV/Q3HwYsxZGy61qGaCCDYEwggX/MIID56ADAgECAhMzAAABh3IX # chVZQMcJAAAAAAGHMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAwMzA0MTgzOTQ3WhcNMjEwMzAzMTgzOTQ3WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQDOt8kLc7P3T7MKIhouYHewMFmnq8Ayu7FOhZCQabVwBp2VS4WyB2Qe4TQBT8aB # znANDEPjHKNdPT8Xz5cNali6XHefS8i/WXtF0vSsP8NEv6mBHuA2p1fw2wB/F0dH # sJ3GfZ5c0sPJjklsiYqPw59xJ54kM91IOgiO2OUzjNAljPibjCWfH7UzQ1TPHc4d # weils8GEIrbBRb7IWwiObL12jWT4Yh71NQgvJ9Fn6+UhD9x2uk3dLj84vwt1NuFQ # itKJxIV0fVsRNR3abQVOLqpDugbr0SzNL6o8xzOHL5OXiGGwg6ekiXA1/2XXY7yV # Fc39tledDtZjSjNbex1zzwSXAgMBAAGjggF+MIIBejAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUhov4ZyO96axkJdMjpzu2zVXOJcsw # UAYDVR0RBEkwR6RFMEMxKTAnBgNVBAsTIE1pY3Jvc29mdCBPcGVyYXRpb25zIFB1 # ZXJ0byBSaWNvMRYwFAYDVQQFEw0yMzAwMTIrNDU4Mzg1MB8GA1UdIwQYMBaAFEhu # ZOVQBdOCqhc3NyK1bajKdQKVMFQGA1UdHwRNMEswSaBHoEWGQ2h0dHA6Ly93d3cu # bWljcm9zb2Z0LmNvbS9wa2lvcHMvY3JsL01pY0NvZFNpZ1BDQTIwMTFfMjAxMS0w # Ny0wOC5jcmwwYQYIKwYBBQUHAQEEVTBTMFEGCCsGAQUFBzAChkVodHRwOi8vd3d3 # Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NlcnRzL01pY0NvZFNpZ1BDQTIwMTFfMjAx # MS0wNy0wOC5jcnQwDAYDVR0TAQH/BAIwADANBgkqhkiG9w0BAQsFAAOCAgEAixmy # S6E6vprWD9KFNIB9G5zyMuIjZAOuUJ1EK/Vlg6Fb3ZHXjjUwATKIcXbFuFC6Wr4K # NrU4DY/sBVqmab5AC/je3bpUpjtxpEyqUqtPc30wEg/rO9vmKmqKoLPT37svc2NV # BmGNl+85qO4fV/w7Cx7J0Bbqk19KcRNdjt6eKoTnTPHBHlVHQIHZpMxacbFOAkJr # qAVkYZdz7ikNXTxV+GRb36tC4ByMNxE2DF7vFdvaiZP0CVZ5ByJ2gAhXMdK9+usx # zVk913qKde1OAuWdv+rndqkAIm8fUlRnr4saSCg7cIbUwCCf116wUJ7EuJDg0vHe # yhnCeHnBbyH3RZkHEi2ofmfgnFISJZDdMAeVZGVOh20Jp50XBzqokpPzeZ6zc1/g # yILNyiVgE+RPkjnUQshd1f1PMgn3tns2Cz7bJiVUaqEO3n9qRFgy5JuLae6UweGf # AeOo3dgLZxikKzYs3hDMaEtJq8IP71cX7QXe6lnMmXU/Hdfz2p897Zd+kU+vZvKI # 3cwLfuVQgK2RZ2z+Kc3K3dRPz2rXycK5XCuRZmvGab/WbrZiC7wJQapgBodltMI5 # GMdFrBg9IeF7/rP4EqVQXeKtevTlZXjpuNhhjuR+2DMt/dWufjXpiW91bo3aH6Ea # jOALXmoxgltCp1K7hrS6gmsvj94cLRf50QQ4U8Qwggd6MIIFYqADAgECAgphDpDS # AAAAAAADMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMK # V2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0 # IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0 # ZSBBdXRob3JpdHkgMjAxMTAeFw0xMTA3MDgyMDU5MDlaFw0yNjA3MDgyMTA5MDla # MH4xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdS # ZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMT # H01pY3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTEwggIiMA0GCSqGSIb3DQEB # AQUAA4ICDwAwggIKAoICAQCr8PpyEBwurdhuqoIQTTS68rZYIZ9CGypr6VpQqrgG # OBoESbp/wwwe3TdrxhLYC/A4wpkGsMg51QEUMULTiQ15ZId+lGAkbK+eSZzpaF7S # 35tTsgosw6/ZqSuuegmv15ZZymAaBelmdugyUiYSL+erCFDPs0S3XdjELgN1q2jz # y23zOlyhFvRGuuA4ZKxuZDV4pqBjDy3TQJP4494HDdVceaVJKecNvqATd76UPe/7 # 4ytaEB9NViiienLgEjq3SV7Y7e1DkYPZe7J7hhvZPrGMXeiJT4Qa8qEvWeSQOy2u # M1jFtz7+MtOzAz2xsq+SOH7SnYAs9U5WkSE1JcM5bmR/U7qcD60ZI4TL9LoDho33 # X/DQUr+MlIe8wCF0JV8YKLbMJyg4JZg5SjbPfLGSrhwjp6lm7GEfauEoSZ1fiOIl # XdMhSz5SxLVXPyQD8NF6Wy/VI+NwXQ9RRnez+ADhvKwCgl/bwBWzvRvUVUvnOaEP # 6SNJvBi4RHxF5MHDcnrgcuck379GmcXvwhxX24ON7E1JMKerjt/sW5+v/N2wZuLB # l4F77dbtS+dJKacTKKanfWeA5opieF+yL4TXV5xcv3coKPHtbcMojyyPQDdPweGF # RInECUzF1KVDL3SV9274eCBYLBNdYJWaPk8zhNqwiBfenk70lrC8RqBsmNLg1oiM # CwIDAQABo4IB7TCCAekwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFEhuZOVQ # BdOCqhc3NyK1bajKdQKVMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1Ud # DwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFHItOgIxkEO5FAVO # 4eqnxzHRI4k0MFoGA1UdHwRTMFEwT6BNoEuGSWh0dHA6Ly9jcmwubWljcm9zb2Z0 # LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcmwwXgYIKwYBBQUHAQEEUjBQME4GCCsGAQUFBzAChkJodHRwOi8vd3d3Lm1p # Y3Jvc29mdC5jb20vcGtpL2NlcnRzL01pY1Jvb0NlckF1dDIwMTFfMjAxMV8wM18y # Mi5jcnQwgZ8GA1UdIASBlzCBlDCBkQYJKwYBBAGCNy4DMIGDMD8GCCsGAQUFBwIB # FjNodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2RvY3MvcHJpbWFyeWNw # cy5odG0wQAYIKwYBBQUHAgIwNB4yIB0ATABlAGcAYQBsAF8AcABvAGwAaQBjAHkA # XwBzAHQAYQB0AGUAbQBlAG4AdAAuIB0wDQYJKoZIhvcNAQELBQADggIBAGfyhqWY # 4FR5Gi7T2HRnIpsLlhHhY5KZQpZ90nkMkMFlXy4sPvjDctFtg/6+P+gKyju/R6mj # 82nbY78iNaWXXWWEkH2LRlBV2AySfNIaSxzzPEKLUtCw/WvjPgcuKZvmPRul1LUd # d5Q54ulkyUQ9eHoj8xN9ppB0g430yyYCRirCihC7pKkFDJvtaPpoLpWgKj8qa1hJ # Yx8JaW5amJbkg/TAj/NGK978O9C9Ne9uJa7lryft0N3zDq+ZKJeYTQ49C/IIidYf # wzIY4vDFLc5bnrRJOQrGCsLGra7lstnbFYhRRVg4MnEnGn+x9Cf43iw6IGmYslmJ # aG5vp7d0w0AFBqYBKig+gj8TTWYLwLNN9eGPfxxvFX1Fp3blQCplo8NdUmKGwx1j # NpeG39rz+PIWoZon4c2ll9DuXWNB41sHnIc+BncG0QaxdR8UvmFhtfDcxhsEvt9B # xw4o7t5lL+yX9qFcltgA1qFGvVnzl6UJS0gQmYAf0AApxbGbpT9Fdx41xtKiop96 # eiL6SJUfq/tHI4D1nvi/a7dLl+LrdXga7Oo3mXkYS//WsyNodeav+vyL6wuA6mk7 # r/ww7QRMjt/fdW1jkT3RnVZOT7+AVyKheBEyIXrvQQqxP/uozKRdwaGIm1dxVk5I # RcBCyZt2WwqASGv9eZ/BvW1taslScxMNelDNMYIVXDCCFVgCAQEwgZUwfjELMAkG # A1UEBhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQx # HjAcBgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEoMCYGA1UEAxMfTWljcm9z # b2Z0IENvZGUgU2lnbmluZyBQQ0EgMjAxMQITMwAAAYdyF3IVWUDHCQAAAAABhzAN # BglghkgBZQMEAgEFAKCBsDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgor # BgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAvBgkqhkiG9w0BCQQxIgQglekuaBub # mfnwzqTog1Faf/3wJXQf02iNfaHIOuqdUhswRAYKKwYBBAGCNwIBDDE2MDSgFIAS # AE0AaQBjAHIAbwBzAG8AZgB0oRyAGmh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20g # MA0GCSqGSIb3DQEBAQUABIIBAEz9Mzjp/G6kulfV4hxAN93FhGHR897pptAVObzu # WHs6aDmh+AYWoajzv9bhtqIvfmNarim6ldQOeJh8KzvXDn9NcwrpmR4ClmaqGRZi # hgESoEolLXU/7YRabZHb4kxEOcM8TRRE1YKFlu/t3bdLTsTB92JPR6d5yIrm5DIf # 7a5xfLJP+hnWSZ3H3ag4i2ZyS+azA21wvwG06XwPgvHZBHZIyxi5qFn+mHg52TPS # 2aEZHspRQvDiXT4Ql2ZlKOFl8PC0Ah1ni1vuY9ECJ7vyAsHHtuFnKSGf1uO1Jwgo # rSwNj55dBOrA1NaY5GpjBNQK/tOkSARr8RpHBJexxmTVQWChghLkMIIS4AYKKwYB # BAGCNwMDATGCEtAwghLMBgkqhkiG9w0BBwKgghK9MIISuQIBAzEPMA0GCWCGSAFl # AwQCAQUAMIIBUAYLKoZIhvcNAQkQAQSgggE/BIIBOzCCATcCAQEGCisGAQQBhFkK # AwEwMTANBglghkgBZQMEAgEFAAQg13dweNmsJUXMGkHxb3ilVP5JSaGDuRD0MDLy # TpG03IsCBmAliLpz1BgSMjAyMTAyMTUwNDUxMjYuNDRaMASAAgH0oIHQpIHNMIHK # MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVk # bW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSUwIwYDVQQLExxN # aWNyb3NvZnQgQW1lcmljYSBPcGVyYXRpb25zMSYwJAYDVQQLEx1UaGFsZXMgVFNT # IEVTTjpFNUE2LUUyN0MtNTkyRTElMCMGA1UEAxMcTWljcm9zb2Z0IFRpbWUtU3Rh # bXAgU2VydmljZaCCDjwwggTxMIID2aADAgECAhMzAAABR52P8ebeMYNZAAAAAAFH # MA0GCSqGSIb3DQEBCwUAMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5n # dG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9y # YXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMB4X # DTIwMTExMjE4MjU1NVoXDTIyMDIxMTE4MjU1NVowgcoxCzAJBgNVBAYTAlVTMRMw # EQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVN # aWNyb3NvZnQgQ29ycG9yYXRpb24xJTAjBgNVBAsTHE1pY3Jvc29mdCBBbWVyaWNh # IE9wZXJhdGlvbnMxJjAkBgNVBAsTHVRoYWxlcyBUU1MgRVNOOkU1QTYtRTI3Qy01 # OTJFMSUwIwYDVQQDExxNaWNyb3NvZnQgVGltZS1TdGFtcCBTZXJ2aWNlMIIBIjAN # BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArQUDTOl99ihZPwSfGGqa38xLei49 # +BvlS484HxIDhklXdTLu5wqYStCuKMj68yLYDUYweIFIiquhs4MXQx4GT4ExL5ue # 87GrHMhq8m1pH91Va/G6n9jyIBr8CgzRIFXMoLBG7lsF8/S4ujOwDqA+EwfH5eAE # 5vi+2+PpWA1DCWDC86YiczO+OWtFx4q4lGjqWFn5MDvR8+rn/pNh6u8hsoLh/J2j # yzJ2H5mCLdj1wMFlbxuDA+GG41wVWdeLnoe2JamUzLmt5/ZE9QmQ7B78/qOfJ7KG # pl0cERTm+yw41VfvnGSGSztvbrIiNB+/bW930r4fbVO0AuwoqzQgWGoDSQIDAQAB # o4IBGzCCARcwHQYDVR0OBBYEFLT43G/eZKGGVxsvQz8TePXUgrC6MB8GA1UdIwQY # MBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6 # Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1RpbVN0YVBD # QV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0 # dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljVGltU3RhUENBXzIw # MTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwgw # DQYJKoZIhvcNAQELBQADggEBAFDEDso1fnmtpBLV6g9HDnw9mdjxVCMuZC5BlOd0 # QxnH4ZcyEfUJU4GS6kxIYCy7gksuo3Jmvpz4O3uV4NaKgmXGSUcLUT80tRevzOmE # d+R926zdJmlZz65q0PdZJH7Dag07blg4gCAX5DRIAqUGQm+DldxzLuS/Hmc4OXVG # ie1xPiwbqYSUixSbWm8WLeH5AkMZ0w9s+dGN9mbl4jZhRYmu6lavt2HN5pltNvvy # lh/D9Rz4qGyRvHKxmIEhJMbZFFxnaLrcBllvPCkfUUXDP+Bii6rdjkPAFhEG+7IY # DPKcTb7t9E8Xo0QKWuFgHzgHo0xuPiswZuu141WdiJVwD5IwggZxMIIEWaADAgEC # AgphCYEqAAAAAAACMA0GCSqGSIb3DQEBCwUAMIGIMQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQDEylNaWNyb3NvZnQgUm9vdCBDZXJ0 # aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0xMDA3MDEyMTM2NTVaFw0yNTA3MDEy # MTQ2NTVaMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk # BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwMIIBIjANBgkqhkiG # 9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqR0NvHcRijog7PwTl/X6f2mUa3RUENWlCgCC # hfvtfGhLLF/Fw+Vhwna3PmYrW/AVUycEMR9BGxqVHc4JE458YTBZsTBED/FgiIRU # QwzXTbg4CLNC3ZOs1nMwVyaCo0UN0Or1R4HNvyRgMlhgRvJYR4YyhB50YWeRX4FU # sc+TTJLBxKZd0WETbijGGvmGgLvfYfxGwScdJGcSchohiq9LZIlQYrFd/XcfPfBX # day9ikJNQFHRD5wGPmd/9WbAA5ZEfu/QS/1u5ZrKsajyeioKMfDaTgaRtogINeh4 # HLDpmc085y9Euqf03GS9pAHBIAmTeM38vMDJRF1eFpwBBU8iTQIDAQABo4IB5jCC # AeIwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0OBBYEFNVjOlyKMZDzQ3t8RhvFM2ha # hW1VMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMAsGA1UdDwQEAwIBhjAPBgNV # HRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2VsuP6KJcYmjRPZSQW9fOmhjEMFYG # A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3Js # L3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEwLTA2LTIzLmNybDBaBggrBgEFBQcB # AQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kv # Y2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYtMjMuY3J0MIGgBgNVHSABAf8EgZUw # gZIwgY8GCSsGAQQBgjcuAzCBgTA9BggrBgEFBQcCARYxaHR0cDovL3d3dy5taWNy # b3NvZnQuY29tL1BLSS9kb2NzL0NQUy9kZWZhdWx0Lmh0bTBABggrBgEFBQcCAjA0 # HjIgHQBMAGUAZwBhAGwAXwBQAG8AbABpAGMAeQBfAFMAdABhAHQAZQBtAGUAbgB0 # AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAB+aIUQ3ixuCYP4FxAz2do6Ehb7Prpsz1 # Mb7PBeKp/vpXbRkws8LFZslq3/Xn8Hi9x6ieJeP5vO1rVFcIK1GCRBL7uVOMzPRg # Eop2zEBAQZvcXBf/XPleFzWYJFZLdO9CEMivv3/Gf/I3fVo/HPKZeUqRUgCvOA8X # 9S95gWXZqbVr5MfO9sp6AG9LMEQkIjzP7QOllo9ZKby2/QThcJ8ySif9Va8v/rbl # jjO7Yl+a21dA6fHOmWaQjP9qYn/dxUoLkSbiOewZSnFjnXshbcOco6I8+n99lmqQ # eKZt0uGc+R38ONiU9MalCpaGpL2eGq4EQoO4tYCbIjggtSXlZOz39L9+Y1klD3ou # OVd2onGqBooPiRa6YacRy5rYDkeagMXQzafQ732D8OE7cQnfXXSYIghh2rBQHm+9 # 8eEA3+cxB6STOvdlR3jo+KhIq/fecn5ha293qYHLpwmsObvsxsvYgrRyzR30uIUB # HoD7G4kqVDmyW9rIDVWZeodzOwjmmC3qjeAzLhIp9cAvVCch98isTtoouLGp25ay # p0Kiyc8ZQU3ghvkqmqMRZjDTu3QyS99je/WZii8bxyGvWbWu3EQ8l1Bx16HSxVXj # ad5XwdHeMMD9zOZN+w2/XU/pnR4ZOC+8z1gFLu8NoFA12u8JJxzVs341Hgi62jbb # 01+P3nSISRKhggLOMIICNwIBATCB+KGB0KSBzTCByjELMAkGA1UEBhMCVVMxEzAR # BgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1p # Y3Jvc29mdCBDb3Jwb3JhdGlvbjElMCMGA1UECxMcTWljcm9zb2Z0IEFtZXJpY2Eg # T3BlcmF0aW9uczEmMCQGA1UECxMdVGhhbGVzIFRTUyBFU046RTVBNi1FMjdDLTU5 # MkUxJTAjBgNVBAMTHE1pY3Jvc29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAH # BgUrDgMCGgMVAKunwbRBDaHDQEjKi9N8xiUtMGXdoIGDMIGApH4wfDELMAkGA1UE # BhMCVVMxEzARBgNVBAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAc # BgNVBAoTFU1pY3Jvc29mdCBDb3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0 # IFRpbWUtU3RhbXAgUENBIDIwMTAwDQYJKoZIhvcNAQEFBQACBQDj0/t5MCIYDzIw # MjEwMjE1MDM0MTQ1WhgPMjAyMTAyMTYwMzQxNDVaMHcwPQYKKwYBBAGEWQoEATEv # MC0wCgIFAOPT+3kCAQAwCgIBAAICB1ECAf8wBwIBAAICEUAwCgIFAOPVTPkCAQAw # NgYKKwYBBAGEWQoEAjEoMCYwDAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgC # AQACAwGGoDANBgkqhkiG9w0BAQUFAAOBgQAUmJkXyK3j4BHZtV3WKLJMS88VO7sl # yB27q6pPFMM6qkAOicdwEIjuN1oe9/LE+o2mdKriskSC9rcndnjqoXtGhHy/xfbz # y7JZ6NvRpC0d/5Fm7rlUQD9EV8pSUSv8zH525Jj3YnwPZjssUfAMF5PBWpSeyBxV # qxkiMeJbZ6vDADGCAw0wggMJAgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQI # EwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3Nv # ZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBD # QSAyMDEwAhMzAAABR52P8ebeMYNZAAAAAAFHMA0GCWCGSAFlAwQCAQUAoIIBSjAa # BgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEILMR4TDg # i9jaxHgTj5aFJsWpamIxqnfQwIuoeXnSZzbQMIH6BgsqhkiG9w0BCRACLzGB6jCB # 5zCB5DCBvQQge9s8EgOUz7oGyImTv9h9Ya4rAFSLcMw7HG9FqooY6YUwgZgwgYCk # fjB8MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQD # Ex1NaWNyb3NvZnQgVGltZS1TdGFtcCBQQ0EgMjAxMAITMwAAAUedj/Hm3jGDWQAA # AAABRzAiBCAKYqt//7I3fhgilq0rNo3LzkPqy+Xg8agANq7H7fYMRjANBgkqhkiG # 9w0BAQsFAASCAQCGMY265nbKn60nSDbO3Sv/J2i0A4aZknWkWZyU27BSKbMC86yF # 5uJcPijKyxT9DsB+/KfG3qfXvV2UhcuHD7jgpadtriBlmECZ/KAW4hYZuPfLEDV6 # tLjiYQ3qvxfQdeI1nD1XLHVxhH8WaSXGJMhFxqJIUtPl3KDla9TpG+5OLD88RCxL # uJx1LFHw3YJcdEPLfsM+5OhdY7DNnyJvCz6Kem5Mtl07IKcp0+JiEL7+SE5ZrpFk # V3TTf/AhSD23IQovtkkH2plBkoK5iElxD3cKQNRpmvTE3uAaKoY6lq5pWw4J6+VL # 992DFm60wxIB+h0FZGd8wwcE44KOKgwnO3XJ # SIG # End signature block |