From d349e3374e5a6ae459ab40a6f11536bf7dace5d6 Mon Sep 17 00:00:00 2001 From: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com> Date: Thu, 27 Feb 2025 22:03:37 +0100 Subject: [PATCH] Merge upstream PT #13 (#462) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Workspaces] implement the move feature (#35480) * [Workspaces] Add move functionality * spell checker * [Workspaces] Modify Arranger to move apps without launch * moved ipc helper * removed callback * use LauncherStatus in WindowArranger * wait for launching next app * launch in a separate thread and protect by mutexes * update app version in advance * changed canceling launch * increased waiting time * Fix optional parameter load from json * changed arranger waiting time * additional waiting time for Outlook * added app id * ensure ids before launch * set id in editor * minor updates * [Workspaces] Move: Get the nearest window when moving a window * [Workspaces] convert optional boolean to enum to avoid json problems * Handle case when the new Application Property "moveIfExists" does not exist * Re-implementing app-window pairing for moving feature. * spell checker * XAML formatting * Fixing bug: IPC message not arriving * spell checker * Removing app-level-setting for move app. Also fixed compiler errors due styling. * Updating editor window layout * Re-implementing window positioning UI elements * XAML formatting * Code review findings * Code cleanup * Code cleanup * Code cleanup * code cleanup * Code cleanup * Code cleanup * fix Move attribute after launch and snapshot * Extend WindowArranger with PWA functionality to detect different PWA apps. PwaHelper moved to the common library * fix repeat counter in the editor * Code optimization * code cleanup, optimization * fix double-processing window --------- Co-authored-by: Seraphima Co-authored-by: donlaci * [KeyboardManager]Fix mapping shift to numpad (#35890) * Keyboard Manger fix numpad as shift Fixed shift not being released if a numpad key as shift. * Added comments * Fix typo * Fix the numpad unlocked key not working if the locked version is overridden by shift * Fix spelling check. * Revert the VK_CLEAR change. --------- Co-authored-by: Jaime Bernardo * [Analyzers] Update .editorconfig with rules to relax IDE errors (#36095) * [Analyzers] Remove duplicate pascal case style from .editorconfig * [Analyzers] Configured severity for individual IDE and CA rules showing as errors in VS Set severity for IDE0005, IDE0008, IDE0016, IDE0018, IDE0019, IDE0021, IDE0022, IDE0023, IDE0025, IDE0027, IDE0028, IDE0029, IDE0031, IDE0032, IDE0034, IDE0036, IDE0039, IDE0042, IDE0044, IDE0045, IDE0046, IDE0047, IDE0057, IDE0051, IDE0052, IDE0054, IDE0055, IDE0056, IDE0057, IDE0059, IDE0060, IDE0061, IDE0063, IDE0071, IDE0073, IDE0074, IDE0075, IDE0077, IDE0078, IDE0083, IDE0090, IDE0100, IDE0130, IDE160, IDE180, IDE0200, IDE0240, IDE0250, IDE0251, IDE0260, IDE0270, IDE0290, IDE0300, IDE0301, IDE0305, IDE1005, IDE1006, CA1859, CA2022, CA2263 * [Analyzers] Fix mismatched analyzer descriptions * [Analyzers] Fix misspelling * Update .editorconfig Made the following style rules `silent` instead of `suggestion`: - Use explicit type instead of 'var' - Use expression body for ... - Use block-scoped namespace * [Analyzers] Set IDE0290 to silent * [Analyzers] Remove IDE1006 configuration from .editorconfig in favor of making exclusions for the few entries * [Analyzers][Indexer] Add IDE1006 suppressions * [Analyzers][Peek] Add IDE1006 suppression * [Analyzers][MWB] Add IDE1006 suppression. * [Analyzers][Plugins] Add IDE1006 suppression * [Analyzers][ImageResizer] Suppress IDE0073 to retain original copyright * [Analyzers] Remove IDE0073 severity change in .editorconfig --------- Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com> * [Workspaces] PWA follow-up (#36217) * [PTRun][Calculator]Allow scientific notation with lowercase 'e' (#36187) * [Workspaces] Add encoder parameter to bitmap.save() (#36228) * [Workspaces] Add encoder parameter to bitmap.save() * 1 more call fixed * Move repeated code to the csharp library * [Workspaces] Implement store of app window's size and position (#36086) * [Workspaces] Implement store of app window's size and position * Modifying the default values to -1. The program will use the original default values for the first run. * [ScreenRuler]Add setting to show the measurement in an extra unit (#35887) * display ruler: supporting millimeter and other units * Measurement Tool: UI Setting for an extra unit * Update images * spelling * spelling * suit code style * Fix for code review * remove weird file * rename field * [Deps]Update MSTest from 3.5.0 to 3.6.3 (#36115) * Update MSTest from 3.5.0 to 3.6.3 * Use STA attributes that are now part of MSTest * Adding Jerry to community.md (#36232) Update COMMUNITY.md * [Workspaces] Arranger: smart timer (#36096) * [Workspaces] Add move functionality * spell checker * [Workspaces] Modify Arranger to move apps without launch * moved ipc helper * removed callback * use LauncherStatus in WindowArranger * wait for launching next app * launch in a separate thread and protect by mutexes * update app version in advance * changed canceling launch * increased waiting time * Fix optional parameter load from json * changed arranger waiting time * additional waiting time for Outlook * added app id * ensure ids before launch * set id in editor * minor updates * [Workspaces] Move: Get the nearest window when moving a window * [Workspaces] convert optional boolean to enum to avoid json problems * Handle case when the new Application Property "moveIfExists" does not exist * Re-implementing app-window pairing for moving feature. * spell checker * XAML formatting * Fixing bug: IPC message not arriving * spell checker * Removing app-level-setting for move app. Also fixed compiler errors due styling. * Updating editor window layout * Re-implementing window positioning UI elements * XAML formatting * Code review findings * Code cleanup * Code cleanup * Code cleanup * code cleanup * Code cleanup * Code cleanup * [Workspaces] Arranger: Reset wait timer after each successful arrange action * fix merge error --------- Co-authored-by: Seraphima Co-authored-by: donlaci * Upgrade to check-spelling v0.0.24 (#36235) This upgrades to [v0.0.24](https://github.com/check-spelling/check-spelling/releases/tag/v0.0.24). A number of GitHub APIs are being turned off shortly, so you need to upgrade or various uncertain outcomes will occur. There's a new accessibility forbidden pattern: > Do not use `(click) here` links > For more information, see: > * https://www.w3.org/QA/Tips/noClickHere > * https://webaim.org/techniques/hypertext/link_text > * https://granicus.com/blog/why-click-here-links-are-bad/ > * https://heyoka.medium.com/dont-use-click-here-f32f445d1021 ```pl (?i)(?:>|\[)(?:(?:click |)here|link|(?:read |)more)(?: * Awake Updates - `TILLSON_11272024` (#36049) * Update with bug fixes for tray icon and support for parent process * Process information enum * Update the docs * Fix spelling * Make sure that PID is used in PT config flow * Logic for checks based on #34148 * Update with link to PR * Fixes #34717 * Small cleanup * Proper task segmentation in a function * Cleanup the code * Fix synchronization context issue * Update planning doc * Test disabling caching to see if that manages to pass CI * Cleanup to make sure that we're logging things properly. * Update ci.yml * Disable cache to pass CI * Retry logic * Cleanup * Code cleanup * Fixes #35848 * Update notes and codename * After third attempt, log error instead of throwing exception * More cleanup to avoid double execution * Add expected word * Safeguards for bad values for timed keep-awake * More updates to make sure I am using uint * Update error message * Update packages * Fix notice and revert CsWinRT upgrade * Codename update * Update expect.txt * Update the struct * Ensuring we're properly awaiting tray initialization * Update to make sure tray reflects the bound process * Cleanup, proper JSON serialization for logs. * Not needed. * Add command validation logic * Moving the initialization logic earlier * Make sure we show the display state in the tooltip * Update tray string * Update src/modules/awake/Awake/Core/Manager.cs Co-authored-by: Jaime Bernardo * Update src/modules/awake/Awake/Core/Manager.cs Co-authored-by: Jaime Bernardo * Update src/modules/awake/Awake/Core/Manager.cs Co-authored-by: Jaime Bernardo * Update src/modules/awake/Awake/Core/Manager.cs Co-authored-by: Jaime Bernardo * Update logic for icon resets * Update doc * Simplify function for setting mode shell icon * Issues should be properly linked * Minor cleanup * Update timed behavior --------- Co-authored-by: Jaime Bernardo Co-authored-by: Clint Rutkas * [Workspaces] detecting right app version (#36100) * [Workspaces] Add move functionality * spell checker * [Workspaces] Modify Arranger to move apps without launch * moved ipc helper * removed callback * use LauncherStatus in WindowArranger * wait for launching next app * launch in a separate thread and protect by mutexes * update app version in advance * changed canceling launch * increased waiting time * Fix optional parameter load from json * changed arranger waiting time * additional waiting time for Outlook * added app id * ensure ids before launch * set id in editor * minor updates * [Workspaces] Move: Get the nearest window when moving a window * [Workspaces] convert optional boolean to enum to avoid json problems * Handle case when the new Application Property "moveIfExists" does not exist * Re-implementing app-window pairing for moving feature. * spell checker * XAML formatting * Fixing bug: IPC message not arriving * spell checker * Removing app-level-setting for move app. Also fixed compiler errors due styling. * Updating editor window layout * Re-implementing window positioning UI elements * XAML formatting * Code review findings * Code cleanup * Code cleanup * Code cleanup * code cleanup * Code cleanup * Code cleanup * [Workspaces] fix detection of specific version of apps --------- Co-authored-by: Seraphima Co-authored-by: donlaci * Move the XamlStyler config to src/ (#36202) my never ending goal to minimize files in the root dir * [AdvancedPaste]Add Semantic Kernel opt-in to allow chaining of paste actions (#35902) * [AdvancedPaste] Semantic Kernel support * Changed log-line with potentially sensitive info * Spellcheck issues * Various improvements for Semantic Kernel * Spellcheck issue * Refactored Clipboard routines * Added integration tests for KernelService * Extra telemetry for AdvancedPaste * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event * Added IsSavedQuery * Added KernelQueryCache * Refactoring * Added KernelQueryCache to BugReportTool delete list * Added opt-n for Semantic Kernel * Fixed bug with KernelQueryCache * Ability to view last AI chat message on error * Improved kernel query cache * Used System.IO.Abstractions and improved tests * Fixed under-count of token usage * Used Semantic Kernel icon * Cleanup * Add missing EndProject line * Fix dependency version conflicts * Fix NOTICE.md * Correct place of SemanticKernel in NOTICE.md * Unlinked CustomPreview toggle from AI * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste * Fixed NOTICE.md order * Moved Custom Preview to behaviour section * Made Image to Text raise error on empty output * Added AIServiceBatchIntegrationTests * Updated AIServiceBatchIntegrationTests * Added prompt moderation * Moved GPO Infobar to better location * [Launcher]Port from WPF-UI to .NET 9 WPF (#36215) * Initial implementation * Fix fluent style * Fix no endline * Update expect.txt * Fix formatting * Fix light theme looking bad on Windows 10 * fix formatting * test change * Now really fixed W10 * Add a comment * Fix typos * Fix spellcheck errors * Fix spellcheck pattern for websites * Change patterns for spellcheck in the right file * Fix XAML styling * Fix contrast colors on W11 * Fix formatting * Removed emty line * Fix formatting * Added comment to fluentHC file * fix comment * Fix Windows10 again. Adress feedback. * W11 fix chaning from high contrast to normal not having correct background * W10 Fix high contrast not working after switching from light/dark moed * Address feedback * Fix formatting * Second W11 fix chaning from high contrast to normal not having correct background * [UX]Updating New+ and Settings icons (#36290) * Updated icons * Updating more icons and icos * [Settings][Dashboard] Accessibility fixes (#36280) * make narrator announce buttons/toggles * add toggles module name * [ci]Sign OpenAI dll that's not signed (#36299) * Update CODEOWNERS to include gordon, jerry and kayla (#36308) * Update CODEOWNERS * Update names.txt * Making the powertoys-code-owners team code owners (#36310) * Update CODEOWNERS * Update names.txt * Update CODEOWNERS * [FZEditor]Fix Create new layout dialog radio buttons IsChecked values (#36320) * 0.87 changelog (#36335) * 0.87 changelog * Fix spellcheck * Update README.md Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> --------- Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> * [PTRun]Fix WPF transparent border issue on Windows 10 (#36392) * Added border on W10 * Added a comment --------- Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com> * [PTRun]Fix .NET 9 crash in OneNote (#36417) * Fix crash in OneNote Run * added better comment * [AdvancedPaste]Fix NullReferenceException on Dispose (#36428) [AdvancedPaste] Fixed NullReferenceException on Dispose * [Fuzz] Add fuzz testing for AdvancedPaste and new pipeline for onboarding OneFuzz (#36329) * add fuzz * install .net8 * add spelling check * refine the pipeline * add readme and update the test code * fix spelling error * change to weekly run * Add New CI Pipeline for Latest WindowsAppSDK (#36282) This PR introduces the following changes to the CI pipeline and version management: Pipeline Enhancements: 1. Added a new script UpdateVersions.ps1 to automate the update of Microsoft.WindowsAppSDK versions across various project files. 2. Introduced a new pipeline configuration ci-using-the-latest-winappsdk.yml to build using the latest Microsoft.WindowsAppSDK. 3. Updated existing pipeline configurations to support the new useLatestWinAppSDK parameter. Pipeline Configuration Updates: 1. Updated job-build-project.yml to handle the useLatestWinAppSDK parameter and adjust the RestoreAdditionalProjectSourcesArg accordingly. 2. Added a new template steps-update-winappsdk-and-restore-nuget.yml for updating and restoring NuGet packages with the latest Microsoft.WindowsAppSDK. 3. Added WinAPPSDK version selection, the pipeline can be manually triggered to use the specified version. --------- Signed-off-by: Shawn Yuan Co-authored-by: Clint Rutkas * [AOT compatible] Make HostsUILib become AOT compatible (#36136) * Remove AOT configuration * Refer to AOT compatibility props --------- Co-authored-by: Yu Leng (from Dev Box) * [AOT compatible] Clean up some AOT build issue in FilePreviewCommon and MarkdownPreviewHandler (#36207) * Use AppContext.BaseDirectory to replace assembly.GetExeAseembly.Location. Fix json serilizer aot issue. * clean up some AOT build issue * Update src/modules/previewpane/MarkdownPreviewHandler/MarkdownPreviewHandlerControl.cs Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> * Update src/common/FilePreviewCommon/Formatters/JsonFormatter.cs Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> --------- Co-authored-by: Yu Leng (from Dev Box) Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> * Add new pipeline using the latest webview2 from Edge Canary (#36317) * using the latest webview2 for testing --------- Signed-off-by: Shawn Yuan Co-authored-by: Clint Rutkas * [Bug fix] Making the OpenAI key configuration page scrollable. (#36359) * Fixed #34470 --------- Signed-off-by: Shawn Yuan * [Bug fix] Add a format validation step before format conversion. (#36404) This PR aims to fix the bug #35225 by introducing a new method IsJson to determine if a given text is in JSON format. The IsJson method is then utilized in the ToJsonFromXmlOrCsvAsync method to optimize the processing logic. If the text is already in JSON format, it is returned directly without further conversion from XML or CSV. Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> --------- Signed-off-by: Shawn Yuan Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> * Add more STCA team members (#36438) * Add more STCA team members * Include more spelling check errors * Remove non-alpha in dictionary * Add Zhaopeng Wang * Fix spell checking error * Remove "prerelease: true" (#36484) * Remove "prerelease: true" The Microsoft.WinGet.DSC module is GA so prerelease: true is no longer needed. * Update expect.txt fixing spellcheck warning --------- Co-authored-by: Clint Rutkas * [Docs]Update README for 0.87.1 release (#36534) * [CI] Enhance build Pipeline Reliability with Retry Logic and Improved Error Messaging (#36529) * update pipeline with retry * remove tests * Add team member (#36590) * [New+]Don't override New actions from Explorer on Windows 10 (#36467) * [New+]Don't override New actions from Explorer * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp * Update src/modules/NewPlus/NewShellExtensionContextMenu.win10/shell_context_menu_win10.cpp * Add pattern for learn.microsoft links * Also only Query for context menu * [PTRun][Calculator]Handle hexadecimal numbers to not return divide by 0 error (#36390) * add '0x' handling for divide by 0 scenarios * fix comment on division by 0 check --------- Co-authored-by: Connor Plante * [TextExtractor]Minor UI/Accessibility fixes in the overlay UI (#36356) minor UI and accessibility fixes * [PTRun][Calculator]Update mages to v3.0.0 and support for `randi(n)` (#36560) * update to mages 3.0.0 * allow randi() in calculator plugin * fix tests and input validation * fix spell check * [QuickAccent]Added ć for Slovenian (#36336) (#36338) * Fix snapping Workspaces Editor to Fancy Zones (#36463) * Remove Workspaces Editor from Fancy Zone's excluded app list * removed unused string --------- Co-authored-by: Seraphima * [PTRun]Fix drag on .NET 9 WPF (#36635) * [CQ]Continued to move stuff out of root - Solution.props (#36244) * [QuickAccent]Add Proto-Indo-European (#36408) * Add ḱ to PowerAccent for Proto-Indo-European * Fix Spelling Check * Add more letters to PIE * Order PIE after PI --------- Co-authored-by: Hao Liu (from Dev Box) Co-authored-by: Jaime Bernardo * [PTRun]Add context buttons for VSCodeWorkspaces plugin (#36517) * [Settings][QuickAccent]Change 'character set' to plural form (#36565) * [PTRun][Calculator]Fix unit tests on non-english systems (#36569) * fix tests * update comment * [PTRun][Calc]Improve handling of non-base 10 numbers (#36700) * [Settings][PTRun]Show plugin version and website (#36580) * [Monaco]Add support for .resx and .resw preview support. (#36499) Added support for .resx and .resw preview support. These files are XML based files so I added the file extensions as part of the registerAdditionalLanguage("xmlExt"...) function. * [Settings] Add Workspaces' workspaces.json file to backup/restore list (#36714) * [Localization] Fix loc pipeline to send downloaded localized files to TDBuild upon retry after failure (#36766) * [AdvancedPaste]Fixed issues with Screen Reader integration (#36778) * Remove Advent calendar from README (#36777) * Remove Advent calendar from README * Update hero image * Delete doc/images/overview/PT_holiday_hero_image.png * [AdvancedPaste]Add all BitmapDecoder supported image filetypes to ImageToText (#35600) Adds support to ImageToText for all image filetypes supported by BitmapDecoder. * [AOT]Clean up some AOT build issues in PowerAccent.Core (#36264) * init * Use AotCompatibility instead * Replace typeof(Lanaguge) with GetValues * Create new folder to place source generation context file. --------- Co-authored-by: Yu Leng (from Dev Box) * [WinUI3]Fix Windows 10 title bar borders (#36429) * Fix borders for windows in the Settings UI * Fix HOSTS window * Fix Advanced Paste * Fix Environment Variables * Fix File Locksmith * Fix Peek, with a caveat * Fix Registry Preview * Remove unused imports * Clean up imports in OobeShellPage * Move OSVersionHelper from Common.UI up into ManagedCommon * [QuickAccent]Fix unstable language loading (#36721) * [Peek]Bring into foreground if previously minimized (#36506) Added Activate() to bring Peek.UI window into focus upon Toggle. This allows the UI to be presented even if it was previously minimized. * Update Run docs README (#36857) * Update Run docs README * Remove System dupe * [Monaco]Make minimap toggleable (#33742) * [Monaco]Fix Json format preview setting (#36867) * [KBM]Added option for exact match shortcut (#36000) * Added option for exact match shortcut * Fix spell-check * [Deps][Security]Update .NET Packages from 9.0.0 to 9.0.1 (#36879) * [Deps] Update NuGet packages to version 9.0.1 Updated several NuGet packages from version 9.0.0 to 9.0.1, including: - Microsoft.Data.Sqlite - Microsoft.Bcl.AsyncInterfaces - Microsoft.Extensions.DependencyInjection - Microsoft.Extensions.Logging - Microsoft.Extensions.Logging.Abstractions - Microsoft.Extensions.Hosting - Microsoft.Extensions.Hosting.WindowsServices - Microsoft.Win32.SystemEvents - Microsoft.Windows.Compatibility - System.CodeDom - System.ComponentModel.Composition - System.Configuration.ConfigurationManager - System.Data.OleDb - System.Diagnostics.EventLog - System.Diagnostics.PerformanceCounter - System.Drawing.Common - System.Management - System.Runtime.Caching - System.ServiceProcess.ServiceController - System.Text.Encoding.CodePages - System.Text.Json * [Deps] Update NOTICE.md * [Peek]Fix using the correct Monaco assets at runtime (#36890) * [Workspaces] fixing bug: editor starts outside of visible desktop area (#36769) * [Workspaces] fixing bug: editor starts outside of visible desktop area * Update src/modules/Workspaces/WorkspacesEditor/MainWindow.xaml.cs Co-authored-by: Seraphima Zykova --------- Co-authored-by: Seraphima Zykova * [Workspaces] Saving app properties on launch and recapture (#36751) * [Workspaces] Implementing set and get GUID to/from HWND to distinguish windows moved by the Workspaces tool * After launch and capture copy the CLI args from the "original" project * Fix getting GUID * spell check * modification to be able to handle different data sizes on different systems * code optimisation * Replacing string parameter by InvokePoint * renaming variable * [AdvancedPaste]Use background thread for interactions between runner and Advanced Paste (#36858) * [Advanced Paste] Use background thread for runner-Advanced Paste interaction * Fixed typo * [VCM]Deprecate the Video Conference Mute utility (#36772) * Remove all VideoConferenceMute related code and files * Clean up vcm driver registry keys * Also remove the Webcam report tool * Also clean out video conference on the installer * Fix spellcheck * Remove comment about video conf * Update gpo files revision * Revert removing the VCM policies * Deprecate VCM GPO policy * Change deprecation message to show first supported version * Tweak supported strings in the adml * Goodbye friends, you are forever part of the team (#36905) * Goodbye friends Forever part of the team 😢 * Update COMMUNITY.md * Fix formatting issues in COMMUNITY.md * [New utility]Sysinternals ZoomIt (#35880) * ZoomIt initial code dump * Change vcxproj to normalize dependency versions * Fix code quality to build * Add to PowerToys solution * Clean out C-style casts * Fix some more analyzer errors * Constexpr a function * Disable some warnings locally that it seemed better not to touch * Add ZoomIt module interface * Add GPO * Add Settings page with Enable button * Output as PowerToys.ZoomIt.exe * Extract ZoomIt Settings definition to its own header * Make ZoomItModuleInterface build with ZoomItSettings too * WinRT C++ interop for ZoomItSettings * From Registry To PowerToys Json * Properly fix const_cast analyzer error * Initial Settings page loading from registry * Zoom mode settings * Save settings * Add file picker and DemoType file support * Remaining DemoType settings * Have ZoomIt properly reloading Settings and exiting * Remove context menu entries for Options and Exit * ZoomIt simple Break Options * Break advanced options * Simple Record settings * Record Microphone setting * Fix break background file picker title * Font setting * Fix build issues after merge * Add ZoomIt conflict warning to Settings * Exclude Eula from spell checking * Fix spellcheck errors * Fix spell check for accelerated menu items * Remove cursor files from spellcheck. They're binary * Fix forbidden patterns * Fix XAML style * Fix C# analyzers * Fix signing * Also sign module interface dll * Use actual ZoomIt icon * Add OOBE page for ZoomIt * ZoomIt image for Settings * Flyout and Dashboard entries * Fix type speed slider labels * Correctly load default Font * Correctly register shortcuts on ZoomIt startup first run * Fix modifier keys not changing until restart * Show MsgBox on taken shortcut * Start PowerToys Settings * Normalize ZoomIt file properties with rest of PowerToys * Add attribution * Add ZoomIt team to Community.md * More copyright adjustments * Fix spellcheck * Fix MsgBox simultaneous instance to the front * Add mention of capturevideosample code use * Add ZoomIt to process lists * Add telemetry * Add logging * React to gpo * Normalize code to space identation * Fix installer build * Localize percent setting * Fix XAML styling * Update src/settings-ui/Settings.UI/Strings/en-us/Resources.resw Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com> * Fix spellcheck * One more spellcheck fix * Integrate LiveDraw feature changes from upstream * Fix name reuse in same scope * Fix c-style casts * Also register LIVEDRAW_HOTKEY * Fix newLiveZoomToggleKey * Update LiveZoom description in Settings to take LiveDraw into account * Fix spellcheck * Fix more spellcheck * Fix Sysinternals capitalization * Fix ARM64 Debug build * Support Sysinternals build (#36873) * Remove unneeded files * Make build compatible with Sysinternals * Separate PowerToys ZoomIt product name (#36887) * Separate PowerToys ZoomIt product name To help maintain the Sysinternals branding in the standalone version. * Clarify branding-related includes * Remove ZoomIt.sln * Add foxmsft to spell-check names * Add ZoomIt to README * Add ZoomIt to GH templates * Add ZoomIt events to DATA_AND_PRIVACY.md * Remove publish_config.json * Remove publish_config.json from vcxproj too --------- Co-authored-by: Mark Russinovich Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com> Co-authored-by: John Stephens Co-authored-by: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com> * [PTRun]Add hotkey to the show telemetry event (#36869) * [PTRun]Update the code for .NET 9.0.1 - remove workarounds (#36909) * Revove some unneeded changes after pdating to .net9.1 * [RegistryPreview]Copy context menu, data tooltip, MULTI_SZ fix (#36631) * add context menus * string resources for contextmenu * fix line break parsing for MULTI_SZ * better presentation of multiline values and value tooltip * cleanup * [MWB] - refactoring "Common" classes - Common.Log.cs, Common.Receiver.cs (#35726) * [PTRun]Add setting for different trigonometric units in Calculator (#36717) * Added angle units to PowerToys Run Calculator plugin. * Update Resources.resx * Added GitHub SpellCheck rule for 'gradians'. --------- Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> * [ci]Remove steps to build abstracted utilities packages (#36934) * [Settings]Update GPO infobar icon, improve some pages and fix bugs (#33703) * changes part 1 * fix xaml code * changes part 2 * fix cmdNotFound page * Update PowerOcrPage * More Pages changed * More Pages changed * revert temporary change * fix spelling * add resw comment * add resw comment * Update MouseWihtoutBorderPage.xaml * PowerPreview page * workspaces page * fix awake page gpo handling * NewPlus page * update new+ page! * AdvancedPaste.xaml: Move Info bar. * Update MouseJumpPanel.xaml * Update GeneralPage.xaml * fix position of info bar and some ui quirks * fix xaml style * fix string resources * string changes * prepare megre main * update new+ page * zoomit page * various fixes * [Common]NotificationUtil helper class with FileWatcher (#36720) * add NotificationUtil helper with file watcher and cache * fix spellcheck * indentation * [PTRun][Docs]Add YubicoOauthOTP to Third-Party plugins (#36761) * [PTRun]Fixed typo in Value Generator messages (#36951) * [AOT] Clean up some AOT issues in Advanced Paste module (#36297) * Clean up the aot build issue. * Merge main and clean up new AOT build issue * Update LogEvent define. * Update src/modules/AdvancedPaste/AdvancedPaste/Helpers/LogEvent.cs Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> * update typo bug * Remove unused allow list item * Create a new folder to place source generation context * Merge main and rename LogEvent to AIServiceFormatEvent --------- Co-authored-by: Yu Leng (from Dev Box) Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> * [ZoomIt]React to gpo setting when run as standalone (#36975) * [Settings]ImageResizer settings accessibility updates, fixes and refactor (#36903) * Fix issue with missing Image Resizer unit and fit information in settings description. * Fix accessibility issues on Edit and Remove buttons. Fix various issues and refactor view model and ImageSize. New resources for accessibility text formats. * Fix unit test because of change to new preset width and height. Fix 2 unit tests having incorrect expected/actual orderings. * Post-review update: accessibility strings now formatted within the converter, instead of via format strings; simplified encoder GUID collection declaration and retrieval. * Minor example text fix. * [Settings]Update "Back up" mentions when it should be used as a verb (#36965) * Update Back up name * Rename Backup to Back up * [New+]Update last modified date to now for all templates created (#36133) * Update last modified date to now for all templates created * Now also set last update for directories. Thank you htcfreek! * [ImageResizer][ci]Fix XAML style errors (#37009) * [Settings] Add "new" labels to navigation for new utilities (#36939) * initial implementation * move new label to zoomit * cleanup * more cleanup * fix XAML formatting * update padding to 4px * add badge to dashboard item * fix XAML formatting * Tweaking UX --------- Co-authored-by: Niels Laute Co-authored-by: Jaime Bernardo * [MWB]Fix helper process termination issue in service mode (#36892) * [MWB] Changed to suppress the flow of the execution context * Fix build after merge * [MWB] Fix helper process termination issue in service mode * Add some comments * [runner]Fix crashes caused by wrong setting AllowDataDiagnostics registry value (#37015) * Fix setting registry value * Prevent future similar crashes * [PTRun][Calculator]Error check when loading trigonometry mode (#37033) * [ZoomIt]Fix transparent draw after changing another setting (#37042) * [Settings]Fix ZoomIt page changing current directory (#37052) * [ci]Remove vc tools version workaround (#37098) * 0.88 changelog (#37056) * 0.88 changelog * Update README.md Co-authored-by: Clint Rutkas * Add installer hashes * Fix aka.ms link for ZoomIt * Add mention to the PTRun plugin's dll file version * Update README.md Co-authored-by: Kayla Cinnamon --------- Co-authored-by: Clint Rutkas Co-authored-by: Kayla Cinnamon * Update README.md - update What's Planned to 0.89 (#37157) Update README.md Just a tiny update, as reference to 0.88 was missed. * [ci]Proper workaround for the vc tools version check (#37130) * Revert "[ci]Remove vc tools version workaround (#37098)" This reverts commit 2c069ce708fcec23f3012c6434003908bead332c. * Adopt the same workaround as in Terminal * build: add a couple more signing variables to ESRP (#37328) This is in support of some identity changes we need to make. * [Docs] Update runner-ipc.md to fix broken links (#36994) Update runner-ipc.md Fix broken file links. * [ContextMenu]Update win11 msix menus if wrong version is detected (#37289) * [ContextMenus]Update win11 msix menus if wrong version * Remove extra line in code * [Build]Compatibility with VS17.3 and later, for C++23 (#37321) [Build] compatibility with VS17.3 and later, for C++23 has been introduced in VS17.3.6, and std::expected has conflict/inconsistent with the makeshift (expected-lite) * [Deps]Update .NET Packages from 9.0.1 to 9.0.2 (#37400) * [Deps] Update NuGet package versions to 9.0.2 * [CI] Update NOTICE.md * Ignore 0.0.0.0 versions as well for PowerToys files * Verify we're not shipping any 0.0.0.0 files * Add MSFT file that's expected as 0.0.0.0 * Fix spellcheck --------- Co-authored-by: Jaime Bernardo * [ci]Fix OutOfMemory in download by separating test-only artifacts and filtering unused files before publishing (#37403) * chunk download * change pipeline * update pipeline * filter * for testing * use Variable * rebase file * add new line * rebase the pipeline * [GPO][MWB]Add policy to disable service mode (#37366) * [MWB]Add policy to disable service mode * Add restart note * Tweak settings to disable setting * Tweak infobars * Policy should be machine only * [GPO]Add policy to define the run at startup setting (#37385) * [GPO]Add policy to define the run at startup setting * Use message for single setting managed by policy instead * [Zoomit]Fix warning C4706 and related error C2220 (#37283) * [KeyboardManager WinUI3] Create WinUI3 project and wrapper for Keyboard Manager Editor (#37427) * Set up KBM WinUI3 Editor UI project * Test invoking the KBM library via wrapper for WinUI3 C# UI * Set up Editor Library Wrapper and enable logging * fix spelling * update spacing and remove unused file * fix formatting * update sln * update wrapper project config * import common props * update UI reference * gate the new editor with the experimentation toggle in settings * [Workspaces] Fix case: monitor not present at launch (#37005) * [Workspaces] Fix case: monitor not present at launch * Fix DPI multiplicator calculation when monitor not present * [PowerRename] Fix negative enumerate start parameter parse bug. (#37375) Fix reg bug to make PowerRename accept negative number as start parameter Co-authored-by: Yu Leng (from Dev Box) * Use system default web browser when opening links through Monaco in RegistryPreview (#37466) * Handled NewWindowRequested WebView2 event, to allow links opened through Registry Preview to open in the system default web browser, rather than a new WebView2 window. * Modified RegistryPreview implementatiion to use the open URI dialog that is currently used in Peek. * [QuickAccent]Add more letters with caron to IPA (#37369) Co-authored-by: Stefan Markovic * [QuickAccent]Added ` (backtick) and ~ (tilde) to VK_OEM_5 (#20333) (#37286) * [MouseHighlighter]Fix stray highlights stucking (#37309) * [MouseHighlighter]Fix stray highlights stucking * Fix spellcheck --------- Co-authored-by: Stefan Markovic * [Settings] Fixed missing accessibility name of secondary links panel (#37014) Co-authored-by: Stefan Markovic * [CI] fix: Use Azure CLI for artifact download to prevent OutOfMemory issues (#37455) * for testing az * change file * update test * install python * update * test * use powershell * tes * update enve * update * test * add * test * merge * az * change * update * test cli * add debug * test large * fix * use templete * fix x64 python install * for testing * add * fix * use 3.11.1 * change for test * revert some testing file * update the file name for spelling check * use azure cli zip * use aka.ms * rename the zip file * Update runner documentation to reflect newest code structure * [Image Resizer] Added AutomationProperties.HelpText to dimensions combo-box (#37122) Co-authored-by: Stefan Markovic * [Fuzz] Add fuzz testing for Hosts (#37516) * add hostsfile fuzztests templates code * modify typos of hostsfile * add hosts file * add hosts fuzz to pipeline * modify varify depjson rule * fuzz validIPv4 * update .net7 to .net 8 * add valid6/validhosts tests on hosts * catch all exception * update onefuzzconfig.json to add 3 test cases * add fuzz writeasync tests and fill exception * add writeasync onefuzz config * add dll of writeasync in job dependencies * for testing az * change file * use mock filesystem in hosts tests projct * fix spell erro * fix spell erro and change notations * update test * fix space erro in code * install python * update * test * use powershell * remove unused dll in oneconfig.json * change download artifacts * update * test * add * test * merge * az * change * update * test cli * add debug * test large * fix * use templete * remove pdb file filter in job test project * fix x64 python install * for testing * add * fix * use 3.11.1 * change for test * revert some testing file * update the file name for spelling check * use azure cli zip * use aka.ms * rename the zip file * remove test artifactname * add exception and job dependencies * Remove the limitation of fuzzing only on hosts * add fuzz readme * remove unused changes and space * fix x86 in sln and remove newtonsoft.json.dll in oneconfig.json * readd wrapper.dll in oneconfig.json * drop randomsplit when fuzz writeasync and remove unuseful package --------- * UITestAutomation Framework (#37461) * Add UITestAutomation framework * add code comments * Optimized code format * Optimized code format * Update commons and add keyboard manager ui test project * Optimized code format * test scope and fix fancyzone exe path * Add readme * Optimize helper functions and UI test method * Fix spelling errors and restore module UI tests * Restore Indent * Update NOTICE.md * Update comments to Session and Elements * Update comments for Button and Window * delete unnecessary code * change FindElementByName to FindElmenet * Update comments for ModuleConfigData * Update readme and comments * Remove extra comments * change public property * Optimize code readability * add default Attach Function * change attach function name * Update comments to XML format * Hide by internal functions * Update readme * Refine the framework * Fix process start position and update readme * Remove Enum PowerToysModuleWindow * Update attach comments * Update ModuleConfigData comments --------- Co-authored-by: Zhaopeng Wang (from Dev Box) Co-authored-by: Xiaofeng Wang (from Dev Box) Co-authored-by: urnotdfs <709586527@qq.com> * [Fancy Zones] Fixed accessibility text of monitors on Layout Editor (#36997) Co-authored-by: Stefan Markovic * [Run] Fix dark mode detection code, plus refactor (#37324) * Fix risky int cast in dark mode detection. * Refactored Helper and Manager classes. New unit tests and changes to support Registry access mocking. * Spelling update. * Improve documentation for the registry-related classes. * Fix issue with UpdateTheme raised in review. Enhance documentation. Rewrite tests to use parameterised unit tests, and expand to cover more cases. * [MWB] Fix file transfer not working in service mode (#37542) * [MWB] Fix file transfer not working in service mode * Spellcheck issues * Remove "new" label from ZoomIt (#37417) remove new from zoomit * [PTRun][Calc]Add list separator handling for different cultures (#36735) * Ready for Review - [Mouse Without Borders] - refactoring "Common" classes (Part 3) - #35155 (#36950) * [MWB] - refactoring MachineInf from Common.MachineStuff.cs into MachineInf.cs - #35155 * [MWB] - fixing references to MachineInf - #35155 * [MWB] - cleaning up MachineInf.cs - #35155 * [MWB] - moving MyRectangle from Common.MachineStuff.cs into MyRectangle.cs - #35155 * [MWB] - cleaning up MyRectangle.cs - #35155 * [MWB] - moving Common.MachineStuff.cs to MachineStuff.cs - #35155 * [MWB] - fixing references to MachineStuff - #35155 * [MWB] - cleaning up MachineStuff.cs - #35155 * [MWB] - cleaning up MachineStuff.cs - #35155 * [MWB] - moving Common.DragDrop.cs to DragDrop.cs - #35155 * [MWB] - fixing references to DragDrop - #35155 * [MWB] - fixing unit test - #35155 * [MWB] - cleaning up DragDrop.cs - #35155 * [MWB] - cleaning up DragDrop.cs - #35155 * PowerToys Run Calculator: Add trigonometric angle unit conversion functions (#37475) * Added trig unit conversion macros to PowerToys Run Calculator plugin. * Added testing for unit conversions. * Removed debug messages. * [PTRun][Docs] Update new plugin checklist (#36789) [Docs] Update new plugin checklist * [PowerRename]Add `$`, `^` and quantifiers to RegEx cheatsheet (#37062) * [PowerRename]Add `$`, `^` and `.*` to RegEx cheatsheet * Add * and +, remove combinations * correct spelling * Add ? and \s * fix spelling once again * Update UI-Test Automation Framework (#37597) * Improve UITest Automation * Improve UITest Automation * Exclude all UI-Test projects instead of just fancyZone UITest * Exclude all UI-Test projects instead of just fancyZone UITest * Fix code-style * [Hosts] Add UITest Cases for Hosts Module (#37600) * Add UI-Tests for Host Module * [Build] Revert "[Hosts] Add UITest Cases for Hosts Module (#37600)" to fix CI issue (#37606) Revert "[Hosts] Add UITest Cases for Hosts Module (#37600)" This reverts commit c656dcc9c590dad0bffb5527825d30edbef14aa8. * [AOT] clean up AOT issue in Settings.UI (#36559) * Rename source generation context file * fix build issue * fix path bug --------- Co-authored-by: Yu Leng (from Dev Box) * [AOT] Clean up AOT build issue in Common.UI (#36376) * init commit * Use path.combine * Add useWPF and useWindowsForms back --------- Co-authored-by: Yu Leng (from Dev Box) * [ci]Sign and fix KeyboardManagerEditorLibraryWrapper.dll (#37601) * [ci]Sign KeyboardManagerEditorLibraryWrapper.dll * Fix dll metadata * [Settings]Fix ColorPicker dashboard shortcut (#37547) * Fix color picker dashboard shortcut * remove not needed code * Remove comment * [ImageResizer] Fix issues with blank Width and Height controls (#37373) * Allow custom preset's dimensions to be blank in the UI while still persisted as 0. * XAML formatting - reorder namespaces. * Add "(auto)" text to zero-value Width/Height in Settings. Ensure Width and Height fields in flyout are formatted to empty when their value is 0. * [Workspaces][ARM64] Bring icon to packaged apps (#37625) Bring icon to packaged apps * [PTRun] Disable CETCompat in Launcher (#37550) * Disable CETCompat in Launcher * Added comment * Improved comment * [AOT] Refactor Logger function to improve performance and mark managedCommon as AOT compatible (#36327) * Use function to init static value * Replace GetFileName with GetFileNameWithoutExtension * Add exception catch for GetCallerInfo * Remove sourceLineNumber * Add kernal to allow list * Remove unused commit * Add new folder to place source generation context * update * fix build issue * Move line number back * Use fileName to replace full path --------- Co-authored-by: Yu Leng (from Dev Box) * [AdvancedPaste]Add paste actions to allow transcoding of media files (#37188) * [AdvancedPaste] Additional actions, including Image to text * Spellcheck issue * [AdvancedPaste] Paste as file and many other improvements * Fixed typo * Fixed typo * [AdvancedPaste] Improved paste window menu layout * [AdvancedPaste] Improved settings window layout * [AdvancedPaste] Removed AudioToText for the moment * Code cleanup * Minor fixes * [AdvancedPaste] Semantic Kernel support * Changed log-line with potentially sensitive info * Spellcheck issues * Various improvements for Semantic Kernel * Spellcheck issue * Refactored Clipboard routines * Added integration tests for KernelService * Extra telemetry for AdvancedPaste * Added 'Hotkey' suffix to AdvancedPaste_Settings telemetry event * Added IsSavedQuery * Added KernelQueryCache * Refactoring * Added KernelQueryCache to BugReportTool delete list * Added opt-n for Semantic Kernel * Fixed bug with KernelQueryCache * Ability to view last AI chat message on error * Improved kernel query cache * Used System.IO.Abstractions and improved tests * Fixed under-count of token usage * Used Semantic Kernel icon * Cleanup * Add missing EndProject line * Fix dependency version conflicts * Fix NOTICE.md * Correct place of SemanticKernel in NOTICE.md * Unlinked CustomPreview toggle from AI * Added Microsoft.Bcl.AsyncInterfaces dependency to AdvancedPaste * Fixed NOTICE.md order * Moved Custom Preview to behaviour section * Made Image to Text raise error on empty output * Added AIServiceBatchIntegrationTests * Updated AIServiceBatchIntegrationTests * Added prompt moderation * [AdvancedPaste] Media Transcoding support * Spellcheck issue * Improved transcoding output profile and added tests * Moved GPO Infobar to better location * Added cancel button and minor bug fixes * Fixed crash * Minor cleanups * Improved transcoding error messages * Used software back when transcoding fails with hardware accerlation * Added Reencode to spellcheck * Spellcheck issue --------- Co-authored-by: Jaime Bernardo Co-authored-by: Dustin L. Howett Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> * [QuickAccent]Add final sigma ( ς ) to the Greek character set (#37611) * Revert "[Hosts] Add UITest Cases for Hosts Module" (#37619) * Revert "[Hosts] Add UITest Cases for Hosts Module (#37600)" This reverts commit c656dcc9c590dad0bffb5527825d30edbef14aa8. * Matching all UITest projects and UITestAutomation project * Add back Hosts UITests --------- Co-authored-by: Jerry Xu * [Workspaces] Fix regression when capturing minimized apps (#37599) * [check-spelling] Update metadata Update for https://github.com/zadjii-msft/PowerToys/actions/runs/13549652582/attempts/1 Accepted in https://github.com/zadjii-msft/PowerToys/pull/462#issuecomment-2685731408 Signed-off-by: check-spelling-bot on-behalf-of: @check-spelling * Fix bad merged --------- Signed-off-by: Shawn Yuan Signed-off-by: check-spelling-bot Co-authored-by: Laszlo Nemeth <57342539+donlaci@users.noreply.github.com> Co-authored-by: Seraphima Co-authored-by: donlaci Co-authored-by: Ionuț Manța Co-authored-by: Jaime Bernardo Co-authored-by: Jeremy Sinclair <4016293+snickler@users.noreply.github.com> Co-authored-by: Ani <115020168+drawbyperpetual@users.noreply.github.com> Co-authored-by: PesBandi <127593627+PesBandi@users.noreply.github.com> Co-authored-by: Wenjian Chern <55335597+Sophanatprime@users.noreply.github.com> Co-authored-by: Youssef Victor Co-authored-by: Clint Rutkas Co-authored-by: Josh Soref <2119212+jsoref@users.noreply.github.com> Co-authored-by: leileizhang Co-authored-by: Den Delimarsky 🔐 Co-authored-by: Niels Laute Co-authored-by: Davide Giacometti <25966642+davidegiacometti@users.noreply.github.com> Co-authored-by: Heiko <61519853+htcfreek@users.noreply.github.com> Co-authored-by: Shuai Yuan <128874481+shuaiyuanxx@users.noreply.github.com> Co-authored-by: moooyo <42196638+moooyo@users.noreply.github.com> Co-authored-by: Yu Leng (from Dev Box) Co-authored-by: Jerry Xu Co-authored-by: Demitrius Nelon Co-authored-by: Kai Tao <69313318+vanzue@users.noreply.github.com> Co-authored-by: Connor Plante <150482134+plante-msft@users.noreply.github.com> Co-authored-by: Connor Plante Co-authored-by: Domen Soklič Co-authored-by: Hao Liu Co-authored-by: Hao Liu (from Dev Box) Co-authored-by: immi Co-authored-by: Asif Islam <77113884+asif4318@users.noreply.github.com> Co-authored-by: Kayla Cinnamon Co-authored-by: Dave Rayment Co-authored-by: Neil McAlister Co-authored-by: Mark Russinovich Co-authored-by: Alex Mihaiuc <69110671+foxmsft@users.noreply.github.com> Co-authored-by: John Stephens Co-authored-by: Michael Clayton Co-authored-by: Nathan Gill Co-authored-by: Daniel Nilsson Co-authored-by: JackStuart Co-authored-by: Christian Gaarden Gaardmark Co-authored-by: YDKK Co-authored-by: Dustin L. Howett Co-authored-by: LNKLEO Co-authored-by: Massimiliano Alberti <821344+xanatos@users.noreply.github.com> Co-authored-by: Hao Liu Co-authored-by: chenmy77 <162882040+chenmy77@users.noreply.github.com> Co-authored-by: dreamstart <33367956+wang563681252@users.noreply.github.com> Co-authored-by: Zhaopeng Wang (from Dev Box) Co-authored-by: Xiaofeng Wang (from Dev Box) Co-authored-by: urnotdfs <709586527@qq.com> Co-authored-by: Henrik Lau Eriksson Co-authored-by: Dustin L. Howett Co-authored-by: Smeagol Co-authored-by: Jerry Xu Co-authored-by: Jerry Xu Co-authored-by: Stefan Markovic --- .github/actions/spell-check/allow/code.txt | 4 + .github/actions/spell-check/expect.txt | 68 +- .pipelines/ESRPSigning_core.json | 1 + .pipelines/v2/templates/job-test-project.yml | 17 +- ...teps-download-artifacts-with-azure-cli.yml | 33 + .pipelines/verifyDepsJsonLibraryVersions.ps1 | 4 +- PowerToys.sln | 618 +-------- doc/devdocs/UITests.md | 91 ++ .../modules/launcher/new-plugin-checklist.md | 4 +- doc/devdocs/runner.md | 31 +- src/common/Common.UI/Common.UI.csproj | 1 + src/common/Common.UI/SettingsDeepLink.cs | 10 +- src/common/Common.UI/ThemeManager.cs | 2 +- src/common/GPOWrapper/GPOWrapper.cpp | 8 + src/common/GPOWrapper/GPOWrapper.h | 2 + src/common/GPOWrapper/GPOWrapper.idl | 2 + src/common/ManagedCommon/LanguageHelper.cs | 3 +- src/common/ManagedCommon/Logger.cs | 87 +- src/common/ManagedCommon/ManagedCommon.csproj | 1 + src/common/ManagedCommon/NativeMethods.cs | 2 +- src/common/ManagedCommon/RunnerHelper.cs | 7 +- .../SourceGenerationContext.cs | 13 + src/common/ManagedCommon/ThemeListener.cs | 2 +- src/common/UITestAutomation/Element/Button.cs | 13 + src/common/UITestAutomation/Element/By.cs | 75 ++ .../UITestAutomation/Element/Element.cs | 217 ++++ .../UITestAutomation/Element/TextBox.cs | 40 + .../UITestAutomation/Element/ToggleSwitch.cs | 41 + src/common/UITestAutomation/Element/Window.cs | 85 ++ src/common/UITestAutomation/FindHelper.cs | 58 + .../UITestAutomation/ModuleConfigData.cs | 72 ++ src/common/UITestAutomation/Session.cs | 123 ++ .../UITestAutomation/UITestAutomation.csproj | 19 + src/common/UITestAutomation/UITestBase.cs | 154 +++ src/common/utils/gpo.h | 12 + src/gpo/assets/PowerToys.admx | 25 +- src/gpo/assets/en-US/PowerToys.adml | 22 +- .../Mocks/NoOpKernelQueryCacheService.cs | 1 + .../Mocks/NoOpProgress.cs | 14 + .../AIServiceBatchIntegrationTests.cs | 6 +- .../KernelServiceIntegrationTests.cs | 3 +- .../TranscodeHelperIntegrationTests.cs | 109 ++ .../AnimatedContentControl.xaml | 1 + .../AdvancedPasteXAML/Controls/PromptBox.xaml | 63 +- .../Controls/PromptBox.xaml.cs | 7 +- .../AdvancedPasteXAML/MainWindow.xaml.cs | 13 +- .../Helpers/DataPackageHelpers.cs | 98 +- .../AdvancedPaste/Helpers/KernelExtensions.cs | 11 + .../AdvancedPaste/Helpers/NativeMethods.cs | 66 + .../AdvancedPaste/Helpers/OcrHelpers.cs | 6 +- .../AdvancedPaste/Helpers/TranscodeHelpers.cs | 167 +++ .../AdvancedPaste/Helpers/TransformHelpers.cs | 37 +- .../AdvancedPaste/Helpers/UserSettings.cs | 4 +- .../AdvancedPaste/Models/ClipboardFormat.cs | 5 +- .../AdvancedPaste/Models/PasteActionError.cs | 2 +- .../AdvancedPaste/Models/PasteFormats.cs | 24 +- .../Services/ICustomTextTransformService.cs | 4 +- .../AdvancedPaste/Services/IKernelService.cs | 4 +- .../Services/IPasteFormatExecutor.cs | 4 +- .../Services/IPromptModerationService.cs | 3 +- .../Services/KernelServiceBase.cs | 25 +- .../OpenAI/CustomTextTransformService.cs | 14 +- .../OpenAI/PromptModerationService.cs | 5 +- .../Services/PasteFormatExecutor.cs | 9 +- .../Strings/en-us/Resources.resw | 21 + .../ViewModels/OptionsViewModel.cs | 78 +- .../AdvancedPasteModuleInterface/trace.cpp | 4 +- src/modules/Hosts/Hosts.FuzzTests/Fuzz.md | 35 + .../Hosts/Hosts.FuzzTests/FuzzTests.cs | 101 ++ .../Hosts.FuzzTests/Hosts.FuzzTests.csproj | 51 + .../Hosts/Hosts.FuzzTests/MSTestSettings.cs | 5 + .../Hosts/Hosts.FuzzTests/OneFuzzConfig.json | 178 +++ .../Hosts/Hosts.UITests/HostModuleTests.cs | 108 ++ .../Hosts/Hosts.UITests/Hosts.UITests.csproj | 25 + .../MouseHighlighter/MouseHighlighter.cpp | 16 + .../App/Class/Common.Clipboard.cs | 4 +- .../App/Class/Common.DragDrop.cs | 409 ------ .../App/Class/Common.Event.cs | 60 +- .../App/Class/Common.Helper.cs | 57 +- .../App/Class/Common.InitAndCleanup.cs | 18 +- .../App/Class/Common.Launch.cs | 15 +- .../App/Class/Common.MachineStuff.cs | 1136 ----------------- .../App/Class/Common.WinAPI.cs | 22 +- .../MouseWithoutBorders/App/Class/Common.cs | 74 +- .../App/Class/IClipboardHelper.cs | 2 +- .../App/Class/InputHook.cs | 52 +- .../App/Class/InputSimulation.cs | 18 +- .../App/Class/MachinePool.cs | 20 +- .../App/Class/MachinePoolHelpers.cs | 10 +- .../App/Class/NativeMethods.cs | 37 +- .../MouseWithoutBorders/App/Class/Program.cs | 32 +- .../MouseWithoutBorders/App/Class/Setting.cs | 18 +- .../App/Class/SocketStuff.cs | 38 +- .../MouseWithoutBorders/App/Core/DragDrop.cs | 404 ++++++ .../MouseWithoutBorders/App/Core/Logger.cs | 5 +- .../App/Core/MachineInf.cs | 20 + .../App/Core/MachineStuff.cs | 1122 ++++++++++++++++ .../App/Core/MyRectangle.cs | 21 + .../MouseWithoutBorders/App/Core/Receiver.cs | 38 +- .../App/Form/Settings/SettingsForm.cs | 2 +- .../App/Form/Settings/SettingsFormPage.cs | 5 +- .../App/Form/Settings/SetupPage1.cs | 4 +- .../App/Form/Settings/SetupPage2a.cs | 9 +- .../App/Form/Settings/SetupPage3a.cs | 2 +- .../App/Form/Settings/SetupPage5.cs | 6 +- .../MouseWithoutBorders/App/Form/frmMatrix.cs | 36 +- .../MouseWithoutBorders/App/Form/frmScreen.cs | 56 +- .../App/Service/Program.cs | 3 +- .../ModuleInterface/dllmain.cpp | 6 +- .../Core/Logger.PrivateDump.expected.txt | 82 +- .../Core/LoggerTests.cs | 4 + .../Models/BaseApplication.cs | 2 +- .../WindowArranger.cpp | 13 +- src/modules/ZoomIt/ZoomIt/Zoomit.cpp | 2 +- .../editor/FancyZonesEditor/MainWindow.xaml | 4 +- .../Models/MonitorInfoModel.cs | 8 + .../Properties/Resources.Designer.cs | 33 +- .../Properties/Resources.resx | 9 + .../Styles/GridViewStyles.xaml | 4 +- src/modules/imageresizer/ui/App.xaml | 3 + .../imageresizer/ui/Properties/Settings.cs | 1 + .../ui/Views/AutoDoubleConverter.cs | 66 +- .../imageresizer/ui/Views/InputPage.xaml | 22 +- .../ui/Views/NumberBoxValueConverter.cs | 32 + .../ui/Views/SizeTypeToHelpTextConverter.cs | 46 + .../Views/ZeroToEmptyStringNumberFormatter.cs | 37 + .../KeyboardManagerEditorLibraryWrapper.cpp | 20 + .../KeyboardManagerEditorLibraryWrapper.h | 7 + .../KeyboardManagerEditorLibraryWrapper.rc | 40 + ...eyboardManagerEditorLibraryWrapper.vcxproj | 267 ++++ ...anagerEditorLibraryWrapper.vcxproj.filters | 50 + .../dllmain.cpp | 19 + .../framework.h | 5 + .../packages.config | 4 + .../pch.cpp | 5 + .../KeyboardManagerEditorLibraryWrapper/pch.h | 18 + .../resource.h | 13 + .../KeyboardManagerEditorUI/App.xaml | 16 + .../KeyboardManagerEditorUI/App.xaml.cs | 55 + .../KeyboardManagerEditorUI.csproj | 54 + .../KeyboardManagerEditorUI/MainWindow.xaml | 18 + .../MainWindow.xaml.cs | 42 + .../Package.appxmanifest | 51 + .../KeyboardManagerEditorUI/app.manifest | 19 + .../ExtendedCalculatorParserTests.cs | 87 ++ .../NumberTranslatorTests.cs | 1 + .../CalculateEngine.cs | 8 +- .../CalculateHelper.cs | 44 +- .../NumberTranslator.cs | 2 +- .../PowerLauncher/Helper/ThemeExtensions.cs | 72 -- .../PowerLauncher/Helper/ThemeHelper.cs | 137 ++ .../PowerLauncher/Helper/ThemeManager.cs | 63 +- .../PowerLauncher/PowerLauncher.csproj | 2 + .../Services/IRegistryService.cs | 82 ++ .../PowerLauncher/Services/RegistryService.cs | 34 + .../Services/RegistryServiceFactory.cs | 17 + .../launcher/Wox.Test/ThemeHelperTest.cs | 124 ++ .../poweraccent/PowerAccent.Core/Languages.cs | 9 +- .../KeyboardListener.h | 3 +- .../KeyboardListener.idl | 3 +- .../PowerRenameXAML/MainWindow.xaml.cpp | 7 +- .../Strings/en-us/Resources.resw | 23 +- src/modules/powerrename/lib/Enumerating.cpp | 2 +- .../MonacoEditorControl.xaml | 5 + .../MonacoEditorControl.xaml.cs | 31 + .../Strings/en-US/Resources.resw | 16 + src/runner/general_settings.cpp | 18 +- src/runner/settings_window.cpp | 10 +- .../AdvancedPasteAdditionalAction.cs | 4 + .../AdvancedPasteAdditionalActions.cs | 21 +- .../AdvancedPasteCustomAction.cs | 4 + .../AdvancedPastePasteAsFileAction.cs | 2 +- .../AdvancedPasteTranscodeAction.cs | 47 + .../IAdvancedPasteAction.cs | 3 + .../ImageResizerDoubleToAutoConverter.cs | 61 + .../ImageResizerNumberBoxValueConverter.cs | 31 + ...ResizerZeroToEmptyStringNumberFormatter.cs | 39 + .../Settings.UI/Helpers/ActionMessage.cs | 48 + .../Settings.UI/Helpers/AsyncCommand.cs | 2 +- .../Helpers/IndexedObservableCollection.cs | 2 +- .../Helpers/NativeKeyboardHelper.cs | 2 +- .../Helpers/PowerToysReleaseInfo.cs | 29 + .../Settings.UI/Helpers/RelayCommand.cs | 4 +- .../Settings.UI/Helpers/WindowHelper.cs | 8 +- .../SourceGenerationContextContext.cs | 35 + .../Settings.UI/SettingsXAML/App.xaml.cs | 3 +- .../ImageResizerDimensionsNumberBox.cs | 38 + .../SettingsPageControl.xaml | 1 + .../OOBE/Views/OobeShellPage.xaml.cs | 5 - .../OOBE/Views/OobeWhatsNew.xaml.cs | 19 +- .../SettingsXAML/Views/AdvancedPaste.xaml | 31 + .../Views/ColorPickerPage.xaml.cs | 2 +- .../SettingsXAML/Views/GeneralPage.xaml | 14 +- .../SettingsXAML/Views/ImageResizerPage.xaml | 15 +- .../Views/MouseWithoutBordersPage.xaml | 17 +- .../SettingsXAML/Views/ShellPage.xaml | 6 +- .../Settings.UI/Strings/en-us/Resources.resw | 13 + .../ViewModels/AdvancedPasteViewModel.cs | 9 +- .../ViewModels/AlwaysOnTopViewModel.cs | 5 +- .../Settings.UI/ViewModels/AwakeViewModel.cs | 2 +- .../ViewModels/CmdNotFoundViewModel.cs | 7 +- .../ViewModels/ColorPickerViewModel.cs | 15 +- .../ViewModels/Commands/ButtonClickCommand.cs | 2 +- .../ViewModels/CropAndLockViewModel.cs | 7 +- .../ViewModels/DashboardListItem.cs | 2 +- .../ViewModels/DashboardModuleItem.cs | 10 +- .../ViewModels/DashboardViewModel.cs | 4 +- .../EnvironmentVariablesViewModel.cs | 2 +- .../ViewModels/FancyZonesViewModel.cs | 2 +- .../ViewModels/FileLocksmithViewModel.cs | 5 +- .../ViewModels/Flyout/AllAppsViewModel.cs | 4 +- .../ViewModels/Flyout/FlyoutMenuItem.cs | 2 +- .../ViewModels/Flyout/FlyoutViewModel.cs | 2 +- .../ViewModels/Flyout/LauncherViewModel.cs | 2 +- .../ViewModels/GeneralViewModel.cs | 42 +- .../Settings.UI/ViewModels/HostsViewModel.cs | 2 +- .../ViewModels/KeyboardManagerViewModel.cs | 40 +- .../ViewModels/MeasureToolViewModel.cs | 5 +- .../MouseWithoutBordersViewModel.cs | 40 +- .../ViewModels/NewPlusViewModel.cs | 6 +- .../Settings.UI/ViewModels/PeekViewModel.cs | 5 +- .../PluginAdditionalOptionViewModel.cs | 2 +- .../ViewModels/PowerAccentViewModel.cs | 2 +- .../PowerLauncherPluginViewModel.cs | 2 +- .../ViewModels/PowerLauncherViewModel.cs | 7 +- .../ViewModels/PowerOcrViewModel.cs | 5 +- .../ViewModels/PowerPreviewViewModel.cs | 2 +- .../ViewModels/PowerRenameViewModel.cs | 2 +- .../ViewModels/RegistryPreviewViewModel.cs | 5 +- .../Settings.UI/ViewModels/ShellViewModel.cs | 2 +- .../ViewModels/ShortcutGuideViewModel.cs | 2 +- .../ViewModels/WorkspacesViewModel.cs | 5 +- .../BugReportTool/ProcessesList.cpp | 95 +- .../BugReportTool/ReportGPOValues.cpp | 2 + 234 files changed, 6776 insertions(+), 3011 deletions(-) create mode 100644 .pipelines/v2/templates/steps-download-artifacts-with-azure-cli.yml create mode 100644 doc/devdocs/UITests.md create mode 100644 src/common/ManagedCommon/SerializationContext/SourceGenerationContext.cs create mode 100644 src/common/UITestAutomation/Element/Button.cs create mode 100644 src/common/UITestAutomation/Element/By.cs create mode 100644 src/common/UITestAutomation/Element/Element.cs create mode 100644 src/common/UITestAutomation/Element/TextBox.cs create mode 100644 src/common/UITestAutomation/Element/ToggleSwitch.cs create mode 100644 src/common/UITestAutomation/Element/Window.cs create mode 100644 src/common/UITestAutomation/FindHelper.cs create mode 100644 src/common/UITestAutomation/ModuleConfigData.cs create mode 100644 src/common/UITestAutomation/Session.cs create mode 100644 src/common/UITestAutomation/UITestAutomation.csproj create mode 100644 src/common/UITestAutomation/UITestBase.cs create mode 100644 src/modules/AdvancedPaste/AdvancedPaste.UnitTests/Mocks/NoOpProgress.cs create mode 100644 src/modules/AdvancedPaste/AdvancedPaste.UnitTests/ServicesTests/TranscodeHelperIntegrationTests.cs create mode 100644 src/modules/AdvancedPaste/AdvancedPaste/Helpers/TranscodeHelpers.cs create mode 100644 src/modules/Hosts/Hosts.FuzzTests/Fuzz.md create mode 100644 src/modules/Hosts/Hosts.FuzzTests/FuzzTests.cs create mode 100644 src/modules/Hosts/Hosts.FuzzTests/Hosts.FuzzTests.csproj create mode 100644 src/modules/Hosts/Hosts.FuzzTests/MSTestSettings.cs create mode 100644 src/modules/Hosts/Hosts.FuzzTests/OneFuzzConfig.json create mode 100644 src/modules/Hosts/Hosts.UITests/HostModuleTests.cs create mode 100644 src/modules/Hosts/Hosts.UITests/Hosts.UITests.csproj delete mode 100644 src/modules/MouseWithoutBorders/App/Class/Common.DragDrop.cs delete mode 100644 src/modules/MouseWithoutBorders/App/Class/Common.MachineStuff.cs create mode 100644 src/modules/MouseWithoutBorders/App/Core/DragDrop.cs create mode 100644 src/modules/MouseWithoutBorders/App/Core/MachineInf.cs create mode 100644 src/modules/MouseWithoutBorders/App/Core/MachineStuff.cs create mode 100644 src/modules/MouseWithoutBorders/App/Core/MyRectangle.cs create mode 100644 src/modules/imageresizer/ui/Views/NumberBoxValueConverter.cs create mode 100644 src/modules/imageresizer/ui/Views/SizeTypeToHelpTextConverter.cs create mode 100644 src/modules/imageresizer/ui/Views/ZeroToEmptyStringNumberFormatter.cs create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/KeyboardManagerEditorLibraryWrapper.cpp create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/KeyboardManagerEditorLibraryWrapper.h create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/KeyboardManagerEditorLibraryWrapper.rc create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/KeyboardManagerEditorLibraryWrapper.vcxproj create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/KeyboardManagerEditorLibraryWrapper.vcxproj.filters create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/dllmain.cpp create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/framework.h create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/packages.config create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/pch.cpp create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/pch.h create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorLibraryWrapper/resource.h create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/App.xaml create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/App.xaml.cs create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorUI.csproj create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/MainWindow.xaml create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/MainWindow.xaml.cs create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/Package.appxmanifest create mode 100644 src/modules/keyboardmanager/KeyboardManagerEditorUI/app.manifest delete mode 100644 src/modules/launcher/PowerLauncher/Helper/ThemeExtensions.cs create mode 100644 src/modules/launcher/PowerLauncher/Helper/ThemeHelper.cs create mode 100644 src/modules/launcher/PowerLauncher/Services/IRegistryService.cs create mode 100644 src/modules/launcher/PowerLauncher/Services/RegistryService.cs create mode 100644 src/modules/launcher/PowerLauncher/Services/RegistryServiceFactory.cs create mode 100644 src/modules/launcher/Wox.Test/ThemeHelperTest.cs create mode 100644 src/settings-ui/Settings.UI.Library/AdvancedPasteTranscodeAction.cs create mode 100644 src/settings-ui/Settings.UI/Converters/ImageResizerDoubleToAutoConverter.cs create mode 100644 src/settings-ui/Settings.UI/Converters/ImageResizerNumberBoxValueConverter.cs create mode 100644 src/settings-ui/Settings.UI/Converters/ImageResizerZeroToEmptyStringNumberFormatter.cs create mode 100644 src/settings-ui/Settings.UI/Helpers/ActionMessage.cs create mode 100644 src/settings-ui/Settings.UI/Helpers/PowerToysReleaseInfo.cs create mode 100644 src/settings-ui/Settings.UI/SerializationContext/SourceGenerationContextContext.cs create mode 100644 src/settings-ui/Settings.UI/SettingsXAML/Controls/ImageResizerDimensionsNumberBox.cs diff --git a/.github/actions/spell-check/allow/code.txt b/.github/actions/spell-check/allow/code.txt index f8097284ff2f..2f8ae7919440 100644 --- a/.github/actions/spell-check/allow/code.txt +++ b/.github/actions/spell-check/allow/code.txt @@ -263,6 +263,10 @@ onefuzz # NameInCode leilzh +mengyuanchen + +# DllName +testhost #Tools OIP diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index 9c2069bf9a71..6d0259e755e2 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -26,10 +26,8 @@ AFFINETRANSFORM affordances AFX AGGREGATABLE -ahk AHybrid akv -ALIGNRIGHT ALarger ALIGNRIGHT ALLAPPS @@ -177,7 +175,6 @@ CCom CContext CDeclaration cdn -CDEF CElems CENTERALIGN certlm @@ -276,10 +273,6 @@ cswin CTest CTEXT Ctl -CTest -CTEXT -CTest -CTEXT CTLCOLORSTATIC currentculture CURRENTDIR @@ -367,11 +360,6 @@ DEVMODEW devpal DIALOGEX dic -DEVMON -DEVSOURCE -DGR -DIALOGEX -DIIRFLAG dimm DISABLEASACTIONKEY DISABLENOSCROLL @@ -380,7 +368,6 @@ DISPLAYCHANGE DISPLAYCONFIG DISPLAYFLAGS DISPLAYFREQUENCY -DISPLAYORIENTATION displayname DISPLAYORIENTATION divyan @@ -408,8 +395,6 @@ drivedetectionwarning Droid DROPFILES DROPTARGET -DROPFILES -dshow DSTINVERT DSurface DTexture @@ -509,7 +494,6 @@ fff FILEEXPLORER FILEFLAGS FILEFLAGSMASK -FILEINFOSIG FILELOCKSMITH FILELOCKSMITHCONTEXTMENU FILELOCKSMITHEXT @@ -525,7 +509,6 @@ Filetime FILEVERSION Filterkeyboard FILTERMODE -Filterx findfast Fira FIXEDFILEINFO @@ -574,7 +557,6 @@ GETDPISCALEDSIZE getfilesiginforedist GETHOTKEY GETICON -GETHOTKEY GETMINMAXINFO GETNONCLIENTMETRICS GETPROPERTYSTOREFLAGS @@ -720,12 +702,6 @@ IGo iid Iindex Ijwhost -IGNOREUNKNOWN -iid -Iindex -Ijwhost -IKs -iljxck IMAGEHLP IMAGERESIZERCONTEXTMENU IMAGERESIZEREXT @@ -746,9 +722,6 @@ INITDIALOG INITGUID INITTOLOGFONTSTRUCT INLINEPREFIX -INITDIALOG -INITGUID -INITTOLOGFONTSTRUCT inorder INPC inproc @@ -808,6 +781,7 @@ KEYBDINPUT keyboardeventhandlers keyboardmanagercommon KEYBOARDMANAGEREDITOR +KEYBOARDMANAGEREDITORLIBRARYWRAPPER keyboardmanagerstate keyboardmanagerui keyboardtester @@ -820,7 +794,6 @@ KILLFOCUS killrunner kinda kmph -KSPROPERTY Kybd lastcodeanalysissucceeded Lastdevice @@ -830,7 +803,6 @@ LCIDTo Lclean Ldone Ldr -ldx LEFTSCROLLBAR LEFTTEXT LError @@ -847,7 +819,6 @@ LINKOVERLAY LINQTo listview LIVEZOOM -lld LLKH llkhf LMEM @@ -866,7 +837,6 @@ logon LOGPIXELSX LOGPIXELSY longdate -LONGLONG LONGNAMES lowlevel LOWORD @@ -902,7 +872,6 @@ lpv LPW lpwcx lpwndpl -lpv LReader LRESULT LSTATUS @@ -912,7 +881,6 @@ lstrcpyn lstrlen LTEXT LTk -LTRB LTRREADING luid LUMA @@ -924,8 +892,6 @@ LWA lwin LZero MAGTRANSFORM -majortype -makecab MAKEINTRESOURCE MAKEINTRESOURCEA MAKEINTRESOURCEW @@ -958,7 +924,6 @@ MERGEPAINT Metadatas metafile mfc -mfplat Mgmt Microwaved midl @@ -1015,8 +980,6 @@ MSIDXSPROP msiexec MSIFASTINSTALL MSIHANDLE -Msimg -msiquery MSIRESTARTMANAGERCONTROL msixbundle MSIXCA @@ -1031,7 +994,6 @@ msvsmon MTND MULTIPLEUSE multizone -murmurhash muxc mvvm MVVMTK @@ -1195,10 +1157,6 @@ OWMt OWNDC OWNERDRAWFIXED OWRj -OWNDC -OWNERDRAWFIXED -OWNDC -OWNERDRAWFIXED Packagemanager PACL PAINTSTRUCT @@ -1272,9 +1230,6 @@ Podcasts POINTERID POINTERUPDATE Pokedex -Pnp -POINTERID -POINTERUPDATE Popups POPUPWINDOW POSITIONITEM @@ -1328,8 +1283,6 @@ projectname PROPERTYKEY Propset PROPVARIANT -PROPVARIANT -propvarutil PRTL prvpane psapi @@ -1396,8 +1349,7 @@ rectp RECTSOURCE recyclebin Redist -reencode -reencoded +Reencode REFCLSID REFIID REGCLS @@ -1652,8 +1604,6 @@ STGM STGMEDIUM STICKYKEYS sticpl -STICKYKEYS -stl storelogo stprintf streamjsonrpc @@ -1662,8 +1612,6 @@ stringtable stringval Strm strret -strsafe -strutil stscanf sttngs Stubless @@ -1672,7 +1620,6 @@ STYLECHANGING subkeys sublang SUBMODULEUPDATE -subquery Superbar sut svchost @@ -1746,8 +1693,6 @@ throughs TIcon TILEDWINDOW TILEINFO -TILEDWINDOW -TILEDWINDOW TILLSON timedate timediff @@ -1761,7 +1706,6 @@ TLayout tlb tlbimp tlc -TMPVAR TNP Toolhelp toolkitconverters @@ -1770,7 +1714,6 @@ TOPDOWNDIB TOUCHEVENTF TOUCHINPUT TRACEHANDLE -TResult tracelogging tracerpt trackbar @@ -1778,6 +1721,7 @@ trafficmanager traies transicc TRAYMOUSEMESSAGE +TResult triaging trl trx @@ -1854,7 +1798,6 @@ vcgtq VCINSTALLDIR Vcpkg VCRT -VCENTER vcruntime vcvars VDesktop @@ -1870,11 +1813,6 @@ vget vgetq videourl viewmodel -vid -VIDCAP -VIDEOINFOHEADER -viewmodel -vih VIRTKEY VIRTUALDESK VISEGRADRELAY diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index b0fa0bcd5c8f..1b788560327f 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -128,6 +128,7 @@ "PowerToys.KeyboardManager.dll", "KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe", "KeyboardManagerEngine\\PowerToys.KeyboardManagerEngine.exe", + "PowerToys.KeyboardManagerEditorLibraryWrapper.dll", "PowerToys.Launcher.dll", "PowerToys.PowerLauncher.dll", diff --git a/.pipelines/v2/templates/job-test-project.yml b/.pipelines/v2/templates/job-test-project.yml index 0bf4641e429f..d48e67f04188 100644 --- a/.pipelines/v2/templates/job-test-project.yml +++ b/.pipelines/v2/templates/job-test-project.yml @@ -19,6 +19,7 @@ jobs: BuildPlatform: ${{ parameters.platform }} BuildConfiguration: ${{ parameters.configuration }} SrcPath: $(Build.Repository.LocalPath) + TestArtifactsName: build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }} pool: ${{ if eq(variables['System.CollectionId'], 'cb55739e-4afe-46a3-970f-1b49d8ee7564') }}: ${{ if ne(parameters.platform, 'ARM64') }}: @@ -59,14 +60,10 @@ jobs: - script: reg add "HKLM\Software\Policies\Microsoft\Edge\WebView2\ReleaseChannels" /v PowerToys.exe /t REG_SZ /d "3" displayName: "Enable WebView2 Canary Channel" - - - download: current - displayName: Download artifacts - artifact: build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }} - patterns: |- - ** - !**\*.pdb - !**\*.lib + + - template: steps-download-artifacts-with-azure-cli.yml + parameters: + artifactName: $(TestArtifactsName) - template: steps-ensure-dotnet-version.yml parameters: @@ -91,7 +88,7 @@ jobs: platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)' testSelector: 'testAssemblies' - searchFolder: '$(Pipeline.Workspace)\build-${{ parameters.platform }}-${{ parameters.configuration }}${{ parameters.inputArtifactStem }}' + searchFolder: '$(Pipeline.Workspace)\$(TestArtifactsName)' vsTestVersion: 'toolsInstaller' uiTests: true rerunFailedTests: true @@ -99,4 +96,4 @@ jobs: **\UITests-FancyZones.dll **\UITests-FancyZonesEditor.dll !**\obj\** - !**\ref\** + !**\ref\** \ No newline at end of file diff --git a/.pipelines/v2/templates/steps-download-artifacts-with-azure-cli.yml b/.pipelines/v2/templates/steps-download-artifacts-with-azure-cli.yml new file mode 100644 index 000000000000..b8f0401cfcfd --- /dev/null +++ b/.pipelines/v2/templates/steps-download-artifacts-with-azure-cli.yml @@ -0,0 +1,33 @@ +parameters: +- name: artifactName + type: string + default: "" + +# Why use az cli to download? → The ARM agent may run into OutOfMemory issues. +# Why use the Azure CLI ZIP version? → It comes with its own Python and works fine under emulation on ARM64. +# Why not use AzureCLI@2 task? → It requires azureSubscription, which is unnecessary for downloading artifacts. + +steps: +- powershell: | + Write-Host "Downloading Azure CLI ZIP..." + $azCliUrl = "https://aka.ms/installazurecliwindowszipx64" + $azCliZip = "$(Build.ArtifactStagingDirectory)\azure-cli.zip" + + Invoke-WebRequest -Uri $azCliUrl -OutFile $azCliZip + displayName: 'Install Azure CLI from ZIP' + +- task: ExtractFiles@1 + inputs: + archiveFilePatterns: '$(Build.ArtifactStagingDirectory)\azure-cli.zip' + destinationFolder: '$(Build.ArtifactStagingDirectory)\AzureCLI' + +- pwsh: | + $azureCliPath = "$(Build.ArtifactStagingDirectory)\AzureCLI\bin" + $env:Path = "$azureCliPath;" + $env:Path + Write-Host "Configuring Azure DevOps defaults..." + az devops configure --defaults organization='$(System.TeamFoundationCollectionUri)' project='$(System.TeamProject)' --use-git-aliases true + Write-Host "Downloading artifacts..." + az pipelines runs artifact download --artifact-name ${{parameters.artifactName}} --path "$(Pipeline.Workspace)/${{parameters.artifactName}}" --run-id $(Build.BuildId) --debug + displayName: 'Download artifacts with Azure CLI' + env: + AZURE_DEVOPS_EXT_PAT: $(System.AccessToken) diff --git a/.pipelines/verifyDepsJsonLibraryVersions.ps1 b/.pipelines/verifyDepsJsonLibraryVersions.ps1 index 7a7dbd5b816a..e85ca1d991c2 100644 --- a/.pipelines/verifyDepsJsonLibraryVersions.ps1 +++ b/.pipelines/verifyDepsJsonLibraryVersions.ps1 @@ -15,8 +15,8 @@ Param( $referencedFileVersionsPerDll = @{} $totalFailures = 0 -Get-ChildItem $targetDir -Recurse -Filter *.deps.json -Exclude UITests-FancyZones*,MouseJump.Common.UnitTests*,AdvancedPaste.FuzzTests* | ForEach-Object { - # Temporarily exclude FancyZones UI tests because of Appium.WebDriver dependencies +Get-ChildItem $targetDir -Recurse -Filter *.deps.json -Exclude *UITest*,MouseJump.Common.UnitTests*,*.FuzzTests* | ForEach-Object { + # Temporarily exclude All UI-Test, Fuzzer-Test projects because of Appium.WebDriver dependencies $depsJsonFullFileName = $_.FullName if ($depsJsonFullFileName -like "*CmdPal*") { diff --git a/PowerToys.sln b/PowerToys.sln index 89ad846a360a..2c33fc1dfc5f 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -712,871 +712,708 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ZoomItSettingsInterop", "sr EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.CmdPal.Ext.TimeDate", "src\modules\cmdpal\Exts\Microsoft.CmdPal.Ext.TimeDate\Microsoft.CmdPal.Ext.TimeDate.csproj", "{DCC6BD67-17BB-47AA-B507-FB0FE43A7449}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UITestAutomation", "src\common\UITestAutomation\UITestAutomation.csproj", "{A558C25D-2007-498E-8B6F-43405AFAE9E2}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KeyboardManagerEditorUI", "src\modules\keyboardmanager\KeyboardManagerEditorUI\KeyboardManagerEditorUI.csproj", "{08F9155D-B6DC-46E5-9C83-AF60B655898B}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "KeyboardManagerEditorLibraryWrapper", "src\modules\keyboardmanager\KeyboardManagerEditorLibraryWrapper\KeyboardManagerEditorLibraryWrapper.vcxproj", "{4382A954-179A-4078-92AF-715187DFFF50}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hosts.FuzzTests", "src\modules\Hosts\Hosts.FuzzTests\Hosts.FuzzTests.csproj", "{EBED240C-8702-452D-B764-6DB9DA9179AF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hosts.UITests", "src\modules\Hosts\Hosts.UITests\Hosts.UITests.csproj", "{4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|ARM64 = Debug|ARM64 Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 Release|ARM64 = Release|ARM64 Release|x64 = Release|x64 - Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|ARM64.Build.0 = Debug|ARM64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x64.ActiveCfg = Debug|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x64.Build.0 = Debug|x64 - {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Debug|x86.ActiveCfg = Debug|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|ARM64.ActiveCfg = Release|ARM64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|ARM64.Build.0 = Release|ARM64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x64.ActiveCfg = Release|x64 {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x64.Build.0 = Release|x64 - {9412D5C6-2CF2-4FC2-A601-B55508EA9B27}.Release|x86.ActiveCfg = Release|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|ARM64.Build.0 = Debug|ARM64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x64.ActiveCfg = Debug|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x64.Build.0 = Debug|x64 - {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Debug|x86.ActiveCfg = Debug|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|ARM64.ActiveCfg = Release|ARM64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|ARM64.Build.0 = Release|ARM64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x64.ActiveCfg = Release|x64 {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x64.Build.0 = Release|x64 - {F9C68EDF-AC74-4B77-9AF1-005D9C9F6A99}.Release|x86.ActiveCfg = Release|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|ARM64.Build.0 = Debug|ARM64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.ActiveCfg = Debug|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x64.Build.0 = Debug|x64 - {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Debug|x86.ActiveCfg = Debug|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|ARM64.ActiveCfg = Release|ARM64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|ARM64.Build.0 = Release|ARM64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.ActiveCfg = Release|x64 {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x64.Build.0 = Release|x64 - {9C6A7905-72D4-4BF5-B256-ABFDAEF68AE9}.Release|x86.ActiveCfg = Release|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|ARM64.Build.0 = Debug|ARM64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.ActiveCfg = Debug|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x64.Build.0 = Debug|x64 - {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Debug|x86.ActiveCfg = Debug|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|ARM64.ActiveCfg = Release|ARM64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|ARM64.Build.0 = Release|ARM64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.ActiveCfg = Release|x64 {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x64.Build.0 = Release|x64 - {1A066C63-64B3-45F8-92FE-664E1CCE8077}.Release|x86.ActiveCfg = Release|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|ARM64.Build.0 = Debug|ARM64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x64.ActiveCfg = Debug|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x64.Build.0 = Debug|x64 - {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Debug|x86.ActiveCfg = Debug|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|ARM64.ActiveCfg = Release|ARM64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|ARM64.Build.0 = Release|ARM64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x64.ActiveCfg = Release|x64 {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x64.Build.0 = Release|x64 - {5CCC8468-DEC8-4D36-99D4-5C891BEBD481}.Release|x86.ActiveCfg = Release|x64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|ARM64.Build.0 = Debug|ARM64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x64.ActiveCfg = Debug|x64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x64.Build.0 = Debug|x64 - {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Debug|x86.ActiveCfg = Debug|x64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|ARM64.ActiveCfg = Release|ARM64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|ARM64.Build.0 = Release|ARM64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x64.ActiveCfg = Release|x64 {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x64.Build.0 = Release|x64 - {B25AC7A5-FB9F-4789-B392-D5C85E948670}.Release|x86.ActiveCfg = Release|x64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|ARM64.Build.0 = Debug|ARM64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x64.ActiveCfg = Debug|x64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x64.Build.0 = Debug|x64 - {51920F1F-C28C-4ADF-8660-4238766796C2}.Debug|x86.ActiveCfg = Debug|x64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|ARM64.ActiveCfg = Release|ARM64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|ARM64.Build.0 = Release|ARM64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x64.ActiveCfg = Release|x64 {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x64.Build.0 = Release|x64 - {51920F1F-C28C-4ADF-8660-4238766796C2}.Release|x86.ActiveCfg = Release|x64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|ARM64.Build.0 = Debug|ARM64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x64.ActiveCfg = Debug|x64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x64.Build.0 = Debug|x64 - {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Debug|x86.ActiveCfg = Debug|x64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|ARM64.ActiveCfg = Release|ARM64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|ARM64.Build.0 = Release|ARM64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x64.ActiveCfg = Release|x64 {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x64.Build.0 = Release|x64 - {A3935CF4-46C5-4A88-84D3-6B12E16E6BA2}.Release|x86.ActiveCfg = Release|x64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|ARM64.Build.0 = Debug|ARM64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x64.ActiveCfg = Debug|x64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x64.Build.0 = Debug|x64 - {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Debug|x86.ActiveCfg = Debug|x64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|ARM64.ActiveCfg = Release|ARM64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|ARM64.Build.0 = Release|ARM64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x64.ActiveCfg = Release|x64 {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x64.Build.0 = Release|x64 - {2151F984-E006-4A9F-92EF-C6DDE3DC8413}.Release|x86.ActiveCfg = Release|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|ARM64.ActiveCfg = Debug|ARM64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|ARM64.Build.0 = Debug|ARM64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x64.ActiveCfg = Debug|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x64.Build.0 = Debug|x64 - {64A80062-4D8B-4229-8A38-DFA1D7497749}.Debug|x86.ActiveCfg = Debug|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|ARM64.ActiveCfg = Release|ARM64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|ARM64.Build.0 = Release|ARM64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x64.ActiveCfg = Release|x64 {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x64.Build.0 = Release|x64 - {64A80062-4D8B-4229-8A38-DFA1D7497749}.Release|x86.ActiveCfg = Release|x64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|ARM64.ActiveCfg = Debug|ARM64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|ARM64.Build.0 = Debug|ARM64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|x64.ActiveCfg = Debug|x64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|x64.Build.0 = Debug|x64 - {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Debug|x86.ActiveCfg = Debug|x64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|ARM64.ActiveCfg = Release|ARM64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|ARM64.Build.0 = Release|ARM64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|x64.ActiveCfg = Release|x64 {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|x64.Build.0 = Release|x64 - {89F34AF7-1C34-4A72-AA6E-534BCF972BD9}.Release|x86.ActiveCfg = Release|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|ARM64.Build.0 = Debug|ARM64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x64.ActiveCfg = Debug|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x64.Build.0 = Debug|x64 - {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Debug|x86.ActiveCfg = Debug|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|ARM64.ActiveCfg = Release|ARM64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|ARM64.Build.0 = Release|ARM64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x64.ActiveCfg = Release|x64 {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x64.Build.0 = Release|x64 - {2BE46397-4DFA-414C-9BD4-41E4BBF8CB34}.Release|x86.ActiveCfg = Release|x64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|ARM64.Build.0 = Debug|ARM64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x64.ActiveCfg = Debug|x64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x64.Build.0 = Debug|x64 - {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Debug|x86.ActiveCfg = Debug|x64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|ARM64.ActiveCfg = Release|ARM64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|ARM64.Build.0 = Release|ARM64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x64.ActiveCfg = Release|x64 {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x64.Build.0 = Release|x64 - {0B43679E-EDFA-4DA0-AD30-F4628B308B1B}.Release|x86.ActiveCfg = Release|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|ARM64.Build.0 = Debug|ARM64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x64.ActiveCfg = Debug|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x64.Build.0 = Debug|x64 - {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Debug|x86.ActiveCfg = Debug|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|ARM64.ActiveCfg = Release|ARM64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|ARM64.Build.0 = Release|ARM64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x64.ActiveCfg = Release|x64 {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x64.Build.0 = Release|x64 - {E0CC7526-D85E-43AC-844F-D5DF0D2F5AB8}.Release|x86.ActiveCfg = Release|x64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|ARM64.Build.0 = Debug|ARM64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x64.ActiveCfg = Debug|x64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x64.Build.0 = Debug|x64 - {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Debug|x86.ActiveCfg = Debug|x64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|ARM64.ActiveCfg = Release|ARM64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|ARM64.Build.0 = Release|ARM64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x64.ActiveCfg = Release|x64 {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x64.Build.0 = Release|x64 - {D29DDD63-E2CF-4657-9FD5-2AEDE4257E5D}.Release|x86.ActiveCfg = Release|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|ARM64.Build.0 = Debug|ARM64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.ActiveCfg = Debug|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x64.Build.0 = Debug|x64 - {17DA04DF-E393-4397-9CF0-84DABE11032E}.Debug|x86.ActiveCfg = Debug|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|ARM64.ActiveCfg = Release|ARM64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|ARM64.Build.0 = Release|ARM64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.ActiveCfg = Release|x64 {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x64.Build.0 = Release|x64 - {17DA04DF-E393-4397-9CF0-84DABE11032E}.Release|x86.ActiveCfg = Release|x64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|ARM64.Build.0 = Debug|ARM64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|x64.ActiveCfg = Debug|x64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|x64.Build.0 = Debug|x64 - {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Debug|x86.ActiveCfg = Debug|x64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|ARM64.ActiveCfg = Release|ARM64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|ARM64.Build.0 = Release|ARM64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|x64.ActiveCfg = Release|x64 {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|x64.Build.0 = Release|x64 - {8AFFA899-0B73-49EC-8C50-0FADDA57B2FC}.Release|x86.ActiveCfg = Release|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|ARM64.Build.0 = Debug|ARM64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x64.ActiveCfg = Debug|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x64.Build.0 = Debug|x64 - {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Debug|x86.ActiveCfg = Debug|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|ARM64.ActiveCfg = Release|ARM64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|ARM64.Build.0 = Release|ARM64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x64.ActiveCfg = Release|x64 {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x64.Build.0 = Release|x64 - {4FD29318-A8AB-4D8F-AA47-60BC241B8DA3}.Release|x86.ActiveCfg = Release|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|ARM64.Build.0 = Debug|ARM64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x64.ActiveCfg = Debug|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x64.Build.0 = Debug|x64 - {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Debug|x86.ActiveCfg = Debug|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|ARM64.ActiveCfg = Release|ARM64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|ARM64.Build.0 = Release|ARM64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x64.ActiveCfg = Release|x64 {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x64.Build.0 = Release|x64 - {8451ECDD-2EA4-4966-BB0A-7BBC40138E80}.Release|x86.ActiveCfg = Release|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|ARM64.Build.0 = Debug|ARM64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.ActiveCfg = Debug|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x64.Build.0 = Debug|x64 - {FF742965-9A80-41A5-B042-D6C7D3A21708}.Debug|x86.ActiveCfg = Debug|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|ARM64.ActiveCfg = Release|ARM64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|ARM64.Build.0 = Release|ARM64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.ActiveCfg = Release|x64 {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x64.Build.0 = Release|x64 - {FF742965-9A80-41A5-B042-D6C7D3A21708}.Release|x86.ActiveCfg = Release|x64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|ARM64.Build.0 = Debug|ARM64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.ActiveCfg = Debug|x64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x64.Build.0 = Debug|x64 - {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Debug|x86.ActiveCfg = Debug|x64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|ARM64.ActiveCfg = Release|ARM64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|ARM64.Build.0 = Release|ARM64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.ActiveCfg = Release|x64 {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x64.Build.0 = Release|x64 - {59BD9891-3837-438A-958D-ADC7F91F6F7E}.Release|x86.ActiveCfg = Release|x64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Debug|ARM64.Build.0 = Debug|ARM64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Debug|x64.ActiveCfg = Debug|x64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Debug|x64.Build.0 = Debug|x64 - {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Debug|x86.ActiveCfg = Debug|x64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Release|ARM64.ActiveCfg = Release|ARM64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Release|ARM64.Build.0 = Release|ARM64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Release|x64.ActiveCfg = Release|x64 {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Release|x64.Build.0 = Release|x64 - {4D971245-7A70-41D5-BAA0-DDB5684CAF51}.Release|x86.ActiveCfg = Release|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|ARM64.Build.0 = Debug|ARM64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.ActiveCfg = Debug|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x64.Build.0 = Debug|x64 - {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Debug|x86.ActiveCfg = Debug|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|ARM64.ActiveCfg = Release|ARM64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|ARM64.Build.0 = Release|ARM64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.ActiveCfg = Release|x64 {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x64.Build.0 = Release|x64 - {74F1B9ED-F59C-4FE7-B473-7B453E30837E}.Release|x86.ActiveCfg = Release|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|ARM64.Build.0 = Debug|ARM64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x64.ActiveCfg = Debug|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x64.Build.0 = Debug|x64 - {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Debug|x86.ActiveCfg = Debug|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|ARM64.ActiveCfg = Release|ARM64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|ARM64.Build.0 = Release|ARM64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x64.ActiveCfg = Release|x64 {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x64.Build.0 = Release|x64 - {FDB3555B-58EF-4AE6-B5F1-904719637AB4}.Release|x86.ActiveCfg = Release|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|ARM64.Build.0 = Debug|ARM64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.ActiveCfg = Debug|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x64.Build.0 = Debug|x64 - {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Debug|x86.ActiveCfg = Debug|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|ARM64.ActiveCfg = Release|ARM64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|ARM64.Build.0 = Release|ARM64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x64.ActiveCfg = Release|x64 {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x64.Build.0 = Release|x64 - {C21BFF9C-2C99-4B5F-B7C9-A5E6DDDB37B0}.Release|x86.ActiveCfg = Release|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|ARM64.Build.0 = Debug|ARM64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x64.ActiveCfg = Debug|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x64.Build.0 = Debug|x64 - {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Debug|x86.ActiveCfg = Debug|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|ARM64.ActiveCfg = Release|ARM64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|ARM64.Build.0 = Release|ARM64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x64.ActiveCfg = Release|x64 {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x64.Build.0 = Release|x64 - {F8B870EB-D5F5-45BA-9CF7-A5C459818820}.Release|x86.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|ARM64.Build.0 = Debug|ARM64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x64.ActiveCfg = Debug|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x64.Build.0 = Debug|x64 - {E364F67B-BB12-4E91-B639-355866EBCD8B}.Debug|x86.ActiveCfg = Debug|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|ARM64.ActiveCfg = Release|ARM64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|ARM64.Build.0 = Release|ARM64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.ActiveCfg = Release|x64 {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x64.Build.0 = Release|x64 - {E364F67B-BB12-4E91-B639-355866EBCD8B}.Release|x86.ActiveCfg = Release|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|ARM64.Build.0 = Debug|ARM64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x64.ActiveCfg = Debug|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x64.Build.0 = Debug|x64 - {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Debug|x86.ActiveCfg = Debug|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|ARM64.ActiveCfg = Release|ARM64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|ARM64.Build.0 = Release|ARM64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x64.ActiveCfg = Release|x64 {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x64.Build.0 = Release|x64 - {F97E5003-F263-4D4A-A964-0F1F3C82DEF2}.Release|x86.ActiveCfg = Release|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|ARM64.Build.0 = Debug|ARM64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.ActiveCfg = Debug|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x64.Build.0 = Debug|x64 - {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Debug|x86.ActiveCfg = Debug|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|ARM64.ActiveCfg = Release|ARM64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|ARM64.Build.0 = Release|ARM64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.ActiveCfg = Release|x64 {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x64.Build.0 = Release|x64 - {AF2349B8-E5B6-4004-9502-687C1C7730B1}.Release|x86.ActiveCfg = Release|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|ARM64.ActiveCfg = Debug|ARM64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|ARM64.Build.0 = Debug|ARM64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.ActiveCfg = Debug|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x64.Build.0 = Debug|x64 - {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Debug|x86.ActiveCfg = Debug|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|ARM64.ActiveCfg = Release|ARM64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|ARM64.Build.0 = Release|ARM64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.ActiveCfg = Release|x64 {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x64.Build.0 = Release|x64 - {6A71162E-FC4C-4A2C-B90F-3CF94F59A9BB}.Release|x86.ActiveCfg = Release|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|ARM64.Build.0 = Debug|ARM64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.ActiveCfg = Debug|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x64.Build.0 = Debug|x64 - {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Debug|x86.ActiveCfg = Debug|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|ARM64.ActiveCfg = Release|ARM64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|ARM64.Build.0 = Release|ARM64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.ActiveCfg = Release|x64 {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x64.Build.0 = Release|x64 - {A2B51B8B-8F90-424E-BC97-F9AB7D76CA1A}.Release|x86.ActiveCfg = Release|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|ARM64.Build.0 = Debug|ARM64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.ActiveCfg = Debug|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x64.Build.0 = Debug|x64 - {DA425894-6E13-404F-8DCB-78584EC0557A}.Debug|x86.ActiveCfg = Debug|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|ARM64.ActiveCfg = Release|ARM64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|ARM64.Build.0 = Release|ARM64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.ActiveCfg = Release|x64 {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x64.Build.0 = Release|x64 - {DA425894-6E13-404F-8DCB-78584EC0557A}.Release|x86.ActiveCfg = Release|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|ARM64.ActiveCfg = Debug|ARM64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|ARM64.Build.0 = Debug|ARM64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.ActiveCfg = Debug|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x64.Build.0 = Debug|x64 - {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Debug|x86.ActiveCfg = Debug|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|ARM64.ActiveCfg = Release|ARM64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|ARM64.Build.0 = Release|ARM64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.ActiveCfg = Release|x64 {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x64.Build.0 = Release|x64 - {060D75DA-2D1C-48E6-A4A1-6F0718B64661}.Release|x86.ActiveCfg = Release|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|ARM64.ActiveCfg = Debug|ARM64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|ARM64.Build.0 = Debug|ARM64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.ActiveCfg = Debug|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x64.Build.0 = Debug|x64 - {748417CA-F17E-487F-9411-CAFB6D3F4877}.Debug|x86.ActiveCfg = Debug|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|ARM64.ActiveCfg = Release|ARM64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|ARM64.Build.0 = Release|ARM64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.ActiveCfg = Release|x64 {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x64.Build.0 = Release|x64 - {748417CA-F17E-487F-9411-CAFB6D3F4877}.Release|x86.ActiveCfg = Release|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|ARM64.Build.0 = Debug|ARM64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.ActiveCfg = Debug|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x64.Build.0 = Debug|x64 - {217DF501-135C-4E38-BFC8-99D4821032EA}.Debug|x86.ActiveCfg = Debug|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|ARM64.ActiveCfg = Release|ARM64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|ARM64.Build.0 = Release|ARM64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.ActiveCfg = Release|x64 {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x64.Build.0 = Release|x64 - {217DF501-135C-4E38-BFC8-99D4821032EA}.Release|x86.ActiveCfg = Release|x64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|ARM64.Build.0 = Debug|ARM64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|x64.ActiveCfg = Debug|x64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|x64.Build.0 = Debug|x64 - {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Debug|x86.ActiveCfg = Debug|x64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|ARM64.ActiveCfg = Release|ARM64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|ARM64.Build.0 = Release|ARM64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|x64.ActiveCfg = Release|x64 {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|x64.Build.0 = Release|x64 - {B1BCC8C6-46B5-4BFA-8F22-20F32D99EC6A}.Release|x86.ActiveCfg = Release|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|ARM64.Build.0 = Debug|ARM64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x64.ActiveCfg = Debug|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x64.Build.0 = Debug|x64 - {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Debug|x86.ActiveCfg = Debug|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|ARM64.ActiveCfg = Release|ARM64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|ARM64.Build.0 = Release|ARM64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x64.ActiveCfg = Release|x64 {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x64.Build.0 = Release|x64 - {787B8AA6-CA93-4C84-96FE-DF31110AD1C4}.Release|x86.ActiveCfg = Release|x64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|ARM64.ActiveCfg = Debug|ARM64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|ARM64.Build.0 = Debug|ARM64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|x64.ActiveCfg = Debug|x64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|x64.Build.0 = Debug|x64 - {08C8C05F-0362-41BC-818C-724572DF8B06}.Debug|x86.ActiveCfg = Debug|x64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Release|ARM64.ActiveCfg = Release|ARM64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Release|ARM64.Build.0 = Release|ARM64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Release|x64.ActiveCfg = Release|x64 {08C8C05F-0362-41BC-818C-724572DF8B06}.Release|x64.Build.0 = Release|x64 - {08C8C05F-0362-41BC-818C-724572DF8B06}.Release|x86.ActiveCfg = Release|x64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|ARM64.Build.0 = Debug|ARM64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|x64.ActiveCfg = Debug|x64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|x64.Build.0 = Debug|x64 - {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Debug|x86.ActiveCfg = Debug|x64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|ARM64.ActiveCfg = Release|ARM64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|ARM64.Build.0 = Release|ARM64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|x64.ActiveCfg = Release|x64 {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|x64.Build.0 = Release|x64 - {5D00D290-4016-4CFE-9E41-1E7C724509BA}.Release|x86.ActiveCfg = Release|x64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|ARM64.Build.0 = Debug|ARM64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|x64.ActiveCfg = Debug|x64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|x64.Build.0 = Debug|x64 - {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Debug|x86.ActiveCfg = Debug|x64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|ARM64.ActiveCfg = Release|ARM64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|ARM64.Build.0 = Release|ARM64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|x64.ActiveCfg = Release|x64 {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|x64.Build.0 = Release|x64 - {4AED67B6-55FD-486F-B917-E543DEE2CB3C}.Release|x86.ActiveCfg = Release|x64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|ARM64.Build.0 = Debug|ARM64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|x64.ActiveCfg = Debug|x64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|x64.Build.0 = Debug|x64 - {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Debug|x86.ActiveCfg = Debug|x64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|ARM64.ActiveCfg = Release|ARM64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|ARM64.Build.0 = Release|ARM64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|x64.ActiveCfg = Release|x64 {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|x64.Build.0 = Release|x64 - {42851751-CBC8-45A6-97F5-7A0753F7B4D1}.Release|x86.ActiveCfg = Release|x64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Debug|ARM64.Build.0 = Debug|ARM64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Debug|x64.ActiveCfg = Debug|x64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Debug|x64.Build.0 = Debug|x64 - {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Debug|x86.ActiveCfg = Debug|x64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Release|ARM64.ActiveCfg = Release|ARM64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Release|ARM64.Build.0 = Release|ARM64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Release|x64.ActiveCfg = Release|x64 {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Release|x64.Build.0 = Release|x64 - {1EF1EEF0-10F0-4F2E-8550-39B6D8044D3E}.Release|x86.ActiveCfg = Release|x64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Debug|ARM64.Build.0 = Debug|ARM64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Debug|x64.ActiveCfg = Debug|x64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Debug|x64.Build.0 = Debug|x64 - {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Debug|x86.ActiveCfg = Debug|x64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Release|ARM64.ActiveCfg = Release|ARM64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Release|ARM64.Build.0 = Release|ARM64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Release|x64.ActiveCfg = Release|x64 {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Release|x64.Build.0 = Release|x64 - {8FFE09DA-FA4F-4EE1-B3A2-AD5497FBD1AD}.Release|x86.ActiveCfg = Release|x64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Debug|ARM64.Build.0 = Debug|ARM64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Debug|x64.ActiveCfg = Debug|x64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Debug|x64.Build.0 = Debug|x64 - {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Debug|x86.ActiveCfg = Debug|x64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Release|ARM64.ActiveCfg = Release|ARM64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Release|ARM64.Build.0 = Release|ARM64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Release|x64.ActiveCfg = Release|x64 {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Release|x64.Build.0 = Release|x64 - {655C9AF2-18D3-4DA6-80E4-85504A7722BA}.Release|x86.ActiveCfg = Release|x64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Debug|ARM64.ActiveCfg = Debug|ARM64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Debug|ARM64.Build.0 = Debug|ARM64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Debug|x64.ActiveCfg = Debug|x64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Debug|x64.Build.0 = Debug|x64 - {BA58206B-1493-4C75-BFEA-A85768A1E156}.Debug|x86.ActiveCfg = Debug|x64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Release|ARM64.ActiveCfg = Release|ARM64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Release|ARM64.Build.0 = Release|ARM64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Release|x64.ActiveCfg = Release|x64 {BA58206B-1493-4C75-BFEA-A85768A1E156}.Release|x64.Build.0 = Release|x64 - {BA58206B-1493-4C75-BFEA-A85768A1E156}.Release|x86.ActiveCfg = Release|x64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Debug|ARM64.ActiveCfg = Debug|ARM64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Debug|ARM64.Build.0 = Debug|ARM64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Debug|x64.ActiveCfg = Debug|x64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Debug|x64.Build.0 = Debug|x64 - {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Debug|x86.ActiveCfg = Debug|x64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Release|ARM64.ActiveCfg = Release|ARM64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Release|ARM64.Build.0 = Release|ARM64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Release|x64.ActiveCfg = Release|x64 {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Release|x64.Build.0 = Release|x64 - {03276A39-D4E9-417C-8FFD-200B0EE5E871}.Release|x86.ActiveCfg = Release|x64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Debug|ARM64.Build.0 = Debug|ARM64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Debug|x64.ActiveCfg = Debug|x64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Debug|x64.Build.0 = Debug|x64 - {B81FB7B6-D30E-428F-908A-41422EFC1172}.Debug|x86.ActiveCfg = Debug|x64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Release|ARM64.ActiveCfg = Release|ARM64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Release|ARM64.Build.0 = Release|ARM64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Release|x64.ActiveCfg = Release|x64 {B81FB7B6-D30E-428F-908A-41422EFC1172}.Release|x64.Build.0 = Release|x64 - {B81FB7B6-D30E-428F-908A-41422EFC1172}.Release|x86.ActiveCfg = Release|x64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Debug|ARM64.Build.0 = Debug|ARM64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Debug|x64.ActiveCfg = Debug|x64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Debug|x64.Build.0 = Debug|x64 - {0F85E674-34AE-443D-954C-8321EB8B93B1}.Debug|x86.ActiveCfg = Debug|x64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Release|ARM64.ActiveCfg = Release|ARM64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Release|ARM64.Build.0 = Release|ARM64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Release|x64.ActiveCfg = Release|x64 {0F85E674-34AE-443D-954C-8321EB8B93B1}.Release|x64.Build.0 = Release|x64 - {0F85E674-34AE-443D-954C-8321EB8B93B1}.Release|x86.ActiveCfg = Release|x64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Debug|ARM64.ActiveCfg = Debug|ARM64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Debug|ARM64.Build.0 = Debug|ARM64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Debug|x64.ActiveCfg = Debug|x64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Debug|x64.Build.0 = Debug|x64 - {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Debug|x86.ActiveCfg = Debug|x64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|ARM64.ActiveCfg = Release|ARM64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|ARM64.Build.0 = Release|ARM64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|x64.ActiveCfg = Release|x64 {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|x64.Build.0 = Release|x64 - {632BBE62-5421-49EA-835A-7FFA4F499BD6}.Release|x86.ActiveCfg = Release|x64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|ARM64.Build.0 = Debug|ARM64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|x64.ActiveCfg = Debug|x64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|x64.Build.0 = Debug|x64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Debug|x86.ActiveCfg = Debug|x64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|ARM64.ActiveCfg = Release|ARM64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|ARM64.Build.0 = Release|ARM64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|x64.ActiveCfg = Release|x64 {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|x64.Build.0 = Release|x64 - {4FA206A5-F69F-4193-BF8F-F6EEB496734C}.Release|x86.ActiveCfg = Release|x64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|ARM64.Build.0 = Debug|ARM64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|x64.ActiveCfg = Debug|x64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|x64.Build.0 = Debug|x64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Debug|x86.ActiveCfg = Debug|x64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|ARM64.ActiveCfg = Release|ARM64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|ARM64.Build.0 = Release|ARM64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|x64.ActiveCfg = Release|x64 {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|x64.Build.0 = Release|x64 - {090CD7B7-3B0C-4D1D-BC98-83EB5D799BC1}.Release|x86.ActiveCfg = Release|x64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|ARM64.Build.0 = Debug|ARM64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|x64.ActiveCfg = Debug|x64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|x64.Build.0 = Debug|x64 - {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Debug|x86.ActiveCfg = Debug|x64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|ARM64.ActiveCfg = Release|ARM64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|ARM64.Build.0 = Release|ARM64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|x64.ActiveCfg = Release|x64 {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|x64.Build.0 = Release|x64 - {7E1E3F13-2BD6-3F75-A6A7-873A2B55C60F}.Release|x86.ActiveCfg = Release|x64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Debug|ARM64.Build.0 = Debug|ARM64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Debug|x64.ActiveCfg = Debug|x64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Debug|x64.Build.0 = Debug|x64 - {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Debug|x86.ActiveCfg = Debug|x64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Release|ARM64.ActiveCfg = Release|ARM64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Release|ARM64.Build.0 = Release|ARM64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Release|x64.ActiveCfg = Release|x64 {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Release|x64.Build.0 = Release|x64 - {FD8EB419-FF9C-4D88-BB6F-BF6CED37747B}.Release|x86.ActiveCfg = Release|x64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Debug|ARM64.ActiveCfg = Debug|ARM64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Debug|ARM64.Build.0 = Debug|ARM64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Debug|x64.ActiveCfg = Debug|x64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Debug|x64.Build.0 = Debug|x64 - {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Debug|x86.ActiveCfg = Debug|x64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Release|ARM64.ActiveCfg = Release|ARM64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Release|ARM64.Build.0 = Release|ARM64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Release|x64.ActiveCfg = Release|x64 {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Release|x64.Build.0 = Release|x64 - {DA5A6FE9-0040-40CC-83CC-764AE5306590}.Release|x86.ActiveCfg = Release|x64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Debug|ARM64.Build.0 = Debug|ARM64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Debug|x64.ActiveCfg = Debug|x64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Debug|x64.Build.0 = Debug|x64 - {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Debug|x86.ActiveCfg = Debug|x64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Release|ARM64.ActiveCfg = Release|ARM64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Release|ARM64.Build.0 = Release|ARM64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Release|x64.ActiveCfg = Release|x64 {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Release|x64.Build.0 = Release|x64 - {0351ADA4-0C32-4652-9BA0-41F7B602372B}.Release|x86.ActiveCfg = Release|x64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|ARM64.Build.0 = Debug|ARM64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|x64.ActiveCfg = Debug|x64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|x64.Build.0 = Debug|x64 - {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Debug|x86.ActiveCfg = Debug|x64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|ARM64.ActiveCfg = Release|ARM64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|ARM64.Build.0 = Release|ARM64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|x64.ActiveCfg = Release|x64 {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|x64.Build.0 = Release|x64 - {D9B8FC84-322A-4F9F-BBB9-20915C47DDFD}.Release|x86.ActiveCfg = Release|x64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Debug|ARM64.ActiveCfg = Debug|ARM64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Debug|ARM64.Build.0 = Debug|ARM64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Debug|x64.ActiveCfg = Debug|x64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Debug|x64.Build.0 = Debug|x64 - {6955446D-23F7-4023-9BB3-8657F904AF99}.Debug|x86.ActiveCfg = Debug|x64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Release|ARM64.ActiveCfg = Release|ARM64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Release|ARM64.Build.0 = Release|ARM64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Release|x64.ActiveCfg = Release|x64 {6955446D-23F7-4023-9BB3-8657F904AF99}.Release|x64.Build.0 = Release|x64 - {6955446D-23F7-4023-9BB3-8657F904AF99}.Release|x86.ActiveCfg = Release|x64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Debug|ARM64.Build.0 = Debug|ARM64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Debug|x64.ActiveCfg = Debug|x64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Debug|x64.Build.0 = Debug|x64 - {58736667-1027-4AD7-BFDF-7A3A6474103A}.Debug|x86.ActiveCfg = Debug|x64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Release|ARM64.ActiveCfg = Release|ARM64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Release|ARM64.Build.0 = Release|ARM64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Release|x64.ActiveCfg = Release|x64 {58736667-1027-4AD7-BFDF-7A3A6474103A}.Release|x64.Build.0 = Release|x64 - {58736667-1027-4AD7-BFDF-7A3A6474103A}.Release|x86.ActiveCfg = Release|x64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Debug|ARM64.Build.0 = Debug|ARM64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Debug|x64.ActiveCfg = Debug|x64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Debug|x64.Build.0 = Debug|x64 - {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Debug|x86.ActiveCfg = Debug|x64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Release|ARM64.ActiveCfg = Release|ARM64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Release|ARM64.Build.0 = Release|ARM64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Release|x64.ActiveCfg = Release|x64 {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Release|x64.Build.0 = Release|x64 - {1D5BE09D-78C0-4FD7-AF00-AE7C1AF7C525}.Release|x86.ActiveCfg = Release|x64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|ARM64.ActiveCfg = Debug|ARM64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|ARM64.Build.0 = Debug|ARM64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x64.ActiveCfg = Debug|x64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x64.Build.0 = Debug|x64 - {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Debug|x86.ActiveCfg = Debug|x64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|ARM64.ActiveCfg = Release|ARM64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|ARM64.Build.0 = Release|ARM64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x64.ActiveCfg = Release|x64 {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x64.Build.0 = Release|x64 - {031AC72E-FA28-4AB7-B690-6F7B9C28AA73}.Release|x86.ActiveCfg = Release|x64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|ARM64.Build.0 = Debug|ARM64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x64.ActiveCfg = Debug|x64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x64.Build.0 = Debug|x64 - {0B593A6C-4143-4337-860E-DB5710FB87DB}.Debug|x86.ActiveCfg = Debug|x64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|ARM64.ActiveCfg = Release|ARM64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|ARM64.Build.0 = Release|ARM64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x64.ActiveCfg = Release|x64 {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x64.Build.0 = Release|x64 - {0B593A6C-4143-4337-860E-DB5710FB87DB}.Release|x86.ActiveCfg = Release|x64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|ARM64.Build.0 = Debug|ARM64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x64.ActiveCfg = Debug|x64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x64.Build.0 = Debug|x64 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x86.ActiveCfg = Debug|x64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|ARM64.ActiveCfg = Release|ARM64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|ARM64.Build.0 = Release|ARM64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x64.ActiveCfg = Release|x64 {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x64.Build.0 = Release|x64 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x86.ActiveCfg = Release|x64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Debug|ARM64.Build.0 = Debug|ARM64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Debug|x64.ActiveCfg = Debug|x64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Debug|x64.Build.0 = Debug|x64 - {7319089E-46D6-4400-BC65-E39BDF1416EE}.Debug|x86.ActiveCfg = Debug|x64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Release|ARM64.ActiveCfg = Release|ARM64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Release|ARM64.Build.0 = Release|ARM64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Release|x64.ActiveCfg = Release|x64 {7319089E-46D6-4400-BC65-E39BDF1416EE}.Release|x64.Build.0 = Release|x64 - {7319089E-46D6-4400-BC65-E39BDF1416EE}.Release|x86.ActiveCfg = Release|x64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Debug|ARM64.ActiveCfg = Debug|ARM64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Debug|ARM64.Build.0 = Debug|ARM64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Debug|x64.ActiveCfg = Debug|x64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Debug|x64.Build.0 = Debug|x64 - {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Debug|x86.ActiveCfg = Debug|x64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Release|ARM64.ActiveCfg = Release|ARM64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Release|ARM64.Build.0 = Release|ARM64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Release|x64.ActiveCfg = Release|x64 {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Release|x64.Build.0 = Release|x64 - {CABA8DFB-823B-4BF2-93AC-3F31984150D9}.Release|x86.ActiveCfg = Release|x64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Debug|ARM64.ActiveCfg = Debug|ARM64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Debug|ARM64.Build.0 = Debug|ARM64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Debug|x64.ActiveCfg = Debug|x64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Debug|x64.Build.0 = Debug|x64 - {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Debug|x86.ActiveCfg = Debug|x64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Release|ARM64.ActiveCfg = Release|ARM64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Release|ARM64.Build.0 = Release|ARM64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Release|x64.ActiveCfg = Release|x64 {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Release|x64.Build.0 = Release|x64 - {98537082-0FDB-40DE-ABD8-0DC5A4269BAB}.Release|x86.ActiveCfg = Release|x64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Debug|ARM64.Build.0 = Debug|ARM64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Debug|x64.ActiveCfg = Debug|x64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Debug|x64.Build.0 = Debug|x64 - {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Debug|x86.ActiveCfg = Debug|x64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Release|ARM64.ActiveCfg = Release|ARM64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Release|ARM64.Build.0 = Release|ARM64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Release|x64.ActiveCfg = Release|x64 {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Release|x64.Build.0 = Release|x64 - {C3A17DCA-217B-462C-BB0C-BE086AF80081}.Release|x86.ActiveCfg = Release|x64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Debug|ARM64.Build.0 = Debug|ARM64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Debug|x64.ActiveCfg = Debug|x64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Debug|x64.Build.0 = Debug|x64 - {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Debug|x86.ActiveCfg = Debug|x64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Release|ARM64.ActiveCfg = Release|ARM64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Release|ARM64.Build.0 = Release|ARM64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Release|x64.ActiveCfg = Release|x64 {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Release|x64.Build.0 = Release|x64 - {69E1EE8D-143A-4060-9129-4658ACF14AAF}.Release|x86.ActiveCfg = Release|x64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Debug|ARM64.Build.0 = Debug|ARM64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Debug|x64.ActiveCfg = Debug|x64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Debug|x64.Build.0 = Debug|x64 - {ECC20689-002A-4354-95A6-B58DF089C6FF}.Debug|x86.ActiveCfg = Debug|x64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Release|ARM64.ActiveCfg = Release|ARM64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Release|ARM64.Build.0 = Release|ARM64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Release|x64.ActiveCfg = Release|x64 {ECC20689-002A-4354-95A6-B58DF089C6FF}.Release|x64.Build.0 = Release|x64 - {ECC20689-002A-4354-95A6-B58DF089C6FF}.Release|x86.ActiveCfg = Release|x64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Debug|ARM64.Build.0 = Debug|ARM64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Debug|x64.ActiveCfg = Debug|x64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Debug|x64.Build.0 = Debug|x64 - {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Debug|x86.ActiveCfg = Debug|x64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Release|ARM64.ActiveCfg = Release|ARM64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Release|ARM64.Build.0 = Release|ARM64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Release|x64.ActiveCfg = Release|x64 {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Release|x64.Build.0 = Release|x64 - {4BABF3FE-3451-42FD-873F-3C332E18DCEF}.Release|x86.ActiveCfg = Release|x64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Debug|ARM64.Build.0 = Debug|ARM64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Debug|x64.ActiveCfg = Debug|x64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Debug|x64.Build.0 = Debug|x64 - {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Debug|x86.ActiveCfg = Debug|x64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Release|ARM64.ActiveCfg = Release|ARM64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Release|ARM64.Build.0 = Release|ARM64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Release|x64.ActiveCfg = Release|x64 {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Release|x64.Build.0 = Release|x64 - {0648DF05-5DDA-4BE1-B5F2-584926EBDB65}.Release|x86.ActiveCfg = Release|x64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Debug|ARM64.ActiveCfg = Debug|ARM64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Debug|ARM64.Build.0 = Debug|ARM64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Debug|x64.ActiveCfg = Debug|x64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Debug|x64.Build.0 = Debug|x64 - {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Debug|x86.ActiveCfg = Debug|x64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Release|ARM64.ActiveCfg = Release|ARM64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Release|ARM64.Build.0 = Release|ARM64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Release|x64.ActiveCfg = Release|x64 {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Release|x64.Build.0 = Release|x64 - {BA661F5B-1D5A-4FFC-9BF1-FC39DF280BDD}.Release|x86.ActiveCfg = Release|x64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Debug|ARM64.Build.0 = Debug|ARM64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Debug|x64.ActiveCfg = Debug|x64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Debug|x64.Build.0 = Debug|x64 - {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Debug|x86.ActiveCfg = Debug|x64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Release|ARM64.ActiveCfg = Release|ARM64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Release|ARM64.Build.0 = Release|ARM64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Release|x64.ActiveCfg = Release|x64 {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Release|x64.Build.0 = Release|x64 - {E496B7FC-1E99-4BAB-849B-0E8367040B02}.Release|x86.ActiveCfg = Release|x64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Debug|ARM64.ActiveCfg = Debug|ARM64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Debug|ARM64.Build.0 = Debug|ARM64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Debug|x64.ActiveCfg = Debug|x64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Debug|x64.Build.0 = Debug|x64 - {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Debug|x86.ActiveCfg = Debug|x64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Release|ARM64.ActiveCfg = Release|ARM64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Release|ARM64.Build.0 = Release|ARM64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Release|x64.ActiveCfg = Release|x64 {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Release|x64.Build.0 = Release|x64 - {7F4B3A60-BC27-45A7-8000-68B0B6EA7466}.Release|x86.ActiveCfg = Release|x64 {8DF78B53-200E-451F-9328-01EB907193AE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8DF78B53-200E-451F-9328-01EB907193AE}.Debug|ARM64.Build.0 = Debug|ARM64 {8DF78B53-200E-451F-9328-01EB907193AE}.Debug|x64.ActiveCfg = Debug|x64 {8DF78B53-200E-451F-9328-01EB907193AE}.Debug|x64.Build.0 = Debug|x64 - {8DF78B53-200E-451F-9328-01EB907193AE}.Debug|x86.ActiveCfg = Debug|x64 {8DF78B53-200E-451F-9328-01EB907193AE}.Release|ARM64.ActiveCfg = Release|ARM64 {8DF78B53-200E-451F-9328-01EB907193AE}.Release|ARM64.Build.0 = Release|ARM64 {8DF78B53-200E-451F-9328-01EB907193AE}.Release|x64.ActiveCfg = Release|x64 {8DF78B53-200E-451F-9328-01EB907193AE}.Release|x64.Build.0 = Release|x64 - {8DF78B53-200E-451F-9328-01EB907193AE}.Release|x86.ActiveCfg = Release|x64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Debug|ARM64.ActiveCfg = Debug|ARM64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Debug|ARM64.Build.0 = Debug|ARM64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Debug|x64.ActiveCfg = Debug|x64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Debug|x64.Build.0 = Debug|x64 - {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Debug|x86.ActiveCfg = Debug|x64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Release|ARM64.ActiveCfg = Release|ARM64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Release|ARM64.Build.0 = Release|ARM64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Release|x64.ActiveCfg = Release|x64 {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Release|x64.Build.0 = Release|x64 - {23D2070D-E4AD-4ADD-85A7-083D9C76AD49}.Release|x86.ActiveCfg = Release|x64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|ARM64.ActiveCfg = Debug|ARM64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|ARM64.Build.0 = Debug|ARM64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|x64.ActiveCfg = Debug|x64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|x64.Build.0 = Debug|x64 - {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Debug|x86.ActiveCfg = Debug|x64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|ARM64.ActiveCfg = Release|ARM64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|ARM64.Build.0 = Release|ARM64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|x64.ActiveCfg = Release|x64 {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|x64.Build.0 = Release|x64 - {62173D9A-6724-4C00-A1C8-FB646480A9EC}.Release|x86.ActiveCfg = Release|x64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Debug|ARM64.Build.0 = Debug|ARM64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Debug|x64.ActiveCfg = Debug|x64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Debug|x64.Build.0 = Debug|x64 - {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Debug|x86.ActiveCfg = Debug|x64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Release|ARM64.ActiveCfg = Release|ARM64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Release|ARM64.Build.0 = Release|ARM64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Release|x64.ActiveCfg = Release|x64 {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Release|x64.Build.0 = Release|x64 - {5E7360A8-D048-4ED3-8F09-0BFD64C5529A}.Release|x86.ActiveCfg = Release|x64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Debug|ARM64.Build.0 = Debug|ARM64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Debug|x64.ActiveCfg = Debug|x64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Debug|x64.Build.0 = Debug|x64 - {D940E07F-532C-4FF3-883F-790DA014F19A}.Debug|x86.ActiveCfg = Debug|x64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Release|ARM64.ActiveCfg = Release|ARM64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Release|ARM64.Build.0 = Release|ARM64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Release|x64.ActiveCfg = Release|x64 {D940E07F-532C-4FF3-883F-790DA014F19A}.Release|x64.Build.0 = Release|x64 - {D940E07F-532C-4FF3-883F-790DA014F19A}.Release|x86.ActiveCfg = Release|x64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Debug|ARM64.ActiveCfg = Debug|ARM64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Debug|ARM64.Build.0 = Debug|ARM64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Debug|x64.ActiveCfg = Debug|x64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Debug|x64.Build.0 = Debug|x64 - {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Debug|x86.ActiveCfg = Debug|x64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Release|ARM64.ActiveCfg = Release|ARM64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Release|ARM64.Build.0 = Release|ARM64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Release|x64.ActiveCfg = Release|x64 {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Release|x64.Build.0 = Release|x64 - {BB23A474-5058-4F75-8FA3-5FE3DE53CDF4}.Release|x86.ActiveCfg = Release|x64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Debug|ARM64.Build.0 = Debug|ARM64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Debug|x64.ActiveCfg = Debug|x64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Debug|x64.Build.0 = Debug|x64 - {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Debug|x86.ActiveCfg = Debug|x64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Release|ARM64.ActiveCfg = Release|ARM64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Release|ARM64.Build.0 = Release|ARM64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Release|x64.ActiveCfg = Release|x64 {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Release|x64.Build.0 = Release|x64 - {3E424AD2-19E5-4AE6-B833-F53963EB5FC1}.Release|x86.ActiveCfg = Release|x64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Debug|ARM64.Build.0 = Debug|ARM64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Debug|x64.ActiveCfg = Debug|x64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Debug|x64.Build.0 = Debug|x64 - {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Debug|x86.ActiveCfg = Debug|x64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|ARM64.ActiveCfg = Release|ARM64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|ARM64.Build.0 = Release|ARM64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|x64.ActiveCfg = Release|x64 {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|x64.Build.0 = Release|x64 - {2D604C07-51FC-46BB-9EB7-75AECC7F5E81}.Release|x86.ActiveCfg = Release|x64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|ARM64.Build.0 = Debug|ARM64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|x64.ActiveCfg = Debug|x64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|x64.Build.0 = Debug|x64 - {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Debug|x86.ActiveCfg = Debug|x64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|ARM64.ActiveCfg = Release|ARM64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|ARM64.Build.0 = Release|ARM64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|x64.ActiveCfg = Release|x64 {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|x64.Build.0 = Release|x64 - {2EDB3EB4-FA92-4BFF-B2D8-566584837231}.Release|x86.ActiveCfg = Release|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|ARM64.ActiveCfg = Debug|ARM64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|ARM64.Build.0 = Debug|ARM64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.ActiveCfg = Debug|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x64.Build.0 = Debug|x64 - {48804216-2A0E-4168-A6D8-9CD068D14227}.Debug|x86.ActiveCfg = Debug|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|ARM64.ActiveCfg = Release|ARM64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|ARM64.Build.0 = Release|ARM64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x64.ActiveCfg = Release|x64 {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x64.Build.0 = Release|x64 - {48804216-2A0E-4168-A6D8-9CD068D14227}.Release|x86.ActiveCfg = Release|x64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Debug|ARM64.Build.0 = Debug|ARM64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Debug|x64.ActiveCfg = Debug|x64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Debug|x64.Build.0 = Debug|x64 - {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Debug|x86.ActiveCfg = Debug|x64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Release|ARM64.ActiveCfg = Release|ARM64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Release|ARM64.Build.0 = Release|ARM64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Release|x64.ActiveCfg = Release|x64 {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Release|x64.Build.0 = Release|x64 - {FF1D7936-842A-4BBB-8BEA-E9FE796DE700}.Release|x86.ActiveCfg = Release|x64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Debug|ARM64.ActiveCfg = Debug|ARM64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Debug|ARM64.Build.0 = Debug|ARM64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Debug|x64.ActiveCfg = Debug|x64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Debug|x64.Build.0 = Debug|x64 - {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Debug|x86.ActiveCfg = Debug|x64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Release|ARM64.ActiveCfg = Release|ARM64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Release|ARM64.Build.0 = Release|ARM64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Release|x64.ActiveCfg = Release|x64 {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Release|x64.Build.0 = Release|x64 - {44CE9AE1-4390-42C5-BACC-0FD6B40AA203}.Release|x86.ActiveCfg = Release|x64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|ARM64.Build.0 = Debug|ARM64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x64.ActiveCfg = Debug|x64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x64.Build.0 = Debug|x64 - {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Debug|x86.ActiveCfg = Debug|x64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|ARM64.ActiveCfg = Release|ARM64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|ARM64.Build.0 = Release|ARM64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x64.ActiveCfg = Release|x64 @@ -1586,1240 +1423,854 @@ Global {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|ARM64.Build.0 = Debug|ARM64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|x64.ActiveCfg = Debug|x64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|x64.Build.0 = Debug|x64 - {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|x86.ActiveCfg = Debug|x64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Release|ARM64.ActiveCfg = Release|ARM64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Release|ARM64.Build.0 = Release|ARM64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Release|x64.ActiveCfg = Release|x64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Release|x64.Build.0 = Release|x64 - {11491FD8-F921-48BF-880C-7FEA185B80A1}.Release|x86.ActiveCfg = Release|x64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Debug|ARM64.Build.0 = Debug|ARM64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Debug|x64.ActiveCfg = Debug|x64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Debug|x64.Build.0 = Debug|x64 - {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Debug|x86.ActiveCfg = Debug|x64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Release|ARM64.ActiveCfg = Release|ARM64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Release|ARM64.Build.0 = Release|ARM64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Release|x64.ActiveCfg = Release|x64 {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Release|x64.Build.0 = Release|x64 - {F40C3397-1834-4530-B2D9-8F8B8456BCDF}.Release|x86.ActiveCfg = Release|x64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Debug|ARM64.Build.0 = Debug|ARM64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Debug|x64.ActiveCfg = Debug|x64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Debug|x64.Build.0 = Debug|x64 - {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Debug|x86.ActiveCfg = Debug|x64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Release|ARM64.ActiveCfg = Release|ARM64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Release|ARM64.Build.0 = Release|ARM64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Release|x64.ActiveCfg = Release|x64 {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Release|x64.Build.0 = Release|x64 - {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85}.Release|x86.ActiveCfg = Release|x64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Debug|ARM64.Build.0 = Debug|ARM64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Debug|x64.ActiveCfg = Debug|x64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Debug|x64.Build.0 = Debug|x64 - {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Debug|x86.ActiveCfg = Debug|x64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Release|ARM64.ActiveCfg = Release|ARM64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Release|ARM64.Build.0 = Release|ARM64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Release|x64.ActiveCfg = Release|x64 {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Release|x64.Build.0 = Release|x64 - {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Release|x86.ActiveCfg = Release|x64 - {4ED320BC-BA04-4D42-8D15-CBE62151F08B}.Release|x86.Build.0 = Release|x64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Debug|ARM64.Build.0 = Debug|ARM64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Debug|x64.ActiveCfg = Debug|x64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Debug|x64.Build.0 = Debug|x64 - {E94FD11C-0591-456F-899F-EFC0CA548336}.Debug|x86.ActiveCfg = Debug|x64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Release|ARM64.ActiveCfg = Release|ARM64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Release|ARM64.Build.0 = Release|ARM64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Release|x64.ActiveCfg = Release|x64 {E94FD11C-0591-456F-899F-EFC0CA548336}.Release|x64.Build.0 = Release|x64 - {E94FD11C-0591-456F-899F-EFC0CA548336}.Release|x86.ActiveCfg = Release|x64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Debug|ARM64.ActiveCfg = Debug|ARM64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Debug|ARM64.Build.0 = Debug|ARM64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Debug|x64.ActiveCfg = Debug|x64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Debug|x64.Build.0 = Debug|x64 - {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Debug|x86.ActiveCfg = Debug|x64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Release|ARM64.ActiveCfg = Release|ARM64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Release|ARM64.Build.0 = Release|ARM64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Release|x64.ActiveCfg = Release|x64 {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Release|x64.Build.0 = Release|x64 - {782A61BE-9D85-4081-B35C-1CCC9DCC1E88}.Release|x86.ActiveCfg = Release|x64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Debug|ARM64.Build.0 = Debug|ARM64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Debug|x64.ActiveCfg = Debug|x64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Debug|x64.Build.0 = Debug|x64 - {809AA252-E17A-4FA2-B0A1-0450976B763F}.Debug|x86.ActiveCfg = Debug|x64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Release|ARM64.ActiveCfg = Release|ARM64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Release|ARM64.Build.0 = Release|ARM64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Release|x64.ActiveCfg = Release|x64 {809AA252-E17A-4FA2-B0A1-0450976B763F}.Release|x64.Build.0 = Release|x64 - {809AA252-E17A-4FA2-B0A1-0450976B763F}.Release|x86.ActiveCfg = Release|x64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Debug|ARM64.Build.0 = Debug|ARM64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Debug|x64.ActiveCfg = Debug|x64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Debug|x64.Build.0 = Debug|x64 - {133281D8-1BCE-4D07-B31E-796612A9609E}.Debug|x86.ActiveCfg = Debug|x64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Release|ARM64.ActiveCfg = Release|ARM64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Release|ARM64.Build.0 = Release|ARM64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Release|x64.ActiveCfg = Release|x64 {133281D8-1BCE-4D07-B31E-796612A9609E}.Release|x64.Build.0 = Release|x64 - {133281D8-1BCE-4D07-B31E-796612A9609E}.Release|x86.ActiveCfg = Release|x64 {805306FF-A562-4415-8DEF-E493BDC45918}.Debug|ARM64.ActiveCfg = Debug|ARM64 {805306FF-A562-4415-8DEF-E493BDC45918}.Debug|ARM64.Build.0 = Debug|ARM64 {805306FF-A562-4415-8DEF-E493BDC45918}.Debug|x64.ActiveCfg = Debug|x64 {805306FF-A562-4415-8DEF-E493BDC45918}.Debug|x64.Build.0 = Debug|x64 - {805306FF-A562-4415-8DEF-E493BDC45918}.Debug|x86.ActiveCfg = Debug|x64 {805306FF-A562-4415-8DEF-E493BDC45918}.Release|ARM64.ActiveCfg = Release|ARM64 {805306FF-A562-4415-8DEF-E493BDC45918}.Release|ARM64.Build.0 = Release|ARM64 {805306FF-A562-4415-8DEF-E493BDC45918}.Release|x64.ActiveCfg = Release|x64 {805306FF-A562-4415-8DEF-E493BDC45918}.Release|x64.Build.0 = Release|x64 - {805306FF-A562-4415-8DEF-E493BDC45918}.Release|x86.ActiveCfg = Release|x64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Debug|ARM64.Build.0 = Debug|ARM64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Debug|x64.ActiveCfg = Debug|x64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Debug|x64.Build.0 = Debug|x64 - {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Debug|x86.ActiveCfg = Debug|x64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Release|ARM64.ActiveCfg = Release|ARM64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Release|ARM64.Build.0 = Release|ARM64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Release|x64.ActiveCfg = Release|x64 {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Release|x64.Build.0 = Release|x64 - {FCF3E52D-B80A-4FC3-98FD-6391354F0EE3}.Release|x86.ActiveCfg = Release|x64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Debug|ARM64.Build.0 = Debug|ARM64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Debug|x64.ActiveCfg = Debug|x64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Debug|x64.Build.0 = Debug|x64 - {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Debug|x86.ActiveCfg = Debug|x64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Release|ARM64.ActiveCfg = Release|ARM64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Release|ARM64.Build.0 = Release|ARM64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Release|x64.ActiveCfg = Release|x64 {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Release|x64.Build.0 = Release|x64 - {1DC3BE92-CE89-43FB-8110-9C043A2FE7A2}.Release|x86.ActiveCfg = Release|x64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Debug|ARM64.ActiveCfg = Debug|ARM64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Debug|ARM64.Build.0 = Debug|ARM64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Debug|x64.ActiveCfg = Debug|x64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Debug|x64.Build.0 = Debug|x64 - {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Debug|x86.ActiveCfg = Debug|x64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Release|ARM64.ActiveCfg = Release|ARM64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Release|ARM64.Build.0 = Release|ARM64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Release|x64.ActiveCfg = Release|x64 {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Release|x64.Build.0 = Release|x64 - {48A0A19E-A0BE-4256-ACF8-CC3B80291AF9}.Release|x86.ActiveCfg = Release|x64 {9F94B303-5E21-4364-9362-64426F8DB932}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9F94B303-5E21-4364-9362-64426F8DB932}.Debug|ARM64.Build.0 = Debug|ARM64 {9F94B303-5E21-4364-9362-64426F8DB932}.Debug|x64.ActiveCfg = Debug|x64 {9F94B303-5E21-4364-9362-64426F8DB932}.Debug|x64.Build.0 = Debug|x64 - {9F94B303-5E21-4364-9362-64426F8DB932}.Debug|x86.ActiveCfg = Debug|x64 {9F94B303-5E21-4364-9362-64426F8DB932}.Release|ARM64.ActiveCfg = Release|ARM64 {9F94B303-5E21-4364-9362-64426F8DB932}.Release|ARM64.Build.0 = Release|ARM64 {9F94B303-5E21-4364-9362-64426F8DB932}.Release|x64.ActiveCfg = Release|x64 {9F94B303-5E21-4364-9362-64426F8DB932}.Release|x64.Build.0 = Release|x64 - {9F94B303-5E21-4364-9362-64426F8DB932}.Release|x86.ActiveCfg = Release|x64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Debug|ARM64.ActiveCfg = Debug|ARM64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Debug|ARM64.Build.0 = Debug|ARM64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Debug|x64.ActiveCfg = Debug|x64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Debug|x64.Build.0 = Debug|x64 - {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Debug|x86.ActiveCfg = Debug|x64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Release|ARM64.ActiveCfg = Release|ARM64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Release|ARM64.Build.0 = Release|ARM64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Release|x64.ActiveCfg = Release|x64 {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Release|x64.Build.0 = Release|x64 - {EAE14C0E-7A6B-45DA-9080-A7D8C077BA6E}.Release|x86.ActiveCfg = Release|x64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Debug|ARM64.Build.0 = Debug|ARM64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Debug|x64.ActiveCfg = Debug|x64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Debug|x64.Build.0 = Debug|x64 - {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Debug|x86.ActiveCfg = Debug|x64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Release|ARM64.ActiveCfg = Release|ARM64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Release|ARM64.Build.0 = Release|ARM64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Release|x64.ActiveCfg = Release|x64 {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Release|x64.Build.0 = Release|x64 - {F7C8C0F1-5431-4347-89D0-8E5354F93CF2}.Release|x86.ActiveCfg = Release|x64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Debug|ARM64.Build.0 = Debug|ARM64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Debug|x64.ActiveCfg = Debug|x64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Debug|x64.Build.0 = Debug|x64 - {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Debug|x86.ActiveCfg = Debug|x64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Release|ARM64.ActiveCfg = Release|ARM64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Release|ARM64.Build.0 = Release|ARM64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Release|x64.ActiveCfg = Release|x64 {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Release|x64.Build.0 = Release|x64 - {F1F6B6B6-9F18-4A17-8B5C-97DF552C53DC}.Release|x86.ActiveCfg = Release|x64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Debug|ARM64.Build.0 = Debug|ARM64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Debug|x64.ActiveCfg = Debug|x64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Debug|x64.Build.0 = Debug|x64 - {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Debug|x86.ActiveCfg = Debug|x64 - {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Debug|x86.Build.0 = Debug|x64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Release|ARM64.ActiveCfg = Release|ARM64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Release|ARM64.Build.0 = Release|ARM64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Release|x64.ActiveCfg = Release|x64 {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Release|x64.Build.0 = Release|x64 - {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Release|x86.ActiveCfg = Release|x64 - {04B193D7-3E21-46B8-A958-89B63A8A69DE}.Release|x86.Build.0 = Release|x64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|ARM64.Build.0 = Debug|ARM64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|x64.ActiveCfg = Debug|x64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|x64.Build.0 = Debug|x64 - {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Debug|x86.ActiveCfg = Debug|x64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|ARM64.ActiveCfg = Release|ARM64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|ARM64.Build.0 = Release|ARM64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x64.ActiveCfg = Release|x64 {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x64.Build.0 = Release|x64 - {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x86.ActiveCfg = Release|x64 - {5BDBD6C9-A31F-4CEB-871A-5E9E709197EF}.Release|x86.Build.0 = Release|x64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|ARM64.Build.0 = Debug|ARM64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x64.ActiveCfg = Debug|x64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x64.Build.0 = Debug|x64 - {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x86.ActiveCfg = Debug|x64 - {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Debug|x86.Build.0 = Debug|x64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|ARM64.ActiveCfg = Release|ARM64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|ARM64.Build.0 = Release|ARM64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x64.ActiveCfg = Release|x64 {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x64.Build.0 = Release|x64 - {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x86.ActiveCfg = Release|x64 - {FD464B4C-2F68-4D06-91E7-4208146C41F5}.Release|x86.Build.0 = Release|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|ARM64.Build.0 = Debug|ARM64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x64.ActiveCfg = Debug|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x64.Build.0 = Debug|x64 - {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x86.ActiveCfg = Debug|x64 - {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Debug|x86.Build.0 = Debug|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Release|ARM64.ActiveCfg = Release|ARM64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Release|ARM64.Build.0 = Release|ARM64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Release|x64.ActiveCfg = Release|x64 {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Release|x64.Build.0 = Release|x64 - {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Release|x86.ActiveCfg = Release|x64 - {8FE5A5EE-1B59-401C-9FB3-B04ECD3E29C1}.Release|x86.Build.0 = Release|x64 {020A7474-3601-4160-A159-D7B70B77B15F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {020A7474-3601-4160-A159-D7B70B77B15F}.Debug|ARM64.Build.0 = Debug|ARM64 {020A7474-3601-4160-A159-D7B70B77B15F}.Debug|x64.ActiveCfg = Debug|x64 {020A7474-3601-4160-A159-D7B70B77B15F}.Debug|x64.Build.0 = Debug|x64 - {020A7474-3601-4160-A159-D7B70B77B15F}.Debug|x86.ActiveCfg = Debug|x64 - {020A7474-3601-4160-A159-D7B70B77B15F}.Debug|x86.Build.0 = Debug|x64 {020A7474-3601-4160-A159-D7B70B77B15F}.Release|ARM64.ActiveCfg = Release|ARM64 {020A7474-3601-4160-A159-D7B70B77B15F}.Release|ARM64.Build.0 = Release|ARM64 {020A7474-3601-4160-A159-D7B70B77B15F}.Release|x64.ActiveCfg = Release|x64 {020A7474-3601-4160-A159-D7B70B77B15F}.Release|x64.Build.0 = Release|x64 - {020A7474-3601-4160-A159-D7B70B77B15F}.Release|x86.ActiveCfg = Release|x64 - {020A7474-3601-4160-A159-D7B70B77B15F}.Release|x86.Build.0 = Release|x64 {27718999-C175-450A-861C-89F911E16A88}.Debug|ARM64.ActiveCfg = Debug|ARM64 {27718999-C175-450A-861C-89F911E16A88}.Debug|ARM64.Build.0 = Debug|ARM64 {27718999-C175-450A-861C-89F911E16A88}.Debug|x64.ActiveCfg = Debug|x64 {27718999-C175-450A-861C-89F911E16A88}.Debug|x64.Build.0 = Debug|x64 - {27718999-C175-450A-861C-89F911E16A88}.Debug|x86.ActiveCfg = Debug|x64 - {27718999-C175-450A-861C-89F911E16A88}.Debug|x86.Build.0 = Debug|x64 {27718999-C175-450A-861C-89F911E16A88}.Release|ARM64.ActiveCfg = Release|ARM64 {27718999-C175-450A-861C-89F911E16A88}.Release|ARM64.Build.0 = Release|ARM64 {27718999-C175-450A-861C-89F911E16A88}.Release|x64.ActiveCfg = Release|x64 {27718999-C175-450A-861C-89F911E16A88}.Release|x64.Build.0 = Release|x64 - {27718999-C175-450A-861C-89F911E16A88}.Release|x86.ActiveCfg = Release|x64 - {27718999-C175-450A-861C-89F911E16A88}.Release|x86.Build.0 = Release|x64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|ARM64.Build.0 = Debug|ARM64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x64.ActiveCfg = Debug|x64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x64.Build.0 = Debug|x64 - {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x86.ActiveCfg = Debug|x64 - {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Debug|x86.Build.0 = Debug|x64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|ARM64.ActiveCfg = Release|ARM64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|ARM64.Build.0 = Release|ARM64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x64.ActiveCfg = Release|x64 {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x64.Build.0 = Release|x64 - {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x86.ActiveCfg = Release|x64 - {1DBBB112-4BB1-444B-8EBB-E66555C76BA6}.Release|x86.Build.0 = Release|x64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Debug|ARM64.Build.0 = Debug|ARM64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Debug|x64.ActiveCfg = Debug|x64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Debug|x64.Build.0 = Debug|x64 - {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Debug|x86.ActiveCfg = Debug|x64 - {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Debug|x86.Build.0 = Debug|x64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|ARM64.ActiveCfg = Release|ARM64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|ARM64.Build.0 = Release|ARM64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x64.ActiveCfg = Release|x64 {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x64.Build.0 = Release|x64 - {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x86.ActiveCfg = Release|x64 - {5A1DB2F0-0715-4B3B-98E6-79BC41540045}.Release|x86.Build.0 = Release|x64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|ARM64.Build.0 = Debug|ARM64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x64.ActiveCfg = Debug|x64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x64.Build.0 = Debug|x64 - {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x86.ActiveCfg = Debug|x64 - {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Debug|x86.Build.0 = Debug|x64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|ARM64.ActiveCfg = Release|ARM64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|ARM64.Build.0 = Release|ARM64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x64.ActiveCfg = Release|x64 {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x64.Build.0 = Release|x64 - {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x86.ActiveCfg = Release|x64 - {93B72A06-C8BD-484F-A6F7-C9F280B150BF}.Release|x86.Build.0 = Release|x64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|ARM64.ActiveCfg = Debug|ARM64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|ARM64.Build.0 = Debug|ARM64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x64.ActiveCfg = Debug|x64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x64.Build.0 = Debug|x64 - {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x86.ActiveCfg = Debug|x64 - {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Debug|x86.Build.0 = Debug|x64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|ARM64.ActiveCfg = Release|ARM64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|ARM64.Build.0 = Release|ARM64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x64.ActiveCfg = Release|x64 {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x64.Build.0 = Release|x64 - {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x86.ActiveCfg = Release|x64 - {18B3DB45-4FFE-4D01-97D6-5223FEEE1853}.Release|x86.Build.0 = Release|x64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|ARM64.ActiveCfg = Debug|ARM64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|ARM64.Build.0 = Debug|ARM64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|x64.ActiveCfg = Debug|x64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|x64.Build.0 = Debug|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|x86.ActiveCfg = Debug|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Debug|x86.Build.0 = Debug|x64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|ARM64.ActiveCfg = Release|ARM64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|ARM64.Build.0 = Release|ARM64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|x64.ActiveCfg = Release|x64 {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|x64.Build.0 = Release|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|x86.ActiveCfg = Release|x64 - {34A354C5-23C7-4343-916C-C52DAF4FC39D}.Release|x86.Build.0 = Release|x64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|ARM64.Build.0 = Debug|ARM64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|x64.ActiveCfg = Debug|x64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|x64.Build.0 = Debug|x64 - {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|x86.ActiveCfg = Debug|x64 - {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Debug|x86.Build.0 = Debug|x64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Release|ARM64.ActiveCfg = Release|ARM64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Release|ARM64.Build.0 = Release|ARM64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Release|x64.ActiveCfg = Release|x64 {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Release|x64.Build.0 = Release|x64 - {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Release|x86.ActiveCfg = Release|x64 - {3264DF53-C805-4B0C-867C-FCEAF7AEF762}.Release|x86.Build.0 = Release|x64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Debug|ARM64.ActiveCfg = Debug|ARM64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Debug|ARM64.Build.0 = Debug|ARM64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Debug|x64.ActiveCfg = Debug|x64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Debug|x64.Build.0 = Debug|x64 - {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Debug|x86.ActiveCfg = Debug|x64 - {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Debug|x86.Build.0 = Debug|x64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Release|ARM64.ActiveCfg = Release|ARM64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Release|ARM64.Build.0 = Release|ARM64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Release|x64.ActiveCfg = Release|x64 {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Release|x64.Build.0 = Release|x64 - {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Release|x86.ActiveCfg = Release|x64 - {31CAD28E-778A-441C-85BC-40AB3EAA2A10}.Release|x86.Build.0 = Release|x64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Debug|ARM64.ActiveCfg = Debug|ARM64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Debug|ARM64.Build.0 = Debug|ARM64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Debug|x64.ActiveCfg = Debug|x64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Debug|x64.Build.0 = Debug|x64 - {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Debug|x86.ActiveCfg = Debug|x64 - {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Debug|x86.Build.0 = Debug|x64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Release|ARM64.ActiveCfg = Release|ARM64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Release|ARM64.Build.0 = Release|ARM64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Release|x64.ActiveCfg = Release|x64 {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Release|x64.Build.0 = Release|x64 - {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Release|x86.ActiveCfg = Release|x64 - {25C91A4E-BA4E-467A-85CD-8B62545BF674}.Release|x86.Build.0 = Release|x64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Debug|ARM64.Build.0 = Debug|ARM64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Debug|x64.ActiveCfg = Debug|x64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Debug|x64.Build.0 = Debug|x64 - {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Debug|x86.ActiveCfg = Debug|x64 - {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Debug|x86.Build.0 = Debug|x64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Release|ARM64.ActiveCfg = Release|ARM64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Release|ARM64.Build.0 = Release|ARM64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Release|x64.ActiveCfg = Release|x64 {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Release|x64.Build.0 = Release|x64 - {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Release|x86.ActiveCfg = Release|x64 - {6AB6A2D6-F859-4A82-9184-0BD29C9F07D1}.Release|x86.Build.0 = Release|x64 {212AD910-8488-4036-BE20-326931B75FB2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {212AD910-8488-4036-BE20-326931B75FB2}.Debug|ARM64.Build.0 = Debug|ARM64 {212AD910-8488-4036-BE20-326931B75FB2}.Debug|x64.ActiveCfg = Debug|x64 {212AD910-8488-4036-BE20-326931B75FB2}.Debug|x64.Build.0 = Debug|x64 - {212AD910-8488-4036-BE20-326931B75FB2}.Debug|x86.ActiveCfg = Debug|x64 - {212AD910-8488-4036-BE20-326931B75FB2}.Debug|x86.Build.0 = Debug|x64 {212AD910-8488-4036-BE20-326931B75FB2}.Release|ARM64.ActiveCfg = Release|ARM64 {212AD910-8488-4036-BE20-326931B75FB2}.Release|ARM64.Build.0 = Release|ARM64 {212AD910-8488-4036-BE20-326931B75FB2}.Release|x64.ActiveCfg = Release|x64 {212AD910-8488-4036-BE20-326931B75FB2}.Release|x64.Build.0 = Release|x64 - {212AD910-8488-4036-BE20-326931B75FB2}.Release|x86.ActiveCfg = Release|x64 - {212AD910-8488-4036-BE20-326931B75FB2}.Release|x86.Build.0 = Release|x64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Debug|ARM64.Build.0 = Debug|ARM64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Debug|x64.ActiveCfg = Debug|x64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Debug|x64.Build.0 = Debug|x64 - {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Debug|x86.ActiveCfg = Debug|x64 - {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Debug|x86.Build.0 = Debug|x64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Release|ARM64.ActiveCfg = Release|ARM64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Release|ARM64.Build.0 = Release|ARM64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Release|x64.ActiveCfg = Release|x64 {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Release|x64.Build.0 = Release|x64 - {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Release|x86.ActiveCfg = Release|x64 - {54A93AF7-60C7-4F6C-99D2-FBB1F75F853A}.Release|x86.Build.0 = Release|x64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Debug|ARM64.Build.0 = Debug|ARM64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Debug|x64.ActiveCfg = Debug|x64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Debug|x64.Build.0 = Debug|x64 - {92C39820-9F84-4529-BC7D-22AAE514D63B}.Debug|x86.ActiveCfg = Debug|x64 - {92C39820-9F84-4529-BC7D-22AAE514D63B}.Debug|x86.Build.0 = Debug|x64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Release|ARM64.ActiveCfg = Release|ARM64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Release|ARM64.Build.0 = Release|ARM64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Release|x64.ActiveCfg = Release|x64 {92C39820-9F84-4529-BC7D-22AAE514D63B}.Release|x64.Build.0 = Release|x64 - {92C39820-9F84-4529-BC7D-22AAE514D63B}.Release|x86.ActiveCfg = Release|x64 - {92C39820-9F84-4529-BC7D-22AAE514D63B}.Release|x86.Build.0 = Release|x64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Debug|ARM64.ActiveCfg = Debug|ARM64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Debug|ARM64.Build.0 = Debug|ARM64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Debug|x64.ActiveCfg = Debug|x64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Debug|x64.Build.0 = Debug|x64 - {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Debug|x86.ActiveCfg = Debug|x64 - {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Debug|x86.Build.0 = Debug|x64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Release|ARM64.ActiveCfg = Release|ARM64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Release|ARM64.Build.0 = Release|ARM64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Release|x64.ActiveCfg = Release|x64 {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Release|x64.Build.0 = Release|x64 - {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Release|x86.ActiveCfg = Release|x64 - {515554D1-D004-4F7F-A107-2211FC0F6B2C}.Release|x86.Build.0 = Release|x64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Debug|ARM64.Build.0 = Debug|ARM64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Debug|x64.ActiveCfg = Debug|x64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Debug|x64.Build.0 = Debug|x64 - {C97D9A5D-206C-454E-997E-009E227D7F02}.Debug|x86.ActiveCfg = Debug|x64 - {C97D9A5D-206C-454E-997E-009E227D7F02}.Debug|x86.Build.0 = Debug|x64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Release|ARM64.ActiveCfg = Release|ARM64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Release|ARM64.Build.0 = Release|ARM64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Release|x64.ActiveCfg = Release|x64 {C97D9A5D-206C-454E-997E-009E227D7F02}.Release|x64.Build.0 = Release|x64 - {C97D9A5D-206C-454E-997E-009E227D7F02}.Release|x86.ActiveCfg = Release|x64 - {C97D9A5D-206C-454E-997E-009E227D7F02}.Release|x86.Build.0 = Release|x64 {31D1C81D-765F-4446-AA62-E743F6325049}.Debug|ARM64.ActiveCfg = Debug|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Debug|ARM64.Build.0 = Debug|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Debug|x64.ActiveCfg = Debug|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Debug|x64.Build.0 = Debug|Any CPU - {31D1C81D-765F-4446-AA62-E743F6325049}.Debug|x86.ActiveCfg = Debug|Any CPU - {31D1C81D-765F-4446-AA62-E743F6325049}.Debug|x86.Build.0 = Debug|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Release|ARM64.ActiveCfg = Release|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Release|ARM64.Build.0 = Release|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Release|x64.ActiveCfg = Release|Any CPU {31D1C81D-765F-4446-AA62-E743F6325049}.Release|x64.Build.0 = Release|Any CPU - {31D1C81D-765F-4446-AA62-E743F6325049}.Release|x86.ActiveCfg = Release|Any CPU - {31D1C81D-765F-4446-AA62-E743F6325049}.Release|x86.Build.0 = Release|Any CPU {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Debug|ARM64.Build.0 = Debug|ARM64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Debug|x64.ActiveCfg = Debug|x64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Debug|x64.Build.0 = Debug|x64 - {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Debug|x86.ActiveCfg = Debug|x64 - {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Debug|x86.Build.0 = Debug|x64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Release|ARM64.ActiveCfg = Release|ARM64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Release|ARM64.Build.0 = Release|ARM64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Release|x64.ActiveCfg = Release|x64 {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Release|x64.Build.0 = Release|x64 - {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Release|x86.ActiveCfg = Release|x64 - {E2D03E0F-7A75-4813-9F4B-D8763D43FD3A}.Release|x86.Build.0 = Release|x64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Debug|ARM64.Build.0 = Debug|ARM64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Debug|x64.ActiveCfg = Debug|x64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Debug|x64.Build.0 = Debug|x64 - {B41B888C-7DB8-4747-B262-4062E05A230D}.Debug|x86.ActiveCfg = Debug|x64 - {B41B888C-7DB8-4747-B262-4062E05A230D}.Debug|x86.Build.0 = Debug|x64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Release|ARM64.ActiveCfg = Release|ARM64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Release|ARM64.Build.0 = Release|ARM64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Release|x64.ActiveCfg = Release|x64 {B41B888C-7DB8-4747-B262-4062E05A230D}.Release|x64.Build.0 = Release|x64 - {B41B888C-7DB8-4747-B262-4062E05A230D}.Release|x86.ActiveCfg = Release|x64 - {B41B888C-7DB8-4747-B262-4062E05A230D}.Release|x86.Build.0 = Release|x64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Debug|ARM64.ActiveCfg = Debug|ARM64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Debug|ARM64.Build.0 = Debug|ARM64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Debug|x64.ActiveCfg = Debug|x64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Debug|x64.Build.0 = Debug|x64 - {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Debug|x86.ActiveCfg = Debug|x64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Release|ARM64.ActiveCfg = Release|ARM64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Release|ARM64.Build.0 = Release|ARM64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Release|x64.ActiveCfg = Release|x64 {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Release|x64.Build.0 = Release|x64 - {57175EC7-92A5-4C1E-8244-E3FBCA2A81DE}.Release|x86.ActiveCfg = Release|x64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Debug|ARM64.Build.0 = Debug|ARM64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Debug|x64.ActiveCfg = Debug|x64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Debug|x64.Build.0 = Debug|x64 - {E69B044A-2F8A-45AA-AD0B-256C59421807}.Debug|x86.ActiveCfg = Debug|x64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Release|ARM64.ActiveCfg = Release|ARM64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Release|ARM64.Build.0 = Release|ARM64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Release|x64.ActiveCfg = Release|x64 {E69B044A-2F8A-45AA-AD0B-256C59421807}.Release|x64.Build.0 = Release|x64 - {E69B044A-2F8A-45AA-AD0B-256C59421807}.Release|x86.ActiveCfg = Release|x64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Debug|ARM64.Build.0 = Debug|ARM64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Debug|x64.ActiveCfg = Debug|x64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Debug|x64.Build.0 = Debug|x64 - {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Debug|x86.ActiveCfg = Debug|x64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Release|ARM64.ActiveCfg = Release|ARM64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Release|ARM64.Build.0 = Release|ARM64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Release|x64.ActiveCfg = Release|x64 {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Release|x64.Build.0 = Release|x64 - {C604B37E-9D0E-4484-8778-E8B31B0E1B3A}.Release|x86.ActiveCfg = Release|x64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Debug|ARM64.ActiveCfg = Debug|ARM64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Debug|ARM64.Build.0 = Debug|ARM64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Debug|x64.ActiveCfg = Debug|x64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Debug|x64.Build.0 = Debug|x64 - {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Debug|x86.ActiveCfg = Debug|x64 - {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Debug|x86.Build.0 = Debug|x64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Release|ARM64.ActiveCfg = Release|ARM64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Release|ARM64.Build.0 = Release|ARM64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Release|x64.ActiveCfg = Release|x64 {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Release|x64.Build.0 = Release|x64 - {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Release|x86.ActiveCfg = Release|x64 - {E599C30B-9DC8-4E5A-BF27-93D4CCEDE788}.Release|x86.Build.0 = Release|x64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Debug|ARM64.ActiveCfg = Debug|ARM64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Debug|ARM64.Build.0 = Debug|ARM64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Debug|x64.ActiveCfg = Debug|x64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Debug|x64.Build.0 = Debug|x64 - {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Debug|x86.ActiveCfg = Debug|x64 - {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Debug|x86.Build.0 = Debug|x64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|ARM64.ActiveCfg = Release|ARM64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|ARM64.Build.0 = Release|ARM64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x64.ActiveCfg = Release|x64 {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x64.Build.0 = Release|x64 - {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x86.ActiveCfg = Release|x64 - {00EE9BA6-4E8F-43CA-960D-D4882F0FBB97}.Release|x86.Build.0 = Release|x64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|ARM64.Build.0 = Debug|ARM64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|x64.ActiveCfg = Debug|x64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|x64.Build.0 = Debug|x64 - {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|x86.ActiveCfg = Debug|x64 - {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Debug|x86.Build.0 = Debug|x64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Release|ARM64.ActiveCfg = Release|ARM64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Release|ARM64.Build.0 = Release|ARM64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Release|x64.ActiveCfg = Release|x64 {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Release|x64.Build.0 = Release|x64 - {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Release|x86.ActiveCfg = Release|x64 - {A1425B53-3D61-4679-8623-E64A0D3D0A48}.Release|x86.Build.0 = Release|x64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|ARM64.Build.0 = Debug|ARM64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|ARM64.Deploy.0 = Debug|ARM64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|x64.ActiveCfg = Debug|x64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|x64.Build.0 = Debug|x64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|x64.Deploy.0 = Debug|x64 - {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|x86.ActiveCfg = Debug|x86 - {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|x86.Build.0 = Debug|x86 - {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Debug|x86.Deploy.0 = Debug|x86 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|ARM64.ActiveCfg = Release|ARM64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|ARM64.Build.0 = Release|ARM64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|ARM64.Deploy.0 = Release|ARM64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|x64.ActiveCfg = Release|x64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|x64.Build.0 = Release|x64 {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|x64.Deploy.0 = Release|x64 - {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|x86.ActiveCfg = Release|x86 - {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|x86.Build.0 = Release|x86 - {9D7A6DE0-7D27-424D-ABAE-41B2161F9A03}.Release|x86.Deploy.0 = Release|x86 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Debug|ARM64.ActiveCfg = Debug|ARM64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Debug|ARM64.Build.0 = Debug|ARM64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Debug|x64.ActiveCfg = Debug|x64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Debug|x64.Build.0 = Debug|x64 - {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Debug|x86.ActiveCfg = Debug|x64 - {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Debug|x86.Build.0 = Debug|x64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Release|ARM64.ActiveCfg = Release|ARM64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Release|ARM64.Build.0 = Release|ARM64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Release|x64.ActiveCfg = Release|x64 {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Release|x64.Build.0 = Release|x64 - {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Release|x86.ActiveCfg = Release|x64 - {17A99C7C-0BFF-45BB-A9FD-63A0DDC105BB}.Release|x86.Build.0 = Release|x64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Debug|ARM64.ActiveCfg = Debug|ARM64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Debug|ARM64.Build.0 = Debug|ARM64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Debug|x64.ActiveCfg = Debug|x64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Debug|x64.Build.0 = Debug|x64 - {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Debug|x86.ActiveCfg = Debug|x64 - {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Debug|x86.Build.0 = Debug|x64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Release|ARM64.ActiveCfg = Release|ARM64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Release|ARM64.Build.0 = Release|ARM64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Release|x64.ActiveCfg = Release|x64 {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Release|x64.Build.0 = Release|x64 - {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Release|x86.ActiveCfg = Release|x64 - {AA9F0AF8-7924-4D59-BAA1-E36F1304E0DC}.Release|x86.Build.0 = Release|x64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Debug|ARM64.ActiveCfg = Debug|ARM64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Debug|ARM64.Build.0 = Debug|ARM64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Debug|x64.ActiveCfg = Debug|x64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Debug|x64.Build.0 = Debug|x64 - {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Debug|x86.ActiveCfg = Debug|x64 - {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Debug|x86.Build.0 = Debug|x64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Release|ARM64.ActiveCfg = Release|ARM64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Release|ARM64.Build.0 = Release|ARM64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Release|x64.ActiveCfg = Release|x64 {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Release|x64.Build.0 = Release|x64 - {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Release|x86.ActiveCfg = Release|x64 - {ED9A1AC6-AEB0-4569-A6E9-E1696182B545}.Release|x86.Build.0 = Release|x64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Debug|ARM64.ActiveCfg = Debug|ARM64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Debug|ARM64.Build.0 = Debug|ARM64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Debug|x64.ActiveCfg = Debug|x64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Debug|x64.Build.0 = Debug|x64 - {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Debug|x86.ActiveCfg = Debug|x64 - {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Debug|x86.Build.0 = Debug|x64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Release|ARM64.ActiveCfg = Release|ARM64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Release|ARM64.Build.0 = Release|ARM64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Release|x64.ActiveCfg = Release|x64 {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Release|x64.Build.0 = Release|x64 - {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Release|x86.ActiveCfg = Release|x64 - {5A5DD09D-723A-44D3-8F2B-293584C3D731}.Release|x86.Build.0 = Release|x64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Debug|ARM64.Build.0 = Debug|ARM64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Debug|x64.ActiveCfg = Debug|x64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Debug|x64.Build.0 = Debug|x64 - {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Debug|x86.ActiveCfg = Debug|x64 - {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Debug|x86.Build.0 = Debug|x64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Release|ARM64.ActiveCfg = Release|ARM64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Release|ARM64.Build.0 = Release|ARM64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Release|x64.ActiveCfg = Release|x64 {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Release|x64.Build.0 = Release|x64 - {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Release|x86.ActiveCfg = Release|x64 - {B3E869C4-8210-4EBD-A621-FF4C4AFCBFA9}.Release|x86.Build.0 = Release|x64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Debug|ARM64.ActiveCfg = Debug|ARM64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Debug|ARM64.Build.0 = Debug|ARM64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Debug|x64.ActiveCfg = Debug|x64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Debug|x64.Build.0 = Debug|x64 - {54F7C616-FD41-4E62-BFF9-015686914F4D}.Debug|x86.ActiveCfg = Debug|x64 - {54F7C616-FD41-4E62-BFF9-015686914F4D}.Debug|x86.Build.0 = Debug|x64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Release|ARM64.ActiveCfg = Release|ARM64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Release|ARM64.Build.0 = Release|ARM64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Release|x64.ActiveCfg = Release|x64 {54F7C616-FD41-4E62-BFF9-015686914F4D}.Release|x64.Build.0 = Release|x64 - {54F7C616-FD41-4E62-BFF9-015686914F4D}.Release|x86.ActiveCfg = Release|x64 - {54F7C616-FD41-4E62-BFF9-015686914F4D}.Release|x86.Build.0 = Release|x64 {143F13E3-D2E3-4D83-B035-356612D99956}.Debug|ARM64.ActiveCfg = Debug|ARM64 {143F13E3-D2E3-4D83-B035-356612D99956}.Debug|ARM64.Build.0 = Debug|ARM64 {143F13E3-D2E3-4D83-B035-356612D99956}.Debug|x64.ActiveCfg = Debug|x64 {143F13E3-D2E3-4D83-B035-356612D99956}.Debug|x64.Build.0 = Debug|x64 - {143F13E3-D2E3-4D83-B035-356612D99956}.Debug|x86.ActiveCfg = Debug|x64 - {143F13E3-D2E3-4D83-B035-356612D99956}.Debug|x86.Build.0 = Debug|x64 {143F13E3-D2E3-4D83-B035-356612D99956}.Release|ARM64.ActiveCfg = Release|ARM64 {143F13E3-D2E3-4D83-B035-356612D99956}.Release|ARM64.Build.0 = Release|ARM64 {143F13E3-D2E3-4D83-B035-356612D99956}.Release|x64.ActiveCfg = Release|x64 {143F13E3-D2E3-4D83-B035-356612D99956}.Release|x64.Build.0 = Release|x64 - {143F13E3-D2E3-4D83-B035-356612D99956}.Release|x86.ActiveCfg = Release|x64 - {143F13E3-D2E3-4D83-B035-356612D99956}.Release|x86.Build.0 = Release|x64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Debug|ARM64.ActiveCfg = Debug|ARM64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Debug|ARM64.Build.0 = Debug|ARM64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Debug|x64.ActiveCfg = Debug|x64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Debug|x64.Build.0 = Debug|x64 - {56CC2F10-6E41-453D-BE16-C593A5E58482}.Debug|x86.ActiveCfg = Debug|x64 - {56CC2F10-6E41-453D-BE16-C593A5E58482}.Debug|x86.Build.0 = Debug|x64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Release|ARM64.ActiveCfg = Release|ARM64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Release|ARM64.Build.0 = Release|ARM64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Release|x64.ActiveCfg = Release|x64 {56CC2F10-6E41-453D-BE16-C593A5E58482}.Release|x64.Build.0 = Release|x64 - {56CC2F10-6E41-453D-BE16-C593A5E58482}.Release|x86.ActiveCfg = Release|x64 - {56CC2F10-6E41-453D-BE16-C593A5E58482}.Release|x86.Build.0 = Release|x64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Debug|ARM64.ActiveCfg = Debug|ARM64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Debug|ARM64.Build.0 = Debug|ARM64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Debug|x64.ActiveCfg = Debug|x64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Debug|x64.Build.0 = Debug|x64 - {CA5518ED-0458-4B09-8F53-4122B9888655}.Debug|x86.ActiveCfg = Debug|x64 - {CA5518ED-0458-4B09-8F53-4122B9888655}.Debug|x86.Build.0 = Debug|x64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Release|ARM64.ActiveCfg = Release|ARM64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Release|ARM64.Build.0 = Release|ARM64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Release|x64.ActiveCfg = Release|x64 {CA5518ED-0458-4B09-8F53-4122B9888655}.Release|x64.Build.0 = Release|x64 - {CA5518ED-0458-4B09-8F53-4122B9888655}.Release|x86.ActiveCfg = Release|x64 - {CA5518ED-0458-4B09-8F53-4122B9888655}.Release|x86.Build.0 = Release|x64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Debug|ARM64.Build.0 = Debug|ARM64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Debug|x64.ActiveCfg = Debug|x64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Debug|x64.Build.0 = Debug|x64 - {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Debug|x86.ActiveCfg = Debug|x64 - {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Debug|x86.Build.0 = Debug|x64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Release|ARM64.ActiveCfg = Release|ARM64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Release|ARM64.Build.0 = Release|ARM64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Release|x64.ActiveCfg = Release|x64 {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Release|x64.Build.0 = Release|x64 - {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Release|x86.ActiveCfg = Release|x64 - {D6DCC3AE-18C0-488A-B978-BAA9E3CFF09D}.Release|x86.Build.0 = Release|x64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Debug|ARM64.Build.0 = Debug|ARM64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Debug|x64.ActiveCfg = Debug|x64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Debug|x64.Build.0 = Debug|x64 - {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Debug|x86.ActiveCfg = Debug|x64 - {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Debug|x86.Build.0 = Debug|x64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Release|ARM64.ActiveCfg = Release|ARM64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Release|ARM64.Build.0 = Release|ARM64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Release|x64.ActiveCfg = Release|x64 {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Release|x64.Build.0 = Release|x64 - {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Release|x86.ActiveCfg = Release|x64 - {2BBC9E33-21EC-401C-84DA-BB6590A9B2AA}.Release|x86.Build.0 = Release|x64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Debug|ARM64.Build.0 = Debug|ARM64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Debug|x64.ActiveCfg = Debug|x64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Debug|x64.Build.0 = Debug|x64 - {2833C9C6-AB32-4048-A5C7-A70898337B57}.Debug|x86.ActiveCfg = Debug|x64 - {2833C9C6-AB32-4048-A5C7-A70898337B57}.Debug|x86.Build.0 = Debug|x64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Release|ARM64.ActiveCfg = Release|ARM64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Release|ARM64.Build.0 = Release|ARM64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Release|x64.ActiveCfg = Release|x64 {2833C9C6-AB32-4048-A5C7-A70898337B57}.Release|x64.Build.0 = Release|x64 - {2833C9C6-AB32-4048-A5C7-A70898337B57}.Release|x86.ActiveCfg = Release|x64 - {2833C9C6-AB32-4048-A5C7-A70898337B57}.Release|x86.Build.0 = Release|x64 {50B82783-242F-42D2-BC03-B3430BF01354}.Debug|ARM64.ActiveCfg = Debug|ARM64 {50B82783-242F-42D2-BC03-B3430BF01354}.Debug|ARM64.Build.0 = Debug|ARM64 {50B82783-242F-42D2-BC03-B3430BF01354}.Debug|x64.ActiveCfg = Debug|x64 {50B82783-242F-42D2-BC03-B3430BF01354}.Debug|x64.Build.0 = Debug|x64 - {50B82783-242F-42D2-BC03-B3430BF01354}.Debug|x86.ActiveCfg = Debug|x64 - {50B82783-242F-42D2-BC03-B3430BF01354}.Debug|x86.Build.0 = Debug|x64 {50B82783-242F-42D2-BC03-B3430BF01354}.Release|ARM64.ActiveCfg = Release|ARM64 {50B82783-242F-42D2-BC03-B3430BF01354}.Release|ARM64.Build.0 = Release|ARM64 {50B82783-242F-42D2-BC03-B3430BF01354}.Release|x64.ActiveCfg = Release|x64 {50B82783-242F-42D2-BC03-B3430BF01354}.Release|x64.Build.0 = Release|x64 - {50B82783-242F-42D2-BC03-B3430BF01354}.Release|x86.ActiveCfg = Release|x64 - {50B82783-242F-42D2-BC03-B3430BF01354}.Release|x86.Build.0 = Release|x64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Debug|ARM64.Build.0 = Debug|ARM64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Debug|x64.ActiveCfg = Debug|x64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Debug|x64.Build.0 = Debug|x64 - {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Debug|x86.ActiveCfg = Debug|x64 - {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Debug|x86.Build.0 = Debug|x64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Release|ARM64.ActiveCfg = Release|ARM64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Release|ARM64.Build.0 = Release|ARM64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Release|x64.ActiveCfg = Release|x64 {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Release|x64.Build.0 = Release|x64 - {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Release|x86.ActiveCfg = Release|x64 - {B5EB9FE9-37EF-47C3-B8B8-81AD3C2972C2}.Release|x86.Build.0 = Release|x64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Debug|ARM64.Build.0 = Debug|ARM64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Debug|x64.ActiveCfg = Debug|x64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Debug|x64.Build.0 = Debug|x64 - {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Debug|x86.ActiveCfg = Debug|x64 - {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Debug|x86.Build.0 = Debug|x64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Release|ARM64.ActiveCfg = Release|ARM64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Release|ARM64.Build.0 = Release|ARM64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Release|x64.ActiveCfg = Release|x64 {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Release|x64.Build.0 = Release|x64 - {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Release|x86.ActiveCfg = Release|x64 - {A663E672-B26D-4EC0-BEAB-FE2E424AC46F}.Release|x86.Build.0 = Release|x64 {8A08D663-4995-40E3-B42C-3F910625F284}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8A08D663-4995-40E3-B42C-3F910625F284}.Debug|ARM64.Build.0 = Debug|ARM64 {8A08D663-4995-40E3-B42C-3F910625F284}.Debug|x64.ActiveCfg = Debug|x64 {8A08D663-4995-40E3-B42C-3F910625F284}.Debug|x64.Build.0 = Debug|x64 - {8A08D663-4995-40E3-B42C-3F910625F284}.Debug|x86.ActiveCfg = Debug|x64 - {8A08D663-4995-40E3-B42C-3F910625F284}.Debug|x86.Build.0 = Debug|x64 {8A08D663-4995-40E3-B42C-3F910625F284}.Release|ARM64.ActiveCfg = Release|ARM64 {8A08D663-4995-40E3-B42C-3F910625F284}.Release|ARM64.Build.0 = Release|ARM64 {8A08D663-4995-40E3-B42C-3F910625F284}.Release|x64.ActiveCfg = Release|x64 {8A08D663-4995-40E3-B42C-3F910625F284}.Release|x64.Build.0 = Release|x64 - {8A08D663-4995-40E3-B42C-3F910625F284}.Release|x86.ActiveCfg = Release|x64 - {8A08D663-4995-40E3-B42C-3F910625F284}.Release|x86.Build.0 = Release|x64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Debug|ARM64.Build.0 = Debug|ARM64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Debug|x64.ActiveCfg = Debug|x64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Debug|x64.Build.0 = Debug|x64 - {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Debug|x86.ActiveCfg = Debug|x64 - {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Debug|x86.Build.0 = Debug|x64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Release|ARM64.ActiveCfg = Release|ARM64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Release|ARM64.Build.0 = Release|ARM64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Release|x64.ActiveCfg = Release|x64 {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Release|x64.Build.0 = Release|x64 - {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Release|x86.ActiveCfg = Release|x64 - {923DF87C-CA99-4D1C-B1D2-959174E95BFA}.Release|x86.Build.0 = Release|x64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Debug|ARM64.Build.0 = Debug|ARM64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Debug|x64.ActiveCfg = Debug|x64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Debug|x64.Build.0 = Debug|x64 - {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Debug|x86.ActiveCfg = Debug|x64 - {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Debug|x86.Build.0 = Debug|x64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Release|ARM64.ActiveCfg = Release|ARM64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Release|ARM64.Build.0 = Release|ARM64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Release|x64.ActiveCfg = Release|x64 {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Release|x64.Build.0 = Release|x64 - {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Release|x86.ActiveCfg = Release|x64 - {D5E42C63-57C5-4EF6-AECE-1E2FCA725B77}.Release|x86.Build.0 = Release|x64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Debug|ARM64.Build.0 = Debug|ARM64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Debug|x64.ActiveCfg = Debug|x64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Debug|x64.Build.0 = Debug|x64 - {D962A009-834F-4EEC-AABB-430DF8F98E39}.Debug|x86.ActiveCfg = Debug|x64 - {D962A009-834F-4EEC-AABB-430DF8F98E39}.Debug|x86.Build.0 = Debug|x64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Release|ARM64.ActiveCfg = Release|ARM64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Release|ARM64.Build.0 = Release|ARM64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Release|x64.ActiveCfg = Release|x64 {D962A009-834F-4EEC-AABB-430DF8F98E39}.Release|x64.Build.0 = Release|x64 - {D962A009-834F-4EEC-AABB-430DF8F98E39}.Release|x86.ActiveCfg = Release|x64 - {D962A009-834F-4EEC-AABB-430DF8F98E39}.Release|x86.Build.0 = Release|x64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Debug|ARM64.Build.0 = Debug|ARM64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Debug|x64.ActiveCfg = Debug|x64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Debug|x64.Build.0 = Debug|x64 - {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Debug|x86.ActiveCfg = Debug|x64 - {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Debug|x86.Build.0 = Debug|x64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Release|ARM64.ActiveCfg = Release|ARM64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Release|ARM64.Build.0 = Release|ARM64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Release|x64.ActiveCfg = Release|x64 {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Release|x64.Build.0 = Release|x64 - {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Release|x86.ActiveCfg = Release|x64 - {FC373B24-3293-453C-AAF5-CF2909DCEE6A}.Release|x86.Build.0 = Release|x64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Debug|ARM64.Build.0 = Debug|ARM64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Debug|x64.ActiveCfg = Debug|x64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Debug|x64.Build.0 = Debug|x64 - {9CE59ED5-7087-4353-88EB-788038A73CEC}.Debug|x86.ActiveCfg = Debug|x64 - {9CE59ED5-7087-4353-88EB-788038A73CEC}.Debug|x86.Build.0 = Debug|x64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Release|ARM64.ActiveCfg = Release|ARM64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Release|ARM64.Build.0 = Release|ARM64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Release|x64.ActiveCfg = Release|x64 {9CE59ED5-7087-4353-88EB-788038A73CEC}.Release|x64.Build.0 = Release|x64 - {9CE59ED5-7087-4353-88EB-788038A73CEC}.Release|x86.ActiveCfg = Release|x64 - {9CE59ED5-7087-4353-88EB-788038A73CEC}.Release|x86.Build.0 = Release|x64 {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Debug|ARM64.ActiveCfg = Debug|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Debug|ARM64.Build.0 = Debug|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Debug|x64.ActiveCfg = Debug|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Debug|x64.Build.0 = Debug|Any CPU - {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Debug|x86.ActiveCfg = Debug|Any CPU - {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Debug|x86.Build.0 = Debug|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Release|ARM64.ActiveCfg = Release|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Release|ARM64.Build.0 = Release|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Release|x64.ActiveCfg = Release|Any CPU {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Release|x64.Build.0 = Release|Any CPU - {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Release|x86.ActiveCfg = Release|Any CPU - {FD86C06A-FB54-4D5E-9831-1CDADF60D45F}.Release|x86.Build.0 = Release|Any CPU {697C6AF9-0A48-49A9-866C-67DA12384015}.Debug|ARM64.ActiveCfg = Debug|ARM64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Debug|ARM64.Build.0 = Debug|ARM64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Debug|x64.ActiveCfg = Debug|x64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Debug|x64.Build.0 = Debug|x64 - {697C6AF9-0A48-49A9-866C-67DA12384015}.Debug|x86.ActiveCfg = Debug|x64 - {697C6AF9-0A48-49A9-866C-67DA12384015}.Debug|x86.Build.0 = Debug|x64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Release|ARM64.ActiveCfg = Release|ARM64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Release|ARM64.Build.0 = Release|ARM64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Release|x64.ActiveCfg = Release|x64 {697C6AF9-0A48-49A9-866C-67DA12384015}.Release|x64.Build.0 = Release|x64 - {697C6AF9-0A48-49A9-866C-67DA12384015}.Release|x86.ActiveCfg = Release|x64 - {697C6AF9-0A48-49A9-866C-67DA12384015}.Release|x86.Build.0 = Release|x64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Debug|ARM64.Build.0 = Debug|ARM64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Debug|x64.ActiveCfg = Debug|x64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Debug|x64.Build.0 = Debug|x64 - {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Debug|x86.ActiveCfg = Debug|x64 - {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Debug|x86.Build.0 = Debug|x64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Release|ARM64.ActiveCfg = Release|ARM64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Release|ARM64.Build.0 = Release|ARM64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Release|x64.ActiveCfg = Release|x64 {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Release|x64.Build.0 = Release|x64 - {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Release|x86.ActiveCfg = Release|x64 - {9EBAA524-0EDA-470B-95D4-39383285CBB2}.Release|x86.Build.0 = Release|x64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Debug|ARM64.ActiveCfg = Debug|ARM64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Debug|ARM64.Build.0 = Debug|ARM64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Debug|x64.ActiveCfg = Debug|x64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Debug|x64.Build.0 = Debug|x64 - {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Debug|x86.ActiveCfg = Debug|x64 - {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Debug|x86.Build.0 = Debug|x64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Release|ARM64.ActiveCfg = Release|ARM64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Release|ARM64.Build.0 = Release|ARM64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Release|x64.ActiveCfg = Release|x64 {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Release|x64.Build.0 = Release|x64 - {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Release|x86.ActiveCfg = Release|x64 - {500DED3E-CFB5-4ED5-ACC6-02B3D6DC336D}.Release|x86.Build.0 = Release|x64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Debug|ARM64.Build.0 = Debug|ARM64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Debug|x64.ActiveCfg = Debug|x64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Debug|x64.Build.0 = Debug|x64 - {D095BE44-1F2E-463E-A494-121892A75EA2}.Debug|x86.ActiveCfg = Debug|x64 - {D095BE44-1F2E-463E-A494-121892A75EA2}.Debug|x86.Build.0 = Debug|x64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Release|ARM64.ActiveCfg = Release|ARM64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Release|ARM64.Build.0 = Release|ARM64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Release|x64.ActiveCfg = Release|x64 {D095BE44-1F2E-463E-A494-121892A75EA2}.Release|x64.Build.0 = Release|x64 - {D095BE44-1F2E-463E-A494-121892A75EA2}.Release|x86.ActiveCfg = Release|x64 - {D095BE44-1F2E-463E-A494-121892A75EA2}.Release|x86.Build.0 = Release|x64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Debug|ARM64.Build.0 = Debug|ARM64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Debug|x64.ActiveCfg = Debug|x64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Debug|x64.Build.0 = Debug|x64 - {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Debug|x86.ActiveCfg = Debug|x64 - {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Debug|x86.Build.0 = Debug|x64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Release|ARM64.ActiveCfg = Release|ARM64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Release|ARM64.Build.0 = Release|ARM64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Release|x64.ActiveCfg = Release|x64 {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Release|x64.Build.0 = Release|x64 - {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Release|x86.ActiveCfg = Release|x64 - {90F9FA90-2C20-4004-96E6-F3B78151F5A5}.Release|x86.Build.0 = Release|x64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Debug|ARM64.Build.0 = Debug|ARM64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Debug|x64.ActiveCfg = Debug|x64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Debug|x64.Build.0 = Debug|x64 - {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Debug|x86.ActiveCfg = Debug|x64 - {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Debug|x86.Build.0 = Debug|x64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Release|ARM64.ActiveCfg = Release|ARM64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Release|ARM64.Build.0 = Release|ARM64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Release|x64.ActiveCfg = Release|x64 {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Release|x64.Build.0 = Release|x64 - {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Release|x86.ActiveCfg = Release|x64 - {F5E1146E-B7B3-4E11-85FD-270A500BD78C}.Release|x86.Build.0 = Release|x64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Debug|ARM64.Build.0 = Debug|ARM64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Debug|x64.ActiveCfg = Debug|x64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Debug|x64.Build.0 = Debug|x64 - {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Debug|x86.ActiveCfg = Debug|x64 - {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Debug|x86.Build.0 = Debug|x64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|ARM64.ActiveCfg = Release|ARM64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|ARM64.Build.0 = Release|ARM64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|x64.ActiveCfg = Release|x64 {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|x64.Build.0 = Release|x64 - {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|x86.ActiveCfg = Release|x64 - {3157FA75-86CF-4EE2-8F62-C43F776493C6}.Release|x86.Build.0 = Release|x64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|ARM64.Build.0 = Debug|ARM64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|x64.ActiveCfg = Debug|x64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|x64.Build.0 = Debug|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|x86.ActiveCfg = Debug|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Debug|x86.Build.0 = Debug|x64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|ARM64.ActiveCfg = Release|ARM64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|ARM64.Build.0 = Release|ARM64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|x64.ActiveCfg = Release|x64 {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|x64.Build.0 = Release|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|x86.ActiveCfg = Release|x64 - {FC8EB78F-F061-4BD9-A3F6-507BEA965E2B}.Release|x86.Build.0 = Release|x64 {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|ARM64.ActiveCfg = Debug|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|ARM64.Build.0 = Debug|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|x64.ActiveCfg = Debug|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|x64.Build.0 = Debug|Any CPU - {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|x86.ActiveCfg = Debug|Any CPU - {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Debug|x86.Build.0 = Debug|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Release|ARM64.ActiveCfg = Release|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Release|ARM64.Build.0 = Release|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Release|x64.ActiveCfg = Release|Any CPU {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Release|x64.Build.0 = Release|Any CPU - {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Release|x86.ActiveCfg = Release|Any CPU - {51465DA1-C18B-4B99-93E1-ECF8E0FA0CBA}.Release|x86.Build.0 = Release|Any CPU {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Debug|ARM64.Build.0 = Debug|ARM64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Debug|x64.ActiveCfg = Debug|x64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Debug|x64.Build.0 = Debug|x64 - {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Debug|x86.ActiveCfg = Debug|x64 - {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Debug|x86.Build.0 = Debug|x64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Release|ARM64.ActiveCfg = Release|ARM64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Release|ARM64.Build.0 = Release|ARM64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Release|x64.ActiveCfg = Release|x64 {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Release|x64.Build.0 = Release|x64 - {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Release|x86.ActiveCfg = Release|x64 - {B9420661-B0E4-4241-ABD4-4A27A1F64250}.Release|x86.Build.0 = Release|x64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Debug|ARM64.ActiveCfg = Debug|ARM64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Debug|ARM64.Build.0 = Debug|ARM64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Debug|x64.ActiveCfg = Debug|x64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Debug|x64.Build.0 = Debug|x64 - {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Debug|x86.ActiveCfg = Debug|x64 - {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Debug|x86.Build.0 = Debug|x64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Release|ARM64.ActiveCfg = Release|ARM64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Release|ARM64.Build.0 = Release|ARM64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Release|x64.ActiveCfg = Release|x64 {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Release|x64.Build.0 = Release|x64 - {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Release|x86.ActiveCfg = Release|x64 - {CCB5E44F-84D9-4203-83C6-1C9EC9302BC7}.Release|x86.Build.0 = Release|x64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Debug|ARM64.ActiveCfg = Debug|ARM64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Debug|ARM64.Build.0 = Debug|ARM64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Debug|x64.ActiveCfg = Debug|x64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Debug|x64.Build.0 = Debug|x64 - {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Debug|x86.ActiveCfg = Debug|x64 - {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Debug|x86.Build.0 = Debug|x64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Release|ARM64.ActiveCfg = Release|ARM64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Release|ARM64.Build.0 = Release|ARM64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Release|x64.ActiveCfg = Release|x64 {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Release|x64.Build.0 = Release|x64 - {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Release|x86.ActiveCfg = Release|x64 - {D949EC7D-48A9-4279-95D5-078E7FD1F048}.Release|x86.Build.0 = Release|x64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Debug|ARM64.Build.0 = Debug|ARM64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Debug|x64.ActiveCfg = Debug|x64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Debug|x64.Build.0 = Debug|x64 - {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Debug|x86.ActiveCfg = Debug|x64 - {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Debug|x86.Build.0 = Debug|x64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Release|ARM64.ActiveCfg = Release|ARM64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Release|ARM64.Build.0 = Release|ARM64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Release|x64.ActiveCfg = Release|x64 {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Release|x64.Build.0 = Release|x64 - {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Release|x86.ActiveCfg = Release|x64 - {3BAF9C81-A194-4925-A035-5E24A5D1E542}.Release|x86.Build.0 = Release|x64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Debug|ARM64.ActiveCfg = Debug|ARM64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Debug|ARM64.Build.0 = Debug|ARM64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Debug|x64.ActiveCfg = Debug|x64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Debug|x64.Build.0 = Debug|x64 - {6B04803D-B418-4833-A67E-B0FC966636A5}.Debug|x86.ActiveCfg = Debug|x64 - {6B04803D-B418-4833-A67E-B0FC966636A5}.Debug|x86.Build.0 = Debug|x64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Release|ARM64.ActiveCfg = Release|ARM64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Release|ARM64.Build.0 = Release|ARM64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Release|x64.ActiveCfg = Release|x64 {6B04803D-B418-4833-A67E-B0FC966636A5}.Release|x64.Build.0 = Release|x64 - {6B04803D-B418-4833-A67E-B0FC966636A5}.Release|x86.ActiveCfg = Release|x64 - {6B04803D-B418-4833-A67E-B0FC966636A5}.Release|x86.Build.0 = Release|x64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Debug|ARM64.Build.0 = Debug|ARM64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Debug|x64.ActiveCfg = Debug|x64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Debug|x64.Build.0 = Debug|x64 - {3940AD4D-F748-4BE4-9083-85769CD553EF}.Debug|x86.ActiveCfg = Debug|x64 - {3940AD4D-F748-4BE4-9083-85769CD553EF}.Debug|x86.Build.0 = Debug|x64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Release|ARM64.ActiveCfg = Release|ARM64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Release|ARM64.Build.0 = Release|ARM64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Release|x64.ActiveCfg = Release|x64 {3940AD4D-F748-4BE4-9083-85769CD553EF}.Release|x64.Build.0 = Release|x64 - {3940AD4D-F748-4BE4-9083-85769CD553EF}.Release|x86.ActiveCfg = Release|x64 - {3940AD4D-F748-4BE4-9083-85769CD553EF}.Release|x86.Build.0 = Release|x64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Debug|ARM64.Build.0 = Debug|ARM64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Debug|x64.ActiveCfg = Debug|x64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Debug|x64.Build.0 = Debug|x64 - {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Debug|x86.ActiveCfg = Debug|x64 - {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Debug|x86.Build.0 = Debug|x64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Release|ARM64.ActiveCfg = Release|ARM64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Release|ARM64.Build.0 = Release|ARM64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Release|x64.ActiveCfg = Release|x64 {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Release|x64.Build.0 = Release|x64 - {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Release|x86.ActiveCfg = Release|x64 - {F8FFFC12-A31A-4AFA-B3DF-14DCF42B5E38}.Release|x86.Build.0 = Release|x64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Debug|ARM64.ActiveCfg = Debug|ARM64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Debug|ARM64.Build.0 = Debug|ARM64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Debug|x64.ActiveCfg = Debug|x64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Debug|x64.Build.0 = Debug|x64 - {0014D652-901F-4456-8D65-06FC5F997FB0}.Debug|x86.ActiveCfg = Debug|Win32 - {0014D652-901F-4456-8D65-06FC5F997FB0}.Debug|x86.Build.0 = Debug|Win32 {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|ARM64.ActiveCfg = Release|ARM64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|ARM64.Build.0 = Release|ARM64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x64.ActiveCfg = Release|x64 {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x64.Build.0 = Release|x64 - {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x86.ActiveCfg = Release|Win32 - {0014D652-901F-4456-8D65-06FC5F997FB0}.Release|x86.Build.0 = Release|Win32 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|ARM64.ActiveCfg = Debug|ARM64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|ARM64.Build.0 = Debug|ARM64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x64.ActiveCfg = Debug|x64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x64.Build.0 = Debug|x64 - {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x86.ActiveCfg = Debug|x64 - {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Debug|x86.Build.0 = Debug|x64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|ARM64.ActiveCfg = Release|ARM64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|ARM64.Build.0 = Release|ARM64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x64.ActiveCfg = Release|x64 {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x64.Build.0 = Release|x64 - {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x86.ActiveCfg = Release|x64 - {799A50D8-DE89-4ED1-8FF8-AD5A9ED8C0CA}.Release|x86.Build.0 = Release|x64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|ARM64.Build.0 = Debug|ARM64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x64.ActiveCfg = Debug|x64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x64.Build.0 = Debug|x64 - {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x86.ActiveCfg = Debug|x64 - {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Debug|x86.Build.0 = Debug|x64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|ARM64.ActiveCfg = Release|ARM64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|ARM64.Build.0 = Release|ARM64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x64.ActiveCfg = Release|x64 {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x64.Build.0 = Release|x64 - {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x86.ActiveCfg = Release|x64 - {9D52FD25-EF90-4F9A-A015-91EFC5DAF54F}.Release|x86.Build.0 = Release|x64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|ARM64.Build.0 = Debug|ARM64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|ARM64.Deploy.0 = Debug|ARM64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|x64.ActiveCfg = Debug|x64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|x64.Build.0 = Debug|x64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|x64.Deploy.0 = Debug|x64 - {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|x86.ActiveCfg = Debug|x64 - {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|x86.Build.0 = Debug|x64 - {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Debug|x86.Deploy.0 = Debug|x64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|ARM64.ActiveCfg = Release|ARM64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|ARM64.Build.0 = Release|ARM64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|ARM64.Deploy.0 = Release|ARM64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|x64.ActiveCfg = Release|x64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|x64.Build.0 = Release|x64 {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|x64.Deploy.0 = Release|x64 - {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|x86.ActiveCfg = Release|x64 - {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|x86.Build.0 = Release|x64 - {C32D254F-7597-4CBE-BF74-D922D81CDF29}.Release|x86.Deploy.0 = Release|x64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Debug|ARM64.ActiveCfg = Debug|ARM64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Debug|ARM64.Build.0 = Debug|ARM64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Debug|x64.ActiveCfg = Debug|x64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Debug|x64.Build.0 = Debug|x64 - {02DD46D3-F761-47D9-8894-2D6DA0124650}.Debug|x86.ActiveCfg = Debug|x64 - {02DD46D3-F761-47D9-8894-2D6DA0124650}.Debug|x86.Build.0 = Debug|x64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Release|ARM64.ActiveCfg = Release|ARM64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Release|ARM64.Build.0 = Release|ARM64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Release|x64.ActiveCfg = Release|x64 {02DD46D3-F761-47D9-8894-2D6DA0124650}.Release|x64.Build.0 = Release|x64 - {02DD46D3-F761-47D9-8894-2D6DA0124650}.Release|x86.ActiveCfg = Release|x64 - {02DD46D3-F761-47D9-8894-2D6DA0124650}.Release|x86.Build.0 = Release|x64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Debug|ARM64.Build.0 = Debug|ARM64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Debug|x64.ActiveCfg = Debug|x64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Debug|x64.Build.0 = Debug|x64 - {8E23E173-7127-4A5F-9F93-3049F2B68047}.Debug|x86.ActiveCfg = Debug|x64 - {8E23E173-7127-4A5F-9F93-3049F2B68047}.Debug|x86.Build.0 = Debug|x64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Release|ARM64.ActiveCfg = Release|ARM64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Release|ARM64.Build.0 = Release|ARM64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Release|x64.ActiveCfg = Release|x64 {8E23E173-7127-4A5F-9F93-3049F2B68047}.Release|x64.Build.0 = Release|x64 - {8E23E173-7127-4A5F-9F93-3049F2B68047}.Release|x86.ActiveCfg = Release|x64 - {8E23E173-7127-4A5F-9F93-3049F2B68047}.Release|x86.Build.0 = Release|x64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Debug|ARM64.ActiveCfg = Debug|ARM64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Debug|ARM64.Build.0 = Debug|ARM64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Debug|x64.ActiveCfg = Debug|x64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Debug|x64.Build.0 = Debug|x64 - {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Debug|x86.ActiveCfg = Debug|x64 - {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Debug|x86.Build.0 = Debug|x64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|ARM64.ActiveCfg = Release|ARM64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|ARM64.Build.0 = Release|ARM64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|x64.ActiveCfg = Release|x64 {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|x64.Build.0 = Release|x64 - {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|x86.ActiveCfg = Release|x64 - {DFF88D16-D36F-40A4-A955-CDCAA76EF7B8}.Release|x86.Build.0 = Release|x64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|ARM64.ActiveCfg = Debug|ARM64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|ARM64.Build.0 = Debug|ARM64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|x64.ActiveCfg = Debug|x64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|x64.Build.0 = Debug|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|x86.ActiveCfg = Debug|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Debug|x86.Build.0 = Debug|x64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|ARM64.ActiveCfg = Release|ARM64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|ARM64.Build.0 = Release|ARM64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|x64.ActiveCfg = Release|x64 {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|x64.Build.0 = Release|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|x86.ActiveCfg = Release|x64 - {FE38FC07-1C05-4B57-ADA3-2FE2F53C6A52}.Release|x86.Build.0 = Release|x64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|ARM64.Build.0 = Debug|ARM64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|x64.ActiveCfg = Debug|x64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|x64.Build.0 = Debug|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|x86.ActiveCfg = Debug|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Debug|x86.Build.0 = Debug|x64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|ARM64.ActiveCfg = Release|ARM64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|ARM64.Build.0 = Release|ARM64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|x64.ActiveCfg = Release|x64 {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|x64.Build.0 = Release|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|x86.ActiveCfg = Release|x64 - {3A9A791E-94A9-49F8-8401-C11CE288D5FB}.Release|x86.Build.0 = Release|x64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|ARM64.ActiveCfg = Debug|ARM64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|ARM64.Build.0 = Debug|ARM64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|x64.ActiveCfg = Debug|x64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|x64.Build.0 = Debug|x64 - {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|x86.ActiveCfg = Debug|x64 - {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Debug|x86.Build.0 = Debug|x64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Release|ARM64.ActiveCfg = Release|ARM64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Release|ARM64.Build.0 = Release|ARM64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Release|x64.ActiveCfg = Release|x64 {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Release|x64.Build.0 = Release|x64 - {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Release|x86.ActiveCfg = Release|x64 - {C0974915-8A1D-4BF0-977B-9587D3807AB7}.Release|x86.Build.0 = Release|x64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Debug|ARM64.ActiveCfg = Debug|ARM64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Debug|ARM64.Build.0 = Debug|ARM64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Debug|x64.ActiveCfg = Debug|x64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Debug|x64.Build.0 = Debug|x64 - {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Debug|x86.ActiveCfg = Debug|x64 - {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Debug|x86.Build.0 = Debug|x64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Release|ARM64.ActiveCfg = Release|ARM64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Release|ARM64.Build.0 = Release|ARM64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Release|x64.ActiveCfg = Release|x64 {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Release|x64.Build.0 = Release|x64 - {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Release|x86.ActiveCfg = Release|x64 - {1D6893CB-BC0C-46A8-A76C-9728706CA51A}.Release|x86.Build.0 = Release|x64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Debug|ARM64.Build.0 = Debug|ARM64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Debug|x64.ActiveCfg = Debug|x64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Debug|x64.Build.0 = Debug|x64 - {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Debug|x86.ActiveCfg = Debug|x64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Release|ARM64.ActiveCfg = Release|ARM64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Release|ARM64.Build.0 = Release|ARM64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Release|x64.ActiveCfg = Release|x64 {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Release|x64.Build.0 = Release|x64 - {8ACB33D9-C95B-47D4-8363-9731EE0930A0}.Release|x86.ActiveCfg = Release|x64 {F055103B-F80B-4D0C-BF48-057C55620033}.Debug|ARM64.ActiveCfg = Debug|ARM64 {F055103B-F80B-4D0C-BF48-057C55620033}.Debug|ARM64.Build.0 = Debug|ARM64 {F055103B-F80B-4D0C-BF48-057C55620033}.Debug|x64.ActiveCfg = Debug|x64 {F055103B-F80B-4D0C-BF48-057C55620033}.Debug|x64.Build.0 = Debug|x64 - {F055103B-F80B-4D0C-BF48-057C55620033}.Debug|x86.ActiveCfg = Debug|x64 - {F055103B-F80B-4D0C-BF48-057C55620033}.Debug|x86.Build.0 = Debug|x64 {F055103B-F80B-4D0C-BF48-057C55620033}.Release|ARM64.ActiveCfg = Release|ARM64 {F055103B-F80B-4D0C-BF48-057C55620033}.Release|ARM64.Build.0 = Release|ARM64 {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x64.ActiveCfg = Release|x64 {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x64.Build.0 = Release|x64 - {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x86.ActiveCfg = Release|x64 - {F055103B-F80B-4D0C-BF48-057C55620033}.Release|x86.Build.0 = Release|x64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|ARM64.ActiveCfg = Debug|ARM64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|ARM64.Build.0 = Debug|ARM64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x64.ActiveCfg = Debug|x64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x64.Build.0 = Debug|x64 - {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x86.ActiveCfg = Debug|x64 - {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Debug|x86.Build.0 = Debug|x64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|ARM64.ActiveCfg = Release|ARM64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|ARM64.Build.0 = Release|ARM64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x64.ActiveCfg = Release|x64 {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x64.Build.0 = Release|x64 - {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x86.ActiveCfg = Release|x64 - {B31FCC55-B5A4-4EA7-B414-2DCEAE6AF332}.Release|x86.Build.0 = Release|x64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|ARM64.ActiveCfg = Debug|ARM64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|ARM64.Build.0 = Debug|ARM64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x64.ActiveCfg = Debug|x64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x64.Build.0 = Debug|x64 - {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x86.ActiveCfg = Debug|x64 - {9C53CC25-0623-4569-95BC-B05410675EE3}.Debug|x86.Build.0 = Debug|x64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|ARM64.ActiveCfg = Release|ARM64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|ARM64.Build.0 = Release|ARM64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x64.ActiveCfg = Release|x64 {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x64.Build.0 = Release|x64 - {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x86.ActiveCfg = Release|x64 - {9C53CC25-0623-4569-95BC-B05410675EE3}.Release|x86.Build.0 = Release|x64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|ARM64.ActiveCfg = Debug|ARM64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|ARM64.Build.0 = Debug|ARM64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x64.ActiveCfg = Debug|x64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x64.Build.0 = Debug|x64 - {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x86.ActiveCfg = Debug|x64 - {45285DF2-9742-4ECA-9AC9-58951FC26489}.Debug|x86.Build.0 = Debug|x64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|ARM64.ActiveCfg = Release|ARM64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|ARM64.Build.0 = Release|ARM64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x64.ActiveCfg = Release|x64 {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x64.Build.0 = Release|x64 - {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x86.ActiveCfg = Release|x64 - {45285DF2-9742-4ECA-9AC9-58951FC26489}.Release|x86.Build.0 = Release|x64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|ARM64.ActiveCfg = Debug|ARM64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|ARM64.Build.0 = Debug|ARM64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x64.ActiveCfg = Debug|x64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x64.Build.0 = Debug|x64 - {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x86.ActiveCfg = Debug|x64 - {3D63307B-9D27-44FD-B033-B26F39245B85}.Debug|x86.Build.0 = Debug|x64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|ARM64.ActiveCfg = Release|ARM64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|ARM64.Build.0 = Release|ARM64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x64.ActiveCfg = Release|x64 {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x64.Build.0 = Release|x64 - {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x86.ActiveCfg = Release|x64 - {3D63307B-9D27-44FD-B033-B26F39245B85}.Release|x86.Build.0 = Release|x64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|ARM64.ActiveCfg = Debug|ARM64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|ARM64.Build.0 = Debug|ARM64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x64.ActiveCfg = Debug|x64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x64.Build.0 = Debug|x64 - {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x86.ActiveCfg = Debug|x64 - {367D7543-7DBA-4381-99F1-BF6142A996C4}.Debug|x86.Build.0 = Debug|x64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|ARM64.ActiveCfg = Release|ARM64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|ARM64.Build.0 = Release|ARM64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x64.ActiveCfg = Release|x64 {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x64.Build.0 = Release|x64 - {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x86.ActiveCfg = Release|x64 - {367D7543-7DBA-4381-99F1-BF6142A996C4}.Release|x86.Build.0 = Release|x64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|ARM64.ActiveCfg = Debug|ARM64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|ARM64.Build.0 = Debug|ARM64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x64.ActiveCfg = Debug|x64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x64.Build.0 = Debug|x64 - {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x86.ActiveCfg = Debug|x64 - {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Debug|x86.Build.0 = Debug|x64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|ARM64.ActiveCfg = Release|ARM64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|ARM64.Build.0 = Release|ARM64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x64.ActiveCfg = Release|x64 {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x64.Build.0 = Release|x64 - {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x86.ActiveCfg = Release|x64 - {2CAC093E-5FCF-4102-9C2C-AC7DD5D9EB96}.Release|x86.Build.0 = Release|x64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Debug|ARM64.ActiveCfg = Debug|ARM64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Debug|ARM64.Build.0 = Debug|ARM64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Debug|x64.ActiveCfg = Debug|x64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Debug|x64.Build.0 = Debug|x64 - {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Debug|x86.ActiveCfg = Debug|x64 - {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Debug|x86.Build.0 = Debug|x64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Release|ARM64.ActiveCfg = Release|ARM64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Release|ARM64.Build.0 = Release|ARM64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Release|x64.ActiveCfg = Release|x64 {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Release|x64.Build.0 = Release|x64 - {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Release|x86.ActiveCfg = Release|x64 - {37D07516-4185-43A4-924F-3C7A5D95ECF6}.Release|x86.Build.0 = Release|x64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|ARM64.ActiveCfg = Debug|ARM64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|ARM64.Build.0 = Debug|ARM64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|x64.ActiveCfg = Debug|x64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|x64.Build.0 = Debug|x64 - {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|x86.ActiveCfg = Debug|x64 - {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Debug|x86.Build.0 = Debug|x64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|ARM64.ActiveCfg = Release|ARM64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|ARM64.Build.0 = Release|ARM64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|x64.ActiveCfg = Release|x64 {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|x64.Build.0 = Release|x64 - {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|x86.ActiveCfg = Release|x64 - {8F021B46-362B-485C-BFBA-CCF83E820CBD}.Release|x86.Build.0 = Release|x64 {66614C26-314C-4B91-9071-76133422CFEF}.Debug|ARM64.ActiveCfg = Debug|ARM64 {66614C26-314C-4B91-9071-76133422CFEF}.Debug|ARM64.Build.0 = Debug|ARM64 {66614C26-314C-4B91-9071-76133422CFEF}.Debug|x64.ActiveCfg = Debug|x64 {66614C26-314C-4B91-9071-76133422CFEF}.Debug|x64.Build.0 = Debug|x64 - {66614C26-314C-4B91-9071-76133422CFEF}.Debug|x86.ActiveCfg = Debug|x64 - {66614C26-314C-4B91-9071-76133422CFEF}.Debug|x86.Build.0 = Debug|x64 {66614C26-314C-4B91-9071-76133422CFEF}.Release|ARM64.ActiveCfg = Release|ARM64 {66614C26-314C-4B91-9071-76133422CFEF}.Release|ARM64.Build.0 = Release|ARM64 {66614C26-314C-4B91-9071-76133422CFEF}.Release|x64.ActiveCfg = Release|x64 @@ -3214,8 +2665,6 @@ Global {89D0E199-B17A-418C-B2F8-7375B6708357}.Debug|ARM64.Build.0 = Debug|ARM64 {89D0E199-B17A-418C-B2F8-7375B6708357}.Debug|x64.ActiveCfg = Debug|x64 {89D0E199-B17A-418C-B2F8-7375B6708357}.Debug|x64.Build.0 = Debug|x64 - {89D0E199-B17A-418C-B2F8-7375B6708357}.Debug|x86.ActiveCfg = Debug|x64 - {89D0E199-B17A-418C-B2F8-7375B6708357}.Debug|x86.Build.0 = Debug|x64 {89D0E199-B17A-418C-B2F8-7375B6708357}.Release|ARM64.ActiveCfg = Release|ARM64 {89D0E199-B17A-418C-B2F8-7375B6708357}.Release|ARM64.Build.0 = Release|ARM64 {89D0E199-B17A-418C-B2F8-7375B6708357}.Release|x64.ActiveCfg = Release|x64 @@ -3244,8 +2693,6 @@ Global {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Debug|ARM64.Build.0 = Debug|ARM64 {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Debug|x64.ActiveCfg = Debug|x64 {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Debug|x64.Build.0 = Debug|x64 - {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Debug|x86.ActiveCfg = Debug|x64 - {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Debug|x86.Build.0 = Debug|x64 {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Release|ARM64.ActiveCfg = Release|ARM64 {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Release|ARM64.Build.0 = Release|ARM64 {0DB0F63A-D2F8-4DA3-A650-2D0B8724218E}.Release|x64.ActiveCfg = Release|x64 @@ -3402,6 +2849,46 @@ Global {DCC6BD67-17BB-47AA-B507-FB0FE43A7449}.Release|x86.ActiveCfg = Release|x64 {DCC6BD67-17BB-47AA-B507-FB0FE43A7449}.Release|x86.Build.0 = Release|x64 {DCC6BD67-17BB-47AA-B507-FB0FE43A7449}.Release|x86.Deploy.0 = Release|x64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Debug|ARM64.Build.0 = Debug|ARM64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Debug|x64.ActiveCfg = Debug|x64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Debug|x64.Build.0 = Debug|x64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Release|ARM64.ActiveCfg = Release|ARM64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Release|ARM64.Build.0 = Release|ARM64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Release|x64.ActiveCfg = Release|x64 + {A558C25D-2007-498E-8B6F-43405AFAE9E2}.Release|x64.Build.0 = Release|x64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Debug|ARM64.Build.0 = Debug|ARM64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Debug|x64.ActiveCfg = Debug|x64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Debug|x64.Build.0 = Debug|x64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Release|ARM64.ActiveCfg = Release|ARM64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Release|ARM64.Build.0 = Release|ARM64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Release|x64.ActiveCfg = Release|x64 + {08F9155D-B6DC-46E5-9C83-AF60B655898B}.Release|x64.Build.0 = Release|x64 + {4382A954-179A-4078-92AF-715187DFFF50}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4382A954-179A-4078-92AF-715187DFFF50}.Debug|ARM64.Build.0 = Debug|ARM64 + {4382A954-179A-4078-92AF-715187DFFF50}.Debug|x64.ActiveCfg = Debug|x64 + {4382A954-179A-4078-92AF-715187DFFF50}.Debug|x64.Build.0 = Debug|x64 + {4382A954-179A-4078-92AF-715187DFFF50}.Release|ARM64.ActiveCfg = Release|ARM64 + {4382A954-179A-4078-92AF-715187DFFF50}.Release|ARM64.Build.0 = Release|ARM64 + {4382A954-179A-4078-92AF-715187DFFF50}.Release|x64.ActiveCfg = Release|x64 + {4382A954-179A-4078-92AF-715187DFFF50}.Release|x64.Build.0 = Release|x64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Debug|ARM64.Build.0 = Debug|ARM64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Debug|x64.ActiveCfg = Debug|x64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Debug|x64.Build.0 = Debug|x64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Release|ARM64.ActiveCfg = Release|ARM64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Release|ARM64.Build.0 = Release|ARM64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Release|x64.ActiveCfg = Release|x64 + {EBED240C-8702-452D-B764-6DB9DA9179AF}.Release|x64.Build.0 = Release|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Debug|ARM64.Build.0 = Debug|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Debug|x64.ActiveCfg = Debug|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Debug|x64.Build.0 = Debug|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Release|ARM64.ActiveCfg = Release|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Release|ARM64.Build.0 = Release|ARM64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Release|x64.ActiveCfg = Release|x64 + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0}.Release|x64.Build.0 = Release|x64 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3675,6 +3162,11 @@ Global {E4585179-2AC1-4D5F-A3FF-CFC5392F694C} = {DD6E12FE-5509-4ABC-ACC2-3D6DC98A238C} {CA7D8106-30B9-4AEC-9D05-B69B31B8C461} = {DD6E12FE-5509-4ABC-ACC2-3D6DC98A238C} {DCC6BD67-17BB-47AA-B507-FB0FE43A7449} = {ECB8E0D1-7603-4E5C-AB10-D1E545E6F8E2} + {A558C25D-2007-498E-8B6F-43405AFAE9E2} = {1AFB6476-670D-4E80-A464-657E01DFF482} + {08F9155D-B6DC-46E5-9C83-AF60B655898B} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} + {4382A954-179A-4078-92AF-715187DFFF50} = {38BDB927-829B-4C65-9CD9-93FB05D66D65} + {EBED240C-8702-452D-B764-6DB9DA9179AF} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} + {4E0AE3A4-2EE0-44D7-A2D0-8769977254A0} = {F05E590D-AD46-42BE-9C25-6A63ADD2E3EA} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {C3A2F9D1-7930-4EF4-A6FC-7EE0A99821D0} diff --git a/doc/devdocs/UITests.md b/doc/devdocs/UITests.md new file mode 100644 index 000000000000..fea05f6b9e96 --- /dev/null +++ b/doc/devdocs/UITests.md @@ -0,0 +1,91 @@ +# UI tests framework + + A specialized UI test framework for PowerToys that makes it easy to write UI tests for PowerToys modules or settings. Let's start writing UI tests! + +## Before running tests + +- Install Windows Application Driver v1.2.1 from https://github.com/microsoft/WinAppDriver/releases/tag/v1.2.1 to the default directory (`C:\Program Files (x86)\Windows Application Driver`) + +- Enable Developer Mode in Windows settings + +## Running tests + +- Exit PowerToys if it's running. + +- Open `PowerToys.sln` in Visual Studio and build the solution. + +- Run tests in the Test Explorer (`Test > Test Explorer` or `Ctrl+E, T`). + + +## How to add the first UI tests for your modules + +- Create a new project and add the following references to the project file. Change the OutputPath to your own module's path. + ``` + + Library + + false + + + + ..\..\..\..\$(Platform)\$(Configuration)\tests\KeyboardManagerUITests\ + + + + + + + + ``` +- Inherit your test class from UITestBase. + >Set Scope: The default scope starts from the PowerToys settings UI. If you want to start from your own module, set the constructor as shown below: + + >Specify Scope: + ``` + [TestClass] + public class RunFancyZonesTest : UITestBase + { + public RunFancyZonesTest() + : base(PowerToysModule.FancyZone) + { + } + } + ``` + +- Then you can start using session to perform the UI operations. + +**Example** +``` +using Microsoft.PowerToys.UITest; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace UITests_KeyboardManager +{ + [TestClass] + public class RunKeyboardManagerUITests : UITestBase + { + [TestMethod] + public void OpenKeyboardManagerEditor() + { + // Open KeyboardManagerEditor + this.Session.Find + + + + + diff --git a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml.cs b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml.cs index 3383af5292aa..19c0fd8ce67e 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/Controls/PromptBox.xaml.cs @@ -55,9 +55,9 @@ public PromptBox() private void ViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == nameof(ViewModel.Busy) || e.PropertyName == nameof(ViewModel.PasteActionError)) + if (e.PropertyName is nameof(ViewModel.IsBusy) or nameof(ViewModel.PasteActionError)) { - var state = ViewModel.Busy ? "LoadingState" : ViewModel.PasteActionError.HasText ? "ErrorState" : "DefaultState"; + var state = ViewModel.IsBusy ? "LoadingState" : ViewModel.PasteActionError.HasText ? "ErrorState" : "DefaultState"; VisualStateManager.GoToState(this, state, true); } } @@ -78,6 +78,9 @@ private void Grid_Loaded(object sender, RoutedEventArgs e) [RelayCommand] private async Task GenerateCustomAIAsync() => await ViewModel.ExecuteCustomAIFormatFromCurrentQueryAsync(PasteActionSource.PromptBox); + [RelayCommand] + private async Task CancelPasteActionAsync() => await ViewModel.CancelPasteActionAsync(); + private async void InputTxtBox_KeyDown(object sender, Microsoft.UI.Xaml.Input.KeyRoutedEventArgs e) { if (e.Key == Windows.System.VirtualKey.Enter && InputTxtBox.Text.Length > 0 && ViewModel.IsCustomAIAvailable) diff --git a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs index 7743e6764bb2..7d90cf62dce0 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/AdvancedPasteXAML/MainWindow.xaml.cs @@ -24,6 +24,7 @@ public sealed partial class MainWindow : WindowEx, IDisposable { private readonly WindowMessageMonitor _msgMonitor; private readonly IUserSettings _userSettings; + private readonly OptionsViewModel _optionsViewModel; private bool _disposedValue; @@ -32,8 +33,7 @@ public MainWindow() InitializeComponent(); _userSettings = App.GetService(); - - var optionsViewModel = App.GetService(); + _optionsViewModel = App.GetService(); var baseHeight = MinHeight; var coreActionCount = PasteFormat.MetadataDict.Values.Count(metadata => metadata.IsCoreAction); @@ -43,7 +43,7 @@ void UpdateHeight() double GetHeight(int maxCustomActionCount) => baseHeight + new PasteFormatsToHeightConverter().GetHeight(coreActionCount + _userSettings.AdditionalActions.Count) + - new PasteFormatsToHeightConverter() { MaxItems = maxCustomActionCount }.GetHeight(optionsViewModel.IsCustomAIServiceEnabled ? _userSettings.CustomActions.Count : 0); + new PasteFormatsToHeightConverter() { MaxItems = maxCustomActionCount }.GetHeight(_optionsViewModel.IsCustomAIServiceEnabled ? _userSettings.CustomActions.Count : 0); MinHeight = GetHeight(1); Height = GetHeight(5); @@ -52,9 +52,9 @@ double GetHeight(int maxCustomActionCount) => UpdateHeight(); _userSettings.Changed += (_, _) => UpdateHeight(); - optionsViewModel.PropertyChanged += (_, e) => + _optionsViewModel.PropertyChanged += (_, e) => { - if (e.PropertyName == nameof(optionsViewModel.IsCustomAIServiceEnabled)) + if (e.PropertyName == nameof(_optionsViewModel.IsCustomAIServiceEnabled)) { UpdateHeight(); } @@ -111,8 +111,9 @@ public void Dispose() GC.SuppressFinalize(this); } - private void WindowEx_Closed(object sender, Microsoft.UI.Xaml.WindowEventArgs args) + private async void WindowEx_Closed(object sender, Microsoft.UI.Xaml.WindowEventArgs args) { + await _optionsViewModel.CancelPasteActionAsync(); Hide(); args.Handled = true; } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/DataPackageHelpers.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/DataPackageHelpers.cs index 4aacd0c1153c..529773f9a6d5 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/DataPackageHelpers.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/DataPackageHelpers.cs @@ -4,10 +4,14 @@ using System; using System.Collections.Generic; +using System.IO; using System.Linq; +using System.Text; using System.Threading.Tasks; using AdvancedPaste.Models; +using ManagedCommon; +using Microsoft.Win32; using Windows.ApplicationModel.DataTransfer; using Windows.Data.Html; using Windows.Graphics.Imaging; @@ -18,8 +22,6 @@ namespace AdvancedPaste.Helpers; internal static class DataPackageHelpers { - private static readonly Lazy> ImageFileTypes = new(GetImageFileTypes()); - private static readonly (string DataFormat, ClipboardFormat ClipboardFormat)[] DataFormats = [ (StandardDataFormats.Text, ClipboardFormat.Text), @@ -27,6 +29,14 @@ private static readonly (string DataFormat, ClipboardFormat ClipboardFormat)[] D (StandardDataFormats.Bitmap, ClipboardFormat.Image), ]; + private static readonly Lazy<(ClipboardFormat Format, HashSet FileTypes)[]> SupportedFileTypes = + new(() => + [ + (ClipboardFormat.Image, GetImageFileTypes()), + (ClipboardFormat.Audio, GetMediaFileTypes("audio")), + (ClipboardFormat.Video, GetMediaFileTypes("video")), + ]); + internal static DataPackage CreateFromText(string text) { DataPackage dataPackage = new(); @@ -57,9 +67,12 @@ internal static async Task GetAvailableFormatsAsync(this DataPa { availableFormats |= ClipboardFormat.File; - if (ImageFileTypes.Value.Contains(file.FileType)) + foreach (var (format, fileTypes) in SupportedFileTypes.Value) { - availableFormats |= ClipboardFormat.Image; + if (fileTypes.Contains(file.FileType)) + { + availableFormats |= format; + } } } } @@ -93,6 +106,60 @@ internal static async Task HasUsableDataAsync(this DataPackageView dataPac return availableFormats == ClipboardFormat.Text ? !string.IsNullOrEmpty(await dataPackageView.GetTextAsync()) : availableFormats != ClipboardFormat.None; } + internal static async Task TryCleanupAfterDelayAsync(this DataPackageView dataPackageView, TimeSpan delay) + { + try + { + var tempFile = await GetSingleTempFileOrNullAsync(dataPackageView); + + if (tempFile != null) + { + await Task.Delay(delay); + + Logger.LogDebug($"Cleaning up temporary file with extension [{tempFile.Extension}] from data package after delay"); + + tempFile.Delete(); + if (NormalizeDirectoryPath(tempFile.Directory?.Parent?.FullName) == NormalizeDirectoryPath(Path.GetTempPath())) + { + tempFile.Directory?.Delete(); + } + } + } + catch (Exception ex) + { + Logger.LogError("Failed to clean up temporary files", ex); + } + } + + private static async Task GetSingleTempFileOrNullAsync(this DataPackageView dataPackageView) + { + if (!dataPackageView.Contains(StandardDataFormats.StorageItems)) + { + return null; + } + + var storageItems = await dataPackageView.GetStorageItemsAsync(); + + if (storageItems.Count != 1 || storageItems.Single() is not StorageFile file) + { + return null; + } + + FileInfo fileInfo = new(file.Path); + var tempPathDirectory = NormalizeDirectoryPath(Path.GetTempPath()); + + var directoryPaths = new[] { fileInfo.Directory, fileInfo.Directory?.Parent } + .Where(directory => directory != null) + .Select(directory => NormalizeDirectoryPath(directory.FullName)); + + return directoryPaths.Contains(NormalizeDirectoryPath(Path.GetTempPath())) ? fileInfo : null; + } + + private static string NormalizeDirectoryPath(string path) => + Path.GetFullPath(new Uri(path).LocalPath) + .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) + .ToUpperInvariant(); + internal static async Task GetTextOrEmptyAsync(this DataPackageView dataPackageView) => dataPackageView.Contains(StandardDataFormats.Text) ? await dataPackageView.GetTextAsync() : string.Empty; @@ -153,4 +220,27 @@ private static HashSet GetImageFileTypes() => BitmapDecoder.GetDecoderInformationEnumerator() .SelectMany(di => di.FileExtensions) .ToHashSet(StringComparer.InvariantCultureIgnoreCase); + + private static HashSet GetMediaFileTypes(string mediaKind) + { + static string AssocQueryString(NativeMethods.AssocStr assocStr, string extension) + { + uint pcchOut = 0; + + NativeMethods.AssocQueryString(NativeMethods.AssocF.None, assocStr, extension, null, null, ref pcchOut); + + StringBuilder pszOut = new((int)pcchOut); + var hResult = NativeMethods.AssocQueryString(NativeMethods.AssocF.None, assocStr, extension, null, pszOut, ref pcchOut); + return hResult == NativeMethods.HResult.Ok ? pszOut.ToString() : string.Empty; + } + + var comparison = StringComparison.OrdinalIgnoreCase; + var extensions = from extension in Registry.ClassesRoot.GetSubKeyNames() + where extension.StartsWith('.') + where AssocQueryString(NativeMethods.AssocStr.PerceivedType, extension).Equals(mediaKind, comparison) || + AssocQueryString(NativeMethods.AssocStr.ContentType, extension).StartsWith($"{mediaKind}/", comparison) + select extension; + + return extensions.ToHashSet(StringComparer.InvariantCultureIgnoreCase); + } } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/KernelExtensions.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/KernelExtensions.cs index 2708e2ca6946..886d24d721d2 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/KernelExtensions.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/KernelExtensions.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Models; @@ -17,6 +18,8 @@ internal static class KernelExtensions private const string DataPackageKey = "DataPackage"; private const string LastErrorKey = "LastError"; private const string ActionChainKey = "ActionChain"; + private const string CancellationTokenKey = "CancellationToken"; + private const string ProgressKey = "Progress"; internal static DataPackageView GetDataPackageView(this Kernel kernel) { @@ -40,6 +43,14 @@ internal static async Task GetDataFormatsAsync(this Kernel kernel) internal static void SetDataPackageView(this Kernel kernel, DataPackageView dataPackageView) => kernel.Data[DataPackageKey] = dataPackageView; + internal static CancellationToken GetCancellationToken(this Kernel kernel) => kernel.Data.TryGetValue(CancellationTokenKey, out object value) ? (CancellationToken)value : CancellationToken.None; + + internal static void SetCancellationToken(this Kernel kernel, CancellationToken cancellationToken) => kernel.Data[CancellationTokenKey] = cancellationToken; + + internal static IProgress GetProgress(this Kernel kernel) => kernel.Data.TryGetValue(ProgressKey, out object obj) ? obj as IProgress : null; + + internal static void SetProgress(this Kernel kernel, IProgress progress) => kernel.Data[ProgressKey] = progress; + internal static Exception GetLastError(this Kernel kernel) => kernel.Data.TryGetValue(LastErrorKey, out object obj) ? obj as Exception : null; internal static void SetLastError(this Kernel kernel, Exception error) => kernel.Data[LastErrorKey] = error; diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/NativeMethods.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/NativeMethods.cs index a28626ca1f21..6e53e9b61890 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/NativeMethods.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/NativeMethods.cs @@ -4,6 +4,7 @@ using System; using System.Runtime.InteropServices; +using System.Text; namespace AdvancedPaste.Helpers { @@ -83,6 +84,68 @@ internal enum KeyEventF Scancode = 0x0008, } + public enum HResult + { + Ok = 0x0000, + False = 0x0001, + InvalidArguments = unchecked((int)0x80070057), + OutOfMemory = unchecked((int)0x8007000E), + NoInterface = unchecked((int)0x80004002), + Fail = unchecked((int)0x80004005), + ExtractionFailed = unchecked((int)0x8004B200), + ElementNotFound = unchecked((int)0x80070490), + TypeElementNotFound = unchecked((int)0x8002802B), + NoObject = unchecked((int)0x800401E5), + Win32ErrorCanceled = 1223, + Canceled = unchecked((int)0x800704C7), + ResourceInUse = unchecked((int)0x800700AA), + AccessDenied = unchecked((int)0x80030005), + } + + [Flags] + public enum AssocF + { + None = 0, + Init_NoRemapCLSID = 0x1, + Init_ByExeName = 0x2, + Open_ByExeName = 0x3, + Init_DefaultToStar = 0x4, + Init_DefaultToFolder = 0x8, + NoUserSettings = 0x10, + NoTruncate = 0x20, + Verify = 0x40, + RemapRunDll = 0x80, + NoFixUps = 0x100, + IgnoreBaseClass = 0x200, + } + + public enum AssocStr + { + Command = 1, + Executable, + FriendlyDocName, + FriendlyAppName, + NoOpen, + ShellNewValue, + DDECommand, + DDEIfExec, + DDEApplication, + DDETopic, + InfoTip, + QuickTip, + TileInfo, + ContentType, + DefaultIcon, + ShellExtension, + PerceivedType, + DelegateExecute, + SupportedUriProtocols, + ProgId, + AppId, + AppPublisher, + AppIconReference, + } + [DllImport("user32.dll")] internal static extern uint SendInput(uint nInputs, INPUT[] pInputs, int cbSize); @@ -100,5 +163,8 @@ internal struct PointInter [DllImport("user32.dll")] internal static extern bool GetCursorPos(out PointInter lpPoint); + + [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Unicode)] + internal static extern HResult AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra, [Out] StringBuilder pszOut, [In][Out] ref uint pcchOut); } } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/OcrHelpers.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/OcrHelpers.cs index 1ed0665f9d9b..b56868ece8cb 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/OcrHelpers.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/OcrHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Windows.Globalization; @@ -15,11 +16,14 @@ namespace AdvancedPaste.Helpers; public static class OcrHelpers { - public static async Task ExtractTextAsync(SoftwareBitmap bitmap) + public static async Task ExtractTextAsync(SoftwareBitmap bitmap, CancellationToken cancellationToken) { var ocrLanguage = GetOCRLanguage() ?? throw new InvalidOperationException("Unable to determine OCR language"); + cancellationToken.ThrowIfCancellationRequested(); var ocrEngine = OcrEngine.TryCreateFromLanguage(ocrLanguage) ?? throw new InvalidOperationException("Unable to create OCR engine"); + cancellationToken.ThrowIfCancellationRequested(); + var ocrResult = await ocrEngine.RecognizeAsync(bitmap); return string.IsNullOrWhiteSpace(ocrResult.Text) diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TranscodeHelpers.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TranscodeHelpers.cs new file mode 100644 index 000000000000..8d0f735bade4 --- /dev/null +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TranscodeHelpers.cs @@ -0,0 +1,167 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +using AdvancedPaste.Models; +using ManagedCommon; +using Windows.ApplicationModel.DataTransfer; +using Windows.Media.MediaProperties; +using Windows.Media.Transcoding; +using Windows.Storage; + +namespace AdvancedPaste.Helpers; + +internal static class TranscodeHelpers +{ + public static async Task TranscodeToMp3Async(DataPackageView clipboardData, CancellationToken cancellationToken, IProgress progress) => + await TranscodeMediaAsync(clipboardData, MediaEncodingProfile.CreateMp3(AudioEncodingQuality.High), ".mp3", cancellationToken, progress); + + public static async Task TranscodeToMp4Async(DataPackageView clipboardData, CancellationToken cancellationToken, IProgress progress) => + await TranscodeMediaAsync(clipboardData, MediaEncodingProfile.CreateMp4(VideoEncodingQuality.HD1080p), ".mp4", cancellationToken, progress); + + private static async Task TranscodeMediaAsync(DataPackageView clipboardData, MediaEncodingProfile baseOutputProfile, string extension, CancellationToken cancellationToken, IProgress progress) + { + Logger.LogTrace(); + + var inputFiles = await clipboardData.GetStorageItemsAsync(); + + if (inputFiles.Count != 1) + { + throw new InvalidOperationException($"{nameof(TranscodeMediaAsync)} does not support multiple files"); + } + + var inputFile = inputFiles.Single() as StorageFile ?? throw new InvalidOperationException($"{nameof(TranscodeMediaAsync)} only supports files"); + var inputFileNameWithoutExtension = Path.GetFileNameWithoutExtension(inputFile.Path); + + var inputProfile = await MediaEncodingProfile.CreateFromFileAsync(inputFile); + var outputProfile = CreateOutputProfile(inputProfile, baseOutputProfile); + +#if DEBUG + static string ProfileToString(MediaEncodingProfile profile) => System.Text.Json.JsonSerializer.Serialize(profile, options: new() { WriteIndented = true }); + Logger.LogDebug($"{nameof(inputProfile)}: {ProfileToString(inputProfile)}"); + Logger.LogDebug($"{nameof(outputProfile)}: {ProfileToString(outputProfile)}"); +#endif + + var outputFolder = await Task.Run(() => Directory.CreateTempSubdirectory("PowerToys_AdvancedPaste_"), cancellationToken); + var outputFileName = StringComparer.OrdinalIgnoreCase.Equals(Path.GetExtension(inputFile.Path), extension) ? inputFileNameWithoutExtension + "_1" : inputFileNameWithoutExtension; + var outputFilePath = Path.Combine(outputFolder.FullName, Path.ChangeExtension(outputFileName, extension)); + await File.WriteAllBytesAsync(outputFilePath, [], cancellationToken); // TranscodeAsync seems to require the output file to exist + + await TranscodeMediaAsync(inputFile, await StorageFile.GetFileFromPathAsync(outputFilePath), outputProfile, cancellationToken, progress); + + return await DataPackageHelpers.CreateFromFileAsync(outputFilePath); + } + + private static MediaEncodingProfile CreateOutputProfile(MediaEncodingProfile inputProfile, MediaEncodingProfile baseOutputProfile) + { + MediaEncodingProfile outputProfile = new() + { + Video = null, + Audio = null, + }; + + outputProfile.Container = baseOutputProfile.Container.Copy(); + + if (inputProfile.Video != null && baseOutputProfile.Video != null) + { + outputProfile.Video = baseOutputProfile.Video.Copy(); + + if (inputProfile.Video.Bitrate != 0) + { + outputProfile.Video.Bitrate = inputProfile.Video.Bitrate; + } + + if (inputProfile.Video.FrameRate.Numerator != 0) + { + outputProfile.Video.FrameRate.Numerator = inputProfile.Video.FrameRate.Numerator; + } + + if (inputProfile.Video.FrameRate.Denominator != 0) + { + outputProfile.Video.FrameRate.Denominator = inputProfile.Video.FrameRate.Denominator; + } + + if (inputProfile.Video.PixelAspectRatio.Numerator != 0) + { + outputProfile.Video.PixelAspectRatio.Numerator = inputProfile.Video.PixelAspectRatio.Numerator; + } + + if (inputProfile.Video.PixelAspectRatio.Denominator != 0) + { + outputProfile.Video.PixelAspectRatio.Denominator = inputProfile.Video.PixelAspectRatio.Denominator; + } + + outputProfile.Video.Width = inputProfile.Video.Width; + outputProfile.Video.Height = inputProfile.Video.Height; + } + + if (inputProfile.Audio != null && baseOutputProfile.Audio != null) + { + outputProfile.Audio = baseOutputProfile.Audio.Copy(); + + if (inputProfile.Audio.Bitrate != 0) + { + outputProfile.Audio.Bitrate = inputProfile.Audio.Bitrate; + } + + if (inputProfile.Audio.BitsPerSample != 0) + { + outputProfile.Audio.BitsPerSample = inputProfile.Audio.BitsPerSample; + } + + if (inputProfile.Audio.ChannelCount != 0) + { + outputProfile.Audio.ChannelCount = inputProfile.Audio.ChannelCount; + } + + if (inputProfile.Audio.SampleRate != 0) + { + outputProfile.Audio.SampleRate = inputProfile.Audio.SampleRate; + } + } + + return outputProfile; + } + + private static async Task TranscodeMediaAsync(StorageFile inputFile, StorageFile outputFile, MediaEncodingProfile outputProfile, CancellationToken cancellationToken, IProgress progress) + { + if (outputProfile.Video == null && outputProfile.Audio == null) + { + throw new InvalidOperationException("Target profile does not contain media"); + } + + async Task GetPrepareResult(bool hardwareAccelerationEnabled) + { + MediaTranscoder transcoder = new() + { + AlwaysReencode = false, + HardwareAccelerationEnabled = hardwareAccelerationEnabled, + }; + + return await transcoder.PrepareFileTranscodeAsync(inputFile, outputFile, outputProfile); + } + + var prepareResult = await GetPrepareResult(hardwareAccelerationEnabled: true); + + if (!prepareResult.CanTranscode) + { + Logger.LogWarning($"Unable to transcode with hardware acceleration enabled, falling back to software; {nameof(prepareResult.FailureReason)}={prepareResult.FailureReason}"); + + prepareResult = await GetPrepareResult(hardwareAccelerationEnabled: false); + } + + if (!prepareResult.CanTranscode) + { + var message = ResourceLoaderInstance.ResourceLoader.GetString(prepareResult.FailureReason == TranscodeFailureReason.CodecNotFound ? "TranscodeErrorUnsupportedCodec" : "TranscodeErrorGeneral"); + throw new PasteActionException(message, new InvalidOperationException($"Error transcoding; {nameof(prepareResult.FailureReason)}={prepareResult.FailureReason}")); + } + + await prepareResult.TranscodeAsync().AsTask(cancellationToken, progress); + } +} diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TransformHelpers.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TransformHelpers.cs index 2c8f442cd7d0..fe66ba6cbbfb 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TransformHelpers.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/TransformHelpers.cs @@ -5,6 +5,7 @@ using System; using System.Globalization; using System.IO; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Models; @@ -17,17 +18,19 @@ namespace AdvancedPaste.Helpers; public static class TransformHelpers { - public static async Task TransformAsync(PasteFormats format, DataPackageView clipboardData) + public static async Task TransformAsync(PasteFormats format, DataPackageView clipboardData, CancellationToken cancellationToken, IProgress progress) { return format switch { PasteFormats.PlainText => await ToPlainTextAsync(clipboardData), PasteFormats.Markdown => await ToMarkdownAsync(clipboardData), PasteFormats.Json => await ToJsonAsync(clipboardData), - PasteFormats.ImageToText => await ImageToTextAsync(clipboardData), - PasteFormats.PasteAsTxtFile => await ToTxtFileAsync(clipboardData), - PasteFormats.PasteAsPngFile => await ToPngFileAsync(clipboardData), - PasteFormats.PasteAsHtmlFile => await ToHtmlFileAsync(clipboardData), + PasteFormats.ImageToText => await ImageToTextAsync(clipboardData, cancellationToken), + PasteFormats.PasteAsTxtFile => await ToTxtFileAsync(clipboardData, cancellationToken), + PasteFormats.PasteAsPngFile => await ToPngFileAsync(clipboardData, cancellationToken), + PasteFormats.PasteAsHtmlFile => await ToHtmlFileAsync(clipboardData, cancellationToken), + PasteFormats.TranscodeToMp3 => await TranscodeHelpers.TranscodeToMp3Async(clipboardData, cancellationToken, progress), + PasteFormats.TranscodeToMp4 => await TranscodeHelpers.TranscodeToMp4Async(clipboardData, cancellationToken, progress), PasteFormats.KernelQuery => throw new ArgumentException($"Unsupported format {format}", nameof(format)), PasteFormats.CustomTextTransformation => throw new ArgumentException($"Unsupported format {format}", nameof(format)), _ => throw new ArgumentException($"Unknown value {format}", nameof(format)), @@ -52,16 +55,16 @@ private static async Task ToJsonAsync(DataPackageView clipboardData return CreateDataPackageFromText(await JsonHelper.ToJsonFromXmlOrCsvAsync(clipboardData)); } - private static async Task ImageToTextAsync(DataPackageView clipboardData) + private static async Task ImageToTextAsync(DataPackageView clipboardData, CancellationToken cancellationToken) { Logger.LogTrace(); var bitmap = await clipboardData.GetImageContentAsync() ?? throw new ArgumentException("No image content found in clipboard", nameof(clipboardData)); - var text = await OcrHelpers.ExtractTextAsync(bitmap); + var text = await OcrHelpers.ExtractTextAsync(bitmap, cancellationToken); return CreateDataPackageFromText(text); } - private static async Task ToPngFileAsync(DataPackageView clipboardData) + private static async Task ToPngFileAsync(DataPackageView clipboardData, CancellationToken cancellationToken) { Logger.LogTrace(); @@ -72,25 +75,25 @@ private static async Task ToPngFileAsync(DataPackageView clipboardD encoder.SetSoftwareBitmap(clipboardBitmap); await encoder.FlushAsync(); - return await CreateDataPackageFromFileContentAsync(pngStream.AsStreamForRead(), "png"); + return await CreateDataPackageFromFileContentAsync(pngStream.AsStreamForRead(), "png", cancellationToken); } - private static async Task ToTxtFileAsync(DataPackageView clipboardData) + private static async Task ToTxtFileAsync(DataPackageView clipboardData, CancellationToken cancellationToken) { Logger.LogTrace(); var text = await clipboardData.GetTextOrHtmlTextAsync(); - return await CreateDataPackageFromFileContentAsync(text, "txt"); + return await CreateDataPackageFromFileContentAsync(text, "txt", cancellationToken); } - private static async Task ToHtmlFileAsync(DataPackageView clipboardData) + private static async Task ToHtmlFileAsync(DataPackageView clipboardData, CancellationToken cancellationToken) { Logger.LogTrace(); var cfHtml = await clipboardData.GetHtmlContentAsync(); var html = RemoveHtmlMetadata(cfHtml); - return await CreateDataPackageFromFileContentAsync(html, "html"); + return await CreateDataPackageFromFileContentAsync(html, "html", cancellationToken); } /// @@ -114,7 +117,7 @@ private static string RemoveHtmlMetadata(string cfHtml) return (startFragmentIndex == null || endFragmentIndex == null) ? cfHtml : cfHtml[startFragmentIndex.Value..endFragmentIndex.Value]; } - private static async Task CreateDataPackageFromFileContentAsync(string data, string fileExtension) + private static async Task CreateDataPackageFromFileContentAsync(string data, string fileExtension, CancellationToken cancellationToken) { if (string.IsNullOrEmpty(data)) { @@ -123,16 +126,16 @@ private static async Task CreateDataPackageFromFileContentAsync(str var path = GetPasteAsFileTempFilePath(fileExtension); - await File.WriteAllTextAsync(path, data); + await File.WriteAllTextAsync(path, data, cancellationToken); return await DataPackageHelpers.CreateFromFileAsync(path); } - private static async Task CreateDataPackageFromFileContentAsync(Stream stream, string fileExtension) + private static async Task CreateDataPackageFromFileContentAsync(Stream stream, string fileExtension, CancellationToken cancellationToken) { var path = GetPasteAsFileTempFilePath(fileExtension); using var fileStream = File.Create(path); - await stream.CopyToAsync(fileStream); + await stream.CopyToAsync(fileStream, cancellationToken); return await DataPackageHelpers.CreateFromFileAsync(path); } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/UserSettings.cs b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/UserSettings.cs index 70a4cf0f9e4d..8a25b70f07ea 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Helpers/UserSettings.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Helpers/UserSettings.cs @@ -108,7 +108,9 @@ void UpdateSettings() (PasteFormats.ImageToText, [sourceAdditionalActions.ImageToText]), (PasteFormats.PasteAsTxtFile, [sourceAdditionalActions.PasteAsFile, sourceAdditionalActions.PasteAsFile.PasteAsTxtFile]), (PasteFormats.PasteAsPngFile, [sourceAdditionalActions.PasteAsFile, sourceAdditionalActions.PasteAsFile.PasteAsPngFile]), - (PasteFormats.PasteAsHtmlFile, [sourceAdditionalActions.PasteAsFile, sourceAdditionalActions.PasteAsFile.PasteAsHtmlFile]) + (PasteFormats.PasteAsHtmlFile, [sourceAdditionalActions.PasteAsFile, sourceAdditionalActions.PasteAsFile.PasteAsHtmlFile]), + (PasteFormats.TranscodeToMp3, [sourceAdditionalActions.Transcode, sourceAdditionalActions.Transcode.TranscodeToMp3]), + (PasteFormats.TranscodeToMp4, [sourceAdditionalActions.Transcode, sourceAdditionalActions.Transcode.TranscodeToMp4]), ]; _additionalActions.Clear(); diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Models/ClipboardFormat.cs b/src/modules/AdvancedPaste/AdvancedPaste/Models/ClipboardFormat.cs index 63c935b63ed6..af445e85b045 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Models/ClipboardFormat.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Models/ClipboardFormat.cs @@ -13,6 +13,7 @@ public enum ClipboardFormat Text = 1 << 0, Html = 1 << 1, Audio = 1 << 2, - Image = 1 << 3, - File = 1 << 4, // output only for now + Video = 1 << 3, + Image = 1 << 4, + File = 1 << 5, // output only for now } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteActionError.cs b/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteActionError.cs index 6ec9a49028f0..701ffe54bb18 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteActionError.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteActionError.cs @@ -30,7 +30,7 @@ public static PasteActionError FromResourceId(string resourceId) => public static PasteActionError FromException(Exception ex) => new() { - Text = ex is PasteActionException ? ex.Message : ResourceLoaderInstance.ResourceLoader.GetString("PasteError"), + Text = ex is PasteActionException ? ex.Message : ResourceLoaderInstance.ResourceLoader.GetString(ex is OperationCanceledException ? "PasteActionCanceled" : "PasteError"), Details = (ex as PasteActionException)?.AIServiceMessage ?? string.Empty, }; } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteFormats.cs b/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteFormats.cs index 588f10250629..99243ebb5efa 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteFormats.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Models/PasteFormats.cs @@ -82,12 +82,34 @@ public enum PasteFormats KernelFunctionDescription = "Takes HTML data in the clipboard and transforms it to an HTML file.")] PasteAsHtmlFile, + [PasteFormatMetadata( + IsCoreAction = false, + ResourceId = "TranscodeToMp3", + IconGlyph = "\uE8D6", + RequiresAIService = false, + CanPreview = false, + SupportedClipboardFormats = ClipboardFormat.Audio | ClipboardFormat.Video, + IPCKey = AdvancedPasteTranscodeAction.PropertyNames.TranscodeToMp3, + KernelFunctionDescription = "Takes an audio or video file in the clipboard and transcodes it to MP3.")] + TranscodeToMp3, + + [PasteFormatMetadata( + IsCoreAction = false, + ResourceId = "TranscodeToMp4", + IconGlyph = "\uE714", + RequiresAIService = false, + CanPreview = false, + SupportedClipboardFormats = ClipboardFormat.Video, + IPCKey = AdvancedPasteTranscodeAction.PropertyNames.TranscodeToMp4, + KernelFunctionDescription = "Takes a video file in the clipboard and transcodes it to MP4 (H.264/AAC).")] + TranscodeToMp4, + [PasteFormatMetadata( IsCoreAction = false, IconGlyph = "\uE945", RequiresAIService = true, CanPreview = true, - SupportedClipboardFormats = ClipboardFormat.Text | ClipboardFormat.Html | ClipboardFormat.Audio | ClipboardFormat.Image, + SupportedClipboardFormats = ClipboardFormat.Text | ClipboardFormat.Html | ClipboardFormat.Audio | ClipboardFormat.Video | ClipboardFormat.Image, RequiresPrompt = true)] KernelQuery, diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/ICustomTextTransformService.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/ICustomTextTransformService.cs index 800f7b04161a..75f1df259e8c 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/ICustomTextTransformService.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/ICustomTextTransformService.cs @@ -2,11 +2,13 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; +using System.Threading; using System.Threading.Tasks; namespace AdvancedPaste.Services; public interface ICustomTextTransformService { - Task TransformTextAsync(string prompt, string inputText); + Task TransformTextAsync(string prompt, string inputText, CancellationToken cancellationToken, IProgress progress); } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/IKernelService.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/IKernelService.cs index ae99fccf443a..beb62fb293d2 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/IKernelService.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/IKernelService.cs @@ -2,6 +2,8 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; +using System.Threading; using System.Threading.Tasks; using Windows.ApplicationModel.DataTransfer; @@ -10,5 +12,5 @@ namespace AdvancedPaste.Services; public interface IKernelService { - Task TransformClipboardAsync(string prompt, DataPackageView clipboardData, bool isSavedQuery); + Task TransformClipboardAsync(string prompt, DataPackageView clipboardData, bool isSavedQuery, CancellationToken cancellationToken, IProgress progress); } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/IPasteFormatExecutor.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/IPasteFormatExecutor.cs index 9df354e3d185..3b3237faffee 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/IPasteFormatExecutor.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/IPasteFormatExecutor.cs @@ -2,6 +2,8 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Models; @@ -11,5 +13,5 @@ namespace AdvancedPaste.Services; public interface IPasteFormatExecutor { - Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteActionSource source); + Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteActionSource source, CancellationToken cancellationToken, IProgress progress); } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/IPromptModerationService.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/IPromptModerationService.cs index bd7963ac7829..f80b8d30ab7d 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/IPromptModerationService.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/IPromptModerationService.cs @@ -2,11 +2,12 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Threading; using System.Threading.Tasks; namespace AdvancedPaste.Services; public interface IPromptModerationService { - Task ValidateAsync(string fullPrompt); + Task ValidateAsync(string fullPrompt, CancellationToken cancellationToken); } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/KernelServiceBase.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/KernelServiceBase.cs index c988d2f8ced8..e921b21e54a0 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/KernelServiceBase.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/KernelServiceBase.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text.Json; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Helpers; @@ -36,12 +37,14 @@ public abstract class KernelServiceBase(IKernelQueryCacheService queryCacheServi protected abstract AIServiceUsage GetAIServiceUsage(ChatMessageContent chatMessage); - public async Task TransformClipboardAsync(string prompt, DataPackageView clipboardData, bool isSavedQuery) + public async Task TransformClipboardAsync(string prompt, DataPackageView clipboardData, bool isSavedQuery, CancellationToken cancellationToken, IProgress progress) { Logger.LogTrace(); var kernel = CreateKernel(); kernel.SetDataPackageView(clipboardData); + kernel.SetCancellationToken(cancellationToken); + kernel.SetProgress(progress); CacheKey cacheKey = new() { Prompt = prompt, AvailableFormats = await clipboardData.GetAvailableFormatsAsync() }; var maybeCacheValue = _queryCacheService.ReadOrNull(cacheKey); @@ -51,7 +54,7 @@ public async Task TransformClipboardAsync(string prompt, DataPackag try { - (chatHistory, var usage) = cacheUsed ? await ExecuteCachedActionChain(kernel, maybeCacheValue.ActionChain) : await ExecuteAICompletion(kernel, prompt); + (chatHistory, var usage) = cacheUsed ? await ExecuteCachedActionChain(kernel, maybeCacheValue.ActionChain) : await ExecuteAICompletion(kernel, prompt, cancellationToken); LogResult(cacheUsed, isSavedQuery, kernel.GetOrAddActionChain(), usage); @@ -84,7 +87,7 @@ public async Task TransformClipboardAsync(string prompt, DataPackag AdvancedPasteSemanticKernelErrorEvent errorEvent = new(ex is PasteActionModeratedException ? PasteActionModeratedException.ErrorDescription : ex.Message); PowerToysTelemetry.Log.WriteEvent(errorEvent); - if (ex is PasteActionException) + if (ex is PasteActionException or OperationCanceledException) { throw; } @@ -127,7 +130,7 @@ private static string GetFullPrompt(ChatHistory initialHistory) return $"{combinedSystemMessage}{newLine}{newLine}User instructions:{newLine}{userPromptMessage.Content}"; } - private async Task<(ChatHistory ChatHistory, AIServiceUsage Usage)> ExecuteAICompletion(Kernel kernel, string prompt) + private async Task<(ChatHistory ChatHistory, AIServiceUsage Usage)> ExecuteAICompletion(Kernel kernel, string prompt, CancellationToken cancellationToken) { ChatHistory chatHistory = []; @@ -141,10 +144,10 @@ The user will put in a request to format their clipboard data and you will fulfi chatHistory.AddSystemMessage($"Available clipboard formats: {await kernel.GetDataFormatsAsync()}"); chatHistory.AddUserMessage(prompt); - await _promptModerationService.ValidateAsync(GetFullPrompt(chatHistory)); + await _promptModerationService.ValidateAsync(GetFullPrompt(chatHistory), cancellationToken); var chatResult = await kernel.GetRequiredService() - .GetChatMessageContentAsync(chatHistory, PromptExecutionSettings, kernel); + .GetChatMessageContentAsync(chatHistory, PromptExecutionSettings, kernel, cancellationToken); chatHistory.Add(chatResult); var totalUsage = chatHistory.Select(GetAIServiceUsage) @@ -157,6 +160,8 @@ The user will put in a request to format their clipboard data and you will fulfi { foreach (var item in actionChain) { + kernel.GetCancellationToken().ThrowIfCancellationRequested(); + if (item.Arguments.Count > 0) { await ExecutePromptTransformAsync(kernel, item.Format, item.Arguments[PromptParameterName]); @@ -208,14 +213,14 @@ private Task ExecutePromptTransformAsync(Kernel kernel, PasteFormats for async dataPackageView => { var input = await dataPackageView.GetTextAsync(); - string output = await GetPromptBasedOutput(format, prompt, input); + string output = await GetPromptBasedOutput(format, prompt, input, kernel.GetCancellationToken(), kernel.GetProgress()); return DataPackageHelpers.CreateFromText(output); }); - private async Task GetPromptBasedOutput(PasteFormats format, string prompt, string input) => + private async Task GetPromptBasedOutput(PasteFormats format, string prompt, string input, CancellationToken cancellationToken, IProgress progress) => format switch { - PasteFormats.CustomTextTransformation => await _customTextTransformService.TransformTextAsync(prompt, input), + PasteFormats.CustomTextTransformation => await _customTextTransformService.TransformTextAsync(prompt, input, cancellationToken, progress), _ => throw new ArgumentException($"Unsupported format {format} for prompt transform", nameof(format)), }; @@ -223,7 +228,7 @@ private Task ExecuteStandardTransformAsync(Kernel kernel, PasteFormats f ExecuteTransformAsync( kernel, new ActionChainItem(format, Arguments: []), - async dataPackageView => await TransformHelpers.TransformAsync(format, dataPackageView)); + async dataPackageView => await TransformHelpers.TransformAsync(format, dataPackageView, kernel.GetCancellationToken(), kernel.GetProgress())); private static async Task ExecuteTransformAsync(Kernel kernel, ActionChainItem actionChainItem, Func> transformFunc) { diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/CustomTextTransformService.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/CustomTextTransformService.cs index 95823d8d246f..b6aa156b9df1 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/CustomTextTransformService.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/CustomTextTransformService.cs @@ -4,6 +4,7 @@ using System; using System.Text.Json; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Helpers; @@ -23,11 +24,11 @@ public sealed class CustomTextTransformService(IAICredentialsProvider aiCredenti private readonly IAICredentialsProvider _aiCredentialsProvider = aiCredentialsProvider; private readonly IPromptModerationService _promptModerationService = promptModerationService; - private async Task GetAICompletionAsync(string systemInstructions, string userMessage) + private async Task GetAICompletionAsync(string systemInstructions, string userMessage, CancellationToken cancellationToken) { var fullPrompt = systemInstructions + "\n\n" + userMessage; - await _promptModerationService.ValidateAsync(fullPrompt); + await _promptModerationService.ValidateAsync(fullPrompt, cancellationToken); OpenAIClient azureAIClient = new(_aiCredentialsProvider.Key); @@ -41,7 +42,8 @@ private async Task GetAICompletionAsync(string systemInstructions, }, Temperature = 0.01F, MaxTokens = 2000, - }); + }, + cancellationToken); if (response.Value.Choices[0].FinishReason == "length") { @@ -51,7 +53,7 @@ private async Task GetAICompletionAsync(string systemInstructions, return response; } - public async Task TransformTextAsync(string prompt, string inputText) + public async Task TransformTextAsync(string prompt, string inputText, CancellationToken cancellationToken, IProgress progress) { if (string.IsNullOrWhiteSpace(prompt)) { @@ -80,7 +82,7 @@ public async Task TransformTextAsync(string prompt, string inputText) try { - var response = await GetAICompletionAsync(systemInstructions, userMessage); + var response = await GetAICompletionAsync(systemInstructions, userMessage, cancellationToken); var usage = response.Usage; AdvancedPasteGenerateCustomFormatEvent telemetryEvent = new(usage.PromptTokens, usage.CompletionTokens, ModelName); @@ -98,7 +100,7 @@ public async Task TransformTextAsync(string prompt, string inputText) AdvancedPasteGenerateCustomErrorEvent errorEvent = new(ex is PasteActionModeratedException ? PasteActionModeratedException.ErrorDescription : ex.Message); PowerToysTelemetry.Log.WriteEvent(errorEvent); - if (ex is PasteActionException) + if (ex is PasteActionException or OperationCanceledException) { throw; } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/PromptModerationService.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/PromptModerationService.cs index e78a44b533a1..0ca15e4161de 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/PromptModerationService.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/OpenAI/PromptModerationService.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System.ClientModel; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Helpers; @@ -18,12 +19,12 @@ public sealed class PromptModerationService(IAICredentialsProvider aiCredentials private readonly IAICredentialsProvider _aiCredentialsProvider = aiCredentialsProvider; - public async Task ValidateAsync(string fullPrompt) + public async Task ValidateAsync(string fullPrompt, CancellationToken cancellationToken) { try { ModerationClient moderationClient = new(ModelName, _aiCredentialsProvider.Key); - var moderationClientResult = await moderationClient.ClassifyTextAsync(fullPrompt); + var moderationClientResult = await moderationClient.ClassifyTextAsync(fullPrompt, cancellationToken); var moderationResult = moderationClientResult.Value; Logger.LogDebug($"{nameof(PromptModerationService)}.{nameof(ValidateAsync)} complete; {nameof(moderationResult.Flagged)}={moderationResult.Flagged}"); diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Services/PasteFormatExecutor.cs b/src/modules/AdvancedPaste/AdvancedPaste/Services/PasteFormatExecutor.cs index e7e7f9b4cf89..5d6740977bb5 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Services/PasteFormatExecutor.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/Services/PasteFormatExecutor.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Helpers; @@ -17,7 +18,7 @@ public sealed class PasteFormatExecutor(IKernelService kernelService, ICustomTex private readonly IKernelService _kernelService = kernelService; private readonly ICustomTextTransformService _customTextTransformService = customTextTransformService; - public async Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteActionSource source) + public async Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteActionSource source, CancellationToken cancellationToken, IProgress progress) { if (!pasteFormat.IsEnabled) { @@ -34,9 +35,9 @@ public async Task ExecutePasteFormatAsync(PasteFormat pasteFormat, return await Task.Run(async () => pasteFormat.Format switch { - PasteFormats.KernelQuery => await _kernelService.TransformClipboardAsync(pasteFormat.Prompt, clipboardData, pasteFormat.IsSavedQuery), - PasteFormats.CustomTextTransformation => DataPackageHelpers.CreateFromText(await _customTextTransformService.TransformTextAsync(pasteFormat.Prompt, await clipboardData.GetTextAsync())), - _ => await TransformHelpers.TransformAsync(format, clipboardData), + PasteFormats.KernelQuery => await _kernelService.TransformClipboardAsync(pasteFormat.Prompt, clipboardData, pasteFormat.IsSavedQuery, cancellationToken, progress), + PasteFormats.CustomTextTransformation => DataPackageHelpers.CreateFromText(await _customTextTransformService.TransformTextAsync(pasteFormat.Prompt, await clipboardData.GetTextAsync(), cancellationToken, progress)), + _ => await TransformHelpers.TransformAsync(format, clipboardData, cancellationToken, progress), }); } diff --git a/src/modules/AdvancedPaste/AdvancedPaste/Strings/en-us/Resources.resw b/src/modules/AdvancedPaste/AdvancedPaste/Strings/en-us/Resources.resw index 1c2839d06424..30b46190e329 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/Strings/en-us/Resources.resw +++ b/src/modules/AdvancedPaste/AdvancedPaste/Strings/en-us/Resources.resw @@ -135,6 +135,9 @@ OpenAI request failed with status code: + + The paste operation was canceled + An error occurred during the paste operation @@ -188,7 +191,19 @@ Paste as .html file + + + Transcode to .mp3 + + Transcode to .mp4 (H.264/AAC) + + + An error occurred while transcoding media file + + + The media file contains an unsupported codec + Paste @@ -207,6 +222,9 @@ Generate and paste data + + Cancel paste operation + Regenerate @@ -216,6 +234,9 @@ Generate and paste data + + Cancel paste operation + Open settings diff --git a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs index 30e4a6f359eb..688c3047e236 100644 --- a/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs +++ b/src/modules/AdvancedPaste/AdvancedPaste/ViewModels/OptionsViewModel.cs @@ -8,6 +8,8 @@ using System.Diagnostics; using System.IO.Abstractions; using System.Linq; +using System.Runtime.InteropServices; +using System.Threading; using System.Threading.Tasks; using AdvancedPaste.Helpers; @@ -29,7 +31,7 @@ namespace AdvancedPaste.ViewModels { - public sealed partial class OptionsViewModel : ObservableObject, IDisposable + public sealed partial class OptionsViewModel : ObservableObject, IProgress, IDisposable { private readonly DispatcherQueue _dispatcherQueue = DispatcherQueue.GetForCurrentThread(); private readonly DispatcherTimer _clipboardTimer; @@ -37,6 +39,8 @@ public sealed partial class OptionsViewModel : ObservableObject, IDisposable private readonly IPasteFormatExecutor _pasteFormatExecutor; private readonly IAICredentialsProvider _aiCredentialsProvider; + private CancellationTokenSource _pasteActionCancellationTokenSource; + public DataPackageView ClipboardData { get; set; } [ObservableProperty] @@ -65,7 +69,11 @@ public sealed partial class OptionsViewModel : ObservableObject, IDisposable private bool _pasteFormatsDirty; [ObservableProperty] - private bool _busy; + private bool _isBusy; + + [ObservableProperty] + [NotifyPropertyChangedFor(nameof(HasIndeterminateTransformProgress))] + private double _transformProgress = double.NaN; public ObservableCollection StandardPasteFormats { get; } = []; @@ -81,9 +89,24 @@ public sealed partial class OptionsViewModel : ObservableObject, IDisposable public bool ClipboardHasDataForCustomAI => PasteFormat.SupportsClipboardFormats(CustomAIFormat, AvailableClipboardFormats); + public bool HasIndeterminateTransformProgress => double.IsNaN(TransformProgress); + private PasteFormats CustomAIFormat => _userSettings.IsAdvancedAIEnabled ? PasteFormats.KernelQuery : PasteFormats.CustomTextTransformation; - private bool Visible => GetMainWindow()?.Visible is true; + private bool Visible + { + get + { + try + { + return GetMainWindow()?.Visible is true; + } + catch (COMException) + { + return false; // window is closed + } + } + } public event EventHandler PreviewRequested; @@ -189,7 +212,12 @@ orderby pasteFormat.IsEnabled descending void UpdateFormats(ObservableCollection collection, IEnumerable pasteFormats) { - collection.Clear(); + // Hack: Clear collection via repeated RemoveAt to avoid this crash, which seems to occasionally occur when using Clear: + // https://github.com/microsoft/microsoft-ui-xaml/issues/8684 + while (collection.Count > 0) + { + collection.RemoveAt(collection.Count - 1); + } foreach (var format in FilterAndSort(pasteFormats)) { @@ -214,12 +242,13 @@ void UpdateFormats(ObservableCollection collection, IEnumerable package.GetView().TryCleanupAfterDelayAsync(TimeSpan.FromSeconds(30))); } // Command to select the previous custom format @@ -362,7 +395,7 @@ internal async Task ExecutePasteFormatAsync(PasteFormats format, PasteActionSour internal async Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteActionSource source) { - if (Busy) + if (IsBusy) { Logger.LogWarning($"Execution of {pasteFormat.Format} from {source} suppressed as busy"); return; @@ -377,16 +410,18 @@ internal async Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteAction var elapsedWatch = Stopwatch.StartNew(); Logger.LogDebug($"Started executing {pasteFormat.Format} from source {source}"); - Busy = true; + IsBusy = true; + _pasteActionCancellationTokenSource = new(); + TransformProgress = double.NaN; PasteActionError = PasteActionError.None; Query = pasteFormat.Query; try { // Minimum time to show busy spinner for AI actions when triggered by global keyboard shortcut. - var aiActionMinTaskTime = TimeSpan.FromSeconds(2); + var aiActionMinTaskTime = TimeSpan.FromSeconds(1.5); var delayTask = (Visible && source == PasteActionSource.GlobalKeyboardShortcut) ? Task.Delay(aiActionMinTaskTime) : Task.CompletedTask; - var dataPackage = await _pasteFormatExecutor.ExecutePasteFormatAsync(pasteFormat, source); + var dataPackage = await _pasteFormatExecutor.ExecutePasteFormatAsync(pasteFormat, source, _pasteActionCancellationTokenSource.Token, this); await delayTask; @@ -410,7 +445,9 @@ internal async Task ExecutePasteFormatAsync(PasteFormat pasteFormat, PasteAction PasteActionError = PasteActionError.FromException(ex); } - Busy = false; + IsBusy = false; + _pasteActionCancellationTokenSource?.Dispose(); + _pasteActionCancellationTokenSource = null; elapsedWatch.Stop(); Logger.LogDebug($"Finished executing {pasteFormat.Format} from source {source}; timeTakenMs={elapsedWatch.ElapsedMilliseconds}"); } @@ -484,5 +521,26 @@ private bool UpdateOpenAIKey() return IsAllowedByGPO && _aiCredentialsProvider.Refresh(); } + + public async Task CancelPasteActionAsync() + { + if (_pasteActionCancellationTokenSource != null) + { + await _pasteActionCancellationTokenSource.CancelAsync(); + } + } + + void IProgress.Report(double value) + { + ReportProgress(value); + } + + private void ReportProgress(double value) + { + _dispatcherQueue.TryEnqueue(() => + { + TransformProgress = value; + }); + } } } diff --git a/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/trace.cpp b/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/trace.cpp index c5af4f231e89..c6b1bfa0a9cd 100644 --- a/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/trace.cpp +++ b/src/modules/AdvancedPaste/AdvancedPasteModuleInterface/trace.cpp @@ -88,6 +88,8 @@ void Trace::AdvancedPaste_SettingsTelemetry(const PowertoyModuleIface::Hotkey& p TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"ImageToText"), "ImageToTextHotkey"), TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"PasteAsTxtFile"), "PasteAsTxtFileHotkey"), TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"PasteAsPngFile"), "PasteAsPngFileHotkey"), - TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"PasteAsHtmlFile"), "PasteAsHtmlFileHotkey") + TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"PasteAsHtmlFile"), "PasteAsHtmlFileHotkey"), + TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"TranscodeToMp3"), "TranscodeToMp3Hotkey"), + TraceLoggingWideString(getAdditionalActionHotkeyCStr(L"TranscodeToMp4"), "TranscodeToMp4Hotkey") ); } diff --git a/src/modules/Hosts/Hosts.FuzzTests/Fuzz.md b/src/modules/Hosts/Hosts.FuzzTests/Fuzz.md new file mode 100644 index 000000000000..5cb9ab162826 --- /dev/null +++ b/src/modules/Hosts/Hosts.FuzzTests/Fuzz.md @@ -0,0 +1,35 @@ +# Create Fuzzing Tests in your .NET Code Project + +This document provides a step-by-step guide for integrating fuzzing tests into your .NET project. + +### Step1: Add a Fuzzing Test Project +Create a new test project within your module folder. Ensure the project name follows the format *.FuzzTests*. + +### step2: Add FuzzTests and OneFuzzConfig.json to your fuzzing test project +Follow the instructions in [Fuzz.md](https://github.com/microsoft/PowerToys/blob/main/src/modules/AdvancedPaste/AdvancedPaste.FuzzTests/Fuzz.md) from AdvancedPaste.FuzzTests to properly integrate fuzzing tests into your project. + +Configuring **OneFuzzConfig.json**: +1. Update the dll, class, method, and FuzzingTargetBinaries field in the fuzzers list. +2. Modify the AssignedTo field in the adoTemplate list. +3. Set the jobNotificationEmail to your Microsoft email account. +4. Update the projectName and targetName fields in the oneFuzzJobs list. +5. Define job dependencies in the following directory: +Example: +```PowerToys\x64\Debug\tests\Hosts.FuzzTests\net8.0-windows10.0.19041.0``` + + +# step3: Configure the OneFuzz Pipeline +Modify the patterns in the job steps within [job-fuzz.yml](https://github.com/microsoft/PowerToys/blob/main/.pipelines/v2/templates/job-fuzz.yml) to match your fuzzing project name. + +Example: +``` + - download: current + displayName: Download artifacts + artifact: $(ArtifactName) + patterns: |- + **/tests/Hosts.FuzzTests/** +``` + + +# step4: Submit OneFuzz Pipeline and Verify Results on the OneFuzz Platform +After executing the tests, check your email for the job link. Click the link to review the fuzzing test results. \ No newline at end of file diff --git a/src/modules/Hosts/Hosts.FuzzTests/FuzzTests.cs b/src/modules/Hosts/Hosts.FuzzTests/FuzzTests.cs new file mode 100644 index 000000000000..36c7705549ed --- /dev/null +++ b/src/modules/Hosts/Hosts.FuzzTests/FuzzTests.cs @@ -0,0 +1,101 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +using System; +using System.IO; +using System.IO.Abstractions.TestingHelpers; +using System.Text.RegularExpressions; +using System.Threading.Tasks; + +using Hosts.Tests.Mocks; +using HostsUILib.Helpers; +using HostsUILib.Models; +using HostsUILib.Settings; +using Moq; + +namespace Hosts.FuzzTests +{ + public class FuzzTests + { + private static Mock _userSettings; + private static Mock _elevationHelper; + + // Case1: Fuzzing method for ValidIPv4 + public static void FuzzValidIPv4(ReadOnlySpan input) + { + try + { + string address = System.Text.Encoding.UTF8.GetString(input); + bool isValid = ValidationHelper.ValidIPv4(address); + } + catch (Exception ex) when (ex is RegexMatchTimeoutException) + { + throw; + } + } + + // Case2: fuzzing method for ValidIPv6 + public static void FuzzValidIPv6(ReadOnlySpan input) + { + try + { + string address = System.Text.Encoding.UTF8.GetString(input); + bool isValid = ValidationHelper.ValidIPv6(address); + } + catch (Exception ex) when (ex is RegexMatchTimeoutException) + { + throw; + } + } + + // Case3: fuzzing method for ValidHosts + public static void FuzzValidHosts(ReadOnlySpan input) + { + try + { + string hosts = System.Text.Encoding.UTF8.GetString(input); + bool isValid = ValidationHelper.ValidHosts(hosts, true); + } + catch (Exception ex) when (ex is RegexMatchTimeoutException) + { + // It's important to filter out any *expected* exceptions from our code here. + // However, catching all exceptions is considered an anti-pattern because it may suppress legitimate + // issues, such as a NullReferenceException thrown by our code. In this case, we still re-throw + // the exception, as the ToJsonFromXmlOrCsvAsync method is not expected to throw any exceptions. + throw; + } + } + + public static void FuzzWriteAsync(ReadOnlySpan data) + { + try + { + _userSettings = new Mock(); + _elevationHelper = new Mock(); + _elevationHelper.Setup(m => m.IsElevated).Returns(true); + + var fileSystem = new CustomMockFileSystem(); + var service = new HostsService(fileSystem, _userSettings.Object, _elevationHelper.Object); + + string input = System.Text.Encoding.UTF8.GetString(data); + + // Since the WriteAsync method does not involve content parsing, we won't fuzz the additionalLines in the hosts file. + string additionalLines = " "; + string hosts = input; + string address = input; + string comments = input; + var entries = new List + { + new Entry(1, hosts, address, comments, true), + }; + + // fuzzing WriteAsync + _ = Task.Run(async () => await service.WriteAsync(additionalLines, entries)); + } + catch (Exception ex) when (ex is ArgumentException) + { + throw; + } + } + } +} diff --git a/src/modules/Hosts/Hosts.FuzzTests/Hosts.FuzzTests.csproj b/src/modules/Hosts/Hosts.FuzzTests/Hosts.FuzzTests.csproj new file mode 100644 index 000000000000..714b9ec3acd8 --- /dev/null +++ b/src/modules/Hosts/Hosts.FuzzTests/Hosts.FuzzTests.csproj @@ -0,0 +1,51 @@ + + + net8.0-windows10.0.19041.0 + latest + enable + + + + ..\..\..\..\$(Platform)\$(Configuration)\tests\Hosts.FuzzTests\ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PreserveNewest + + + + diff --git a/src/modules/Hosts/Hosts.FuzzTests/MSTestSettings.cs b/src/modules/Hosts/Hosts.FuzzTests/MSTestSettings.cs new file mode 100644 index 000000000000..5b05c0b86e3f --- /dev/null +++ b/src/modules/Hosts/Hosts.FuzzTests/MSTestSettings.cs @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +[assembly: Parallelize(Scope = ExecutionScope.MethodLevel)] diff --git a/src/modules/Hosts/Hosts.FuzzTests/OneFuzzConfig.json b/src/modules/Hosts/Hosts.FuzzTests/OneFuzzConfig.json new file mode 100644 index 000000000000..f091a1ed0014 --- /dev/null +++ b/src/modules/Hosts/Hosts.FuzzTests/OneFuzzConfig.json @@ -0,0 +1,178 @@ +{ + "configVersion": 3, + "entries": [ + { + "fuzzer": { + "$type": "libfuzzerDotNet", + "dll": "Hosts.FuzzTests.dll", + "class": "Hosts.FuzzTests.FuzzTests", + "method": "FuzzValidIPv4", + "FuzzingTargetBinaries": [ + "PowerToys.Hosts.dll" + ] + }, + "adoTemplate": { + // supply the values appropriate to your + // project, where bugs will be filed + "org": "microsoft", + "project": "OS", + "AssignedTo": "mengyuanchen@microsoft.com", + "AreaPath": "OS\\Windows Client and Services\\WinPD\\DEEP-Developer Experience, Ecosystem and Partnerships\\SHINE\\PowerToys", + "IterationPath": "OS\\Future" + }, + "jobNotificationEmail": "mengyuanchen@microsoft.com", + "skip": false, + "rebootAfterSetup": false, + "oneFuzzJobs": [ + // at least one job is required + { + "projectName": "Hosts", + "targetName": "Hosts-dotnet-fuzzer-Ipv4" + } + ], + "jobDependencies": [ + // this should contain, at minimum, + // the DLL and PDB files + // you will need to add any other files required + // (globs are supported) + "Hosts.FuzzTests.dll", + "Hosts.FuzzTests.pdb", + "Microsoft.Windows.SDK.NET.dll", + "WinRT.Runtime.dll" + ], + "SdlWorkItemId": 49911822 + }, + { + "fuzzer": { + "$type": "libfuzzerDotNet", + "dll": "Hosts.FuzzTests.dll", + "class": "Hosts.FuzzTests.FuzzTests", + "method": "FuzzValidIPv6", + "FuzzingTargetBinaries": [ + "PowerToys.Hosts.dll" + ] + }, + "adoTemplate": { + // supply the values appropriate to your + // project, where bugs will be filed + "org": "microsoft", + "project": "OS", + "AssignedTo": "mengyuanchen@microsoft.com", + "AreaPath": "OS\\Windows Client and Services\\WinPD\\DEEP-Developer Experience, Ecosystem and Partnerships\\SHINE\\PowerToys", + "IterationPath": "OS\\Future" + }, + "jobNotificationEmail": "mengyuanchen@microsoft.com", + "skip": false, + "rebootAfterSetup": false, + "oneFuzzJobs": [ + // at least one job is required + { + "projectName": "Hosts", + "targetName": "Hosts-dotnet-fuzzer-Ipv6" + } + ], + "jobDependencies": [ + // this should contain, at minimum, + // the DLL and PDB files + // you will need to add any other files required + // (globs are supported) + "Hosts.FuzzTests.dll", + "Hosts.FuzzTests.pdb", + "Microsoft.Windows.SDK.NET.dll", + "WinRT.Runtime.dll" + ], + "SdlWorkItemId": 49911822 + }, + { + "fuzzer": { + "$type": "libfuzzerDotNet", + "dll": "Hosts.FuzzTests.dll", + "class": "Hosts.FuzzTests.FuzzTests", + "method": "FuzzValidHosts", + "FuzzingTargetBinaries": [ + "PowerToys.Hosts.dll" + ] + }, + "adoTemplate": { + // supply the values appropriate to your + // project, where bugs will be filed + "org": "microsoft", + "project": "OS", + "AssignedTo": "mengyuanchen@microsoft.com", + "AreaPath": "OS\\Windows Client and Services\\WinPD\\DEEP-Developer Experience, Ecosystem and Partnerships\\SHINE\\PowerToys", + "IterationPath": "OS\\Future" + }, + "jobNotificationEmail": "mengyuanchen@microsoft.com", + "skip": false, + "rebootAfterSetup": false, + "oneFuzzJobs": [ + // at least one job is required + { + "projectName": "Hosts", + "targetName": "Hosts-dotnet-fuzzer-hosts" + } + ], + "jobDependencies": [ + // this should contain, at minimum, + // the DLL and PDB files + // you will need to add any other files required + // (globs are supported) + "Hosts.FuzzTests.dll", + "Hosts.FuzzTests.pdb", + "Microsoft.Windows.SDK.NET.dll", + "WinRT.Runtime.dll" + ], + "SdlWorkItemId": 49911822 + }, + { + "fuzzer": { + "$type": "libfuzzerDotNet", + "dll": "Hosts.FuzzTests.dll", + "class": "Hosts.FuzzTests.FuzzTests", + "method": "FuzzWriteAsync", + "FuzzingTargetBinaries": [ + "PowerToys.Hosts.dll" + ] + }, + "adoTemplate": { + // supply the values appropriate to your + // project, where bugs will be filed + "org": "microsoft", + "project": "OS", + "AssignedTo": "mengyuanchen@microsoft.com", + "AreaPath": "OS\\Windows Client and Services\\WinPD\\DEEP-Developer Experience, Ecosystem and Partnerships\\SHINE\\PowerToys", + "IterationPath": "OS\\Future" + }, + "jobNotificationEmail": "mengyuanchen@microsoft.com", + "skip": false, + "rebootAfterSetup": false, + "oneFuzzJobs": [ + // at least one job is required + { + "projectName": "Hosts", + "targetName": "Hosts-dotnet-fuzzer-WriteAsync" + } + ], + "jobDependencies": [ + // this should contain, at minimum, + // the DLL and PDB files + // you will need to add any other files required + // (globs are supported) + "Hosts.FuzzTests.dll", + "Hosts.FuzzTests.pdb", + "Microsoft.Windows.SDK.NET.dll", + "WinRT.Runtime.dll", + "Moq.dll", + "testhost.dll", + "Castle.Core.dll", + "System.IO.Abstractions.dll", + "CommunityToolkit.Mvvm.dll", + "System.IO.Abstractions.TestingHelpers.dll", + "TestableIO.System.IO.Abstractions.dll", + "TestableIO.System.IO.Abstractions.TestingHelpers.dll", + "TestableIO.System.IO.Abstractions.Wrappers.dll" + ], + "SdlWorkItemId": 49911822 + } + ] +} \ No newline at end of file diff --git a/src/modules/Hosts/Hosts.UITests/HostModuleTests.cs b/src/modules/Hosts/Hosts.UITests/HostModuleTests.cs new file mode 100644 index 000000000000..35d49a5b64cd --- /dev/null +++ b/src/modules/Hosts/Hosts.UITests/HostModuleTests.cs @@ -0,0 +1,108 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Threading.Tasks; +using Microsoft.PowerToys.UITest; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace Hosts.UITests +{ + [TestClass] + public class HostModuleTests : UITestBase + { + public HostModuleTests() + : base(PowerToysModule.Hosts) + { + } + + /// + /// Test if Empty-view is shown when no entries are present. + /// And 'Add an entry' button from Empty-view is functional. + /// + [TestMethod] + public void TestEmptyView() + { + this.CloseWarningDialog(); + this.RemoveAllEntries(); + + // 'Add an entry' button (only show-up when list is empty) should be visible + Assert.IsTrue(this.FindAll + + diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/MainWindow.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/MainWindow.xaml.cs new file mode 100644 index 000000000000..2fa4779c19d6 --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/MainWindow.xaml.cs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.WindowsRuntime; +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; +using Microsoft.UI.Xaml.Controls.Primitives; +using Microsoft.UI.Xaml.Data; +using Microsoft.UI.Xaml.Input; +using Microsoft.UI.Xaml.Media; +using Microsoft.UI.Xaml.Navigation; +using Windows.Foundation; +using Windows.Foundation.Collections; + +namespace KeyboardManagerEditorUI +{ + /// + /// An empty window that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainWindow : Window + { + [DllImport("KeyboardManagerEditorLibraryWrapper.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool CheckIfRemappingsAreValid(); + + public MainWindow() + { + this.InitializeComponent(); + } + + private void MyButton_Click(object sender, RoutedEventArgs e) + { + // Call the C++ function to check if the current remappings are valid + myButton.Content = CheckIfRemappingsAreValid() ? "Valid" : "Invalid"; + } + } +} diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Package.appxmanifest b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Package.appxmanifest new file mode 100644 index 000000000000..a85dcbffdb81 --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Package.appxmanifest @@ -0,0 +1,51 @@ + + + + + + + + + + KeyboardManagerEditorUI + haoliuu + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/app.manifest b/src/modules/keyboardmanager/KeyboardManagerEditorUI/app.manifest new file mode 100644 index 000000000000..33aafc9c3e6a --- /dev/null +++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/app.manifest @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + PerMonitorV2 + + + diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs index 594773c36bc8..efd6b062007c 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/ExtendedCalculatorParserTests.cs @@ -341,5 +341,92 @@ public void UpdateTrigFunctions_Gradians(string input, string expectedResult) Assert.IsNotNull(result); Assert.AreEqual(expectedResult, result); } + + [DataTestMethod] + [DataRow("rad(30)", "(180 / pi) * (30)")] + [DataRow("rad( 30 )", "(180 / pi) * ( 30 )")] + [DataRow("deg(30)", "(30)")] + [DataRow("grad(30)", "(9 / 10) * (30)")] + [DataRow("rad( 30)", "(180 / pi) * ( 30)")] + [DataRow("rad(30 )", "(180 / pi) * (30 )")] + [DataRow("rad( 30 )", "(180 / pi) * ( 30 )")] + [DataRow("rad(deg(30))", "(180 / pi) * ((30))")] + [DataRow("deg(rad(30))", "((180 / pi) * (30))")] + [DataRow("grad(rad(30))", "(9 / 10) * ((180 / pi) * (30))")] + [DataRow("rad(grad(30))", "(180 / pi) * ((9 / 10) * (30))")] + [DataRow("rad(30) + deg(45)", "(180 / pi) * (30) + (45)")] + [DataRow("sin(rad(30))", "sin((180 / pi) * (30))")] + [DataRow("cos( rad( 45 ) )", "cos( (180 / pi) * ( 45 ) )")] + [DataRow("tan(rad(grad(90)))", "tan((180 / pi) * ((9 / 10) * (90)))")] + [DataRow("rad(30) + rad(45)", "(180 / pi) * (30) + (180 / pi) * (45)")] + [DataRow("rad(30) * grad(90)", "(180 / pi) * (30) * (9 / 10) * (90)")] + [DataRow("rad(30)/rad(45)", "(180 / pi) * (30)/(180 / pi) * (45)")] + public void ExpandTrigConversions_Degrees(string input, string expectedResult) + { + // Call ExpandTrigConversions in degrees mode + string result = CalculateHelper.ExpandTrigConversions(input, CalculateEngine.TrigMode.Degrees); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(expectedResult, result); + } + + [DataTestMethod] + [DataRow("rad(30)", "(30)")] + [DataRow("rad( 30 )", "( 30 )")] + [DataRow("deg(30)", "(pi / 180) * (30)")] + [DataRow("grad(30)", "(pi / 200) * (30)")] + [DataRow("rad( 30)", "( 30)")] + [DataRow("rad(30 )", "(30 )")] + [DataRow("rad( 30 )", "( 30 )")] + [DataRow("rad(deg(30))", "((pi / 180) * (30))")] + [DataRow("deg(rad(30))", "(pi / 180) * ((30))")] + [DataRow("grad(rad(30))", "(pi / 200) * ((30))")] + [DataRow("rad(grad(30))", "((pi / 200) * (30))")] + [DataRow("rad(30) + deg(45)", "(30) + (pi / 180) * (45)")] + [DataRow("sin(rad(30))", "sin((30))")] + [DataRow("cos( rad( 45 ) )", "cos( ( 45 ) )")] + [DataRow("tan(rad(grad(90)))", "tan(((pi / 200) * (90)))")] + [DataRow("rad(30) + rad(45)", "(30) + (45)")] + [DataRow("rad(30) * grad(90)", "(30) * (pi / 200) * (90)")] + [DataRow("rad(30)/rad(45)", "(30)/(45)")] + public void ExpandTrigConversions_Radians(string input, string expectedResult) + { + // Call ExpandTrigConversions in radians mode + string result = CalculateHelper.ExpandTrigConversions(input, CalculateEngine.TrigMode.Radians); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(expectedResult, result); + } + + [DataTestMethod] + [DataRow("rad(30)", "(200 / pi) * (30)")] + [DataRow("rad( 30 )", "(200 / pi) * ( 30 )")] + [DataRow("deg(30)", "(10 / 9) * (30)")] + [DataRow("grad(30)", "(30)")] + [DataRow("rad( 30)", "(200 / pi) * ( 30)")] + [DataRow("rad(30 )", "(200 / pi) * (30 )")] + [DataRow("rad( 30 )", "(200 / pi) * ( 30 )")] + [DataRow("rad(deg(30))", "(200 / pi) * ((10 / 9) * (30))")] + [DataRow("deg(rad(30))", "(10 / 9) * ((200 / pi) * (30))")] + [DataRow("grad(rad(30))", "((200 / pi) * (30))")] + [DataRow("rad(grad(30))", "(200 / pi) * ((30))")] + [DataRow("rad(30) + deg(45)", "(200 / pi) * (30) + (10 / 9) * (45)")] + [DataRow("sin(rad(30))", "sin((200 / pi) * (30))")] + [DataRow("cos( rad( 45 ) )", "cos( (200 / pi) * ( 45 ) )")] + [DataRow("tan(rad(grad(90)))", "tan((200 / pi) * ((90)))")] + [DataRow("rad(30) + rad(45)", "(200 / pi) * (30) + (200 / pi) * (45)")] + [DataRow("rad(30) * grad(90)", "(200 / pi) * (30) * (90)")] + [DataRow("rad(30)/rad(45)", "(200 / pi) * (30)/(200 / pi) * (45)")] + public void ExpandTrigConversions_Gradians(string input, string expectedResult) + { + // Call ExpandTrigConversions in gradians mode + string result = CalculateHelper.ExpandTrigConversions(input, CalculateEngine.TrigMode.Gradians); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(expectedResult, result); + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs index 4a597cf9176e..c3f5de7f0222 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs @@ -74,6 +74,7 @@ public void Translate_WhenCalledEmpty(string input) [DataRow("5,2+6", "5.2+6")] [DataRow("round(2,5)", "round(2.5)")] [DataRow("3,3333", "3.3333")] + [DataRow("max(2;3)", "max(2,3)")] public void Translate_NoErrors_WhenCalled(string input, string expectedResult) { // Arrange diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs index 9248e3ca89b0..ef7e84fbd84a 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateEngine.cs @@ -59,8 +59,14 @@ public CalculateResult Interpret(string input, CultureInfo cultureInfo, out stri input = CalculateHelper.FixHumanMultiplicationExpressions(input); + // Get the user selected trigonometry unit + TrigMode trigMode = Main.GetTrigMode(); + // Modify trig functions depending on angle unit setting - input = CalculateHelper.UpdateTrigFunctions(input, Main.GetTrigMode()); + input = CalculateHelper.UpdateTrigFunctions(input, trigMode); + + // Expand conversions between trig units + input = CalculateHelper.ExpandTrigConversions(input, trigMode); var result = _magesEngine.Interpret(input); diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs index 95705a34ca13..e35d706a261e 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/CalculateHelper.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.Text.RegularExpressions; +using static Microsoft.PowerToys.Run.Plugin.Calculator.CalculateEngine; namespace Microsoft.PowerToys.Run.Plugin.Calculator { @@ -18,6 +19,7 @@ public static class CalculateHelper @"factorial\s*\(|sign\s*\(|round\s*\(|rand\s*\(\)|randi\s*\([^\)]|" + @"sin\s*\(|cos\s*\(|tan\s*\(|arcsin\s*\(|arccos\s*\(|arctan\s*\(|" + @"sinh\s*\(|cosh\s*\(|tanh\s*\(|arsinh\s*\(|arcosh\s*\(|artanh\s*\(|" + + @"rad\s*\(|deg\s*\(|grad\s*\(|" + /* trigonometry unit conversion macros */ @"pi|" + @"==|~=|&&|\|\||" + @"((-?(\d+(\.\d*)?)|-?(\.\d+))[Ee](-?\d+))|" + /* expression from CheckScientificNotation between parenthesis */ @@ -26,7 +28,9 @@ public static class CalculateHelper RegexOptions.Compiled); private const string DegToRad = "(pi / 180) * "; + private const string DegToGrad = "(10 / 9) * "; private const string GradToRad = "(pi / 200) * "; + private const string GradToDeg = "(9 / 10) * "; private const string RadToDeg = "(180 / pi) * "; private const string RadToGrad = "(200 / pi) * "; @@ -266,10 +270,10 @@ private static string ModifyTrigFunction(string input, string function, string m return input; } - public static string UpdateTrigFunctions(string input, CalculateEngine.TrigMode mode) + public static string UpdateTrigFunctions(string input, TrigMode mode) { string modifiedInput = input; - if (mode == CalculateEngine.TrigMode.Degrees) + if (mode == TrigMode.Degrees) { modifiedInput = ModifyTrigFunction(modifiedInput, "sin", DegToRad); modifiedInput = ModifyTrigFunction(modifiedInput, "cos", DegToRad); @@ -278,7 +282,7 @@ public static string UpdateTrigFunctions(string input, CalculateEngine.TrigMode modifiedInput = ModifyTrigFunction(modifiedInput, "arccos", RadToDeg); modifiedInput = ModifyTrigFunction(modifiedInput, "arctan", RadToDeg); } - else if (mode == CalculateEngine.TrigMode.Gradians) + else if (mode == TrigMode.Gradians) { modifiedInput = ModifyTrigFunction(modifiedInput, "sin", GradToRad); modifiedInput = ModifyTrigFunction(modifiedInput, "cos", GradToRad); @@ -290,5 +294,39 @@ public static string UpdateTrigFunctions(string input, CalculateEngine.TrigMode return modifiedInput; } + + private static string ModifyMathFunction(string input, string function, string modification) + { + // Create the pattern to match the function, opening bracket, and any spaces in between + string pattern = $@"{function}\s*\("; + return Regex.Replace(input, pattern, modification + "("); + } + + public static string ExpandTrigConversions(string input, TrigMode mode) + { + string modifiedInput = input; + + // Expand "rad", "deg" and "grad" to their respective conversions for the current trig unit + if (mode == TrigMode.Radians) + { + modifiedInput = ModifyMathFunction(modifiedInput, "deg", DegToRad); + modifiedInput = ModifyMathFunction(modifiedInput, "grad", GradToRad); + modifiedInput = ModifyMathFunction(modifiedInput, "rad", string.Empty); + } + else if (mode == TrigMode.Degrees) + { + modifiedInput = ModifyMathFunction(modifiedInput, "deg", string.Empty); + modifiedInput = ModifyMathFunction(modifiedInput, "grad", GradToDeg); + modifiedInput = ModifyMathFunction(modifiedInput, "rad", RadToDeg); + } + else if (mode == TrigMode.Gradians) + { + modifiedInput = ModifyMathFunction(modifiedInput, "deg", DegToGrad); + modifiedInput = ModifyMathFunction(modifiedInput, "grad", string.Empty); + modifiedInput = ModifyMathFunction(modifiedInput, "rad", RadToGrad); + } + + return modifiedInput; + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs index 5de28ba775ef..946198e1227b 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs @@ -123,7 +123,7 @@ private static string Translate(string input, CultureInfo cultureFrom, CultureIn outputBuilder.Append( decimal.TryParse(token, NumberStyles.Number, cultureFrom, out number) ? (new string('0', leadingZeroCount) + number.ToString(cultureTo)) - : token); + : token.Replace(cultureFrom.TextInfo.ListSeparator, cultureTo.TextInfo.ListSeparator)); } } diff --git a/src/modules/launcher/PowerLauncher/Helper/ThemeExtensions.cs b/src/modules/launcher/PowerLauncher/Helper/ThemeExtensions.cs deleted file mode 100644 index 8332f9f0dcb9..000000000000 --- a/src/modules/launcher/PowerLauncher/Helper/ThemeExtensions.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Globalization; -using System.Linq; - -using ManagedCommon; -using Microsoft.Win32; - -namespace PowerLauncher.Helper -{ - public static class ThemeExtensions - { - public static Theme GetCurrentTheme() - { - // Check for high-contrast mode - Theme highContrastTheme = GetHighContrastBaseType(); - if (highContrastTheme != Theme.Light) - { - return highContrastTheme; - } - - // Check if the system is using dark or light mode - return IsSystemDarkMode() ? Theme.Dark : Theme.Light; - } - - private static bool IsSystemDarkMode() - { - const string registryKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"; - const string registryValue = "AppsUseLightTheme"; - - // Retrieve the registry value, which is a DWORD (0 or 1) - object registryValueObj = Registry.GetValue(registryKey, registryValue, null); - if (registryValueObj != null) - { - // 0 = Dark mode, 1 = Light mode - bool isLightMode = Convert.ToBoolean((int)registryValueObj, CultureInfo.InvariantCulture); - return !isLightMode; // Invert because 0 = Dark - } - else - { - // Default to Light theme if the registry key is missing - return false; // Default to dark mode assumption - } - } - - public static Theme GetHighContrastBaseType() - { - const string registryKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes"; - const string registryValue = "CurrentTheme"; - - string themePath = (string)Registry.GetValue(registryKey, registryValue, string.Empty); - if (string.IsNullOrEmpty(themePath)) - { - return Theme.Light; // Default to light theme if missing - } - - string theme = themePath.Split('\\').Last().Split('.').First().ToLowerInvariant(); - - return theme switch - { - "hc1" => Theme.HighContrastOne, - "hc2" => Theme.HighContrastTwo, - "hcwhite" => Theme.HighContrastWhite, - "hcblack" => Theme.HighContrastBlack, - _ => Theme.Light, - }; - } - } -} diff --git a/src/modules/launcher/PowerLauncher/Helper/ThemeHelper.cs b/src/modules/launcher/PowerLauncher/Helper/ThemeHelper.cs new file mode 100644 index 000000000000..12a3863f96f6 --- /dev/null +++ b/src/modules/launcher/PowerLauncher/Helper/ThemeHelper.cs @@ -0,0 +1,137 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; +using ManagedCommon; +using PowerLauncher.Services; + +[assembly: InternalsVisibleTo("Wox.Test")] + +namespace PowerLauncher.Helper; + +/// +/// Provides functionality for determining the application's theme based on system settings, user +/// preferences, and High Contrast mode detection. +/// +public class ThemeHelper +{ + private const string ThemesKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes"; + private const string PersonalizeKey = ThemesKey + "\\Personalize"; + + internal const int AppsUseLightThemeLight = 1; + internal const int AppsUseLightThemeDark = 0; + + /// + /// Default value for the "AppsUseLightTheme" registry setting. This value represents Light + /// mode and will be used if the registry value is invalid or cannot be read. + /// + internal const int AppsUseLightThemeDefault = AppsUseLightThemeLight; + + private readonly IRegistryService _registryService; + + private readonly Dictionary _highContrastThemeMap = + new(StringComparer.InvariantCultureIgnoreCase) + { + { "hc1", Theme.HighContrastOne }, + { "hc2", Theme.HighContrastTwo }, + { "hcwhite", Theme.HighContrastWhite }, + { "hcblack", Theme.HighContrastBlack }, + }; + + /// + /// Initializes a new instance of the class. + /// + /// The service used to query registry values. If null, a + /// default implementation is used, which queries the Windows registry. This allows for + /// dependency injection and unit testing. + public ThemeHelper(IRegistryService registryService = null) + { + _registryService = registryService ?? RegistryServiceFactory.Create(); + } + + /// + /// Determines the theme to apply, prioritizing an active High Contrast theme. + /// + /// The theme selected in application settings. + /// The resolved based on the following priority order: + /// 1. If a default High Contrast Windows theme is active, return the corresponding High + /// Contrast . + /// 2. If "Windows default" is selected in application settings, return the Windows app theme + /// ( or ). + /// 3. If the user explicitly selected "Light" or "Dark", return their chosen theme. + /// 4. If the theme cannot be determined, return . + /// + public Theme DetermineTheme(Theme settingsTheme) => + GetHighContrastTheme() ?? + (settingsTheme == Theme.System ? GetAppsTheme() : ValidateTheme(settingsTheme)); + + /// + /// Ensures the provided value is valid. + /// + /// The value to validate. + /// The provided theme if it is a defined enum value; otherwise, defaults to + /// . + private Theme ValidateTheme(Theme theme) => Enum.IsDefined(theme) ? theme : Theme.Light; + + /// + /// Determines if a High Contrast theme is currently active and returns the corresponding + /// . + /// + /// The detected High Contrast (e.g. + /// , or null if no recognized High Contrast theme + /// is active. + /// + internal Theme? GetHighContrastTheme() + { + try + { + var themePath = Convert.ToString( + _registryService.GetValue(ThemesKey, "CurrentTheme", string.Empty), + CultureInfo.InvariantCulture); + + if (!string.IsNullOrEmpty(themePath) && _highContrastThemeMap.TryGetValue( + Path.GetFileNameWithoutExtension(themePath), out var theme)) + { + return theme; + } + } + catch + { + // Fall through to return null. Ignore exception. + } + + return null; + } + + /// + /// Retrieves the Windows app theme preference from the registry. + /// + /// if the user has selected Dark mode for apps, + /// otherwise. If the registry value cannot be read or is invalid, + /// the default value () is used. + /// + internal Theme GetAppsTheme() + { + try + { + // "AppsUseLightTheme" registry value: + // - 0 = Dark mode + // - 1 (or missing/invalid) = Light mode + var regValue = _registryService.GetValue( + PersonalizeKey, + "AppsUseLightTheme", + AppsUseLightThemeDefault); + + return regValue is int intValue && intValue == 0 ? Theme.Dark : Theme.Light; + } + catch + { + return Theme.Light; + } + } +} diff --git a/src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs b/src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs index 66a71b5b0af0..bd43d87c69d5 100644 --- a/src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs +++ b/src/modules/launcher/PowerLauncher/Helper/ThemeManager.cs @@ -3,7 +3,7 @@ // See the LICENSE file in the project root for more information. using System; -using System.IO; +using System.Collections.Generic; using System.Windows; using System.Windows.Media; using ManagedCommon; @@ -17,10 +17,11 @@ public class ThemeManager : IDisposable { private readonly PowerToysRunSettings _settings; private readonly MainWindow _mainWindow; - private ManagedCommon.Theme _currentTheme; + private readonly ThemeHelper _themeHelper = new(); + private bool _disposed; - public ManagedCommon.Theme CurrentTheme => _currentTheme; + public Theme CurrentTheme { get; private set; } public event Common.UI.ThemeChangedHandler ThemeChanged; @@ -40,23 +41,25 @@ private void OnUserPreferenceChanged(object sender, UserPreferenceChangedEventAr } } - private void SetSystemTheme(ManagedCommon.Theme theme) + private void SetSystemTheme(Theme theme) { - _mainWindow.Background = OSVersionHelper.IsWindows11() is false ? SystemColors.WindowBrush : null; + _mainWindow.Background = !OSVersionHelper.IsWindows11() ? SystemColors.WindowBrush : null; // Need to disable WPF0001 since setting Application.Current.ThemeMode is experimental // https://learn.microsoft.com/en-us/dotnet/desktop/wpf/whats-new/net90#set-in-code #pragma warning disable WPF0001 - Application.Current.ThemeMode = theme is ManagedCommon.Theme.Light ? ThemeMode.Light : ThemeMode.Dark; - if (theme is ManagedCommon.Theme.Dark or ManagedCommon.Theme.Light) + Application.Current.ThemeMode = theme == Theme.Light ? ThemeMode.Light : ThemeMode.Dark; +#pragma warning restore WPF0001 + + if (theme is Theme.Dark or Theme.Light) { if (!OSVersionHelper.IsWindows11()) { // Apply background only on Windows 10 - // Windows theme does not work properly for dark and light mode so right now set the background color manual. + // Windows theme does not work properly for dark and light mode so right now set the background color manually. _mainWindow.Background = new SolidColorBrush { - Color = theme is ManagedCommon.Theme.Dark ? (Color)ColorConverter.ConvertFromString("#202020") : (Color)ColorConverter.ConvertFromString("#fafafa"), + Color = (Color)ColorConverter.ConvertFromString(theme == Theme.Dark ? "#202020" : "#fafafa"), }; } } @@ -64,49 +67,45 @@ private void SetSystemTheme(ManagedCommon.Theme theme) { string styleThemeString = theme switch { - ManagedCommon.Theme.Light => "Themes/Light.xaml", - ManagedCommon.Theme.Dark => "Themes/Dark.xaml", - ManagedCommon.Theme.HighContrastOne => "Themes/HighContrast1.xaml", - ManagedCommon.Theme.HighContrastTwo => "Themes/HighContrast2.xaml", - ManagedCommon.Theme.HighContrastWhite => "Themes/HighContrastWhite.xaml", - _ => "Themes/HighContrastBlack.xaml", + Theme.HighContrastOne => "Themes/HighContrast1.xaml", + Theme.HighContrastTwo => "Themes/HighContrast2.xaml", + Theme.HighContrastWhite => "Themes/HighContrastWhite.xaml", + Theme.HighContrastBlack => "Themes/HighContrastBlack.xaml", + _ => "Themes/Light.xaml", }; + _mainWindow.Resources.MergedDictionaries.Clear(); _mainWindow.Resources.MergedDictionaries.Add(new ResourceDictionary { Source = new Uri(styleThemeString, UriKind.Relative), }); - ResourceDictionary test = new ResourceDictionary - { - Source = new Uri(styleThemeString, UriKind.Relative), - }; if (OSVersionHelper.IsWindows11()) { // Apply background only on Windows 11 to keep the same style as WPFUI _mainWindow.Background = new SolidColorBrush { - Color = (Color)_mainWindow.FindResource("LauncherBackgroundColor"), // Use your DynamicResource key here + Color = (Color)_mainWindow.FindResource("LauncherBackgroundColor"), }; } } ImageLoader.UpdateIconPath(theme); - ThemeChanged?.Invoke(_currentTheme, theme); - _currentTheme = theme; + ThemeChanged?.Invoke(CurrentTheme, theme); + CurrentTheme = theme; } + /// + /// Updates the application's theme based on system settings and user preferences. + /// + /// + /// This considers: + /// - Whether a High Contrast theme is active in Windows. + /// - The system-wide app mode preference (Light or Dark). + /// - The user's preference override for Light or Dark mode in the application settings. + /// public void UpdateTheme() { - ManagedCommon.Theme newTheme = _settings.Theme; - ManagedCommon.Theme theme = ThemeExtensions.GetHighContrastBaseType(); - if (theme != ManagedCommon.Theme.Light) - { - newTheme = theme; - } - else if (_settings.Theme == ManagedCommon.Theme.System) - { - newTheme = ThemeExtensions.GetCurrentTheme(); - } + Theme newTheme = _themeHelper.DetermineTheme(_settings.Theme); _mainWindow.Dispatcher.Invoke(() => { diff --git a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj index 07852dc804c0..0953b4d5a189 100644 --- a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj +++ b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj @@ -7,6 +7,8 @@ PowerToys.Run WinExe true + + false False PowerLauncher.App Assets\PowerLauncher\RunResource.ico diff --git a/src/modules/launcher/PowerLauncher/Services/IRegistryService.cs b/src/modules/launcher/PowerLauncher/Services/IRegistryService.cs new file mode 100644 index 000000000000..2585c7ae16b0 --- /dev/null +++ b/src/modules/launcher/PowerLauncher/Services/IRegistryService.cs @@ -0,0 +1,82 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.Win32; + +namespace PowerLauncher.Services; + +#nullable enable + +/// +/// Provides methods for interacting with the Windows Registry or an equivalent key-value data +/// store. +/// +public interface IRegistryService +{ + /// + /// Retrieves the value associated with the specified name, in the specified registry key. + /// If the name is not found in the specified key, returns the specified default value, or + /// null if the specified key does not exist. + /// + /// The full registry path of the key, beginning with a valid registry + /// root, such as "HKEY_CURRENT_USER". + /// The name of the name/value pair. + /// The value to return if does not exist. + /// + /// null if the subkey specified by does not exist; + /// otherwise, the value associated with , or + /// if is not found. + /// does not begin with a valid + /// registry root. + /// Thrown if access to the registry or + /// equivalent store is denied. + /// Implementations may throw additional exceptions depending on their internal + /// storage mechanism. + object? GetValue(string keyName, string? valueName, object? defaultValue); + + /// + /// Sets the specified name/value pair on the specified registry key. If the specified key does + /// not exist, it is created. + /// + /// The full registry path of the key, beginning with a valid registry + /// root, such as "HKEY_CURRENT_USER". + /// The name of the name/value pair. + /// The value to be stored. + /// + /// does not begin with a valid registry root. + /// + /// -or- + /// + /// is longer than the maximum length allowed (255 characters). + /// + /// Access to the key is denied; for example, + /// it is a root-level node, or the key has not been opened with write access. + void SetValue(string keyName, string? valueName, object value); + + /// + /// Sets the specified name/value pair on the specified registry key. If the specified key does + /// not exist, it is created. + /// + /// The full registry path of the key, beginning with a valid registry + /// root, such as "HKEY_CURRENT_USER". + /// The name of the name/value pair. + /// The value to be stored. + /// The registry data type to use when storing the data. + /// + /// does not begin with a valid registry root. + /// + /// -or- + /// + /// is longer than the maximum length allowed (255 characters). + /// + /// -or- + /// + /// The type of did not match the registry data type specified by + /// , therefore the data could not be converted properly. + /// + /// Access to the key is denied; for example, + /// it is a root-level node, or the key has not been opened with write access. + void SetValue(string keyName, string? valueName, object value, RegistryValueKind valueKind); +} diff --git a/src/modules/launcher/PowerLauncher/Services/RegistryService.cs b/src/modules/launcher/PowerLauncher/Services/RegistryService.cs new file mode 100644 index 000000000000..8937bd693409 --- /dev/null +++ b/src/modules/launcher/PowerLauncher/Services/RegistryService.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.IO; +using System.Security; +using Microsoft.Win32; + +namespace PowerLauncher.Services; + +#nullable enable + +public class RegistryService : IRegistryService +{ + /// + /// The user does not have the permissions required to read + /// from the registry key. + /// The that contains the specified + /// value has been marked for deletion. + public object? GetValue(string keyName, string? valueName, object? defaultValue) => + Registry.GetValue(keyName, valueName, defaultValue); + + /// + /// The user does not have the permissions required to + /// create or modify registry keys." + public void SetValue(string keyName, string? valueName, object value) => + Registry.SetValue(keyName, valueName, value); + + /// + /// The user does not have the permissions required to + /// create or modify registry keys. + public void SetValue(string keyName, string? valueName, object value, RegistryValueKind valueKind) => + Registry.SetValue(keyName, valueName, value, valueKind); +} diff --git a/src/modules/launcher/PowerLauncher/Services/RegistryServiceFactory.cs b/src/modules/launcher/PowerLauncher/Services/RegistryServiceFactory.cs new file mode 100644 index 000000000000..c4be75d6b391 --- /dev/null +++ b/src/modules/launcher/PowerLauncher/Services/RegistryServiceFactory.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +namespace PowerLauncher.Services; + +/// +/// Factory for creating instances of . +/// +public static class RegistryServiceFactory +{ + /// + /// Creates the default implementation of . + /// + /// An instance of the default implementation. + public static IRegistryService Create() => new RegistryService(); +} diff --git a/src/modules/launcher/Wox.Test/ThemeHelperTest.cs b/src/modules/launcher/Wox.Test/ThemeHelperTest.cs new file mode 100644 index 000000000000..38ff891a6e59 --- /dev/null +++ b/src/modules/launcher/Wox.Test/ThemeHelperTest.cs @@ -0,0 +1,124 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Linq.Expressions; +using ManagedCommon; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using Moq; +using PowerLauncher.Helper; +using PowerLauncher.Services; + +namespace Wox.Test; + +[TestClass] +public class ThemeHelperTest +{ + // Registry key paths. + private const string ThemesKey = @"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Themes"; + private const string PersonalizeKey = ThemesKey + "\\Personalize"; + + // Theme paths. + private const string HighContrastThemePath = @"C:\WINDOWS\resources\Ease of Access Themes\hcwhite.theme"; + private const string NonHighContrastThemePath = @"C:\Users\Test\AppData\Local\Microsoft\Windows\Themes\Custom.theme"; + + /// + /// The expected High Contrast theme when the is returned + /// from the registry. + /// + private const Theme HighContrastTheme = Theme.HighContrastWhite; + + /// + /// Mock , to return the value of the AppsUseLightTheme + /// key. + /// + private static readonly Expression> _mockAppsUseLightTheme = (service) => + service.GetValue(PersonalizeKey, "AppsUseLightTheme", ThemeHelper.AppsUseLightThemeDefault); + + /// + /// Mock to return the value of the CurrentTheme key. + /// + /// + /// The default value given here - string.Empty - must be the same as the default value in the + /// actual code for tests using this mock to be valid. + /// + private static readonly Expression> _mockCurrentTheme = (service) => + service.GetValue(ThemesKey, "CurrentTheme", string.Empty); + + /// + /// Test GetAppsTheme method. + /// + /// The mocked value for the AppsUseLightTheme registry key. + /// The expected output from the call to + /// . + [DataTestMethod] + [DataRow(ThemeHelper.AppsUseLightThemeLight, Theme.Light)] + [DataRow(ThemeHelper.AppsUseLightThemeDark, Theme.Dark)] + [DataRow(int.MaxValue, Theme.Light)] // Out of range values should default to Light + [DataRow(null, Theme.Light)] // Missing keys or values should default to Light + [DataRow("RandomString", Theme.Light)] // Invalid string values should default to Light + public void GetAppsTheme_ReturnsExpectedTheme(object registryValue, Theme expectedTheme) + { + var mockService = new Mock(); + mockService.Setup(_mockAppsUseLightTheme).Returns(registryValue); + + var helper = new ThemeHelper(mockService.Object); + + Assert.AreEqual(expectedTheme, helper.GetAppsTheme()); + } + + /// + /// Test . + /// + /// The mocked value for the CurrentTheme registry key. + /// The expected output from the call to + /// . + [DataTestMethod] + [DataRow(HighContrastThemePath, HighContrastTheme)] // Valid High Contrast theme + [DataRow(NonHighContrastThemePath, null)] // Non-High Contrast theme should return null + [DataRow(null, null)] // Missing keys or values should default to null + [DataRow("", null)] // Empty string values should default to null + public void GetHighContrastTheme_ReturnsExpectedTheme(string registryValue, Theme? expectedTheme) + { + var mockService = new Mock(); + mockService.Setup(_mockCurrentTheme).Returns(registryValue); + + var helper = new ThemeHelper(mockService.Object); + + Assert.AreEqual(expectedTheme, helper.GetHighContrastTheme()); + } + + /// + /// Test . + /// + /// The mocked value for the CurrentTheme registry key. + /// The value from the application's settings. + /// + /// The expected output from the call to + /// . + /// The mocked value for the AppsUseLightTheme registry key, + /// representing the system preference for Light or Dark mode. + [DataTestMethod] + [DataRow(HighContrastThemePath, Theme.System, HighContrastTheme)] // High Contrast theme active + [DataRow(HighContrastThemePath, Theme.Light, HighContrastTheme)] // High Contrast theme active - Light mode override ignored + [DataRow(HighContrastThemePath, Theme.Dark, HighContrastTheme)] // High Contrast theme active - Dark mode override ignored + [DataRow(NonHighContrastThemePath, Theme.System, Theme.Light)] // System preference with default light theme + [DataRow(NonHighContrastThemePath, Theme.System, Theme.Dark, ThemeHelper.AppsUseLightThemeDark)] // System preference with dark mode + [DataRow(NonHighContrastThemePath, Theme.Light, Theme.Light, ThemeHelper.AppsUseLightThemeDark)] // Light mode override + [DataRow(NonHighContrastThemePath, Theme.Dark, Theme.Dark, ThemeHelper.AppsUseLightThemeLight)] // Dark mode override + [DataRow(null, Theme.System, Theme.Light)] // Missing keys or values should default to Light + [DataRow("", Theme.System, Theme.Light)] // Empty current theme paths should default to Light + [DataRow("RandomString", Theme.System, Theme.Light)] // Invalid current theme paths should default to Light + [DataRow(NonHighContrastThemePath, (Theme)int.MaxValue, Theme.Light)] // Invalid theme values should default to Light + public void DetermineTheme_ReturnsExpectedTheme(string registryTheme, Theme requestedTheme, Theme expectedTheme, int? appsUseLightTheme = 1) + { + var mockService = new Mock(); + mockService.Setup(_mockCurrentTheme).Returns(registryTheme); + mockService.Setup(_mockAppsUseLightTheme).Returns(appsUseLightTheme); + + var helper = new ThemeHelper(mockService.Object); + + Assert.AreEqual(expectedTheme, helper.DetermineTheme(requestedTheme)); + } +} diff --git a/src/modules/poweraccent/PowerAccent.Core/Languages.cs b/src/modules/poweraccent/PowerAccent.Core/Languages.cs index 60b206b51608..542af1b5996d 100644 --- a/src/modules/poweraccent/PowerAccent.Core/Languages.cs +++ b/src/modules/poweraccent/PowerAccent.Core/Languages.cs @@ -225,6 +225,7 @@ private static string[] GetDefaultLetterKeySPECIAL(LetterKey letter) LetterKey.VK_DIVIDE_ => new[] { "÷", "√" }, LetterKey.VK_MULTIPLY_ => new[] { "×", "⋅" }, LetterKey.VK_PLUS => new[] { "≤", "≥", "≠", "≈", "≙", "⊕", "⊗", "∓", "≅", "≡" }, + LetterKey.VK_BACKSLASH => new[] { "`", "~" }, _ => Array.Empty(), }; } @@ -676,7 +677,7 @@ private static string[] GetDefaultLetterKeyEL(LetterKey letter) LetterKey.VK_O => new string[] { "ο", "ό", "ω", "ώ" }, LetterKey.VK_P => new string[] { "π", "φ", "ψ" }, LetterKey.VK_R => new string[] { "ρ" }, - LetterKey.VK_S => new string[] { "σ" }, + LetterKey.VK_S => new string[] { "σ", "ς" }, LetterKey.VK_T => new string[] { "τ", "θ", "ϑ" }, LetterKey.VK_U => new string[] { "υ", "ύ" }, LetterKey.VK_X => new string[] { "ξ" }, @@ -894,7 +895,7 @@ private static string[] GetDefaultLetterKeyIPA(LetterKey letter) { return letter switch { - LetterKey.VK_A => new[] { "ɐ", "ɑ", "ɒ" }, + LetterKey.VK_A => new[] { "ɐ", "ɑ", "ɒ", "ǎ" }, LetterKey.VK_B => new[] { "ʙ" }, LetterKey.VK_E => new[] { "ɘ", "ɵ", "ə", "ɛ", "ɜ", "ɞ" }, LetterKey.VK_F => new[] { "ɟ", "ɸ" }, @@ -904,10 +905,10 @@ private static string[] GetDefaultLetterKeyIPA(LetterKey letter) LetterKey.VK_J => new[] { "ʝ" }, LetterKey.VK_L => new[] { "ɬ", "ɮ", "ꞎ", "ɭ", "ʎ", "ʟ", "ɺ" }, LetterKey.VK_N => new[] { "ɳ", "ɲ", "ŋ", "ɴ" }, - LetterKey.VK_O => new[] { "ɤ", "ɔ", "ɶ" }, + LetterKey.VK_O => new[] { "ɤ", "ɔ", "ɶ", "ǒ" }, LetterKey.VK_R => new[] { "ʁ", "ɹ", "ɻ", "ɾ", "ɽ", "ʀ" }, LetterKey.VK_S => new[] { "ʃ", "ʂ", "ɕ" }, - LetterKey.VK_U => new[] { "ʉ", "ʊ" }, + LetterKey.VK_U => new[] { "ʉ", "ʊ", "ǔ" }, LetterKey.VK_V => new[] { "ʋ", "ⱱ", "ʌ" }, LetterKey.VK_W => new[] { "ɰ", "ɯ" }, LetterKey.VK_Y => new[] { "ʏ" }, diff --git a/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.h b/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.h index 79f8ac1acd2b..61c28e186604 100644 --- a/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.h +++ b/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.h @@ -109,7 +109,8 @@ namespace winrt::PowerToys::PowerAccentKeyboardService::implementation LetterKey::VK_MINUS, LetterKey::VK_SLASH_, LetterKey::VK_DIVIDE_, - LetterKey::VK_MULTIPLY_, }; + LetterKey::VK_MULTIPLY_, + LetterKey::VK_BACKSLASH, }; LetterKey letterPressed{}; static inline const std::vector triggers = { TriggerKey::Right, TriggerKey::Left, TriggerKey::Space }; diff --git a/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.idl b/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.idl index 03126bf5bea9..9bc8448c229b 100644 --- a/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.idl +++ b/src/modules/poweraccent/PowerAccentKeyboardService/KeyboardListener.idl @@ -47,7 +47,8 @@ namespace PowerToys VK_MINUS = 0xBD, VK_MULTIPLY_ = 0x6A, VK_SLASH_ = 0xBF, - VK_DIVIDE_ = 0x6F + VK_DIVIDE_ = 0x6F, + VK_BACKSLASH = 0xDC }; enum TriggerKey diff --git a/src/modules/powerrename/PowerRenameUILib/PowerRenameXAML/MainWindow.xaml.cpp b/src/modules/powerrename/PowerRenameUILib/PowerRenameXAML/MainWindow.xaml.cpp index 46463af14e02..9d5d8497d319 100644 --- a/src/modules/powerrename/PowerRenameUILib/PowerRenameXAML/MainWindow.xaml.cpp +++ b/src/modules/powerrename/PowerRenameUILib/PowerRenameXAML/MainWindow.xaml.cpp @@ -170,12 +170,17 @@ namespace winrt::PowerRenameUI::implementation auto factory = winrt::get_activation_factory(); ResourceManager manager = factory.CreateInstance(L"PowerToys.PowerRename.pri"); + m_searchRegExShortcuts.Append(winrt::make(L"^", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_StartOfString").ValueAsString())); + m_searchRegExShortcuts.Append(winrt::make(L"$", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_EndOfString").ValueAsString())); m_searchRegExShortcuts.Append(winrt::make(L".", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchAny").ValueAsString())); + m_searchRegExShortcuts.Append(winrt::make(L"+", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_OneOrMore").ValueAsString())); + m_searchRegExShortcuts.Append(winrt::make(L"?", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_ZeroOrOne").ValueAsString())); + m_searchRegExShortcuts.Append(winrt::make(L"*", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_ZeroOrMore").ValueAsString())); m_searchRegExShortcuts.Append(winrt::make(L"\\d", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchDigit").ValueAsString())); m_searchRegExShortcuts.Append(winrt::make(L"\\D", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchNonDigit").ValueAsString())); m_searchRegExShortcuts.Append(winrt::make(L"\\w", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchWordChar").ValueAsString())); + m_searchRegExShortcuts.Append(winrt::make(L"\\s", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchWS").ValueAsString())); m_searchRegExShortcuts.Append(winrt::make(L"\\S", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchNonWS").ValueAsString())); - m_searchRegExShortcuts.Append(winrt::make(L"\\S+", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchOneOrMoreWS").ValueAsString())); m_searchRegExShortcuts.Append(winrt::make(L"\\b", manager.MainResourceMap().GetValue(L"Resources/RegExCheatSheet_MatchWordBoundary").ValueAsString())); m_dateTimeShortcuts = winrt::single_threaded_observable_vector(); diff --git a/src/modules/powerrename/PowerRenameUILib/Strings/en-us/Resources.resw b/src/modules/powerrename/PowerRenameUILib/Strings/en-us/Resources.resw index d2ab4fcb583d..c1d55917f7ff 100644 --- a/src/modules/powerrename/PowerRenameUILib/Strings/en-us/Resources.resw +++ b/src/modules/powerrename/PowerRenameUILib/Strings/en-us/Resources.resw @@ -123,24 +123,39 @@ RegEx help + + Start of the string + + + End of the string + Matches any character + + Matches zero or one of the preceding token + + + Matches zero or more of the preceding token + + + Matches one or more of the preceding token + Any digit, short for [0-9] A non-digit, short for [^0-9] + + Any whitespace character + - A non-whitespace character, short for [^\\s] + A non-whitespace character, short for [^\s] A word character, short for [a-zA-Z_0-9] - - One or more non-whitespace characters - Matches a word boundary where a word character is [a-zA-Z0-9_]. diff --git a/src/modules/powerrename/lib/Enumerating.cpp b/src/modules/powerrename/lib/Enumerating.cpp index 1ea275720c9d..9f470af929ac 100644 --- a/src/modules/powerrename/lib/Enumerating.cpp +++ b/src/modules/powerrename/lib/Enumerating.cpp @@ -6,7 +6,7 @@ std::vector parseEnumOptions(const std::wstring& replaceWith) { - static const std::wregex enumStartRegex(LR"(start=(\d+))"); + static const std::wregex enumStartRegex(LR"(start=(-?\d+))"); static const std::wregex enumIncrementRegex(LR"(increment=(-?\d+))"); static const std::wregex enumPaddingRegex(LR"(padding=(\d+))"); diff --git a/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml b/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml index 9635708343fe..e3d65c72c8ca 100644 --- a/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml +++ b/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml @@ -31,5 +31,10 @@ VerticalAlignment="Stretch" Loaded="Browser_Loaded" /> + diff --git a/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml.cs b/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml.cs index a647545a3acb..6031c6dccb99 100644 --- a/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml.cs +++ b/src/modules/registrypreview/RegistryPreviewUILib/MonacoEditorControl.xaml.cs @@ -13,6 +13,8 @@ using Microsoft.UI.Xaml; using Microsoft.UI.Xaml.Controls; using Microsoft.Web.WebView2.Core; +using Windows.ApplicationModel.DataTransfer; +using Windows.System; using Windows.UI; namespace RegistryPreviewUILib @@ -66,6 +68,7 @@ private async void Browser_Loaded(object sender, RoutedEventArgs e) Browser.DefaultBackgroundColor = Color.FromArgb(0, 0, 0, 0); Browser.CoreWebView2.NavigationCompleted += CoreWebView2_NavigationCompleted; Browser.CoreWebView2.PermissionRequested += CoreWebView2_PermissionRequested; + Browser.CoreWebView2.NewWindowRequested += CoreWebView2_NewWindowRequested; Browser.CoreWebView2.Settings.AreDefaultScriptDialogsEnabled = false; Browser.CoreWebView2.Settings.AreDefaultContextMenusEnabled = false; Browser.CoreWebView2.Settings.AreHostObjectsAllowed = false; @@ -89,6 +92,16 @@ private async void Browser_Loaded(object sender, RoutedEventArgs e) Browser.CoreWebView2.Navigate(index); } + private async void CoreWebView2_NewWindowRequested(CoreWebView2 sender, CoreWebView2NewWindowRequestedEventArgs args) + { + // Monaco opens URI in a new window. We open the URI in the default web browser. + if (args.Uri != null && args.IsUserInitiated) + { + args.Handled = true; + await ShowOpenUriDialogAsync(new Uri(args.Uri)); + } + } + private void CoreWebView2_PermissionRequested(CoreWebView2 sender, CoreWebView2PermissionRequestedEventArgs args) { if (args.PermissionKind == CoreWebView2PermissionKind.ClipboardRead) @@ -165,5 +178,23 @@ public void Dispose() { _textChangedThrottle?.Dispose(); } + + private async Task ShowOpenUriDialogAsync(Uri uri) + { + OpenUriDialog.Content = uri.ToString(); + var result = await OpenUriDialog.ShowAsync(); + + if (result == ContentDialogResult.Primary) + { + await Launcher.LaunchUriAsync(uri); + } + } + + private void OpenUriDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args) + { + var dataPackage = new DataPackage(); + dataPackage.SetText(sender.Content.ToString()); + Clipboard.SetContent(dataPackage); + } } } diff --git a/src/modules/registrypreview/RegistryPreviewUILib/Strings/en-US/Resources.resw b/src/modules/registrypreview/RegistryPreviewUILib/Strings/en-US/Resources.resw index 9401908d216e..73469a3b509b 100644 --- a/src/modules/registrypreview/RegistryPreviewUILib/Strings/en-US/Resources.resw +++ b/src/modules/registrypreview/RegistryPreviewUILib/Strings/en-US/Resources.resw @@ -178,6 +178,22 @@ Open Registry file + + Cancel + Dialog showed when an URI is clicked. Button to close the dialog. + + + Open + Dialog showed when an URI is clicked. Button to open the URI. + + + Copy + Dialog showed when an URI is clicked. Button to copy the URI. + + + Do you want RegistryPreview to open the external application? + Title of the dialog showed when an URI is clicked,"RegistryPreview" is the name of the utility. + Reload diff --git a/src/runner/general_settings.cpp b/src/runner/general_settings.cpp index 9e3b170feb19..83128b05e999 100644 --- a/src/runner/general_settings.cpp +++ b/src/runner/general_settings.cpp @@ -112,9 +112,21 @@ void apply_general_settings(const json::JsonObject& general_configs, bool save) enable_experimentation = general_configs.GetNamedBoolean(L"enable_experimentation", true); + // apply_general_settings is called by the runner's WinMain, so we can just force the run at startup gpo rule here. + auto gpo_run_as_startup = powertoys_gpo::getConfiguredRunAtStartupValue(); + if (json::has(general_configs, L"startup", json::JsonValueType::Boolean)) { - const bool startup = general_configs.GetNamedBoolean(L"startup"); + bool startup = general_configs.GetNamedBoolean(L"startup"); + + if (gpo_run_as_startup == powertoys_gpo::gpo_rule_configured_enabled) + { + startup = true; + } + else if (gpo_run_as_startup == powertoys_gpo::gpo_rule_configured_disabled) + { + startup = false; + } if (startup) { @@ -147,7 +159,9 @@ void apply_general_settings(const json::JsonObject& general_configs, bool save) else { delete_auto_start_task_for_this_user(); - create_auto_start_task_for_this_user(run_as_elevated); + if (gpo_run_as_startup == powertoys_gpo::gpo_rule_configured_enabled || gpo_run_as_startup == powertoys_gpo::gpo_rule_configured_not_configured) { + create_auto_start_task_for_this_user(run_as_elevated); + } } if (json::has(general_configs, L"enabled")) diff --git a/src/runner/settings_window.cpp b/src/runner/settings_window.cpp index 513c4ef60d3d..265d3e3dc097 100644 --- a/src/runner/settings_window.cpp +++ b/src/runner/settings_window.cpp @@ -698,11 +698,11 @@ std::string ESettingsWindowNames_to_string(ESettingsWindowNames value) return "CmdPal"; case ESettingsWindowNames::ZoomIt: return "ZoomIt"; - default: - { - Logger::error(L"Can't convert ESettingsWindowNames value={} to string", static_cast(value)); - assert(false); - } + default: + { + Logger::error(L"Can't convert ESettingsWindowNames value={} to string", static_cast(value)); + assert(false); + } } return ""; } diff --git a/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalAction.cs b/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalAction.cs index 7a6fd3081aa1..28bed9201292 100644 --- a/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalAction.cs +++ b/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalAction.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; using System.Text.Json.Serialization; using Microsoft.PowerToys.Settings.UI.Library.Helpers; @@ -36,4 +37,7 @@ public bool IsShown get => _isShown; set => Set(ref _isShown, value); } + + [JsonIgnore] + public IEnumerable SubActions => []; } diff --git a/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalActions.cs b/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalActions.cs index ce26962b020e..3b1a859364a3 100644 --- a/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalActions.cs +++ b/src/settings-ui/Settings.UI.Library/AdvancedPasteAdditionalActions.cs @@ -14,6 +14,7 @@ public static class PropertyNames { public const string ImageToText = "image-to-text"; public const string PasteAsFile = "paste-as-file"; + public const string Transcode = "transcode"; } [JsonPropertyName(PropertyNames.ImageToText)] @@ -22,6 +23,22 @@ public static class PropertyNames [JsonPropertyName(PropertyNames.PasteAsFile)] public AdvancedPastePasteAsFileAction PasteAsFile { get; init; } = new(); - [JsonIgnore] - public IEnumerable AllActions => new IAdvancedPasteAction[] { ImageToText, PasteAsFile }.Concat(PasteAsFile.SubActions); + [JsonPropertyName(PropertyNames.Transcode)] + public AdvancedPasteTranscodeAction Transcode { get; init; } = new(); + + public IEnumerable GetAllActions() + { + Queue queue = new([ImageToText, PasteAsFile, Transcode]); + + while (queue.Count != 0) + { + var action = queue.Dequeue(); + yield return action; + + foreach (var subAction in action.SubActions) + { + queue.Enqueue(subAction); + } + } + } } diff --git a/src/settings-ui/Settings.UI.Library/AdvancedPasteCustomAction.cs b/src/settings-ui/Settings.UI.Library/AdvancedPasteCustomAction.cs index f3bb4431ca29..971d24c93b69 100644 --- a/src/settings-ui/Settings.UI.Library/AdvancedPasteCustomAction.cs +++ b/src/settings-ui/Settings.UI.Library/AdvancedPasteCustomAction.cs @@ -3,6 +3,7 @@ // See the LICENSE file in the project root for more information. using System; +using System.Collections.Generic; using System.Text.Json.Serialization; using Microsoft.PowerToys.Settings.UI.Library.Helpers; @@ -98,6 +99,9 @@ public bool IsValid private set => Set(ref _isValid, value); } + [JsonIgnore] + public IEnumerable SubActions => []; + public object Clone() { AdvancedPasteCustomAction clone = new(); diff --git a/src/settings-ui/Settings.UI.Library/AdvancedPastePasteAsFileAction.cs b/src/settings-ui/Settings.UI.Library/AdvancedPastePasteAsFileAction.cs index 979e967d4a0a..c4489eaaf762 100644 --- a/src/settings-ui/Settings.UI.Library/AdvancedPastePasteAsFileAction.cs +++ b/src/settings-ui/Settings.UI.Library/AdvancedPastePasteAsFileAction.cs @@ -52,5 +52,5 @@ public AdvancedPasteAdditionalAction PasteAsHtmlFile } [JsonIgnore] - public IEnumerable SubActions => [PasteAsTxtFile, PasteAsPngFile, PasteAsHtmlFile]; + public IEnumerable SubActions => [PasteAsTxtFile, PasteAsPngFile, PasteAsHtmlFile]; } diff --git a/src/settings-ui/Settings.UI.Library/AdvancedPasteTranscodeAction.cs b/src/settings-ui/Settings.UI.Library/AdvancedPasteTranscodeAction.cs new file mode 100644 index 000000000000..82ea4d09f566 --- /dev/null +++ b/src/settings-ui/Settings.UI.Library/AdvancedPasteTranscodeAction.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +using Microsoft.PowerToys.Settings.UI.Library.Helpers; + +namespace Microsoft.PowerToys.Settings.UI.Library; + +public sealed class AdvancedPasteTranscodeAction : Observable, IAdvancedPasteAction +{ + public static class PropertyNames + { + public const string TranscodeToMp3 = "transcode-to-mp3"; + public const string TranscodeToMp4 = "transcode-to-mp4"; + } + + private AdvancedPasteAdditionalAction _transcodeToMp3 = new(); + private AdvancedPasteAdditionalAction _transcodeToMp4 = new(); + private bool _isShown = true; + + [JsonPropertyName("isShown")] + public bool IsShown + { + get => _isShown; + set => Set(ref _isShown, value); + } + + [JsonPropertyName(PropertyNames.TranscodeToMp3)] + public AdvancedPasteAdditionalAction TranscodeToMp3 + { + get => _transcodeToMp3; + init => Set(ref _transcodeToMp3, value); + } + + [JsonPropertyName(PropertyNames.TranscodeToMp4)] + public AdvancedPasteAdditionalAction TranscodeToMp4 + { + get => _transcodeToMp4; + init => Set(ref _transcodeToMp4, value); + } + + [JsonIgnore] + public IEnumerable SubActions => [TranscodeToMp3, TranscodeToMp4]; +} diff --git a/src/settings-ui/Settings.UI.Library/IAdvancedPasteAction.cs b/src/settings-ui/Settings.UI.Library/IAdvancedPasteAction.cs index 4c31557010c9..6571853be54a 100644 --- a/src/settings-ui/Settings.UI.Library/IAdvancedPasteAction.cs +++ b/src/settings-ui/Settings.UI.Library/IAdvancedPasteAction.cs @@ -2,6 +2,7 @@ // The Microsoft Corporation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Collections.Generic; using System.ComponentModel; namespace Microsoft.PowerToys.Settings.UI.Library; @@ -9,4 +10,6 @@ namespace Microsoft.PowerToys.Settings.UI.Library; public interface IAdvancedPasteAction : INotifyPropertyChanged { public bool IsShown { get; } + + public IEnumerable SubActions { get; } } diff --git a/src/settings-ui/Settings.UI/Converters/ImageResizerDoubleToAutoConverter.cs b/src/settings-ui/Settings.UI/Converters/ImageResizerDoubleToAutoConverter.cs new file mode 100644 index 000000000000..63ba8cde9278 --- /dev/null +++ b/src/settings-ui/Settings.UI/Converters/ImageResizerDoubleToAutoConverter.cs @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Globalization; +using Microsoft.UI.Xaml.Data; + +namespace Microsoft.PowerToys.Settings.UI.Converters; + +/// +/// Converts between double and string for text-based controls bound to Width or Height fields. +/// Optionally returns localized "Auto" text when the underlying value is 0, letting the UI show, +/// for example "(auto) x 1024 pixels". +/// +public sealed partial class ImageResizerDoubleToAutoConverter : IValueConverter +{ + private static readonly string AutoText = + Helpers.ResourceLoaderInstance.ResourceLoader.GetString("ImageResizer_AutoText"); + + /// + /// Converts a double to a string, optionally showing "Auto" for 0 values. NaN values are + /// converted to empty strings. + /// + /// The value to convert from to + /// . + /// The conversion target type. here. + /// Set to "Auto" to return the localized "Auto" string if the + /// value is 0. + /// Ignored. + /// The string representation of the passed-in value. + public object Convert(object value, Type targetType, object parameter, string language) => + value switch + { + double d => d switch + { + double.NaN => "0", + 0 => (string)parameter == "Auto" ? AutoText : "0", + _ => d.ToString(CultureInfo.CurrentCulture), + }, + + _ => "0", + }; + + /// + /// Converts the string representation back to a double, returning 0 if the string is empty, + /// null or not a valid number in the specified culture. + /// + /// The string value to convert. + /// The conversion target type. here. + /// Converter parameter. Unused. + /// Ignored. + /// The corresponding double value. + public object ConvertBack(object value, Type targetType, object parameter, string language) => + value switch + { + null or "" => 0.0, + string text when double.TryParse(text, NumberStyles.Any, CultureInfo.CurrentCulture, out double result) => result, + _ => 0.0, + }; +} diff --git a/src/settings-ui/Settings.UI/Converters/ImageResizerNumberBoxValueConverter.cs b/src/settings-ui/Settings.UI/Converters/ImageResizerNumberBoxValueConverter.cs new file mode 100644 index 000000000000..777657186df2 --- /dev/null +++ b/src/settings-ui/Settings.UI/Converters/ImageResizerNumberBoxValueConverter.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using Microsoft.UI.Xaml.Data; + +namespace Microsoft.PowerToys.Settings.UI.Converters; + +public partial class ImageResizerNumberBoxValueConverter : IValueConverter +{ + /// + /// Converts the underlying double value to a display-friendly format. Ensures that NaN values + /// are not propagated to the UI. + /// + public object Convert(object value, Type targetType, object parameter, string language) => + value is double d && double.IsNaN(d) ? 0.0 : value; + + /// + /// Converts the user input back to the underlying double value. If the input is not a valid + /// number, a double with value 0 is returned. + /// + public object ConvertBack(object value, Type targetType, object parameter, string language) => + value switch + { + null => 0.0, + double d when double.IsNaN(d) => 0.0, + string str when !double.TryParse(str, out _) => 0.0, + _ => value, + }; +} diff --git a/src/settings-ui/Settings.UI/Converters/ImageResizerZeroToEmptyStringNumberFormatter.cs b/src/settings-ui/Settings.UI/Converters/ImageResizerZeroToEmptyStringNumberFormatter.cs new file mode 100644 index 000000000000..241210f6c056 --- /dev/null +++ b/src/settings-ui/Settings.UI/Converters/ImageResizerZeroToEmptyStringNumberFormatter.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Globalization; +using Microsoft.UI.Xaml.Controls; + +namespace Microsoft.PowerToys.Settings.UI.Converters; + +public partial class ImageResizerZeroToEmptyStringNumberFormatter +{ + public string Format(long value) => throw new NotImplementedException(); + + public string Format(ulong value) => throw new NotImplementedException(); + + public string Format(double value) => throw new NotImplementedException(); + + public string FormatDouble(double? value) => value switch + { + null => string.Empty, + 0 => string.Empty, + _ => value.Value.ToString(CultureInfo.CurrentCulture), + }; + + public double? ParseDouble(string text) + { + if (string.IsNullOrWhiteSpace(text)) + { + return 0.0; + } + + return double.TryParse(text, NumberStyles.Any, CultureInfo.CurrentCulture, out double result) ? result : 0.0; + } + + public long? ParseInt(string text) => throw new NotImplementedException(); + + public ulong? ParseUInt(string text) => throw new NotImplementedException(); +} diff --git a/src/settings-ui/Settings.UI/Helpers/ActionMessage.cs b/src/settings-ui/Settings.UI/Helpers/ActionMessage.cs new file mode 100644 index 000000000000..ead3fb13d501 --- /dev/null +++ b/src/settings-ui/Settings.UI/Helpers/ActionMessage.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Microsoft.PowerToys.Settings.UI.Helpers +{ + public sealed class ActionMessage + { + [JsonPropertyName("action")] + public SettingsAction Action { get; set; } + + public static ActionMessage Create(string actionName) + { + return new ActionMessage + { + Action = new SettingsAction + { + PublishedDate = new SettingsGeneral + { + ActionName = actionName, + }, + }, + }; + } + } + + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "Those are just a define for one simple struct")] + public sealed class SettingsAction + { + [JsonPropertyName("general")] + public SettingsGeneral PublishedDate { get; set; } + } + + [SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "Those are just a define for one simple struct")] + public sealed class SettingsGeneral + { + [JsonPropertyName("action_name")] + public string ActionName { get; set; } + } +} diff --git a/src/settings-ui/Settings.UI/Helpers/AsyncCommand.cs b/src/settings-ui/Settings.UI/Helpers/AsyncCommand.cs index 4c9be4706084..c44f34b6e5de 100644 --- a/src/settings-ui/Settings.UI/Helpers/AsyncCommand.cs +++ b/src/settings-ui/Settings.UI/Helpers/AsyncCommand.cs @@ -11,7 +11,7 @@ namespace Microsoft.PowerToys.Settings.UI.Helpers { - internal sealed class AsyncCommand : ICommand + internal sealed partial class AsyncCommand : ICommand { private readonly Func _execute; private readonly Func _canExecute; diff --git a/src/settings-ui/Settings.UI/Helpers/IndexedObservableCollection.cs b/src/settings-ui/Settings.UI/Helpers/IndexedObservableCollection.cs index c0cdebcdc7c1..491c06ef5a49 100644 --- a/src/settings-ui/Settings.UI/Helpers/IndexedObservableCollection.cs +++ b/src/settings-ui/Settings.UI/Helpers/IndexedObservableCollection.cs @@ -27,7 +27,7 @@ public IndexedItem(T item, int index) } #pragma warning disable SA1402 // File may only contain a single type - public class IndexedObservableCollection : ObservableCollection> + public partial class IndexedObservableCollection : ObservableCollection> #pragma warning restore SA1402 // File may only contain a single type { public IndexedObservableCollection(IEnumerable items) diff --git a/src/settings-ui/Settings.UI/Helpers/NativeKeyboardHelper.cs b/src/settings-ui/Settings.UI/Helpers/NativeKeyboardHelper.cs index 9d3961f907fa..b9d32e25d3db 100644 --- a/src/settings-ui/Settings.UI/Helpers/NativeKeyboardHelper.cs +++ b/src/settings-ui/Settings.UI/Helpers/NativeKeyboardHelper.cs @@ -18,7 +18,7 @@ internal struct INPUT internal static int Size { - get { return Marshal.SizeOf(typeof(INPUT)); } + get { return Marshal.SizeOf(); } } } diff --git a/src/settings-ui/Settings.UI/Helpers/PowerToysReleaseInfo.cs b/src/settings-ui/Settings.UI/Helpers/PowerToysReleaseInfo.cs new file mode 100644 index 000000000000..5805eac47a7c --- /dev/null +++ b/src/settings-ui/Settings.UI/Helpers/PowerToysReleaseInfo.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace Microsoft.PowerToys.Settings.UI.Helpers +{ + // Contains information for a release. Used to deserialize release JSON info from GitHub. + public sealed class PowerToysReleaseInfo + { + [JsonPropertyName("published_at")] + public DateTimeOffset PublishedDate { get; set; } + + [JsonPropertyName("name")] + public string Name { get; set; } + + [JsonPropertyName("tag_name")] + public string TagName { get; set; } + + [JsonPropertyName("body")] + public string ReleaseNotes { get; set; } + } +} diff --git a/src/settings-ui/Settings.UI/Helpers/RelayCommand.cs b/src/settings-ui/Settings.UI/Helpers/RelayCommand.cs index 7bfcd8479f51..5d647f82cd94 100644 --- a/src/settings-ui/Settings.UI/Helpers/RelayCommand.cs +++ b/src/settings-ui/Settings.UI/Helpers/RelayCommand.cs @@ -7,7 +7,7 @@ namespace Microsoft.PowerToys.Settings.UI.Helpers { - public class RelayCommand : ICommand + public partial class RelayCommand : ICommand { private readonly Action _execute; private readonly Func _canExecute; @@ -33,7 +33,7 @@ public RelayCommand(Action execute, Func canExecute) } [System.Diagnostics.CodeAnalysis.SuppressMessage("StyleCop.CSharp.MaintainabilityRules", "SA1402:File may only contain a single type", Justification = "abstract T and abstract")] - public class RelayCommand : ICommand + public partial class RelayCommand : ICommand { private readonly Action execute; diff --git a/src/settings-ui/Settings.UI/Helpers/WindowHelper.cs b/src/settings-ui/Settings.UI/Helpers/WindowHelper.cs index 489e2b9a4a80..9e9718074ced 100644 --- a/src/settings-ui/Settings.UI/Helpers/WindowHelper.cs +++ b/src/settings-ui/Settings.UI/Helpers/WindowHelper.cs @@ -6,7 +6,7 @@ using System.IO; using System.Runtime.InteropServices; using System.Text.Json; - +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Microsoft.UI.Xaml; namespace Microsoft.PowerToys.Settings.UI.Helpers @@ -20,9 +20,9 @@ public static WINDOWPLACEMENT DeserializePlacementOrDefault(IntPtr handle) try { var json = File.ReadAllText(_placementPath); - var placement = JsonSerializer.Deserialize(json); + var placement = JsonSerializer.Deserialize(json, SourceGenerationContextContext.Default.WINDOWPLACEMENT); - placement.Length = Marshal.SizeOf(typeof(WINDOWPLACEMENT)); + placement.Length = Marshal.SizeOf(); placement.Flags = 0; placement.ShowCmd = (placement.ShowCmd == NativeMethods.SW_SHOWMAXIMIZED) ? NativeMethods.SW_SHOWMAXIMIZED : NativeMethods.SW_SHOWNORMAL; return placement; @@ -40,7 +40,7 @@ public static void SerializePlacement(IntPtr handle) _ = NativeMethods.GetWindowPlacement(handle, out var placement); try { - var json = JsonSerializer.Serialize(placement); + var json = JsonSerializer.Serialize(placement, SourceGenerationContextContext.Default.WINDOWPLACEMENT); File.WriteAllText(_placementPath, json); } catch (Exception) diff --git a/src/settings-ui/Settings.UI/SerializationContext/SourceGenerationContextContext.cs b/src/settings-ui/Settings.UI/SerializationContext/SourceGenerationContextContext.cs new file mode 100644 index 000000000000..8fd948fd862f --- /dev/null +++ b/src/settings-ui/Settings.UI/SerializationContext/SourceGenerationContextContext.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using Microsoft.PowerToys.Settings.UI.Helpers; +using Microsoft.PowerToys.Settings.UI.Library; + +namespace Microsoft.PowerToys.Settings.UI.SerializationContext; + +[JsonSerializable(typeof(WINDOWPLACEMENT))] +[JsonSerializable(typeof(AdvancedPasteSettings))] +[JsonSerializable(typeof(Dictionary>))] +[JsonSerializable(typeof(AlwaysOnTopSettings))] +[JsonSerializable(typeof(ColorPickerSettings))] +[JsonSerializable(typeof(CropAndLockSettings))] +[JsonSerializable(typeof(FileLocksmithSettings))] +[JsonSerializable(typeof(MeasureToolSettings))] +[JsonSerializable(typeof(MouseWithoutBordersSettings))] +[JsonSerializable(typeof(NewPlusSettings))] +[JsonSerializable(typeof(PeekSettings))] +[JsonSerializable(typeof(PowerLauncherSettings))] +[JsonSerializable(typeof(PowerOcrSettings))] +[JsonSerializable(typeof(RegistryPreviewSettings))] +[JsonSerializable(typeof(WorkspacesSettings))] +[JsonSerializable(typeof(IList))] +[JsonSerializable(typeof(ActionMessage))] +public sealed partial class SourceGenerationContextContext : JsonSerializerContext +{ +} diff --git a/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs index a9a73eee0824..3450bdcab6d0 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs +++ b/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs @@ -14,6 +14,7 @@ using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Telemetry.Events; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Microsoft.PowerToys.Settings.UI.Services; using Microsoft.PowerToys.Settings.UI.Views; using Microsoft.PowerToys.Telemetry; @@ -168,7 +169,7 @@ private void OnLaunchedToGetSetting(string[] cmdArgs) try { - var requestedSettings = JsonSerializer.Deserialize>>(File.ReadAllText(ipcFileName)); + var requestedSettings = JsonSerializer.Deserialize>>(File.ReadAllText(ipcFileName), SourceGenerationContextContext.Default.DictionaryStringListString); File.WriteAllText(ipcFileName, GetSettingCommandLineCommand.Execute(requestedSettings)); } catch (Exception ex) diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/ImageResizerDimensionsNumberBox.cs b/src/settings-ui/Settings.UI/SettingsXAML/Controls/ImageResizerDimensionsNumberBox.cs new file mode 100644 index 000000000000..a310f2d675c1 --- /dev/null +++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/ImageResizerDimensionsNumberBox.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Corporation +// The Microsoft Corporation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Microsoft.UI.Xaml; +using Microsoft.UI.Xaml.Controls; + +namespace Microsoft.PowerToys.Settings.UI.Controls; + +public partial class ImageResizerDimensionsNumberBox : NumberBox +{ + public ImageResizerDimensionsNumberBox() + { + this.Loaded += (_, _) => UpdateDisplayText(); + + this.ValueChanged += (_, _) => UpdateDisplayText(); + + this.GotFocus += (s, e) => + { + // Show "0" in the UI when focused on the empty value. This ensures that the spinbutton + // controls are usable. + if (Value is double.NaN) + { + Value = 0.0; + } + }; + + this.LostFocus += (_, _) => UpdateDisplayText(); + } + + private void UpdateDisplayText() + { + if (FocusState == FocusState.Unfocused && Value == 0) + { + Text = string.Empty; + } + } +} diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Controls/SettingsPageControl/SettingsPageControl.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Controls/SettingsPageControl/SettingsPageControl.xaml index 4ef037951c64..2026f37e3a1a 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Controls/SettingsPageControl/SettingsPageControl.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Controls/SettingsPageControl/SettingsPageControl.xaml @@ -110,6 +110,7 @@ x:Name="SecondaryLinksPanel" Grid.Row="2" MaxWidth="{StaticResource PageMaxWidth}" + AutomationProperties.Name="{x:Bind SecondaryLinksHeader}" Orientation="Vertical" Visibility="{x:Bind SecondaryLinks.Count, Converter={StaticResource doubleToVisibilityConverter}}"> GetShowDataDiagnosticsInfoBar(); @@ -111,7 +96,7 @@ private static async Task GetReleaseNotesMarkdown() // https://docs.github.com/rest/overview/resources-in-the-rest-api#user-agent-required getReleaseInfoClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "PowerToys"); releaseNotesJSON = await getReleaseInfoClient.GetStringAsync("https://api.github.com/repos/microsoft/PowerToys/releases"); - IList releases = JsonSerializer.Deserialize>(releaseNotesJSON); + IList releases = JsonSerializer.Deserialize>(releaseNotesJSON, SourceGenerationContextContext.Default.IListPowerToysReleaseInfo); // Get the latest releases var latestReleases = releases.OrderByDescending(release => release.PublishedDate).Take(5); diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Views/AdvancedPaste.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Views/AdvancedPaste.xaml index f6308feba6bc..7aa817662141 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Views/AdvancedPaste.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Views/AdvancedPaste.xaml @@ -276,6 +276,37 @@ + + + + + + + + + + + + + + + + + + .GetInstance(settingsUtils), - null, + SettingsRepository.GetInstance(settingsUtils), ShellPage.SendDefaultIPCMessage); DataContext = ViewModel; InitializeComponent(); diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml index 6eee331171c7..fcd06e82929d 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Views/GeneralPage.xaml @@ -263,9 +263,21 @@ - + + + + + + diff --git a/src/settings-ui/Settings.UI/SettingsXAML/Views/ImageResizerPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/Views/ImageResizerPage.xaml index 7e7d956ce91b..2db21e91adfb 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/Views/ImageResizerPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/Views/ImageResizerPage.xaml @@ -19,6 +19,9 @@ + + + + Text="{x:Bind Width, Mode=OneWay, Converter={StaticResource ImageResizerDoubleToAutoConverter}, ConverterParameter=Auto}" /> - + Value="{x:Bind Width, Mode=TwoWay, Converter={StaticResource ImageResizerNumberBoxValueConverter}}" /> - + Value="{x:Bind Height, Mode=TwoWay, Converter={StaticResource ImageResizerNumberBoxValueConverter}}" /> - - + + + + + + + - - - - + Icon="{ui:BitmapIcon Source=/Assets/Settings/Icons/ZoomIt.png}" /> diff --git a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw index 758481916458..7afb9adafeb3 100644 --- a/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw +++ b/src/settings-ui/Settings.UI/Strings/en-us/Resources.resw @@ -1196,6 +1196,10 @@ TIFF compression {Locked="TIFF"} + + (auto) + Displayed on the preset card when the Width or Height property is zero. The same as "Input_Auto" in the ImageResizerUI project's resources. + File as in a computer file @@ -1933,6 +1937,15 @@ Made with 💗 by Microsoft and the PowerToys community. Paste as .html file + + Transcode audio / video + + + Transcode to .mp3 + + + Transcode to .mp4 (H.264/AAC) + OpenAI API key: diff --git a/src/settings-ui/Settings.UI/ViewModels/AdvancedPasteViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/AdvancedPasteViewModel.cs index ac25973ba246..ae75fe5bf6dc 100644 --- a/src/settings-ui/Settings.UI/ViewModels/AdvancedPasteViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/AdvancedPasteViewModel.cs @@ -18,12 +18,13 @@ using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Microsoft.Win32; using Windows.Security.Credentials; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class AdvancedPasteViewModel : Observable, IDisposable + public partial class AdvancedPasteViewModel : Observable, IDisposable { private static readonly HashSet WarnHotkeys = ["Ctrl + V", "Ctrl + Shift + V"]; @@ -83,7 +84,7 @@ public AdvancedPasteViewModel( _delayedTimer.Elapsed += DelayedTimer_Tick; _delayedTimer.AutoReset = false; - foreach (var action in _additionalActions.AllActions) + foreach (var action in _additionalActions.GetAllActions()) { action.PropertyChanged += OnAdditionalActionPropertyChanged; } @@ -365,7 +366,7 @@ public bool CloseAfterLosingFocus .Any(hotkey => WarnHotkeys.Contains(hotkey.ToString())); public bool IsAdditionalActionConflictingCopyShortcut => - _additionalActions.AllActions + _additionalActions.GetAllActions() .OfType() .Select(additionalAction => additionalAction.Shortcut) .Any(hotkey => WarnHotkeys.Contains(hotkey.ToString())); @@ -387,7 +388,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", AdvancedPasteSettings.ModuleName, - JsonSerializer.Serialize(_advancedPasteSettings))); + JsonSerializer.Serialize(_advancedPasteSettings, SourceGenerationContextContext.Default.AdvancedPasteSettings))); } public void RefreshEnabledState() diff --git a/src/settings-ui/Settings.UI/ViewModels/AlwaysOnTopViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/AlwaysOnTopViewModel.cs index f8787f763481..789ef92dfcfc 100644 --- a/src/settings-ui/Settings.UI/ViewModels/AlwaysOnTopViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/AlwaysOnTopViewModel.cs @@ -12,10 +12,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.Utilities; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class AlwaysOnTopViewModel : Observable + public partial class AlwaysOnTopViewModel : Observable { private ISettingsUtils SettingsUtils { get; set; } @@ -131,7 +132,7 @@ public HotkeySettings Hotkey CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", AlwaysOnTopSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.AlwaysOnTopSettings))); } } } diff --git a/src/settings-ui/Settings.UI/ViewModels/AwakeViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/AwakeViewModel.cs index 9de0c269b62f..fef95137e7e7 100644 --- a/src/settings-ui/Settings.UI/ViewModels/AwakeViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/AwakeViewModel.cs @@ -11,7 +11,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class AwakeViewModel : Observable + public partial class AwakeViewModel : Observable { public AwakeViewModel() { diff --git a/src/settings-ui/Settings.UI/ViewModels/CmdNotFoundViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/CmdNotFoundViewModel.cs index 37ad090abfb7..085e447c8e58 100644 --- a/src/settings-ui/Settings.UI/ViewModels/CmdNotFoundViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/CmdNotFoundViewModel.cs @@ -19,7 +19,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class CmdNotFoundViewModel : Observable + public partial class CmdNotFoundViewModel : Observable { public ButtonClickCommand CheckRequirementsEventHandler => new ButtonClickCommand(CheckCommandNotFoundRequirements); @@ -39,10 +39,7 @@ public static string AssemblyDirectory { get { - string codeBase = Assembly.GetExecutingAssembly().Location; - UriBuilder uri = new UriBuilder(codeBase); - string path = Uri.UnescapeDataString(uri.Path); - return Path.GetDirectoryName(path); + return Path.TrimEndingDirectorySeparator(AppContext.BaseDirectory); } } diff --git a/src/settings-ui/Settings.UI/ViewModels/ColorPickerViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/ColorPickerViewModel.cs index bf20e551f2bf..d6006a58f792 100644 --- a/src/settings-ui/Settings.UI/ViewModels/ColorPickerViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/ColorPickerViewModel.cs @@ -16,10 +16,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Enumerations; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class ColorPickerViewModel : Observable, IDisposable + public partial class ColorPickerViewModel : Observable, IDisposable { private bool disposedValue; @@ -56,15 +57,7 @@ public ColorPickerViewModel( _settingsUtils = settingsUtils ?? throw new ArgumentNullException(nameof(settingsUtils)); - if (colorPickerSettingsRepository == null) - { - // used in release. This method converts the settings stored in the previous form, so we have forwards compatibility - _colorPickerSettings = _settingsUtils.GetSettingsOrDefault(ColorPickerSettings.ModuleName, settingsUpgrader: ColorPickerSettings.UpgradeSettings); - } - else - { - _colorPickerSettings = colorPickerSettingsRepository.SettingsConfig; // used in the unit tests - } + _colorPickerSettings = colorPickerSettingsRepository.SettingsConfig; InitializeEnabledValue(); @@ -362,7 +355,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", ColorPickerSettings.ModuleName, - JsonSerializer.Serialize(_colorPickerSettings))); + JsonSerializer.Serialize(_colorPickerSettings, SourceGenerationContextContext.Default.ColorPickerSettings))); } public void RefreshEnabledState() diff --git a/src/settings-ui/Settings.UI/ViewModels/Commands/ButtonClickCommand.cs b/src/settings-ui/Settings.UI/ViewModels/Commands/ButtonClickCommand.cs index 8285a66c5abb..7d07eb3fd0f4 100644 --- a/src/settings-ui/Settings.UI/ViewModels/Commands/ButtonClickCommand.cs +++ b/src/settings-ui/Settings.UI/ViewModels/Commands/ButtonClickCommand.cs @@ -7,7 +7,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels.Commands { - public class ButtonClickCommand : ICommand + public partial class ButtonClickCommand : ICommand { private readonly Action _execute; diff --git a/src/settings-ui/Settings.UI/ViewModels/CropAndLockViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/CropAndLockViewModel.cs index 9064cd905879..dc5f6846ef2c 100644 --- a/src/settings-ui/Settings.UI/ViewModels/CropAndLockViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/CropAndLockViewModel.cs @@ -12,10 +12,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.Utilities; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class CropAndLockViewModel : Observable + public partial class CropAndLockViewModel : Observable { private ISettingsUtils SettingsUtils { get; set; } @@ -122,7 +123,7 @@ public HotkeySettings ReparentActivationShortcut CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", CropAndLockSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.CropAndLockSettings))); } } } @@ -153,7 +154,7 @@ public HotkeySettings ThumbnailActivationShortcut CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", CropAndLockSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.CropAndLockSettings))); } } } diff --git a/src/settings-ui/Settings.UI/ViewModels/DashboardListItem.cs b/src/settings-ui/Settings.UI/ViewModels/DashboardListItem.cs index 9e3110456be8..fa6fbba97a8e 100644 --- a/src/settings-ui/Settings.UI/ViewModels/DashboardListItem.cs +++ b/src/settings-ui/Settings.UI/ViewModels/DashboardListItem.cs @@ -13,7 +13,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class DashboardListItem : INotifyPropertyChanged + public partial class DashboardListItem : INotifyPropertyChanged { private bool _visible; private bool _isEnabled; diff --git a/src/settings-ui/Settings.UI/ViewModels/DashboardModuleItem.cs b/src/settings-ui/Settings.UI/ViewModels/DashboardModuleItem.cs index fe029e661936..20132bff2062 100644 --- a/src/settings-ui/Settings.UI/ViewModels/DashboardModuleItem.cs +++ b/src/settings-ui/Settings.UI/ViewModels/DashboardModuleItem.cs @@ -14,11 +14,11 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { #pragma warning disable SA1402 // File may only contain a single type #pragma warning disable SA1649 // File name should match first type name - public class DashboardModuleTextItem : DashboardModuleItem + public partial class DashboardModuleTextItem : DashboardModuleItem { } - public class DashboardModuleButtonItem : DashboardModuleItem + public partial class DashboardModuleButtonItem : DashboardModuleItem { public string ButtonTitle { get; set; } @@ -31,12 +31,12 @@ public class DashboardModuleButtonItem : DashboardModuleItem public RoutedEventHandler ButtonClickHandler { get; set; } } - public class DashboardModuleShortcutItem : DashboardModuleItem + public partial class DashboardModuleShortcutItem : DashboardModuleItem { public List Shortcut { get; set; } } - public class DashboardModuleKBMItem : DashboardModuleItem + public partial class DashboardModuleKBMItem : DashboardModuleItem { private List _remapKeys = new List(); @@ -55,7 +55,7 @@ public List RemapShortcuts } } - public class DashboardModuleItem : INotifyPropertyChanged + public partial class DashboardModuleItem : INotifyPropertyChanged { public string Label { get; set; } diff --git a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs index e779c222eec2..cc28b98e9fd1 100644 --- a/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/DashboardViewModel.cs @@ -22,7 +22,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class DashboardViewModel : Observable + public partial class DashboardViewModel : Observable { private const string JsonFileType = ".json"; private IFileSystemWatcher _watcher; @@ -55,7 +55,7 @@ public DashboardViewModel(ISettingsRepository settingsRepositor _allModules = new List(); - foreach (ModuleType moduleType in Enum.GetValues(typeof(ModuleType))) + foreach (ModuleType moduleType in Enum.GetValues()) { AddDashboardListItem(moduleType); } diff --git a/src/settings-ui/Settings.UI/ViewModels/EnvironmentVariablesViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/EnvironmentVariablesViewModel.cs index 636d88d1cae1..e256278d003d 100644 --- a/src/settings-ui/Settings.UI/ViewModels/EnvironmentVariablesViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/EnvironmentVariablesViewModel.cs @@ -16,7 +16,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class EnvironmentVariablesViewModel : Observable + public partial class EnvironmentVariablesViewModel : Observable { private bool _isElevated; private GpoRuleConfigured _enabledGpoRuleConfiguration; diff --git a/src/settings-ui/Settings.UI/ViewModels/FancyZonesViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/FancyZonesViewModel.cs index 50195b34ffab..cd8ace4703e8 100644 --- a/src/settings-ui/Settings.UI/ViewModels/FancyZonesViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/FancyZonesViewModel.cs @@ -13,7 +13,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class FancyZonesViewModel : Observable + public partial class FancyZonesViewModel : Observable { private SettingsUtils SettingsUtils { get; set; } diff --git a/src/settings-ui/Settings.UI/ViewModels/FileLocksmithViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/FileLocksmithViewModel.cs index 19175dba9af0..226d0c8b08ce 100644 --- a/src/settings-ui/Settings.UI/ViewModels/FileLocksmithViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/FileLocksmithViewModel.cs @@ -10,10 +10,11 @@ using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class FileLocksmithViewModel : Observable + public partial class FileLocksmithViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } @@ -134,7 +135,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", FileLocksmithSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.FileLocksmithSettings))); } private Func SendConfigMSG { get; } diff --git a/src/settings-ui/Settings.UI/ViewModels/Flyout/AllAppsViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/Flyout/AllAppsViewModel.cs index 58d1f4f9ce70..3239da678fd1 100644 --- a/src/settings-ui/Settings.UI/ViewModels/Flyout/AllAppsViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/Flyout/AllAppsViewModel.cs @@ -15,7 +15,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class AllAppsViewModel : Observable + public partial class AllAppsViewModel : Observable { public ObservableCollection FlyoutMenuItems { get; set; } @@ -34,7 +34,7 @@ public AllAppsViewModel(ISettingsRepository settingsRepository, resourceLoader = Helpers.ResourceLoaderInstance.ResourceLoader; FlyoutMenuItems = new ObservableCollection(); - foreach (ModuleType moduleType in Enum.GetValues(typeof(ModuleType))) + foreach (ModuleType moduleType in Enum.GetValues()) { AddFlyoutMenuItem(moduleType); } diff --git a/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutMenuItem.cs b/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutMenuItem.cs index 8493834f0f1a..3b38c425a351 100644 --- a/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutMenuItem.cs +++ b/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutMenuItem.cs @@ -10,7 +10,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class FlyoutMenuItem : INotifyPropertyChanged + public partial class FlyoutMenuItem : INotifyPropertyChanged { private bool _visible; private bool _isEnabled; diff --git a/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutViewModel.cs index a8cb2474aa93..4a834d9d310a 100644 --- a/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/Flyout/FlyoutViewModel.cs @@ -7,7 +7,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels.Flyout { - public class FlyoutViewModel : IDisposable + public partial class FlyoutViewModel : IDisposable { private Timer _hideTimer; private bool _disposed; diff --git a/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs index cf513d824233..a1db1e2dd01a 100644 --- a/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/Flyout/LauncherViewModel.cs @@ -15,7 +15,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class LauncherViewModel : Observable + public partial class LauncherViewModel : Observable { public bool IsUpdateAvailable { get; set; } diff --git a/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs index 6a2340f8c6fb..3669681bb79a 100644 --- a/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/GeneralViewModel.cs @@ -12,6 +12,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Text.Json; +using System.Text.Json.Serialization.Metadata; using System.Threading.Tasks; using global::PowerToys.GPOWrapper; @@ -22,11 +23,12 @@ using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.Utilities; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Microsoft.PowerToys.Telemetry; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class GeneralViewModel : Observable + public partial class GeneralViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } @@ -34,7 +36,7 @@ public class GeneralViewModel : Observable public ButtonClickCommand CheckForUpdatesEventHandler { get; set; } - public object ResourceLoader { get; set; } + public Windows.ApplicationModel.Resources.ResourceLoader ResourceLoader { get; set; } private Action HideBackupAndRestoreMessageAreaAction { get; set; } @@ -70,7 +72,7 @@ public class GeneralViewModel : Observable private SettingsBackupAndRestoreUtils settingsBackupAndRestoreUtils = SettingsBackupAndRestoreUtils.Instance; - public GeneralViewModel(ISettingsRepository settingsRepository, string runAsAdminText, string runAsUserText, bool isElevated, bool isAdmin, Func ipcMSGCallBackFunc, Func ipcMSGRestartAsAdminMSGCallBackFunc, Func ipcMSGCheckForUpdatesCallBackFunc, string configFileSubfolder = "", Action dispatcherAction = null, Action hideBackupAndRestoreMessageAreaAction = null, Action doBackupAndRestoreDryRun = null, Func> pickSingleFolderDialog = null, object resourceLoader = null) + public GeneralViewModel(ISettingsRepository settingsRepository, string runAsAdminText, string runAsUserText, bool isElevated, bool isAdmin, Func ipcMSGCallBackFunc, Func ipcMSGRestartAsAdminMSGCallBackFunc, Func ipcMSGCheckForUpdatesCallBackFunc, string configFileSubfolder = "", Action dispatcherAction = null, Action hideBackupAndRestoreMessageAreaAction = null, Action doBackupAndRestoreDryRun = null, Func> pickSingleFolderDialog = null, Windows.ApplicationModel.Resources.ResourceLoader resourceLoader = null) { CheckForUpdatesEventHandler = new ButtonClickCommand(CheckForUpdatesClick); RestartElevatedButtonEventHandler = new ButtonClickCommand(RestartElevated); @@ -121,7 +123,18 @@ public GeneralViewModel(ISettingsRepository settingsRepository, _isDevBuild = Helper.GetProductVersion() == "v0.0.1"; - _startup = GeneralSettingsConfig.Startup; + _runAtStartupGpoRuleConfiguration = GPOWrapper.GetConfiguredRunAtStartupValue(); + if (_runAtStartupGpoRuleConfiguration == GpoRuleConfigured.Disabled || _runAtStartupGpoRuleConfiguration == GpoRuleConfigured.Enabled) + { + // Get the enabled state from GPO. + _runAtStartupIsGPOConfigured = true; + _startup = _runAtStartupGpoRuleConfiguration == GpoRuleConfigured.Enabled; + } + else + { + _startup = GeneralSettingsConfig.Startup; + } + _showNewUpdatesToastNotification = GeneralSettingsConfig.ShowNewUpdatesToastNotification; _autoDownloadUpdates = GeneralSettingsConfig.AutoDownloadUpdates; _showWhatsNewAfterUpdates = GeneralSettingsConfig.ShowWhatsNewAfterUpdates; @@ -204,6 +217,8 @@ public GeneralViewModel(ISettingsRepository settingsRepository, private static bool _isDevBuild; private bool _startup; + private GpoRuleConfigured _runAtStartupGpoRuleConfiguration; + private bool _runAtStartupIsGPOConfigured; private bool _isElevated; private bool _runElevated; private bool _isAdmin; @@ -251,6 +266,12 @@ public bool Startup set { + if (_runAtStartupIsGPOConfigured) + { + // If it's GPO configured, shouldn't be able to change this state. + return; + } + if (_startup != value) { _startup = value; @@ -524,6 +545,11 @@ public bool IsDataDiagnosticsGPOManaged get => _enableDataDiagnosticsIsGpoDisallowed; } + public bool IsRunAtStartupGPOManaged + { + get => _runAtStartupIsGPOConfigured; + } + public string SettingsBackupAndRestoreDir { get @@ -1051,11 +1077,7 @@ public string GetResourceString(string resource) { if (ResourceLoader != null) { - var type = ResourceLoader.GetType(); - MethodInfo methodInfo = type.GetMethod("GetString"); - object classInstance = Activator.CreateInstance(type, null); - object[] parametersArray = new object[] { resource }; - var result = (string)methodInfo.Invoke(ResourceLoader, parametersArray); + var result = ResourceLoader.GetString(resource); if (string.IsNullOrEmpty(result)) { return resource.ToUpperInvariant() + "!!!"; @@ -1105,7 +1127,7 @@ public void Restart() GeneralSettingsCustomAction customaction = new GeneralSettingsCustomAction(outsettings); var dataToSend = customaction.ToString(); - dataToSend = JsonSerializer.Serialize(new { action = new { general = new { action_name = "restart_maintain_elevation" } } }); + dataToSend = JsonSerializer.Serialize(ActionMessage.Create("restart_maintain_elevation"), SourceGenerationContextContext.Default.ActionMessage); SendRestartAsAdminConfigMSG(dataToSend); } diff --git a/src/settings-ui/Settings.UI/ViewModels/HostsViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/HostsViewModel.cs index c15d8f9306cf..d2bfb989e77e 100644 --- a/src/settings-ui/Settings.UI/ViewModels/HostsViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/HostsViewModel.cs @@ -16,7 +16,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class HostsViewModel : Observable + public partial class HostsViewModel : Observable { private bool _isElevated; private GpoRuleConfigured _enabledGpoRuleConfiguration; diff --git a/src/settings-ui/Settings.UI/ViewModels/KeyboardManagerViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/KeyboardManagerViewModel.cs index 822df0d6f1e2..3aa90cbc245c 100644 --- a/src/settings-ui/Settings.UI/ViewModels/KeyboardManagerViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/KeyboardManagerViewModel.cs @@ -19,10 +19,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; using Microsoft.PowerToys.Settings.Utilities; +using Microsoft.Win32; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class KeyboardManagerViewModel : Observable + public partial class KeyboardManagerViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } @@ -31,7 +32,12 @@ public class KeyboardManagerViewModel : Observable private const string PowerToyName = KeyboardManagerSettings.ModuleName; private const string JsonFileType = ".json"; + // Default editor path. Can be removed once the new WinUI3 editor is released. private const string KeyboardManagerEditorPath = "KeyboardManagerEditor\\PowerToys.KeyboardManagerEditor.exe"; + + // New WinUI3 editor path. Still in development and do NOT use it in production. + private const string KeyboardManagerEditorUIPath = "KeyboardManagerEditorUI\\PowerToys.KeyboardManagerEditorUI.exe"; + private Process editor; private enum KeyboardManagerEditorType @@ -261,7 +267,37 @@ private void OpenEditor(int type) return; } - string path = Path.Combine(Environment.CurrentDirectory, KeyboardManagerEditorPath); + // Launch the new editor if: + // 1. the experimentation toggle is enabled in the settings + // 2. the new WinUI3 editor is enabled in the registry. The registry value does not exist by default and is only used for development purposes + string editorPath = KeyboardManagerEditorPath; + try + { + // Check if the experimentation toggle is enabled in the settings + var settingsUtils = new SettingsUtils(); + bool isExperimentationEnabled = SettingsRepository.GetInstance(settingsUtils).SettingsConfig.EnableExperimentation; + + // Only read the registry value if the experimentation toggle is enabled + if (isExperimentationEnabled) + { + // Read the registry value to determine which editor to launch + var key = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\PowerToys\Keyboard Manager"); + if (key != null && (int?)key.GetValue("UseNewEditor") == 1) + { + editorPath = KeyboardManagerEditorUIPath; + } + + // Close the registry key + key?.Close(); + } + } + catch (Exception e) + { + // Fall back to the default editor path if any exception occurs + Logger.LogError("Failed to launch the new WinUI3 Editor", e); + } + + string path = Path.Combine(Environment.CurrentDirectory, editorPath); Logger.LogInfo($"Starting {PowerToyName} editor from {path}"); // InvariantCulture: type represents the KeyboardManagerEditorType enum value diff --git a/src/settings-ui/Settings.UI/ViewModels/MeasureToolViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/MeasureToolViewModel.cs index 6c8ee5053549..ea66fd58dda4 100644 --- a/src/settings-ui/Settings.UI/ViewModels/MeasureToolViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/MeasureToolViewModel.cs @@ -11,10 +11,11 @@ using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class MeasureToolViewModel : Observable + public partial class MeasureToolViewModel : Observable { private ISettingsUtils SettingsUtils { get; set; } @@ -213,7 +214,7 @@ public HotkeySettings ActivationShortcut CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", MeasureToolSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.MeasureToolSettings))); } } } diff --git a/src/settings-ui/Settings.UI/ViewModels/MouseWithoutBordersViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/MouseWithoutBordersViewModel.cs index 5cfc22d6445e..2420ffccfd8a 100644 --- a/src/settings-ui/Settings.UI/ViewModels/MouseWithoutBordersViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/MouseWithoutBordersViewModel.cs @@ -21,6 +21,7 @@ using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Microsoft.UI; using Microsoft.UI.Dispatching; using Microsoft.UI.Xaml.Media; @@ -29,7 +30,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class MouseWithoutBordersViewModel : Observable, IDisposable + public partial class MouseWithoutBordersViewModel : Observable, IDisposable { // These should be in the same order as the ComboBoxItems in MouseWithoutBordersPage.xaml switch machine shortcut options private readonly int[] _switchBetweenMachineShortcutOptions = @@ -93,10 +94,23 @@ public bool ShowOriginalUI public bool UseService { - get => Settings.Properties.UseService; + get + { + if (_allowServiceModeGpoConfiguration == GpoRuleConfigured.Disabled) + { + return false; + } + + return Settings.Properties.UseService; + } set { + if (_allowServiceModeIsGPOConfigured) + { + return; + } + var valueChanged = Settings.Properties.UseService != value; // Set the UI property itself instantly @@ -122,6 +136,8 @@ public bool UseService } } + public bool UseServiceSettingIsEnabled => _allowServiceModeIsGPOConfigured == false; + public bool ConnectFieldsVisible { get => _connectFieldsVisible; @@ -185,6 +201,8 @@ public string ConnectPCName private bool _useOriginalUserInterfaceIsGPOConfigured; private GpoRuleConfigured _disallowBlockingScreensaverGpoConfiguration; private bool _disallowBlockingScreensaverIsGPOConfigured; + private GpoRuleConfigured _allowServiceModeGpoConfiguration; + private bool _allowServiceModeIsGPOConfigured; private GpoRuleConfigured _sameSubnetOnlyGpoConfiguration; private bool _sameSubnetOnlyIsGPOConfigured; private GpoRuleConfigured _validateRemoteIpGpoConfiguration; @@ -260,7 +278,7 @@ public struct MachineSocketState private static VisualStudio.Threading.AsyncSemaphore _ipcSemaphore = new VisualStudio.Threading.AsyncSemaphore(1); - private sealed class SyncHelper : IDisposable + private sealed partial class SyncHelper : IDisposable { public SyncHelper(NamedPipeClientStream stream) { @@ -507,6 +525,8 @@ private void InitializePolicyValues() _disableUserDefinedIpMappingRulesIsGPOConfigured = _disableUserDefinedIpMappingRulesGpoConfiguration == GpoRuleConfigured.Enabled; // Policies supporting only disabled state + _allowServiceModeGpoConfiguration = GPOWrapper.GetConfiguredMwbAllowServiceModeValue(); + _allowServiceModeIsGPOConfigured = _allowServiceModeGpoConfiguration == GpoRuleConfigured.Disabled; _clipboardSharingEnabledGpoConfiguration = GPOWrapper.GetConfiguredMwbClipboardSharingEnabledValue(); _clipboardSharingEnabledIsGPOConfigured = _clipboardSharingEnabledGpoConfiguration == GpoRuleConfigured.Disabled; _fileTransferEnabledGpoConfiguration = GPOWrapper.GetConfiguredMwbFileTransferEnabledValue(); @@ -1083,7 +1103,7 @@ public bool BlockMouseAtScreenCorners private IndexedObservableCollection machineMatrixString; - public class DeviceViewModel : Observable + public partial class DeviceViewModel : Observable { public string Name { get; set; } @@ -1185,7 +1205,7 @@ private void NotifyModuleUpdatedSettings() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", MouseWithoutBordersSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.MouseWithoutBordersSettings))); } public void NotifyUpdatedSettings() @@ -1231,6 +1251,14 @@ internal void UninstallService() SendCustomAction("uninstall_service"); } + public bool ShowPolicyConfiguredInfoForServiceSettings + { + get + { + return IsEnabled && _allowServiceModeIsGPOConfigured; + } + } + public bool ShowPolicyConfiguredInfoForBehaviorSettings { get @@ -1248,7 +1276,7 @@ public bool ShowInfobarCannotDragDropAsAdmin public bool ShowInfobarRunAsAdminText { - get { return !CanToggleUseService && IsEnabled; } + get { return !CanToggleUseService && IsEnabled && !ShowPolicyConfiguredInfoForServiceSettings; } } } } diff --git a/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs index 73c8335e1209..36c356ce57f5 100644 --- a/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/NewPlusViewModel.cs @@ -12,12 +12,12 @@ using System.Windows; using global::PowerToys.GPOWrapper; using ManagedCommon; -using Microsoft.PowerToys.Settings.UI.Helpers; using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.Utilities; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Windows.ApplicationModel.VoiceCommands; using Windows.System; @@ -25,7 +25,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class NewPlusViewModel : Observable + public partial class NewPlusViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } @@ -189,7 +189,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.NewPlusSettings))); } private Func SendConfigMSG { get; } diff --git a/src/settings-ui/Settings.UI/ViewModels/PeekViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PeekViewModel.cs index f6f6eac63be2..cfe0aa2fed9a 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PeekViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PeekViewModel.cs @@ -10,11 +10,12 @@ using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Settings.UI.Library; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PeekViewModel : Observable + public partial class PeekViewModel : Observable { private bool _isEnabled; @@ -224,7 +225,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", PeekSettings.ModuleName, - JsonSerializer.Serialize(_peekSettings))); + JsonSerializer.Serialize(_peekSettings, SourceGenerationContextContext.Default.PeekSettings))); } private void SavePreviewSettings() diff --git a/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs index c77d2c05967c..8f8e9b7b561d 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PluginAdditionalOptionViewModel.cs @@ -11,7 +11,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PluginAdditionalOptionViewModel : INotifyPropertyChanged + public partial class PluginAdditionalOptionViewModel : INotifyPropertyChanged { private PluginAdditionalOption _additionalOption; diff --git a/src/settings-ui/Settings.UI/ViewModels/PowerAccentViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PowerAccentViewModel.cs index ca2bdabe072f..320f23c4aeb9 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PowerAccentViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PowerAccentViewModel.cs @@ -15,7 +15,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PowerAccentViewModel : Observable + public partial class PowerAccentViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } diff --git a/src/settings-ui/Settings.UI/ViewModels/PowerLauncherPluginViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PowerLauncherPluginViewModel.cs index 1543ce727d2b..fd69c781a9be 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PowerLauncherPluginViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PowerLauncherPluginViewModel.cs @@ -14,7 +14,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PowerLauncherPluginViewModel : INotifyPropertyChanged + public partial class PowerLauncherPluginViewModel : INotifyPropertyChanged { private readonly PowerLauncherPluginSettings settings; private readonly Func isDark; diff --git a/src/settings-ui/Settings.UI/ViewModels/PowerLauncherViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PowerLauncherViewModel.cs index 67473e84e50a..8c02d5831938 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PowerLauncherViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PowerLauncherViewModel.cs @@ -17,10 +17,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PowerLauncherViewModel : Observable + public partial class PowerLauncherViewModel : Observable { private int _themeIndex; private int _monitorPositionIndex; @@ -74,7 +75,7 @@ public PowerLauncherViewModel( CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", PowerLauncherSettings.ModuleName, - JsonSerializer.Serialize(s))); + JsonSerializer.Serialize(s, SourceGenerationContextContext.Default.PowerLauncherSettings))); }; switch (settings.Properties.Theme) @@ -103,7 +104,7 @@ public PowerLauncherViewModel( break; } - SearchPluginsCommand = new RelayCommand(SearchPlugins); + SearchPluginsCommand = new Library.ViewModels.Commands.RelayCommand(SearchPlugins); } private void InitializeEnabledValue() diff --git a/src/settings-ui/Settings.UI/ViewModels/PowerOcrViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PowerOcrViewModel.cs index f7b81de07aa4..09aa682c397c 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PowerOcrViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PowerOcrViewModel.cs @@ -14,12 +14,13 @@ using Microsoft.PowerToys.Settings.UI.Library; using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; +using Microsoft.PowerToys.Settings.UI.SerializationContext; using Windows.Globalization; using Windows.Media.Ocr; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PowerOcrViewModel : Observable, IDisposable + public partial class PowerOcrViewModel : Observable, IDisposable { private bool disposedValue; @@ -236,7 +237,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", PowerOcrSettings.ModuleName, - JsonSerializer.Serialize(_powerOcrSettings))); + JsonSerializer.Serialize(_powerOcrSettings, SourceGenerationContextContext.Default.PowerOcrSettings))); } public void RefreshEnabledState() diff --git a/src/settings-ui/Settings.UI/ViewModels/PowerPreviewViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PowerPreviewViewModel.cs index 05704aa70e3f..86089a2d5df4 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PowerPreviewViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PowerPreviewViewModel.cs @@ -13,7 +13,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PowerPreviewViewModel : Observable + public partial class PowerPreviewViewModel : Observable { private const string ModuleName = PowerPreviewSettings.ModuleName; diff --git a/src/settings-ui/Settings.UI/ViewModels/PowerRenameViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/PowerRenameViewModel.cs index 00616bd678bb..e1dd68ed5fd0 100644 --- a/src/settings-ui/Settings.UI/ViewModels/PowerRenameViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/PowerRenameViewModel.cs @@ -14,7 +14,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class PowerRenameViewModel : Observable + public partial class PowerRenameViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } diff --git a/src/settings-ui/Settings.UI/ViewModels/RegistryPreviewViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/RegistryPreviewViewModel.cs index f6edc9952468..acd6f4012942 100644 --- a/src/settings-ui/Settings.UI/ViewModels/RegistryPreviewViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/RegistryPreviewViewModel.cs @@ -11,10 +11,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class RegistryPreviewViewModel : Observable + public partial class RegistryPreviewViewModel : Observable { private GeneralSettings GeneralSettingsConfig { get; set; } @@ -121,7 +122,7 @@ private void NotifySettingsChanged() CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", RegistryPreviewSettings.ModuleName, - JsonSerializer.Serialize(_settings))); + JsonSerializer.Serialize(_settings, SourceGenerationContextContext.Default.RegistryPreviewSettings))); } } } diff --git a/src/settings-ui/Settings.UI/ViewModels/ShellViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/ShellViewModel.cs index c60963b28ee6..54e998785872 100644 --- a/src/settings-ui/Settings.UI/ViewModels/ShellViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/ShellViewModel.cs @@ -19,7 +19,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class ShellViewModel : Observable + public partial class ShellViewModel : Observable { private readonly KeyboardAccelerator altLeftKeyboardAccelerator = BuildKeyboardAccelerator(VirtualKey.Left, VirtualKeyModifiers.Menu); diff --git a/src/settings-ui/Settings.UI/ViewModels/ShortcutGuideViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/ShortcutGuideViewModel.cs index e98b62dea455..6ae2dd0746d7 100644 --- a/src/settings-ui/Settings.UI/ViewModels/ShortcutGuideViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/ShortcutGuideViewModel.cs @@ -12,7 +12,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class ShortcutGuideViewModel : Observable + public partial class ShortcutGuideViewModel : Observable { private ISettingsUtils SettingsUtils { get; set; } diff --git a/src/settings-ui/Settings.UI/ViewModels/WorkspacesViewModel.cs b/src/settings-ui/Settings.UI/ViewModels/WorkspacesViewModel.cs index ff7ff1bf8824..e24b2ce59741 100644 --- a/src/settings-ui/Settings.UI/ViewModels/WorkspacesViewModel.cs +++ b/src/settings-ui/Settings.UI/ViewModels/WorkspacesViewModel.cs @@ -12,10 +12,11 @@ using Microsoft.PowerToys.Settings.UI.Library.Helpers; using Microsoft.PowerToys.Settings.UI.Library.Interfaces; using Microsoft.PowerToys.Settings.UI.Library.ViewModels.Commands; +using Microsoft.PowerToys.Settings.UI.SerializationContext; namespace Microsoft.PowerToys.Settings.UI.ViewModels { - public class WorkspacesViewModel : Observable + public partial class WorkspacesViewModel : Observable { private ISettingsUtils SettingsUtils { get; set; } @@ -131,7 +132,7 @@ public HotkeySettings Hotkey CultureInfo.InvariantCulture, "{{ \"powertoys\": {{ \"{0}\": {1} }} }}", WorkspacesSettings.ModuleName, - JsonSerializer.Serialize(Settings))); + JsonSerializer.Serialize(Settings, SourceGenerationContextContext.Default.WorkspacesSettings))); } } } diff --git a/tools/BugReportTool/BugReportTool/ProcessesList.cpp b/tools/BugReportTool/BugReportTool/ProcessesList.cpp index e283a2ec228c..9665938e7e20 100644 --- a/tools/BugReportTool/BugReportTool/ProcessesList.cpp +++ b/tools/BugReportTool/BugReportTool/ProcessesList.cpp @@ -2,52 +2,51 @@ #include std::vector processes = - { - L"PowerToys.exe", - L"PowerToys.Settings.exe", - L"PowerToys.ColorPickerUI.exe", - L"PowerToys.AdvancedPaste.exe", - L"PowerToys.Awake.exe", - L"PowerToys.FancyZonesEditor.exe", - L"PowerToys.FancyZones.exe", - L"PowerToys.FileLocksmithUI.exe", - L"PowerToys.KeyboardManagerEngine.exe", - L"PowerToys.KeyboardManagerEditor.exe", - L"PowerToys.PowerAccent.exe", - L"PowerToys.PowerLauncher.exe", - L"PowerToys.PowerOCR.exe", - L"PowerToys.MouseJumpUI.exe", - L"PowerToys.MeasureToolUI.exe", - L"PowerToys.ShortcutGuide.exe", - L"PowerToys.PowerRename.exe", - L"PowerToys.ImageResizer.exe", - L"PowerToys.Update.exe", - L"PowerToys.ActionRunner.exe", - L"PowerToys.AlwaysOnTop.exe", - L"PowerToys.Hosts.exe", - L"PowerToys.GcodePreviewHandler.exe", - L"PowerToys.GcodeThumbnailProvider.exe", - L"PowerToys.MarkdownPreviewHandler.exe", - L"PowerToys.MonacoPreviewHandler.exe", - L"PowerToys.PdfPreviewHandler.exe", - L"PowerToys.PdfThumbnailProvider.exe", - L"PowerToys.QoiPreviewHandler.exe", - L"PowerToys.QoiThumbnailProvider.exe", - L"PowerToys.StlThumbnailProvider.exe", - L"PowerToys.SvgPreviewHandler.exe", - L"PowerToys.SvgThumbnailProvider.exe", - L"PowerToys.RegistryPreview.exe", - L"PowerToys.MouseWithoutBorders.exe", - L"PowerToys.MouseWithoutBordersHelper.exe", - L"PowerToys.MouseWithoutBordersService.exe", - L"PowerToys.Peek.UI.exe", - L"PowerToys.CropAndLock.exe", - L"PowerToys.EnvironmentVariables.exe", - L"PowerToys.WorkspacesSnapshotTool.exe", - L"PowerToys.WorkspacesLauncher.exe", - L"PowerToys.WorkspacesLauncherUI.exe", - L"PowerToys.WorkspacesWindowArranger.exe", - L"PowerToys.WorkspacesEditor.exe", - L"Microsoft.CmdPal.UI.exe", - L"PowerToys.ZoomIt.exe", +{ + L"PowerToys.exe", + L"PowerToys.Settings.exe", + L"PowerToys.ColorPickerUI.exe", + L"PowerToys.AdvancedPaste.exe", + L"PowerToys.Awake.exe", + L"PowerToys.FancyZonesEditor.exe", + L"PowerToys.FancyZones.exe", + L"PowerToys.FileLocksmithUI.exe", + L"PowerToys.KeyboardManagerEngine.exe", + L"PowerToys.KeyboardManagerEditor.exe", + L"PowerToys.PowerAccent.exe", + L"PowerToys.PowerLauncher.exe", + L"PowerToys.PowerOCR.exe", + L"PowerToys.MouseJumpUI.exe", + L"PowerToys.MeasureToolUI.exe", + L"PowerToys.ShortcutGuide.exe", + L"PowerToys.PowerRename.exe", + L"PowerToys.ImageResizer.exe", + L"PowerToys.Update.exe", + L"PowerToys.ActionRunner.exe", + L"PowerToys.AlwaysOnTop.exe", + L"PowerToys.Hosts.exe", + L"PowerToys.GcodePreviewHandler.exe", + L"PowerToys.GcodeThumbnailProvider.exe", + L"PowerToys.MarkdownPreviewHandler.exe", + L"PowerToys.MonacoPreviewHandler.exe", + L"PowerToys.PdfPreviewHandler.exe", + L"PowerToys.PdfThumbnailProvider.exe", + L"PowerToys.QoiPreviewHandler.exe", + L"PowerToys.QoiThumbnailProvider.exe", + L"PowerToys.StlThumbnailProvider.exe", + L"PowerToys.SvgPreviewHandler.exe", + L"PowerToys.SvgThumbnailProvider.exe", + L"PowerToys.RegistryPreview.exe", + L"PowerToys.MouseWithoutBorders.exe", + L"PowerToys.MouseWithoutBordersHelper.exe", + L"PowerToys.MouseWithoutBordersService.exe", + L"PowerToys.Peek.UI.exe", + L"PowerToys.CropAndLock.exe", + L"PowerToys.EnvironmentVariables.exe", + L"PowerToys.WorkspacesSnapshotTool.exe", + L"PowerToys.WorkspacesLauncher.exe", + L"PowerToys.WorkspacesLauncherUI.exe", + L"PowerToys.WorkspacesWindowArranger.exe", + L"PowerToys.WorkspacesEditor.exe", + L"PowerToys.ZoomIt.exe", }; diff --git a/tools/BugReportTool/BugReportTool/ReportGPOValues.cpp b/tools/BugReportTool/BugReportTool/ReportGPOValues.cpp index 07842af5762f..704ec6b79280 100644 --- a/tools/BugReportTool/BugReportTool/ReportGPOValues.cpp +++ b/tools/BugReportTool/BugReportTool/ReportGPOValues.cpp @@ -87,6 +87,7 @@ void ReportGPOValues(const std::filesystem::path &tmpDir) report << "getConfiguredMwbFileTransferEnabledValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbFileTransferEnabledValue()) << std::endl; report << "getConfiguredMwbUseOriginalUserInterfaceValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbUseOriginalUserInterfaceValue()) << std::endl; report << "getConfiguredMwbDisallowBlockingScreensaverValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbDisallowBlockingScreensaverValue()) << std::endl; + report << "getConfiguredMwbAllowServiceModeValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbAllowServiceModeValue()) << std::endl; report << "getConfiguredMwbSameSubnetOnlyValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbSameSubnetOnlyValue()) << std::endl; report << "getConfiguredMwbValidateRemoteIpValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbValidateRemoteIpValue()) << std::endl; report << "getConfiguredMwbDisableUserDefinedIpMappingRulesValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredMwbDisableUserDefinedIpMappingRulesValue()) << std::endl; @@ -94,4 +95,5 @@ void ReportGPOValues(const std::filesystem::path &tmpDir) report << "getConfiguredNewPlusEnabledValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredNewPlusEnabledValue()) << std::endl; report << "getConfiguredNewPlusHideTemplateFilenameExtensionValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredNewPlusHideTemplateFilenameExtensionValue()) << std::endl; report << "getAllowDataDiagnosticsValue: " << gpo_rule_configured_to_string(powertoys_gpo::getAllowDataDiagnosticsValue()) << std::endl; + report << "getConfiguredRunAtStartupValue: " << gpo_rule_configured_to_string(powertoys_gpo::getConfiguredRunAtStartupValue()) << std::endl; }