public/Search-UcmCsOnPremNumberRange.ps1
Function Search-UcmCsOnPremNumberRange { <# .SYNOPSIS Checks to see how many numbers are assigned in a number range to each service .DESCRIPTION Checks to see how many numbers are assigned in a number range to each service, returns a summary of the results or a full listing depending on the presence of the -summary parameter Presently only supports number blocks aligned to full number ranges (00-99 for example.) Note, the function currently performs a search based on a match filter, thus only whole ranges are supported. IE: Start +613864086400 End +613864086499, Start +613864086000 End +61386408699 or Start +613864080000 End +61386409999 Attempting to search for subranges will return all items in the whole range. For example searching for +61386408640 to +61386408650 will actually return everything between +61386408600 and +61386408699 as the last 2 digits cant be aligned. .PARAMETER Start (Required) The first number in the number range to be searched, can be in the following formats tel:+61386408600 +61386408600 386408600 .PARAMETER End (Required) The last number in the number range to be searched, can be in the following formats tel:+61386408699 +61386408699 386408699 .PARAMETER Summary Only returns the count of each object found in the number range, otherwise a PSCustom Object containing a list of the objects is returned for each object type (see Output) .EXAMPLE Search-UcmCsOnPremNumberRange -start "61386408600" -end "61386408699" -summary .INPUTS This function does not accept any input .OUTPUT This Cmdet returns a PSCustomObject with multiple keys to indicate results $Return.Status $Return.Message $Return.Users $Return.PrivateLines $Return.AnalogDevices $Return.CommonAreaPhones $Return.ExchangeUM $Return.DialInConf $Return.ResponseGroups $Return.All Return.Status can return one of four values "OK" : Connected to Skype for Business Online "Warning" : Reconnected to Skype for Business Online "Error" : Not connected to Skype for Business Online "Unknown" : Cmdlet reached the end of the function without returning anything, this shouldnt happen, if it does please log an issue on Github Return.Message returns descriptive text showing the connected tenant, mainly for logging or reporting $Return.Users $Return.PrivateLines $Return.AnalogDevices $Return.CommonAreaPhones $Return.ExchangeUM $Return.DialInConf $Return.ResponseGroups Each of the above return either a object count (when using -summary) or a list of the associated objects $Return.All returns either a total count, or a full list of the located objects. .LINK http://www.UcMadScientist.com https://github.com/Atreidae/UcmPsTools .ACKNOWLEDGEMENTS This function is based heavily off Tom Arbuthnot's Get-LyncNumberAssignment (Which I think might use code from Pat Richard) https://github.com/tomarbuthnot/Get-LyncNumberAssignment/blob/master/Get-LyncNumberAssignment-0.5.ps1 .NOTES Version: 1.0 Date: 03/08/2021 .VERSION HISTORY 1.0: Initial Public Release .REQUIRED FUNCTIONS/MODULES Modules Lync/SkypeforBusiness (From your Lync/Skype installation media) UcmPSTools (Install-Module UcmPsTools) Includes Cmdlets below. Cmdlets Write-UcmLog: https://github.com/Atreidae/UcmPsTools/blob/main/public/Write-UcmLog.ps1 .REQUIRED PERMISIONS 'CS Read Only Administrator' or better #> Param ( [Parameter(Mandatory, Position=1)] [string]$Start, [Parameter(Mandatory, Position=2)] [string]$End, [Parameter(Position=3)] [Switch]$summary ) #region FunctionSetup, Set Default Variables for HTML Reporting and Write Log $function = 'Search-UcmCsOnPremNumberRange' [hashtable]$Return = @{} $return.Function = $function $return.Status = "Unknown" $return.Message = "Function did not return a status message" # Log why we were called Write-UcmLog -Message "$($MyInvocation.InvocationName) called with $($MyInvocation.Line)" -Severity 1 -Component $function Write-UcmLog -Message "Parameters" -Severity 3 -Component $function -LogOnly Write-UcmLog -Message "$($PsBoundParameters.Keys)" -Severity 1 -Component $function -LogOnly Write-UcmLog -Message "Parameters Values" -Severity 1 -Component $function -LogOnly Write-UcmLog -Message "$($PsBoundParameters.Values)" -Severity 1 -Component $function -LogOnly Write-UcmLog -Message "Optional Arguments" -Severity 1 -Component $function -LogOnly Write-UcmLog -Message "$Args" -Severity 1 -Component $function -LogOnly #endregion FunctionSetup #region FunctionWork #Calculate the match string based on start and end by trying to match strings until an error is encountered $MatchError = $false $i = 1 Do { If ($start -notmatch ($End.substring(0,$i))) { #We dont match, decrement $i and set the flag to exit the loop $i = ($i - 1) $MatchError = $true } Else { #keep trying to increment the match number $i = ($i + 1) } } Until ($MatchError-eq $true) #Copy URI Check into Match $match = "*$($End.substring(0,$i))*" Write-UcmLog -Message "Checking for objects containing $match in Skype4B" -Severity 2 -Component $function Write-UcmLog -Message "Checking Users" -Severity 1 -Component $function Get-CsUser -Filter {LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'User' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)" $Return.Users = $output } Write-UcmLog -Message "Checking User Private Lines" -Severity 1 -Component $function Get-CsUser -Filter {PrivateLine -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'PrivateLineUser' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)" $Return.PrivateLine = $output } Write-UcmLog -Message "Checking Analog Devices" -Severity 1 -Component $function Get-CsAnalogDevice -Filter {LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'AnalogDevice' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)" $OutputCollection += $output } Write-Verbose -Message 'Checking Common Area Phones' Get-CsCommonAreaPhone -Filter {LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'CommonAreaPhone' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)" $OutputCollection += $output } Write-UcmLog -Message "Checking Analog Devices" -Severity 1 -Component $function Write-Verbose -Message 'Checking Exchange UM Contact Objects' Get-CsExUmContact -Filter {LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'ExUMContact' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)" $OutputCollection += $output } Write-UcmLog -Message "Checking Dialin Conference Numbers" -Severity 1 -Component $function Get-CsDialInConferencingAccessNumber -Filter {LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.PrimaryUri $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'DialInConf' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.Pool)" $OutputCollection += $output } Write-UcmLog -Message "Checking Trusted Application Endpoints" -Severity 1 -Component $function Get-CsTrustedApplicationEndpoint -Filter {LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.DisplayName $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.SipAddress $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'TrustedAppEndPoint' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.RegistrarPool)" $OutputCollection += $output } # No filter on Get-CSRGSworkflow Write-UcmLog -Message "Checking Response Groups" -Severity 1 -Component $function Get-CsRgsWorkflow | Where-Object {$_.LineURI -like $match} | ForEach-Object { $output = New-Object -TypeName PSobject $output | add-member -MemberType NoteProperty -Name 'LineUri' -Value $_.LineURI $output | add-member -MemberType NoteProperty -Name 'DisplayName' -Value $_.Name $output | add-member -MemberType NoteProperty -Name 'SipUri' -Value $_.PrimaryUri $output | add-member -MemberType NoteProperty -Name 'Type' -Value 'ResponseGroup' $output | add-member -MemberType NoteProperty -Name 'RegistrarPool' -Value "$($_.OwnerPool)" $OutputCollection += $output } $OutputCollection #Put the output to the pipeline #TODO https://github.com/Atreidae/UcmPSTools/issues/28 #Report on Findings if ($OutputCollection.count -eq 0) { Write-UcmLog -Message "Number $UriCheck does not appear to be used in the Skype4B deployment" -Severity 2 -Component $function $Return.Status = "OK" $Return.Message = "Number Not Used" Return } Else { Write-UcmLog -Message "Number $UriCheck is already in use!" -Severity 3 -Component $function $Return.Status = "Error" $Return.Message = "Number in use: $OutputCollection" Return } #region FunctionReturn #Default Return Variable for my HTML Reporting Fucntion Write-UcmLog -Message "Reached end of $function without a Return Statement" -Severity 3 -Component $function $return.Status = "Unknown" $return.Message = "Function did not encounter return statement" Return #endregion FunctionReturn } # SIG # Begin signature block # MIIRwgYJKoZIhvcNAQcCoIIRszCCEa8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUX8jv7Bd613E5JUcREw+XOqj/ # mS+ggg4OMIIGsDCCBJigAwIBAgIQCK1AsmDSnEyfXs2pvZOu2TANBgkqhkiG9w0B # AQwFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVk # IFJvb3QgRzQwHhcNMjEwNDI5MDAwMDAwWhcNMzYwNDI4MjM1OTU5WjBpMQswCQYD # VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lD # ZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEg # Q0ExMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA1bQvQtAorXi3XdU5 # WRuxiEL1M4zrPYGXcMW7xIUmMJ+kjmjYXPXrNCQH4UtP03hD9BfXHtr50tVnGlJP # DqFX/IiZwZHMgQM+TXAkZLON4gh9NH1MgFcSa0OamfLFOx/y78tHWhOmTLMBICXz # ENOLsvsI8IrgnQnAZaf6mIBJNYc9URnokCF4RS6hnyzhGMIazMXuk0lwQjKP+8bq # HPNlaJGiTUyCEUhSaN4QvRRXXegYE2XFf7JPhSxIpFaENdb5LpyqABXRN/4aBpTC # fMjqGzLmysL0p6MDDnSlrzm2q2AS4+jWufcx4dyt5Big2MEjR0ezoQ9uo6ttmAaD # G7dqZy3SvUQakhCBj7A7CdfHmzJawv9qYFSLScGT7eG0XOBv6yb5jNWy+TgQ5urO # kfW+0/tvk2E0XLyTRSiDNipmKF+wc86LJiUGsoPUXPYVGUztYuBeM/Lo6OwKp7AD # K5GyNnm+960IHnWmZcy740hQ83eRGv7bUKJGyGFYmPV8AhY8gyitOYbs1LcNU9D4 # R+Z1MI3sMJN2FKZbS110YU0/EpF23r9Yy3IQKUHw1cVtJnZoEUETWJrcJisB9IlN # Wdt4z4FKPkBHX8mBUHOFECMhWWCKZFTBzCEa6DgZfGYczXg4RTCZT/9jT0y7qg0I # U0F8WD1Hs/q27IwyCQLMbDwMVhECAwEAAaOCAVkwggFVMBIGA1UdEwEB/wQIMAYB # Af8CAQAwHQYDVR0OBBYEFGg34Ou2O/hfEYb7/mF7CIhl9E5CMB8GA1UdIwQYMBaA # FOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQEAwIBhjATBgNVHSUEDDAK # BggrBgEFBQcDAzB3BggrBgEFBQcBAQRrMGkwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v # Y3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0cDovL2NhY2VydHMuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcnQwQwYDVR0fBDwwOjA4 # oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJv # b3RHNC5jcmwwHAYDVR0gBBUwEzAHBgVngQwBAzAIBgZngQwBBAEwDQYJKoZIhvcN # AQEMBQADggIBADojRD2NCHbuj7w6mdNW4AIapfhINPMstuZ0ZveUcrEAyq9sMCcT # Ep6QRJ9L/Z6jfCbVN7w6XUhtldU/SfQnuxaBRVD9nL22heB2fjdxyyL3WqqQz/WT # auPrINHVUHmImoqKwba9oUgYftzYgBoRGRjNYZmBVvbJ43bnxOQbX0P4PpT/djk9 # ntSZz0rdKOtfJqGVWEjVGv7XJz/9kNF2ht0csGBc8w2o7uCJob054ThO2m67Np37 # 5SFTWsPK6Wrxoj7bQ7gzyE84FJKZ9d3OVG3ZXQIUH0AzfAPilbLCIXVzUstG2MQ0 # HKKlS43Nb3Y3LIU/Gs4m6Ri+kAewQ3+ViCCCcPDMyu/9KTVcH4k4Vfc3iosJocsL # 6TEa/y4ZXDlx4b6cpwoG1iZnt5LmTl/eeqxJzy6kdJKt2zyknIYf48FWGysj/4+1 # 6oh7cGvmoLr9Oj9FpsToFpFSi0HASIRLlk2rREDjjfAVKM7t8RhWByovEMQMCGQ8 # M4+uKIw8y4+ICw2/O/TOHnuO77Xry7fwdxPm5yg/rBKupS8ibEH5glwVZsxsDsrF # hsP2JjMMB0ug0wcCampAMEhLNKhRILutG4UI4lkNbcoFUCvqShyepf2gpx8GdOfy # 1lKQ/a+FSCH5Vzu0nAPthkX0tGFuv2jiJmCG6sivqf6UHedjGzqGVnhOMIIHVjCC # BT6gAwIBAgIQDyLHeeRvkUFg5QtSFTT8FjANBgkqhkiG9w0BAQsFADBpMQswCQYD # VQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xQTA/BgNVBAMTOERpZ2lD # ZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQwOTYgU0hBMzg0IDIwMjEg # Q0ExMB4XDTIzMDIyMzAwMDAwMFoXDTI2MDIyMzIzNTk1OVowXjELMAkGA1UEBhMC # QVUxETAPBgNVBAgTCFZpY3RvcmlhMRAwDgYDVQQHEwdCZXJ3aWNrMRQwEgYDVQQK # EwtKYW1lcyBBcmJlcjEUMBIGA1UEAxMLSmFtZXMgQXJiZXIwggIiMA0GCSqGSIb3 # DQEBAQUAA4ICDwAwggIKAoICAQC47oExh25TrxvApIYdMRYvjOdZCb8WwgeTemm3 # ZY7BElIWu6+gzRGqQe8RFsN7oIgin5pvjTYIToxt1CCag2A5o8L0NtULmxJEegc+ # VaF24DZQqI4qGQGH/Qnglqys6+yPkwLnfeSxpeWe4u49HUUGDFIxHCh42MlCLp/f # fHT49QhhpO+LyeLnDoUs6DmahyIb6NeE2cW5AYRXEesW7GRNfXzygBSlVWJOgvcy # V5Y4IvAZVx2hKKMTjYFIz4/RYMg7fwYZEJ2LRJ/GnVazobKAvh6ZBet5KwVNI9EI # 29DtWQyK/RoPOguTRcB5VuiZVlv0xjBYM7iJuH2Soa3StQYVxL/5gjZCC9WOs4NR # EIGU3XmHoogFDvoT1vf1izMPFQzdZfgPvy/XXsbgTVo5ncesJ6WtZwqwCXG1K0XW # IPZqTHolc1MyU6K1bEHO+7YWLpKgM9THl644G7PEhcKpNDsHlfvLVQdYhI55UJtc # iyMrTw11CNECvk3GK1mrluvKsrxdaH6G3Sp9VVHRtef6OZ5SlzkM5ID4egB2bXRb # R/69bEuZr5hhm+v2lBSWIbZj/Mva6i/a/TAvy4vvPLo3DRcASkYZDC4T8gDMzmpG # Xs4jAc9sfTL9z+o5u1PLJHFGRjJ+Wa2CgSftCdbKLjn+AY9m8ipc8jmOBKNY9yGI # pQWapQIDAQABo4ICAzCCAf8wHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0 # TkIwHQYDVR0OBBYEFOBsg1xudlbXVSql8pWbiHoTyZS/MA4GA1UdDwEB/wQEAwIH # gDATBgNVHSUEDDAKBggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRw # Oi8vY3JsMy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmlu # Z1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGln # aWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hB # Mzg0MjAyMUNBMS5jcmwwPgYDVR0gBDcwNTAzBgZngQwBBAEwKTAnBggrBgEFBQcC # ARYbaHR0cDovL3d3dy5kaWdpY2VydC5jb20vQ1BTMIGUBggrBgEFBQcBAQSBhzCB # hDAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMFwGCCsGAQUF # BzAChlBodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRUcnVzdGVk # RzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEzODQyMDIxQ0ExLmNydDAJBgNVHRMEAjAA # MA0GCSqGSIb3DQEBCwUAA4ICAQBOh5vRXqTCQzv0T1F2EgDkq5VnljlHsa7Ov/d/ # lpOvr8NebBiatxbhfhPCnToY7BD2f7YVsUuQ+VDdcIYsskcU5spBHcFYidg2jGu4 # 59FGMaS765XStDwGGTN/360gEsNYSnKWYL4+8jYWHlzRO0jHloyWz+gF5dYWzdDJ # u1dudLIJ0RgrEVJeLSgIBWygLL5EyIzOPlrxztsILMSbdPTQLeBIm7ipOk4EACx1 # hhBVUsUoCAlASH+yCKDU4v2HFd7SzrkRUrf7XJ2Na2YsiHjiTGqHIE86KyvxGDhT # 3n2/jX23Nh/bkWHurHwTfaTCOQ44ZlAbnZQjBlmrFn5hPMXRpciiQFmrKTPD/nuo # 9MVnCciHEpHJ63/JZNF/eno1122/wVkL7MuRlCVHN7L/wuNQxQk3ARdIju6OD/Gi # Mwg0Qih6HVWJtkHK3ExoUKKKUZCOvIeHxzp+K6FWUupPZKUgWzn4AHMxm6zr+Sde # laIAACqAkxYsDYKbM7WlNi3uIH2HeXqU9uSDt5tgPpImrog/ab4HrhpDfITRgT1c # cxaWQezpJEPC+kqVD41T3wlEie1Qm4vYWg+oBVEMBxVLh6CYbeppCRTEXRGnAiCH # /Ma1uwyWnNCWxrhd1uSi6sj4ISzgnFyGCvsI0gavKpS5AQhapJgk6/fULTFeS+Ee # kRH9FDGCAx4wggMaAgEBMH0waTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lD # ZXJ0LCBJbmMuMUEwPwYDVQQDEzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2ln # bmluZyBSU0E0MDk2IFNIQTM4NCAyMDIxIENBMQIQDyLHeeRvkUFg5QtSFTT8FjAJ # BgUrDgMCGgUAoHgwGAYKKwYBBAGCNwIBDDEKMAigAoAAoQKAADAZBgkqhkiG9w0B # CQMxDAYKKwYBBAGCNwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIBFTAj # BgkqhkiG9w0BCQQxFgQUl83QEhjQ2YPZb7tJLijelbSstacwDQYJKoZIhvcNAQEB # BQAEggIAGFky5rEToX87o4oXngPsuefVlSGqB0aWN2OTj5u416YNN6PDfLkgU0AU # nikv4QeJjBHRDCUw1kuf9bgedo2cMCkaHiY6/u9+KcWPQUMjvhWV73VSlevlD9Qx # o9evWnoBRzIdR5et8+bMFsGNOKeijLvmPkIF32RfXW7mvlHVhk74J0r3p4QAlTZb # AO3TNPw730GF0omWFxBiAwidtspHC6Q04+jffZv7J5ppiaDso5Tf9An9C64VxIoD # YHxuKexYZ8tgHgHOExNKz3Q2QH7FR8kP43UQeQKnACwNzmMGmmfftMMKn4HAVR8P # Au9EhsUM1LyFl4LzZcKpT5jXUIWWTs5RAtde0YI6SDQbJl4l7YjDHhOTI/d/taWQ # HdjkUbdJ7HnnSMs6aNQq8FCkYC5zejSOf5oMuDfLMYfVqDxQtXPPmW/+bOC/vB3D # K8Oa9QXyR0/22UnYBhrWRQw/+LGCYrLORZVcLM+2ar0t0Uf6iL74gUrF0nmdX+cG # PaMWCOokHB94/U4OdkUIl+PRLGBKOtknUB958bMxdJA88vMUqciEONrONoqsPJZX # kDKweaOBRkiJi/3oA+5U9FdhUGV+dznR2PDNFGgYIblP05rcstkLGgnIMCyV0wHC # h9dxABn/Zq3bbHaZ+res6IsJeQeQDB3X/0Y/++9p4geNd7PU2mc= # SIG # End signature block |