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 # MIIjpQYJKoZIhvcNAQcCoIIjljCCI5ICAQExDzANBglghkgBZQMEAgEFADB5Bgor # BgEEAYI3AgEEoGswaTA0BgorBgEEAYI3AgEeMCYCAwEAAAQQH8w7YFlLCE63JNLG # KX7zUQIBAAIBAAIBAAIBAAIBADAxMA0GCWCGSAFlAwQCAQUABCDGDsKLJewq7G4t # V7BCq9xyftmoNV/Q3HwYsxZGy61qGaCCDYUwggYDMIID66ADAgECAhMzAAABiK9S # 1rmSbej5AAAAAAGIMA0GCSqGSIb3DQEBCwUAMH4xCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01pY3Jvc29mdCBDb2RlIFNpZ25p # bmcgUENBIDIwMTEwHhcNMjAwMzA0MTgzOTQ4WhcNMjEwMzAzMTgzOTQ4WjB0MQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMR4wHAYDVQQDExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQCSCNryE+Cewy2m4t/a74wZ7C9YTwv1PyC4BvM/kSWPNs8n0RTe+FvYfU+E9uf0 # t7nYlAzHjK+plif2BhD+NgdhIUQ8sVwWO39tjvQRHjP2//vSvIfmmkRoML1Ihnjs # 9kQiZQzYRDYYRp9xSQYmRwQjk5hl8/U7RgOiQDitVHaU7BT1MI92lfZRuIIDDYBd # vXtbclYJMVOwqZtv0O9zQCret6R+fRSGaDNfEEpcILL+D7RV3M4uaJE4Ta6KAOdv # V+MVaJp1YXFTZPKtpjHO6d9pHQPZiG7NdC6QbnRGmsa48uNQrb6AfmLKDI1Lp31W # MogTaX5tZf+CZT9PSuvjOCLNAgMBAAGjggGCMIIBfjAfBgNVHSUEGDAWBgorBgEE # AYI3TAgBBggrBgEFBQcDAzAdBgNVHQ4EFgQUj9RJL9zNrPcL10RZdMQIXZN7MG8w # VAYDVR0RBE0wS6RJMEcxLTArBgNVBAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJh # dGlvbnMgTGltaXRlZDEWMBQGA1UEBRMNMjMwMDEyKzQ1ODM4NjAfBgNVHSMEGDAW # gBRIbmTlUAXTgqoXNzcitW2oynUClTBUBgNVHR8ETTBLMEmgR6BFhkNodHRwOi8v # d3d3Lm1pY3Jvc29mdC5jb20vcGtpb3BzL2NybC9NaWNDb2RTaWdQQ0EyMDExXzIw # MTEtMDctMDguY3JsMGEGCCsGAQUFBwEBBFUwUzBRBggrBgEFBQcwAoZFaHR0cDov # L3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9jZXJ0cy9NaWNDb2RTaWdQQ0EyMDEx # XzIwMTEtMDctMDguY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQADggIB # ACnXo8hjp7FeT+H6iQlV3CcGnkSbFvIpKYafgzYCFo3UHY1VHYJVb5jHEO8oG26Q # qBELmak6MTI+ra3WKMTGhE1sEIlowTcp4IAs8a5wpCh6Vf4Z/bAtIppP3p3gXk2X # 8UXTc+WxjQYsDkFiSzo/OBa5hkdW1g4EpO43l9mjToBdqEPtIXsZ7Hi1/6y4gK0P # mMiwG8LMpSn0n/oSHGjrUNBgHJPxgs63Slf58QGBznuXiRaXmfTUDdrvhRocdxIM # i8nXQwWACMiQzJSRzBP5S2wUq7nMAqjaTbeXhJqD2SFVHdUYlKruvtPSwbnqSRWT # GI8s4FEXt+TL3w5JnwVZmZkUFoioQDMMjFyaKurdJ6pnzbr1h6QW0R97fWc8xEIz # LIOiU2rjwWAtlQqFO8KNiykjYGyEf5LyAJKAO+rJd9fsYR+VBauIEQoYmjnUbTXM # SY2Lf5KMluWlDOGVh8q6XjmBccpaT+8tCfxpaVYPi1ncnwTwaPQvVq8RjWDRB7Pa # 8ruHgj2HJFi69+hcq7mWx5nTUtzzFa7RSZfE5a1a5AuBmGNRr7f8cNfa01+tiWjV # Kk1a+gJUBSP0sIxecFbVSXTZ7bqeal45XSDIisZBkWb+83TbXdTGMDSUFKTAdtC+ # r35GfsN8QVy59Hb5ZYzAXczhgRmk7NyE6jD0Ym5TKiW5MIIHejCCBWKgAwIBAgIK # YQ6Q0gAAAAAAAzANBgkqhkiG9w0BAQsFADCBiDELMAkGA1UEBhMCVVMxEzARBgNV # BAgTCldhc2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jv # c29mdCBDb3Jwb3JhdGlvbjEyMDAGA1UEAxMpTWljcm9zb2Z0IFJvb3QgQ2VydGlm # aWNhdGUgQXV0aG9yaXR5IDIwMTEwHhcNMTEwNzA4MjA1OTA5WhcNMjYwNzA4MjEw # OTA5WjB+MQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UE # BxMHUmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMSgwJgYD # VQQDEx9NaWNyb3NvZnQgQ29kZSBTaWduaW5nIFBDQSAyMDExMIICIjANBgkqhkiG # 9w0BAQEFAAOCAg8AMIICCgKCAgEAq/D6chAcLq3YbqqCEE00uvK2WCGfQhsqa+la # UKq4BjgaBEm6f8MMHt03a8YS2AvwOMKZBrDIOdUBFDFC04kNeWSHfpRgJGyvnkmc # 6Whe0t+bU7IKLMOv2akrrnoJr9eWWcpgGgXpZnboMlImEi/nqwhQz7NEt13YxC4D # dato88tt8zpcoRb0RrrgOGSsbmQ1eKagYw8t00CT+OPeBw3VXHmlSSnnDb6gE3e+ # lD3v++MrWhAfTVYoonpy4BI6t0le2O3tQ5GD2Xuye4Yb2T6xjF3oiU+EGvKhL1nk # kDstrjNYxbc+/jLTswM9sbKvkjh+0p2ALPVOVpEhNSXDOW5kf1O6nA+tGSOEy/S6 # A4aN91/w0FK/jJSHvMAhdCVfGCi2zCcoOCWYOUo2z3yxkq4cI6epZuxhH2rhKEmd # X4jiJV3TIUs+UsS1Vz8kA/DRelsv1SPjcF0PUUZ3s/gA4bysAoJf28AVs70b1FVL # 5zmhD+kjSbwYuER8ReTBw3J64HLnJN+/RpnF78IcV9uDjexNSTCnq47f7Fufr/zd # sGbiwZeBe+3W7UvnSSmnEyimp31ngOaKYnhfsi+E11ecXL93KCjx7W3DKI8sj0A3 # T8HhhUSJxAlMxdSlQy90lfdu+HggWCwTXWCVmj5PM4TasIgX3p5O9JawvEagbJjS # 4NaIjAsCAwEAAaOCAe0wggHpMBAGCSsGAQQBgjcVAQQDAgEAMB0GA1UdDgQWBBRI # bmTlUAXTgqoXNzcitW2oynUClTAZBgkrBgEEAYI3FAIEDB4KAFMAdQBiAEMAQTAL # BgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBRyLToCMZBD # uRQFTuHqp8cx0SOJNDBaBgNVHR8EUzBRME+gTaBLhklodHRwOi8vY3JsLm1pY3Jv # c29mdC5jb20vcGtpL2NybC9wcm9kdWN0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3JsMF4GCCsGAQUFBwEBBFIwUDBOBggrBgEFBQcwAoZCaHR0cDovL3d3 # dy5taWNyb3NvZnQuY29tL3BraS9jZXJ0cy9NaWNSb29DZXJBdXQyMDExXzIwMTFf # MDNfMjIuY3J0MIGfBgNVHSAEgZcwgZQwgZEGCSsGAQQBgjcuAzCBgzA/BggrBgEF # BQcCARYzaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3BraW9wcy9kb2NzL3ByaW1h # cnljcHMuaHRtMEAGCCsGAQUFBwICMDQeMiAdAEwAZQBnAGEAbABfAHAAbwBsAGkA # YwB5AF8AcwB0AGEAdABlAG0AZQBuAHQALiAdMA0GCSqGSIb3DQEBCwUAA4ICAQBn # 8oalmOBUeRou09h0ZyKbC5YR4WOSmUKWfdJ5DJDBZV8uLD74w3LRbYP+vj/oCso7 # v0epo/Np22O/IjWll11lhJB9i0ZQVdgMknzSGksc8zxCi1LQsP1r4z4HLimb5j0b # pdS1HXeUOeLpZMlEPXh6I/MTfaaQdION9MsmAkYqwooQu6SpBQyb7Wj6aC6VoCo/ # KmtYSWMfCWluWpiW5IP0wI/zRive/DvQvTXvbiWu5a8n7dDd8w6vmSiXmE0OPQvy # CInWH8MyGOLwxS3OW560STkKxgrCxq2u5bLZ2xWIUUVYODJxJxp/sfQn+N4sOiBp # mLJZiWhub6e3dMNABQamASooPoI/E01mC8CzTfXhj38cbxV9Rad25UAqZaPDXVJi # hsMdYzaXht/a8/jyFqGaJ+HNpZfQ7l1jQeNbB5yHPgZ3BtEGsXUfFL5hYbXw3MYb # BL7fQccOKO7eZS/sl/ahXJbYANahRr1Z85elCUtIEJmAH9AAKcWxm6U/RXceNcbS # oqKfenoi+kiVH6v7RyOA9Z74v2u3S5fi63V4GuzqN5l5GEv/1rMjaHXmr/r8i+sL # gOppO6/8MO0ETI7f33VtY5E90Z1WTk+/gFcioXgRMiF670EKsT/7qMykXcGhiJtX # cVZOSEXAQsmbdlsKgEhr/Xmfwb1tbWrJUnMTDXpQzTGCFXYwghVyAgEBMIGVMH4x # CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRt # b25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xKDAmBgNVBAMTH01p # Y3Jvc29mdCBDb2RlIFNpZ25pbmcgUENBIDIwMTECEzMAAAGIr1LWuZJt6PkAAAAA # AYgwDQYJYIZIAWUDBAIBBQCggbAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQw # HAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUwLwYJKoZIhvcNAQkEMSIEIJXp # Lmgbm5n58M6k6INRWn/98CV0H9NojX2hyDrqnVIbMEQGCisGAQQBgjcCAQwxNjA0 # oBSAEgBNAGkAYwByAG8AcwBvAGYAdKEcgBpodHRwczovL3d3dy5taWNyb3NvZnQu # Y29tIDANBgkqhkiG9w0BAQEFAASCAQAcc/OQFP2iRU4Cp4zzRSyUKzP46SgJyyFK # jnO9r2s0TLiztqIkv0Lx+sCbC8N5ekjPBxpBrpfmp97soPN+PhYyIv+wPRA+irHh # 9iftWTUvlr3G2ZhU/RW5nZt1ua+AeqWeHKPLVXYuGQVpz7fofoSR/6fz7dTp+aNf # HHRRi2tjT9Se8IxqXYBEuTE/3tlqEo4CCNJbz0C7wxsWVwsv8N4Ct8yERoaRsnO9 # YYEyuGCXgXwzdhMJ27ZRe5OtLohyDKjH0Fqr4QzHnqNCF50yUKLLO1DZ7AhPUCEi # ByGRYiW2w71mdcgBt+OToJM2W+20HCk98IEwtjAIytQECK0NKR7zoYIS/jCCEvoG # CisGAQQBgjcDAwExghLqMIIS5gYJKoZIhvcNAQcCoIIS1zCCEtMCAQMxDzANBglg # hkgBZQMEAgEFADCCAVkGCyqGSIb3DQEJEAEEoIIBSASCAUQwggFAAgEBBgorBgEE # AYRZCgMBMDEwDQYJYIZIAWUDBAIBBQAEIFuH49NAFK41d61J721g+N9hpHv15uLY # FT++2vOP5lrTAgZgDv9zAJAYEzIwMjEwMTI4MDk0NzQ1LjA0OFowBIACAfSggdik # gdUwgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV # BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UE # CxMdVGhhbGVzIFRTUyBFU046RDA4Mi00QkZELUVFQkExJTAjBgNVBAMTHE1pY3Jv # c29mdCBUaW1lLVN0YW1wIFNlcnZpY2Wggg5NMIIE+TCCA+GgAwIBAgITMwAAAUGv # f1KXXPLcRQAAAAABQTANBgkqhkiG9w0BAQsFADB8MQswCQYDVQQGEwJVUzETMBEG # A1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMVTWlj # cm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1TdGFt # cCBQQ0EgMjAxMDAeFw0yMDEwMTUxNzI4MjdaFw0yMjAxMTIxNzI4MjdaMIHSMQsw # CQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9u # ZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMS0wKwYDVQQLEyRNaWNy # b3NvZnQgSXJlbGFuZCBPcGVyYXRpb25zIExpbWl0ZWQxJjAkBgNVBAsTHVRoYWxl # cyBUU1MgRVNOOkQwODItNEJGRC1FRUJBMSUwIwYDVQQDExxNaWNyb3NvZnQgVGlt # ZS1TdGFtcCBTZXJ2aWNlMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA # 8irLqL28dal+PJUmUJOwvYn/sOCEzQzZyj94XbFPtRhDhPjagvvKOv1GgMoOuXvk # pM3uM5E67vyOCPxqhTAzq7Ak3zkEXXBv7JoM8Xm0x5UcnAkpUiEo0eycRl6bnYIB # 3KlZW3uz4Jc2v2FV0KCGkLrvqfKP8V/i2hVyN854OejWpx8wGUazM4CYUVowcgED # c76OY+Xa4W27DCZJm2f9ol4BjSL+b2L/T8n/LEGknaUxwSQTN1LQCt+uBDCASd6V # QR5CLLJVt6MBL0W1NlaWxEAJwlIdyBnS1ihLvRg1jc/KUZe0sRFdD3fhKrjPac3h # oy007Fvr6Go0WJ4pr2rJdQIDAQABo4IBGzCCARcwHQYDVR0OBBYEFC0oPyxuLpD9 # RXBr9c8NO0EFEsbEMB8GA1UdIwQYMBaAFNVjOlyKMZDzQ3t8RhvFM2hahW1VMFYG # A1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwubWljcm9zb2Z0LmNvbS9wa2kvY3Js # L3Byb2R1Y3RzL01pY1RpbVN0YVBDQV8yMDEwLTA3LTAxLmNybDBaBggrBgEFBQcB # AQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9wa2kv # Y2VydHMvTWljVGltU3RhUENBXzIwMTAtMDctMDEuY3J0MAwGA1UdEwEB/wQCMAAw # EwYDVR0lBAwwCgYIKwYBBQUHAwgwDQYJKoZIhvcNAQELBQADggEBAFJ63yJ92Chq # CgpexD48okviGuC4ikNsvmwlCSet1sFpvJEzLJB8cTF4z4qQTz8AsQtcew6mAVmQ # CYDu9f5ee11xXj1LwHYsZGnSs/OfRul1VKmY51OQpqvK5O/Ct4fs0Iblzo8eyOLJ # ygTk97aXVA4Uzq8GblL7LQ5XiwAY446MOALnNXFo/Kq9tvzipwY1YcRn/nlMQ+b9 # 2OiLLmHVMi2wAUORiKFvaAfYWjhQd+2qHLMsdpNluwBbWe7FF5ABsDo0HROMWyCg # xdLQ3vqr3DMSH3ZWKiirFsvWJmchfZPGRObwqszvSXPFmPBZ9o+er+4UoLV+50GW # nnQky7HVgLkwggZxMIIEWaADAgECAgphCYEqAAAAAAACMA0GCSqGSIb3DQEBCwUA # MIGIMQswCQYDVQQGEwJVUzETMBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMH # UmVkbW9uZDEeMBwGA1UEChMVTWljcm9zb2Z0IENvcnBvcmF0aW9uMTIwMAYDVQQD # EylNaWNyb3NvZnQgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgMjAxMDAeFw0x # MDA3MDEyMTM2NTVaFw0yNTA3MDEyMTQ2NTVaMHwxCzAJBgNVBAYTAlVTMRMwEQYD # VQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNy # b3NvZnQgQ29ycG9yYXRpb24xJjAkBgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1w # IFBDQSAyMDEwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqR0NvHcR # ijog7PwTl/X6f2mUa3RUENWlCgCChfvtfGhLLF/Fw+Vhwna3PmYrW/AVUycEMR9B # GxqVHc4JE458YTBZsTBED/FgiIRUQwzXTbg4CLNC3ZOs1nMwVyaCo0UN0Or1R4HN # vyRgMlhgRvJYR4YyhB50YWeRX4FUsc+TTJLBxKZd0WETbijGGvmGgLvfYfxGwScd # JGcSchohiq9LZIlQYrFd/XcfPfBXday9ikJNQFHRD5wGPmd/9WbAA5ZEfu/QS/1u # 5ZrKsajyeioKMfDaTgaRtogINeh4HLDpmc085y9Euqf03GS9pAHBIAmTeM38vMDJ # RF1eFpwBBU8iTQIDAQABo4IB5jCCAeIwEAYJKwYBBAGCNxUBBAMCAQAwHQYDVR0O # BBYEFNVjOlyKMZDzQ3t8RhvFM2hahW1VMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIA # QwBBMAsGA1UdDwQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNX2 # VsuP6KJcYmjRPZSQW9fOmhjEMFYGA1UdHwRPME0wS6BJoEeGRWh0dHA6Ly9jcmwu # bWljcm9zb2Z0LmNvbS9wa2kvY3JsL3Byb2R1Y3RzL01pY1Jvb0NlckF1dF8yMDEw # LTA2LTIzLmNybDBaBggrBgEFBQcBAQROMEwwSgYIKwYBBQUHMAKGPmh0dHA6Ly93 # d3cubWljcm9zb2Z0LmNvbS9wa2kvY2VydHMvTWljUm9vQ2VyQXV0XzIwMTAtMDYt # MjMuY3J0MIGgBgNVHSABAf8EgZUwgZIwgY8GCSsGAQQBgjcuAzCBgTA9BggrBgEF # BQcCARYxaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL1BLSS9kb2NzL0NQUy9kZWZh # dWx0Lmh0bTBABggrBgEFBQcCAjA0HjIgHQBMAGUAZwBhAGwAXwBQAG8AbABpAGMA # eQBfAFMAdABhAHQAZQBtAGUAbgB0AC4gHTANBgkqhkiG9w0BAQsFAAOCAgEAB+aI # UQ3ixuCYP4FxAz2do6Ehb7Prpsz1Mb7PBeKp/vpXbRkws8LFZslq3/Xn8Hi9x6ie # JeP5vO1rVFcIK1GCRBL7uVOMzPRgEop2zEBAQZvcXBf/XPleFzWYJFZLdO9CEMiv # v3/Gf/I3fVo/HPKZeUqRUgCvOA8X9S95gWXZqbVr5MfO9sp6AG9LMEQkIjzP7QOl # lo9ZKby2/QThcJ8ySif9Va8v/rbljjO7Yl+a21dA6fHOmWaQjP9qYn/dxUoLkSbi # OewZSnFjnXshbcOco6I8+n99lmqQeKZt0uGc+R38ONiU9MalCpaGpL2eGq4EQoO4 # tYCbIjggtSXlZOz39L9+Y1klD3ouOVd2onGqBooPiRa6YacRy5rYDkeagMXQzafQ # 732D8OE7cQnfXXSYIghh2rBQHm+98eEA3+cxB6STOvdlR3jo+KhIq/fecn5ha293 # qYHLpwmsObvsxsvYgrRyzR30uIUBHoD7G4kqVDmyW9rIDVWZeodzOwjmmC3qjeAz # LhIp9cAvVCch98isTtoouLGp25ayp0Kiyc8ZQU3ghvkqmqMRZjDTu3QyS99je/WZ # ii8bxyGvWbWu3EQ8l1Bx16HSxVXjad5XwdHeMMD9zOZN+w2/XU/pnR4ZOC+8z1gF # Lu8NoFA12u8JJxzVs341Hgi62jbb01+P3nSISRKhggLXMIICQAIBATCCAQChgdik # gdUwgdIxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYDVQQH # EwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xLTArBgNV # BAsTJE1pY3Jvc29mdCBJcmVsYW5kIE9wZXJhdGlvbnMgTGltaXRlZDEmMCQGA1UE # CxMdVGhhbGVzIFRTUyBFU046RDA4Mi00QkZELUVFQkExJTAjBgNVBAMTHE1pY3Jv # c29mdCBUaW1lLVN0YW1wIFNlcnZpY2WiIwoBATAHBgUrDgMCGgMVAKrlvym1CquI # oQcrzncLvkD1WpUDoIGDMIGApH4wfDELMAkGA1UEBhMCVVMxEzARBgNVBAgTCldh # c2hpbmd0b24xEDAOBgNVBAcTB1JlZG1vbmQxHjAcBgNVBAoTFU1pY3Jvc29mdCBD # b3Jwb3JhdGlvbjEmMCQGA1UEAxMdTWljcm9zb2Z0IFRpbWUtU3RhbXAgUENBIDIw # MTAwDQYJKoZIhvcNAQEFBQACBQDjvMmaMCIYDzIwMjEwMTI4MTMyNjUwWhgPMjAy # MTAxMjkxMzI2NTBaMHcwPQYKKwYBBAGEWQoEATEvMC0wCgIFAOO8yZoCAQAwCgIB # AAICF7MCAf8wBwIBAAICEakwCgIFAOO+GxoCAQAwNgYKKwYBBAGEWQoEAjEoMCYw # DAYKKwYBBAGEWQoDAqAKMAgCAQACAwehIKEKMAgCAQACAwGGoDANBgkqhkiG9w0B # AQUFAAOBgQCos9W9P+Ck0b6o3rPW8FFyAwszTcyuvx/TxmPmmoAyoIYpm9oqFHM7 # i3FZdJHliltoxbDI0EFMaXYGpesi/K6yhJOJJkZMS3o3/8NSELbJlJXijSIw/u+6 # 6jhLulDA/ZcIqMj3ryp7uyc12XR8FgT7j7WzTkJyVf8uZyEtCpOTTjGCAw0wggMJ # AgEBMIGTMHwxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpXYXNoaW5ndG9uMRAwDgYD # VQQHEwdSZWRtb25kMR4wHAYDVQQKExVNaWNyb3NvZnQgQ29ycG9yYXRpb24xJjAk # BgNVBAMTHU1pY3Jvc29mdCBUaW1lLVN0YW1wIFBDQSAyMDEwAhMzAAABQa9/Updc # 8txFAAAAAAFBMA0GCWCGSAFlAwQCAQUAoIIBSjAaBgkqhkiG9w0BCQMxDQYLKoZI # hvcNAQkQAQQwLwYJKoZIhvcNAQkEMSIEIPvjAQmK0Xr4t/FhC8v3xHqCzV7QUe3c # oiWNu4L7fpvUMIH6BgsqhkiG9w0BCRACLzGB6jCB5zCB5DCBvQQgUT8BPIzqc3Se # cHRPLKBtW0vOOnT+78haWo+XcxVerd4wgZgwgYCkfjB8MQswCQYDVQQGEwJVUzET # MBEGA1UECBMKV2FzaGluZ3RvbjEQMA4GA1UEBxMHUmVkbW9uZDEeMBwGA1UEChMV # TWljcm9zb2Z0IENvcnBvcmF0aW9uMSYwJAYDVQQDEx1NaWNyb3NvZnQgVGltZS1T # dGFtcCBQQ0EgMjAxMAITMwAAAUGvf1KXXPLcRQAAAAABQTAiBCBvrqt/mac0wRR8 # zHvKuA/IvzePCgYniQnv9KT3YtYGpzANBgkqhkiG9w0BAQsFAASCAQCH+mCouAnO # 6D8nMXFWRuKzFDYptJUAct4spqjyuTUukCCD45iQXJuGcrUv//evcLW/xh/+r92w # qVPhTmaqYRf/k1i0pwGFRSLdma6nCaK7MlGEvjYw0kf509MD8gI6eyc/KPLssN8t # M5rVm9Ayl2MXFJNXKZNewlPp2Z7eXt/Bkj8vFlPDkVFlkAzN839iGpiOu+mi359I # nWu5ys3nSf332KZCI1cLtF2diNZns3Y0vxPg6l/H3lXckK2P4IW8lVcYxG/Dye2l # kABrX4JwRvMDFkzHYaKVwbPnhgBI3O8fAaV1jkFPlsQwpogCcZgGQk696mwP8qkK # tco67ferbC9Q # SIG # End signature block |