LogsandReporting.ps1
<#
.NOTES =========================================================================== Created on: 12/29/2016 2:46 PM Created by: Vikas Sukhija Organization: https://techwizard.cloud Filename: GeneralFunctions.ps1 Update: 7/15/2020 Converted to module Update: 7/23/2020 Added save-CSV2Excel Update: 7/25/2020 updated set-recycle logs with confirmation impact of High/verbose messages for delted items Update: 12/20/2021 Convert-CSV2Excel and added remote recycle function as well =========================================================================== .DESCRIPTION A description of the file. #> ###############################Convert-CSV2Excel######################################## function Convert-CSV2Excel { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [ValidateScript({ if(-Not ($_ | Test-Path) ){throw "File or folder does not exist"} if(-Not ($_ | Test-Path -PathType Leaf) ){throw "The Path argument must be a file. Folder paths are not allowed."} if($_ -notmatch "(\.CSV)"){throw "The file specified in the path argument must be either of type CSV"} return $true })] $CSVFile, [Parameter(Mandatory = $true)] [ValidateScript({ if($_ -notmatch "(\.XLSX)"){throw "The file specified in the path argument must be either of type XLSX"} return $true })] $ExcelFile, $Delimiter=",", $TextQualifier='"' ) Test-vsadmin -ModuleName importexcel -downloadurl "https://www.powershellgallery.com/packages/ImportExcel" # Load EPPlus from import-excel module $importexcel = (Get-Module -ListAvailable importexcel).path if($importexcel.count -gt 1){ $rootpath = split-path -path (Get-Module -ListAvailable importexcel).path[0] -Parent $DLLPath = $rootpath + "\EPPlus.dll" }else{ $rootpath = split-path -path (Get-Module -ListAvailable importexcel).path -Parent $DLLPath = $rootpath + "\EPPlus.dll" } [Reflection.Assembly]::LoadFile($DLLPath) | Out-Null # Set CSV Format $Format = New-object -TypeName OfficeOpenXml.ExcelTextFormat $Format.Delimiter = $Delimiter # use Text Qualifier if your CSV entries are quoted, e.g. "Cell1","Cell2" $Format.TextQualifier = $TextQualifier $Format.Encoding = [System.Text.Encoding]::UTF8 $Format.SkipLinesBeginning = '0' $Format.SkipLinesEnd = '1' # Set Preferred Table Style $TableStyle = [OfficeOpenXml.Table.TableStyles]::Medium1 # Create Excel File $ExcelPackage = New-Object OfficeOpenXml.ExcelPackage $ExcelPackage.Encryption.IsEncrypted = $false $Worksheet = $ExcelPackage.Workbook.Worksheets.Add("FromCSV") # Load CSV File with first row as heads using a table style #$null=$Worksheet.Cells.LoadFromText((Get-Item $CSVFile),$Format,$TableStyle,$true) # Load CSV File without table style $null=$Worksheet.Cells.LoadFromText((Get-Item $CSVFile),$format) # Fit Column Size to Size of Content $Worksheet.Cells[$Worksheet.Dimension.Address].AutoFitColumns() # Save Excel File $ExcelPackage.SaveAs($ExcelFile) Write-Host "CSV File $CSVFile converted to Excel file $ExcelFile" }#Convert-CSV2Excel ############################csv to excel################################### Function Save-CSV2Excel { [CmdletBinding()] Param( [Parameter(Mandatory = $true,Position = 1)] [ValidateScript({ if(-Not ($_ | Test-Path) ){throw "File or folder does not exist"} if(-Not ($_ | Test-Path -PathType Leaf) ){throw "The Path argument must be a file. Folder paths are not allowed."} if($_ -notmatch "(\.csv)"){throw "The file specified in the path argument must be either of type csv"} return $true })] [System.IO.FileInfo]$CSVPath, [Parameter(Mandatory = $true)] [ValidateScript({ if($_ -notmatch "(\.xlsx)"){throw "The file specified in the path argument must be either of type xlsx"} return $true })] [System.IO.FileInfo]$Exceloutputpath ) ####### Borrowed function from Lloyd Watkinson from script gallery## Function Convert-NumberToA1 { Param([parameter(Mandatory = $true)] [int]$number) $a1Value = $null While ($number -gt 0) { $multiplier = [int][system.math]::Floor(($number / 26)) $charNumber = $number - ($multiplier * 26) If ($charNumber -eq 0) { $multiplier-- ; $charNumber = 26 } $a1Value = [char]($charNumber + 64) + $a1Value $number = $multiplier } Return $a1Value } #############################Start converting excel####################### $importcsv = Import-Csv $CSVPath $countcolumns = ($importcsv | Get-Member | Where-Object{$_.membertype -eq "Noteproperty"}).count #################call Excel com object ############## $xl = New-Object -comobject excel.application $xl.visible = $false $Workbook = $xl.workbooks.open($CSVPath) $Workbook.SaveAs($Exceloutputpath, 51) $Workbook.Saved = $true $xl.Quit() #############Now format the Excel################### timeout.exe 10 $xl = New-Object -comobject excel.application $xl.visible = $false $Workbook = $xl.workbooks.open($Exceloutputpath) $worksheet1 = $Workbook.worksheets.Item(1) for ($c = 1; $c -le $countcolumns; $c++) {$worksheet1.Cells.Item(1, $c).Interior.ColorIndex = 39} $colvalue = (Convert-NumberToA1 $countcolumns) + "1" $headerRange = $worksheet1.Range("a1", $colvalue) $null = $headerRange.AutoFilter() $null = $headerRange.entirecolumn.AutoFit() $worksheet1.rows.item(1).Font.Bold = $true $Workbook.Save() $Workbook.Close() $xl.Quit() $Null = [System.Runtime.Interopservices.Marshal]::ReleaseComObject($xl) ####################################################################### }#Write-CSV2Excel ################Email Function works for all versions########################### function Send-Email { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] $From, [Parameter(Mandatory = $true)] [array]$To, [array]$bcc, [array]$cc, $body, $subject, $attachment, [Parameter(Mandatory = $true)] $smtpserver ) $message = New-Object System.Net.Mail.MailMessage $message.From = $From if ($To -ne $null) { $To | ForEach-Object{ $to1 = $_ $to1 $message.To.Add($to1) } } if ($cc -ne $null) { $cc | ForEach-Object{ $cc1 = $_ $cc1 $message.CC.Add($cc1) } } if ($bcc -ne $null) { $bcc | ForEach-Object{ $bcc1 = $_ $bcc1 $message.bcc.Add($bcc1) } } $message.IsBodyHtml = $true if ($subject -ne $null) {$message.Subject = $subject} if ($attachment -ne $null) { $attach = New-Object Net.Mail.Attachment($attachment) $message.Attachments.Add($attach) } if ($body -ne $null) {$message.body = $body} $smtp = New-Object Net.Mail.SmtpClient($smtpserver) $smtp.Send($message) } #################################progress bar################################ function Start-ProgressBar { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] $Title, [Parameter(Mandatory = $true)] [int]$Timer ) For ($i = 1; $i -le $Timer; $i++) { Start-Sleep -Seconds 1; Write-Progress -Activity $Title -Status "$i" -PercentComplete ($i /100 * 100) } } #Function Start-ProgressBar #############################recycle logs######################### function Set-Recyclelogs { [CmdletBinding( SupportsShouldProcess = $true, ConfirmImpact = 'High')] param ( [Parameter(Mandatory = $true,ParameterSetName = 'Local')] [string]$foldername, [Parameter(Mandatory = $true,ParameterSetName = 'Local')] [Parameter(Mandatory = $true,ParameterSetName = 'Path')] [Parameter(Mandatory = $true,ParameterSetName = 'Remote')] [int]$limit, [Parameter(ParameterSetName = 'Local',Position = 0)][switch]$local, [Parameter(Mandatory = $true,ParameterSetName = 'Remote')] [string]$ComputerName, [Parameter(Mandatory = $true,ParameterSetName = 'Remote')] [string]$DriveName, [Parameter(Mandatory = $true,ParameterSetName = 'Remote')] [string]$folderpath, [Parameter(ParameterSetName = 'Remote',Position = 0)][switch]$Remote, [Parameter(Mandatory = $true,ParameterSetName = 'Path')] [ValidateScript({ if(-Not ($_ | Test-Path) ){throw "File or folder does not exist"} return $true })] [string]$folderlocation, [Parameter(ParameterSetName = 'Path',Position = 0)][switch]$Path ) switch ($PsCmdlet.ParameterSetName) { "Local" { $path1 = (Get-Location).path + "\" + "$foldername" if ($PsCmdlet.ShouldProcess($path1 , "Delete")) { Write-Host "Path Recycle - $path1 Limit - $limit" -ForegroundColor Green $limit1 = (Get-Date).AddDays(-"$limit") #for report recycling $getitems = Get-ChildItem -Path $path1 -recurse -file | Where-Object {$_.CreationTime -lt $limit1} ForEach($item in $getitems){ Write-Verbose -Message "Deleting item $($item.FullName)" Remove-Item $item.FullName -Force } } } "Remote" { $path1 = "\\" + $ComputerName + "\" + $DriveName + "$" + "\" + $folderpath if ($PsCmdlet.ShouldProcess($path1 , "Delete")) { Write-Host "Recycle Path - $path1 Limit - $limit" -ForegroundColor Green $limit1 = (Get-Date).AddDays(-"$limit") #for report recycling $getitems = Get-ChildItem -Path $path1 -recurse -file | Where-Object {$_.CreationTime -lt $limit1} ForEach($item in $getitems){ Write-Verbose -Message "Deleting item $($item.FullName)" Remove-Item $item.FullName -Force } } } "Path" { $path1 = $folderlocation if ($PsCmdlet.ShouldProcess($path1 , "Delete")) { Write-Host "Path Recycle - $path1 Limit - $limit" -ForegroundColor Green $limit1 = (Get-Date).AddDays(-"$limit") #for report recycling $getitems = Get-ChildItem -Path $path1 -recurse -file | Where-Object {$_.CreationTime -lt $limit1} ForEach($item in $getitems){ Write-Verbose -Message "Deleting item $($item.FullName)" Remove-Item $item.FullName -Force } } } } }# Set-Recycle logs ##############Log Function################################################### function Write-Log { [CmdletBinding()] param ( [Parameter(Mandatory = $true,ParameterSetName = 'Create')] [array]$Name, [Parameter(Mandatory = $true,ParameterSetName = 'Create')] [string]$Ext, [Parameter(Mandatory = $true,ParameterSetName = 'Create')] [string]$folder, [Parameter(ParameterSetName = 'Create',Position = 0)][switch]$Create, [Parameter(Mandatory = $true,ParameterSetName = 'Message')] [String]$message, [Parameter(Mandatory = $true,ParameterSetName = 'Message')] [String]$path, [Parameter(Mandatory = $false,ParameterSetName = 'Message')] [ValidateSet('Information','Warning','Error')] [string]$Severity = 'Information', [Parameter(ParameterSetName = 'Message',Position = 0)][Switch]$MSG ) switch ($PsCmdlet.ParameterSetName) { "Create" { $log = @() $date1 = Get-Date -Format d $date1 = $date1.ToString().Replace("/", "-") $time = Get-Date -Format t $time = $time.ToString().Replace(":", "-") $time = $time.ToString().Replace(" ", "") New-FolderCreation -foldername $folder foreach ($n in $Name) {$log += (Get-Location).Path + "\" + $folder + "\" + $n + "_" + $date1 + "_" + $time + "_.$Ext"} return $log } "Message" { $date = Get-Date $concatmessage = "|$date" + "| |" + $message +"| |" + "$Severity|" switch($Severity){ "Information"{Write-Host -Object $concatmessage -ForegroundColor Green} "Warning"{Write-Host -Object $concatmessage -ForegroundColor Yellow} "Error"{Write-Host -Object $concatmessage -ForegroundColor Red} } Add-Content -Path $path -Value $concatmessage } } } #Function Write-Log ############################################################## # SIG # Begin signature block # MIIZiQYJKoZIhvcNAQcCoIIZejCCGXYCAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUpKnHWqUIF3X63X9hzKyGSdMg # 3HSgghSXMIIE/jCCA+agAwIBAgIQDUJK4L46iP9gQCHOFADw3TANBgkqhkiG9w0B # AQsFADByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBTSEEyIEFz # c3VyZWQgSUQgVGltZXN0YW1waW5nIENBMB4XDTIxMDEwMTAwMDAwMFoXDTMxMDEw # NjAwMDAwMFowSDELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMu # MSAwHgYDVQQDExdEaWdpQ2VydCBUaW1lc3RhbXAgMjAyMTCCASIwDQYJKoZIhvcN # AQEBBQADggEPADCCAQoCggEBAMLmYYRnxYr1DQikRcpja1HXOhFCvQp1dU2UtAxQ # tSYQ/h3Ib5FrDJbnGlxI70Tlv5thzRWRYlq4/2cLnGP9NmqB+in43Stwhd4CGPN4 # bbx9+cdtCT2+anaH6Yq9+IRdHnbJ5MZ2djpT0dHTWjaPxqPhLxs6t2HWc+xObTOK # fF1FLUuxUOZBOjdWhtyTI433UCXoZObd048vV7WHIOsOjizVI9r0TXhG4wODMSlK # XAwxikqMiMX3MFr5FK8VX2xDSQn9JiNT9o1j6BqrW7EdMMKbaYK02/xWVLwfoYer # vnpbCiAvSwnJlaeNsvrWY4tOpXIc7p96AXP4Gdb+DUmEvQECAwEAAaOCAbgwggG0 # MA4GA1UdDwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsG # AQUFBwMIMEEGA1UdIAQ6MDgwNgYJYIZIAYb9bAcBMCkwJwYIKwYBBQUHAgEWG2h0 # dHA6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAfBgNVHSMEGDAWgBT0tuEgHf4prtLk # YaWyoiWyyBc1bjAdBgNVHQ4EFgQUNkSGjqS6sGa+vCgtHUQ23eNqerwwcQYDVR0f # BGowaDAyoDCgLoYsaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJl # ZC10cy5jcmwwMqAwoC6GLGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFz # c3VyZWQtdHMuY3JsMIGFBggrBgEFBQcBAQR5MHcwJAYIKwYBBQUHMAGGGGh0dHA6 # Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBPBggrBgEFBQcwAoZDaHR0cDovL2NhY2VydHMu # ZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJRFRpbWVzdGFtcGluZ0NB # LmNydDANBgkqhkiG9w0BAQsFAAOCAQEASBzctemaI7znGucgDo5nRv1CclF0CiNH # o6uS0iXEcFm+FKDlJ4GlTRQVGQd58NEEw4bZO73+RAJmTe1ppA/2uHDPYuj1UUp4 # eTZ6J7fz51Kfk6ftQ55757TdQSKJ+4eiRgNO/PT+t2R3Y18jUmmDgvoaU+2QzI2h # F3MN9PNlOXBL85zWenvaDLw9MtAby/Vh/HUIAHa8gQ74wOFcz8QRcucbZEnYIpp1 # FUL1LTI4gdr0YKK6tFL7XOBhJCVPst/JKahzQ1HavWPWH1ub9y4bTxMd90oNcX6X # t/Q/hOvB46NJofrOp79Wz7pZdmGJX36ntI5nePk2mOHLKNpbh6aKLzCCBSgwggQQ # oAMCAQICEAQXI353dv9JT7ZOAHNl5BMwDQYJKoZIhvcNAQELBQAwcjELMAkGA1UE # BhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3LmRpZ2lj # ZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQgU0hBMiBBc3N1cmVkIElEIENvZGUg # U2lnbmluZyBDQTAeFw0yMDA3MDgwMDAwMDBaFw0yMzA3MTMxMjAwMDBaMGUxCzAJ # BgNVBAYTAkNBMRAwDgYDVQQIEwdPbnRhcmlvMRQwEgYDVQQHEwtNaXNzaXNzYXVn # YTEWMBQGA1UEChMNVmlrYXMgU3VraGlqYTEWMBQGA1UEAxMNVmlrYXMgU3VraGlq # YTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOErfHfQ6pn1mETF7PWp # qbB4eqlRuJFRGgdQAPRkvYrVRlILZM/tfFuZkr6cplV+3u/eRxlAqkeRnzbiRK+o # wmi12Znw5otzPJuZRSb6gm1dSGbZTfay2JXCglc8L0ZtsnLXHRUi8wdbKSpv9eYI # 8reeOiXVbUHubs73+EXH+UlDiCMs7LpwPyVjyt5o0JMdBcoHjdRIhx1UKEBCeWy0 # wziqDY94pwCuzeDQrsXt/UfMWzk11H2Zuf2XYPDIy0F7NsyhDx7bMifM0QFWC0C1 # Iinbh8MGUue18mjllTpYcSwzNUF11d9VzRGwhZ8AU2bet8TIAekt/4P5aWMdT9ta # K1ECAwEAAaOCAcUwggHBMB8GA1UdIwQYMBaAFFrEuXsqCqOl6nEDwGD5LfZldQ5Y # MB0GA1UdDgQWBBTLtvyqDKFiIsTfPo2xPDoKTFK+oDAOBgNVHQ8BAf8EBAMCB4Aw # EwYDVR0lBAwwCgYIKwYBBQUHAwMwdwYDVR0fBHAwbjA1oDOgMYYvaHR0cDovL2Ny # bDMuZGlnaWNlcnQuY29tL3NoYTItYXNzdXJlZC1jcy1nMS5jcmwwNaAzoDGGL2h0 # dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9zaGEyLWFzc3VyZWQtY3MtZzEuY3JsMEwG # A1UdIARFMEMwNwYJYIZIAYb9bAMBMCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3 # LmRpZ2ljZXJ0LmNvbS9DUFMwCAYGZ4EMAQQBMIGEBggrBgEFBQcBAQR4MHYwJAYI # KwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBOBggrBgEFBQcwAoZC # aHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0U0hBMkFzc3VyZWRJ # RENvZGVTaWduaW5nQ0EuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcNAQELBQAD # ggEBAE/k53BL9tN6EKPruAwxzJ+qZE3J88f1t5a8LIx1fgtEXBL00NJJqaoKkNVz # t7RoT4d6yQHSFC/TNYFBLUnYOF3myRuO9L2ty05toSzGxHKUmK5E3ablxM0PQTuC # GgHVkV85/1VlXkUu/UQUXuESsvEm70OUW36AlI2dMugHRrnwYSrEqjBIk8imUV0X # G2sNd/AJFoo0PCfRpNVABjxfJeZmKOdKeYBYZpXqSmKdJ7TQSRiRP50XDD1egWOW # bfL6qZyxoa3XHmZF18APCRbEuWdHZEBr4QfMfI1/sUDFMlOf4hU6tTav9uyxSo+7 # 8QyfP5YBCemOOrKeKwY4Yv0PxRgwggUwMIIEGKADAgECAhAECRgbX9W7ZnVTQ7Vv # lVAIMA0GCSqGSIb3DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdp # Q2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0Rp # Z2lDZXJ0IEFzc3VyZWQgSUQgUm9vdCBDQTAeFw0xMzEwMjIxMjAwMDBaFw0yODEw # MjIxMjAwMDBaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMx # GTAXBgNVBAsTEHd3dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNI # QTIgQXNzdXJlZCBJRCBDb2RlIFNpZ25pbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUA # A4IBDwAwggEKAoIBAQD407Mcfw4Rr2d3B9MLMUkZz9D7RZmxOttE9X/lqJ3bMtdx # 6nadBS63j/qSQ8Cl+YnUNxnXtqrwnIal2CWsDnkoOn7p0WfTxvspJ8fTeyOU5JEj # lpB3gvmhhCNmElQzUHSxKCa7JGnCwlLyFGeKiUXULaGj6YgsIJWuHEqHCN8M9eJN # YBi+qsSyrnAxZjNxPqxwoqvOf+l8y5Kh5TsxHM/q8grkV7tKtel05iv+bMt+dDk2 # DZDv5LVOpKnqagqrhPOsZ061xPeM0SAlI+sIZD5SlsHyDxL0xY4PwaLoLFH3c7y9 # hbFig3NBggfkOItqcyDQD2RzPJ6fpjOp/RnfJZPRAgMBAAGjggHNMIIByTASBgNV # HRMBAf8ECDAGAQH/AgEAMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAKBggrBgEF # BQcDAzB5BggrBgEFBQcBAQRtMGswJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRp # Z2ljZXJ0LmNvbTBDBggrBgEFBQcwAoY3aHR0cDovL2NhY2VydHMuZGlnaWNlcnQu # Y29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9vdENBLmNydDCBgQYDVR0fBHoweDA6oDig # NoY0aHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0QXNzdXJlZElEUm9v # dENBLmNybDA6oDigNoY0aHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0 # QXNzdXJlZElEUm9vdENBLmNybDBPBgNVHSAESDBGMDgGCmCGSAGG/WwAAgQwKjAo # BggrBgEFBQcCARYcaHR0cHM6Ly93d3cuZGlnaWNlcnQuY29tL0NQUzAKBghghkgB # hv1sAzAdBgNVHQ4EFgQUWsS5eyoKo6XqcQPAYPkt9mV1DlgwHwYDVR0jBBgwFoAU # Reuir/SSy4IxLVGLp6chnfNtyA8wDQYJKoZIhvcNAQELBQADggEBAD7sDVoks/Mi # 0RXILHwlKXaoHV0cLToaxO8wYdd+C2D9wz0PxK+L/e8q3yBVN7Dh9tGSdQ9RtG6l # jlriXiSBThCk7j9xjmMOE0ut119EefM2FAaK95xGTlz/kLEbBw6RFfu6r7VRwo0k # riTGxycqoSkoGjpxKAI8LpGjwCUR4pwUR6F6aGivm6dcIFzZcbEMj7uo+MUSaJ/P # QMtARKUT8OZkDCUIQjKyNookAv4vcn4c10lFluhZHen6dGRrsutmQ9qzsIzV6Q3d # 9gEgzpkxYz0IGhizgZtPxpMQBvwHgfqL2vmCSfdibqFT+hKUGIUukpHqaGxEMrJm # oecYpJpkUe8wggUxMIIEGaADAgECAhAKoSXW1jIbfkHkBdo2l8IVMA0GCSqGSIb3 # DQEBCwUAMGUxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAX # BgNVBAsTEHd3dy5kaWdpY2VydC5jb20xJDAiBgNVBAMTG0RpZ2lDZXJ0IEFzc3Vy # ZWQgSUQgUm9vdCBDQTAeFw0xNjAxMDcxMjAwMDBaFw0zMTAxMDcxMjAwMDBaMHIx # CzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 # dy5kaWdpY2VydC5jb20xMTAvBgNVBAMTKERpZ2lDZXJ0IFNIQTIgQXNzdXJlZCBJ # RCBUaW1lc3RhbXBpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB # AQC90DLuS82Pf92puoKZxTlUKFe2I0rEDgdFM1EQfdD5fU1ofue2oPSNs4jkl79j # IZCYvxO8V9PD4X4I1moUADj3Lh477sym9jJZ/l9lP+Cb6+NGRwYaVX4LJ37AovWg # 4N4iPw7/fpX786O6Ij4YrBHk8JkDbTuFfAnT7l3ImgtU46gJcWvgzyIQD3XPcXJO # Cq3fQDpct1HhoXkUxk0kIzBdvOw8YGqsLwfM/fDqR9mIUF79Zm5WYScpiYRR5oLn # RlD9lCosp+R1PrqYD4R/nzEU1q3V8mTLex4F0IQZchfxFwbvPc3WTe8GQv2iUypP # hR3EHTyvz9qsEPXdrKzpVv+TAgMBAAGjggHOMIIByjAdBgNVHQ4EFgQU9LbhIB3+ # Ka7S5GGlsqIlssgXNW4wHwYDVR0jBBgwFoAUReuir/SSy4IxLVGLp6chnfNtyA8w # EgYDVR0TAQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwEwYDVR0lBAwwCgYI # KwYBBQUHAwgweQYIKwYBBQUHAQEEbTBrMCQGCCsGAQUFBzABhhhodHRwOi8vb2Nz # cC5kaWdpY2VydC5jb20wQwYIKwYBBQUHMAKGN2h0dHA6Ly9jYWNlcnRzLmRpZ2lj # ZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcnQwgYEGA1UdHwR6MHgw # OqA4oDaGNGh0dHA6Ly9jcmw0LmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydEFzc3VyZWRJ # RFJvb3RDQS5jcmwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdp # Q2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwUAYDVR0gBEkwRzA4BgpghkgBhv1sAAIE # MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMwCwYJ # YIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4IBAQBxlRLpUYdWac3v3dp8qmN6s3jP # BjdAhO9LhL/KzwMC/cWnww4gQiyvd/MrHwwhWiq3BTQdaq6Z+CeiZr8JqmDfdqQ6 # kw/4stHYfBli6F6CJR7Euhx7LCHi1lssFDVDBGiy23UC4HLHmNY8ZOUfSBAYX4k4 # YU1iRiSHY4yRUiyvKYnleB/WCxSlgNcSR3CzddWThZN+tpJn+1Nhiaj1a5bA9Fhp # DXzIAbG5KHW3mWOFIoxhynmUfln8jA/jb7UBJrZspe6HUSHkWGCbugwtK22ixH67 # xCUrRwIIfEmuE7bhfEJCKMYYVs9BNLZmXbZ0e/VWMyIvIjayS6JKldj1po5SMYIE # XDCCBFgCAQEwgYYwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTExMC8GA1UEAxMoRGlnaUNlcnQg # U0hBMiBBc3N1cmVkIElEIENvZGUgU2lnbmluZyBDQQIQBBcjfnd2/0lPtk4Ac2Xk # EzAJBgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG # 9w0BCQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB # FTAjBgkqhkiG9w0BCQQxFgQUyCyj63ZFLTJD7OLBiw4+YWeRfMIwDQYJKoZIhvcN # AQEBBQAEggEAjnoK45DFjA26SuteXiIpUpEIx9q+M0eJRqPN3iU66c0ivZyeAZFP # x05RAqc47I3bs4gvQytlaMhZ59UUk32hE1QGbYBt/5fjNzBNj01ENao7ELhGetHm # p7tFQD7p/YoLYRMMrBGosUe5D3QGAOqXvfaszpqcTluUVX+YMhuXyDT4ZtYKPHnr # dtnuOWFvi3SDezgB3pQAWI7vse5Og3q56ir2Mvs80cjwUQIrzqp27LJNxRPaOaHe # 93tqO1+0IaoVpAeqi/MDgfXocLoflnllp0uGnzxD23D7XT0PG+xM/qV0HJpjpWZe # uNuAGKt55H1sTCuWy8WI20XFi0ZxD6P2P6GCAjAwggIsBgkqhkiG9w0BCQYxggId # MIICGQIBATCBhjByMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5j # MRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMTEwLwYDVQQDEyhEaWdpQ2VydCBT # SEEyIEFzc3VyZWQgSUQgVGltZXN0YW1waW5nIENBAhANQkrgvjqI/2BAIc4UAPDd # MA0GCWCGSAFlAwQCAQUAoGkwGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkq # hkiG9w0BCQUxDxcNMjExMjIwMjMyNDM4WjAvBgkqhkiG9w0BCQQxIgQguz1Ttbgs # RGKRp4MgexGpF3AV2fd2nC1f5TxXeQU0lz8wDQYJKoZIhvcNAQEBBQAEggEAsdfW # YWiLDMcBFw76Cm6qiscvl8+dbWX4IukVw33YS2+hriIcSj/tTtu7GfU8PTyEpc8K # 7q6nEOiQokdZgBqw4ztTkajZ8x2u48CqhD0xECAkflxXp0r8cq/1CVFgVXy7cZ9j # iQT0TKqs4jLAGp+GCWFr8qbD30XH4mUhgQXvUQttt3+poAvh4Iz8h5B8GXofiKRU # E19zixoGX1pEeFLY4EP3FyXcPvrrGXXkeX2uobdktjzV7dy+V+NUwjg+Pcc7k7D/ # 16TBlPBUiIpHtINn1KleZp/tq3+x+M0I+CJbQQoFHTPpeMVXZ0T1uonCAW5p5SlA # cXmVB3UAL11Sa2UFtg== # SIG # End signature block |