Remove-Node.ps1

function Remove-Node {
<#
.SYNOPSIS
Removes a Node entry from the inventory.
 
 
.DESCRIPTION
Removes a Node entry from the inventory.
 
The Cmdlet lets you remove an existing Node entry from the Node inventory.
 
 
.INPUTS
The Cmdlet can either remove entities by id, by name or by object reference.
 
 
.OUTPUTS
default | json | json-pretty | xml | xml-pretty
 
 
.EXAMPLE
PS > Remove-Node $node
 
Removes the Node '$node' from the inventory.
 
.EXAMPLE
PS > Remove-Node -Id 42
 
Removes the Node with Id 42 from the inventory.
 
.EXAMPLE
PS > Remove-Node -Name 'ArbitraryName'
 
Removes the Node with Name 'ArbitraryName' from the inventory.
 
 
.LINK
Online Version: http://dfch.biz/biz/dfch/PS/Appclusive/Client/Remove-Node/
 
 
.NOTES
See module manifest for required software versions and dependencies.
#>

[CmdletBinding(
    SupportsShouldProcess = $true
    ,
    ConfirmImpact = 'High'
    ,
    HelpURI = 'http://dfch.biz/biz/dfch/PS/Appclusive/Client/Remove-Node/'
    ,
    DefaultParameterSetName = 'o'
)]
Param 
(
    # The id of the Node to remove
    [Parameter(Mandatory = $true, Position = 0, ParameterSetName = 'id')]
    [int] $Id
    ,
    # The name of the Node to remove
    [Parameter(Mandatory = $true, Position = 0, ParameterSetName = 'name')]
    [string] $Name
    ,
    # Specifies the Node to remove
    [Parameter(Mandatory = $true, ValueFromPipeline = $true, Position = 0, ParameterSetName = 'o')]
    [Alias("Entity")]
    $InputObject
    ,
    # Service reference to Appclusive
    [Parameter(Mandatory = $false, Position = 1)]
    [Alias('Services')]
    [hashtable] $svc = (Get-Variable -Name $MyInvocation.MyCommand.Module.PrivateData.MODULEVAR -ValueOnly).Services
    ,
    # Specifies the return format of the Cnmdlet
    [ValidateSet('default', 'json', 'json-pretty', 'xml', 'xml-pretty')]
    [Parameter(Mandatory = $false, Position = 2)]
    [alias('ReturnFormat')]
    [string] $As = 'default'
)

Begin 
{
    trap { Log-Exception $_; break; }

    $datBegin = [datetime]::Now;
    [string] $fn = $MyInvocation.MyCommand.Name;
    Log-Debug -fn $fn -msg ("CALL. svc '{0}'. Name '{1}'." -f ($svc -is [Object]), $Name) -fac 1;

    # Parameter validation
    Contract-Requires ($svc.Core -is [biz.dfch.CS.Appclusive.Api.Core.Core]) "Connect to the server before using the Cmdlet"
}
# Begin

Process 
{
    trap { Log-Exception $_; break; }

    # Default test variable for checking function response codes.
    [Boolean] $fReturn = $false;
    # Return values are always and only returned via OutputParameter.
    $OutputParameter = $null;

    if($PSCmdlet.ParameterSetName -eq 'id')
    {
        $InputObject = Get-Node -Id $Id -svc $svc;
    }
    if($PSCmdlet.ParameterSetName -eq 'name')
    {
        $InputObject = Get-Node -Name $Name -svc $svc;
    }
    $r = @();
    
    $objectFoundToBeRemoved = $false;
    foreach($item in $InputObject)
    {
        $bShouldProcess = $false;
        
        # Node entity
        $objectFoundToBeRemoved = $true;
        $itemString = '{0}' -f $item.Name;
        $bShouldProcess = $PSCmdlet.ShouldProcess($itemString);
        if(!$bShouldProcess) { break; };
        
        # ChildNodes
        $childNodes = Get-Node -ParentId $item.Id -svc $svc;
        foreach($childNode in $childNodes)
        {
            $itemString = "Referenced ChildNode '{0}'" -f $childNode.Name;
            $bShouldProcess = $PSCmdlet.ShouldProcess($itemString);
            if(!$bShouldProcess) { break; };
            
            $r += Remove-Node -Id $childNode.Id -svc $svc;
        }
        if(!$bShouldProcess) { break; };

        # ExternalNode entity
        $externalNodes = Get-Node -Id $item.Id -svc $svc -ExpandExternalNodes;
        foreach($externalNode in $externalNodes)
        {
            $itemString = "Referenced ExternalNode '{0}' of Type '{1}'" -f $externalNode.Name, $externalNode.ExternalType;
            $bShouldProcess = $PSCmdlet.ShouldProcess($itemString);
            if(!$bShouldProcess) { break; };

            # ExternalNodeAttributes
            $externalNodeAttributes = Get-ExternalNode -Id $externalNode.Id -svc $svc -ExpandAttributes;
            foreach($externalNodeAttribute in $externalNodeAttributes)
            {
                $itemString = "Referenced ExternalNodeAttribute '{0}', '{1}'" -f $externalNodeAttribute.Name, $externalNodeAttribute.Description;
                $bShouldProcess = $PSCmdlet.ShouldProcess($itemString);
                if(!$bShouldProcess) { break; };

                $r += ($externalNodeAttribute | Select -Property @{ Name="Name"; Expression={'{0} (ExternalNodeAttribute)' -f $item.Name}}, Id);
                Log-Notice $fn ("Removing ref ExternalNodeAttribute '{0}' ..." -f $externalNodeAttribute.Id);
                $svc.Core.DeleteObject($externalNodeAttribute);        
                $null = $svc.Core.SaveChanges();
            }
            if(!$bShouldProcess) { break; };
            
            $r += ($externalNode | Select -Property @{ Name="Name"; Expression={'{0} (ExternalNode)' -f $item.Name}}, Id);
            Log-Notice $fn ("Removing ref ExternalNode '{0}' ..." -f $externalNode.Id);
            $svc.Core.DeleteObject($externalNode);        
            $null = $svc.Core.SaveChanges();
        }
        if(!$bShouldProcess) { break; };

        # Job entity
        # $jobentity = Get-Node -Id $item.Id -svc $svc -ExpandJob;
        # Workaroud because singele action status does not work properly
        $jobentity = $svc.Core.Jobs.AddQueryOption('$filter',("RefId eq '{0}'" -f $item.Id)) | Select;
        if ($jobentity)
        {
            $itemString = "Referenced Job '{0}' in Status '{1}'" -f $jobentity.Id, $jobentity.Status;
            $bShouldProcess = $PSCmdlet.ShouldProcess($itemString);
            if(!$bShouldProcess) { break; };

            # ChildJobs
            $jobChilds = Get-Job -ParentId $jobentity.Id -svc $svc;
            foreach($jobChild in $jobChilds)
            {
                $itemString = "Referenced ChildJob '{0}' in Status '{1}'" -f $jobChild.Id, $jobChild.Status;
                $bShouldProcess = $PSCmdlet.ShouldProcess($itemString);
                if(!$bShouldProcess) { break; };
                
                $r += ($jobChild | Select -Property @{ Name="Name"; Expression={'{0} (ChildJob)' -f $item.Name}}, Id);
                Log-Notice $fn ("Removing ref ChildJob '{0}' ..." -f $jobChild.Id);
                $svc.Core.DeleteObject($jobChild);        
                $null = $svc.Core.SaveChanges();
            }
            if(!$bShouldProcess) { break; };
            
            $r += ($jobentity | Select -Property @{ Name="Name"; Expression={'{0} (Job)' -f $item.Name}}, Id);
            Log-Notice $fn ("Removing ref Job '{0}' ..." -f $jobentity.Id);
            $svc.Core.DeleteObject($jobentity);        
            $null = $svc.Core.SaveChanges();                
        }
        if(!$bShouldProcess) { break; };
    
        # Node entity
        $r += ($item | Select -Property Name, Id);
        Log-Notice $fn ("Removing '{0}' ..." -f $itemString);
        $svc.Core.DeleteObject($item);
        $null = $svc.Core.SaveChanges();
    }
    Contract-Assert ($objectFoundToBeRemoved)

    $OutputParameter = Format-ResultAs $r $As;
    $fReturn = $true;
}
# Process

End 
{
$datEnd = [datetime]::Now;
Log-Debug -fn $fn -msg ("RET. fReturn: [{0}]. Execution time: [{1}]ms. Started: [{2}]." -f $fReturn, ($datEnd - $datBegin).TotalMilliseconds, $datBegin.ToString('yyyy-MM-dd HH:mm:ss.fffzzz')) -fac 2;

# Return values are always and only returned via OutputParameter.
return $OutputParameter;
}
# End

}
if($MyInvocation.ScriptName) { Export-ModuleMember -Function Remove-Node; } 

