param([string]$CSVPath,[string]$MachineNameHeader,[string]$RefreshToken,[int]$AgentLastActiveDays=30,[switch]$TrainingMode, [switch]$DemoMode) #Validate Inputs if ($CSVPath -eq '' -or $CSVPath -eq $null){ Write-Error "Please enter the path of the CSV file that has the machine names into the CSVPath argument" exit 0 } if ($MachineNameHeader -eq '' -or $MachineNameHeader -eq $null){ Write-Error "The CSV file should include a header for the machine name column, please enter the header name into the MachineNameHeader argument" exit 0 } if ($RefreshToken -eq '' -or $RefreshToken -eq $null){ Write-Error "You need to pass in a refresh token using the RefreshToken argument. You may find your refresh token by logging onto Cyber Crucible and navigating to the Rest Integration page" exit 0 } if ($AgentLastActiveDays -lt 0){ Write-Error "The AgentLastActiveDays argument cannot be a negative number" exit 0 } $machineNames=@() Import-Csv -Path $CSVPath | ForEach-Object { if ($_ -ne '' -and $_ -ne $null -and $_.$MachineNameHeader -ne $null -and $_.$MachineNameHeader.Trim() -ne ''){ $machineNames+=$_.$MachineNameHeader.Trim() } } if($machineNames.Length -lt 1){ Write-Error "Error, did not find any machine names from the CSV file." exit 0 } Write-Host "Successfully found machine names from CSV." #Generate Access Token $awsHeaders = @{ "Content-Type"="application/x-www-form-urlencoded" } $awsReqBody = @{ "grant_type"="refresh_token" "client_id"="73ul9p1lhi9is87n01pusfomhq" "refresh_token"=$RefreshToken } $awsResponse = Invoke-RestMethod -Uri "https://ransomwarerewind.auth.us-west-2.amazoncognito.com/oauth2/token" -Headers $awsHeaders -Body $awsReqBody -Method "POST" -UseBasicParsing $accessToken = $awsResponse.access_token if ($accessToken -eq '' -or $accessToken -eq $null){ Write-Error "Error, could not generate an access token from the given refresh token" exit 0 } Write-Host "Successfully retrieved access token." #Get agents $traingModeForRequest = "false" $demoModeForRequest = "false" if($TrainingMode){ $traingModeForRequest = "true" } if($DemoMode){ $demoModeForRequest = "true" } $apiHeaders = @{ "Content-Type"="application/json" "Accept"="application/json" "Authorization"="Bearer $accessToken" } $apiReqBody = @{ "trainingMode"=$traingModeForRequest "demoMode"=$demoModeForRequest } $apiReqBody = ConvertTo-Json -InputObject $apiReqBody $apiResponse = Invoke-RestMethod -Uri "https://v2-web.tasking.ransomwarerewind.com/agentListReactive" -Headers $apiHeaders -Body $apiReqBody -Method "POST" -UseBasicParsing if($apiResponse.Length -lt 1){ Write-Host "No agents were found for this user" exit 0 } function RemoveLicenseFromAgent { param ($agentId) try { $removeLicenseReqBody = @{ "trainingMode"=$traingModeForRequest "demoMode"=$demoModeForRequest "agentId"=$agentId } $removeLicenseReqBody = ConvertTo-Json -InputObject $removeLicenseReqBody Invoke-RestMethod -Uri "https://v2-web.tasking.ransomwarerewind.com/releaseAgentLicenseReactive" -Headers $apiHeaders -Body $removeLicenseReqBody -Method "POST" -UseBasicParsing | Out-Null } catch {} } #Prep current date with AgentLastActiveDays $currentDate = Get-Date if($AgentLastActiveDays -gt 0){ $currentDate = $currentDate.AddDays(-$AgentLastActiveDays) #- to subtract days } $utcDateGreaterThan = $currentDate.ToUniversalTime() $agentMachineNamesList=@() $agentsMatchedAndCalledInWithinDaysCounter=0 Write-Host "Attempting to release licenses from agents with matching machine names, leave the script running until completion." foreach ($agent in $apiResponse){ if ($agent.agentId -ne $null -and $agent.machineName -ne $null -and $agent.machineName -ne '' -and $machineNames.Contains($agent.machineName.Trim())){ #matches with machine names from csv file #check last validate date before calling to remove the license $callToRemoveLicense = $true #defaults to true if($agent.lastValidateDateTime -ne $null -and $AgentLastActiveDays -gt 0){ try{ $agentLastValidateDate = Get-Date $agent.lastValidateDateTime $agentLastValidateDate = $agentLastValidateDate.ToUniversalTime() if($agentLastValidateDate -ne $null -and $agentLastValidateDate -gt $utcDateGreaterThan){ $callToRemoveLicense = $false } } catch{} } if($callToRemoveLicense){ RemoveLicenseFromAgent -agentId $agent.agentId } else{ $agentsMatchedAndCalledInWithinDaysCounter++ } } if($agent.machineName -ne $null -and $agent.machineName -ne ''){ $agentMachineNamesList+=$agent.machineName.Trim() } } #Keep track of machine names from the csv file that we don't find an agent for $machineNamesFoundCounter = 0 $machineNamesNotFoundCounter = 0 foreach ($machineName in $machineNames){ if ($agentMachineNamesList.Contains($machineName.Trim())){ $machineNamesFoundCounter++ } else{ $machineNamesNotFoundCounter++ } } if($machineNamesNotFoundCounter -gt 0){ Write-Host "From the given CSV file of machine names, $machineNamesNotFoundCounter machines were not found. Please make sure the user associated with the refresh token is a member of all machine groups" } # SIG # Begin signature block # MIIt9AYJKoZIhvcNAQcCoIIt5TCCLeECAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB # gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR # AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUW+sLyYylxeAnLD0MSk4VyJ8R # oP+ggidUMIIFjTCCBHWgAwIBAgIQDpsYjvnQLefv21DiCEAYWjANBgkqhkiG9w0B # AQwFADBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYD # VQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVk # IElEIFJvb3QgQ0EwHhcNMjIwODAxMDAwMDAwWhcNMzExMTA5MjM1OTU5WjBiMQsw # CQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cu # ZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQw # ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz # 7MKnJS7JIT3yithZwuEppz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS # 5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7 # bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfI # SKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jH # trHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14 # Ztk6MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2 # h4mXaXpI8OCiEhtmmnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt # 6zPZxd9LBADMfRyVw4/3IbKyEbe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPR # iQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ER # ElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4K # Jpn15GkvmB0t9dmpsh3lGwIDAQABo4IBOjCCATYwDwYDVR0TAQH/BAUwAwEB/zAd # BgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wHwYDVR0jBBgwFoAUReuir/SS # y4IxLVGLp6chnfNtyA8wDgYDVR0PAQH/BAQDAgGGMHkGCCsGAQUFBwEBBG0wazAk # BggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNlcnQuY29tMEMGCCsGAQUFBzAC # hjdodHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20vRGlnaUNlcnRBc3N1cmVkSURS # b290Q0EuY3J0MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly9jcmwzLmRpZ2ljZXJ0 # LmNvbS9EaWdpQ2VydEFzc3VyZWRJRFJvb3RDQS5jcmwwEQYDVR0gBAowCDAGBgRV # HSAAMA0GCSqGSIb3DQEBDAUAA4IBAQBwoL9DXFXnOF+go3QbPbYW1/e/Vwe9mqyh # hyzshV6pGrsi+IcaaVQi7aSId229GhT0E0p6Ly23OO/0/4C5+KH38nLeJLxSA8hO # 0Cre+i1Wz/n096wwepqLsl7Uz9FDRJtDIeuWcqFItJnLnU+nBgMTdydE1Od/6Fmo # 8L8vC6bp8jQ87PcDx4eo0kxAGTVGamlUsLihVo7spNU96LHc/RzY9HdaXFSMb++h # UD38dglohJ9vytsgjTVgHAIDyyCwrFigDkBjxZgiwbJZ9VVrzyerbHbObyMt9H5x # aiNrIv8SuFQtJ37YOtnwtoeW/VvRXKwYw02fc7cBqZ9Xql4o4rmUMIIFkDCCA3ig # AwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG # EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl # cnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMw # ODAxMTIwMDAwWhcNMzgwMTE1MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0GCSqGSIb3DQEBAQUA # A4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEppz1Y # q3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lX # FllVcq9ok3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxe # TsiT+CFhmzTrBcZe7FsavOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbu # yntd463JT17lNecxy9qTXtyOj4DatpGYQJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I # 9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6MUSaM0C/CNdaSaTC5qmg # Z92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtmmnTK3kse # 5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKy # Ebe7f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwh # HbJUKSWJbOUOUlFHdL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/ # Y+whX8QgUWtvsauGi0/C1kVfnSD8oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwID # AQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4E # FgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQADggIBALth2X2p # bL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY # ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdN # Oj6PWTkiU0TryF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4 # i/RN0iAL3gTujJtHgXINwBQy7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJ # EVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iahixTXTBmyUEFxPT9NcCOGDErcgdLM # MpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN5r5N0XWs0Mr7QbhD # parTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb/UdK # Dd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP # 0oUA51Aa5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLS # oCtU7ZpXwdv6EM8Zt4tKG48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9T # dSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP82Z+MIIGrjCCBJagAwIBAgIQBzY3tyRU # fNhHrP0oZipeWzANBgkqhkiG9w0BAQsFADBiMQswCQYDVQQGEwJVUzEVMBMGA1UE # ChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEwHwYD # VQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMjIwMzIzMDAwMDAwWhcN # MzcwMzIyMjM1OTU5WjBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQs # IEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEy # NTYgVGltZVN0YW1waW5nIENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC # AgEAxoY1BkmzwT1ySVFVxyUDxPKRN6mXUaHW0oPRnkyibaCwzIP5WvYRoUQVQl+k # iPNo+n3znIkLf50fng8zH1ATCyZzlm34V6gCff1DtITaEfFzsbPuK4CEiiIY3+va # PcQXf6sZKz5C3GeO6lE98NZW1OcoLevTsbV15x8GZY2UKdPZ7Gnf2ZCHRgB720RB # idx8ald68Dd5n12sy+iEZLRS8nZH92GDGd1ftFQLIWhuNyG7QKxfst5Kfc71ORJn # 7w6lY2zkpsUdzTYNXNXmG6jBZHRAp8ByxbpOH7G1WE15/tePc5OsLDnipUjW8LAx # E6lXKZYnLvWHpo9OdhVVJnCYJn+gGkcgQ+NDY4B7dW4nJZCYOjgRs/b2nuY7W+yB # 3iIU2YIqx5K/oN7jPqJz+ucfWmyU8lKVEStYdEAoq3NDzt9KoRxrOMUp88qqlnNC # aJ+2RrOdOqPVA+C/8KI8ykLcGEh/FDTP0kyr75s9/g64ZCr6dSgkQe1CvwWcZklS # UPRR8zZJTYsg0ixXNXkrqPNFYLwjjVj33GHek/45wPmyMKVM1+mYSlg+0wOI/rOP # 015LdhJRk8mMDDtbiiKowSYI+RQQEgN9XyO7ZONj4KbhPvbCdLI/Hgl27KtdRnXi # YKNYCQEoAA6EVO7O6V3IXjASvUaetdN2udIOa5kM0jO0zbECAwEAAaOCAV0wggFZ # MBIGA1UdEwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFLoW2W1NhS9zKXaaL3WMaiCP # nshvMB8GA1UdIwQYMBaAFOzX44LScV1kTN8uZz/nupiuHA9PMA4GA1UdDwEB/wQE # AwIBhjATBgNVHSUEDDAKBggrBgEFBQcDCDB3BggrBgEFBQcBAQRrMGkwJAYIKwYB # BQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2ljZXJ0LmNvbTBBBggrBgEFBQcwAoY1aHR0 # cDovL2NhY2VydHMuZGlnaWNlcnQuY29tL0RpZ2lDZXJ0VHJ1c3RlZFJvb3RHNC5j # cnQwQwYDVR0fBDwwOjA4oDagNIYyaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZFJvb3RHNC5jcmwwIAYDVR0gBBkwFzAIBgZngQwBBAIwCwYJ # YIZIAYb9bAcBMA0GCSqGSIb3DQEBCwUAA4ICAQB9WY7Ak7ZvmKlEIgF+ZtbYIULh # sBguEE0TzzBTzr8Y+8dQXeJLKftwig2qKWn8acHPHQfpPmDI2AvlXFvXbYf6hCAl # NDFnzbYSlm/EUExiHQwIgqgWvalWzxVzjQEiJc6VaT9Hd/tydBTX/6tPiix6q4XN # Q1/tYLaqT5Fmniye4Iqs5f2MvGQmh2ySvZ180HAKfO+ovHVPulr3qRCyXen/KFSJ # 8NWKcXZl2szwcqMj+sAngkSumScbqyQeJsG33irr9p6xeZmBo1aGqwpFyd/EjaDn # mPv7pp1yr8THwcFqcdnGE4AJxLafzYeHJLtPo0m5d2aR8XKc6UsCUqc3fpNTrDsd # CEkPlM05et3/JWOZJyw9P2un8WbDQc1PtkCbISFA0LcTJM3cHXg65J6t5TRxktcm # a+Q4c6umAU+9Pzt4rUyt+8SVe+0KXzM5h0F4ejjpnOHdI/0dKNPH+ejxmF/7K9h+ # 8kaddSweJywm228Vex4Ziza4k9Tm8heZWcpw8De/mADfIBZPJ/tgZxahZrrdVcA6 # KYawmKAr7ZVBtzrVFZgxtGIJDwq9gdkT/r+k0fNX2bwE+oLeMt8EifAAzV3C+dAj # fwAL5HYCJtnwZXZCpimHCUcr5n8apIUP/JiW9lVUKx+A+sDyDivl1vupL0QVSucT # Dh3bNzgaoSv27dZ8/DCCBrAwggSYoAMCAQICEAitQLJg0pxMn17Nqb2TrtkwDQYJ # KoZIhvcNAQEMBQAwYjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IElu # YzEZMBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTEhMB8GA1UEAxMYRGlnaUNlcnQg # VHJ1c3RlZCBSb290IEc0MB4XDTIxMDQyOTAwMDAwMFoXDTM2MDQyODIzNTk1OVow # aTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMUEwPwYDVQQD # EzhEaWdpQ2VydCBUcnVzdGVkIEc0IENvZGUgU2lnbmluZyBSU0E0MDk2IFNIQTM4 # NCAyMDIxIENBMTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW0L0LQ # KK14t13VOVkbsYhC9TOM6z2Bl3DFu8SFJjCfpI5o2Fz16zQkB+FLT9N4Q/QX1x7a # +dLVZxpSTw6hV/yImcGRzIEDPk1wJGSzjeIIfTR9TIBXEmtDmpnyxTsf8u/LR1oT # pkyzASAl8xDTi7L7CPCK4J0JwGWn+piASTWHPVEZ6JAheEUuoZ8s4RjCGszF7pNJ # cEIyj/vG6hzzZWiRok1MghFIUmjeEL0UV13oGBNlxX+yT4UsSKRWhDXW+S6cqgAV # 0Tf+GgaUwnzI6hsy5srC9KejAw50pa85tqtgEuPo1rn3MeHcreQYoNjBI0dHs6EP # bqOrbZgGgxu3amct0r1EGpIQgY+wOwnXx5syWsL/amBUi0nBk+3htFzgb+sm+YzV # svk4EObqzpH1vtP7b5NhNFy8k0UogzYqZihfsHPOiyYlBrKD1Fz2FRlM7WLgXjPy # 6OjsCqewAyuRsjZ5vvetCB51pmXMu+NIUPN3kRr+21CiRshhWJj1fAIWPIMorTmG # 7NS3DVPQ+EfmdTCN7DCTdhSmW0tddGFNPxKRdt6/WMtyEClB8NXFbSZ2aBFBE1ia # 3CYrAfSJTVnbeM+BSj5AR1/JgVBzhRAjIVlgimRUwcwhGug4GXxmHM14OEUwmU// # Y09Mu6oNCFNBfFg9R7P6tuyMMgkCzGw8DFYRAgMBAAGjggFZMIIBVTASBgNVHRMB # Af8ECDAGAQH/AgEAMB0GA1UdDgQWBBRoN+Drtjv4XxGG+/5hewiIZfROQjAfBgNV # HSMEGDAWgBTs1+OC0nFdZEzfLmc/57qYrhwPTzAOBgNVHQ8BAf8EBAMCAYYwEwYD # VR0lBAwwCgYIKwYBBQUHAwMwdwYIKwYBBQUHAQEEazBpMCQGCCsGAQUFBzABhhho # dHRwOi8vb2NzcC5kaWdpY2VydC5jb20wQQYIKwYBBQUHMAKGNWh0dHA6Ly9jYWNl # cnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRSb290RzQuY3J0MEMGA1Ud # HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRy # dXN0ZWRSb290RzQuY3JsMBwGA1UdIAQVMBMwBwYFZ4EMAQMwCAYGZ4EMAQQBMA0G # CSqGSIb3DQEBDAUAA4ICAQA6I0Q9jQh27o+8OpnTVuACGqX4SDTzLLbmdGb3lHKx # AMqvbDAnExKekESfS/2eo3wm1Te8Ol1IbZXVP0n0J7sWgUVQ/Zy9toXgdn43ccsi # 91qqkM/1k2rj6yDR1VB5iJqKisG2vaFIGH7c2IAaERkYzWGZgVb2yeN258TkG19D # +D6U/3Y5PZ7Umc9K3SjrXyahlVhI1Rr+1yc//ZDRdobdHLBgXPMNqO7giaG9OeE4 # Ttpuuzad++UhU1rDyulq8aI+20O4M8hPOBSSmfXdzlRt2V0CFB9AM3wD4pWywiF1 # c1LLRtjENByipUuNzW92NyyFPxrOJukYvpAHsEN/lYgggnDwzMrv/Sk1XB+JOFX3 # N4qLCaHLC+kxGv8uGVw5ceG+nKcKBtYmZ7eS5k5f3nqsSc8upHSSrds8pJyGH+PB # VhsrI/+PteqIe3Br5qC6/To/RabE6BaRUotBwEiES5ZNq0RA443wFSjO7fEYVgcq # LxDEDAhkPDOPriiMPMuPiAsNvzv0zh57ju+168u38HcT5ucoP6wSrqUvImxB+YJc # FWbMbA7KxYbD9iYzDAdLoNMHAmpqQDBISzSoUSC7rRuFCOJZDW3KBVAr6kocnqX9 # oKcfBnTn8tZSkP2vhUgh+Vc7tJwD7YZF9LRhbr9o4iZghurIr6n+lB3nYxs6hlZ4 # TjCCBsAwggSooAMCAQICEAxNaXJLlPo8Kko9KQeAPVowDQYJKoZIhvcNAQELBQAw # YzELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkRpZ2lDZXJ0LCBJbmMuMTswOQYDVQQD # EzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2IFRpbWVTdGFtcGlu # ZyBDQTAeFw0yMjA5MjEwMDAwMDBaFw0zMzExMjEyMzU5NTlaMEYxCzAJBgNVBAYT # AlVTMREwDwYDVQQKEwhEaWdpQ2VydDEkMCIGA1UEAxMbRGlnaUNlcnQgVGltZXN0 # YW1wIDIwMjIgLSAyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAz+yl # JjrGqfJru43BDZrboegUhXQzGias0BxVHh42bbySVQxh9J0Jdz0Vlggva2Sk/QaD # FteRkjgcMQKW+3KxlzpVrzPsYYrppijbkGNcvYlT4DotjIdCriak5Lt4eLl6FuFW # xsC6ZFO7KhbnUEi7iGkMiMbxvuAvfTuxylONQIMe58tySSgeTIAehVbnhe3yYbyq # Ogd99qtu5Wbd4lz1L+2N1E2VhGjjgMtqedHSEJFGKes+JvK0jM1MuWbIu6pQOA3l # jJRdGVq/9XtAbm8WqJqclUeGhXk+DF5mjBoKJL6cqtKctvdPbnjEKD+jHA9QBje6 # CNk1prUe2nhYHTno+EyREJZ+TeHdwq2lfvgtGx/sK0YYoxn2Off1wU9xLokDEaJL # u5i/+k/kezbvBkTkVf826uV8MefzwlLE5hZ7Wn6lJXPbwGqZIS1j5Vn1TS+QHye3 # 0qsU5Thmh1EIa/tTQznQZPpWz+D0CuYUbWR4u5j9lMNzIfMvwi4g14Gs0/EH1OG9 # 2V1LbjGUKYvmQaRllMBY5eUuKZCmt2Fk+tkgbBhRYLqmgQ8JJVPxvzvpqwcOagc5 # YhnJ1oV/E9mNec9ixezhe7nMZxMHmsF47caIyLBuMnnHC1mDjcbu9Sx8e47LZInx # scS451NeX1XSfRkpWQNO+l3qRXMchH7XzuLUOncCAwEAAaOCAYswggGHMA4GA1Ud # DwEB/wQEAwIHgDAMBgNVHRMBAf8EAjAAMBYGA1UdJQEB/wQMMAoGCCsGAQUFBwMI # MCAGA1UdIAQZMBcwCAYGZ4EMAQQCMAsGCWCGSAGG/WwHATAfBgNVHSMEGDAWgBS6 # FtltTYUvcyl2mi91jGogj57IbzAdBgNVHQ4EFgQUYore0GH8jzEU7ZcLzT0qlBTf # UpwwWgYDVR0fBFMwUTBPoE2gS4ZJaHR0cDovL2NybDMuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNybDCB # kAYIKwYBBQUHAQEEgYMwgYAwJAYIKwYBBQUHMAGGGGh0dHA6Ly9vY3NwLmRpZ2lj # ZXJ0LmNvbTBYBggrBgEFBQcwAoZMaHR0cDovL2NhY2VydHMuZGlnaWNlcnQuY29t # L0RpZ2lDZXJ0VHJ1c3RlZEc0UlNBNDA5NlNIQTI1NlRpbWVTdGFtcGluZ0NBLmNy # dDANBgkqhkiG9w0BAQsFAAOCAgEAVaoqGvNG83hXNzD8deNP1oUj8fz5lTmbJeb3 # coqYw3fUZPwV+zbCSVEseIhjVQlGOQD8adTKmyn7oz/AyQCbEx2wmIncePLNfIXN # U52vYuJhZqMUKkWHSphCK1D8G7WeCDAJ+uQt1wmJefkJ5ojOfRu4aqKbwVNgCeij # uJ3XrR8cuOyYQfD2DoD75P/fnRCn6wC6X0qPGjpStOq/CUkVNTZZmg9U0rIbf35e # Ca12VIp0bcrSBWcrduv/mLImlTgZiEQU5QpZomvnIj5EIdI/HMCb7XxIstiSDJFP # PGaUr10CU+ue4p7k0x+GAWScAMLpWnR1DT3heYi/HAGXyRkjgNc2Wl+WFrFjDMZG # QDvOXTXUWT5Dmhiuw8nLw/ubE19qtcfg8wXDWd8nYiveQclTuf80EGf2JjKYe/5c # QpSBlIKdrAqLxksVStOYkEVgM4DgI974A6T2RUflzrgDQkfoQTZxd639ouiXdE4u # 2h4djFrIHprVwvDGIqhPm73YHJpRxC+a9l+nJ5e6li6FV8Bg53hWf2rvwpWaSxEC # yIKcyRoFfLpxtU56mWz06J7UWpjIn7+NuxhcQ/XQKujiYu54BNu90ftbCqhwfvCX # hHjjCANdRyxjqCU4lwHSPzra5eX25pvcfizM/xdMTQCi2NYBDriL7ubgclWJLCcZ # YfZ3AYwwgggBMIIF6aADAgECAhAIT+24zduC0bG/oWRg7Vt3MA0GCSqGSIb3DQEB # CwUAMGkxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5EaWdpQ2VydCwgSW5jLjFBMD8G # A1UEAxM4RGlnaUNlcnQgVHJ1c3RlZCBHNCBDb2RlIFNpZ25pbmcgUlNBNDA5NiBT # SEEzODQgMjAyMSBDQTEwHhcNMjIwOTA4MDAwMDAwWhcNMjMwOTEyMjM1OTU5WjCB # 1jETMBEGCysGAQQBgjc8AgEDEwJVUzEZMBcGCysGAQQBgjc8AgECEwhEZWxhd2Fy # ZTEdMBsGA1UEDwwUUHJpdmF0ZSBPcmdhbml6YXRpb24xEDAOBgNVBAUTBzU2NDgw # MTgxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhNYXJ5bGFuZDEVMBMGA1UEBxMMU2V2 # ZXJuYSBQYXJrMR0wGwYDVQQKExRDeWJlciBDcnVjaWJsZSwgSW5jLjEdMBsGA1UE # AxMUQ3liZXIgQ3J1Y2libGUsIEluYy4wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw # ggIKAoICAQCZ9t42qtBSxSj5oRBydnlQK+vqawDE5JQak8cWnNqijjlVxgWyPNmb # jF2YMZaTU57PEwU2J1SUEV3SQD/X/yf1+YfZy5iwD4dmcgeVWo7qRgeiPTpqfcYM # wtyXBiOlkZ9OwUTNV6/RPeOoqcGmw20jOXjUXSQezqsmo5r2bQ/ot5D1aQERuQBq # ivLIQdMNVcJVhOCsHevQPIngrm3OpOGYNUmbgCnbMhxdwDpEliWx52wzpnIUC7qk # OGqnlVUpnfx4cdpcXnbBICznmHbVZgDGAXg2w9ikQqCtgJwY5Fbq4XB8/xMgwXbZ # ZdQ/NKVjgx/pmadOo3UYCZ4Yf1l8CB8fKsNEtcGAShMlXs3wQ3CEICDGJCjxToDI # 343dtuhC+DEyQZMRBYvltbS1N1bu8nA5Ykc/DGh/JeI+i0ArpQrCqa9XJU2MqXqO # IksQ6PreFNkd1y7kccnbUE6PqI84IiT9v+FeOtpEMBvh7H2Hqi6u/3CmakcG/1iv # 6HQrE7/UDJu3eX2tRSlWMWKy5jfO+UxPuZAPKjK4smnCMDddyfB5nm8fUK/lg66d # SqVK1++D56BtgO7xIkOD/axp82QDLKeoF4k0B3yBWb+xdEsO6ooKCaIH/ArnvhNk # 3qQa3PTeEgdZOLcMlHFg7XWnERHAYQPycQdDrS4gr81dxVAq0dFHmwIDAQABo4IC # NTCCAjEwHwYDVR0jBBgwFoAUaDfg67Y7+F8Rhvv+YXsIiGX0TkIwHQYDVR0OBBYE # FIjEmw/L+4v+wR6YE2zmDioxzcb8MC4GA1UdEQQnMCWgIwYIKwYBBQUHCAOgFzAV # DBNVUy1ERUxBV0FSRS01NjQ4MDE4MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAK # BggrBgEFBQcDAzCBtQYDVR0fBIGtMIGqMFOgUaBPhk1odHRwOi8vY3JsMy5kaWdp # Y2VydC5jb20vRGlnaUNlcnRUcnVzdGVkRzRDb2RlU2lnbmluZ1JTQTQwOTZTSEEz # ODQyMDIxQ0ExLmNybDBToFGgT4ZNaHR0cDovL2NybDQuZGlnaWNlcnQuY29tL0Rp # Z2lDZXJ0VHJ1c3RlZEc0Q29kZVNpZ25pbmdSU0E0MDk2U0hBMzg0MjAyMUNBMS5j # cmwwPQYDVR0gBDYwNDAyBgVngQwBAzApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3 # LmRpZ2ljZXJ0LmNvbS9DUFMwgZQGCCsGAQUFBwEBBIGHMIGEMCQGCCsGAQUFBzAB # hhhodHRwOi8vb2NzcC5kaWdpY2VydC5jb20wXAYIKwYBBQUHMAKGUGh0dHA6Ly9j # YWNlcnRzLmRpZ2ljZXJ0LmNvbS9EaWdpQ2VydFRydXN0ZWRHNENvZGVTaWduaW5n # UlNBNDA5NlNIQTM4NDIwMjFDQTEuY3J0MAwGA1UdEwEB/wQCMAAwDQYJKoZIhvcN # AQELBQADggIBABOHKDwvFf/1gxCu7iMWIFzT6Y1c9uTWp12Bi72gYRRnvpHUrg+X # BsYxL/71GUWHqca6jqu5wyxhsQypA1PiSLRjHjQaF9Rf6JT3IW3TNc2JqVQSevLg # DxwVe6w8Wc97Mxh8qOBkjZRFRKfPO/tA5dJK7PCFe2Hu7I14srQog3F20T8Q6l4h # P9lmGl+1hOkpTpGC+Zi9yvok9ERbrKurPfwXKyL6DC0TjEqXNekHcjvbXwjJn9x6 # R85H+G5HP46W/8FXi694qM/zbNSEBqnURuDt1+AhruPpet4M85UW+ONW6j3UQtvZ # WcYd0339Mny3W76I5aEzRQUcpZnIz+9vkSXuFcqasLdUtJ7i8aSJJOdfOeDi0onv # PXpK60aDvEk1kDeDj1eeO3NFnLvt8G7SxMkJgcg4wG5bUBjnJoOD2F5d9yqqH9F9 # 6ks4zvb9+oAvaK/STlzTT/lUHa8UAg5PgkbpIgogF1puk3wwAclxJO0yg9zPpkjy # 8Pl+uh4L1E5Hg5u6DRP9a7Detcc8Xe5r7raxRv78CQl/bLv++Q+sDmx/y1T5SGp/ # zESm1so+GX3WcJjvcf59FsA55InJPocat9OLSiDVkPKVmi007gzhAYdLZt2z7SEz # tXtPgK62Dw5UCd8KpZ1GQQwbu13GMAd5fL+YNqS2luuF8bIeGZTe7pB4MYIGCjCC # BgYCAQEwfTBpMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4x # QTA/BgNVBAMTOERpZ2lDZXJ0IFRydXN0ZWQgRzQgQ29kZSBTaWduaW5nIFJTQTQw # OTYgU0hBMzg0IDIwMjEgQ0ExAhAIT+24zduC0bG/oWRg7Vt3MAkGBSsOAwIaBQCg # QDAZBgkqhkiG9w0BCQMxDAYKKwYBBAGCNwIBBDAjBgkqhkiG9w0BCQQxFgQULczj # DGTHRX3sl3iNOtmGYsk9AIMwDQYJKoZIhvcNAQEBBQAEggIAawt+cmY3sxh4j/Q1 # sU+9USDUf1OV6HOr6/ZhZNxAEDdCNOkPZEAXQLBXc+4pA9wRp9bKlsZozfhS5Byt # 2FqtKke9MQlPf+S7/ZFivPbiFmVX0S6KIexFiWFTbTqOfrCtYe+u2T5e605VahlO # J/Q484Dd/225dTzt3RA/Lf6aXVwtctcGzB35dAYctuODlpucXD4QrW6J/JQTjtgY # +xKfKR+wsnb+QlNjqHYHxRZcmDMv+TuUdl86gSQvC5TmjchxvpZQD7Mj0PpFSHSd # oXZ9Nr/m3FLY4tjU9rmYfrkXdjUXU5otIDHMBJk4cawUp27zpDvG9soO6dXOMTZC # PFnoDiARcfHbFdVBuKUJ8bpIrMpCsR6d5rYX9bOklfS31gB7xCmkSsgnTQJK8O2h # u2aLTz/QktttvCk2LkYOjM6+k1ty/tTDopiMoKcaojM0hA+nBS5QM/tQNH8pCORg # iQPDLBKem9+uUyIPJAh4MyJprYTRj0j6mIV0luFD99lk27q2rnElSs2/DAAT4MrI # 7baLmoxpOKJ/abT0trd/fxL4TgchDKiq79/IlA2+4Zr1YtyDi/HoP1DKrid5q+Mf # R7u2gYfc6FPmiaMxYGuDNBby4LDjn63cBPaVhagZTJHgpzSHz/2EKWFXoUArahtF # m2N//xCGMYzrX6Fy3/nN6eH5SouhggMgMIIDHAYJKoZIhvcNAQkGMYIDDTCCAwkC # AQEwdzBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGlnaUNlcnQsIEluYy4xOzA5 # BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5NiBTSEEyNTYgVGltZVN0 # YW1waW5nIENBAhAMTWlyS5T6PCpKPSkHgD1aMA0GCWCGSAFlAwQCAQUAoGkwGAYJ # KoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjMwNjA3MjE0 # ODQ2WjAvBgkqhkiG9w0BCQQxIgQg0ByGXnOQJT44Bjc2RxrRhmAB4pCHOuxkCLiX # /He4Z/4wDQYJKoZIhvcNAQEBBQAEggIARD0y4aeFWemZmUlyji2s+PvTYKosx1Ml # fZD7lLHyuQLwJLzfnZgptyQIxOYQdWlNAVrXJd7mz19ZXZaMGZlNmouXArkzFtEo # zo5RfA7TJDlFdI1OsDXhIsbhS/BDtYfWXM9nQkF41+bnhoHE0iMHbogU85nDttbi # RsSXxryBh94yuGUvmJdHiyllUyngg1BGb1tDQCRKIHhQhGWv3ysaWpgJ3LpCaIQm # iSpq9NAv20TA8twwIx9B86z6fzHHlXouQfz8YdhSH3nBQDypoB/YfETZHDD7t7fP # XHIuoIRMlbPIfl5SDDqtHiQds2H5qQMBkIGGn6s4WTyfzMoZitqD110HrNUliXZB # 1uelGp1K8zbDlhStyel0VCli6cm3IUMBQup/uNYIpqtvbcgvVa4vuYy5ryEhhMSW # E7eeu7ld+BxwGo682aLsKmUHQwP9vsD9kK4XVfpsqNIchga16pR67wOWjctpkZvV # t2g5P9tzXptzCVDlPHArlnRi5RslA12s05lR4a7yExLBcmcbF0cZ2DSpS7MhYKmt # iUK1bc5P9imrItm6Dx2uySW4aUgR6eyVBdOLKbN5HVNwND8SfbzbR4heShkp8K5E # iZUHffXQvoltFTCzcfdw9s6f+eFl9O13PIASy66oKB2QWSqYUUxaTnztr3LT7fnN # mkw0EUcxVCA= # SIG # End signature block