#
# Copyright 2014-2015 d-fens GmbH
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# SIG # Begin signature block
# MIIXDwYJKoZIhvcNAQcCoIIXADCCFvwCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUxUjfEvzYYEVI+IwrTgkSaNeN
# d9ugghHCMIIEFDCCAvygAwIBAgILBAAAAAABL07hUtcwDQYJKoZIhvcNAQEFBQAw
# VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
# BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xMTA0
# MTMxMDAwMDBaFw0yODAxMjgxMjAwMDBaMFIxCzAJBgNVBAYTAkJFMRkwFwYDVQQK
# ExBHbG9iYWxTaWduIG52LXNhMSgwJgYDVQQDEx9HbG9iYWxTaWduIFRpbWVzdGFt
# cGluZyBDQSAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlO9l
# +LVXn6BTDTQG6wkft0cYasvwW+T/J6U00feJGr+esc0SQW5m1IGghYtkWkYvmaCN
# d7HivFzdItdqZ9C76Mp03otPDbBS5ZBb60cO8eefnAuQZT4XljBFcm05oRc2yrmg
# jBtPCBn2gTGtYRakYua0QJ7D/PuV9vu1LpWBmODvxevYAll4d/eq41JrUJEpxfz3
# zZNl0mBhIvIG+zLdFlH6Dv2KMPAXCae78wSuq5DnbN96qfTvxGInX2+ZbTh0qhGL
# 2t/HFEzphbLswn1KJo/nVrqm4M+SU4B09APsaLJgvIQgAIMboe60dAXBKY5i0Eex
# +vBTzBj5Ljv5cH60JQIDAQABo4HlMIHiMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMB
# Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRG2D7/3OO+/4Pm9IWbsN1q1hSpwTBHBgNV
# HSAEQDA+MDwGBFUdIAAwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFs
# c2lnbi5jb20vcmVwb3NpdG9yeS8wMwYDVR0fBCwwKjAooCagJIYiaHR0cDovL2Ny
# bC5nbG9iYWxzaWduLm5ldC9yb290LmNybDAfBgNVHSMEGDAWgBRge2YaRQ2XyolQ
# L30EzTSo//z9SzANBgkqhkiG9w0BAQUFAAOCAQEATl5WkB5GtNlJMfO7FzkoG8IW
# 3f1B3AkFBJtvsqKa1pkuQJkAVbXqP6UgdtOGNNQXzFU6x4Lu76i6vNgGnxVQ380W
# e1I6AtcZGv2v8Hhc4EvFGN86JB7arLipWAQCBzDbsBJe/jG+8ARI9PBw+DpeVoPP
# PfsNvPTF7ZedudTbpSeE4zibi6c1hkQgpDttpGoLoYP9KOva7yj2zIhd+wo7AKvg
# IeviLzVsD440RZfroveZMzV+y5qKu0VN5z+fwtmK+mWybsd+Zf/okuEsMaL3sCc2
# SI8mbzvuTXYfecPlf5Y1vC0OzAGwjn//UYCAp5LUs0RGZIyHTxZjBzFLY7Df8zCC
# BCkwggMRoAMCAQICCwQAAAAAATGJxjfoMA0GCSqGSIb3DQEBCwUAMEwxIDAeBgNV
# BAsTF0dsb2JhbFNpZ24gUm9vdCBDQSAtIFIzMRMwEQYDVQQKEwpHbG9iYWxTaWdu
# MRMwEQYDVQQDEwpHbG9iYWxTaWduMB4XDTExMDgwMjEwMDAwMFoXDTE5MDgwMjEw
# MDAwMFowWjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
# MDAuBgNVBAMTJ0dsb2JhbFNpZ24gQ29kZVNpZ25pbmcgQ0EgLSBTSEEyNTYgLSBH
# MjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKPv0Z8p6djTgnY8YqDS
# SdYWHvHP8NC6SEMDLacd8gE0SaQQ6WIT9BP0FoO11VdCSIYrlViH6igEdMtyEQ9h
# JuH6HGEVxyibTQuCDyYrkDqW7aTQaymc9WGI5qRXb+70cNCNF97mZnZfdB5eDFM4
# XZD03zAtGxPReZhUGks4BPQHxCMD05LL94BdqpxWBkQtQUxItC3sNZKaxpXX9c6Q
# MeJ2s2G48XVXQqw7zivIkEnotybPuwyJy9DDo2qhydXjnFMrVyb+Vpp2/WFGomDs
# KUZH8s3ggmLGBFrn7U5AXEgGfZ1f53TJnoRlDVve3NMkHLQUEeurv8QfpLqZ0BdY
# Nc0CAwEAAaOB/TCB+jAOBgNVHQ8BAf8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIB
# ADAdBgNVHQ4EFgQUGUq4WuRNMaUU5V7sL6Mc+oCMMmswRwYDVR0gBEAwPjA8BgRV
# HSAAMDQwMgYIKwYBBQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3Jl
# cG9zaXRvcnkvMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwuZ2xvYmFsc2ln
# bi5uZXQvcm9vdC1yMy5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwMwHwYDVR0jBBgw
# FoAUj/BLf6guRSSuTVD6Y5qL3uLdG7wwDQYJKoZIhvcNAQELBQADggEBAHmwaTTi
# BYf2/tRgLC+GeTQD4LEHkwyEXPnk3GzPbrXsCly6C9BoMS4/ZL0Pgmtmd4F/ximl
# F9jwiU2DJBH2bv6d4UgKKKDieySApOzCmgDXsG1szYjVFXjPE/mIpXNNwTYr3MvO
# 23580ovvL72zT006rbtibiiTxAzL2ebK4BEClAOwvT+UKFaQHlPCJ9XJPM0aYx6C
# WRW2QMqngarDVa8z0bV16AnqRwhIIvtdG/Mseml+xddaXlYzPK1X6JMlQsPSXnE7
# ShxU7alVrCgFx8RsXdw8k/ZpPIJRzhoVPV4Bc/9Aouq0rtOO+u5dbEfHQfXUVlfy
# GDcy1tTMS/Zx4HYwggSfMIIDh6ADAgECAhIRIdaZp2SXPvH4Qn7pGcxTQRQwDQYJ
# KoZIhvcNAQEFBQAwUjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24g
# bnYtc2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzIw
# HhcNMTYwNTI0MDAwMDAwWhcNMjcwNjI0MDAwMDAwWjBgMQswCQYDVQQGEwJTRzEf
# MB0GA1UEChMWR01PIEdsb2JhbFNpZ24gUHRlIEx0ZDEwMC4GA1UEAxMnR2xvYmFs
# U2lnbiBUU0EgZm9yIE1TIEF1dGhlbnRpY29kZSAtIEcyMIIBIjANBgkqhkiG9w0B
# AQEFAAOCAQ8AMIIBCgKCAQEAsBeuotO2BDBWHlgPse1VpNZUy9j2czrsXV6rJf02
# pfqEw2FAxUa1WVI7QqIuXxNiEKlb5nPWkiWxfSPjBrOHOg5D8NcAiVOiETFSKG5d
# QHI88gl3p0mSl9RskKB2p/243LOd8gdgLE9YmABr0xVU4Prd/4AsXximmP/Uq+yh
# RVmyLm9iXeDZGayLV5yoJivZF6UQ0kcIGnAsM4t/aIAqtaFda92NAgIpA6p8N7u7
# KU49U5OzpvqP0liTFUy5LauAo6Ml+6/3CGSwekQPXBDXX2E3qk5r09JTJZ2Cc/os
# +XKwqRk5KlD6qdA8OsroW+/1X1H0+QrZlzXeaoXmIwRCrwIDAQABo4IBXzCCAVsw
# DgYDVR0PAQH/BAQDAgeAMEwGA1UdIARFMEMwQQYJKwYBBAGgMgEeMDQwMgYIKwYB
# BQUHAgEWJmh0dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMAkG
# A1UdEwQCMAAwFgYDVR0lAQH/BAwwCgYIKwYBBQUHAwgwQgYDVR0fBDswOTA3oDWg
# M4YxaHR0cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc3RpbWVzdGFtcGluZ2cy
# LmNybDBUBggrBgEFBQcBAQRIMEYwRAYIKwYBBQUHMAKGOGh0dHA6Ly9zZWN1cmUu
# Z2xvYmFsc2lnbi5jb20vY2FjZXJ0L2dzdGltZXN0YW1waW5nZzIuY3J0MB0GA1Ud
# DgQWBBTUooRKOFoYf7pPMFC9ndV6h9YJ9zAfBgNVHSMEGDAWgBRG2D7/3OO+/4Pm
# 9IWbsN1q1hSpwTANBgkqhkiG9w0BAQUFAAOCAQEAj6kakW0EpjcgDoOW3iPTa24f
# bt1kPWghIrX4RzZpjuGlRcckoiK3KQnMVFquxrzNY46zPVBI5bTMrs2SjZ4oixNK
# Eaq9o+/Tsjb8tKFyv22XY3mMRLxwL37zvN2CU6sa9uv6HJe8tjecpBwwvKu8LUc2
# 35IgA+hxxlj2dQWaNPALWVqCRDSqgOQvhPZHXZbJtsrKnbemuuRQ09Q3uLogDtDT
# kipbxFm7oW3bPM5EncE4Kq3jjb3NCXcaEL5nCgI2ZIi5sxsm7ueeYMRGqLxhM2zP
# TrmcuWrwnzf+tT1PmtNN/94gjk6Xpv2fCbxNyhh2ybBNhVDygNIdBvVYBAexGDCC
# BNYwggO+oAMCAQICEhEhDRayW4wRltP+V8mGEea62TANBgkqhkiG9w0BAQsFADBa
# MQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTEwMC4GA1UE
# AxMnR2xvYmFsU2lnbiBDb2RlU2lnbmluZyBDQSAtIFNIQTI1NiAtIEcyMB4XDTE1
# MDUwNDE2NDMyMVoXDTE4MDUwNDE2NDMyMVowVTELMAkGA1UEBhMCQ0gxDDAKBgNV
# BAgTA1p1ZzEMMAoGA1UEBxMDWnVnMRQwEgYDVQQKEwtkLWZlbnMgR21iSDEUMBIG
# A1UEAxMLZC1mZW5zIEdtYkgwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
# AQDNPSzSNPylU9jFM78Q/GjzB7N+VNqikf/use7p8mpnBZ4cf5b4qV3rqQd62rJH
# RlAsxgouCSNQrl8xxfg6/t/I02kPvrzsR4xnDgMiVCqVRAeQsWebafWdTvWmONBS
# lxJejPP8TSgXMKFaDa+2HleTycTBYSoErAZSWpQ0NqF9zBadjsJRVatQuPkTDrwL
# eWibiyOipK9fcNoQpl5ll5H9EG668YJR3fqX9o0TQTkOmxXIL3IJ0UxdpyDpLEkt
# tBG6Y5wAdpF2dQX2phrfFNVY54JOGtuBkNGMSiLFzTkBA1fOlA6ICMYjB8xIFxVv
# rN1tYojCrqYkKMOjwWQz5X8zAgMBAAGjggGZMIIBlTAOBgNVHQ8BAf8EBAMCB4Aw
# TAYDVR0gBEUwQzBBBgkrBgEEAaAyATIwNDAyBggrBgEFBQcCARYmaHR0cHM6Ly93
# d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9yeS8wCQYDVR0TBAIwADATBgNVHSUE
# DDAKBggrBgEFBQcDAzBCBgNVHR8EOzA5MDegNaAzhjFodHRwOi8vY3JsLmdsb2Jh
# bHNpZ24uY29tL2dzL2dzY29kZXNpZ25zaGEyZzIuY3JsMIGQBggrBgEFBQcBAQSB
# gzCBgDBEBggrBgEFBQcwAoY4aHR0cDovL3NlY3VyZS5nbG9iYWxzaWduLmNvbS9j
# YWNlcnQvZ3Njb2Rlc2lnbnNoYTJnMi5jcnQwOAYIKwYBBQUHMAGGLGh0dHA6Ly9v
# Y3NwMi5nbG9iYWxzaWduLmNvbS9nc2NvZGVzaWduc2hhMmcyMB0GA1UdDgQWBBTN
# GDddiIYZy9p3Z84iSIMd27rtUDAfBgNVHSMEGDAWgBQZSrha5E0xpRTlXuwvoxz6
# gIwyazANBgkqhkiG9w0BAQsFAAOCAQEAAApsOzSX1alF00fTeijB/aIthO3UB0ks
# 1Gg3xoKQC1iEQmFG/qlFLiufs52kRPN7L0a7ClNH3iQpaH5IEaUENT9cNEXdKTBG
# 8OrJS8lrDJXImgNEgtSwz0B40h7bM2Z+0DvXDvpmfyM2NwHF/nNVj7NzmczrLRqN
# 9de3tV0pgRqnIYordVcmb24CZl3bzpwzbQQy14Iz+P5Z2cnw+QaYzAuweTZxEUcJ
# bFwpM49c1LMPFJTuOKkUgY90JJ3gVTpyQxfkc7DNBnx74PlRzjFmeGC/hxQt0hvo
# eaAiBdjo/1uuCTToigVnyRH+c0T2AezTeoFb7ne3I538hWeTdU5q9jGCBLcwggSz
# AgEBMHAwWjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2Ex
# MDAuBgNVBAMTJ0dsb2JhbFNpZ24gQ29kZVNpZ25pbmcgQ0EgLSBTSEEyNTYgLSBH
# MgISESENFrJbjBGW0/5XyYYR5rrZMAkGBSsOAwIaBQCgeDAYBgorBgEEAYI3AgEM
# MQowCKACgAChAoAAMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQB
# gjcCAQsxDjAMBgorBgEEAYI3AgEVMCMGCSqGSIb3DQEJBDEWBBRJKrcu73p+jUGY
# UJKcD8QZljhYKTANBgkqhkiG9w0BAQEFAASCAQCCZBMcX78z8qVlGpX1SgiOpBGv
# s+m/j8HrIsLcSIHSTW/OPead+a1AvJMjaU1keHd0rc5ZztbT0A1momWZ7jCiGImo
# a2/TOUohH0QL1jPGDtNEgwgInYvcjvsh9Pk8oYxeTvv5ywRVYG8uwOfae4x+WmNn
# i/liUNQfWLO7tizJP2N7Aqb3RWEHclC6oL55LZO0c/Mg+EsUJDdnr5Uq2cy0XdnU
# ZZXlhqpHCqmFXk0RSw9cdo51EJBYNnTlTQet3cCFFA+4Ayz1vfBpzMkP/ikIyXjS
# 2aMBmDGycE9KPVtw8JrbhvhQzwLLU2L3JESTqgUD2fYcPWQ9/dS0zZ6v0kEloYIC
# ojCCAp4GCSqGSIb3DQEJBjGCAo8wggKLAgEBMGgwUjELMAkGA1UEBhMCQkUxGTAX
# BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGlt
# ZXN0YW1waW5nIENBIC0gRzICEhEh1pmnZJc+8fhCfukZzFNBFDAJBgUrDgMCGgUA
# oIH9MBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEwHAYJKoZIhvcNAQkFMQ8XDTE2
# MDgzMTE5MTcwMVowIwYJKoZIhvcNAQkEMRYEFM7mgZjDYQxM94k0Rf5sT/hbNbGV
# MIGdBgsqhkiG9w0BCRACDDGBjTCBijCBhzCBhAQUY7gvq2H1g5CWlQULACScUCkz
# 7HkwbDBWpFQwUjELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt
# c2ExKDAmBgNVBAMTH0dsb2JhbFNpZ24gVGltZXN0YW1waW5nIENBIC0gRzICEhEh
# 1pmnZJc+8fhCfukZzFNBFDANBgkqhkiG9w0BAQEFAASCAQCT9WzKHoJ3UwhuCDtV
# 38AbD2kS86Z8QLab/8UhdbSD4U0ET4ZyUEep4s++PhaGGyoUUO/U11IRm99IAEhk
# mXM6WKfgadHrANgUIpekjy8bGHSDMaYbznS/5eQQ9AQXrdmKQAef7uCBSc9qNeri
# L2F13OaIUmE334raeMJtWkpnc9pNZHVhCWfl+hj5+OnHIHkk/sM5mzxRzsEPoaiV
# Sxrup/gaBUnY141v93gseEkp4sE42LRfy28jICAEXXiEuw0cedGPeKRO81V1nNV+
# 09gz2I3jaOr06a3iMXirU6Yq6vVdEaREfHPta/RU5l+mtltuLQy9zHV2+8C2cSCE
# B1mK
# SIG # End signature block