[
  {
    "path": ".github/CONTRIBUTING.md",
    "content": "# How to Contribute?\n\nWe welcome contributions from the community. You can contribute to Win11Debloat by:\n- Reporting issues and bugs [here](https://github.com/Raphire/Win11Debloat/issues/new?template=bug_report.yml)\n- Submitting feature requests [here](https://github.com/Raphire/Win11Debloat/issues/new?template=feature_request.yml)\n- Testing Win11Debloat\n- Creating a pull request\n- Improving the documentation\n\n# Testing Win11Debloat\n\nYou can help us test the latest changes and additions to the script. If you encounter any issues, please report them [here](https://github.com/Raphire/Win11Debloat/issues/new?template=bug_report.yml).\n\n> [!WARNING]\n> The prerelease version of Win11Debloat is meant for developers to test the script. Don't use this in production environments!\n\nYou can launch the prerelease version of Win11Debloat by running this command:\n```ps1\n& ([scriptblock]::Create((irm \"https://debloat.raphi.re/dev\")))\n```\n\n# Contributing Code\n\n## Getting Started\n\n### Fork and Clone the Repository\n\n1. **Fork the project** on GitHub by clicking the \"Fork\" button at the top right of the repository page.\n\n2. **Clone the repository** to your local machine:\n   ```powershell\n   git clone https://github.com/YOUR-USERNAME/Win11Debloat.git\n   cd Win11Debloat\n   ```\n\n3. **Create a new branch** for your contribution:\n   ```powershell\n   git checkout -b feature/your-feature-name\n   ```\n\n### Running the Script Locally\n\n1. Open PowerShell as an administrator\n2. Enable script execution if necessary:\n   ```powershell\n   Set-ExecutionPolicy Unrestricted -Scope Process -Force\n   ```\n3. Navigate to your Win11Debloat directory\n4. Run the script:\n   ```powershell\n   .\\Win11Debloat.ps1\n   ```\n\n## Implementation Guidelines\n\n### Project Structure\n\nUnderstanding the project structure is essential for contributing effectively:\n\n```\nWin11Debloat/\n├── Win11Debloat.ps1             # Main PowerShell script\n├── Scripts/                     # Additional PowerShell scripts and functions\n│    └── Get.ps1                 # Script used for the quick launch method to automatically download and run Win11debloat\n├── Config/\n│   ├── Apps.json                # List of supported apps for removal\n│   ├── DefaultSettings.json     # Default configuration preset\n│   ├── Features.json            # All features with metadata\n│   └── LastUsedSettings.json    # Last used configuration (generated during use)\n├── Regfiles/                    # Registry files for each feature\n└── Schemas/                     # XAML Schemas for GUI elements\n```\n\n### Best Practices\n\n1. **Test Thoroughly**: Always test your changes on a Windows test environment before submitting. This includes undoing tweaks and running script as another user and in Sysprep mode.\n2. **Document Changes**: Update the `README.md` and other relevant documentation. Wiki documentation will be generated/updated based on the `Features.json` and `Apps.json` files.\n3. **Follow Existing Patterns**: Look at existing implementations for guidance.\n4. **Use Clear Naming**: Choose descriptive names for features, IDs, and registry files.\n5. **Minimal Changes**: Registry files should only modify what's necessary. Avoid using policies where possible.\n6. **Comment Your Code**: Add comments explaining your reasoning for complex logic in PowerShell scripts.\n7. **Version Constraints**: Use `MinVersion` and `MaxVersion` if a feature only applies to specific Windows versions.\n8. **Limit pull requests to 1 feature**: Keep pull requests limited to just one feature, this makes it easier to review your changes.\n\n### Code Style\n\n- Use **4 spaces** for indentation in PowerShell scripts\n- Use **2 spaces** for indentation in JSON files\n- Follow existing naming conventions\n- Keep lines reasonable in length\n- Use descriptive variable names\n- Try to limit your indentation to a max of 4-5 levels, if possible.\n- Use [Segoe Fluent Icon Assets](https://learn.microsoft.com/en-us/windows/apps/design/iconography/segoe-fluent-icons-font) for icons.\n\n### Common Pitfalls\n\nAvoid these common mistakes when contributing:\n\n1. **Forgetting Get.ps1**: When adding a new command-line parameter, contributors often remember to add it to `Win11Debloat.ps1` but forget to add the same parameter to `Scripts/Get.ps1`. Both files **must** have matching parameters.\n\n2. **Missing Registry Files**: Always create an `Undo` registry file for reversibility, aswell as a `Sysprep` registry file for Sysprep mode.\n\n3. **Incorrect Registry Hives for Sysprep**: Sysprep registry files apply changes to Windows' default user, registry keys in the `HKEY_CURRENT_USER` hive must use `hkey_users\\default` instead. Ensure you update **all** registry keys in the file.\n\n4. **Wrong Registry File Location**:\n   - Main action files go in `Regfiles/`\n   - Undo files go in `Regfiles/Undo/`\n   - Sysprep files go in `Regfiles/Sysprep/`\n\n   Placing files in the wrong directory will cause the script to fail when trying to apply or undo changes.\n\n6. **Not Testing Undo Functionality**: Always test that your undo registry file properly reverts all changes. A feature that can't be undone will frustrate users.\n\n7. **Not Testing User/Sysprep Functionality**: Always test that your feature works when applied to another user or to the Windows default user with Sysprep. Sysprep changes can be tested by creating new users after running the script.\n\n7. **Missing Category**: Features without a `Category` field (set to `null`) won't appear in the GUI. This is intentional for command-line-only features, make sure this is what you want before submitting.\n\n8. **Hardcoded Paths**: When writing PowerShell logic, use `$PSScriptRoot` and script variables instead of hardcoded paths. This ensures the script works regardless of where it's installed.\n\n## Implementing New Features\n\n### Adding Support for a New App\n\n> [!NOTE]\n> The script automatically generates the app options for the GUI from the app information in the Apps.json file.\n\nTo add a new app that can be removed via Win11Debloat:\n\n1. **Find the AppId**: To find the correct AppId for an app:\n   ```powershell\n   Get-AppxPackage | Select-Object Name, PackageFullName\n   ```\n\n2. **Edit `Config/Apps.json`**: Add a new entry to the `\"Apps\"` array:\n   ```json\n   {\n     \"FriendlyName\": \"Display Name\",\n     \"AppId\": \"AppPackageIdentifier\",\n     \"Description\": \"Brief description of the app\",\n     \"SelectedByDefault\": true|false\n   }\n   ```\n\n3. **Follow the Guidelines**:\n- Use clear, user-friendly names for `FriendlyName`\n- Set `SelectedByDefault` to `true` only for apps that are largely considered bloatware, otherwise set to `false`\n- Provide a concise description explaining what the app does\n\n### Adding a New Feature\n\nFeatures are defined in `Config/Features.json` and can modify Windows settings via registry files or PowerShell commands.\n\n> [!NOTE]\n> For simple features that just include a registry change, no actual coding is required in the main script except for adding the corresponding command-line parameters. The GUI is automatically built using the information in the Features.json file.\n\n#### 1a. Create the Registry File(s)\n\nCreate new registry files in the `Regfiles/` directory:\n\n- **Disable file**: `Disable_YourFeature.reg`\n- **Enable file**: `Undo/Enable_YourFeature.reg` (for reverting)\n- **Sysprep file**: `Sysprep/Disable_YourFeature.reg` (for Sysprep mode)\n\nExample registry file structure:\n```reg\nWindows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\YourPath]\n\"SettingName\"=dword:00000000\n```\n\nA Sysprep registry file should apply the same changes as the normal action. Replace the hive of registry keys that start with `HKEY_CURRENT_USER` with `hkey_users\\default`. For example:\n```reg\nWindows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\YourPath]\n\"SettingName\"=dword:00000000\n```\n\n#### 1b. Implement the Feature Logic\n\nIf your feature requires more than just applying a registry file, add custom logic to the main script in the appropriate section. In most cases this will involve creating a new entry in the `ExecuteParameter` function for your new feature.\n\n#### 2. Add Feature to Features.json\n\nAdd your feature to the `\"Features\"` array in `Config/Features.json`:\n\n```json\n{\n  \"FeatureId\": \"YourFeatureId\",\n  \"Label\": \"Short label describing the feature\",\n  \"ToolTip\": \"Detailed explanation of what this feature does and its impact.\",\n  \"Category\": \"Privacy & Suggested Content\",\n  \"Priority\": 1,\n  \"Action\": \"Disable\",\n  \"RegistryKey\": \"Disable_YourFeature.reg\",\n  \"ApplyText\": \"Disabling your feature...\",\n  \"UndoAction\": \"Enable\",\n  \"RegistryUndoKey\": \"Enable_YourFeature.reg\",\n  \"RequiresReboot\": false,\n  \"MinVersion\": null,\n  \"MaxVersion\": null\n}\n```\n\n**Field Descriptions**:\n- `FeatureId`: Unique identifier (must match parameter name in Win11Debloat.ps1 and Get.ps1)\n- `Label`: Short description shown in the UI, written in a way to fit with the Action or UndoAction prefixed\n- `ToolTip`: Detailed explanation of what the feature does, used for tooltips in the GUI\n- `Category`: One of the predefined categories (see Categories array in Features.json), features without a category won't be loaded into the GUI.\n- `Priority`: Optional. The priority value (int) is used to sort features within a category. If this field is omitted the feature will be sorted based on the order in the Features.json file.\n- `Action`: Action word for the feature (e.g., \"Disable\", \"Enable\", \"Hide\", \"Show\")\n- `RegistryKey`: Filename of the registry file to apply (in Regfiles/ directory) or null if feature does not require registry changes\n- `ApplyText`: Message shown when applying the feature\n- `UndoAction`: Action word for reverting (e.g., \"Enable\", \"Show\")\n- `RegistryUndoKey`: Filename of the registry file to revert changes or null if feature does not require registry changes\n- `RequiresReboot`: Optional boolean. Set to `true` if the feature requires a system reboot to take effect\n- `MinVersion`: Minimum Windows build version (e.g., \"22000\") or null\n- `MaxVersion`: Maximum Windows version or null\n\n#### 3. Add Command-Line Parameter\n\nAdd a corresponding parameter to both `Win11Debloat.ps1` AND `Scripts/Get.ps1`, the parameter name should match the FeatureId you have defined in `Features.json`. In most cases this will be a switch parameter, example:\n```powershell\n[switch]$YourFeatureId,\n```\n\n### Adding a Feature to the Default Preset\n\n> [!IMPORTANT]\n> The default preset is intentionally conservative. Features added to it should be thoroughly tested and widely beneficial. When in doubt, leave the feature out of the default preset.\n\nThe default preset (`Config/DefaultSettings.json`) defines which features are automatically applied when users run Win11Debloat in \"Default Mode\" or with the `-RunDefaults` parameter. This preset should include features that are widely considered to improve the Windows experience without breaking functionality.\n\n**When to add a feature to the default preset:**\n- The feature removes obvious bloatware or distractions\n- The feature enhances privacy without breaking core functionality\n- The feature is generally non-controversial and beneficial to most users\n- The change can be easily reverted if needed\n\n**When NOT to add a feature to the default preset:**\n- The feature significantly changes core Windows behavior\n- The feature might break applications or workflows for some users\n- The feature is highly opinionated or preference-based\n- The feature is experimental or not thoroughly tested\n\nTo add your feature to the default preset, edit `Config/DefaultSettings.json` and add a new entry to the `\"Settings\"` array:\n\n```json\n{\n  \"Name\": \"YourFeatureId\",\n  \"Value\": true\n}\n```\n\n**Field Descriptions**:\n- `Name`: Must exactly match the `FeatureId` from Features.json\n- `Value`: Set to `true` to enable the feature in default mode\n\n**Example:**\n```json\n{\n  \"Version\": \"1.0\",\n  \"Settings\": [\n    {\n      \"Name\": \"CreateRestorePoint\",\n      \"Value\": true\n    },\n    {\n      \"Name\": \"DisableTelemetry\",\n      \"Value\": true\n    },\n    {\n      \"Name\": \"YourFeatureId\",\n      \"Value\": true\n    }\n  ]\n}\n```\n\n### Adding a Category\n\nTo add a new category for organizing features:\n\n- Add a new category entry to the `\"Categories\"` array in `Config/Features.json`:\n   ```json\n   {\n     \"Name\": \"Your Category Name\",\n     \"Icon\": \"&#xE#### ;\"\n   }\n   ```\n\n> [!TIP]\n> Use [Segoe Fluent Icon Assets](https://learn.microsoft.com/en-us/windows/apps/design/iconography/segoe-fluent-icons-font) for icon codes.\n\n### Adding UI Groups\n\nUI Groups allow features to be grouped together in the GUI with a combobox (dropdown) selection:\n\n```json\n{\n  \"GroupId\": \"UniqueGroupId\",\n  \"Label\": \"Display label for the group\",\n  \"ToolTip\": \"Explanation of what this group controls\",\n  \"Category\": \"Category Name\",\n  \"Priority\": 1,\n  \"Values\": [\n    {\n      \"Label\": \"Option 1\",\n      \"FeatureIds\": [\"FeatureId1\"]\n    },\n    {\n      \"Label\": \"Option 2\",\n      \"FeatureIds\": [\"FeatureId2\"]\n    }\n  ]\n}\n```\n\n## Submitting a Pull Request\n\n1. **Commit your changes** with clear, descriptive commit messages:\n   ```powershell\n   git add .\n   git commit -m \"Add feature: Description of your changes\"\n   ```\n\n2. **Push to your fork**:\n   ```powershell\n   git push origin feature/your-feature-name\n   ```\n\n3. **Create a Pull Request** on GitHub:\n   - Go to the original Win11Debloat repository\n   - Click \"New Pull Request\"\n   - Select your fork and branch\n   - Provide a clear description of your changes, include references to the registry keys used\n   - Reference any related issues\n\n4. **Respond to feedback**: Be prepared to make adjustments based on code review feedback.\n\n# Questions?\n\nIf you have questions about contributing, feel free to:\n- Open a [discussion](https://github.com/Raphire/Win11Debloat/discussions)\n- Comment on an existing issue\n- Ask in your pull request"
  },
  {
    "path": ".github/FUNDING.yml",
    "content": "github: raphire\nko_fi: raphire"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "content": "name: \"🐞 Bug report\"\ndescription: \"Report an issue you encountered\"\nlabels: [\"bug\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        # 🐞 **Bug report**\n        Thanks for taking the time to fill out this bug report! Please provide as much information as possible in your report to help us understand and resolve the issue.\n\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: Checklist\n      description: Please confirm the following before posting your issue.\n      options:\n        - label: I have searched for existing issues/discussions and didn't find any similar ones.\n          required: true\n        - label: I haven't used any other scripts, tools or programs that might have caused this issue.\n          required: false\n\n  - type: input\n    id: windows_version\n    attributes:\n      label: Windows version\n      description: What version of Windows are you using?\n      placeholder: e.g. Windows 11 24H2 (26100.4202)\n    validations:\n      required: true\n\n  - type: input\n    id: script_setting\n    attributes:\n      label: Script mode/options\n      description: What mode/options did you use with the script?\n      placeholder: e.g. \"Default mode\", \"Custom mode with options X, Y, Z\"\n    validations:\n      required: true\n\n  - type: textarea\n    id: issue_description\n    attributes:\n      label: Describe the issue\n      description: Provide a clear and detailed description of the issue.\n      placeholder: e.g. \"When I ran the script I expected [...], but instead [...]. This caused [...].\"\n    validations:\n      required: true\n\n  - type: textarea\n    id: steps_to_reproduce\n    attributes:\n      label: Steps to reproduce\n      description: How can the behaviour be reproduced? Please provide detailed steps.\n      placeholder: |\n        1. Open '...'\n        2. Select '...'\n        3. Wait for '...'\n        4. Etc.\n    validations:\n      required: true\n\n  - type: textarea\n    id: error_logs\n    attributes:\n      label: Error output\n      description: \"Include any relevant logs or error messages. Logs can be found in `%temp%/Win11Debloat` or the root folder of the script. Please keep in mind that logs may contain personal information such as usernames and the name of your PC, so review them before submitting.\"\n      placeholder: Include any relevant logs or error messages.\n    validations:\n      required: false\n\n  - type: textarea\n    id: additional_context\n    attributes:\n      label: Additional context\n      description: Add any other context about the problem here.\n      placeholder: e.g. Screenshots, links to related discussions, etc.\n    validations:\n      required: false\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n  - name: Open a discussion\n    url: https://github.com/Raphire/Win11Debloat/discussions\n    about: Discuss anything that is not a bug report or feature request"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "content": "name: \"💡 Feature request\"\ndescription: \"Suggest a new feature or improvement\"\nlabels: [\"enhancement\"]\n\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        # 💡 **Feature request**\n        Thanks for taking the time to suggest a feature for Win11Debloat! Please include as much detail as possible to help us understand and evaluate your suggestion.\n\n  - type: checkboxes\n    id: checklist\n    attributes:\n      label: Checklist\n      description: Please confirm the following before posting your issue.\n      options:\n        - label: I have searched for existing issues/discussions and didn't find any similar ones.\n          required: true\n\n  - type: textarea\n    id: description\n    attributes:\n      label: Describe the feature or improvement\n      description: Provide a clear and concise description of your suggested feature or improvement. Explain why you think this feature is needed and how it would benefit users.\n      placeholder: Describe the feature or improvement.\n    validations:\n      required: true\n\n  - type: textarea\n    id: examples\n    attributes:\n      label: Examples\n      description: Provide examples of how the feature could work or be implemented.\n      placeholder: e.g. Code snippets, mockups, or links to other implementations of similar features.\n    validations:\n      required: false\n\n  - type: textarea\n    id: additional_context\n    attributes:\n      label: Additional context\n      description: Add any other context or screenshots about the feature request here.\n      placeholder: e.g. Screenshots, links to related discussions, etc.\n    validations:\n      required: false\n"
  },
  {
    "path": ".gitignore",
    "content": "LastSettings\nSavedSettings\nLastUsedSettings.json\nCustomAppsList\nLogs/*\nWin11Debloat.log"
  },
  {
    "path": "Assets/Start/What is this file.txt",
    "content": "The `start2.bin` file is used by Windows 11 to save the apps or app stubs that are pinned to the start menu. \n\nThis file is a binary that cannot be easily edited. For this reason Win11Debloat includes a version of this binary file that has no apps pinned at all, allowing Win11Debloat to clear the start menu pinned apps for you."
  },
  {
    "path": "Config/Apps.json",
    "content": "{\n  \"Version\": \"1.1\",\n  \"Apps\": [\n    {\n      \"FriendlyName\": \"Clipchamp\",\n      \"AppId\": \"Clipchamp.Clipchamp\",\n      \"Description\": \"Video editor from Microsoft\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"3D Builder\",\n      \"AppId\": \"Microsoft.3DBuilder\",\n      \"Description\": \"Basic 3D modeling software\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Cortana\",\n      \"AppId\": \"Microsoft.549981C3F5F10\",\n      \"Description\": \"Microsoft Cortana voice assistant (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Finance\",\n      \"AppId\": \"Microsoft.BingFinance\",\n      \"Description\": \"Finance news and tracking via Bing (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Food And Drink\",\n      \"AppId\": \"Microsoft.BingFoodAndDrink\",\n      \"Description\": \"Recipes and food news via Bing (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Health And Fitness\",\n      \"AppId\": \"Microsoft.BingHealthAndFitness\",\n      \"Description\": \"Health and fitness tracking/news via Bing (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing News\",\n      \"AppId\": \"Microsoft.BingNews\",\n      \"Description\": \"News aggregator via Bing (Replaced by Microsoft News/Start)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Sports\",\n      \"AppId\": \"Microsoft.BingSports\",\n      \"Description\": \"Sports news and scores via Bing (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Translator\",\n      \"AppId\": \"Microsoft.BingTranslator\",\n      \"Description\": \"Translation service via Bing\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Travel\",\n      \"AppId\": \"Microsoft.BingTravel\",\n      \"Description\": \"Travel planning and news via Bing (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Weather\",\n      \"AppId\": \"Microsoft.BingWeather\",\n      \"Description\": \"Weather forecast via Bing\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Copilot\",\n      \"AppId\": \"Microsoft.Copilot\",\n      \"Description\": \"AI assistant integrated into Windows\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Copilot+ AI Hub\",\n      \"AppId\": \"Microsoft.Windows.AIHub\",\n      \"Description\": \"Copilot+ AI Hub app (Windows 11 24H2+)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft PC Manager\",\n      \"AppId\": \"Microsoft.PCManager\",\n      \"Description\": \"Microsoft PC Manager system cleanup and optimization tool (often preinstalled)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Get Started\",\n      \"AppId\": \"Microsoft.Getstarted\",\n      \"Description\": \"Tips and introductory guide for Windows (Cannot be uninstalled in Windows 11)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Messaging\",\n      \"AppId\": \"Microsoft.Messaging\",\n      \"Description\": \"Messaging app, often integrates with Skype (Largely discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"3D Viewer\",\n      \"AppId\": \"Microsoft.Microsoft3DViewer\",\n      \"Description\": \"Viewer for 3D models\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft Journal\",\n      \"AppId\": \"Microsoft.MicrosoftJournal\",\n      \"Description\": \"Digital note-taking app optimized for pen input\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Office Hub\",\n      \"AppId\": \"Microsoft.MicrosoftOfficeHub\",\n      \"Description\": \"Hub to access Microsoft Office apps and documents (Precursor to Microsoft 365 app)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Power BI\",\n      \"AppId\": \"Microsoft.MicrosoftPowerBIForWindows\",\n      \"Description\": \"Business analytics service client\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Solitaire Collection\",\n      \"AppId\": \"Microsoft.MicrosoftSolitaireCollection\",\n      \"Description\": \"Collection of solitaire card games\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Sticky Notes\",\n      \"AppId\": \"Microsoft.MicrosoftStickyNotes\",\n      \"Description\": \"Digital sticky notes app (Discontinued & replaced by OneNote)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Mixed Reality Portal\",\n      \"AppId\": \"Microsoft.MixedReality.Portal\",\n      \"Description\": \"Portal for Windows Mixed Reality headsets\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Network Speed Test\",\n      \"AppId\": \"Microsoft.NetworkSpeedTest\",\n      \"Description\": \"Internet connection speed test utility\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft News\",\n      \"AppId\": \"Microsoft.News\",\n      \"Description\": \"News aggregator (Replaced Bing News, now part of Microsoft Start)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"OneNote\",\n      \"AppId\": \"Microsoft.Office.OneNote\",\n      \"Description\": \"Digital note-taking app (Universal Windows Platform version)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Sway\",\n      \"AppId\": \"Microsoft.Office.Sway\",\n      \"Description\": \"Presentation and storytelling app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"One Connect\",\n      \"AppId\": \"Microsoft.OneConnect\",\n      \"Description\": \"Mobile Operator management app (Replaced by Mobile Plans)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Print 3D\",\n      \"AppId\": \"Microsoft.Print3D\",\n      \"Description\": \"3D printing preparation software\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Power Automate\",\n      \"AppId\": \"Microsoft.PowerAutomateDesktop\",\n      \"Description\": \"Desktop automation tool (RPA)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Skype (UWP)\",\n      \"AppId\": \"Microsoft.SkypeApp\",\n      \"Description\": \"Skype communication app, Universal Windows Platform version (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft To Do\",\n      \"AppId\": \"Microsoft.Todos\",\n      \"Description\": \"To-do list and task management app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Dev Home\",\n      \"AppId\": \"Microsoft.Windows.DevHome\",\n      \"Description\": \"Developer dashboard and tool configuration utility (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Alarms & Clock\",\n      \"AppId\": \"Microsoft.WindowsAlarms\",\n      \"Description\": \"Alarms & Clock app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Feedback Hub\",\n      \"AppId\": \"Microsoft.WindowsFeedbackHub\",\n      \"Description\": \"App for providing feedback to Microsoft on Windows\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Windows Maps\",\n      \"AppId\": \"Microsoft.WindowsMaps\",\n      \"Description\": \"Mapping and navigation app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Sound Recorder\",\n      \"AppId\": \"Microsoft.WindowsSoundRecorder\",\n      \"Description\": \"Basic audio recording app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Xbox Console Companion\",\n      \"AppId\": \"Microsoft.XboxApp\",\n      \"Description\": \"Old Xbox Console Companion App (Discontinued)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Movies & TV\",\n      \"AppId\": \"Microsoft.ZuneVideo\",\n      \"Description\": \"Movies & TV app for renting/buying/playing video content (Rebranded as \\\"Films & TV\\\")\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Family Safety\",\n      \"AppId\": \"MicrosoftCorporationII.MicrosoftFamily\",\n      \"Description\": \"Family Safety App for managing family accounts and settings\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Quick Assist\",\n      \"AppId\": \"MicrosoftCorporationII.QuickAssist\",\n      \"Description\": \"Remote assistance tool\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft Teams (Old)\",\n      \"AppId\": \"MicrosoftTeams\",\n      \"Description\": \"Old Microsoft Teams personal (MS Store version)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft Teams (New)\",\n      \"AppId\": \"MSTeams\",\n      \"Description\": \"New Microsoft Teams app (Work/School or Personal)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"ACG Media Player\",\n      \"AppId\": \"ACGMediaPlayer\",\n      \"Description\": \"Media player app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Actipro Software\",\n      \"AppId\": \"ActiproSoftwareLLC\",\n      \"Description\": \"Potentially UI controls or software components, often bundled by OEMs\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Adobe Photoshop Express\",\n      \"AppId\": \"AdobeSystemsIncorporated.AdobePhotoshopExpress\",\n      \"Description\": \"Basic photo editing app from Adobe\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Amazon\",\n      \"AppId\": \"Amazon.com.Amazon\",\n      \"Description\": \"Amazon shopping app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Prime Video\",\n      \"AppId\": \"AmazonVideo.PrimeVideo\",\n      \"Description\": \"Amazon Prime Video streaming service app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Asphalt 8\",\n      \"AppId\": \"Asphalt8Airborne\",\n      \"Description\": \"Racing game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Autodesk SketchBook\",\n      \"AppId\": \"AutodeskSketchBook\",\n      \"Description\": \"Digital drawing and sketching app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Caesars Slots\",\n      \"AppId\": \"CaesarsSlotsFreeCasino\",\n      \"Description\": \"Casino slot machine game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Cooking Fever\",\n      \"AppId\": \"COOKINGFEVER\",\n      \"Description\": \"Restaurant simulation game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"CyberLink Media Suite\",\n      \"AppId\": \"CyberLinkMediaSuiteEssentials\",\n      \"Description\": \"Multimedia software suite (often preinstalled by OEMs)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Disney Magic Kingdoms\",\n      \"AppId\": \"DisneyMagicKingdoms\",\n      \"Description\": \"Disney theme park building game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Disney\",\n      \"AppId\": \"Disney\",\n      \"Description\": \"General Disney content app (may vary by region/OEM, often Disney+)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Drawboard PDF\",\n      \"AppId\": \"DrawboardPDF\",\n      \"Description\": \"PDF viewing and annotation app, often focused on pen input\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Duolingo\",\n      \"AppId\": \"Duolingo-LearnLanguagesforFree\",\n      \"Description\": \"Language learning app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Eclipse Manager\",\n      \"AppId\": \"EclipseManager\",\n      \"Description\": \"Often related to specific OEM software or utilities (e.g. for managing screen settings)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Facebook\",\n      \"AppId\": \"Facebook\",\n      \"Description\": \"Facebook social media app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"FarmVille 2\",\n      \"AppId\": \"FarmVille2CountryEscape\",\n      \"Description\": \"Farming simulation game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Fitbit\",\n      \"AppId\": \"fitbit\",\n      \"Description\": \"Fitbit activity tracker companion app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Flipboard\",\n      \"AppId\": \"Flipboard\",\n      \"Description\": \"News and social network aggregator styled as a magazine\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Hidden City\",\n      \"AppId\": \"HiddenCity\",\n      \"Description\": \"Hidden object puzzle adventure game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Hulu\",\n      \"AppId\": \"HULULLC.HULUPLUS\",\n      \"Description\": \"Hulu streaming service app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"iHeartRadio\",\n      \"AppId\": \"iHeartRadio\",\n      \"Description\": \"Internet radio streaming app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Instagram\",\n      \"AppId\": \"Instagram\",\n      \"Description\": \"Instagram social media app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bubble Witch 3\",\n      \"AppId\": \"king.com.BubbleWitch3Saga\",\n      \"Description\": \"Puzzle game from King\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Candy Crush Saga\",\n      \"AppId\": \"king.com.CandyCrushSaga\",\n      \"Description\": \"Puzzle game from King\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Candy Crush Soda\",\n      \"AppId\": \"king.com.CandyCrushSodaSaga\",\n      \"Description\": \"Puzzle game from King\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"LinkedIn\",\n      \"AppId\": \"LinkedInforWindows\",\n      \"Description\": \"LinkedIn professional networking app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"March of Empires\",\n      \"AppId\": \"MarchofEmpires\",\n      \"Description\": \"Strategy game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Netflix\",\n      \"AppId\": \"Netflix\",\n      \"Description\": \"Netflix streaming service app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"NYT Crossword\",\n      \"AppId\": \"NYTCrossword\",\n      \"Description\": \"New York Times crossword puzzle app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"One Calendar\",\n      \"AppId\": \"OneCalendar\",\n      \"Description\": \"Calendar aggregation app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Pandora\",\n      \"AppId\": \"PandoraMediaInc\",\n      \"Description\": \"Pandora music streaming app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Phototastic Collage\",\n      \"AppId\": \"PhototasticCollage\",\n      \"Description\": \"Photo collage creation app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"PicsArt\",\n      \"AppId\": \"PicsArt-PhotoStudio\",\n      \"Description\": \"Photo editing and creative app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Plex\",\n      \"AppId\": \"Plex\",\n      \"Description\": \"Media server and player app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Polarr Photo Editor\",\n      \"AppId\": \"PolarrPhotoEditorAcademicEdition\",\n      \"Description\": \"Photo editing app (Academic Edition)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Royal Revolt\",\n      \"AppId\": \"Royal Revolt\",\n      \"Description\": \"Tower defense / strategy game\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Shazam\",\n      \"AppId\": \"Shazam\",\n      \"Description\": \"Music identification app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Live Wallpaper\",\n      \"AppId\": \"Sidia.LiveWallpaper\",\n      \"Description\": \"Live wallpaper app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Sling TV\",\n      \"AppId\": \"SlingTV\",\n      \"Description\": \"Live TV streaming service app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Spotify\",\n      \"AppId\": \"Spotify\",\n      \"Description\": \"Spotify music streaming app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"TikTok\",\n      \"AppId\": \"TikTok\",\n      \"Description\": \"TikTok short-form video app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"TuneIn Radio\",\n      \"AppId\": \"TuneInRadio\",\n      \"Description\": \"Internet radio streaming app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Twitter\",\n      \"AppId\": \"Twitter\",\n      \"Description\": \"Twitter (now X) social media app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Viber\",\n      \"AppId\": \"Viber\",\n      \"Description\": \"Messaging and calling app\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"WinZip\",\n      \"AppId\": \"WinZipUniversal\",\n      \"Description\": \"File compression and extraction utility (Universal Windows Platform version)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Wunderlist\",\n      \"AppId\": \"Wunderlist\",\n      \"Description\": \"To-do list app (Acquired by Microsoft, functionality moved to Microsoft To Do)\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"XING\",\n      \"AppId\": \"XING\",\n      \"Description\": \"Professional networking platform popular in German-speaking countries\",\n      \"SelectedByDefault\": true,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Bing Search\",\n      \"AppId\": \"Microsoft.BingSearch\",\n      \"Description\": \"Web Search from Microsoft Bing (Integrates into Windows Search)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft Edge\",\n      \"AppId\": \"Microsoft.Edge\",\n      \"Description\": \"Windows' default browser, WARNING: Removing this app also removes the only browser from Windows Sandbox and could affect other apps\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"unsafe\"\n    },\n    {\n      \"FriendlyName\": \"Xbox Gaming App\",\n      \"AppId\": \"Microsoft.GamingApp\",\n      \"Description\": \"Modern Xbox Gaming App, required for installing some PC games\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Get Help\",\n      \"AppId\": \"Microsoft.GetHelp\",\n      \"Description\": \"Required for some Windows 11 Troubleshooters and support interactions\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"unsafe\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft 365 Companions\",\n      \"AppId\": \"Microsoft.M365Companions\",\n      \"Description\": \"Microsoft 365 (Business) Calendar, Files and People mini-apps, these apps may be reinstalled if enabled by your Microsoft 365 admin\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Paint 3D\",\n      \"AppId\": \"Microsoft.MSPaint\",\n      \"Description\": \"Paint 3D (Modern paint application with 3D features)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"OneDrive\",\n      \"AppId\": \"Microsoft.OneDrive\",\n      \"Description\": \"OneDrive consumer cloud storage client\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Outlook for Windows\",\n      \"AppId\": \"Microsoft.OutlookForWindows\",\n      \"Description\": \"New Outlook for Windows mail client\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Paint\",\n      \"AppId\": \"Microsoft.Paint\",\n      \"Description\": \"Classic Paint (Traditional 2D paint application)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"People\",\n      \"AppId\": \"Microsoft.People\",\n      \"Description\": \"Required for & included with Mail & Calendar (discontinued)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Remote Desktop\",\n      \"AppId\": \"Microsoft.RemoteDesktop\",\n      \"Description\": \"Remote Desktop client app\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Snipping Tool\",\n      \"AppId\": \"Microsoft.ScreenSketch\",\n      \"Description\": \"Snipping Tool (Screenshot and annotation tool)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Widgets Experience\",\n      \"AppId\": \"Microsoft.StartExperiencesApp\",\n      \"Description\": \"This app powers Windows Widgets My Feed\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Whiteboard\",\n      \"AppId\": \"Microsoft.Whiteboard\",\n      \"Description\": \"Digital collaborative whiteboard app\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Photos\",\n      \"AppId\": \"Microsoft.Windows.Photos\",\n      \"Description\": \"Default photo viewing and basic editing app\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Calculator\",\n      \"AppId\": \"Microsoft.WindowsCalculator\",\n      \"Description\": \"Calculator app\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Camera\",\n      \"AppId\": \"Microsoft.WindowsCamera\",\n      \"Description\": \"Camera app for using built-in or connected cameras\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Mail & Calendar\",\n      \"AppId\": \"Microsoft.windowscommunicationsapps\",\n      \"Description\": \"Mail & Calendar app suite (Discontinued)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"safe\"\n    },\n    {\n      \"FriendlyName\": \"Notepad\",\n      \"AppId\": \"Microsoft.WindowsNotepad\",\n      \"Description\": \"Notepad text editor app\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Microsoft Store\",\n      \"AppId\": \"Microsoft.WindowsStore\",\n      \"Description\": \"Microsoft Store, WARNING: This app cannot be reinstalled easily if removed!\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"unsafe\"\n    },\n    {\n      \"FriendlyName\": \"Windows Terminal\",\n      \"AppId\": \"Microsoft.WindowsTerminal\",\n      \"Description\": \"Default terminal app in windows 11 (Command Prompt, PowerShell, WSL)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Xbox TCUI Framework\",\n      \"AppId\": \"Microsoft.Xbox.TCUI\",\n      \"Description\": \"UI framework, seems to be required for Microsoft Store, photos and certain games\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"unsafe\"\n    },\n    {\n      \"FriendlyName\": \"Xbox Game Overlay\",\n      \"AppId\": \"Microsoft.XboxGameOverlay\",\n      \"Description\": \"Game overlay, required/useful for some games (Part of Xbox Game Bar)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Xbox Gaming Overlay\",\n      \"AppId\": \"Microsoft.XboxGamingOverlay\",\n      \"Description\": \"Game overlay, required/useful for some games (Part of Xbox Game Bar)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Xbox Identity Provider\",\n      \"AppId\": \"Microsoft.XboxIdentityProvider\",\n      \"Description\": \"Xbox sign-in framework, required for some games and Xbox services\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"unsafe\"\n    },\n    {\n      \"FriendlyName\": \"Xbox Speech To Text\",\n      \"AppId\": \"Microsoft.XboxSpeechToTextOverlay\",\n      \"Description\": \"Accessibility feature required for some games, WARNING: This app cannot be reinstalled easily!\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"unsafe\"\n    },\n    {\n      \"FriendlyName\": \"Phone Link\",\n      \"AppId\": \"Microsoft.YourPhone\",\n      \"Description\": \"Phone link (Connects Android/iOS phone to PC)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Media Player\",\n      \"AppId\": \"Microsoft.ZuneMusic\",\n      \"Description\": \"Modern Media Player (Replaced Groove Music, plays local audio/video)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Cross Device Experience\",\n      \"AppId\": \"MicrosoftWindows.CrossDevice\",\n      \"Description\": \"Phone integration within File Explorer, Camera and more (Part of Phone Link features)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP AI Experience Center\",\n      \"AppId\": \"AD2F1837.HPAIExperienceCenter\",\n      \"Description\": \"HP OEM software, AI-enhanced features and support\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Connected Music\",\n      \"AppId\": \"AD2F1837.HPConnectedMusic\",\n      \"Description\": \"HP OEM software for music (Potentially discontinued)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Connected Photo\",\n      \"AppId\": \"AD2F1837.HPConnectedPhotopoweredbySnapfish\",\n      \"Description\": \"HP OEM software for photos, integrated with Snapfish (Potentially discontinued)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Desktop Support Utilities\",\n      \"AppId\": \"AD2F1837.HPDesktopSupportUtilities\",\n      \"Description\": \"HP OEM software providing desktop support tools\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Easy Clean\",\n      \"AppId\": \"AD2F1837.HPEasyClean\",\n      \"Description\": \"HP OEM software for system cleaning or optimization\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP File Viewer\",\n      \"AppId\": \"AD2F1837.HPFileViewer\",\n      \"Description\": \"HP OEM software for viewing specific file types\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP JumpStarts\",\n      \"AppId\": \"AD2F1837.HPJumpStarts\",\n      \"Description\": \"HP OEM software for tutorials, app discovery, or quick access to HP features\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP PC Hardware Diagnostics\",\n      \"AppId\": \"AD2F1837.HPPCHardwareDiagnosticsWindows\",\n      \"Description\": \"HP OEM software for PC hardware diagnostics\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Power Manager\",\n      \"AppId\": \"AD2F1837.HPPowerManager\",\n      \"Description\": \"HP OEM software for managing power settings and battery\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Printer Control\",\n      \"AppId\": \"AD2F1837.HPPrinterControl\",\n      \"Description\": \"HP OEM software for managing HP printers\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Privacy Settings\",\n      \"AppId\": \"AD2F1837.HPPrivacySettings\",\n      \"Description\": \"HP OEM software for managing privacy settings\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP QuickDrop\",\n      \"AppId\": \"AD2F1837.HPQuickDrop\",\n      \"Description\": \"HP OEM software for quick file transfer between devices\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP QuickTouch\",\n      \"AppId\": \"AD2F1837.HPQuickTouch\",\n      \"Description\": \"HP OEM software, possibly for touch-specific shortcuts or controls\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Registration\",\n      \"AppId\": \"AD2F1837.HPRegistration\",\n      \"Description\": \"HP OEM software for product registration\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Support Assistant\",\n      \"AppId\": \"AD2F1837.HPSupportAssistant\",\n      \"Description\": \"HP OEM software for support, updates, and troubleshooting\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Sure Shield AI\",\n      \"AppId\": \"AD2F1837.HPSureShieldAI\",\n      \"Description\": \"HP OEM security software, likely AI-based threat protection\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP System Information\",\n      \"AppId\": \"AD2F1837.HPSystemInformation\",\n      \"Description\": \"HP OEM software for displaying system information\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP Welcome\",\n      \"AppId\": \"AD2F1837.HPWelcome\",\n      \"Description\": \"HP OEM software providing a welcome experience or initial setup help\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"HP WorkWell\",\n      \"AppId\": \"AD2F1837.HPWorkWell\",\n      \"Description\": \"HP OEM software focused on well-being, possibly with break reminders or ergonomic tips\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"myHP\",\n      \"AppId\": \"AD2F1837.myHP\",\n      \"Description\": \"HP OEM central hub app for device info, support, and services\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Lenovo Vantage\",\n      \"AppId\": \"E046963F.LenovoCompanion\",\n      \"Description\": \"Lenovo OEM hub app for device settings, updates, and support\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Lenovo Vantage Service\",\n      \"AppId\": \"LenovoCompanyLimited.LenovoVantageService\",\n      \"Description\": \"Background service component for Lenovo Vantage\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Dell SupportAssist\",\n      \"AppId\": \"DellInc.DellSupportAssistforPCs\",\n      \"Description\": \"Dell OEM support, diagnostic, and update tool\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Dell Digital Delivery Services\",\n      \"AppId\": \"DellInc.DellDigitalDelivery\",\n      \"Description\": \"Dell OEM software for delivering pre-purchased software\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    },\n    {\n      \"FriendlyName\": \"Dell Mobile Connect\",\n      \"AppId\": \"DellInc.DellMobileConnect\",\n      \"Description\": \"Dell OEM app for linking Android/iOS phone to PC (superseded by Phone Link)\",\n      \"SelectedByDefault\": false,\n      \"Recommendation\": \"optional\"\n    }\n  ],\n  \"Presets\": [\n    {\n      \"Name\": \"Xbox Gaming apps\",\n      \"AppIds\": [\n        \"Microsoft.GamingApp\",\n        \"Microsoft.XboxGameOverlay\",\n        \"Microsoft.XboxGamingOverlay\"\n      ]\n    },\n    {\n      \"Name\": \"OEM software (Dell, HP, Lenovo)\",\n      \"AppIds\": [\n        \"AD2F1837.HPAIExperienceCenter\",\n        \"AD2F1837.HPConnectedMusic\",\n        \"AD2F1837.HPConnectedPhotopoweredbySnapfish\",\n        \"AD2F1837.HPDesktopSupportUtilities\",\n        \"AD2F1837.HPEasyClean\",\n        \"AD2F1837.HPFileViewer\",\n        \"AD2F1837.HPJumpStarts\",\n        \"AD2F1837.HPPCHardwareDiagnosticsWindows\",\n        \"AD2F1837.HPPowerManager\",\n        \"AD2F1837.HPPrinterControl\",\n        \"AD2F1837.HPPrivacySettings\",\n        \"AD2F1837.HPQuickDrop\",\n        \"AD2F1837.HPQuickTouch\",\n        \"AD2F1837.HPRegistration\",\n        \"AD2F1837.HPSupportAssistant\",\n        \"AD2F1837.HPSureShieldAI\",\n        \"AD2F1837.HPSystemInformation\",\n        \"AD2F1837.HPWelcome\",\n        \"AD2F1837.HPWorkWell\",\n        \"AD2F1837.myHP\",\n        \"E046963F.LenovoCompanion\",\n        \"LenovoCompanyLimited.LenovoVantageService\",\n        \"DellInc.DellSupportAssistforPCs\",\n        \"DellInc.DellDigitalDelivery\",\n        \"DellInc.DellMobileConnect\"\n      ]\n    }\n  ]\n}\n"
  },
  {
    "path": "Config/DefaultSettings.json",
    "content": "{\n    \"Version\": \"1.0\",\n    \"Settings\": [\n        {\n            \"Name\": \"CreateRestorePoint\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableTelemetry\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableSuggestions\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableEdgeAds\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableLockscreenTips\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableBing\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableStoreSearchSuggestions\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableSearchHighlights\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableCopilot\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableRecall\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableClickToDo\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableAISvcAutoStart\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableWidgets\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"HideChat\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"ShowKnownFileExt\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableDragTray\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableFastStartup\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"Hide3dObjects\",\n            \"Value\": true\n        },\n        {\n            \"Name\": \"DisableModernStandbyNetworking\",\n            \"Value\": true\n        }\n    ]\n}"
  },
  {
    "path": "Config/Features.json",
    "content": "{\n  \"Version\": \"1.0\",\n  \"Categories\": [\n    {\n      \"Name\": \"Privacy & Suggested Content\",\n      \"Icon\": \"&#xE72E;\"\n    },\n    {\n      \"Name\": \"System\",\n      \"Icon\": \"&#xe770;\"\n    },\n    {\n      \"Name\": \"Start Menu & Search\",\n      \"Icon\": \"&#xe8fc;\"\n    },\n    {\n      \"Name\": \"AI\",\n      \"Icon\": \"&#xe794;\"\n    },\n    {\n      \"Name\": \"Windows Update\",\n      \"Icon\": \"&#xe895;\"\n    },\n    {\n      \"Name\": \"Taskbar\",\n      \"Icon\": \"&#xe75b;\"\n    },\n    {\n      \"Name\": \"Appearance\",\n      \"Icon\": \"&#xE771;\"\n    },\n    {\n      \"Name\": \"File Explorer\",\n      \"Icon\": \"&#xec50;\"\n    },\n    {\n      \"Name\": \"Gaming\",\n      \"Icon\": \"&#xE7FC;\"\n    },\n    {\n      \"Name\": \"Multi-tasking\",\n      \"Icon\": \"&#xE7C4;\"\n    },\n    {\n      \"Name\": \"Optional Windows Features\",\n      \"Icon\": \"&#xefda;\"\n    },\n    {\n      \"Name\": \"Other\",\n      \"Icon\": \"&#xE713;\"\n    }\n  ],\n  \"UiGroups\": [\n    {\n      \"GroupId\": \"SearchIcon\",\n      \"Label\": \"Taskbar search style\",\n      \"ToolTip\": \"This setting allows you to customize the appearance of the search box on the taskbar.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 2,\n      \"Values\": [\n        {\n          \"Label\": \"Hide\",\n          \"FeatureIds\": [\n            \"HideSearchTb\"\n          ]\n        },\n        {\n          \"Label\": \"Show search icon only\",\n          \"FeatureIds\": [\n            \"ShowSearchIconTb\"\n          ]\n        },\n        {\n          \"Label\": \"Show search icon and label\",\n          \"FeatureIds\": [\n            \"ShowSearchLabelTb\"\n          ]\n        },\n        {\n          \"Label\": \"Show search box\",\n          \"FeatureIds\": [\n            \"ShowSearchBoxTb\"\n          ]\n        }\n      ]\n    },\n    {\n      \"GroupId\": \"MultiMon\",\n      \"Label\": \"Show taskbar apps on\",\n      \"ToolTip\": \"This setting allows you to choose where taskbar app buttons are shown when using multiple monitors.\",\n      \"Category\": \"Taskbar\",\n      \"Values\": [\n        {\n          \"Label\": \"All taskbars\",\n          \"FeatureIds\": [\n            \"MMTaskbarModeAll\"\n          ]\n        },\n        {\n          \"Label\": \"Main taskbar and taskbar where window is open\",\n          \"FeatureIds\": [\n            \"MMTaskbarModeMainActive\"\n          ]\n        },\n        {\n          \"Label\": \"Taskbar where window is open\",\n          \"FeatureIds\": [\n            \"MMTaskbarModeActive\"\n          ]\n        }\n      ]\n    },\n    {\n      \"GroupId\": \"CombineButtons\",\n      \"Label\": \"Combine taskbar buttons on the main display\",\n      \"ToolTip\": \"This setting allows you to choose how taskbar buttons are combined on the main display.\",\n      \"Category\": \"Taskbar\",\n      \"Values\": [\n        {\n          \"Label\": \"Always\",\n          \"FeatureIds\": [\n            \"CombineTaskbarAlways\"\n          ]\n        },\n        {\n          \"Label\": \"When taskbar is full\",\n          \"FeatureIds\": [\n            \"CombineTaskbarWhenFull\"\n          ]\n        },\n        {\n          \"Label\": \"Never\",\n          \"FeatureIds\": [\n            \"CombineTaskbarNever\"\n          ]\n        }\n      ]\n    },\n    {\n      \"GroupId\": \"CombineMMButtons\",\n      \"Label\": \"Combine taskbar buttons on secondary displays\",\n      \"ToolTip\": \"This setting allows you to choose how taskbar buttons are combined on secondary displays.\",\n      \"Category\": \"Taskbar\",\n      \"Values\": [\n        {\n          \"Label\": \"Always\",\n          \"FeatureIds\": [\n            \"CombineMMTaskbarAlways\"\n          ]\n        },\n        {\n          \"Label\": \"When taskbar is full\",\n          \"FeatureIds\": [\n            \"CombineMMTaskbarWhenFull\"\n          ]\n        },\n        {\n          \"Label\": \"Never\",\n          \"FeatureIds\": [\n            \"CombineMMTaskbarNever\"\n          ]\n        }\n      ]\n    },\n    {\n      \"GroupId\": \"ClearStart\",\n      \"Label\": \"Remove pinned apps from the start menu\",\n      \"ToolTip\": \"This setting allows you to quickly remove all pinned apps from the start menu.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Values\": [\n        {\n          \"Label\": \"Remove for the selected user\",\n          \"FeatureIds\": [\n            \"ClearStart\"\n          ]\n        },\n        {\n          \"Label\": \"Remove for all users\",\n          \"FeatureIds\": [\n            \"ClearStartAllUsers\"\n          ]\n        }\n      ]\n    },\n    {\n      \"GroupId\": \"ExplorerLocation\",\n      \"Label\": \"Open File Explorer to\",\n      \"ToolTip\": \"This setting allows you to choose the default location that File Explorer opens to.\",\n      \"Category\": \"File Explorer\",\n      \"Values\": [\n        {\n          \"Label\": \"Home\",\n          \"FeatureIds\": [\n            \"ExplorerToHome\"\n          ]\n        },\n        {\n          \"Label\": \"This PC\",\n          \"FeatureIds\": [\n            \"ExplorerToThisPC\"\n          ]\n        },\n        {\n          \"Label\": \"Downloads\",\n          \"FeatureIds\": [\n            \"ExplorerToDownloads\"\n          ]\n        },\n        {\n          \"Label\": \"OneDrive\",\n          \"FeatureIds\": [\n            \"ExplorerToOneDrive\"\n          ]\n        }\n      ]\n    },\n    {\n      \"GroupId\": \"ShowTabsInAltTab\",\n      \"Label\": \"Show tabs from apps when snapping or pressing Alt+Tab\",\n      \"ToolTip\": \"This setting allows you to choose whether to show tabs from apps (such as Edge browser tabs) when snapping windows or pressing Alt+Tab.\",\n      \"Category\": \"Multi-tasking\",\n      \"Priority\": 10,\n      \"Values\": [\n        {\n          \"Label\": \"Don't show tabs\",\n          \"FeatureIds\": [\n            \"HideTabsInAltTab\"\n          ]\n        },\n        {\n          \"Label\": \"Show 3 most recent tabs\",\n          \"FeatureIds\": [\n            \"Show3TabsInAltTab\"\n          ]\n        },\n        {\n          \"Label\": \"Show 5 most recent tabs\",\n          \"FeatureIds\": [\n            \"Show5TabsInAltTab\"\n          ]\n        },\n        {\n          \"Label\": \"Show 20 most recent tabs\",\n          \"FeatureIds\": [\n            \"Show20TabsInAltTab\"\n          ]\n        }\n      ]\n    }\n  ],\n  \"Features\": [\n    {\n      \"FeatureId\": \"RemoveApps\",\n      \"Label\": \"Remove the apps specified in the 'Apps' parameter\",\n      \"Category\": null,\n      \"Action\": \"Remove Apps\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"Apps\",\n      \"Label\": \"The selection of apps to remove, specified as a comma separated list. Use 'Default' (or omit) to use the default apps list\",\n      \"Category\": null,\n      \"Action\": \"Apps\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"RemoveAppsCustom\",\n      \"Label\": \"Remove custom selection of apps\",\n      \"Category\": null,\n      \"Action\": \"Remove Custom Apps\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"RemoveCommApps\",\n      \"Label\": \"Remove the Mail, Calendar, and People apps\",\n      \"Category\": null,\n      \"Action\": \"Remove Mail, Calendar & People\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"RemoveW11Outlook\",\n      \"Label\": \"Remove the new Outlook for Windows app\",\n      \"Category\": null,\n      \"Action\": \"Remove Outlook for Windows\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"RemoveGamingApps\",\n      \"Label\": \"Remove the Xbox App and Xbox Gamebar\",\n      \"Category\": null,\n      \"Action\": \"Remove Gaming Apps\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"RemoveHPApps\",\n      \"Label\": \"Remove HP OEM applications\",\n      \"Category\": null,\n      \"Action\": \"Remove HP Apps\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CreateRestorePoint\",\n      \"Label\": \"Create a system restore point\",\n      \"Category\": null,\n      \"Action\": \"Create Restore Point\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableTelemetry\",\n      \"Label\": \"telemetry, tracking & targeted ads\",\n      \"ToolTip\": \"This setting disables telemetry, diagnostic data collection, activity history, app-launch tracking, targeted ads and more. It limits the data that is sent to Microsoft about your device and usage.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Telemetry.reg\",\n      \"ApplyText\": \"Disabling telemetry, diagnostic data, activity history, app-launch tracking and targeted ads...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Telemetry.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSuggestions\",\n      \"Label\": \"tips, tricks & suggested content throughout Windows\",\n      \"ToolTip\": \"This setting removes many annoying distractions from Windows. This includes things like notifications, reminders and sync provider ads. It also prevents automated installation of suggested apps.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Windows_Suggestions.reg\",\n      \"ApplyText\": \"Disabling tips, tricks, suggestions and ads throughout Windows...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Windows_Suggestions.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableLocationServices\",\n      \"Label\": \"Windows location services & app location access\",\n      \"ToolTip\": \"This will turn off Windows Location Services and deny apps access to your location. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Location_Services.reg\",\n      \"ApplyText\": \"Disabling Windows location services and app location access...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Location_Services.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableFindMyDevice\",\n      \"Label\": \"Find My Device location tracking\",\n      \"ToolTip\": \"This will turn off the 'Find My Device' feature, which periodically sends your device's location to Microsoft. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Find_My_Device.reg\",\n      \"ApplyText\": \"> Disabling Find My Device location tracking...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Find_My_Device.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableLockscreenTips\",\n      \"Label\": \"tips & tricks on the lock screen\",\n      \"ToolTip\": \"This will turn off the tips, tricks and fun facts that appear on the lock screen.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Lockscreen_Tips.reg\",\n      \"ApplyText\": \"Disabling tips & tricks on the lock screen...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Lockscreen_Tips.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableDesktopSpotlight\",\n      \"Label\": \"Windows Spotlight for desktop\",\n      \"ToolTip\": \"This will turn off the 'Windows Spotlight' feature for the desktop background, which shows different background images and occasionally tips and fun facts on the desktop.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Desktop_Spotlight.reg\",\n      \"ApplyText\": \"Disabling the 'Windows Spotlight' desktop background option...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Desktop_Spotlight.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableEdgeAds\",\n      \"Label\": \"ads, suggestions and newsfeed in Edge\",\n      \"ToolTip\": \"This will turn off various distractions from Microsoft Edge such as ads, suggestions and the MSN news feed. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Edge_Ads_And_Suggestions.reg\",\n      \"ApplyText\": \"Disabling ads, suggestions and the MSN news feed in Microsoft Edge...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Edge_Ads_And_Suggestions.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableCopilot\",\n      \"Label\": \"Microsoft Copilot\",\n      \"ToolTip\": \"This will disable and uninstall Microsoft Copilot, Windows' built-in AI assistant.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Copilot.reg\",\n      \"ApplyText\": \"Disabling Microsoft Copilot...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Copilot.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableRecall\",\n      \"Label\": \"Windows Recall\",\n      \"ToolTip\": \"This will disable Windows Recall, an AI-powered feature that provides quick access to recently used files, apps and activities. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_AI_Recall.reg\",\n      \"ApplyText\": \"Disabling Windows Recall...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_AI_Recall.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableClickToDo\",\n      \"Label\": \"Click To Do, AI text & image analysis\",\n      \"ToolTip\": \"This will disable Click To Do, which provides AI-powered text and image analysis features in Windows. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Click_to_Do.reg\",\n      \"ApplyText\": \"Disabling Click to Do...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Click_to_Do.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableAISvcAutoStart\",\n      \"Label\": \"AI service from starting automatically\",\n      \"ToolTip\": \"This will set the WSAIFabricSvc service to manual startup, preventing the service from starting automatically with Windows.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Prevent\",\n      \"RegistryKey\": \"Disable_AI_Service_Auto_Start.reg\",\n      \"ApplyText\": \"> Preventing AI service from starting automatically...\",\n      \"UndoAction\": \"Allow\",\n      \"RegistryUndoKey\": \"Enable_AI_Service_Auto_Start.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableDVR\",\n      \"Label\": \"Xbox game/screen recording\",\n      \"ToolTip\": \"This will disable the Xbox game/screen recording features included with the Game Bar app. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Gaming\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_DVR.reg\",\n      \"ApplyText\": \"Disabling Xbox game/screen recording...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_DVR.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableGameBarIntegration\",\n      \"Label\": \"Game Bar integration\",\n      \"ToolTip\": \"This will disable the Game Bar integration with games and controllers. This stops annoying ms-gamebar popups when launching games or connecting a controller.\",\n      \"Category\": \"Gaming\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Game_Bar_Integration.reg\",\n      \"ApplyText\": \"Disabling Game Bar integration...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Game_Bar_Integration.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ClearStart\",\n      \"Action\": \"Clear Start Menu\",\n      \"Label\": \"Remove all pinned apps from the start menu for this user only\",\n      \"Category\": \"Start Menu & Search\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ClearStartAllUsers\",\n      \"Action\": \"Clear Start Menu (All Users)\",\n      \"Label\": \"Remove all pinned apps from the start menu for all existing and new users\",\n      \"Category\": \"Start Menu & Search\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ReplaceStart\",\n      \"Action\": \"Replace Start Menu\",\n      \"Label\": \"Replace the start menu layout for this user only with the provided template file\",\n      \"Category\": null,\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ReplaceStartAllUsers\",\n      \"Action\": \"Replace Start Menu (All Users)\",\n      \"Label\": \"Replace the start menu layout for all existing and new users with the provided template file\",\n      \"Category\": null,\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableStartRecommended\",\n      \"Label\": \"recommended section in the start menu\",\n      \"ToolTip\": \"This will hide the recommended section in the start menu, which shows recently added apps, recently opened files and app recommendations. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Start_Recommended.reg\",\n      \"ApplyText\": \"Disabling the start menu recommended section...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Start_Recommended.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableStartAllApps\",\n      \"Label\": \"'All Apps' section in the start menu\",\n      \"ToolTip\": \"This will hide the 'All Apps' section in the start menu, which shows all installed apps. WARNING: Hiding this section may make it harder to find installed apps on your system. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Start_All_Apps.reg\",\n      \"ApplyText\": \"Disabling the 'All Apps' section in the start menu...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Start_All_Apps.reg\",\n      \"MinVersion\": 26200,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableStartPhoneLink\",\n      \"Label\": \"Phone Link integration in the start menu\",\n      \"ToolTip\": \"This will remove the Phone Link integration in the start menu when you have a mobile device linked to your PC.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Phone_Link_In_Start.reg\",\n      \"ApplyText\": \"Disabling the Phone Link mobile devices integration in the start menu...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Phone_Link_In_Start.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableBing\",\n      \"Label\": \"Bing web search & Copilot integration in search\",\n      \"ToolTip\": \"This will turn off Bing web search results and Copilot integration in the Windows search experience. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Bing_Cortana_In_Search.reg\",\n      \"ApplyText\": \"Disabling Bing web search & Copilot integration in Windows search...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Bing_Cortana_In_Search.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n       \"FeatureId\": \"DisableStoreSearchSuggestions\",\n      \"Label\": \"Microsoft Store app suggestions in search\",\n      \"ToolTip\": \"This will disable the Microsoft Store app suggestions in Windows search.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSearchHighlights\",\n      \"Label\": \"Search Highlights in the taskbar search box\",\n      \"ToolTip\": \"This will turn off Search Highlights, which shows dynamically curated branded content and trending topics in the Windows search box on the taskbar.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Search_Highlights.reg\",\n      \"ApplyText\": \"> Disabling Search Highlights in the Windows search box...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Search_Highlights.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSearchHistory\",\n      \"Label\": \"local Windows Search history\",\n      \"ToolTip\": \"This setting disables local search history in Windows Search. This does not affect web search history or the search history saved in Microsoft Edge.\",\n      \"Category\": \"Start Menu & Search\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Search_History.reg\",\n      \"ApplyText\": \"Disabling search history...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Search_History.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSettings365Ads\",\n      \"Label\": \"Microsoft 365 Copilot ads in Settings Home\",\n      \"ToolTip\": \"This will turn off the Microsoft 365 Copilot ads that appear in the Settings Home page.\",\n      \"Category\": \"Privacy & Suggested Content\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Settings_365_Ads.reg\",\n      \"ApplyText\": \"Disabling Microsoft 365 Copilot ads in Settings Home...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Settings_365_Ads.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSettingsHome\",\n      \"Label\": \"Settings 'Home' page\",\n      \"ToolTip\": \"Removes the 'Home' page from the Settings app.\",\n      \"Category\": \"Other\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Settings_Home.reg\",\n      \"ApplyText\": \"Disabling the Settings Home page...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Settings_Home.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableEdgeAI\",\n      \"Label\": \"AI features in Microsoft Edge\",\n      \"ToolTip\": \"This will turn off AI features in Microsoft Edge, such as the AI-powered sidebar and Copilot features. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Edge_AI_Features.reg\",\n      \"ApplyText\": \"Disabling AI features in Microsoft Edge...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Edge_AI_Features.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisablePaintAI\",\n      \"Label\": \"AI features in Paint\",\n      \"ToolTip\": \"This will turn off AI features in Paint, such as the AI-powered image generation and editing tools. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Paint_AI_Features.reg\",\n      \"ApplyText\": \"Disabling AI features in Paint...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Paint_AI_Features.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableNotepadAI\",\n      \"Label\": \"AI features in Notepad\",\n      \"ToolTip\": \"This will turn off AI features in Notepad, such as the AI-powered writing suggestions. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"AI\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Notepad_AI_Features.reg\",\n      \"ApplyText\": \"Disabling AI features in Notepad...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Notepad_AI_Features.reg\",\n      \"MinVersion\": 22621,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"EnableDarkMode\",\n      \"Label\": \"theme for system and apps\",\n      \"ToolTip\": \"This will set the app and system theme to dark mode.\",\n      \"Category\": \"Appearance\",\n      \"Action\": \"Enable dark\",\n      \"RegistryKey\": \"Enable_Dark_Mode.reg\",\n      \"ApplyText\": \"Enabling dark mode for system and apps...\",\n      \"UndoAction\": \"Disable light\",\n      \"RegistryUndoKey\": \"Enable_Light_Mode.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableDragTray\",\n      \"Label\": \"'Drag Tray' for sharing & moving files\",\n      \"ToolTip\": \"The Drag Tray is a new feature for sharing & moving files in Windows 11, it appears at the top of the screen when dragging files.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Share_Drag_Tray.reg\",\n      \"ApplyText\": \"Disabling Drag Tray...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Share_Drag_Tray.reg\",\n      \"MinVersion\": 26200,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"RevertContextMenu\",\n      \"Label\": \"context menu style\",\n      \"ToolTip\": \"This will restore the classic Windows 10 style context menu, which is normally hidden behind the 'Show more options' entry in the new Windows 11 context menu.\",\n      \"Category\": \"System\",\n      \"Action\": \"Use classic Windows 10\",\n      \"RegistryKey\": \"Disable_Show_More_Options_Context_Menu.reg\",\n      \"ApplyText\": \"Restoring the classic Windows 10 style context menu...\",\n      \"UndoAction\": \"Use modern Windows 11\",\n      \"RegistryUndoKey\": \"Enable_W11_Style_Context_Menu.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableMouseAcceleration\",\n      \"Label\": \"Enhance Pointer Precision (mouse acceleration)\",\n      \"ToolTip\": \"This will disable mouse acceleration which is enabled by default in Windows. This makes mouse movement more consistent and predictable.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Enhance_Pointer_Precision.reg\",\n      \"ApplyText\": \"Turning off Enhanced Pointer Precision...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Enhance_Pointer_Precision.reg\",\n      \"RequiresReboot\": true,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableStickyKeys\",\n      \"Label\": \"Sticky Keys keyboard shortcut (5x shift)\",\n      \"ToolTip\": \"This will prevent the Sticky Keys dialog from appearing when you press the Shift key 5 times in a row.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Sticky_Keys_Shortcut.reg\",\n      \"ApplyText\": \"Disabling the Sticky Keys keyboard shortcut...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Sticky_Keys_Shortcut.reg\",\n      \"RequiresReboot\": true,\n      \"MinVersion\": 26100,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableWindowSnapping\",\n      \"Label\": \"window snapping\",\n      \"ToolTip\": \"This will turn off the ability to snap windows to the sides or corners of the screen.\",\n      \"Category\": \"Multi-tasking\",\n      \"Priority\": 1,\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Window_Snapping.reg\",\n      \"ApplyText\": \"Disabling window snapping...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Window_Snapping.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSnapAssist\",\n      \"Label\": \"showing app suggestions when snapping windows\",\n      \"ToolTip\": \"This will turn off app suggestions when you snap windows to the sides or corners of the screen.\",\n      \"Category\": \"Multi-tasking\",\n      \"Priority\": 2,\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Snap_Assist.reg\",\n      \"ApplyText\": \"Disabling the Snap Assist suggestions...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Snap_Assist.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableSnapLayouts\",\n      \"Label\": \"snap layout flyout at top of screen and on maximize button\",\n      \"ToolTip\": \"This will turn off the snap layout flyout that appears when you hover over the maximize button or drag windows to the top of the screen.\",\n      \"Category\": \"Multi-tasking\",\n      \"Priority\": 3,\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Snap_Layouts.reg\",\n      \"ApplyText\": \"Hiding snap layouts when dragging windows to top of the screen and on maximize button...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Snap_Layouts.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideTabsInAltTab\",\n      \"Label\": \"tabs from apps when snapping or pressing Alt+Tab\",\n      \"Category\": \"Multi-tasking\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_Tabs_In_Alt_Tab.reg\",\n      \"ApplyText\": \"Disable showing tabs from apps when snapping or pressing Alt+Tab...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"Show3TabsInAltTab\",\n      \"Label\": \"tabs from apps when snapping or pressing Alt+Tab\",\n      \"Category\": \"Multi-tasking\",\n      \"Action\": \"Show 3\",\n      \"RegistryKey\": \"Show_3_Tabs_In_Alt_Tab.reg\",\n      \"ApplyText\": \"Enable showing 3 tabs from apps when snapping or pressing Alt+Tab...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"Show5TabsInAltTab\",\n      \"Label\": \"tabs from apps when snapping or pressing Alt+Tab\",\n      \"Category\": \"Multi-tasking\",\n      \"Action\": \"Show 5\",\n      \"RegistryKey\": \"Show_5_Tabs_In_Alt_Tab.reg\",\n      \"ApplyText\": \"Enable showing 5 tabs from apps when snapping or pressing Alt+Tab...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"Show20TabsInAltTab\",\n      \"Label\": \"tabs from apps when snapping or pressing Alt+Tab\",\n      \"Category\": \"Multi-tasking\",\n      \"Action\": \"Show 20\",\n      \"RegistryKey\": \"Show_20_Tabs_In_Alt_Tab.reg\",\n      \"ApplyText\": \"Enable showing 20 tabs from apps when snapping or pressing Alt+Tab...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"TaskbarAlignLeft\",\n      \"Label\": \"taskbar alignment\",\n      \"ToolTip\": \"By default, Windows 11 has the taskbar buttons centered. Enabling this setting will move the taskbar buttons to the left, similar to previous versions of Windows.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 1,\n      \"Action\": \"Left\",\n      \"RegistryKey\": \"Align_Taskbar_Left.reg\",\n      \"ApplyText\": \"Aligning taskbar buttons to the left...\",\n      \"UndoAction\": \"Center\",\n      \"RegistryUndoKey\": \"Align_Taskbar_Center.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideSearchTb\",\n      \"Label\": \"Hide search icon from the taskbar\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Hide Search\",\n      \"RegistryKey\": \"Hide_Search_Taskbar.reg\",\n      \"ApplyText\": \"Hiding the search icon from the taskbar...\",\n      \"UndoAction\": \"Show Search Box\",\n      \"RegistryUndoKey\": \"Show_Search_Box.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ShowSearchIconTb\",\n      \"Label\": \"Show search icon on the taskbar\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Show Search Icon\",\n      \"RegistryKey\": \"Show_Search_Icon.reg\",\n      \"ApplyText\": \"Changing taskbar search to icon only...\",\n      \"UndoAction\": \"Show Search Box\",\n      \"RegistryUndoKey\": \"Show_Search_Box.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ShowSearchLabelTb\",\n      \"Label\": \"Show search icon with label on the taskbar\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Show Search Label\",\n      \"RegistryKey\": \"Show_Search_Icon_And_Label.reg\",\n      \"ApplyText\": \"Changing taskbar search to icon with label...\",\n      \"UndoAction\": \"Show Search Box\",\n      \"RegistryUndoKey\": \"Show_Search_Box.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ShowSearchBoxTb\",\n      \"Label\": \"Show search box on the taskbar\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Show Search Box\",\n      \"RegistryKey\": \"Show_Search_Box.reg\",\n      \"ApplyText\": \"Changing taskbar search to search box...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideTaskview\",\n      \"Label\": \"'Task view' button on the taskbar\",\n      \"ToolTip\": \"This will disable the 'Task view' button on the taskbar, which allows you to see all your open windows and virtual desktops.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 3,\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_Taskview_Taskbar.reg\",\n      \"ApplyText\": \"Hiding the taskview button from the taskbar...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_Taskview_Taskbar.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableWidgets\",\n      \"Label\": \"widgets on the taskbar & lock screen\",\n      \"ToolTip\": \"This will disable the widgets features in Windows, including the widgets button on the taskbar and the widgets that can appear on the lock screen. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 4,\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Widgets_Service.reg\",\n      \"ApplyText\": \"Disabling widgets on the taskbar & lock screen...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Widgets_Service.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideChat\",\n      \"Label\": \"Chat (meet now) icon on the taskbar\",\n      \"ToolTip\": \"This will disable the Chat (meet now) icon on the taskbar.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 5,\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Chat_Taskbar.reg\",\n      \"ApplyText\": \"Hiding the chat icon from the taskbar...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Chat_Taskbar.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 22621\n    },\n    {\n      \"FeatureId\": \"DisableStorageSense\",\n      \"Label\": \"Storage Sense automatic disk cleanup\",\n      \"ToolTip\": \"This will disable Storage Sense, which automatically frees up disk space by deleting temporary files, emptying the recycle bin and cleaning up files in the Downloads folder.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Storage_Sense.reg\",\n      \"ApplyText\": \"Disabling Storage Sense automatic disk cleanup...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Storage_Sense.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableFastStartup\",\n      \"Label\": \"fast start-up\",\n      \"ToolTip\": \"Fast Start-up helps your PC start faster after shutdown by saving a system image to disk. Disabling Fast Start-up can help with certain issues, but may result in slightly longer boot times.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Fast_Startup.reg\",\n      \"ApplyText\": \"Disabling Fast Start-up...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Fast_Startup.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableBitlockerAutoEncryption\",\n      \"Label\": \"BitLocker automatic device encryption\",\n      \"ToolTip\": \"For devices that support it, Windows 11 automatically enables BitLocker device encryption. Disabling this will turn off automatic encryption of the device, but you can still manually enable BitLocker encryption if desired.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Bitlocker_Auto_Encryption.reg\",\n      \"ApplyText\": \"Disabling BitLocker automatic device encryption...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Bitlocker_Auto_Encryption.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableModernStandbyNetworking\",\n      \"Label\": \"Modern Standby network connectivity\",\n      \"ToolTip\": \"By default, devices that support Modern Standby maintain network connectivity while in sleep mode. Disabling network connectivity during Modern Standby can help save battery life.\",\n      \"Category\": \"System\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Modern_Standby_Networking.reg\",\n      \"ApplyText\": \"Disabling network connectivity during Modern Standby...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Modern_Standby_Networking.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"EnableEndTask\",\n      \"Label\": \"'End Task' option in taskbar context menu\",\n      \"ToolTip\": \"When enabled, adds an 'End Task' option to the right-click context menu for apps in the taskbar, allowing you to quickly force close apps.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 6,\n      \"Action\": \"Show\",\n      \"RegistryKey\": \"Enable_End_Task.reg\",\n      \"ApplyText\": \"Enabling the 'End Task' option in the taskbar right click menu...\",\n      \"UndoAction\": \"Hide\",\n      \"RegistryUndoKey\": \"Disable_End_Task.reg\",\n      \"MinVersion\": 22631,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"EnableLastActiveClick\",\n      \"Label\": \"'Last Active Click' behavior for taskbar apps\",\n      \"ToolTip\": \"When enabled, clicking on an app in the taskbar will switch to the last active window of that app, instead of only showing the thumbnail preview.\",\n      \"Category\": \"Taskbar\",\n      \"Priority\": 7,\n      \"Action\": \"Enable\",\n      \"RegistryKey\": \"Enable_Last_Active_Click.reg\",\n      \"ApplyText\": \"Enabling the 'Last Active Click' behavior in the taskbar app area...\",\n      \"UndoAction\": \"Disable\",\n      \"RegistryUndoKey\": \"Disable_Last_Active_Click.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CombineTaskbarAlways\",\n      \"Label\": \"Always combine taskbar buttons and hide labels for the main display\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Combine Taskbar Always\",\n      \"RegistryKey\": \"Combine_Taskbar_Always.reg\",\n      \"ApplyText\": \"Setting the taskbar on the main display to always combine buttons and hide labels...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CombineMMTaskbarAlways\",\n      \"Label\": \"Always combine taskbar buttons and hide labels for secondary displays\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Combine Multi-Monitor Taskbar Always\",\n      \"RegistryKey\": \"Combine_MMTaskbar_Always.reg\",\n      \"ApplyText\": \"Setting the taskbar on secondary displays to always combine buttons and hide labels...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CombineTaskbarWhenFull\",\n      \"Label\": \"Combine taskbar buttons and hide labels when taskbar is full for the main display\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Combine Taskbar When Full\",\n      \"RegistryKey\": \"Combine_Taskbar_When_Full.reg\",\n      \"ApplyText\": \"Setting the taskbar on the main display to only combine buttons and hide labels when the taskbar is full...\",\n      \"UndoAction\": \"Combine Taskbar Always\",\n      \"RegistryUndoKey\": \"Combine_Taskbar_Always.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CombineMMTaskbarWhenFull\",\n      \"Label\": \"Combine taskbar buttons and hide labels when taskbar is full for secondary displays\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Combine Multi-Monitor Taskbar When Full\",\n      \"RegistryKey\": \"Combine_MMTaskbar_When_Full.reg\",\n      \"ApplyText\": \"Setting the taskbar on secondary displays to only combine buttons and hide labels when the taskbar is full...\",\n      \"UndoAction\": \"Combine Multi-Monitor Taskbar Always\",\n      \"RegistryUndoKey\": \"Combine_MMTaskbar_Always.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CombineTaskbarNever\",\n      \"Label\": \"Never combine taskbar buttons and show labels for the main display\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Never Combine Taskbar\",\n      \"RegistryKey\": \"Combine_Taskbar_Never.reg\",\n      \"ApplyText\": \"Setting the taskbar on the main display to never combine buttons or hide labels...\",\n      \"UndoAction\": \"Combine Taskbar Always\",\n      \"RegistryUndoKey\": \"Combine_Taskbar_Always.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"CombineMMTaskbarNever\",\n      \"Label\": \"Never combine taskbar buttons and show labels for secondary displays\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Never Combine Multi-Monitor Taskbar\",\n      \"RegistryKey\": \"Combine_MMTaskbar_Never.reg\",\n      \"ApplyText\": \"Setting the taskbar on secondary displays to never combine buttons or hide labels...\",\n      \"UndoAction\": \"Combine Multi-Monitor Taskbar Always\",\n      \"RegistryUndoKey\": \"Combine_MMTaskbar_Always.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"MMTaskbarModeAll\",\n      \"Label\": \"Show app icons on all taskbars\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Show All Taskbar Icons\",\n      \"RegistryKey\": \"MMTaskbarMode_All.reg\",\n      \"ApplyText\": \"Setting the taskbar to show app icons on all taskbars...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"MMTaskbarModeMainActive\",\n      \"Label\": \"Show app icons on main taskbar and on taskbar where the windows is open\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Show Taskbar Icons Main + Active\",\n      \"RegistryKey\": \"MMTaskbarMode_Main_Active.reg\",\n      \"ApplyText\": \"Setting the taskbar to show app icons on main taskbar and on taskbar where the windows is open...\",\n      \"UndoAction\": \"Show All Taskbar Icons\",\n      \"RegistryUndoKey\": \"MMTaskbarMode_All.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"MMTaskbarModeActive\",\n      \"Label\": \"Show app icons only on taskbar where the window is open\",\n      \"Category\": \"Taskbar\",\n      \"Action\": \"Show Taskbar Icons Active Only\",\n      \"RegistryKey\": \"MMTaskbarMode_Active.reg\",\n      \"ApplyText\": \"Setting the taskbar to only show app icons on the taskbar where the window is open...\",\n      \"UndoAction\": \"Show All Taskbar Icons\",\n      \"RegistryUndoKey\": \"MMTaskbarMode_All.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ExplorerToHome\",\n      \"Label\": \"Change the default location that File Explorer opens to 'Home'\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Explorer to Home\",\n      \"RegistryKey\": \"Launch_File_Explorer_To_Home.reg\",\n      \"ApplyText\": \"Changing the default location that File Explorer opens to, to 'Home'...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ExplorerToThisPC\",\n      \"Label\": \"Change the default location that File Explorer opens to 'This PC'\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Explorer to This PC\",\n      \"RegistryKey\": \"Launch_File_Explorer_To_This_PC.reg\",\n      \"ApplyText\": \"Changing the default location that File Explorer opens to, to 'This PC'...\",\n      \"UndoAction\": \"Explorer to Home\",\n      \"RegistryUndoKey\": \"Launch_File_Explorer_To_Home.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ExplorerToDownloads\",\n      \"Label\": \"Change the default location that File Explorer opens to 'Downloads'\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Explorer to Downloads\",\n      \"RegistryKey\": \"Launch_File_Explorer_To_Downloads.reg\",\n      \"ApplyText\": \"Changing the default location that File Explorer opens to, to 'Downloads'...\",\n      \"UndoAction\": \"Explorer to Home\",\n      \"RegistryUndoKey\": \"Launch_File_Explorer_To_Home.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ExplorerToOneDrive\",\n      \"Label\": \"Change the default location that File Explorer opens to 'OneDrive'\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Explorer to OneDrive\",\n      \"RegistryKey\": \"Launch_File_Explorer_To_OneDrive.reg\",\n      \"ApplyText\": \"Changing the default location that File Explorer opens to, to 'OneDrive'...\",\n      \"UndoAction\": \"Explorer to Home\",\n      \"RegistryUndoKey\": \"Launch_File_Explorer_To_Home.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ShowKnownFileExt\",\n      \"Label\": \"file extensions for known file types\",\n      \"ToolTip\": \"This will show file extensions for known file types. By default, Windows hides file extensions for known file types which can lead to confusion and security risks.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Show\",\n      \"RegistryKey\": \"Show_Extensions_For_Known_File_Types.reg\",\n      \"ApplyText\": \"Enabling file extensions for known file types...\",\n      \"UndoAction\": \"Hide\",\n      \"RegistryUndoKey\": \"Hide_Extensions_For_Known_File_Types.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ShowHiddenFolders\",\n      \"Label\": \"hidden files, folders and drives\",\n      \"ToolTip\": \"By default, Windows hides certain files, folders and drives to prevent accidental modification or deletion. Turn this on to show all files in File Explorer.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Show\",\n      \"RegistryKey\": \"Show_Hidden_Folders.reg\",\n      \"ApplyText\": \"Unhiding hidden files, folders and drives...\",\n      \"UndoAction\": \"Hide\",\n      \"RegistryUndoKey\": \"Hide_Hidden_Folders.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideHome\",\n      \"Label\": \"'Home' from navigation pane\",\n      \"ToolTip\": \"Hides the 'Home' section from the File Explorer navigation pane.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_Home_from_Explorer.reg\",\n      \"ApplyText\": \"Hiding the home section from the File Explorer navigation pane...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_Home_in_Explorer.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideGallery\",\n      \"Label\": \"'Gallery' from navigation pane\",\n      \"ToolTip\": \"Hides the 'Gallery' section from the File Explorer navigation pane.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_Gallery_from_Explorer.reg\",\n      \"ApplyText\": \"Hiding the gallery section from the File Explorer navigation pane...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_Gallery_in_Explorer.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideDupliDrive\",\n      \"Label\": \"duplicate removable drive entries\",\n      \"ToolTip\": \"By default, Windows shows removable drives both under 'This PC' and in the navigation pane with its own entry. Enable this setting to only show removable drives under 'This PC'.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_duplicate_removable_drives_from_navigation_pane_of_File_Explorer.reg\",\n      \"ApplyText\": \"Hiding duplicate removable drive entries from the File Explorer navigation pane...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_duplicate_removable_drives_in_navigation_pane_of_File_Explorer.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"AddFoldersToThisPC\",\n      \"Label\": \"common folders back to 'This PC' page\",\n      \"ToolTip\": \"This setting will add common folders like Desktop, Documents, Downloads, Music, Pictures and Videos back to the 'This PC' page in File Explorer.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Add\",\n      \"RegistryKey\": \"Add_All_Folders_Under_This_PC.reg\",\n      \"ApplyText\": \"Adding all common folders (Desktop, Downloads, etc.) back to 'This PC' in File Explorer...\",\n      \"UndoAction\": \"Remove\",\n      \"RegistryUndoKey\": \"Remove_All_Folders_Under_This_PC.reg\",\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableTransparency\",\n      \"Label\": \"transparency effects\",\n      \"ToolTip\": \"This will disable transparency effects on Windows and interfaces. Which can help improve performance on older hardware.\",\n      \"Category\": \"Appearance\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Transparency.reg\",\n      \"ApplyText\": \"Disabling transparency effects...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Transparency.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableAnimations\",\n      \"Label\": \"animations and visual effects\",\n      \"ToolTip\": \"This will disable animations and some visual effects in Windows, which can make the interface feel snappier, especially on older hardware.\",\n      \"Category\": \"Appearance\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Animations.reg\",\n      \"ApplyText\": \"Disabling animations and visual effects...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Animations.reg\",\n      \"RequiresReboot\": true,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableUpdateASAP\",\n      \"Label\": \"updates as soon as they're available\",\n      \"ToolTip\": \"This will prevent your PC from being among the first to receive new non-security updates. Your PC will still receive these updates eventually.\",\n      \"Category\": \"Windows Update\",\n      \"Action\": \"Prevent getting\",\n      \"RegistryKey\": \"Disable_Update_ASAP.reg\",\n      \"ApplyText\": \"Preventing Windows from getting updates as soon as they are available...\",\n      \"UndoAction\": \"Get\",\n      \"RegistryUndoKey\": \"Enable_Update_ASAP.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"PreventUpdateAutoReboot\",\n      \"Label\": \"automatic restarts after updates while signed in\",\n      \"ToolTip\": \"This will prevent your PC from automatically restarting after updates while any user is signed in.\",\n      \"Category\": \"Windows Update\",\n      \"Action\": \"Prevent\",\n      \"RegistryKey\": \"Prevent_Auto_Reboot.reg\",\n      \"ApplyText\": \"Preventing automatic restarts after updates while signed in...\",\n      \"UndoAction\": \"Allow\",\n      \"RegistryUndoKey\": \"Allow_Auto_Reboot.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"DisableDeliveryOptimization\",\n      \"Label\": \"sharing downloaded updates with other PCs\",\n      \"ToolTip\": \"This will prevent your PC from sharing downloaded updates with other PCs on the local network or on the internet. This also prevents your PC from downloading updates from other PCs.\",\n      \"Category\": \"Windows Update\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Delivery_Optimization.reg\",\n      \"ApplyText\": \"Disabling sharing of downloaded updates with other PCs...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Delivery_Optimization.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"ForceRemoveEdge\",\n      \"Label\": \"Forcefully uninstall Microsoft Edge. NOT RECOMMENDED!\",\n      \"Category\": null,\n      \"Action\": \"Force Remove Edge\",\n      \"RegistryKey\": null,\n      \"ApplyText\": null,\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"HideIncludeInLibrary\",\n      \"Label\": \"'Include in library' option in the context menu\",\n      \"ToolTip\": \"Hides the 'Include in library' option from the File Explorer context menu.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Include_in_library_from_context_menu.reg\",\n      \"ApplyText\": \"Hiding 'Include in library' in the context menu...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Include_in_library_in_context_menu.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 21999\n    },\n    {\n      \"FeatureId\": \"HideGiveAccessTo\",\n      \"Label\": \"'Give access to' option in the context menu\",\n      \"ToolTip\": \"Hides the 'Give access to' option from the File Explorer context menu.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Give_access_to_context_menu.reg\",\n      \"ApplyText\": \"Hiding 'Give access to' in the context menu...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Give_access_to_context_menu.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 21999\n    },\n    {\n      \"FeatureId\": \"HideShare\",\n      \"Label\": \"'Share' option in the context menu\",\n      \"ToolTip\": \"Hides the 'Share' option from the File Explorer context menu.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Disable_Share_from_context_menu.reg\",\n      \"ApplyText\": \"Hiding 'Share' in the context menu...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Enable_Share_in_context_menu.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 21999\n    },\n    {\n      \"FeatureId\": \"HideOnedrive\",\n      \"Label\": \"'OneDrive' folder from navigation pane\",\n      \"ToolTip\": \"Hides the 'OneDrive' folder from the File Explorer navigation pane.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_Onedrive_Folder.reg\",\n      \"ApplyText\": \"Hiding the OneDrive folder from the File Explorer navigation pane...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_Onedrive_Folder.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 21999\n    },\n    {\n      \"FeatureId\": \"Hide3dObjects\",\n      \"Label\": \"'3D objects' folder under 'This PC'\",\n      \"ToolTip\": \"Hides the '3D objects' folder from the File Explorer navigation pane.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_3D_Objects_Folder.reg\",\n      \"ApplyText\": \"Hiding the 3D objects folder from the File Explorer navigation pane...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_3D_Objects_Folder.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 21999\n    },\n    {\n      \"FeatureId\": \"HideMusic\",\n      \"Label\": \"'Music' folder under 'This PC'\",\n      \"ToolTip\": \"Hides the 'Music' folder from the File Explorer navigation pane.\",\n      \"Category\": \"File Explorer\",\n      \"Action\": \"Hide\",\n      \"RegistryKey\": \"Hide_Music_Folder.reg\",\n      \"ApplyText\": \"Hiding the music folder from the File Explorer navigation pane...\",\n      \"UndoAction\": \"Show\",\n      \"RegistryUndoKey\": \"Show_Music_Folder.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": 21999\n    },\n    {\n      \"FeatureId\": \"DisableBraveBloat\",\n      \"Label\": \"bloat in Brave browser (AI, Crypto, etc.)\",\n      \"ToolTip\": \"This will disable Brave's built-in AI features, Crypto wallet, News, Rewards, Talk and VPN. This feature uses policies, which will lock down certain settings.\",\n      \"Category\": \"Other\",\n      \"Action\": \"Disable\",\n      \"RegistryKey\": \"Disable_Brave_Bloat.reg\",\n      \"ApplyText\": \"Disabling Brave AI, Crypto, News, Rewards, Talk and VPN in Brave browser...\",\n      \"UndoAction\": \"Enable\",\n      \"RegistryUndoKey\": \"Enable_Brave_Bloat.reg\",\n      \"MinVersion\": null,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"EnableWindowsSandbox\",\n      \"Label\": \"Windows Sandbox\",\n      \"ToolTip\": \"Windows Sandbox is a lightweight desktop environment for safely running applications in isolation. Software installed inside the Windows Sandbox environment remains 'sandboxed' and runs separately from the host machine. Only supported on Windows 11 Pro, Workstation, and Enterprise editions.\",\n      \"Category\": \"Optional Windows Features\",\n      \"Action\": \"Enable\",\n      \"RegistryKey\": null,\n      \"ApplyText\": \"Enabling Windows Sandbox...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"RequiresReboot\": true,\n      \"MinVersion\": 22483,\n      \"MaxVersion\": null\n    },\n    {\n      \"FeatureId\": \"EnableWindowsSubsystemForLinux\",\n      \"Label\": \"Windows Subsystem for Linux\",\n      \"ToolTip\": \"Windows Subsystem for Linux allows you to run a Linux environment directly on Windows without the need for a virtual machine.\",\n      \"Category\": \"Optional Windows Features\",\n      \"Action\": \"Enable\",\n      \"RegistryKey\": null,\n      \"ApplyText\": \"Enabling Windows Subsystem for Linux...\",\n      \"UndoAction\": null,\n      \"RegistryUndoKey\": null,\n      \"RequiresReboot\": true,\n      \"MinVersion\": 22000,\n      \"MaxVersion\": null\n    }\n  ]\n}"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2020 Raphire (https://github.com/Raphire)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# Win11Debloat\n\n[![GitHub Release](https://img.shields.io/github/v/release/Raphire/Win11Debloat?style=for-the-badge&label=Latest%20release)](https://github.com/Raphire/Win11Debloat/releases/latest)\n[![Join the Discussion](https://img.shields.io/badge/Join-the%20Discussion-2D9F2D?style=for-the-badge&logo=github&logoColor=white)](https://github.com/Raphire/Win11Debloat/discussions)\n[![Static Badge](https://img.shields.io/badge/Documentation-_?style=for-the-badge&logo=bookstack&color=grey)](https://github.com/Raphire/Win11Debloat/wiki/)\n\n Win11Debloat is a lightweight, easy to use PowerShell script that allows you to quickly declutter and customize your Windows experience. It can remove pre-installed bloatware apps, disable telemetry, remove intrusive interface elements and much more. No need to painstakingly go through all the settings yourself or remove apps one by one. Win11Debloat makes the process quick and easy!\n\nThe script also includes many features that system administrators and power users will enjoy. Such as a powerful command-line interface, support for Windows Audit mode and the option to make changes to other Windows users. Please refer to our [wiki](https://github.com/Raphire/Win11Debloat/wiki/) for more details.\n\n![Win11Debloat Menu](/Assets/Images/menu.png)\n\n#### Did this script help you? Please consider buying me a cup of coffee to support my work\n\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/M4M5C6UPC)\n\n## Usage\n\n> [!Warning]\n> Great care went into making sure this script does not unintentionally break any OS functionality, but use at your own risk! If you run into any issues, please report them [here](https://github.com/Raphire/Win11Debloat/issues).\n\n### Quick method\n\nDownload & run the script automatically via PowerShell.\n\n1. Open PowerShell or Terminal, preferably as an administrator.\n2. Copy and paste the command below into PowerShell:\n\n```PowerShell\n& ([scriptblock]::Create((irm \"https://debloat.raphi.re/\")))\n```\n\n3. Wait for the script to automatically download Win11Debloat.\n4. Carefully read through and follow the on-screen instructions.\n\nThis method supports command-line parameters to customize the behaviour of the script. Please click [here](https://github.com/Raphire/Win11Debloat/wiki/Command%E2%80%90line-Interface#parameters) for more information.\n\n### Traditional method\n\n<details>\n  <summary>Manually download & run the script.</summary><br/>\n\n  1. [Download the latest version of the script](https://github.com/Raphire/Win11Debloat/releases/latest), and extract the .ZIP file to your desired location.\n  2. Navigate to the Win11Debloat folder\n  3. Double click the `Run.bat` file to start the script. NOTE: If the console window immediately closes and nothing happens, try the advanced method below.\n  4. Accept the Windows UAC prompt to run the script as administrator, this is required for the script to function.\n  5. Carefully read through and follow the on-screen instructions.\n</details>\n\n### Advanced method\n\n<details>\n  <summary>Manually download the script & run the script via PowerShell. Recommended for advanced users.</summary><br/>\n\n  1. [Download the latest version of the script](https://github.com/Raphire/Win11Debloat/releases/latest), and extract the .ZIP file to your desired location.\n  2. Open PowerShell or Terminal as an administrator.\n  3. Temporarily enable PowerShell execution by entering the following command:\n\n  ```PowerShell\n  Set-ExecutionPolicy Unrestricted -Scope Process -Force\n  ```\n\n  4. In PowerShell, navigate to the directory where the files were extracted. Example: `cd c:\\Win11Debloat`\n  5. Now run the script by entering the following command:\n\n  ```PowerShell\n  .\\Win11Debloat.ps1\n  ```\n\n  6. Carefully read through and follow the on-screen instructions.\n\n  This method supports command-line parameters to customize the behaviour of the script. Please click [here](https://github.com/Raphire/Win11Debloat/wiki/Command%E2%80%90line-Interface#parameters) for more information.\n</details>\n\n## Features\n\nBelow is an overview of the key features and functionality offered by Win11Debloat. Please refer to [the wiki](https://github.com/Raphire/Win11Debloat/wiki/Default-Settings) for more information about the default settings preset.\n\n> [!Tip]\n> All of the changes made by Win11Debloat can easily be reverted and almost all of the apps can be reinstalled through the Microsoft Store. A full guide on how to revert changes can be found [here](https://github.com/Raphire/Win11Debloat/wiki/Reverting-Changes).\n\n#### App Removal\n\n- Remove a wide variety of preinstalled apps. Click [here](https://github.com/Raphire/Win11Debloat/wiki/App-Removal) for more info.\n\n#### Privacy & Suggested Content\n\n- Disable telemetry, diagnostic data, activity history, app-launch tracking & targeted ads.\n- Disable tips, tricks, suggestions & ads across Windows.\n- Disable Windows location services & app location access.\n- Disable Find My Device location tracking.\n- Disable 'Windows Spotlight' and tips & tricks on the lock screen.\n- Disable 'Windows Spotlight' desktop background option.\n- Disable ads, suggestions and the MSN news feed in Microsoft Edge.\n- Hide Microsoft 365 ads on the Settings 'Home' page, or hide the 'Home' page entirely.\n\n#### AI Features\n\n- Disable & remove Microsoft Copilot.\n- Disable Windows Recall.\n- Disable Click to Do, AI text & image analysis tool.\n- Prevent AI service (WSAIFabricSvc) from starting automatically.\n- Disable AI Features in Edge.\n- Disable AI Features in Paint.\n- Disable AI Features in Notepad.\n\n#### System\n\n- Disable the Drag Tray for sharing & moving files.\n- Restore the old Windows 10 style context menu.\n- Turn off Enhance Pointer Precision, also known as mouse acceleration.\n- Disable the Sticky Keys keyboard shortcut.\n- Disable Storage Sense automatic disk cleanup.\n- Disable fast start-up to ensure a full shutdown.\n- Disable BitLocker automatic device encryption.\n- Disable network connectivity during Modern Standby to reduce battery drain.\n\n#### Windows Update\n\n- Prevent Windows from getting updates as soon as they're available.\n- Prevent automatic restarts after updates while signed in.\n- Disable sharing of downloaded updates with other PCs, also known as Delivery Optimization.\n\n#### Appearance\n\n- Enable dark mode for system and apps.\n- Disable transparency effects\n- Disable animations and visual effects.\n\n#### Start Menu & Search\n\n- Remove or replace all pinned apps from the start menu.\n- Hide the recommended section in the start menu.\n- Hide the 'All Apps' section in the start menu.\n- Disable the Phone Link mobile devices integration in the start menu.\n- Disable Bing web search & Copilot integration in Windows search.\n- Disable Microsoft Store app suggestions in Windows search.\n- Disable Search Highlights (dynamic/branded content) in the taskbar search box.\n- Disable local Windows search history.\n\n#### Taskbar\n\n- Align taskbar icons to the left.\n- Hide or change the search icon/box on the taskbar.\n- Hide the taskview button from the taskbar.\n- Disable widgets on the taskbar & lock screen.\n- Hide the chat (meet now) icon from the taskbar.\n- Enable the 'End Task' option in the taskbar right click menu.\n- Enable the 'Last Active Click' behavior in the taskbar app area. This allows you to repeatedly click on an application's icon in the taskbar to switch focus between the open windows of that application.\n- Choose how app icons are shown on the taskbar when using multiple monitors.\n- Choose combine mode for taskbar buttons and labels.\n\n#### File Explorer\n\n- Change the default location that File Explorer opens to.\n- Show file extensions for known file types.\n- Show hidden files, folders and drives.\n- Hide the Home or Gallery section from the File Explorer navigation pane.\n- Hide duplicate removable drive entries from the File Explorer navigation pane, so only the entry under 'This PC' remains.\n- Add all common folders (Desktop, Downloads, etc.) back to 'This PC' in File Explorer.\n- Hide the 3D objects, music or OneDrive folder from the File Explorer navigation pane.\n- Hide the 'Include in library', 'Give access to' and 'Share' options from the context menu.\n\n#### Multi-tasking\n\n- Disable window snapping.\n- Disable Snap Assist suggestions when snapping a window.\n- Disable Snap Layout suggestions when dragging windows to the top of screen and when hovering on the maximize button.\n- Change if tabs are shown when snapping or pressing Alt+Tab.\n\n#### Optional Windows Features\n\n- Enable Windows Sandbox, a lightweight desktop environment for safely running applications in isolation.\n- Enable Windows Subsystem for Linux which allows you to run a Linux environment directly on Windows.\n\n#### Other\n\n- Disable Xbox Game Bar integration & game/screen recording. This also disables `ms-gamingoverlay`/`ms-gamebar` popups if you uninstall the Xbox Game Bar.\n- Disable bloat in Brave browser (AI, Crypto, News, etc.)\n\n#### Advanced Features\n\n- Option to [apply changes to a different user](https://github.com/Raphire/Win11Debloat/wiki/Advanced-Features#running-as-another-user), instead of the currently logged in user.\n- [Sysprep mode](https://github.com/Raphire/Win11Debloat/wiki/Advanced-Features#sysprep-mode) to apply changes to the Windows Default user profile. Which ensures, all new users will have the changes automatically applied to them.\n\n## Contributing\n\nWe welcome contributions of all kinds! Please see our [Contributing Guidelines](/.github/CONTRIBUTING.md) for detailed instructions on how to get started and best practices for contributing.\n\n## License\n\nWin11Debloat is licensed under the MIT license. See the LICENSE file for more information.\n"
  },
  {
    "path": "Regfiles/Add_All_Folders_Under_This_PC.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Desktop\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\"HiddenByDefault\"=dword:00000000\n\n; Documents\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\"HiddenByDefault\"=dword:00000000\n\n; Downloads\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\"HiddenByDefault\"=dword:00000000\n\n; Music\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{1CF1260C-4DD0-4ebb-811F-33C572699FDE}]\n\"HiddenByDefault\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\"HiddenByDefault\"=dword:00000000\n\n; Pictures\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\"HiddenByDefault\"=dword:00000000\n\n; Videos\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n\"HiddenByDefault\"=dword:00000000"
  },
  {
    "path": "Regfiles/Disable_AI_Recall.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableAIDataAnalysis\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableAIDataAnalysis\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"AllowRecallEnablement\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"TurnOffSavingSnapshots\"=dword:00000001"
  },
  {
    "path": "Regfiles/Disable_AI_Service_Auto_Start.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WSAIFabricSvc]\n\"Start\"=dword:00000003\n"
  },
  {
    "path": "Regfiles/Disable_Animations.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Desktop]\n\"UserPreferencesMask\"=hex:90,12,07,80,10,00,00,00\n"
  },
  {
    "path": "Regfiles/Disable_Bitlocker_Auto_Encryption.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\BitLocker]\n\"PreventDeviceEncryption\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Brave_Bloat.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\Software\\Policies\\BraveSoftware\\Brave]\n\"BraveVPNDisabled\"=dword:00000001\n\"BraveWalletDisabled\"=dword:00000001\n\"BraveAIChatEnabled\"=dword:00000000\n\"BraveRewardsDisabled\"=dword:00000001\n\"BraveTalkDisabled\"=dword:00000001\n\"BraveNewsDisabled\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Click_to_Do.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableClickToDo\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableClickToDo\"=dword:00000001"
  },
  {
    "path": "Regfiles/Disable_Copilot.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Copilot button on taskbar\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"ShowCopilotButton\"=dword:00000000\n\n; Disable Copilot service for current user\n[HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot]\n\"TurnOffWindowsCopilot\"=dword:00000001\n\n; Disable Copilot service for all users\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsCopilot]\n\"TurnOffWindowsCopilot\"=dword:00000001"
  },
  {
    "path": "Regfiles/Disable_DVR.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\System\\GameConfigStore]\n\"GameDVR_Enabled\"=dword:00000000\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GameDVR]\n\"AppCaptureEnabled\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR]\n\"AllowGameDVR\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Delivery_Optimization.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable sharing downloaded updates with other PCs (Delivery Optimization)\n[HKEY_USERS\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Settings]\n\"DownloadMode\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Edge_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge]\n\"CopilotCDPPageContext\"=dword:00000000\n\"CopilotPageContext\"=dword:00000000\n\"HubsSidebarEnabled\"=dword:00000000\n\"EdgeEntraCopilotPageContext\"=dword:00000000\n\"EdgeHistoryAISearchEnabled\"=dword:00000000\n\"ComposeInlineEnabled\"=dword:00000000\n\"GenAILocalFoundationalModelSettings\"=dword:00000001\n\"NewTabPageBingChatEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Enhance_Pointer_Precision.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Mouse]\n\"MouseSpeed\"=\"0\"\n\"MouseThreshold1\"=\"0\"\n\"MouseThreshold2\"=\"0\"\n"
  },
  {
    "path": "Regfiles/Disable_Fast_Startup.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power]\n\"HiberbootEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Find_My_Device.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Find My Device location tracking\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\FindMyDevice]\n\"AllowFindMyDevice\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Game_Bar_Integration.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable allow your controller to open Game Bar\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\GameBar]\n\"UseNexusForGameBarEnabled\"=dword:00000000\n\n; Disable `ms-gamebar` popups\n[HKEY_CLASSES_ROOT\\ms-gamebar]\n@=\"URL:ms-gamebar\"\n\"URL Protocol\"=\"\"\n\"NoOpenWith\"=\"\"\n\n[HKEY_CLASSES_ROOT\\ms-gamebar\\shell\\open\\command]\n@=\"%SystemRoot%/System32/systray.exe\"\n\n[HKEY_CLASSES_ROOT\\ms-gamebarservices]\n@=\"URL:ms-gamebarservices\"\n\"URL Protocol\"=\"\"\n\"NoOpenWith\"=\"\"\n\n[HKEY_CLASSES_ROOT\\ms-gamebarservices\\shell\\open\\command]\n@=\"%SystemRoot%/System32/systray.exe\"\n"
  },
  {
    "path": "Regfiles/Disable_Location_Services.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\LocationAndSensors]\n\"DisableLocation\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Modern_Standby_Networking.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9]\n\"ACSettingIndex\"=dword:00000000\n\"DCSettingIndex\"=dword:00000000"
  },
  {
    "path": "Regfiles/Disable_Notepad_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\WindowsNotepad]\n\"DisableAIFeatures\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Paint_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Paint]\n\"DisableCocreator\"=dword:00000001\n\"DisableGenerativeFill\"=dword:00000001\n\"DisableImageCreator\"=dword:00000001\n\"DisableGenerativeErase\"=dword:00000001\n\"DisableRemoveBackground\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Phone_Link_In_Start.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Show mobile device in Start\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\\Companions\\Microsoft.YourPhone_8wekyb3d8bbwe]\n\"IsEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Search_Highlights.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Search Highlights (dynamic/branded content in Windows search box)\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings]\n\"IsDynamicSearchBoxEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Search_History.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Windows search history\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings]\n\"IsDeviceSearchHistoryEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Settings_365_Ads.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable MS 365 Ads in Settings Home\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent]\n\"DisableConsumerAccountStateContent\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Settings_Home.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"SettingsPageVisibility\"=\"hide:home\"\n"
  },
  {
    "path": "Regfiles/Disable_Share_Drag_Tray.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\CDP]\n\"DragTrayEnabled\"=dword:00000000"
  },
  {
    "path": "Regfiles/Disable_Start_All_Apps.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"NoStartMenuMorePrograms\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Start_Recommended.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer]\n\"HideRecommendedSection\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start]\n\"HideRecommendedSection\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Education]\n\"IsEducationEnvironment\"=dword:00000001\n\n; Change start menu layout to show more pins\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"Start_Layout\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Disable_Sticky_Keys_Shortcut.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Accessibility\\StickyKeys]\n\"Flags\"=\"506\"\n"
  },
  {
    "path": "Regfiles/Disable_Storage_Sense.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Storage Sense\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy]\n\"01\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Transparency.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize]\n\"EnableTransparency\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Update_ASAP.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Turn Off \"Get the latest updates as soon as they're available\"\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings]\n\"IsContinuousInnovationOptedIn\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Disable_Window_Snapping.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Desktop]\n\"WindowArrangementActive\"=\"0\"\n"
  },
  {
    "path": "Regfiles/Enable_Dark_Mode.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize]\n\"AppsUseLightTheme\"=dword:00000000\n\"SystemUsesLightTheme\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Enable_End_Task.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings]\n\"TaskbarEndTask\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Enable_Last_Active_Click.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; When clicking the icon of a a running application in the taskbar (that\n; currently has multiple windows open), typically a pop-up will appear showing\n; the multiple windows, and you'll have to click a second time to select the\n; window you want to focus on.\n;\n; This registry hack instead turns the icon click into a \"focus on the last\n; active window\" action. You can click it repeatedly to cycle focus through all\n; the windows open for that application.\n;\n; With this enabled, the pop-up window display will still show if you hover\n; your mouse over the taskbar icon.\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LastActiveClick\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Hide_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000003\n"
  },
  {
    "path": "Regfiles/Launch_File_Explorer_To_Downloads.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000003\n"
  },
  {
    "path": "Regfiles/Launch_File_Explorer_To_Home.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000002\n"
  },
  {
    "path": "Regfiles/Launch_File_Explorer_To_OneDrive.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000004\n"
  },
  {
    "path": "Regfiles/Launch_File_Explorer_To_This_PC.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Prevent_Auto_Reboot.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Prevent automatic restarts after updates while signed in\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU]\n\"NoAutoRebootWithLoggedOnUsers\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Show_20_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Show_3_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000002\n"
  },
  {
    "path": "Regfiles/Show_5_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Add_All_Folders_Under_This_PC.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Desktop\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\"HiddenByDefault\"=dword:00000000\n\n; Documents\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\"HiddenByDefault\"=dword:00000000\n\n; Downloads\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\"HiddenByDefault\"=dword:00000000\n\n; Music\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{1CF1260C-4DD0-4ebb-811F-33C572699FDE}]\n\"HiddenByDefault\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\"HiddenByDefault\"=dword:00000000\n\n; Pictures\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\"HiddenByDefault\"=dword:00000000\n\n; Videos\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n\"HideIfEnabled\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n\"HiddenByDefault\"=dword:00000000"
  },
  {
    "path": "Regfiles/Sysprep/Disable_AI_Recall.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableAIDataAnalysis\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableAIDataAnalysis\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"AllowRecallEnablement\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_AI_Service_Auto_Start.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WSAIFabricSvc]\n\"Start\"=dword:00000003\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Animations.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Control Panel\\Desktop]\n\"UserPreferencesMask\"=hex:90,12,07,80,10,00,00,00\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Bitlocker_Auto_Encryption.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\BitLocker]\n\"PreventDeviceEncryption\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Brave_Bloat.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\Software\\Policies\\BraveSoftware\\Brave]\n\"BraveVPNDisabled\"=dword:00000001\n\"BraveWalletDisabled\"=dword:00000001\n\"BraveAIChatEnabled\"=dword:00000000\n\"BraveRewardsDisabled\"=dword:00000001\n\"BraveTalkDisabled\"=dword:00000001\n\"BraveNewsDisabled\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Click_to_Do.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableClickToDo\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableClickToDo\"=dword:00000001"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Copilot.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Copilot button on taskbar\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"ShowCopilotButton\"=dword:00000000\n\n; Disable Copilot service for current user\n[hkey_users\\default\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot]\n\"TurnOffWindowsCopilot\"=dword:00000001\n\n; Disable Copilot service for all users\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsCopilot]\n\"TurnOffWindowsCopilot\"=dword:00000001"
  },
  {
    "path": "Regfiles/Sysprep/Disable_DVR.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\System\\GameConfigStore]\n\"GameDVR_Enabled\"=dword:00000000\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GameDVR]\n\"AppCaptureEnabled\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR]\n\"AllowGameDVR\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Delivery_Optimization.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable sharing downloaded updates with other PCs (Delivery Optimization)\n[HKEY_USERS\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Settings]\n\"DownloadMode\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Edge_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge]\n\"CopilotCDPPageContext\"=dword:00000000\n\"CopilotPageContext\"=dword:00000000\n\"HubsSidebarEnabled\"=dword:00000000\n\"EdgeEntraCopilotPageContext\"=dword:00000000\n\"EdgeHistoryAISearchEnabled\"=dword:00000000\n\"ComposeInlineEnabled\"=dword:00000000\n\"GenAILocalFoundationalModelSettings\"=dword:00000001\n\"NewTabPageBingChatEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Enhance_Pointer_Precision.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Control Panel\\Mouse]\n\"MouseSpeed\"=\"0\"\n\"MouseThreshold1\"=\"0\"\n\"MouseThreshold2\"=\"0\"\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Fast_Startup.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power]\n\"HiberbootEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Find_My_Device.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Find My Device location tracking\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\FindMyDevice]\n\"AllowFindMyDevice\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Game_Bar_Integration.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable allow your controller to open Game Bar\n[hkey_users\\default\\SOFTWARE\\Microsoft\\GameBar]\n\"UseNexusForGameBarEnabled\"=dword:00000000\n\n; Disable `ms-gamebar` popups\n[HKEY_CLASSES_ROOT\\ms-gamebar]\n@=\"URL:ms-gamebar\"\n\"URL Protocol\"=\"\"\n\"NoOpenWith\"=\"\"\n\n[HKEY_CLASSES_ROOT\\ms-gamebar\\shell\\open\\command]\n@=\"%SystemRoot%/System32/systray.exe\"\n\n[HKEY_CLASSES_ROOT\\ms-gamebarservices]\n@=\"URL:ms-gamebarservices\"\n\"URL Protocol\"=\"\"\n\"NoOpenWith\"=\"\"\n\n[HKEY_CLASSES_ROOT\\ms-gamebar\\shell\\open\\command]\n@=\"%SystemRoot%/System32/systray.exe\""
  },
  {
    "path": "Regfiles/Sysprep/Disable_Location_Services.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\LocationAndSensors]\n\"DisableLocation\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Modern_Standby_Networking.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9]\n\"ACSettingIndex\"=dword:00000000\n\"DCSettingIndex\"=dword:00000000"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Notepad_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\WindowsNotepad]\n\"DisableAIFeatures\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Paint_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Paint]\n\"DisableCocreator\"=dword:00000001\n\"DisableGenerativeFill\"=dword:00000001\n\"DisableImageCreator\"=dword:00000001\n\"DisableGenerativeErase\"=dword:00000001\n\"DisableRemoveBackground\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Phone_Link_In_Start.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Show mobile device in Start\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\\Companions\\Microsoft.YourPhone_8wekyb3d8bbwe]\n\"IsEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Search_Highlights.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Search Highlights (dynamic/branded content in Windows search box)\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings]\n\"IsDynamicSearchBoxEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Search_History.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Windows search history\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings]\n\"IsDeviceSearchHistoryEnabled\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Settings_365_Ads.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable MS 365 Ads in Settings Home\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent]\n\"DisableConsumerAccountStateContent\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Settings_Home.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"SettingsPageVisibility\"=\"hide:home\"\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Share_Drag_Tray.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\CDP]\n\"DragTrayEnabled\"=dword:00000000"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Start_All_Apps.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"NoStartMenuMorePrograms\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Start_Recommended.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer]\n\"HideRecommendedSection\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start]\n\"HideRecommendedSection\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Education]\n\"IsEducationEnvironment\"=dword:00000001\n\n; Change start menu layout to show more pins\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"Start_Layout\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Sticky_Keys_Shortcut.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Control Panel\\Accessibility\\StickyKeys]\n\"Flags\"=\"506\"\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Storage_Sense.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Storage Sense\n[HKEY_USERS\\Default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy]\n\"01\"=dword:00000000\n\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Transparency.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize]\n\"EnableTransparency\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Update_ASAP.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Turn Off \"Get the latest updates as soon as they're available\"\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings]\n\"IsContinuousInnovationOptedIn\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Disable_Window_Snapping.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Control Panel\\Desktop]\n\"WindowArrangementActive\"=\"0\"\n"
  },
  {
    "path": "Regfiles/Sysprep/Enable_Dark_Mode.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize]\n\"AppsUseLightTheme\"=dword:00000000\n\"SystemUsesLightTheme\"=dword:00000000\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce]\n\"AppsUseLightTheme\"=\"reg add HKCU\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize /v AppsUseLightTheme /t REG_DWORD /d 0 /f\"\n\"SystemUsesLightTheme\"=\"reg add HKCU\\\\SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Themes\\\\Personalize /v SystemUsesLightTheme /t REG_DWORD /d 0 /f\"\n"
  },
  {
    "path": "Regfiles/Sysprep/Enable_End_Task.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings]\n\"TaskbarEndTask\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Enable_Last_Active_Click.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; When clicking the icon of a a running application in the taskbar (that\n; currently has multiple windows open), typically a pop-up will appear showing\n; the multiple windows, and you'll have to click a second time to select the\n; window you want to focus on.\n;\n; This registry hack instead turns the icon click into a \"focus on the last\n; active window\" action. You can click it repeatedly to cycle focus through all\n; the windows open for that application.\n;\n; With this enabled, the pop-up window display will still show if you hover\n; your mouse over the taskbar icon.\n\n[HKEY_USERS\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LastActiveClick\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Hide_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000003\n"
  },
  {
    "path": "Regfiles/Sysprep/Launch_File_Explorer_To_Downloads.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000003\n"
  },
  {
    "path": "Regfiles/Sysprep/Launch_File_Explorer_To_Home.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000002\n"
  },
  {
    "path": "Regfiles/Sysprep/Launch_File_Explorer_To_OneDrive.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000004\n"
  },
  {
    "path": "Regfiles/Sysprep/Launch_File_Explorer_To_This_PC.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LaunchTo\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Prevent_Auto_Reboot.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Prevent automatic restarts after updates while signed in\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU]\n\"NoAutoRebootWithLoggedOnUsers\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Show_20_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Sysprep/Show_3_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000002\n"
  },
  {
    "path": "Regfiles/Sysprep/Show_5_Tabs_In_Alt_Tab.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"MultiTaskingAltTabFilter\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Sysprep/Uninstall_Microsoft_Edge.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce]\n\"UninstallMicrosoftEdge\"=\"cmd.exe /c winget uninstall --accept-source-agreements --disable-interactivity --id Microsoft.Edge\"\n"
  },
  {
    "path": "Regfiles/Sysprep/Uninstall_Microsoft_OneDrive.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Create task to remove OneDrive if it's already installed\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\RunOnce]\n\"UninstallMicrosoftOneDrive\"=\"cmd.exe /c winget uninstall --accept-source-agreements --disable-interactivity --id Microsoft.OneDrive\"\n\n; Remove task that installs OneDrive\n[hkey_users\\default\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run]\n\"OneDriveSetup\"=-"
  },
  {
    "path": "Regfiles/Undo/Allow_Auto_Reboot.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Allow automatic restarts after updates while signed in\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsUpdate\\AU]\n\"NoAutoRebootWithLoggedOnUsers\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Allow_Edge_Telemetry.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Allow personalization of ads, Microsoft Edge, search, news and other Microsoft services by sending browsing history, favorites and collections, usage and other browsing data to Microsoft\n; Allow sending required and optional diagnostic data about browser usage\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge]\n\"PersonalizationReportingEnabled\"=-\n\"DiagnosticData\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Disable_End_Task.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\TaskbarDeveloperSettings]\n\"TaskbarEndTask\"=dword:00000000\n"
  },
  {
    "path": "Regfiles/Undo/Disable_Last_Active_Click.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; This disables the last-active-click action for the taskbar.\n; (Please see the `Enable_Last_Active_Click.reg` file for an\n; explanation of what this undoes.)\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"LastActiveClick\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_AI_Recall.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\default\\WindowsAI\\DisableAIDataAnalysis]\n\"value\"=dword:00000000\n\n[HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableAIDataAnalysis\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableAIDataAnalysis\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"AllowRecallEnablement\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_AI_Service_Auto_Start.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\WSAIFabricSvc]\n\"Start\"=dword:00000002\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Activity_History.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable Activity History\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\System]\n\"PublishUserActivities\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Animations.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Desktop]\n\"UserPreferencesMask\"=hex:9e,1e,07,80,12,00,00,00\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Bitlocker_Auto_Encryption.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\BitLocker]\n\"PreventDeviceEncryption\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Brave_Bloat.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Remove all Brave Browser Policies\n[-HKEY_LOCAL_MACHINE\\Software\\Policies\\BraveSoftware\\Brave]\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Click_to_Do.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableClickToDo\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsAI]\n\"DisableClickToDo\"=-"
  },
  {
    "path": "Regfiles/Undo/Enable_Copilot.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable Copilot button on taskbar\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"ShowCopilotButton\"=dword:00000001\n\n; Enable Copilot service for current user\n[HKEY_CURRENT_USER\\Software\\Policies\\Microsoft\\Windows\\WindowsCopilot]\n\"TurnOffWindowsCopilot\"=-\n\n; Enable Copilot service for all users\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\WindowsCopilot]\n\"TurnOffWindowsCopilot\"=-"
  },
  {
    "path": "Regfiles/Undo/Enable_DVR.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\System\\GameConfigStore]\n\"GameDVR_Enabled\"=dword:00000001\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\GameDVR]\n\"AppCaptureEnabled\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\GameDVR]\n\"AllowGameDVR\"=dword:00000001"
  },
  {
    "path": "Regfiles/Undo/Enable_Delivery_Optimization.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable sharing downloaded updates with other PCs (Delivery Optimization)\n[HKEY_USERS\\S-1-5-20\\Software\\Microsoft\\Windows\\CurrentVersion\\DeliveryOptimization\\Settings]\n\"DownloadMode\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Edge_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Edge]\n\"CopilotCDPPageContext\"=-\n\"CopilotPageContext\"=-\n\"HubsSidebarEnabled\"=-\n\"EdgeEntraCopilotPageContext\"=-\n\"EdgeHistoryAISearchEnabled\"=-\n\"ComposeInlineEnabled\"=-\n\"GenAILocalFoundationalModelSettings\"=-\n\"NewTabPageBingChatEnabled\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Enhance_Pointer_Precision.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Mouse]\n\"MouseSpeed\"=\"1\"\n\"MouseThreshold1\"=\"6\"\n\"MouseThreshold2\"=\"10\"\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Fast_Startup.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power]\n\"HiberbootEnabled\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Find_My_Device.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Restore Find My Device to Windows default\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\FindMyDevice]\n\"AllowFindMyDevice\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Game_Bar_Integration.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable allow your controller to open Game Bar\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\GameBar]\n\"UseNexusForGameBarEnabled\"=dword:00000001\n\n; Enable `ms-gamebar` popups\n[HKEY_CLASSES_ROOT\\ms-gamebar]\n@=\"URL:ms-gamebar\"\n\"URL Protocol\"=\"\"\n\"NoOpenWith\"=-\n\n[-HKEY_CLASSES_ROOT\\ms-gamebar\\shell\\open\\command]\n\n[HKEY_CLASSES_ROOT\\ms-gamebarservices]\n@=\"URL:ms-gamebarservices\"\n\"URL Protocol\"=\"\"\n\"NoOpenWith\"=-\n\n[-HKEY_CLASSES_ROOT\\ms-gamebarservices\\shell\\open\\command]"
  },
  {
    "path": "Regfiles/Undo/Enable_Light_Mode.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize]\n\"AppsUseLightTheme\"=dword:00000001\n\"SystemUsesLightTheme\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Location_Services.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\LocationAndSensors]\n\"DisableLocation\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Modern_Standby_Networking.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Power\\PowerSettings\\f15576e8-98b7-4186-b944-eafa664402d9]\n\"ACSettingIndex\"=dword:00000001\n\"DCSettingIndex\"=dword:00000001"
  },
  {
    "path": "Regfiles/Undo/Enable_Notepad_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\WindowsNotepad]\n\"DisableAIFeatures\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Paint_AI_Features.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Paint]\n\"DisableCocreator\"=-\n\"DisableGenerativeFill\"=-\n\"DisableImageCreator\"=-\n\"DisableGenerativeErase\"=-\n\"DisableRemoveBackground\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Phone_Link_In_Start.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable Show mobile device in Start\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Start\\Companions\\Microsoft.YourPhone_8wekyb3d8bbwe]\n\"IsEnabled\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Search_Highlights.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Re-enable Search Highlights (dynamic/branded content in Windows search box)\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings]\n\"IsDynamicSearchBoxEnabled\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Search_History.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Disable Windows search history\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\SearchSettings]\n\"IsDeviceSearchHistoryEnabled\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Settings_365_Ads.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable MS 365 Ads in Settings Home\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\CloudContent]\n\"DisableConsumerAccountStateContent\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Settings_Home.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"SettingsPageVisibility\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Share_Drag_Tray.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\CDP]\n\"DragTrayEnabled\"=dword:00000001"
  },
  {
    "path": "Regfiles/Undo/Enable_Start_All_Apps.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"NoStartMenuMorePrograms\"=-\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer]\n\"NoStartMenuMorePrograms\"=-\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Start_Recommended.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Policies\\Microsoft\\Windows\\Explorer]\n\"HideRecommendedSection\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Start]\n\"HideRecommendedSection\"=dword:00000000\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\PolicyManager\\current\\device\\Education]\n\"IsEducationEnvironment\"=dword:00000000\n\n; Set start menu layout to default\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced]\n\"Start_Layout\"=dword:00000000"
  },
  {
    "path": "Regfiles/Undo/Enable_Sticky_Keys_Shortcut.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Accessibility\\StickyKeys]\n\"Flags\"=\"510\"\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Storage_Sense.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Enable Storage Sense\n[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\StorageSense\\Parameters\\StoragePolicy]\n\"01\"=dword:00000001\n\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Transparency.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize]\n\"EnableTransparency\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Update_ASAP.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Turn On \"Get the latest updates as soon as they're available\"\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\WindowsUpdate\\UX\\Settings]\n\"IsContinuousInnovationOptedIn\"=dword:00000001\n"
  },
  {
    "path": "Regfiles/Undo/Enable_Window_Snapping.reg",
    "content": "Windows Registry Editor Version 5.00\n\n[HKEY_CURRENT_USER\\Control Panel\\Desktop]\n\"WindowArrangementActive\"=\"1\"\n"
  },
  {
    "path": "Regfiles/Undo/Remove_All_Folders_Under_This_PC.reg",
    "content": "Windows Registry Editor Version 5.00\n\n; Desktop\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\"HideIfEnabled\"=dword:022ab9b9\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}]\n\"HiddenByDefault\"=dword:00000001\n\n; Documents\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\"HideIfEnabled\"=dword:022ab9b9\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{d3162b92-9365-467a-956b-92703aca08af}]\n\"HiddenByDefault\"=dword:00000001\n\n; Downloads\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\"HideIfEnabled\"=dword:022ab9b9\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{088e3905-0323-4b02-9826-5d99428e115f}]\n\"HiddenByDefault\"=dword:00000001\n\n; Music\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\"HideIfEnabled\"=dword:022ab9b9\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{1CF1260C-4DD0-4ebb-811F-33C572699FDE}]\n\"HiddenByDefault\"=dword:00000001\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{3dfdf296-dbec-4fb4-81d1-6a3438bcf4de}]\n\"HiddenByDefault\"=dword:00000001\n\n; Pictures\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\"HideIfEnabled\"=dword:022ab9b9\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{24ad3ad4-a569-4530-98e1-ab02f9417aa8}]\n\"HiddenByDefault\"=dword:00000001\n\n; Videos\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n\"HideIfEnabled\"=dword:022ab9b9\n\n[HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\NameSpace\\{f86fa3ab-70d2-4fc7-9c99-fcbf05467f3a}]\n\"HiddenByDefault\"=dword:00000001"
  },
  {
    "path": "Run.bat",
    "content": "@echo off\nsetlocal EnableDelayedExpansion\n\n:: Set Windows Terminal installation paths. (Default and Scoop installation)\nset \"wtDefaultPath=%LOCALAPPDATA%\\Microsoft\\WindowsApps\\wt.exe\"\nset \"wtScoopPath=%USERPROFILE%\\scoop\\apps\\windows-terminal\\current\\wt.exe\"\nset \"logFile=%~dp0Logs\\Win11Debloat-Run.log\"\n\n:: Ensure Logs folder exists\nif not exist \"%~dp0Logs\" mkdir \"%~dp0Logs\"\n\n:: Determine which terminal exists\nif exist \"%wtDefaultPath%\" (\n    set \"wtPath=%wtDefaultPath%\"\n) else if exist \"%wtScoopPath%\" (\n    set \"wtPath=%wtScoopPath%\"\n) else (\n    echo Windows Terminal not found. Using default PowerShell instead.\n    set \"wtPath=\"\n)\n\n:: Launch script\nif defined wtPath (\n    call :Log Launching Win11Debloat.ps1 with Windows Terminal...\n    PowerShell -Command \"Start-Process -FilePath '%wtPath%' -ArgumentList 'PowerShell -NoProfile -ExecutionPolicy Bypass -File \"\"%~dp0Win11Debloat.ps1\"\"' -Verb RunAs\" >> \"%logFile%\" || call :Error \"PowerShell command failed\"\n    call :Log Script execution passed successfully to Win11Debloat.ps1\n) else (\n    echo Windows Terminal not found. Using default PowerShell instead...\n    call :Log Windows Terminal not found. Using default PowerShell to launch Win11Debloat.ps1...\n    PowerShell -ExecutionPolicy Bypass -Command \"& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -File \"\"%~dp0Win11Debloat.ps1\"\"' -Verb RunAs}\" >> \"%logFile%\" || call :Error \"PowerShell command failed\"\n    call :Log Script execution passed successfully to Win11Debloat.ps1\n)\n\necho.\necho If you need further assistance, please open an issue at:\necho https://github.com/Raphire/Win11Debloat/issues\ngoto :EOF\n\n:: Logging Function\n:Log\necho %* >> \"%logFile%\"\ngoto :EOF\n:: Error Handler\n:Error\necho ERROR: %*\necho Logged in %logFile%\npause\ngoto :EOF\n"
  },
  {
    "path": "Schemas/AboutWindow.xaml",
    "content": "<Window xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"About Win11Debloat\" \n        Width=\"500\"\n        SizeToContent=\"Height\"\n        ResizeMode=\"NoResize\"\n        WindowStartupLocation=\"CenterOwner\"\n        WindowStyle=\"None\"\n        AllowsTransparency=\"True\"\n        Background=\"Transparent\"\n        Topmost=\"True\"\n        ShowInTaskbar=\"False\">\n\n    <Border BorderBrush=\"{DynamicResource BorderColor}\" \n            BorderThickness=\"1\" \n            CornerRadius=\"8\"\n            Background=\"{DynamicResource CardBgColor}\"\n            Margin=\"25\">\n        <Border.Effect>\n            <DropShadowEffect Color=\"Black\" \n                            Opacity=\"0.15\" \n                            BlurRadius=\"20\" \n                            ShadowDepth=\"0\" \n                            Direction=\"0\"/>\n        </Border.Effect>\n        \n        <Grid Margin=\"0\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"/>\n                <RowDefinition Height=\"*\"/>\n                <RowDefinition Height=\"Auto\"/>\n            </Grid.RowDefinitions>\n\n            <!-- Title Bar -->\n            <Grid Grid.Row=\"0\" x:Name=\"TitleBar\" Height=\"48\" Background=\"Transparent\">\n                <TextBlock Text=\"About Win11Debloat\" \n                           Foreground=\"{DynamicResource FgColor}\"\n                           FontSize=\"18\"\n                           FontWeight=\"SemiBold\"\n                           VerticalAlignment=\"Center\" \n                           Margin=\"20,0,0,0\"/>\n            </Grid>\n\n            <!-- Message Content -->\n            <Grid Grid.Row=\"1\">\n                <Grid.RowDefinitions>\n                    <RowDefinition Height=\"Auto\"/>\n                    <RowDefinition Height=\"*\"/>\n                    <RowDefinition Height=\"Auto\"/>\n                </Grid.RowDefinitions>\n\n                <!-- Message Text -->\n                <Grid Grid.Row=\"0\" Margin=\"24,12,24,20\">\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width=\"Auto\"/>\n                        <ColumnDefinition Width=\"*\"/>\n                    </Grid.ColumnDefinitions>\n                    <Grid.RowDefinitions>\n                        <RowDefinition Height=\"Auto\"/>\n                        <RowDefinition Height=\"Auto\"/>\n                        <RowDefinition Height=\"Auto\"/>\n                    </Grid.RowDefinitions>\n                    \n                    <!-- Version -->\n                    <TextBlock Grid.Row=\"0\" Grid.Column=\"0\"\n                            Text=\"Version:\" \n                            FontSize=\"14\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            FontWeight=\"SemiBold\"\n                            Margin=\"0,0,16,8\"/>\n                    <TextBlock x:Name=\"VersionText\"\n                            Grid.Row=\"0\" Grid.Column=\"1\"\n                            Text=\"0.0.0\" \n                            FontSize=\"14\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            Margin=\"0,0,0,8\"/>\n                    \n                    <!-- Author -->\n                    <TextBlock Grid.Row=\"1\" Grid.Column=\"0\"\n                            Text=\"Author:\" \n                            FontSize=\"14\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            FontWeight=\"SemiBold\"\n                            Margin=\"0,0,16,8\"/>\n                    <TextBlock Grid.Row=\"1\" Grid.Column=\"1\"\n                            Text=\"Raphire\" \n                            FontSize=\"14\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            Margin=\"0,0,0,8\"/>\n                    \n                    <!-- Project Link -->\n                    <TextBlock Grid.Row=\"2\" Grid.Column=\"0\"\n                            Text=\"Project:\" \n                            FontSize=\"14\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            FontWeight=\"SemiBold\"\n                            Margin=\"0,0,16,0\"/>\n                    <TextBlock x:Name=\"ProjectLink\"\n                            Grid.Row=\"2\" Grid.Column=\"1\"\n                            Text=\"https://github.com/Raphire/Win11Debloat\" \n                            FontSize=\"14\"\n                            Style=\"{DynamicResource HyperlinkStyle}\"\n                            Margin=\"0,0,0,0\"/>\n                </Grid>\n\n                <!-- Separator -->\n                <Border Grid.Row=\"1\" \n                        Height=\"1\" \n                        Background=\"{DynamicResource BorderColor}\"\n                        Margin=\"10,0\"/>\n\n                <!-- Content -->\n                <StackPanel Grid.Row=\"2\" Margin=\"24,20\">\n                    <!-- Donation Message -->\n                    <TextBlock Text=\"Win11Debloat is a passion project that I maintain in my free time. If you've found this tool useful, please consider making a small donation to support its development. I really appreciate it!\"\n                            FontSize=\"14\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            TextWrapping=\"Wrap\"\n                            Margin=\"0,0,0,15\"/>\n\n                    <!-- Ko-fi Link -->\n                    <Grid HorizontalAlignment=\"Left\">\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"Auto\"/>\n                            <ColumnDefinition Width=\"*\"/>\n                        </Grid.ColumnDefinitions>\n\n                        <TextBlock x:Name=\"KofiLinkIcon\"\n                                Grid.Column=\"0\"\n                                FontSize=\"16\"\n                                Style=\"{DynamicResource HyperlinkStyle}\"\n                                HorizontalAlignment=\"Center\"\n                                VerticalAlignment=\"Center\"\n                                FontWeight=\"SemiBold\"\n                                FontFamily=\"Segoe Fluent Icons\"\n                                Text=\"&#xEB52;\" \n                                Foreground=\"{DynamicResource CloseHover}\"\n                                Margin=\"0,0,8,0\"/>\n                        \n                        <TextBlock x:Name=\"KofiLink\"\n                                Grid.Column=\"1\"\n                                FontSize=\"16\"\n                                Style=\"{DynamicResource HyperlinkStyle}\"\n                                HorizontalAlignment=\"Center\"\n                                VerticalAlignment=\"Center\"\n                                FontWeight=\"SemiBold\"\n                                Text=\"Support me on Ko-fi\"/>\n                    </Grid>\n                </StackPanel>\n            </Grid>\n\n            <!-- Button Panel -->\n            <Border Grid.Row=\"2\" \n                    Background=\"{DynamicResource BgColor}\"\n                    BorderBrush=\"{DynamicResource BorderColor}\"\n                    BorderThickness=\"0,1,0,0\"\n                    Padding=\"16,12\"\n                    CornerRadius=\"0,0,8,8\">\n                <StackPanel x:Name=\"ButtonPanel\"\n                            Orientation=\"Horizontal\"\n                            HorizontalAlignment=\"Right\">\n                    <Button x:Name=\"CloseButton\" \n                            Content=\"Close\" \n                            Height=\"32\" MinWidth=\"80\" Margin=\"4,0\"\n                            Style=\"{DynamicResource SecondaryButtonStyle}\"/>\n                </StackPanel>\n            </Border>\n        </Grid>\n    </Border>\n</Window>\n"
  },
  {
    "path": "Schemas/AppSelectionWindow.xaml",
    "content": "<Window xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"Win11Debloat Application Selection\" \n        Width=\"450\" Height=\"580\" \n        ResizeMode=\"NoResize\" \n        WindowStartupLocation=\"CenterScreen\"\n        WindowStyle=\"None\"\n        AllowsTransparency=\"True\"\n        Background=\"Transparent\"\n        Foreground=\"{DynamicResource FgColor}\">\n    <Window.Resources>\n        <!-- CheckBox Style -->\n        <Style TargetType=\"CheckBox\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Padding\" Value=\"4,2\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"CheckBox\">\n                        <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\" CornerRadius=\"4\" Padding=\"{TemplateBinding Padding}\">\n                            <Grid>\n                                <Grid.ColumnDefinitions>\n                                    <ColumnDefinition Width=\"Auto\"/>\n                                    <ColumnDefinition Width=\"*\"/>\n                                </Grid.ColumnDefinitions>\n                                <Border x:Name=\"CheckBoxBorder\" Grid.Column=\"0\" Width=\"18\" Height=\"18\" Background=\"{DynamicResource CheckBoxBgColor}\" BorderBrush=\"{DynamicResource CheckBoxBorderColor}\" BorderThickness=\"1\" CornerRadius=\"4\" Margin=\"0,0,8,0\">\n                                    <TextBlock x:Name=\"CheckMark\" Text=\"&#xE73E;\" FontFamily=\"Segoe MDL2 Assets\" FontSize=\"12\" Foreground=\"{DynamicResource ButtonBg}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Visibility=\"Collapsed\"/>\n                                </Border>\n                                <ContentPresenter Grid.Column=\"1\" VerticalAlignment=\"Center\" Margin=\"0,0,0,1\"/>\n                            </Grid>\n                        </Border>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource CheckBoxHoverColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsChecked\" Value=\"True\">\n                                <Setter TargetName=\"CheckMark\" Property=\"Visibility\" Value=\"Visible\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBg}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBg}\"/>\n                                <Setter TargetName=\"CheckMark\" Property=\"Foreground\" Value=\"White\"/>\n                            </Trigger>\n                            <MultiTrigger>\n                                <MultiTrigger.Conditions>\n                                    <Condition Property=\"IsMouseOver\" Value=\"True\"/>\n                                    <Condition Property=\"IsChecked\" Value=\"True\"/>\n                                </MultiTrigger.Conditions>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonHover}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource ButtonHover}\"/>\n                            </MultiTrigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <!-- CheckBox style for apps panels -->\n        <Style x:Key=\"AppsPanelCheckBoxStyle\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\n            <Setter Property=\"Margin\" Value=\"2,3,2,3\"/>\n        </Style>\n        \n        <!-- Title Bar Button Style -->\n        <Style x:Key=\"TitleBarButton\" TargetType=\"Button\">\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"0\"/>\n            <Setter Property=\"Width\" Value=\"46\"/>\n            <Setter Property=\"Height\" Value=\"32\"/>\n            <Setter Property=\"FontFamily\" Value=\"Segoe MDL2 Assets\"/>\n            <Setter Property=\"FontSize\" Value=\"10\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\" CornerRadius=\"0,8,0,0\">\n                            <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style x:Key=\"CloseButton\" TargetType=\"Button\" BasedOn=\"{StaticResource TitleBarButton}\">\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource CloseHover}\"/>\n                    <Setter Property=\"Foreground\" Value=\"White\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n    </Window.Resources>\n\n    <Border BorderBrush=\"{DynamicResource BorderColor}\" \n            BorderThickness=\"1\" \n            CornerRadius=\"8\" \n            Background=\"{DynamicResource BgColor}\"\n            Margin=\"25\">\n        <Border.Effect>\n            <DropShadowEffect Color=\"Black\" \n                            Opacity=\"0.15\" \n                            BlurRadius=\"20\" \n                            ShadowDepth=\"0\" \n                            Direction=\"0\"/>\n        </Border.Effect>\n        <Grid>\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"32\"/>\n                <RowDefinition Height=\"*\"/>\n            </Grid.RowDefinitions>\n\n            <!-- Custom Title Bar -->\n            <Grid Grid.Row=\"0\" x:Name=\"TitleBar\">\n                <Border Background=\"{DynamicResource BgColor}\" CornerRadius=\"8,8,0,0\">\n                    <Grid>\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\"/>\n                            <ColumnDefinition Width=\"Auto\"/>\n                        </Grid.ColumnDefinitions>\n                        <TextBlock Grid.Column=\"0\" \n                                   Text=\"Win11Debloat Application Selection\" \n                                   Foreground=\"{DynamicResource FgColor}\"\n                                   VerticalAlignment=\"Center\" \n                                   Margin=\"12,0,0,0\"\n                                   FontSize=\"12\"/>\n                        <StackPanel Grid.Column=\"1\" Orientation=\"Horizontal\">\n                            <Button x:Name=\"CloseBtn\" Content=\"&#xE8BB;\" Style=\"{StaticResource CloseButton}\" ToolTip=\"Close\" IsCancel=\"True\" AutomationProperties.Name=\"Close\"/>\n                        </StackPanel>\n                    </Grid>\n                </Border>\n            </Grid>\n\n            <!-- Main Content -->\n            <Grid Grid.Row=\"1\">\n                <Grid Margin=\"12\">\n                    <Grid.RowDefinitions>\n                        <RowDefinition Height=\"Auto\"/>\n                        <RowDefinition Height=\"Auto\"/>\n                        <RowDefinition Height=\"*\"/>\n                        <RowDefinition Height=\"Auto\"/>\n                    </Grid.RowDefinitions>\n\n                    <TextBlock Grid.Row=\"0\" \n                            Text=\"Check apps that you wish to remove, uncheck apps that you wish to keep\" \n                            TextWrapping=\"Wrap\"\n                            Foreground=\"{DynamicResource FgColor}\"\n                            Margin=\"0,0,0,10\"/>\n\n                    <StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" Margin=\"0,0,0,8\">\n                        <CheckBox x:Name=\"CheckAllBox\" Content=\"Check/Uncheck all\" Margin=\"8,0,15,0\" Foreground=\"{DynamicResource FgColor}\" AutomationProperties.Name=\"Check or Uncheck all\"/>\n                    </StackPanel>\n\n                    <Border Grid.Row=\"2\" BorderBrush=\"{DynamicResource BorderColor}\" CornerRadius=\"4\" BorderThickness=\"1\" Margin=\"0,0,0,10\" Background=\"{DynamicResource CardBgColor}\">\n                        <Grid>\n                            <ScrollViewer VerticalScrollBarVisibility=\"Auto\">\n                                <StackPanel x:Name=\"AppsPanel\" Margin=\"5\"/>\n                            </ScrollViewer>\n                            <Border x:Name=\"LoadingAppsIndicator\" CornerRadius=\"4\" Background=\"{DynamicResource ScrollBarThumbColor}\" Opacity=\"0.8\" Visibility=\"Collapsed\">\n                                <TextBlock Text=\"Loading apps...\" FontSize=\"16\" FontWeight=\"SemiBold\" Foreground=\"{DynamicResource FgColor}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                            </Border>\n                        </Grid>\n                    </Border>\n\n                    <StackPanel Grid.Row=\"3\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\">\n                        <Grid Margin=\"0,8,10,10\">\n                            <CheckBox x:Name=\"OnlyInstalledBox\" Content=\"Only show installed apps\" Foreground=\"{DynamicResource FgColor}\" AutomationProperties.Name=\"Only show installed apps\"/>\n                        </Grid>\n                        <Button x:Name=\"ConfirmBtn\" Width=\"80\" Height=\"32\" Margin=\"0,0,10,0\" Content=\"Confirm\" Style=\"{DynamicResource PrimaryButtonStyle}\" AutomationProperties.Name=\"Confirm\"/>\n                        <Button x:Name=\"CancelBtn\" Width=\"80\" Height=\"32\" Content=\"Cancel\" Style=\"{DynamicResource SecondaryButtonStyle}\" IsCancel=\"True\" AutomationProperties.Name=\"Cancel\"/>\n                    </StackPanel>\n                </Grid>\n            </Grid>\n            \n            <!-- Modal Overlay for MessageBoxes -->\n            <Rectangle x:Name=\"ModalOverlay\" \n                       Grid.RowSpan=\"2\" \n                       Fill=\"#80000000\" \n                       Visibility=\"Collapsed\" \n                       Panel.ZIndex=\"1000\"\n                       RadiusX=\"8\"\n                       RadiusY=\"8\"\n                       Margin=\"-1\"/>\n        </Grid>\n    </Border>\n</Window>\n"
  },
  {
    "path": "Schemas/ApplyChangesWindow.xaml",
    "content": "<Window xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"Apply Changes\" \n        Width=\"500\"\n        SizeToContent=\"Height\"\n        ResizeMode=\"NoResize\"\n        WindowStartupLocation=\"CenterOwner\"\n        WindowStyle=\"None\"\n        AllowsTransparency=\"True\"\n        Background=\"Transparent\"\n        Topmost=\"True\"\n        ShowInTaskbar=\"False\">\n\n    <Border BorderBrush=\"{DynamicResource BorderColor}\" \n            BorderThickness=\"1\" \n            CornerRadius=\"8\"\n            Background=\"{DynamicResource CardBgColor}\"\n            Margin=\"25\">\n        <Border.Effect>\n            <DropShadowEffect Color=\"Black\" \n                            Opacity=\"0.15\" \n                            BlurRadius=\"20\" \n                            ShadowDepth=\"0\" \n                            Direction=\"0\"/>\n        </Border.Effect>\n        <Grid>\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"/>\n                <RowDefinition Height=\"*\"/>\n            </Grid.RowDefinitions>\n\n            <!-- Close/Cancel button (top right) -->\n            <Button x:Name=\"ApplyCancelBtn\" Grid.Row=\"0\"\n                    HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\"\n                    Width=\"36\" Height=\"32\"\n                    BorderThickness=\"0\"\n                    Cursor=\"Hand\"\n                    ToolTip=\"Cancel\"\n                    AutomationProperties.Name=\"Cancel\">\n                <Button.Template>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\" CornerRadius=\"0,8,0,0\">\n                            <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                        </Border>\n                    </ControlTemplate>\n                </Button.Template>\n                <Button.Style>\n                    <Style TargetType=\"Button\">\n                        <Setter Property=\"Background\" Value=\"Transparent\"/>\n                        <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n                        <Style.Triggers>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter Property=\"Background\" Value=\"{DynamicResource CloseHover}\"/>\n                            </Trigger>\n                        </Style.Triggers>\n                    </Style>\n                </Button.Style>\n                <TextBlock Text=\"&#xE8BB;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"10\"/>\n            </Button>\n\n            <StackPanel Grid.Row=\"0\" Grid.RowSpan=\"2\">\n            <!-- In-progress content -->\n            <StackPanel x:Name=\"ApplyInProgressPanel\">\n                <StackPanel Margin=\"32,24\">\n                    <!-- Loading icon (spinning) -->\n                    <TextBlock x:Name=\"ApplySpinnerIcon\"\n                            Text=\"&#xE895;\" \n                            FontFamily=\"Segoe Fluent Icons\" \n                            FontSize=\"36\" \n                            Foreground=\"{DynamicResource ButtonBg}\" \n                            HorizontalAlignment=\"Center\" \n                            Margin=\"0,0,0,16\"\n                            RenderTransformOrigin=\"0.5,0.5\">\n                        <TextBlock.RenderTransform>\n                            <RotateTransform x:Name=\"SpinnerRotation\" Angle=\"0\"/>\n                        </TextBlock.RenderTransform>\n                        <TextBlock.Triggers>\n                            <EventTrigger RoutedEvent=\"Loaded\">\n                                <BeginStoryboard>\n                                    <Storyboard>\n                                        <DoubleAnimation Storyboard.TargetName=\"SpinnerRotation\"\n                                                        Storyboard.TargetProperty=\"Angle\"\n                                                        From=\"0\" To=\"360\"\n                                                        Duration=\"0:0:1.5\"\n                                                        RepeatBehavior=\"Forever\"/>\n                                    </Storyboard>\n                                </BeginStoryboard>\n                            </EventTrigger>\n                        </TextBlock.Triggers>\n                    </TextBlock>\n                    \n                    <TextBlock Text=\"Applying Changes\" \n                            Style=\"{DynamicResource ModalTitleStyle}\"/>\n\n                    <!-- Current step name -->\n                    <TextBlock x:Name=\"ApplyStepName\" \n                                Text=\"Preparing...\" \n                                Style=\"{DynamicResource ModalSubtextStyle}\"\n                                TextTrimming=\"CharacterEllipsis\"\n                                MaxWidth=\"430\"/>\n                </StackPanel>\n                \n                <Border Background=\"{DynamicResource BgColor}\"\n                        BorderBrush=\"{DynamicResource BorderColor}\"\n                        BorderThickness=\"0,1,0,0\"\n                        Padding=\"16,12\"\n                        CornerRadius=\"0,0,8,8\">\n                    <StackPanel>\n                    \n                    <!-- Progress bar -->\n                    <ProgressBar x:Name=\"ApplyProgressBar\" \n                                    Style=\"{DynamicResource ApplyProgressBarStyle}\"\n                                    Minimum=\"0\" Maximum=\"100\" Value=\"0\" \n                                    Margin=\"0,2,0,8\"/>\n                    \n                    <!-- Step counter -->\n                    <TextBlock x:Name=\"ApplyStepCounter\" \n                            Text=\"Step 0 of 0\" \n                            FontSize=\"12\" \n                            Foreground=\"{DynamicResource FgColor}\" \n                            HorizontalAlignment=\"Right\" \n                            Opacity=\"0.8\"/>\n                    </StackPanel>\n                </Border>\n            </StackPanel>\n            \n            <!-- Completion content -->\n            <StackPanel x:Name=\"ApplyCompletionPanel\" Visibility=\"Collapsed\">\n                <StackPanel Margin=\"32,24\">\n                    <!-- Success icon -->\n                    <TextBlock x:Name=\"ApplyCompletionIcon\" \n                            Text=\"&#xE73E;\" \n                            FontFamily=\"Segoe Fluent Icons\" \n                            FontSize=\"40\"\n                            Foreground=\"{DynamicResource ButtonBg}\" \n                            HorizontalAlignment=\"Center\" \n                            Margin=\"0,0,0,12\"/>\n                    \n                    <TextBlock x:Name=\"ApplyCompletionTitle\" \n                            Text=\"Changes Applied\" \n                            Style=\"{DynamicResource ModalTitleStyle}\"/>\n                    \n                    <TextBlock x:Name=\"ApplyCompletionMessage\" \n                            Text=\"Please note that some changes will only take effect after a reboot. Thanks for using Win11Debloat!\"\n                            TextWrapping=\"Wrap\"\n                            Style=\"{DynamicResource ModalSubtextStyle}\"/>\n                </StackPanel>\n\n                <!-- Reboot required section -->\n                <Border x:Name=\"ApplyRebootPanel\"\n                        Visibility=\"Collapsed\"\n                        BorderBrush=\"{DynamicResource BorderColor}\"\n                        HorizontalAlignment=\"Center\"\n                        BorderThickness=\"0,1,0,1\"\n                        Padding=\"24,12,24,14\">\n                    <StackPanel>\n                        <StackPanel Orientation=\"Horizontal\" Margin=\"0,0,0,6\">\n                            <TextBlock Text=\"&#xE7BA;\"\n                                       FontFamily=\"Segoe Fluent Icons\"\n                                       FontSize=\"14\"\n                                       Foreground=\"#e8912d\"\n                                       VerticalAlignment=\"Center\"\n                                       Margin=\"0,0,8,0\"/>\n                            <TextBlock Text=\"A reboot is required for these changes to take effect:\"\n                                       FontSize=\"13\"\n                                       FontWeight=\"SemiBold\"\n                                       Foreground=\"{DynamicResource FgColor}\"\n                                       VerticalAlignment=\"Center\"/>\n                        </StackPanel>\n                        <StackPanel x:Name=\"ApplyRebootList\" Margin=\"22,0,0,0\"/>\n                    </StackPanel>\n                </Border>\n\n                <!-- Button Panel -->\n                <Border Background=\"{DynamicResource BgColor}\"\n                        BorderBrush=\"{DynamicResource BorderColor}\"\n                        BorderThickness=\"0,1,0,0\"\n                        Padding=\"16,12\"\n                        CornerRadius=\"0,0,8,8\">\n                    <StackPanel x:Name=\"ButtonPanel\"\n                                Orientation=\"Horizontal\"\n                                HorizontalAlignment=\"Center\">\n                        <Button x:Name=\"ApplyKofiBtn\" Width=\"210\" Height=\"32\" \n                                Style=\"{DynamicResource SecondaryButtonStyle}\" \n                                Margin=\"0,0,12,0\"\n                                AutomationProperties.Name=\"Support the creator\">\n                            <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\n                                <TextBlock Text=\"&#xEB52;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"14\" VerticalAlignment=\"Center\" Margin=\"0,0,8,-1\"/>\n                                <TextBlock Text=\"Support the creator\" VerticalAlignment=\"Center\" FontSize=\"14\" Margin=\"0,0,0,1\"/>\n                            </StackPanel>\n                        </Button>\n                        <Button x:Name=\"ApplyCloseBtn\" Width=\"100\" Height=\"32\" \n                                Style=\"{DynamicResource PrimaryButtonStyle}\"\n                                AutomationProperties.Name=\"Close\">\n                            <TextBlock Text=\"Close\" VerticalAlignment=\"Center\" FontSize=\"14\" Margin=\"0,0,0,1\"/>\n                        </Button>\n                    </StackPanel>\n                </Border>\n            </StackPanel>\n        </StackPanel>\n        </Grid>\n    </Border>\n</Window>\n"
  },
  {
    "path": "Schemas/BubbleHint.xaml",
    "content": "<Grid xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n      xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n      Name=\"BubblePanel\"\n      SnapsToDevicePixels=\"True\">\n    <Grid.RowDefinitions>\n        <RowDefinition Height=\"Auto\"/>\n        <RowDefinition Height=\"Auto\"/>\n    </Grid.RowDefinitions>\n\n    <Grid Grid.Row=\"0\"\n        Margin=\"10,10,10,8\">\n      <Border Name=\"BubbleBorder\"\n          Background=\"{DynamicResource CardBgColor}\"\n          BorderBrush=\"{DynamicResource ButtonBorderColor}\"\n          BorderThickness=\"1\"\n          CornerRadius=\"8\"\n          Padding=\"10,7,10,7\">\n        <Border.Effect>\n          <DropShadowEffect BlurRadius=\"9\"\n                    Opacity=\"0.16\"\n                    ShadowDepth=\"2\"\n                    Direction=\"270\"\n                    Color=\"Black\"/>\n        </Border.Effect>\n        <TextBlock Name=\"BubbleText\"\n               Text=\"View the selected changes here\"\n               TextWrapping=\"Wrap\"\n               MaxWidth=\"260\"\n               Foreground=\"{DynamicResource FgColor}\"/>\n      </Border>\n    </Grid>\n\n    <Grid Grid.Row=\"1\"\n          HorizontalAlignment=\"Center\"\n        Margin=\"0,-9,0,0\"\n        Panel.ZIndex=\"1\"\n          Width=\"12\"\n          Height=\"8\">\n        <Polygon Name=\"BubblePointer\"\n                 Points=\"0,0 12,0 6,7\"\n                 Fill=\"{DynamicResource CardBgColor}\"\n                 Stroke=\"{DynamicResource ButtonBorderColor}\"\n                 StrokeThickness=\"1\"\n                 Stretch=\"Fill\"/>\n\n        <Rectangle VerticalAlignment=\"Top\"\n                   Height=\"2\"\n                   Margin=\"1,-1,1,0\"\n                   Fill=\"{DynamicResource CardBgColor}\"/>\n    </Grid>\n</Grid>\n"
  },
  {
    "path": "Schemas/MainWindow.xaml",
    "content": "<Window xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"Win11Debloat\" \n        MinWidth=\"1130\" MinHeight=\"600\"\n        MaxWidth=\"1400\"\n        ResizeMode=\"CanResize\" \n        SnapsToDevicePixels=\"True\"\n        WindowStartupLocation=\"CenterScreen\"\n        WindowStyle=\"None\"\n        AllowsTransparency=\"True\"\n        Background=\"Transparent\"\n        Foreground=\"{DynamicResource FgColor}\">\n    <Window.Resources>\n        <!-- Sort column header hover style -->\n        <Style x:Key=\"SortHeaderBtnStyle\" TargetType=\"StackPanel\">\n            <Setter Property=\"Opacity\" Value=\"1.0\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Opacity\" Value=\"0.75\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n        <!-- ComboBox Style -->\n        <Style TargetType=\"ComboBox\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource ComboBgColor}\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"Margin\" Value=\"0,4,0,12\"/>\n            <Setter Property=\"MinHeight\" Value=\"33\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"ComboBox\">\n                        <Grid>\n                            <!-- Left accent line -->\n                            <Border x:Name=\"ClosedAccentLine\" Width=\"3\" Height=\"18\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Stretch\" Background=\"{DynamicResource ButtonBg}\" CornerRadius=\"1.5\" Panel.ZIndex=\"2\"/>\n                            <ToggleButton x:Name=\"ToggleButton\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" Focusable=\"False\" IsChecked=\"{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}\" ClickMode=\"Press\">\n                                <ToggleButton.Style>\n                                    <Style TargetType=\"ToggleButton\">\n                                        <Setter Property=\"Template\">\n                                            <Setter.Value>\n                                                <ControlTemplate TargetType=\"ToggleButton\">\n                                                    <Border x:Name=\"Border\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"4\">\n                                                        <TextBlock x:Name=\"Arrow\"\n                                                                Text=\"&#xE70D;\"\n                                                                FontFamily=\"Segoe Fluent Icons\"\n                                                                FontSize=\"10\"\n                                                                HorizontalAlignment=\"Right\"\n                                                                VerticalAlignment=\"Center\"\n                                                                Margin=\"0,0,8,0\"\n                                                                Foreground=\"{DynamicResource FgColor}\"\n                                                                RenderTransformOrigin=\"0.5,0.5\">\n                                                            <TextBlock.RenderTransform>\n                                                                <RotateTransform x:Name=\"ArrowRotation\" Angle=\"0\"/>\n                                                            </TextBlock.RenderTransform>\n                                                        </TextBlock>\n                                                    </Border>\n                                                    <ControlTemplate.Triggers>\n                                                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                                            <Setter TargetName=\"Border\" Property=\"Background\" Value=\"{DynamicResource ComboHoverColor}\"/>\n                                                        </Trigger>\n                                                        <Trigger Property=\"IsChecked\" Value=\"True\">\n                                                            <Trigger.EnterActions>\n                                                                <BeginStoryboard>\n                                                                    <Storyboard>\n                                                                        <DoubleAnimation Storyboard.TargetName=\"Arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(RotateTransform.Angle)\" To=\"180\" Duration=\"0:0:0.2\">\n                                                                            <DoubleAnimation.EasingFunction>\n                                                                                <CubicEase EasingMode=\"EaseOut\"/>\n                                                                            </DoubleAnimation.EasingFunction>\n                                                                        </DoubleAnimation>\n                                                                    </Storyboard>\n                                                                </BeginStoryboard>\n                                                            </Trigger.EnterActions>\n                                                            <Trigger.ExitActions>\n                                                                <BeginStoryboard>\n                                                                    <Storyboard>\n                                                                        <DoubleAnimation Storyboard.TargetName=\"Arrow\" Storyboard.TargetProperty=\"(UIElement.RenderTransform).(RotateTransform.Angle)\" To=\"0\" Duration=\"0:0:0.2\">\n                                                                            <DoubleAnimation.EasingFunction>\n                                                                                <CubicEase EasingMode=\"EaseOut\"/>\n                                                                            </DoubleAnimation.EasingFunction>\n                                                                        </DoubleAnimation>\n                                                                    </Storyboard>\n                                                                </BeginStoryboard>\n                                                            </Trigger.ExitActions>\n                                                        </Trigger>\n                                                    </ControlTemplate.Triggers>\n                                                </ControlTemplate>\n                                            </Setter.Value>\n                                        </Setter>\n                                    </Style>\n                                </ToggleButton.Style>\n                            </ToggleButton>\n                            <ContentPresenter x:Name=\"ContentPresenter\"\n                                            IsHitTestVisible=\"False\"\n                                            Margin=\"10,0,20,0\"\n                                            HorizontalAlignment=\"Left\"\n                                            VerticalAlignment=\"Center\"\n                                            Content=\"{TemplateBinding SelectionBoxItem}\"\n                                            ContentTemplate=\"{TemplateBinding SelectionBoxItemTemplate}\"\n                                            ContentTemplateSelector=\"{TemplateBinding ItemTemplateSelector}\"/>\n                            <Popup x:Name=\"Popup\"\n                                Placement=\"Bottom\"\n                                IsOpen=\"{TemplateBinding IsDropDownOpen}\"\n                                AllowsTransparency=\"True\"\n                                Focusable=\"False\"\n                                PopupAnimation=\"Fade\"\n                                StaysOpen=\"False\"\n                                PlacementTarget=\"{Binding ElementName=ToggleButton}\"\n                                VerticalOffset=\"1\"\n                                HorizontalOffset=\"0\">\n                                <Grid x:Name=\"DropDown\" MinWidth=\"{TemplateBinding ActualWidth}\" MaxHeight=\"{TemplateBinding MaxDropDownHeight}\" Margin=\"12\">\n                                    <Border x:Name=\"DropDownBorder\"\n                                            Background=\"{DynamicResource ComboItemBgColor}\"\n                                            BorderBrush=\"{DynamicResource BorderColor}\"\n                                            BorderThickness=\"1\"\n                                            CornerRadius=\"4\"\n                                            Padding=\"5,4,5,1\">\n                                        <Border.Effect>\n                                            <DropShadowEffect BlurRadius=\"12\" Opacity=\"0.25\" ShadowDepth=\"4\"/>\n                                        </Border.Effect>\n                                        <ScrollViewer Margin=\"0,2,0,0\"\n                                                    VerticalScrollBarVisibility=\"Auto\"\n                                                    HorizontalScrollBarVisibility=\"Disabled\">\n                                            <ItemsPresenter Margin=\"0,0,0,1\"/>\n                                        </ScrollViewer>\n                                    </Border>\n                                </Grid>\n                            </Popup>\n                        </Grid>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"SelectedIndex\" Value=\"0\">\n                                <Setter TargetName=\"ClosedAccentLine\" Property=\"Visibility\" Value=\"Collapsed\"/>\n                            </Trigger>\n                            <Trigger Property=\"SelectedIndex\" Value=\"-1\">\n                                <Setter TargetName=\"ClosedAccentLine\" Property=\"Visibility\" Value=\"Collapsed\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                                <Setter TargetName=\"ClosedAccentLine\" Property=\"Visibility\" Value=\"Collapsed\"/>\n                                <Setter Property=\"Background\" Value=\"{DynamicResource ButtonDisabled}\"/>\n                                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n                                <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonTextDisabled}\"/>\n                                <Setter Property=\"Opacity\" Value=\"0.6\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <!-- ComboBoxItem Style -->\n        <Style TargetType=\"ComboBoxItem\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Padding\" Value=\"10,8\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,0,4\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"ComboBoxItem\">\n                        <Grid>\n                            <Border x:Name=\"ItemBorder\"\n                                    Background=\"{TemplateBinding Background}\"\n                                    BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\"\n                                    Padding=\"{TemplateBinding Padding}\"\n                                    CornerRadius=\"4\">\n                                <ContentPresenter HorizontalAlignment=\"{TemplateBinding HorizontalContentAlignment}\"\n                                                VerticalAlignment=\"{TemplateBinding VerticalContentAlignment}\"/>\n                            </Border>\n                            <!-- Left accent line -->\n                            <Border x:Name=\"AccentLine\"\n                                    Width=\"3\"\n                                    Height=\"15\"\n                                    HorizontalAlignment=\"Left\"\n                                    VerticalAlignment=\"Stretch\"\n                                    Background=\"{DynamicResource ButtonBg}\"\n                                    CornerRadius=\"1.5\"\n                                    Margin=\"0\"\n                                    Visibility=\"Collapsed\"/>\n                        </Grid>\n                        <ControlTemplate.Triggers> \n                            <Trigger Property=\"IsSelected\" Value=\"True\">\n                                <Setter TargetName=\"AccentLine\" Property=\"Visibility\" Value=\"Visible\"/>\n                                <Setter TargetName=\"ItemBorder\" Property=\"Background\" Value=\"{DynamicResource ComboItemSelectedColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsHighlighted\" Value=\"True\">\n                                <Setter TargetName=\"ItemBorder\" Property=\"Background\" Value=\"{DynamicResource ComboItemHoverColor}\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <!-- TextBlock Label Style -->\n        <Style x:Key=\"LabelStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"FontSize\" Value=\"12\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,0,2\"/>\n        </Style>\n\n        <!-- Label Border Style for ComboBox labels -->\n        <Style x:Key=\"LabelBorderStyle\" TargetType=\"Border\">\n            <Setter Property=\"CornerRadius\" Value=\"4\"/>\n            <Setter Property=\"Padding\" Value=\"6,2\"/>\n            <Setter Property=\"Margin\" Value=\"-4,-2,-4,0\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"HorizontalAlignment\" Value=\"Stretch\"/>\n        </Style>\n\n        <!-- Category card border style -->\n        <Style x:Key=\"CategoryCardBorderStyle\" TargetType=\"Border\">\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"CornerRadius\" Value=\"4\"/>\n            <Setter Property=\"Background\" Value=\"{DynamicResource CardBgColor}\"/>\n            <Setter Property=\"Padding\" Value=\"16,12,16,2\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,0,16\"/>\n        </Style>\n\n        <!-- Category header text style -->\n        <Style x:Key=\"CategoryHeaderTextBlock\" TargetType=\"TextBlock\">\n            <Setter Property=\"FontWeight\" Value=\"Bold\"/>\n            <Setter Property=\"FontSize\" Value=\"16\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,0,13\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n        </Style>\n\n        <!-- Category header icon style -->\n        <Style x:Key=\"CategoryHeaderIcon\" TargetType=\"TextBlock\">\n            <Setter Property=\"FontFamily\" Value=\"Segoe Fluent Icons\"/>\n            <Setter Property=\"FontSize\" Value=\"19\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,8,12\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        </Style>\n\n        <!-- Category help link button/text styles -->\n        <Style x:Key=\"CategoryHelpLinkButtonStyle\" TargetType=\"Button\">\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"BorderBrush\" Value=\"Transparent\"/>\n            <Setter Property=\"BorderThickness\" Value=\"0\"/>\n            <Setter Property=\"Padding\" Value=\"0\"/>\n            <Setter Property=\"Margin\" Value=\"6,1,0,13\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"Focusable\" Value=\"False\"/>\n            <Setter Property=\"IsTabStop\" Value=\"False\"/>\n            <Setter Property=\"Cursor\" Value=\"Hand\"/>\n            <Setter Property=\"FocusVisualStyle\" Value=\"{x:Null}\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonBg}\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Border Background=\"Transparent\" BorderBrush=\"Transparent\" BorderThickness=\"0\">\n                            <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonHover}\"/>\n                </Trigger>\n                <Trigger Property=\"IsPressed\" Value=\"True\">\n                    <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonPressed}\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n\n        <Style x:Key=\"CategoryHelpLinkTextStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"FontSize\" Value=\"12\"/>\n            <Setter Property=\"FontWeight\" Value=\"Bold\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"Foreground\">\n                <Setter.Value>\n                    <Binding RelativeSource=\"{RelativeSource AncestorType=Button}\" Path=\"Foreground\"/>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <!-- Overview changes text style -->\n        <Style x:Key=\"OverviewNoChangesTextStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,0,8\"/>\n            <Setter Property=\"FontSize\" Value=\"12\"/>\n            <Setter Property=\"FontStyle\" Value=\"Italic\"/>\n        </Style>\n\n        <Style x:Key=\"OverviewChangeBulletStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Margin\" Value=\"0,0,0,8\"/>\n            <Setter Property=\"FontSize\" Value=\"12\"/>\n            <Setter Property=\"TextWrapping\" Value=\"Wrap\"/>\n        </Style>\n\n        <!-- TextBox Style for search -->\n        <Style TargetType=\"TextBox\">\n            <Setter Property=\"CaretBrush\" Value=\"{DynamicResource FgColor}\"/>\n        </Style>\n\n        <!-- User TextBox Style with disabled state -->\n        <Style x:Key=\"UserTextBoxStyle\" TargetType=\"TextBox\">\n            <Setter Property=\"CaretBrush\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"0\"/>\n            <Setter Property=\"FontSize\" Value=\"13\"/>\n            <Setter Property=\"Margin\" Value=\"1,0,0,1\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"Padding\" Value=\"0\"/>\n            <Style.Triggers>\n                <Trigger Property=\"IsEnabled\" Value=\"False\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource ButtonDisabled}\"/>\n                    <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonTextDisabled}\"/>\n                    <Setter Property=\"Opacity\" Value=\"0.6\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n\n        <!-- User TextBox Border Style with disabled state -->\n        <Style x:Key=\"UserTextBoxBorderStyle\" TargetType=\"Border\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource ComboBgColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"CornerRadius\" Value=\"4\"/>\n            <Setter Property=\"Padding\" Value=\"8,6\"/>\n            <Style.Triggers>\n                <Trigger Property=\"IsEnabled\" Value=\"False\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource ButtonDisabled}\"/>\n                    <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n                    <Setter Property=\"Opacity\" Value=\"0.6\"/>\n                </Trigger>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource ComboHoverColor}\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n\n        <!-- CheckBox Style -->\n        <Style TargetType=\"CheckBox\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Padding\" Value=\"4,2\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"CheckBox\">\n                        <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\" CornerRadius=\"4\" Padding=\"{TemplateBinding Padding}\">\n                            <Grid>\n                                <Grid.ColumnDefinitions>\n                                    <ColumnDefinition Width=\"Auto\"/>\n                                    <ColumnDefinition Width=\"*\"/>\n                                </Grid.ColumnDefinitions>\n                                <Border x:Name=\"CheckBoxBorder\" Grid.Column=\"0\" Width=\"18\" Height=\"18\" Background=\"{DynamicResource CheckBoxBgColor}\" BorderBrush=\"{DynamicResource CheckBoxBorderColor}\" BorderThickness=\"1\" CornerRadius=\"4\" Margin=\"0,0,8,0\">\n                                    <Grid>\n                                        <TextBlock x:Name=\"CheckMark\" Text=\"&#xE73E;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"12\" Foreground=\"{DynamicResource ButtonBg}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Visibility=\"Collapsed\"/>\n                                        <TextBlock x:Name=\"IndeterminateMark\" Text=\"&#xE738;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"11\" Foreground=\"{DynamicResource ButtonBg}\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Visibility=\"Collapsed\" Margin=\"1,1,0,0\" />\n                                    </Grid>\n                                </Border>\n                                <ContentPresenter Grid.Column=\"1\" VerticalAlignment=\"Center\" Margin=\"0,0,0,2\"/>\n                            </Grid>\n                        </Border>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource CheckBoxHoverColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsChecked\" Value=\"True\">\n                                <Setter TargetName=\"CheckMark\" Property=\"Visibility\" Value=\"Visible\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBg}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBg}\"/>\n                                <Setter TargetName=\"CheckMark\" Property=\"Foreground\" Value=\"White\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsChecked\" Value=\"{x:Null}\">\n                                <Setter TargetName=\"IndeterminateMark\" Property=\"Visibility\" Value=\"Visible\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonBg}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBg}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Opacity\" Value=\"0.8\"/>\n                                <Setter TargetName=\"IndeterminateMark\" Property=\"Foreground\" Value=\"White\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonDisabled}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n                                <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonTextDisabled}\"/>\n                                <Setter Property=\"Opacity\" Value=\"0.6\"/>\n                                <Setter TargetName=\"CheckMark\" Property=\"Foreground\" Value=\"{DynamicResource ButtonTextDisabled}\"/>\n                            </Trigger>\n                            <MultiTrigger>\n                                <MultiTrigger.Conditions>\n                                    <Condition Property=\"IsMouseOver\" Value=\"True\"/>\n                                    <Condition Property=\"IsChecked\" Value=\"True\"/>\n                                </MultiTrigger.Conditions>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonHover}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource ButtonHover}\"/>\n                            </MultiTrigger>\n                            <MultiTrigger>\n                                <MultiTrigger.Conditions>\n                                    <Condition Property=\"IsMouseOver\" Value=\"True\"/>\n                                    <Condition Property=\"IsChecked\" Value=\"{x:Null}\"/>\n                                </MultiTrigger.Conditions>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Background\" Value=\"{DynamicResource ButtonHover}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"BorderBrush\" Value=\"{DynamicResource ButtonHover}\"/>\n                                <Setter TargetName=\"CheckBoxBorder\" Property=\"Opacity\" Value=\"0.8\"/>\n                            </MultiTrigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <!-- CheckBox style for feature toggles -->\n        <Style x:Key=\"FeatureCheckboxStyle\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\n            <Setter Property=\"Margin\" Value=\"-4,-2,-4,10\"/>\n            <Setter Property=\"Padding\" Value=\"4,2\"/>\n        </Style>\n\n        <!-- CheckBox style for apps panels -->\n        <Style x:Key=\"AppsPanelCheckBoxStyle\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\n            <Setter Property=\"Margin\" Value=\"2,3,2,3\"/>\n            <Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\"/>\n            <Setter Property=\"VerticalContentAlignment\" Value=\"Center\"/>\n        </Style>\n\n        <!-- TextBlock style for App ID column in apps table -->\n        <Style x:Key=\"AppIdTextStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource AppIdColor}\"/>\n            <Setter Property=\"TextTrimming\" Value=\"CharacterEllipsis\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        </Style>\n\n        <!-- TextBlock style for App Name column in apps table -->\n        <Style x:Key=\"AppNameTextStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"TextTrimming\" Value=\"CharacterEllipsis\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        </Style>\n\n        <!-- TextBlock style for Description column in apps table -->\n        <Style x:Key=\"AppDescTextStyle\" TargetType=\"TextBlock\">\n            <Setter Property=\"TextTrimming\" Value=\"CharacterEllipsis\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n            <Setter Property=\"Margin\" Value=\"8,0,8,0\"/>\n        </Style>\n\n        <!-- Column widths for the app table rows and header (dot | name | description | id) -->\n        <GridLength x:Key=\"AppTableDotColWidth\">16</GridLength>\n        <GridLength x:Key=\"AppTableNameColWidth\">151</GridLength>\n        <GridLength x:Key=\"AppTableDescColWidth\">1*</GridLength>\n        <GridLength x:Key=\"AppTableIdColWidth\">261</GridLength>\n\n        <!-- Recommendation dot shape style for app table rows -->\n        <Style x:Key=\"AppRecommendationDotStyle\" TargetType=\"Ellipse\">\n            <Setter Property=\"Width\" Value=\"9\"/>\n            <Setter Property=\"Height\" Value=\"9\"/>\n            <Setter Property=\"HorizontalAlignment\" Value=\"Left\"/>\n            <Setter Property=\"VerticalAlignment\" Value=\"Center\"/>\n        </Style>\n\n        <!-- Container style for each dynamically-created app table row -->\n        <Style x:Key=\"AppTableRowStyle\" TargetType=\"Grid\">\n            <Setter Property=\"Margin\" Value=\"0,1,0,0\"/>\n        </Style>\n\n        <!-- Style for dynamically-created preset checkboxes in the Quick Select popup -->\n        <Style x:Key=\"PresetCheckBoxStyle\" TargetType=\"CheckBox\" BasedOn=\"{StaticResource {x:Type CheckBox}}\">\n            <Setter Property=\"Margin\" Value=\"8,4\"/>\n        </Style>\n\n        <!-- Progress step indicator fill colors -->\n        <SolidColorBrush x:Key=\"ProgressActiveColor\" Color=\"#0067c0\"/>\n        <SolidColorBrush x:Key=\"ProgressInactiveColor\" Color=\"#808080\"/>\n\n        <!-- Validation feedback colors for username input -->\n        <SolidColorBrush x:Key=\"ValidationErrorColor\" Color=\"#c42b1c\"/>\n        <SolidColorBrush x:Key=\"ValidationSuccessColor\" Color=\"#28a745\"/>\n\n        <!-- Title Bar Button Style -->\n        <Style x:Key=\"TitleBarButton\" TargetType=\"Button\">\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"0\"/>\n            <Setter Property=\"Width\" Value=\"46\"/>\n            <Setter Property=\"Height\" Value=\"32\"/>\n            <Setter Property=\"FontFamily\" Value=\"Segoe Fluent Icons\"/>\n            <Setter Property=\"FontSize\" Value=\"10\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\" CornerRadius=\"0,8,0,0\">\n                            <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n        <Style x:Key=\"CloseButton\" TargetType=\"Button\" BasedOn=\"{StaticResource TitleBarButton}\">\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource CloseHover}\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n        <Style x:Key=\"TitlebarButton\" TargetType=\"Button\" BasedOn=\"{StaticResource TitleBarButton}\">\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"Button\">\n                        <Border Background=\"{TemplateBinding Background}\" BorderThickness=\"0\" CornerRadius=\"0\">\n                            <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource TitlebarButtonHover}\"/>\n                </Trigger>\n                <Trigger Property=\"IsPressed\" Value=\"True\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource TitlebarButtonPressed}\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n\n        <!-- SearchBox Border Style -->\n        <Style x:Key=\"SearchBoxBorderStyle\" TargetType=\"Border\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource ComboBgColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"CornerRadius\" Value=\"4\"/>\n            <Setter Property=\"Width\" Value=\"300\"/>\n            <Setter Property=\"Padding\" Value=\"8,6\"/>\n            <Style.Triggers>\n                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                    <Setter Property=\"Background\" Value=\"{DynamicResource ComboHoverColor}\"/>\n                </Trigger>\n            </Style.Triggers>\n        </Style>\n\n        <!-- ContextMenu Style -->\n        <Style TargetType=\"ContextMenu\">\n            <Setter Property=\"Background\" Value=\"{DynamicResource CardBgColor}\"/>\n            <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n            <Setter Property=\"BorderThickness\" Value=\"1\"/>\n            <Setter Property=\"Padding\" Value=\"4\"/>\n            <Setter Property=\"HasDropShadow\" Value=\"True\"/>\n            <Setter Property=\"HorizontalOffset\" Value=\"-12\"/>\n            <Setter Property=\"VerticalOffset\" Value=\"-12\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"ContextMenu\">\n                        <Border Margin=\"12\">\n                            <Border Background=\"{TemplateBinding Background}\"\n                                    BorderBrush=\"{TemplateBinding BorderBrush}\"\n                                    BorderThickness=\"{TemplateBinding BorderThickness}\"\n                                    CornerRadius=\"4\"\n                                    Padding=\"{TemplateBinding Padding}\">\n                                <Border.Effect>\n                                    <DropShadowEffect BlurRadius=\"12\" Opacity=\"0.25\" ShadowDepth=\"4\"/>\n                                </Border.Effect>\n                                <StackPanel IsItemsHost=\"True\"/>\n                            </Border>\n                        </Border>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n\n        <!-- MenuItem Style -->\n        <Style TargetType=\"MenuItem\">\n            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n            <Setter Property=\"Background\" Value=\"Transparent\"/>\n            <Setter Property=\"Padding\" Value=\"8,6\"/>\n            <Setter Property=\"Height\" Value=\"32\"/>\n            <Setter Property=\"Template\">\n                <Setter.Value>\n                    <ControlTemplate TargetType=\"MenuItem\">\n                        <Border Background=\"{TemplateBinding Background}\"\n                                BorderThickness=\"0\"\n                                CornerRadius=\"4\"\n                                Padding=\"{TemplateBinding Padding}\">\n                            <Grid>\n                                <Grid.ColumnDefinitions>\n                                    <ColumnDefinition Width=\"24\"/>\n                                    <ColumnDefinition Width=\"*\"/>\n                                </Grid.ColumnDefinitions>\n                                <ContentPresenter Grid.Column=\"0\" ContentSource=\"Icon\" \n                                                VerticalAlignment=\"Center\"\n                                                HorizontalAlignment=\"Center\"/>\n                                <ContentPresenter Grid.Column=\"1\" ContentSource=\"Header\" \n                                                VerticalAlignment=\"Center\"\n                                                Margin=\"8,0,0,1\"/>\n                            </Grid>\n                        </Border>\n                        <ControlTemplate.Triggers>\n                            <Trigger Property=\"IsHighlighted\" Value=\"True\">\n                                <Setter Property=\"Background\" Value=\"{DynamicResource ComboItemHoverColor}\"/>\n                            </Trigger>\n                            <Trigger Property=\"IsPressed\" Value=\"True\">\n                                <Setter Property=\"Background\" Value=\"{DynamicResource ComboItemSelectedColor}\"/>\n                            </Trigger>\n                        </ControlTemplate.Triggers>\n                    </ControlTemplate>\n                </Setter.Value>\n            </Setter>\n        </Style>\n    </Window.Resources>\n\n    <Border BorderBrush=\"{DynamicResource BorderColor}\" \n            BorderThickness=\"1\" \n            CornerRadius=\"8\" \n            Background=\"{DynamicResource BgColor}\"\n            Margin=\"25\">\n        <Border.Effect>\n            <DropShadowEffect Color=\"Black\" \n                            Opacity=\"0.15\" \n                            BlurRadius=\"20\" \n                            ShadowDepth=\"0\" \n                            Direction=\"0\"/>\n        </Border.Effect>\n        <Grid>\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"32\"/>\n                <RowDefinition Height=\"*\"/>\n                <RowDefinition Height=\"Auto\"/>\n            </Grid.RowDefinitions>\n\n            <!-- Resize Borders -->\n            <Rectangle x:Name=\"ResizeLeft\" Width=\"5\" HorizontalAlignment=\"Left\" Fill=\"Transparent\" Cursor=\"SizeWE\" Grid.Row=\"0\" Grid.RowSpan=\"3\" Panel.ZIndex=\"100\"/>\n            <Rectangle x:Name=\"ResizeRight\" Width=\"5\" HorizontalAlignment=\"Right\" Fill=\"Transparent\" Cursor=\"SizeWE\" Grid.Row=\"0\" Grid.RowSpan=\"3\" Panel.ZIndex=\"100\"/>\n            <Rectangle x:Name=\"ResizeTop\" Height=\"5\" VerticalAlignment=\"Top\" Fill=\"Transparent\" Cursor=\"SizeNS\" Grid.Row=\"0\" Panel.ZIndex=\"100\"/>\n            <Rectangle x:Name=\"ResizeBottom\" Height=\"5\" VerticalAlignment=\"Bottom\" Fill=\"Transparent\" Cursor=\"SizeNS\" Grid.Row=\"2\" Panel.ZIndex=\"100\"/>\n            <Rectangle x:Name=\"ResizeTopLeft\" Width=\"8\" Height=\"8\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Top\" Fill=\"Transparent\" Cursor=\"SizeNWSE\" Grid.Row=\"0\" Panel.ZIndex=\"101\"/>\n            <Rectangle x:Name=\"ResizeTopRight\" Width=\"8\" Height=\"8\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Top\" Fill=\"Transparent\" Cursor=\"SizeNESW\" Grid.Row=\"0\" Panel.ZIndex=\"101\"/>\n            <Rectangle x:Name=\"ResizeBottomLeft\" Width=\"8\" Height=\"8\" HorizontalAlignment=\"Left\" VerticalAlignment=\"Bottom\" Fill=\"Transparent\" Cursor=\"SizeNESW\" Grid.Row=\"2\" Panel.ZIndex=\"101\"/>\n            <Rectangle x:Name=\"ResizeBottomRight\" Width=\"8\" Height=\"8\" HorizontalAlignment=\"Right\" VerticalAlignment=\"Bottom\" Fill=\"Transparent\" Cursor=\"SizeNWSE\" Grid.Row=\"2\" Panel.ZIndex=\"101\"/>\n\n            <!-- Custom Title Bar -->\n            <Grid Grid.Row=\"0\" x:Name=\"TitleBar\">\n                <Border Background=\"{DynamicResource BgColor}\" CornerRadius=\"8,8,0,0\">\n                    <Grid>\n                        <Grid.ColumnDefinitions>\n                            <ColumnDefinition Width=\"*\"/>\n                            <ColumnDefinition Width=\"Auto\"/>\n                        </Grid.ColumnDefinitions>\n                        <TextBlock Grid.Column=\"0\" \n                                   Text=\"Win11Debloat\" \n                                   Foreground=\"{DynamicResource FgColor}\"\n                                   VerticalAlignment=\"Center\" \n                                   Margin=\"12,0,0,0\"\n                                   FontSize=\"12\"/>\n                        <StackPanel Grid.Column=\"1\" Orientation=\"Horizontal\">\n                            <Button x:Name=\"KofiBtn\" Content=\"&#xEB52;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"15\" Style=\"{StaticResource TitlebarButton}\" ToolTip=\"Support the creator\" AutomationProperties.Name=\"Support the creator\"/>\n                            <Button x:Name=\"MenuBtn\" Content=\"&#xE700;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"15\" Style=\"{StaticResource TitlebarButton}\" ToolTip=\"Options\" AutomationProperties.Name=\"Options\">\n                                <Button.ContextMenu>\n                                    <ContextMenu x:Name=\"MainMenu\">\n                                        <MenuItem x:Name=\"MenuDocumentation\" Header=\"Documentation\" AutomationProperties.Name=\"Documentation\">\n                                            <MenuItem.Icon>\n                                                <TextBlock Text=\"&#xe736;\" FontFamily=\"Segoe MDL2 Assets\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            </MenuItem.Icon>\n                                        </MenuItem>\n                                        <MenuItem x:Name=\"MenuReportBug\" Header=\"Report a bug\" AutomationProperties.Name=\"Report a bug\">\n                                            <MenuItem.Icon>\n                                                <TextBlock Text=\"&#xEBE8;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            </MenuItem.Icon>\n                                        </MenuItem>\n                                        <MenuItem x:Name=\"MenuLogs\" Header=\"Logs\" AutomationProperties.Name=\"Logs\">\n                                            <MenuItem.Icon>\n                                                <TextBlock Text=\"&#xf000;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            </MenuItem.Icon>\n                                        </MenuItem>\n                                        <MenuItem x:Name=\"MenuAbout\" Header=\"About\" AutomationProperties.Name=\"About\">\n                                            <MenuItem.Icon>\n                                                <TextBlock Text=\"&#xE946;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            </MenuItem.Icon>\n                                        </MenuItem>\n                                    </ContextMenu>\n                                </Button.ContextMenu>\n                            </Button>\n                            <Button x:Name=\"CloseBtn\" Content=\"&#xE8BB;\" Style=\"{StaticResource CloseButton}\" ToolTip=\"Close\" AutomationProperties.Name=\"Close\"/>\n                        </StackPanel>\n                    </Grid>\n                </Border>\n            </Grid>\n\n            <!-- Main Content with Tabs -->\n            <TabControl Grid.Row=\"1\" Background=\"Transparent\" BorderThickness=\"0\" Margin=\"0\" Padding=\"0\" Name=\"MainTabControl\">\n                <TabControl.Resources>\n                    <Style TargetType=\"TabItem\">\n                        <Setter Property=\"Template\">\n                            <Setter.Value>\n                                <ControlTemplate TargetType=\"TabItem\">\n                                    <Border Name=\"Border\" Background=\"{DynamicResource SecondaryButtonBg}\" BorderThickness=\"0\" CornerRadius=\"0\" Padding=\"10,10\" Margin=\"0\">\n                                        <ContentPresenter ContentSource=\"Header\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                                    </Border>\n                                    <ControlTemplate.Triggers>\n                                        <Trigger Property=\"IsSelected\" Value=\"True\">\n                                            <Setter TargetName=\"Border\" Property=\"Background\" Value=\"{DynamicResource ButtonBg}\"/>\n                                            <Setter Property=\"Foreground\" Value=\"White\"/>\n                                        </Trigger>\n                                        <Trigger Property=\"IsSelected\" Value=\"False\">\n                                            <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n                                        </Trigger>\n                                    </ControlTemplate.Triggers>\n                                </ControlTemplate>\n                            </Setter.Value>\n                        </Setter>\n                    </Style>\n                </TabControl.Resources>\n                <TabControl.ItemContainerStyle>\n                    <Style TargetType=\"TabItem\">\n                        <Setter Property=\"Visibility\" Value=\"Collapsed\"/>\n                    </Style>\n                </TabControl.ItemContainerStyle>\n\n                <!-- Home Tab -->\n                <TabItem Header=\"Home\" x:Name=\"HomeTab\">\n                    <Grid>\n                        <StackPanel HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Width=\"600\">\n                            <!-- Logo -->\n                            <Viewbox Width=\"220\" Height=\"220\" Margin=\"0,32,0,10\" HorizontalAlignment=\"Center\">\n                                <Grid Width=\"220\" Height=\"220\">\n                                    <!-- Windows logo style icon -->\n                                    <Path x:Name=\"LogoFallback\" Data=\"M0,0 L80,0 L80,80 L0,80 Z M90,0 L170,0 L170,80 L90,80 Z M0,90 L80,90 L80,170 L0,170 Z M90,90 L170,90 L170,170 L90,170 Z\" \n                                        Fill=\"{DynamicResource ButtonBg}\" Stretch=\"Uniform\" Margin=\"10\"/>\n                                    <!-- Sparkle effects -->\n                                    <Canvas HorizontalAlignment=\"Right\" VerticalAlignment=\"Bottom\" Width=\"45\" Height=\"45\" Margin=\"0,0,2,2\">\n                                        <Path Canvas.Left=\"10\" Canvas.Top=\"16\" Data=\"M12,0 L14,10 L24,12 L14,14 L12,24 L10,14 L0,12 L10,10 Z\" \n                                              Fill=\"{DynamicResource AccentColor}\" Width=\"38\" Height=\"38\" Stretch=\"Uniform\"/>\n                                        <Path Canvas.Left=\"0\" Canvas.Top=\"0\" Data=\"M6,0 L7,5 L12,6 L7,7 L6,12 L5,7 L0,6 L5,5 Z\" \n                                              Fill=\"{DynamicResource AccentColor}\" Width=\"20\" Height=\"20\" Stretch=\"Uniform\"/>\n                                        <Path Canvas.Left=\"35\" Canvas.Top=\"8\" Data=\"M4,0 L5,3 L8,4 L5,5 L4,8 L3,5 L0,4 L3,3 Z\" \n                                              Fill=\"{DynamicResource AccentColor}\" Width=\"15\" Height=\"15\" Stretch=\"Uniform\"/>\n                                    </Canvas>\n                                    <!-- Actual logo image if available -->\n                                    <Image x:Name=\"LogoImage\" Stretch=\"Uniform\"/>\n                                </Grid>\n                            </Viewbox>\n                            \n                            <!-- Title -->\n                            <TextBlock Text=\"Welcome to Win11Debloat\" FontSize=\"28\" FontWeight=\"Bold\" Foreground=\"{DynamicResource FgColor}\" HorizontalAlignment=\"Center\" Margin=\"0,0,0,10\"/>\n                            <TextBlock TextWrapping=\"Wrap\" Foreground=\"{DynamicResource FgColor}\" FontSize=\"16\" LineHeight=\"22\" HorizontalAlignment=\"Center\" Margin=\"0,0,0,30\">\n                                <Run Text=\"Your clean Windows experience is just a few clicks away!\"/>\n                            </TextBlock>\n                            \n                            <!-- Action Buttons -->\n                            <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\" Margin=\"0,20,0,0\">\n                                <Button x:Name=\"HomeDefaultModeBtn\" Width=\"180\" Height=\"50\" Style=\"{DynamicResource PrimaryButtonStyle}\" Margin=\"0,0,12,0\" AutomationProperties.Name=\"Default Mode\">\n                                    <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\n                                        <TextBlock Text=\"&#xe735;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"16\" VerticalAlignment=\"Center\" Margin=\"0,0,8,0\"/>\n                                        <TextBlock Text=\"Default Mode\" ToolTip=\"Quickly select the recommended settings\" FontWeight=\"SemiBold\" VerticalAlignment=\"Center\" FontSize=\"17\" Margin=\"0,0,0,2\"/>\n                                    </StackPanel>\n                                </Button>\n                                <Button x:Name=\"HomeStartBtn\" Width=\"180\" Height=\"50\" Style=\"{DynamicResource SecondaryButtonStyle}\" AutomationProperties.Name=\"Custom Setup\">\n                                    <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\n                                        <TextBlock Text=\"&#xe90f;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"14\" VerticalAlignment=\"Center\" Margin=\"0,0,8,0\"/>\n                                        <TextBlock Text=\"Custom Setup\" ToolTip=\"Manually select your preferred settings\" FontWeight=\"SemiBold\" VerticalAlignment=\"Center\" FontSize=\"17\" Margin=\"0,0,0,2\"/>\n                                    </StackPanel>\n                                </Button>\n                            </StackPanel>\n                        </StackPanel>\n                    </Grid>\n                </TabItem>\n\n                <!-- App Removal Tab -->\n                <TabItem Header=\"App Removal\">\n                    <DockPanel>\n                        <Border DockPanel.Dock=\"Top\" Padding=\"20,10,20,0\">\n                            <StackPanel>\n                                <TextBlock Text=\"App Removal\" FontWeight=\"Bold\" FontSize=\"20\" Margin=\"0,0,0,5\" Foreground=\"{DynamicResource FgColor}\"/>\n                                <TextBlock Text=\"Select which apps you want to remove from your system\" FontSize=\"13\" Margin=\"0,0,0,20\" Foreground=\"{DynamicResource FgColor}\" TextWrapping=\"Wrap\"/>\n\n                                <!-- Filter Options -->\n                                <Grid Margin=\"0,0,0,12\">\n                                    <Grid.ColumnDefinitions>\n                                        <ColumnDefinition Width=\"Auto\"/>\n                                        <ColumnDefinition Width=\"*\"/>\n                                        <ColumnDefinition Width=\"Auto\"/>\n                                        <ColumnDefinition Width=\"10\"/>\n                                        <ColumnDefinition Width=\"Auto\"/>\n                                    </Grid.ColumnDefinitions>\n                                    \n                                    <StackPanel Orientation=\"Horizontal\" Grid.Column=\"0\">\n                                        <ToggleButton x:Name=\"PresetsBtn\" ToolTip=\"Select or clear app presets\" Height=\"32\" Padding=\"10,0\" Margin=\"0,0,10,0\" AutomationProperties.Name=\"App Presets\">\n                                            <ToggleButton.Style>\n                                                <Style TargetType=\"ToggleButton\">\n                                                    <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonBg}\"/>\n                                                    <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n                                                    <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n                                                    <Setter Property=\"BorderThickness\" Value=\"1\"/>\n                                                    <Setter Property=\"FontSize\" Value=\"14\"/>\n                                                    <Setter Property=\"Cursor\" Value=\"Hand\"/>\n                                                    <Setter Property=\"Template\">\n                                                        <Setter.Value>\n                                                            <ControlTemplate TargetType=\"ToggleButton\">\n                                                                <Border x:Name=\"Border\" Background=\"{TemplateBinding Background}\" BorderBrush=\"{TemplateBinding BorderBrush}\" BorderThickness=\"{TemplateBinding BorderThickness}\" CornerRadius=\"4\" Padding=\"{TemplateBinding Padding}\">\n                                                                    <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Margin=\"0,0,0,1\"/>\n                                                                </Border>\n                                                            </ControlTemplate>\n                                                        </Setter.Value>\n                                                    </Setter>\n                                                    <Style.Triggers>\n                                                        <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                                            <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonHover}\"/>\n                                                        </Trigger>\n                                                        <Trigger Property=\"IsPressed\" Value=\"True\">\n                                                            <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonPressed}\"/>\n                                                        </Trigger>\n                                                        <Trigger Property=\"IsChecked\" Value=\"True\">\n                                                            <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonHover}\"/>\n                                                        </Trigger>\n                                                    </Style.Triggers>\n                                                </Style>\n                                            </ToggleButton.Style>\n                                            <StackPanel Orientation=\"Horizontal\">\n                                                <TextBlock Text=\"Quick Select\" FontSize=\"13\" VerticalAlignment=\"Center\" Margin=\"0,0,6,0\"/>\n                                                <TextBlock x:Name=\"PresetsArrow\" Text=\"&#xE70D;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"10\" VerticalAlignment=\"Center\" RenderTransformOrigin=\"0.5,0.5\">\n                                                    <TextBlock.RenderTransform>\n                                                        <RotateTransform x:Name=\"PresetsArrowRotation\" Angle=\"0\"/>\n                                                    </TextBlock.RenderTransform>\n                                                </TextBlock>\n                                            </StackPanel>\n                                        </ToggleButton>\n                                        <Button x:Name=\"ClearAppSelectionBtn\" Content=\"Clear Selection\" ToolTip=\"Clear all selected apps\" Style=\"{DynamicResource SecondaryButtonStyle}\" Height=\"32\"  Padding=\"10,0\" Margin=\"0,0,10,0\" AutomationProperties.Name=\"Clear Selection\"/>\n                                        <Popup x:Name=\"PresetsPopup\" PlacementTarget=\"{Binding ElementName=PresetsBtn}\" Placement=\"Bottom\" StaysOpen=\"True\" AllowsTransparency=\"True\" VerticalOffset=\"2\">\n                                            <Border Background=\"{DynamicResource CardBgColor}\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1\" CornerRadius=\"6\" Padding=\"4,6\" Margin=\"12\">\n                                                <Border.Effect>\n                                                    <DropShadowEffect BlurRadius=\"12\" Opacity=\"0.25\" ShadowDepth=\"4\"/>\n                                                </Border.Effect>\n                                                <StackPanel x:Name=\"PresetsPanel\" MinWidth=\"220\">\n                                                    <CheckBox x:Name=\"PresetDefaultApps\" Content=\"Default selection\" IsThreeState=\"True\" Foreground=\"{DynamicResource FgColor}\" Margin=\"8,4\" AutomationProperties.Name=\"Default selection\"/>\n                                                    <CheckBox x:Name=\"PresetLastUsed\" Content=\"Last used selection\" IsThreeState=\"True\" Foreground=\"{DynamicResource FgColor}\" Margin=\"8,4\" AutomationProperties.Name=\"Last used selection\"/>\n                                                    <Separator Margin=\"4,6\" Background=\"{DynamicResource BorderColor}\"/>\n                                                    <StackPanel x:Name=\"JsonPresetsPanel\"/>\n                                                </StackPanel>\n                                            </Border>\n                                        </Popup>\n                                    </StackPanel>\n                                    \n                                    <CheckBox x:Name=\"OnlyInstalledAppsBox\" Grid.Column=\"2\" Content=\"Only show installed apps\" IsChecked=\"False\" Foreground=\"{DynamicResource FgColor}\" VerticalAlignment=\"Center\" AutomationProperties.Name=\"Only show installed apps\"/>\n\n                                    <Border x:Name=\"AppSearchBorder\" Grid.Column=\"4\">\n                                        <Border.Style>\n                                            <Style TargetType=\"Border\" BasedOn=\"{StaticResource SearchBoxBorderStyle}\">\n                                                <Style.Triggers>\n                                                    <DataTrigger Binding=\"{Binding ElementName=AppSearchBox, Path=IsFocused}\" Value=\"True\">\n                                                        <Setter Property=\"Background\" Value=\"{DynamicResource InputFocusColor}\"/>\n                                                    </DataTrigger>\n                                                </Style.Triggers>\n                                            </Style>\n                                        </Border.Style>\n                                        <Grid>\n                                            <Grid.ColumnDefinitions>\n                                                <ColumnDefinition Width=\"Auto\"/>\n                                                <ColumnDefinition Width=\"*\"/>\n                                            </Grid.ColumnDefinitions>\n                                            <TextBlock Grid.Column=\"0\" Text=\"&#xE721;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"14\" VerticalAlignment=\"Center\" Margin=\"4,0,8,0\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            <TextBlock x:Name=\"AppSearchPlaceholder\" Grid.Column=\"1\" Text=\"Search app\" Foreground=\"{DynamicResource FgColor}\" Opacity=\"0.5\" FontSize=\"13\" Margin=\"3,0,0,1\" VerticalAlignment=\"Center\" IsHitTestVisible=\"False\"/>\n                                            <TextBox x:Name=\"AppSearchBox\" Grid.Column=\"1\" Background=\"Transparent\" Foreground=\"{DynamicResource FgColor}\" BorderThickness=\"0\" FontSize=\"13\" Margin=\"1,0,0,1\" VerticalAlignment=\"Center\" Text=\"\" AutomationProperties.Name=\"Search app\"/>\n                                        </Grid>\n                                    </Border>\n                                </Grid>\n                            </StackPanel>\n                        </Border>\n                        <Grid>\n                            <Grid.RowDefinitions>\n                                <RowDefinition Height=\"*\"/>\n                                <RowDefinition Height=\"Auto\"/>\n                            </Grid.RowDefinitions>\n                            \n                            <!-- Apps List -->\n                            <Grid Grid.Row=\"0\" Margin=\"20,0,20,10\">\n                                <Grid.RowDefinitions>\n                                    <RowDefinition Height=\"Auto\"/>\n                                    <RowDefinition Height=\"*\"/>\n                                </Grid.RowDefinitions>\n                                <!-- Column Headers -->\n                                <Border Grid.Row=\"0\" Background=\"{DynamicResource TableHeaderColor}\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1,1,1,0\" CornerRadius=\"4,4,0,0\">\n                                    <Grid Margin=\"42,6,23,8\">\n                                        <Grid.ColumnDefinitions>\n                                            <ColumnDefinition Width=\"{StaticResource AppTableDotColWidth}\"/>\n                                            <ColumnDefinition Width=\"{StaticResource AppTableNameColWidth}\"/>\n                                            <ColumnDefinition Width=\"{StaticResource AppTableDescColWidth}\"/>\n                                            <ColumnDefinition Width=\"{StaticResource AppTableIdColWidth}\"/>\n                                        </Grid.ColumnDefinitions>\n                                        <StackPanel x:Name=\"HeaderNameBtn\" Grid.Column=\"1\" Orientation=\"Horizontal\" Cursor=\"Hand\" VerticalAlignment=\"Center\" Style=\"{StaticResource SortHeaderBtnStyle}\">\n                                            <TextBlock Text=\"Name\" FontWeight=\"SemiBold\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            <TextBlock x:Name=\"SortArrowName\" Text=\"&#xE70E;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"11\" Foreground=\"{DynamicResource FgColor}\" VerticalAlignment=\"Center\" Margin=\"5,1,0,0\" Opacity=\"0.3\" RenderTransformOrigin=\"0.5,0.5\">\n                                                <TextBlock.RenderTransform><RotateTransform Angle=\"0\"/></TextBlock.RenderTransform>\n                                            </TextBlock>\n                                        </StackPanel>\n                                        <StackPanel x:Name=\"HeaderDescriptionBtn\" Grid.Column=\"2\" Orientation=\"Horizontal\" Cursor=\"Hand\" VerticalAlignment=\"Center\" Margin=\"8,0,0,0\" Style=\"{StaticResource SortHeaderBtnStyle}\">\n                                            <TextBlock Text=\"Description\" FontWeight=\"SemiBold\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            <TextBlock x:Name=\"SortArrowDescription\" Text=\"&#xE70E;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"11\" Foreground=\"{DynamicResource FgColor}\" VerticalAlignment=\"Center\" Margin=\"5,1,0,0\" Opacity=\"0.3\" RenderTransformOrigin=\"0.5,0.5\">\n                                                <TextBlock.RenderTransform><RotateTransform Angle=\"0\"/></TextBlock.RenderTransform>\n                                            </TextBlock>\n                                        </StackPanel>\n                                        <StackPanel x:Name=\"HeaderAppIdBtn\" Grid.Column=\"3\" Orientation=\"Horizontal\" Cursor=\"Hand\" VerticalAlignment=\"Center\" Style=\"{StaticResource SortHeaderBtnStyle}\">\n                                            <TextBlock Text=\"App ID\" FontWeight=\"SemiBold\" FontSize=\"16\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            <TextBlock x:Name=\"SortArrowAppId\" Text=\"&#xE70E;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"11\" Foreground=\"{DynamicResource FgColor}\" VerticalAlignment=\"Center\" Margin=\"5,1,0,0\" Opacity=\"0.3\" RenderTransformOrigin=\"0.5,0.5\">\n                                                <TextBlock.RenderTransform><RotateTransform Angle=\"0\"/></TextBlock.RenderTransform>\n                                            </TextBlock>\n                                        </StackPanel>\n                                    </Grid>\n                                </Border>\n                                <!-- Apps content -->\n                                <Border Grid.Row=\"1\" BorderBrush=\"{DynamicResource BorderColor}\" CornerRadius=\"0,0,4,4\" BorderThickness=\"1\" Background=\"{DynamicResource CardBgColor}\" Padding=\"0,1,1,1\">\n                                    <Grid>\n                                        <ScrollViewer VerticalScrollBarVisibility=\"Visible\">\n                                            <StackPanel x:Name=\"AppSelectionPanel\" Margin=\"10,4,0,4\"/>\n                                        </ScrollViewer>\n                                        <Border x:Name=\"LoadingAppsIndicator\" CornerRadius=\"0,0,4,4\" Background=\"{DynamicResource CardBgColor}\" Opacity=\"0.8\" Visibility=\"Collapsed\">\n                                            <StackPanel HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\n                                                <TextBlock Text=\"&#xF16A;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"28\" Foreground=\"{DynamicResource FgColor}\" HorizontalAlignment=\"Center\" Margin=\"0,0,0,8\" RenderTransformOrigin=\"0.5,0.5\">\n                                                    <TextBlock.RenderTransform>\n                                                        <RotateTransform Angle=\"0\"/>\n                                                    </TextBlock.RenderTransform>\n                                                    <TextBlock.Triggers>\n                                                        <EventTrigger RoutedEvent=\"Loaded\">\n                                                            <BeginStoryboard>\n                                                                <Storyboard>\n                                                                    <DoubleAnimation Storyboard.TargetProperty=\"(UIElement.RenderTransform).(RotateTransform.Angle)\"\n                                                                                     From=\"0\" To=\"360\"\n                                                                                     Duration=\"0:0:1.5\"\n                                                                                     RepeatBehavior=\"Forever\"/>\n                                                                </Storyboard>\n                                                            </BeginStoryboard>\n                                                        </EventTrigger>\n                                                    </TextBlock.Triggers>\n                                                </TextBlock>\n                                                <TextBlock Text=\"Loading apps...\" FontSize=\"16\" FontWeight=\"SemiBold\" Foreground=\"{DynamicResource FgColor}\" HorizontalAlignment=\"Center\"/>\n                                            </StackPanel>\n                                        </Border>\n                                    </Grid>\n                                </Border>\n                            </Grid>\n\n                            <!-- Status Info -->\n                            <StackPanel Grid.Row=\"1\" Orientation=\"Horizontal\" Margin=\"20,0,20,0\">\n                                <TextBlock x:Name=\"AppSelectionStatus\" Text=\"\" Foreground=\"{DynamicResource FgColor}\" Margin=\"10,0,0,5\" HorizontalAlignment=\"Left\"/>\n                            </StackPanel>\n                        </Grid>\n                    </DockPanel>\n                </TabItem>\n\n                <!-- Tweaks Tab -->\n                <TabItem Header=\"Tweaks\">\n                    <DockPanel>\n                        <Border DockPanel.Dock=\"Top\" Padding=\"20,10,20,0\" Background=\"{DynamicResource BgColor}\">\n                            <StackPanel>\n                                <TextBlock Text=\"System Tweaks\" FontWeight=\"Bold\" FontSize=\"20\" Margin=\"0,0,0,5\" Foreground=\"{DynamicResource FgColor}\"/>\n                                <TextBlock Text=\"Select which tweaks you want to apply to your system, hover over settings for more information\" FontSize=\"13\" Margin=\"0,0,0,20\" Foreground=\"{DynamicResource FgColor}\" TextWrapping=\"Wrap\"/>\n                            \n                                <!-- Filter Options -->\n                                <Grid Margin=\"0,0,0,12\">\n                                    <Grid.ColumnDefinitions>\n                                        <ColumnDefinition Width=\"Auto\"/>\n                                        <ColumnDefinition Width=\"*\"/>\n                                        <ColumnDefinition Width=\"Auto\"/>\n                                    </Grid.ColumnDefinitions>\n                                    \n                                    <StackPanel Grid.Column=\"0\" Orientation=\"Horizontal\">\n                                        <Button x:Name=\"LoadDefaultsBtn\" Content=\"Select Default Settings\" ToolTip=\"Select the settings that are recommended for most people\" Style=\"{DynamicResource SecondaryButtonStyle}\" Padding=\"10,0\" Height=\"32\" Margin=\"0,0,10,0\" AutomationProperties.Name=\"Select Default Settings\"/>\n                                        <Button x:Name=\"LoadLastUsedBtn\" Content=\"Select Last Used Settings\" ToolTip=\"Select the settings that were used the last time Win11Debloat was run\" Style=\"{DynamicResource SecondaryButtonStyle}\" Padding=\"10,0\" Height=\"32\" Margin=\"0,0,10,0\" AutomationProperties.Name=\"Select Last Used Settings\"/>\n                                        <Button x:Name=\"ClearAllTweaksBtn\" Content=\"Clear Selection\" ToolTip=\"Clear all selected tweaks\" Style=\"{DynamicResource SecondaryButtonStyle}\" Padding=\"10,0\" Height=\"32\" Margin=\"0,0,10,0\" AutomationProperties.Name=\"Clear Selection\"/>\n                                    </StackPanel>\n\n                                    <Border x:Name=\"TweakSearchBorder\" Grid.Column=\"2\">\n                                        <Border.Style>\n                                            <Style TargetType=\"Border\" BasedOn=\"{StaticResource SearchBoxBorderStyle}\">\n                                                <Style.Triggers>\n                                                    <DataTrigger Binding=\"{Binding ElementName=TweakSearchBox, Path=IsFocused}\" Value=\"True\">\n                                                        <Setter Property=\"Background\" Value=\"{DynamicResource InputFocusColor}\"/>\n                                                    </DataTrigger>\n                                                </Style.Triggers>\n                                            </Style>\n                                        </Border.Style>\n                                        <Grid>\n                                            <Grid.ColumnDefinitions>\n                                                <ColumnDefinition Width=\"Auto\"/>\n                                                <ColumnDefinition Width=\"*\"/>\n                                            </Grid.ColumnDefinitions>\n                                            <TextBlock Grid.Column=\"0\" Text=\"&#xE721;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"14\" VerticalAlignment=\"Center\" Margin=\"4,0,8,0\" Foreground=\"{DynamicResource FgColor}\"/>\n                                            <TextBlock x:Name=\"TweakSearchPlaceholder\" Grid.Column=\"1\" Text=\"Search setting\" Foreground=\"{DynamicResource FgColor}\" Opacity=\"0.5\" FontSize=\"13\" Margin=\"3,0,0,1\" VerticalAlignment=\"Center\" IsHitTestVisible=\"False\"/>\n                                            <TextBox x:Name=\"TweakSearchBox\" Grid.Column=\"1\" Background=\"Transparent\" Foreground=\"{DynamicResource FgColor}\" BorderThickness=\"0\" FontSize=\"13\" Margin=\"1,0,0,1\" VerticalAlignment=\"Center\" Text=\"\"/>\n                                        </Grid>\n                                    </Border>\n                                </Grid>\n                            </StackPanel>\n                        </Border>\n                        <Grid>\n                            <ScrollViewer x:Name=\"TweaksScrollViewer\" VerticalScrollBarVisibility=\"Auto\" Margin=\"0,-20,0,0\" Padding=\"20,10,20,0\">\n                                <Grid x:Name=\"TweaksGrid\" Margin=\"0,10,0,5\">\n                                    <Grid.ColumnDefinitions>\n                                        <ColumnDefinition Width=\"*\"/>\n                                        <ColumnDefinition Width=\"*\"/>\n                                        <ColumnDefinition Width=\"*\"/>\n                                    </Grid.ColumnDefinitions>\n\n                                    <!-- Column 1: Dynamically populated -->\n                                    <StackPanel Grid.Column=\"0\" x:Name=\"Column0Panel\" Margin=\"0,0,15,0\"/>\n\n                                    <!-- Column 2: Dynamically populated -->\n                                    <StackPanel Grid.Column=\"1\" x:Name=\"Column1Panel\" Margin=\"0,0,15,0\"/>\n\n                                    <!-- Column 3: Dynamically populated -->\n                                    <StackPanel Grid.Column=\"2\" x:Name=\"Column2Panel\"/>\n                                </Grid>\n                            </ScrollViewer>\n                            <!-- Top fade gradient -->\n                            <Border IsHitTestVisible=\"False\" VerticalAlignment=\"Top\" Height=\"10\" Margin=\"0,-12,20,0\" Background=\"{DynamicResource BgColor}\">\n                                <Border.OpacityMask>\n                                    <LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">\n                                        <GradientStop Color=\"Black\" Offset=\"0\"/>\n                                        <GradientStop Color=\"Black\" Offset=\"0.5\"/>\n                                        <GradientStop Color=\"Transparent\" Offset=\"1\"/>\n                                    </LinearGradientBrush>\n                                </Border.OpacityMask>\n                            </Border>\n                            <!-- Bottom fade gradient -->\n                            <Border IsHitTestVisible=\"False\" VerticalAlignment=\"Bottom\" Height=\"20\" Margin=\"0,0,20,0\" Background=\"{DynamicResource BgColor}\">\n                                <Border.OpacityMask>\n                                    <LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">\n                                        <GradientStop Color=\"Transparent\" Offset=\"0\"/>\n                                        <GradientStop Color=\"Black\" Offset=\"1\"/>\n                                    </LinearGradientBrush>\n                                </Border.OpacityMask>\n                            </Border>\n                        </Grid>\n                    </DockPanel>\n                </TabItem>\n\n                <!-- Deployment Settings Tab -->\n                <TabItem Header=\"Deployment Settings\" x:Name=\"DeploymentSettingsTab\">\n                    <DockPanel>\n                        <Border DockPanel.Dock=\"Top\" Padding=\"20,10,20,0\">\n                            <StackPanel>\n                                <TextBlock Text=\"Deployment Settings\" FontWeight=\"Bold\" FontSize=\"20\" Margin=\"0,0,0,5\" Foreground=\"{DynamicResource FgColor}\"/>\n                                <TextBlock Text=\"Configure how your changes will be applied and more\" FontSize=\"13\" Margin=\"0,0,0,20\" Foreground=\"{DynamicResource FgColor}\" TextWrapping=\"Wrap\"/>\n                            </StackPanel>\n                        </Border>\n\n                        <Grid>\n                            <Grid.RowDefinitions>\n                                <RowDefinition Height=\"*\"/>\n                                <RowDefinition Height=\"Auto\"/>\n                            </Grid.RowDefinitions>\n\n                            <Grid Grid.Row=\"0\">\n                                <ScrollViewer VerticalScrollBarVisibility=\"Auto\" Margin=\"0,-20,0,0\" Padding=\"20,10,20,0\">\n                                    <Grid Margin=\"0,10,0,5\">\n                                        <Grid.RowDefinitions>\n                                            <RowDefinition Height=\"Auto\"/>\n                                            <RowDefinition Height=\"Auto\"/>\n                                            <RowDefinition Height=\"Auto\"/>\n                                        </Grid.RowDefinitions>\n\n                                        <!-- Apply Changes To -->\n                                        <Border Grid.Row=\"0\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1\" CornerRadius=\"4\" Background=\"{DynamicResource CardBgColor}\" Padding=\"16,12\" Margin=\"0,0,0,16\">\n                                            <StackPanel>\n                                                <TextBlock Text=\"Apply Changes To\" Style=\"{StaticResource CategoryHeaderTextBlock}\"/>\n                                                <ComboBox x:Name=\"UserSelectionCombo\" Margin=\"0,0,0,6\" AutomationProperties.Name=\"Apply Changes To\">\n                                                    <ComboBoxItem Content=\"Current User\" IsSelected=\"True\"/>\n                                                    <ComboBoxItem Content=\"Other User\"/>\n                                                    <ComboBoxItem Content=\"Windows Default User (Sysprep)\"/>\n                                                </ComboBox>\n                                                <StackPanel x:Name=\"OtherUserPanel\" Visibility=\"Collapsed\" Margin=\"0,0,0,6\">\n                                                    <TextBlock x:Name=\"UsernameValidationMessage\" Text=\"\" FontStyle=\"Italic\" Foreground=\"{DynamicResource CloseHover}\" FontSize=\"11\" Margin=\"3,0,0,4\" TextWrapping=\"Wrap\"/>\n                                                    <Border IsEnabled=\"{Binding ElementName=OtherUsernameTextBox, Path=IsEnabled}\">\n                                                        <Border.Style>\n                                                            <Style TargetType=\"Border\" BasedOn=\"{StaticResource UserTextBoxBorderStyle}\">\n                                                                <Style.Triggers>\n                                                                    <DataTrigger Binding=\"{Binding ElementName=OtherUsernameTextBox, Path=IsFocused}\" Value=\"True\">\n                                                                        <Setter Property=\"Background\" Value=\"{DynamicResource InputFocusColor}\"/>\n                                                                    </DataTrigger>\n                                                                </Style.Triggers>\n                                                            </Style>\n                                                        </Border.Style>\n                                                        <Grid>\n                                                            <Grid.ColumnDefinitions>\n                                                                <ColumnDefinition Width=\"Auto\"/>\n                                                                <ColumnDefinition Width=\"*\"/>\n                                                            </Grid.ColumnDefinitions>\n                                                            <TextBlock Grid.Column=\"0\" Text=\"&#xE77B;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"14\" VerticalAlignment=\"Center\" Margin=\"4,0,8,0\" Foreground=\"{DynamicResource FgColor}\"/>\n                                                            <TextBlock x:Name=\"UsernameTextBoxPlaceholder\" Grid.Column=\"1\" Text=\"Enter username\" Foreground=\"{DynamicResource FgColor}\" Opacity=\"0.5\" FontSize=\"13\" Margin=\"3,0,0,1\" VerticalAlignment=\"Center\" IsHitTestVisible=\"False\"/>\n                                                            <TextBox x:Name=\"OtherUsernameTextBox\" Grid.Column=\"1\" Style=\"{StaticResource UserTextBoxStyle}\" Text=\"\" AutomationProperties.Name=\"Enter username\"/>\n                                                        </Grid>\n                                                    </Border>\n                                                </StackPanel>\n                                                <TextBlock x:Name=\"UserSelectionDescription\" Text=\"Changes will be applied to the currently logged-in user profile.\" Foreground=\"{DynamicResource FgColor}\" FontSize=\"12\" TextWrapping=\"Wrap\" Margin=\"0,6,0,3\"/>\n                                            </StackPanel>\n                                        </Border>\n\n                                        <!-- App Removal Scope -->\n                                        <Border Grid.Row=\"1\" x:Name=\"AppRemovalScopeSection\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1\" CornerRadius=\"4\" Background=\"{DynamicResource CardBgColor}\" Padding=\"16,12\" Margin=\"0,0,0,16\">\n                                            <StackPanel>\n                                                <TextBlock Text=\"Remove Apps For\" Style=\"{StaticResource CategoryHeaderTextBlock}\"/>\n                                                <ComboBox x:Name=\"AppRemovalScopeCombo\" Margin=\"0,0,0,6\" AutomationProperties.Name=\"App Removal Scope\">\n                                                    <ComboBoxItem x:Name=\"AppRemovalScopeAllUsers\" Content=\"All users\" IsSelected=\"True\"/>\n                                                    <ComboBoxItem x:Name=\"AppRemovalScopeCurrentUser\" Content=\"Current user only\"/>\n                                                    <ComboBoxItem x:Name=\"AppRemovalScopeTargetUser\" Content=\"Target user only\" Visibility=\"Collapsed\"/>\n                                                </ComboBox>\n                                                <TextBlock x:Name=\"AppRemovalScopeDescription\" Text=\"Apps will be removed for all users and from the Windows image to prevent reinstallation for new users.\" Foreground=\"{DynamicResource FgColor}\" FontSize=\"12\" TextWrapping=\"Wrap\" Margin=\"0,6,0,3\"/>\n                                            </StackPanel>\n                                        </Border>\n\n                                        <!-- Options -->\n                                        <Border Grid.Row=\"2\" BorderBrush=\"{DynamicResource BorderColor}\" BorderThickness=\"1\" CornerRadius=\"4\" Background=\"{DynamicResource CardBgColor}\" Padding=\"16,12,16,3\" Margin=\"0,0,0,16\">\n                                            <StackPanel>\n                                                <TextBlock Text=\"Options\" Style=\"{StaticResource CategoryHeaderTextBlock}\"/>\n\n                                                <!-- Restore Point Option -->\n                                                <StackPanel>\n                                                    <CheckBox x:Name=\"RestorePointCheckBox\" Style=\"{StaticResource FeatureCheckboxStyle}\" IsChecked=\"True\" Content=\"Create a system restore point (Recommended)\" AutomationProperties.Name=\"Create a system restore point (Recommended)\"/>\n                                                </StackPanel>\n                                                \n                                                <!-- Restart Explorer Option -->\n                                                <StackPanel>\n                                                    <CheckBox x:Name=\"RestartExplorerCheckBox\" Style=\"{StaticResource FeatureCheckboxStyle}\" Content=\"Restart the Windows Explorer process to apply all changes immediately\" AutomationProperties.Name=\"Restart the Windows Explorer process to apply all changes immediately\"/>\n                                                </StackPanel>\n                                            </StackPanel>\n                                        </Border>\n                                    </Grid>\n                                </ScrollViewer>\n                                <!-- Top fade gradient -->\n                                <Border IsHitTestVisible=\"False\" VerticalAlignment=\"Top\" Height=\"10\" Margin=\"0,-12,20,0\" Background=\"{DynamicResource BgColor}\">\n                                    <Border.OpacityMask>\n                                        <LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">\n                                            <GradientStop Color=\"Black\" Offset=\"0\"/>\n                                            <GradientStop Color=\"Black\" Offset=\"0.5\"/>\n                                            <GradientStop Color=\"Transparent\" Offset=\"1\"/>\n                                        </LinearGradientBrush>\n                                    </Border.OpacityMask>\n                                </Border>\n                                <!-- Bottom fade gradient -->\n                                <Border IsHitTestVisible=\"False\" VerticalAlignment=\"Bottom\" Height=\"20\" Margin=\"0,0,20,0\" Background=\"{DynamicResource BgColor}\">\n                                    <Border.OpacityMask>\n                                        <LinearGradientBrush StartPoint=\"0,0\" EndPoint=\"0,1\">\n                                            <GradientStop Color=\"Transparent\" Offset=\"0\"/>\n                                            <GradientStop Color=\"Black\" Offset=\"1\"/>\n                                        </LinearGradientBrush>\n                                    </Border.OpacityMask>\n                                </Border>\n                            </Grid>\n\n                            <!-- Review & Apply Section -->\n                            <StackPanel Grid.Row=\"1\" HorizontalAlignment=\"Stretch\" Background=\"{DynamicResource BgColor}\">\n                                <Button x:Name=\"ReviewChangesBtn\" Background=\"Transparent\" BorderThickness=\"0\" Cursor=\"Hand\" HorizontalAlignment=\"Center\" Margin=\"0,4,0,10\" AutomationProperties.Name=\"Review selected changes\">\n                                    <Button.Template>\n                                        <ControlTemplate TargetType=\"Button\">\n                                            <TextBlock x:Name=\"LinkText\" Text=\"Review selected changes\" FontSize=\"14\" Foreground=\"{DynamicResource ButtonBg}\" FontWeight=\"SemiBold\" HorizontalAlignment=\"Center\"/>\n                                            <ControlTemplate.Triggers>\n                                                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                                    <Setter TargetName=\"LinkText\" Property=\"Foreground\" Value=\"{DynamicResource ButtonHover}\"/>\n                                                </Trigger>\n                                                <Trigger Property=\"IsPressed\" Value=\"True\">\n                                                    <Setter TargetName=\"LinkText\" Property=\"Foreground\" Value=\"{DynamicResource ButtonPressed}\"/>\n                                                </Trigger>\n                                            </ControlTemplate.Triggers>\n                                        </ControlTemplate>\n                                    </Button.Template>\n                                </Button>\n                                <Button x:Name=\"DeploymentApplyBtn\" Style=\"{DynamicResource PrimaryButtonStyle}\" Width=\"190\" Height=\"44\" HorizontalAlignment=\"Center\" AutomationProperties.Name=\"Apply Changes\">\n                                    <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\n                                        <TextBlock Text=\"&#xE73E;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"20\" FontWeight=\"SemiBold\" VerticalAlignment=\"Center\"/>\n                                        <TextBlock Text=\"Apply Changes\" VerticalAlignment=\"Center\" FontSize=\"18\" FontWeight=\"SemiBold\" Margin=\"8,0,0,4\"/>\n                                    </StackPanel>\n                                </Button>\n                            </StackPanel>\n                        </Grid>\n                    </DockPanel>\n                </TabItem>\n            </TabControl>\n\n            <!-- Bottom Navigation Buttons -->\n            <Grid Grid.Row=\"2\" Height=\"56\" x:Name=\"BottomNavGrid\">\n                <Grid Margin=\"20,0\">\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width=\"Auto\"/>\n                        <ColumnDefinition Width=\"*\"/>\n                        <ColumnDefinition Width=\"Auto\"/>\n                    </Grid.ColumnDefinitions>\n                    <Button x:Name=\"PreviousBtn\" Grid.Column=\"0\" Width=\"120\" Height=\"36\" Style=\"{DynamicResource SecondaryButtonStyle}\" Visibility=\"Collapsed\" Margin=\"10,0,0,0\" AutomationProperties.Name=\"Back\">\n                        <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\n                            <TextBlock Text=\"&#xE72B;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"12\" Margin=\"0,0,8,0\" VerticalAlignment=\"Center\"/>\n                            <TextBlock Text=\"Back\" VerticalAlignment=\"Center\" FontSize=\"14\" Margin=\"0,0,0,1\"/>\n                        </StackPanel>\n                    </Button>\n                    \n                    <StackPanel Grid.Column=\"2\" Orientation=\"Horizontal\" HorizontalAlignment=\"Right\">\n                        <Button x:Name=\"NextBtn\" Width=\"120\" Height=\"36\" Margin=\"0,0,10,0\" Style=\"{DynamicResource PrimaryButtonStyle}\" AutomationProperties.Name=\"Next\">\n                            <StackPanel Orientation=\"Horizontal\" VerticalAlignment=\"Center\">\n                                <TextBlock Text=\"Next\" VerticalAlignment=\"Center\" FontSize=\"14\" Margin=\"0,0,0,1\"/>\n                                <TextBlock Text=\"&#xE72A;\" FontFamily=\"Segoe Fluent Icons\" FontSize=\"12\" Margin=\"8,0,0,0\" VerticalAlignment=\"Center\"/>\n                            </StackPanel>\n                        </Button>\n                    </StackPanel>\n                </Grid>\n                \n                <!-- Progress Indicators - Centered independently -->\n                <StackPanel Orientation=\"Horizontal\" HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\">\n                    <Ellipse x:Name=\"ProgressIndicator1\" Width=\"10\" Height=\"10\" Margin=\"4,0\" Fill=\"#808080\" ToolTip=\"App Removal\"/>\n                    <Ellipse x:Name=\"ProgressIndicator2\" Width=\"10\" Height=\"10\" Margin=\"4,0\" Fill=\"#808080\" ToolTip=\"System Tweaks\"/>\n                    <Ellipse x:Name=\"ProgressIndicator3\" Width=\"10\" Height=\"10\" Margin=\"4,0\" Fill=\"#808080\" ToolTip=\"Deployment Settings\"/>\n                </StackPanel>\n            </Grid>\n            \n            <!-- Modal Overlay for MessageBoxes -->\n            <Rectangle x:Name=\"ModalOverlay\" \n                       Grid.RowSpan=\"3\" \n                       Fill=\"#80000000\" \n                       Visibility=\"Collapsed\" \n                       Panel.ZIndex=\"1000\"\n                       RadiusX=\"8\"\n                       RadiusY=\"8\"\n                       Margin=\"-1\"/>\n        </Grid>\n    </Border>\n</Window>\n"
  },
  {
    "path": "Schemas/MessageBoxWindow.xaml",
    "content": "<Window xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n        xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\"\n        Title=\"MessageBox\" \n        Width=\"440\"\n        SizeToContent=\"Height\"\n        MaxHeight=\"501\"\n        ResizeMode=\"NoResize\"\n        WindowStartupLocation=\"CenterOwner\"\n        WindowStyle=\"None\"\n        AllowsTransparency=\"True\"\n        Background=\"Transparent\"\n        Topmost=\"True\"\n        ShowInTaskbar=\"False\">\n\n    <Border BorderBrush=\"{DynamicResource BorderColor}\" \n            BorderThickness=\"1\" \n            CornerRadius=\"8\"\n            Background=\"{DynamicResource CardBgColor}\"\n            Margin=\"25\">\n        <Border.Effect>\n            <DropShadowEffect Color=\"Black\" \n                            Opacity=\"0.15\" \n                            BlurRadius=\"20\" \n                            ShadowDepth=\"0\" \n                            Direction=\"0\"/>\n        </Border.Effect>\n        \n        <Grid Margin=\"0\">\n            <Grid.RowDefinitions>\n                <RowDefinition Height=\"Auto\"/>\n                <RowDefinition Height=\"*\"/>\n                <RowDefinition Height=\"Auto\"/>\n            </Grid.RowDefinitions>\n\n            <!-- Title Bar -->\n            <Grid Grid.Row=\"0\" x:Name=\"TitleBar\" Height=\"40\" Background=\"Transparent\">\n                <TextBlock x:Name=\"TitleText\" \n                           Text=\"Message\" \n                           Foreground=\"{DynamicResource FgColor}\"\n                           FontSize=\"16\"\n                           FontWeight=\"SemiBold\"\n                           VerticalAlignment=\"Center\" \n                           Margin=\"16,0,0,0\"/>\n            </Grid>\n\n            <!-- Message Content -->\n            <ScrollViewer Grid.Row=\"1\" VerticalScrollBarVisibility=\"Auto\" MaxHeight=\"500\" Padding=\"0\" Margin=\"20,12,1,20\">\n                <Grid Margin=\"0,0,20,0\">\n                    <Grid.ColumnDefinitions>\n                        <ColumnDefinition Width=\"Auto\"/>\n                        <ColumnDefinition Width=\"*\"/>\n                    </Grid.ColumnDefinitions>\n\n                    <!-- Icon -->\n                    <TextBlock x:Name=\"IconText\"\n                               Grid.Column=\"0\"\n                               FontFamily=\"Segoe Fluent Icons\"\n                               FontSize=\"24\"\n                               Foreground=\"{DynamicResource FgColor}\"\n                               VerticalAlignment=\"Center\"\n                               Margin=\"4,2,14,0\"\n                               Visibility=\"Collapsed\"/>\n\n                    <!-- Message Text -->\n                    <TextBlock x:Name=\"MessageText\"\n                               Grid.Column=\"1\"\n                               Text=\"Message content goes here\"\n                               TextWrapping=\"Wrap\"\n                               FontSize=\"14\"\n                               LineHeight=\"20\"\n                               Foreground=\"{DynamicResource FgColor}\"\n                               VerticalAlignment=\"Center\"/>\n                </Grid>\n            </ScrollViewer>\n\n            <!-- Button Panel -->\n            <Border Grid.Row=\"2\" \n                    Background=\"{DynamicResource BgColor}\"\n                    BorderBrush=\"{DynamicResource BorderColor}\"\n                    BorderThickness=\"0,1,0,0\"\n                    Padding=\"16,12\"\n                    CornerRadius=\"0,0,8,8\">\n                <StackPanel x:Name=\"ButtonPanel\"\n                            Orientation=\"Horizontal\"\n                            HorizontalAlignment=\"Right\">\n                    <Button x:Name=\"Button1\" \n                            Content=\"OK\" \n                            Height=\"32\" MinWidth=\"80\" Margin=\"4,0\"\n                            Style=\"{DynamicResource PrimaryButtonStyle}\"/>\n                    <Button x:Name=\"Button2\" \n                            Content=\"Cancel\" \n                            Height=\"32\" MinWidth=\"80\" Margin=\"4,0\"\n                            Style=\"{DynamicResource SecondaryButtonStyle}\"\n                            Visibility=\"Collapsed\"/>\n                </StackPanel>\n            </Border>\n        </Grid>\n    </Border>\n</Window>\n"
  },
  {
    "path": "Schemas/SharedStyles.xaml",
    "content": "<ResourceDictionary xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"\n                    xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\">\n\n    <!-- Primary Button Style -->\n    <Style x:Key=\"PrimaryButtonStyle\" TargetType=\"Button\">\n        <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBg}\"/>\n        <Setter Property=\"Foreground\" Value=\"white\"/>\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBg}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\"/>\n        <Setter Property=\"Padding\" Value=\"0\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"Cursor\" Value=\"Hand\"/>\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"Button\">\n                    <Border Background=\"{TemplateBinding Background}\" \n                            BorderBrush=\"{TemplateBinding BorderBrush}\" \n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\n                            CornerRadius=\"4\"\n                            Padding=\"{TemplateBinding Padding}\">\n                        <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\"/>\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        <Style.Triggers>\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                <Setter Property=\"Background\" Value=\"{DynamicResource ButtonDisabled}\"/>\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonDisabled}\"/>\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonTextDisabled}\"/>\n            </Trigger>\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                <Setter Property=\"Background\" Value=\"{DynamicResource ButtonHover}\"/>\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonHover}\"/>\n            </Trigger>\n            <Trigger Property=\"IsPressed\" Value=\"True\">\n                <Setter Property=\"Background\" Value=\"{DynamicResource ButtonPressed}\"/>\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonPressed}\"/>\n            </Trigger>\n        </Style.Triggers>\n    </Style>\n\n    <!-- Secondary Button Style -->\n    <Style x:Key=\"SecondaryButtonStyle\" TargetType=\"Button\">\n        <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonBg}\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n        <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n        <Setter Property=\"BorderThickness\" Value=\"1\"/>\n        <Setter Property=\"Padding\" Value=\"0\"/>\n        <Setter Property=\"FontSize\" Value=\"14\"/>\n        <Setter Property=\"Cursor\" Value=\"Hand\"/>\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"Button\">\n                    <Border Background=\"{TemplateBinding Background}\" \n                            BorderBrush=\"{TemplateBinding BorderBrush}\" \n                            BorderThickness=\"{TemplateBinding BorderThickness}\"\n                            CornerRadius=\"4\"\n                            Padding=\"{TemplateBinding Padding}\">\n                        <ContentPresenter HorizontalAlignment=\"Center\" VerticalAlignment=\"Center\" Margin=\"0,0,0,1\"/>\n                    </Border>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n        <Style.Triggers>\n            <Trigger Property=\"IsEnabled\" Value=\"False\">\n                <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonDisabled}\"/>\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource BorderColor}\"/>\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource SecondaryButtonTextDisabled}\"/>\n            </Trigger>\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonHover}\"/>\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n            </Trigger>\n            <Trigger Property=\"IsPressed\" Value=\"True\">\n                <Setter Property=\"Background\" Value=\"{DynamicResource SecondaryButtonPressed}\"/>\n                <Setter Property=\"BorderBrush\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n            </Trigger>\n        </Style.Triggers>\n    </Style>\n\n    <!-- Hyperlink Style -->\n    <Style x:Key=\"HyperlinkStyle\" TargetType=\"TextBlock\">\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonBg}\"/>\n        <Setter Property=\"Cursor\" Value=\"Hand\"/>\n        <Style.Triggers>\n            <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonHover}\"/>\n            </Trigger>\n        </Style.Triggers>\n    </Style>\n\n    <!-- ProgressBar Style -->\n    <Style x:Key=\"ApplyProgressBarStyle\" TargetType=\"ProgressBar\">\n        <Setter Property=\"Background\" Value=\"{DynamicResource ButtonBorderColor}\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource ButtonBg}\"/>\n        <Setter Property=\"Height\" Value=\"6\"/>\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"ProgressBar\">\n                    <Grid>\n                        <Border x:Name=\"PART_Track\" Background=\"{TemplateBinding Background}\" CornerRadius=\"3\" Height=\"{TemplateBinding Height}\"/>\n                        <Border x:Name=\"PART_Indicator\" Background=\"{TemplateBinding Foreground}\" CornerRadius=\"3\" HorizontalAlignment=\"Left\" Height=\"{TemplateBinding Height}\"/>\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n    <!-- Modal Title Style -->\n    <Style x:Key=\"ModalTitleStyle\" TargetType=\"TextBlock\">\n        <Setter Property=\"FontWeight\" Value=\"Bold\"/>\n        <Setter Property=\"FontSize\" Value=\"20\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n        <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\n        <Setter Property=\"Margin\" Value=\"0,0,0,8\"/>\n    </Style>\n\n    <!-- Modal Subtext Style -->\n    <Style x:Key=\"ModalSubtextStyle\" TargetType=\"TextBlock\">\n        <Setter Property=\"FontSize\" Value=\"13\"/>\n        <Setter Property=\"Foreground\" Value=\"{DynamicResource FgColor}\"/>\n        <Setter Property=\"Opacity\" Value=\"0.8\"/>\n        <Setter Property=\"HorizontalAlignment\" Value=\"Center\"/>\n        <Setter Property=\"TextAlignment\" Value=\"Center\"/>\n    </Style>\n\n    <!-- ScrollBar Style -->\n    <Style TargetType=\"{x:Type ScrollBar}\">\n        <Setter Property=\"Background\" Value=\"Transparent\"/>\n        <Setter Property=\"Width\" Value=\"8\"/>\n        <Setter Property=\"Template\">\n            <Setter.Value>\n                <ControlTemplate TargetType=\"{x:Type ScrollBar}\">\n                    <Grid>\n                        <Track Name=\"PART_Track\" IsDirectionReversed=\"true\">\n                            <Track.Thumb>\n                                <Thumb>\n                                    <Thumb.Style>\n                                        <Style TargetType=\"Thumb\">\n                                            <Setter Property=\"Background\" Value=\"{DynamicResource ScrollBarThumbColor}\"/>\n                                            <Setter Property=\"Template\">\n                                                <Setter.Value>\n                                                    <ControlTemplate TargetType=\"Thumb\">\n                                                        <Border Background=\"{TemplateBinding Background}\" CornerRadius=\"4\"/>\n                                                    </ControlTemplate>\n                                                </Setter.Value>\n                                            </Setter>\n                                            <Style.Triggers>\n                                                <Trigger Property=\"IsMouseOver\" Value=\"True\">\n                                                    <Setter Property=\"Background\" Value=\"{DynamicResource ScrollBarThumbHoverColor}\"/>\n                                                </Trigger>\n                                            </Style.Triggers>\n                                        </Style>\n                                    </Thumb.Style>\n                                </Thumb>\n                            </Track.Thumb>\n                        </Track>\n                    </Grid>\n                </ControlTemplate>\n            </Setter.Value>\n        </Setter>\n    </Style>\n\n</ResourceDictionary>\n"
  },
  {
    "path": "Scripts/AppRemoval/ForceRemoveEdge.ps1",
    "content": "# Forcefully removes Microsoft Edge using its uninstaller\n# Credit: Based on work from loadstring1 & ave9858\nfunction ForceRemoveEdge {\n    Write-Host \"> Forcefully uninstalling Microsoft Edge...\"\n\n    $regView = [Microsoft.Win32.RegistryView]::Registry32\n    $hklm = [Microsoft.Win32.RegistryKey]::OpenBaseKey([Microsoft.Win32.RegistryHive]::LocalMachine, $regView)\n    $hklm.CreateSubKey('SOFTWARE\\Microsoft\\EdgeUpdateDev').SetValue('AllowUninstall', '')\n\n    # Create stub (This somehow allows uninstalling Edge)\n    $edgeStub = \"$env:SystemRoot\\SystemApps\\Microsoft.MicrosoftEdge_8wekyb3d8bbwe\"\n    New-Item $edgeStub -ItemType Directory | Out-Null\n    New-Item \"$edgeStub\\MicrosoftEdge.exe\" | Out-Null\n\n    # Remove edge\n    $uninstallRegKey = $hklm.OpenSubKey('SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Microsoft Edge')\n    if ($null -ne $uninstallRegKey) {\n        Write-Host \"Running uninstaller...\"\n        $uninstallString = $uninstallRegKey.GetValue('UninstallString') + ' --force-uninstall'\n        Invoke-NonBlocking -ScriptBlock {\n            param($cmd)\n            Start-Process cmd.exe \"/c $cmd\" -WindowStyle Hidden -Wait\n        } -ArgumentList $uninstallString\n\n        Write-Host \"Removing leftover files...\"\n\n        $edgePaths = @(\n            \"$env:ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Microsoft Edge.lnk\",\n            \"$env:APPDATA\\Microsoft\\Internet Explorer\\Quick Launch\\Microsoft Edge.lnk\",\n            \"$env:APPDATA\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Microsoft Edge.lnk\",\n            \"$env:APPDATA\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar\\Tombstones\\Microsoft Edge.lnk\",\n            \"$env:PUBLIC\\Desktop\\Microsoft Edge.lnk\",\n            \"$env:USERPROFILE\\Desktop\\Microsoft Edge.lnk\",\n            \"$edgeStub\"\n        )\n\n        foreach ($path in $edgePaths) {\n            if (Test-Path -Path $path) {\n                Remove-Item -Path $path -Force -Recurse -ErrorAction SilentlyContinue\n                Write-Host \"  Removed $path\" -ForegroundColor DarkGray\n            }\n        }\n\n        Write-Host \"Cleaning up registry...\"\n\n        # Remove MS Edge from autostart\n        reg delete \"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"MicrosoftEdgeAutoLaunch_A9F6DCE4ABADF4F51CF45CD7129E3C6C\" /f *>$null\n        reg delete \"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\" /v \"Microsoft Edge Update\" /f *>$null\n        reg delete \"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run\" /v \"MicrosoftEdgeAutoLaunch_A9F6DCE4ABADF4F51CF45CD7129E3C6C\" /f *>$null\n        reg delete \"HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\StartupApproved\\Run\" /v \"Microsoft Edge Update\" /f *>$null\n\n        Write-Host \"Microsoft Edge was uninstalled\"\n    }\n    else {\n        Write-Host \"Unable to forcefully uninstall Microsoft Edge, uninstaller could not be found\" -ForegroundColor Red\n    }\n}"
  },
  {
    "path": "Scripts/AppRemoval/GetInstalledAppsViaWinget.ps1",
    "content": "\n# Run winget list and return installed apps.\n# Use -NonBlocking to keep the UI responsive (GUI mode) via Invoke-NonBlocking.\nfunction GetInstalledAppsViaWinget {\n    param (\n        [int]$TimeOut = 10,\n        [switch]$NonBlocking\n    )\n\n    if (-not $script:WingetInstalled) { return $null }\n\n    $fetchBlock = {\n        param($timeOut)\n        $job = Start-Job { return winget list --accept-source-agreements --disable-interactivity }\n        $done = $job | Wait-Job -Timeout $timeOut\n        if ($done) {\n            $result = Receive-Job -Job $job\n            Remove-Job -Job $job -ErrorAction SilentlyContinue\n            return $result\n        }\n        Remove-Job -Job $job -Force -ErrorAction SilentlyContinue\n        return $null\n    }\n\n    if ($NonBlocking) {\n        return Invoke-NonBlocking -ScriptBlock $fetchBlock -ArgumentList $TimeOut\n    }\n    else {\n        return & $fetchBlock $TimeOut\n    }\n}"
  },
  {
    "path": "Scripts/AppRemoval/RemoveApps.ps1",
    "content": "# Removes apps specified during function call based on the target scope.\nfunction RemoveApps {\n    param (\n        $appslist\n    )\n\n    # Determine target from script-level params, defaulting to AllUsers\n    $targetUser = GetTargetUserForAppRemoval\n\n    $appIndex = 0\n    $appCount = @($appsList).Count\n\n    Foreach ($app in $appsList) {\n        if ($script:CancelRequested) {\n            return\n        }\n\n        $appIndex++\n\n        # Update step name and sub-progress to show which app is being removed (only for bulk removal)\n        if ($script:ApplySubStepCallback -and $appCount -gt 1) {\n            & $script:ApplySubStepCallback \"Removing apps ($appIndex/$appCount)\" $appIndex $appCount\n        }\n\n        Write-Host \"Attempting to remove $app...\"\n\n        # Use WinGet only to remove OneDrive and Edge\n        if (($app -eq \"Microsoft.OneDrive\") -or ($app -eq \"Microsoft.Edge\")) {\n            if ($script:WingetInstalled -eq $false) {\n                Write-Host \"WinGet is either not installed or is outdated, $app could not be removed\" -ForegroundColor Red\n                continue\n            }\n\n            $appName = $app -replace '\\.', '_'\n\n            # Uninstall app via WinGet, or create a scheduled task to uninstall it later\n            if ($script:Params.ContainsKey(\"User\")) {\n                ImportRegistryFile \"Adding scheduled task to uninstall $app for user $(GetUserName)...\" \"Uninstall_$($appName).reg\"\n            }\n            elseif ($script:Params.ContainsKey(\"Sysprep\")) {\n                ImportRegistryFile \"Adding scheduled task to uninstall $app after for new users...\" \"Uninstall_$($appName).reg\"\n            }\n            else {\n                # Uninstall app via WinGet\n                $wingetOutput = Invoke-NonBlocking -ScriptBlock {\n                    param($appId)\n                    winget uninstall --accept-source-agreements --disable-interactivity --id $appId\n                } -ArgumentList $app\n\n                If (($app -eq \"Microsoft.Edge\") -and (Select-String -InputObject $wingetOutput -Pattern \"Uninstall failed with exit code\")) {\n                    Write-Host \"Unable to uninstall Microsoft Edge via WinGet\" -ForegroundColor Red\n\n                    if ($script:GuiWindow) {\n                        $result = Show-MessageBox -Message 'Unable to uninstall Microsoft Edge via WinGet. Would you like to forcefully uninstall it? NOT RECOMMENDED!' -Title 'Force Uninstall Microsoft Edge?' -Button 'YesNo' -Icon 'Warning'\n\n                        if ($result -eq 'Yes') {\n                            Write-Host \"\"\n                            ForceRemoveEdge\n                        }\n                    }\n                    elseif ($( Read-Host -Prompt \"Would you like to forcefully uninstall Microsoft Edge? NOT RECOMMENDED! (y/n)\" ) -eq 'y') {\n                        Write-Host \"\"\n                        ForceRemoveEdge\n                    }\n                }\n            }\n\n            continue\n        }\n\n        # Use Remove-AppxPackage to remove all other apps\n        $appPattern = '*' + $app + '*'\n\n        try {\n            switch ($targetUser) {\n                \"AllUsers\" {\n                    # Remove installed app for all existing users, and from OS image\n                    Invoke-NonBlocking -ScriptBlock {\n                        param($pattern)\n                        Get-AppxPackage -Name $pattern -AllUsers | Remove-AppxPackage -AllUsers -ErrorAction Continue\n                        Get-AppxProvisionedPackage -Online | Where-Object { $_.PackageName -like $pattern } | ForEach-Object { Remove-ProvisionedAppxPackage -Online -AllUsers -PackageName $_.PackageName }\n                    } -ArgumentList $appPattern\n                }\n                \"CurrentUser\" {\n                    # Remove installed app for current user only\n                    Invoke-NonBlocking -ScriptBlock {\n                        param($pattern)\n                        Get-AppxPackage -Name $pattern | Remove-AppxPackage -ErrorAction Continue\n                    } -ArgumentList $appPattern\n                }\n                default {\n                    # Target is a specific username - remove app for that user only\n                    Invoke-NonBlocking -ScriptBlock {\n                        param($pattern, $user)\n                        $userAccount = New-Object System.Security.Principal.NTAccount($user)\n                        $userSid = $userAccount.Translate([System.Security.Principal.SecurityIdentifier]).Value\n                        Get-AppxPackage -Name $pattern -User $userSid | Remove-AppxPackage -User $userSid -ErrorAction Continue\n                    } -ArgumentList @($appPattern, $targetUser)\n                }\n            }\n        }\n        catch {\n            if ($DebugPreference -ne \"SilentlyContinue\") {\n                Write-Host \"Something went wrong while trying to remove $app\" -ForegroundColor Yellow\n                Write-Host $psitem.Exception.StackTrace -ForegroundColor Gray\n            }\n        }\n    }\n\n    Write-Host \"\"\n}"
  },
  {
    "path": "Scripts/CLI/AwaitKeyToExit.ps1",
    "content": "function AwaitKeyToExit {\n    # Suppress prompt if Silent parameter was passed\n    if (-not $Silent) {\n        Write-Output \"\"\n        Write-Output \"Press any key to exit...\"\n        $null = [System.Console]::ReadKey()\n    }\n\n    Stop-Transcript\n    Exit\n}"
  },
  {
    "path": "Scripts/CLI/PrintHeader.ps1",
    "content": "# Prints the header for the script\nfunction PrintHeader {\n    param (\n        $title\n    )\n\n    $fullTitle = \" Win11Debloat Script - $title\"\n\n    if ($script:Params.ContainsKey(\"Sysprep\")) {\n        $fullTitle = \"$fullTitle (Sysprep mode)\"\n    }\n    else {\n        $fullTitle = \"$fullTitle (User: $(GetUserName))\"\n    }\n\n    Clear-Host\n    Write-Host \"-------------------------------------------------------------------------------------------\"\n    Write-Host $fullTitle\n    Write-Host \"-------------------------------------------------------------------------------------------\"\n}"
  },
  {
    "path": "Scripts/CLI/PrintPendingChanges.ps1",
    "content": "# Prints all pending changes that will be made by the script\nfunction PrintPendingChanges {\n    Write-Output \"Win11Debloat will make the following changes:\"\n\n    if ($script:Params['CreateRestorePoint']) {\n        Write-Output \"- $($script:Features['CreateRestorePoint'].Label)\"\n    }\n    foreach ($parameterName in $script:Params.Keys) {\n        if ($script:ControlParams -contains $parameterName) {\n            continue\n        }\n\n        # Print parameter description\n        switch ($parameterName) {\n            'Apps' {\n                continue\n            }\n            'CreateRestorePoint' {\n                continue\n            }\n            'RemoveApps' {\n                $appsList = GenerateAppsList\n\n                if ($appsList.Count -eq 0) {\n                    Write-Host \"No valid apps were selected for removal\" -ForegroundColor Yellow\n                    Write-Output \"\"\n                    continue\n                }\n\n                Write-Output \"- Remove $($appsList.Count) apps:\"\n                Write-Host $appsList -ForegroundColor DarkGray\n                continue\n            }\n            'RemoveAppsCustom' {\n                $appsList = LoadAppsFromFile $script:CustomAppsListFilePath\n\n                if ($appsList.Count -eq 0) {\n                    Write-Host \"No valid apps were selected for removal\" -ForegroundColor Yellow\n                    Write-Output \"\"\n                    continue\n                }\n\n                Write-Output \"- Remove $($appsList.Count) apps:\"\n                Write-Host $appsList -ForegroundColor DarkGray\n                continue\n            }\n            default {\n                if ($script:Features -and $script:Features.ContainsKey($parameterName)) {\n                    $action = $script:Features[$parameterName].Action\n                    $message = $script:Features[$parameterName].Label\n                    Write-Output \"- $action $message\"\n                }\n                else {\n                    # Fallback: show the parameter name if no feature description is available\n                    Write-Output \"- $parameterName\"\n                }\n                continue\n            }\n        }\n    }\n\n    Write-Output \"\"\n    Write-Output \"\"\n    Write-Output \"Press enter to execute the script or press CTRL+C to quit...\"\n    Read-Host | Out-Null\n}"
  },
  {
    "path": "Scripts/CLI/ShowCLIAppRemoval.ps1",
    "content": "# Shows the CLI app removal menu and prompts the user to select which apps to remove.\nfunction ShowCLIAppRemoval {\n    PrintHeader \"App Removal\"\n\n    Write-Output \"> Opening app selection form...\"\n\n    $result = Show-AppSelectionWindow\n\n    if ($result -eq $true) {\n        Write-Output \"You have selected $($script:SelectedApps.Count) apps for removal\"\n        AddParameter 'RemoveAppsCustom'\n\n        SaveSettings\n\n        # Suppress prompt if Silent parameter was passed\n        if (-not $Silent) {\n            Write-Output \"\"\n            Write-Output \"\"\n            Write-Output \"Press enter to remove the selected apps or press CTRL+C to quit...\"\n            Read-Host | Out-Null\n            PrintHeader \"App Removal\"\n        }\n    }\n    else {\n        Write-Host \"Selection was cancelled, no apps have been removed\" -ForegroundColor Red\n        Write-Output \"\"\n    }\n}"
  },
  {
    "path": "Scripts/CLI/ShowCLIDefaultModeAppRemovalOptions.ps1",
    "content": "# Shows the CLI default mode app removal options. Loops until a valid option is selected.\nfunction ShowCLIDefaultModeAppRemovalOptions {\n    PrintHeader 'Default Mode'\n\n    Write-Host \"Please note: The default selection of apps includes Microsoft Teams, Spotify, Sticky Notes and more. Select option 2 to verify and change what apps are removed by the script\" -ForegroundColor DarkGray\n    Write-Host \"\"\n\n    Do {\n        Write-Host \"Options:\" -ForegroundColor Yellow\n        Write-Host \" (n) Don't remove any apps\" -ForegroundColor Yellow\n        Write-Host \" (1) Only remove the default selection of apps\" -ForegroundColor Yellow\n        Write-Host \" (2) Manually select which apps to remove\" -ForegroundColor Yellow\n        $RemoveAppsInput = Read-Host \"Do you want to remove any apps? Apps will be removed for all users (n/1/2)\"\n\n        # Show app selection form if user entered option 3\n        if ($RemoveAppsInput -eq '2') {\n            $result = Show-AppSelectionWindow\n\n            if ($result -ne $true) {\n                # User cancelled or closed app selection, change RemoveAppsInput so the menu will be shown again\n                Write-Host \"\"\n                Write-Host \"Cancelled application selection, please try again\" -ForegroundColor Red\n\n                $RemoveAppsInput = 'c'\n            }\n            \n            Write-Host \"\"\n        }\n    }\n    while ($RemoveAppsInput -ne 'n' -and $RemoveAppsInput -ne '0' -and $RemoveAppsInput -ne '1' -and $RemoveAppsInput -ne '2')\n\n    return $RemoveAppsInput\n}"
  },
  {
    "path": "Scripts/CLI/ShowCLIDefaultModeOptions.ps1",
    "content": "# Show CLI default mode options for removing apps, or set selection if RunDefaults or RunDefaultsLite parameter was passed\nfunction ShowCLIDefaultModeOptions {\n    if ($RunDefaults) {\n        $RemoveAppsInput = '1'\n    }\n    elseif ($RunDefaultsLite) {\n        $RemoveAppsInput = '0'                \n    }\n    else {\n        $RemoveAppsInput = ShowCLIDefaultModeAppRemovalOptions\n\n        if ($RemoveAppsInput -eq '2' -and ($script:SelectedApps.contains('Microsoft.XboxGameOverlay') -or $script:SelectedApps.contains('Microsoft.XboxGamingOverlay')) -and \n          $( Read-Host -Prompt \"Disable Game Bar integration and game/screen recording? This also stops ms-gamingoverlay and ms-gamebar popups (y/n)\" ) -eq 'y') {\n            $DisableGameBarIntegrationInput = $true;\n        }\n    }\n\n    PrintHeader 'Default Mode'\n\n    try {\n        # Select app removal options based on user input\n        switch ($RemoveAppsInput) {\n            '1' {\n                AddParameter 'RemoveApps'\n                AddParameter 'Apps' 'Default'\n            }\n            '2' {\n                AddParameter 'RemoveAppsCustom'\n\n                if ($DisableGameBarIntegrationInput) {\n                    AddParameter 'DisableDVR'\n                    AddParameter 'DisableGameBarIntegration'\n                }\n            }\n        }\n\n        LoadSettings -filePath $script:DefaultSettingsFilePath -expectedVersion \"1.0\"\n    }\n    catch {\n        Write-Error \"Failed to load settings from DefaultSettings.json file: $_\"\n        AwaitKeyToExit\n    }\n\n    SaveSettings\n\n    if ($Silent) {\n        # Skip change summary and confirmation prompt\n        return\n    }\n\n    PrintPendingChanges\n    PrintHeader 'Default Mode'\n}"
  },
  {
    "path": "Scripts/CLI/ShowCLILastUsedSettings.ps1",
    "content": "# Shows the CLI last used settings from LastUsedSettings.json file, displays pending changes and prompts the user to apply them.\nfunction ShowCLILastUsedSettings {\n    PrintHeader 'Custom Mode'\n\n    try {\n        LoadSettings -filePath $script:SavedSettingsFilePath -expectedVersion \"1.0\"\n    }\n    catch {\n        Write-Error \"Failed to load settings from LastUsedSettings.json file: $_\"\n        AwaitKeyToExit\n    }\n\n    if ($Silent) {\n        # Skip change summary and confirmation prompt\n        return\n    }\n\n    PrintPendingChanges\n    PrintHeader 'Custom Mode'\n}"
  },
  {
    "path": "Scripts/CLI/ShowCLIMenuOptions.ps1",
    "content": "# Shows the CLI menu options and prompts the user to select one. Loops until a valid option is selected.\nfunction ShowCLIMenuOptions {\n    Do { \n        $ModeSelectionMessage = \"Please select an option (1/2)\" \n\n        PrintHeader 'Menu'\n\n        Write-Host \"(1) Default mode: Quickly apply the recommended changes\"\n        Write-Host \"(2) App removal mode: Select & remove apps, without making other changes\"\n\n        # Only show this option if SavedSettings file exists\n        if (Test-Path $script:SavedSettingsFilePath) {\n            Write-Host \"(3) Quickly apply your last used settings\"\n            \n            $ModeSelectionMessage = \"Please select an option (1/2/3)\" \n        }\n\n        Write-Host \"\"\n        Write-Host \"\"\n\n        $Mode = Read-Host $ModeSelectionMessage\n\n        if (($Mode -eq '3') -and -not (Test-Path $script:SavedSettingsFilePath)) {\n            $Mode = $null\n        }\n    }\n    while ($Mode -ne '1' -and $Mode -ne '2' -and $Mode -ne '3')\n\n    return $Mode\n}"
  },
  {
    "path": "Scripts/Features/CreateSystemRestorePoint.ps1",
    "content": "function CreateSystemRestorePoint {\n    $SysRestore = Get-ItemProperty -Path \"HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\SystemRestore\" -Name \"RPSessionInterval\"\n    $failed = $false\n\n    if ($SysRestore.RPSessionInterval -eq 0) {\n        # In GUI mode, skip the prompt and just try to enable it\n        if ($script:GuiWindow -or $Silent -or $( Read-Host -Prompt \"System restore is disabled, would you like to enable it and create a restore point? (y/n)\") -eq 'y') {\n            try {\n                $enableResult = Invoke-NonBlocking -TimeoutSeconds 20 -ScriptBlock {\n                    try {\n                        Enable-ComputerRestore -Drive \"$env:SystemDrive\"\n                        return $null\n                    }\n                    catch {\n                        return \"Error: Failed to enable System Restore: $_\"\n                    }\n                }\n            }\n            catch {\n                $enableResult = \"Error: Failed to enable System Restore: $_\"\n            }\n\n            if ($enableResult) {\n                Write-Host $enableResult -ForegroundColor Red\n                $failed = $true\n            }\n        }\n        else {\n            Write-Host \"\"\n            $failed = $true\n        }\n    }\n\n    if (-not $failed) {\n        try {\n            $result = Invoke-NonBlocking -TimeoutSeconds 20 -ScriptBlock {\n                try {\n                    $recentRestorePoints = Get-ComputerRestorePoint | Where-Object { (Get-Date) - [System.Management.ManagementDateTimeConverter]::ToDateTime($_.CreationTime) -le (New-TimeSpan -Hours 24) }\n                }\n                catch {\n                    return [PSCustomObject]@{ Success = $false; Message = \"Error: Unable to retrieve existing restore points: $_\" }\n                }\n\n                if ($recentRestorePoints.Count -eq 0) {\n                    try {\n                        Checkpoint-Computer -Description \"Restore point created by Win11Debloat\" -RestorePointType \"MODIFY_SETTINGS\"\n                        return [PSCustomObject]@{ Success = $true; Message = \"System restore point created successfully\" }\n                    }\n                    catch {\n                        return [PSCustomObject]@{ Success = $false; Message = \"Error: Unable to create restore point: $_\" }\n                    }\n                }\n                else {\n                    return [PSCustomObject]@{ Success = $true; Message = \"A recent restore point already exists, no new restore point was created\" }\n                }\n            }\n        }\n        catch {\n            $result = [PSCustomObject]@{ Success = $false; Message = \"Error: Failed to create system restore point: $_\" }\n        }\n\n        if ($result -and $result.Success) {\n            Write-Host $result.Message\n        }\n        elseif ($result) {\n            Write-Host $result.Message -ForegroundColor Red\n            $failed = $true\n        }\n        else {\n            Write-Host \"Error: Failed to create system restore point\" -ForegroundColor Red\n            $failed = $true\n        }\n    }\n\n    # Ensure that the user is aware if creating a restore point failed, and give them the option to continue without a restore point or cancel the script\n    if ($failed) {\n        if ($script:GuiWindow) {\n            $result = Show-MessageBox \"Failed to create a system restore point. Do you want to continue without a restore point?\" \"Restore Point Creation Failed\" \"YesNo\" \"Warning\"\n\n            if ($result -ne \"Yes\") {\n                $script:CancelRequested = $true\n                return\n            }\n        }\n        elseif (-not $Silent) {\n            Write-Host \"Failed to create a system restore point. Do you want to continue without a restore point? (y/n)\" -ForegroundColor Yellow\n            if ($( Read-Host ) -ne 'y') {\n                $script:CancelRequested = $true\n                return\n            }\n        }\n\n        Write-Host \"Warning: Continuing without restore point\" -ForegroundColor Yellow\n    }\n}"
  },
  {
    "path": "Scripts/Features/DisableStoreSearchSuggestions.ps1",
    "content": "# Disables Microsoft Store search suggestions in the start menu for all users by denying access to the Store app database file for each user\nfunction DisableStoreSearchSuggestionsForAllUsers {\n    # Get path to Store app database for all users\n    $userPathString = GetUserDirectory -userName \"*\" -fileName \"AppData\\Local\\Packages\"\n    $usersStoreDbPaths = get-childitem -path $userPathString\n\n    # Go through all users and disable start search suggestions\n    ForEach ($storeDbPath in $usersStoreDbPaths) {\n        DisableStoreSearchSuggestions ($storeDbPath.FullName + \"\\Microsoft.WindowsStore_8wekyb3d8bbwe\\LocalState\\store.db\")\n    }\n\n    # Also disable start search suggestions for the default user profile\n    $defaultStoreDbPath = GetUserDirectory -userName \"Default\" -fileName \"AppData\\Local\\Packages\\Microsoft.WindowsStore_8wekyb3d8bbwe\\LocalState\\store.db\" -exitIfPathNotFound $false\n    DisableStoreSearchSuggestions $defaultStoreDbPath\n}\n\n\n# Disables Microsoft Store search suggestions in the start menu by denying access to the Store app database file\nfunction DisableStoreSearchSuggestions {\n    param (\n        $StoreAppsDatabase = \"$env:LocalAppData\\Packages\\Microsoft.WindowsStore_8wekyb3d8bbwe\\LocalState\\store.db\"\n    )\n\n    # Change path to correct user if a user was specified\n    if ($script:Params.ContainsKey(\"User\")) {\n        $StoreAppsDatabase = GetUserDirectory -userName \"$(GetUserName)\" -fileName \"AppData\\Local\\Packages\\Microsoft.WindowsStore_8wekyb3d8bbwe\\LocalState\\store.db\" -exitIfPathNotFound $false\n    }\n\n    $userName = [regex]::Match($StoreAppsDatabase, '(?:Users\\\\)([^\\\\]+)(?:\\\\AppData)').Groups[1].Value\n\n    # This file doesn't exist in EEA (No Store app suggestions).\n    if (-not (Test-Path -Path $StoreAppsDatabase))\n    {\n        Write-Host \"Unable to find Store app database for user $userName, creating it now to prevent Windows from creating it later...\" -ForegroundColor Yellow\n\n        $storeDbDir = Split-Path -Path $StoreAppsDatabase -Parent\n\n        if (-not (Test-Path -Path $storeDbDir)) {\n            New-Item -Path $storeDbDir -ItemType Directory -Force | Out-Null\n        }\n\n        New-Item -Path $StoreAppsDatabase -ItemType File -Force | Out-Null\n    }\n    \n    $AccountSid = [System.Security.Principal.SecurityIdentifier]::new('S-1-1-0') # 'EVERYONE' group\n    $Acl = Get-Acl -Path $StoreAppsDatabase\n    $Ace = [System.Security.AccessControl.FileSystemAccessRule]::new($AccountSid, 'FullControl', 'Deny')\n    $Acl.SetAccessRule($Ace) | Out-Null\n    Set-Acl -Path $StoreAppsDatabase -AclObject $Acl | Out-Null\n\n    Write-Host \"Disabled Microsoft Store search suggestions for user $userName\"\n}"
  },
  {
    "path": "Scripts/Features/EnableWindowsFeature.ps1",
    "content": "# Enables a Windows optional feature and pipes its output to the console\nfunction EnableWindowsFeature {\n    param (\n        [string]$FeatureName\n    )\n\n    $result = Invoke-NonBlocking -ScriptBlock {\n        param($name)\n        Enable-WindowsOptionalFeature -Online -FeatureName $name -All -NoRestart\n    } -ArgumentList $FeatureName\n\n    $dismResult = @($result) | Where-Object { $_ -is [Microsoft.Dism.Commands.ImageObject] }\n    if ($dismResult) {\n        Write-Host ($dismResult | Out-String).Trim()\n    }\n}"
  },
  {
    "path": "Scripts/Features/ExecuteChanges.ps1",
    "content": "# Executes a single parameter/feature based on its key\n# Parameters:\n#   $paramKey - The parameter name to execute\nfunction ExecuteParameter {\n    param (\n        [string]$paramKey\n    )\n    \n    # Check if this feature has metadata in Features.json\n    $feature = $null\n    if ($script:Features.ContainsKey($paramKey)) {\n        $feature = $script:Features[$paramKey]\n    }\n    \n    # If feature has RegistryKey and ApplyText, use dynamic ImportRegistryFile\n    if ($feature -and $feature.RegistryKey -and $feature.ApplyText) {\n        ImportRegistryFile \"> $($feature.ApplyText)\" $feature.RegistryKey\n        \n        # Handle special cases that have additional logic after ImportRegistryFile\n        switch ($paramKey) {\n            'DisableBing' {\n                # Also remove the app package for Bing search\n                RemoveApps 'Microsoft.BingSearch'\n            }\n            'DisableCopilot' {\n                # Also remove the app package for Copilot\n                RemoveApps 'Microsoft.Copilot'\n            }\n            'DisableWidgets' {\n                # Also remove the app package for Widgets\n                RemoveApps 'Microsoft.StartExperiencesApp'\n            }\n        }\n        return\n    }\n    \n    # Handle features without RegistryKey or with special logic\n    switch ($paramKey) {\n        'RemoveApps' {\n            Write-Host \"> Removing selected apps for $(GetFriendlyTargetUserName)...\"\n            $appsList = GenerateAppsList\n\n            if ($appsList.Count -eq 0) {\n                Write-Host \"No valid apps were selected for removal\" -ForegroundColor Yellow\n                Write-Host \"\"\n                return\n            }\n\n            Write-Host \"$($appsList.Count) apps selected for removal\"\n            RemoveApps $appsList\n        }\n        'RemoveAppsCustom' {\n            Write-Host \"> Removing selected apps...\"\n            $appsList = LoadAppsFromFile $script:CustomAppsListFilePath\n\n            if ($appsList.Count -eq 0) {\n                Write-Host \"No valid apps were selected for removal\" -ForegroundColor Yellow\n                Write-Host \"\"\n                return\n            }\n\n            Write-Host \"$($appsList.Count) apps selected for removal\"\n            RemoveApps $appsList\n        }\n        'RemoveCommApps' {\n            $appsList = 'Microsoft.windowscommunicationsapps', 'Microsoft.People'\n            Write-Host \"> Removing Mail, Calendar and People apps...\"\n            RemoveApps $appsList\n            return\n        }\n        'RemoveW11Outlook' {\n            $appsList = 'Microsoft.OutlookForWindows'\n            Write-Host \"> Removing new Outlook for Windows app...\"\n            RemoveApps $appsList\n            return\n        }\n        'RemoveGamingApps' {\n            $appsList = 'Microsoft.GamingApp', 'Microsoft.XboxGameOverlay', 'Microsoft.XboxGamingOverlay'\n            Write-Host \"> Removing gaming related apps...\"\n            RemoveApps $appsList\n            return\n        }\n        'RemoveHPApps' {\n            $appsList = 'AD2F1837.HPAIExperienceCenter', 'AD2F1837.HPJumpStarts', 'AD2F1837.HPPCHardwareDiagnosticsWindows', 'AD2F1837.HPPowerManager', 'AD2F1837.HPPrivacySettings', 'AD2F1837.HPSupportAssistant', 'AD2F1837.HPSureShieldAI', 'AD2F1837.HPSystemInformation', 'AD2F1837.HPQuickDrop', 'AD2F1837.HPWorkWell', 'AD2F1837.myHP', 'AD2F1837.HPDesktopSupportUtilities', 'AD2F1837.HPQuickTouch', 'AD2F1837.HPEasyClean', 'AD2F1837.HPConnectedMusic', 'AD2F1837.HPFileViewer', 'AD2F1837.HPRegistration', 'AD2F1837.HPWelcome', 'AD2F1837.HPConnectedPhotopoweredbySnapfish', 'AD2F1837.HPPrinterControl'\n            Write-Host \"> Removing HP apps...\"\n            RemoveApps $appsList\n            return\n        }\n        \"EnableWindowsSandbox\" {\n            Write-Host \"> Enabling Windows Sandbox...\"\n            EnableWindowsFeature \"Containers-DisposableClientVM\"\n            Write-Host \"\"\n            return\n        }\n        \"EnableWindowsSubsystemForLinux\" {\n            Write-Host \"> Enabling Windows Subsystem for Linux...\"\n            EnableWindowsFeature \"VirtualMachinePlatform\"\n            EnableWindowsFeature \"Microsoft-Windows-Subsystem-Linux\"\n            Write-Host \"\"\n            return\n        }\n        'ClearStart' {\n            Write-Host \"> Removing all pinned apps from the start menu for user $(GetUserName)...\"\n            ReplaceStartMenu\n            Write-Host \"\"\n            return\n        }\n        'ReplaceStart' {\n            Write-Host \"> Replacing the start menu for user $(GetUserName)...\"\n            ReplaceStartMenu $script:Params.Item(\"ReplaceStart\")\n            Write-Host \"\"\n            return\n        }\n        'ClearStartAllUsers' {\n            ReplaceStartMenuForAllUsers\n            return\n        }\n        'ReplaceStartAllUsers' {\n            ReplaceStartMenuForAllUsers $script:Params.Item(\"ReplaceStartAllUsers\")\n            return\n        }\n        'DisableStoreSearchSuggestions' {\n            if ($script:Params.ContainsKey(\"Sysprep\")) {\n                Write-Host \"> Disabling Microsoft Store search suggestions in the start menu for all users...\"\n                DisableStoreSearchSuggestionsForAllUsers\n                Write-Host \"\"\n                return\n            }\n\n            Write-Host \"> Disabling Microsoft Store search suggestions for user $(GetUserName)...\"\n            DisableStoreSearchSuggestions\n            Write-Host \"\"\n            return\n        }\n    }\n}\n\n\n# Executes all selected parameters/features\nfunction ExecuteAllChanges {    \n    # Build list of actionable parameters (skip control params and data-only params)\n    $actionableKeys = @()\n    foreach ($paramKey in $script:Params.Keys) {\n        if ($script:ControlParams -contains $paramKey) { continue }\n        if ($paramKey -eq 'Apps') { continue }\n        if ($paramKey -eq 'CreateRestorePoint') { continue }\n        $actionableKeys += $paramKey\n    }\n    \n    $totalSteps = $actionableKeys.Count\n    if ($script:Params.ContainsKey(\"CreateRestorePoint\")) { $totalSteps++ }\n    $currentStep = 0\n    \n    # Create restore point if requested (CLI only - GUI handles this separately)\n    if ($script:Params.ContainsKey(\"CreateRestorePoint\")) {\n        $currentStep++\n        if ($script:ApplyProgressCallback) {\n            & $script:ApplyProgressCallback $currentStep $totalSteps \"Creating system restore point\"\n        }\n        Write-Host \"> Attempting to create a system restore point...\"\n        CreateSystemRestorePoint\n        Write-Host \"\"\n    }\n    \n    # Execute all parameters\n    foreach ($paramKey in $actionableKeys) {\n        if ($script:CancelRequested) { \n            return\n        }\n\n        $currentStep++\n        \n        # Get friendly name for the step\n        $stepName = $paramKey\n        if ($script:Features.ContainsKey($paramKey)) {\n            $feature = $script:Features[$paramKey]\n            if ($feature.ApplyText) {\n                # Prefer explicit ApplyText when provided\n                $stepName = $feature.ApplyText\n            } elseif ($feature.Label) {\n                # Fallback: construct a name from Action and Label, or just Label\n                if ($feature.Action) {\n                    $stepName = \"$($feature.Action) $($feature.Label)\"\n                } else {\n                    $stepName = $feature.Label\n                }\n            }\n        }\n        \n        if ($script:ApplyProgressCallback) {\n            & $script:ApplyProgressCallback $currentStep $totalSteps $stepName\n        }\n        \n        ExecuteParameter -paramKey $paramKey\n    }\n}"
  },
  {
    "path": "Scripts/Features/ImportRegistryFile.ps1",
    "content": "# Import & execute regfile\nfunction ImportRegistryFile {\n    param (\n        $message,\n        $path\n    )\n\n    Write-Host $message\n\n    $usesOfflineHive = $script:Params.ContainsKey(\"Sysprep\") -or $script:Params.ContainsKey(\"User\")\n    $regFilePath = if ($usesOfflineHive) {\n        \"$script:RegfilesPath\\Sysprep\\$path\"\n    }\n    else {\n        \"$script:RegfilesPath\\$path\"\n    }\n\n    if (-not (Test-Path $regFilePath)) {\n        $errorMessage = \"Unable to find registry file: $path ($regFilePath)\"\n        Write-Host \"Error: $errorMessage\" -ForegroundColor Red\n        Write-Host \"\"\n        throw $errorMessage\n    }\n\n    # Reset exit code before running reg.exe for reliable success detection\n    $global:LASTEXITCODE = 0\n\n    if ($usesOfflineHive) {\n        # Sysprep targets Default user, User targets the specified user\n        $hiveDatPath = if ($script:Params.ContainsKey(\"Sysprep\")) {\n            GetUserDirectory -userName \"Default\" -fileName \"NTUSER.DAT\"\n        } else {\n            GetUserDirectory -userName $script:Params.Item(\"User\") -fileName \"NTUSER.DAT\"\n        }\n\n        $regResult = Invoke-NonBlocking -ScriptBlock {\n            param($hivePath, $targetRegFilePath)\n            $result = @{\n                Output = @()\n                ExitCode = 0\n                Error = $null\n            }\n\n            try {\n                $global:LASTEXITCODE = 0\n                reg load \"HKU\\Default\" $hivePath | Out-Null\n                $loadExitCode = $LASTEXITCODE\n\n                if ($loadExitCode -ne 0) {\n                    throw \"Failed to load user hive at '$hivePath' (exit code: $loadExitCode)\"\n                }\n\n                $output = reg import $targetRegFilePath 2>&1\n                $importExitCode = $LASTEXITCODE\n\n                if ($output) {\n                    $result.Output = @($output)\n                }\n                $result.ExitCode = $importExitCode\n\n                if ($importExitCode -ne 0) {\n                    throw \"Registry import failed with exit code $importExitCode for '$targetRegFilePath'\"\n                }\n            }\n            catch {\n                $result.Error = $_.Exception.Message\n                $result.ExitCode = if ($LASTEXITCODE -ne 0) { $LASTEXITCODE } else { 1 }\n            }\n            finally {\n                $global:LASTEXITCODE = 0\n                reg unload \"HKU\\Default\" | Out-Null\n                $unloadExitCode = $LASTEXITCODE\n                if ($unloadExitCode -ne 0 -and -not $result.Error) {\n                    $result.Error = \"Failed to unload temporary hive HKU\\\\Default (exit code: $unloadExitCode)\"\n                    $result.ExitCode = $unloadExitCode\n                }\n            }\n\n            return $result\n        } -ArgumentList @($hiveDatPath, $regFilePath)\n    }\n    else {\n        $regResult = Invoke-NonBlocking -ScriptBlock {\n            param($targetRegFilePath)\n            $global:LASTEXITCODE = 0\n            $output = reg import $targetRegFilePath 2>&1\n            return @{ Output = @($output); ExitCode = $LASTEXITCODE; Error = $null }\n        } -ArgumentList $regFilePath\n    }\n\n    $regOutput = @($regResult.Output)\n    $hasSuccess = ($regResult.ExitCode -eq 0) -and -not $regResult.Error\n    \n    if ($regOutput) {\n        foreach ($line in $regOutput) {\n            $lineText = if ($line -is [System.Management.Automation.ErrorRecord]) { $line.Exception.Message } else { $line.ToString() }\n            if ($lineText -and $lineText.Length -gt 0) {\n                if ($hasSuccess) {\n                    Write-Host $lineText\n                }\n                else {\n                    Write-Host $lineText -ForegroundColor Red\n                }\n            }\n        }\n    }\n\n    if (-not $hasSuccess) {\n        $details = if ($regResult.Error) { $regResult.Error } else { \"Exit code: $($regResult.ExitCode)\" }\n        $errorMessage = \"Failed importing registry file '$path'. $details\"\n        Write-Host $errorMessage -ForegroundColor Red\n        Write-Host \"\"\n        throw $errorMessage\n    }\n\n    Write-Host \"\"\n}"
  },
  {
    "path": "Scripts/Features/ReplaceStartMenu.ps1",
    "content": "# Replace the startmenu for all users, when using the default startmenuTemplate this clears all pinned apps\n# Credit: https://lazyadmin.nl/win-11/customize-windows-11-start-menu-layout/\nfunction ReplaceStartMenuForAllUsers {\n    param (\n        $startMenuTemplate = \"$script:AssetsPath/Start/start2.bin\"\n    )\n\n    Write-Host \"> Removing all pinned apps from the start menu for all users...\"\n\n    # Check if template bin file exists\n    if (-not (Test-Path $startMenuTemplate)) {\n        Write-Host \"Error: Unable to clear start menu, start2.bin file missing from script folder\" -ForegroundColor Red\n        Write-Host \"\"\n        return\n    }\n\n    # Get path to start menu file for all users\n    $userPathString = GetUserDirectory -userName \"*\" -fileName \"AppData\\Local\\Packages\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\LocalState\"\n    $usersStartMenuPaths = get-childitem -path $userPathString\n\n    # Go through all users and replace the start menu file\n    ForEach ($startMenuPath in $usersStartMenuPaths) {\n        ReplaceStartMenu $startMenuTemplate \"$($startMenuPath.Fullname)\\start2.bin\"\n    }\n\n    # Also replace the start menu file for the default user profile\n    $defaultStartMenuPath = GetUserDirectory -userName \"Default\" -fileName \"AppData\\Local\\Packages\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\LocalState\" -exitIfPathNotFound $false\n\n    # Create folder if it doesn't exist\n    if (-not (Test-Path $defaultStartMenuPath)) {\n        new-item $defaultStartMenuPath -ItemType Directory -Force | Out-Null\n        Write-Host \"Created LocalState folder for default user profile\"\n    }\n\n    # Copy template to default profile\n    Copy-Item -Path $startMenuTemplate -Destination $defaultStartMenuPath -Force\n    Write-Host \"Replaced start menu for the default user profile\"\n    Write-Host \"\"\n}\n\n\n# Replace the startmenu for all users, when using the default startmenuTemplate this clears all pinned apps\n# Credit: https://lazyadmin.nl/win-11/customize-windows-11-start-menu-layout/\nfunction ReplaceStartMenu {\n    param (\n        $startMenuTemplate = \"$script:AssetsPath/Start/start2.bin\",\n        $startMenuBinFile = \"$env:LOCALAPPDATA\\Packages\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\LocalState\\start2.bin\"\n    )\n\n    # Change path to correct user if a user was specified\n    if ($script:Params.ContainsKey(\"User\")) {\n        $startMenuBinFile = GetUserDirectory -userName \"$(GetUserName)\" -fileName \"AppData\\Local\\Packages\\Microsoft.Windows.StartMenuExperienceHost_cw5n1h2txyewy\\LocalState\\start2.bin\" -exitIfPathNotFound $false\n    }\n\n    # Check if template bin file exists\n    if (-not (Test-Path $startMenuTemplate)) {\n        Write-Host \"Error: Unable to replace start menu, template file not found\" -ForegroundColor Red\n        return\n    }\n\n    if ([IO.Path]::GetExtension($startMenuTemplate) -ne \".bin\" ) {\n        Write-Host \"Error: Unable to replace start menu, template file is not a valid .bin file\" -ForegroundColor Red\n        return\n    }\n\n    $userName = [regex]::Match($startMenuBinFile, '(?:Users\\\\)([^\\\\]+)(?:\\\\AppData)').Groups[1].Value\n\n    $backupBinFile = $startMenuBinFile + \".bak\"\n\n    if (Test-Path $startMenuBinFile) {\n        # Backup current start menu file\n        Move-Item -Path $startMenuBinFile -Destination $backupBinFile -Force\n    }\n    else {\n        Write-Host \"Unable to find original start2.bin file for user $userName, no backup was created for this user\" -ForegroundColor Yellow\n        New-Item -ItemType File -Path $startMenuBinFile -Force\n    }\n\n    # Copy template file\n    Copy-Item -Path $startMenuTemplate -Destination $startMenuBinFile -Force\n\n    Write-Host \"Replaced start menu for user $userName\"\n}"
  },
  {
    "path": "Scripts/Features/RestartExplorer.ps1",
    "content": "# Restart the Windows Explorer process\nfunction RestartExplorer {\n    Write-Host \"> Attempting to restart the Windows Explorer process to apply all changes...\"\n    \n    if ($script:Params.ContainsKey(\"Sysprep\") -or $script:Params.ContainsKey(\"User\") -or $script:Params.ContainsKey(\"NoRestartExplorer\")) {\n        Write-Host \"Explorer process restart was skipped, please manually reboot your PC to apply all changes\" -ForegroundColor Yellow\n        return\n    }\n\n    foreach ($paramKey in $script:Params.Keys) {\n        if ($script:Features.ContainsKey($paramKey) -and $script:Features[$paramKey].RequiresReboot -eq $true) {\n            $feature = $script:Features[$paramKey]\n            Write-Host \"Warning: '$($feature.Action) $($feature.Label)' requires a reboot to take full effect\" -ForegroundColor Yellow\n        }\n    }\n\n    # Only restart if the powershell process matches the OS architecture.\n    # Restarting explorer from a 32bit PowerShell window will fail on a 64bit OS\n    if ([Environment]::Is64BitProcess -eq [Environment]::Is64BitOperatingSystem) {\n        Write-Host \"Restarting the Windows Explorer process... (This may cause your screen to flicker)\"\n        Stop-Process -processName: Explorer -Force\n    }\n    else {\n        Write-Host \"Unable to restart Windows Explorer process, please manually reboot your PC to apply all changes\" -ForegroundColor Yellow\n    }\n}"
  },
  {
    "path": "Scripts/FileIO/LoadAppPresetsFromJson.ps1",
    "content": "# Read Apps.json and return the list of preset objects (Name + AppIds).\n# Returns an empty array if the file cannot be read or contains no presets.\nfunction LoadAppPresetsFromJson {\n    try {\n        $jsonContent = Get-Content -Path $script:AppsListFilePath -Raw | ConvertFrom-Json\n    }\n    catch {\n        Write-Warning \"Failed to read Apps.json: $_\"\n        return @()\n    }\n\n    if (-not $jsonContent.Presets) {\n        return @()\n    }\n\n    return @($jsonContent.Presets | ForEach-Object {\n        [PSCustomObject]@{\n            Name   = $_.Name\n            AppIds = @($_.AppIds)\n        }\n    })\n}\n"
  },
  {
    "path": "Scripts/FileIO/LoadAppsDetailsFromJson.ps1",
    "content": "# Read Apps.json and return list of app objects with optional filtering\nfunction LoadAppsDetailsFromJson {\n    param (\n        [switch]$OnlyInstalled,\n        [string]$InstalledList = \"\",\n        [switch]$InitialCheckedFromJson\n    )\n\n    $apps = @()\n    try {\n        $jsonContent = Get-Content -Path $script:AppsListFilePath -Raw | ConvertFrom-Json\n    }\n    catch {\n        Write-Error \"Failed to read Apps.json: $_\"\n        return $apps\n    }\n\n    foreach ($appData in $jsonContent.Apps) {\n        $appId = $appData.AppId.Trim()\n        if ($appId.length -eq 0) { continue }\n\n        if ($OnlyInstalled) {\n            if (-not ($InstalledList -like (\"*$appId*\")) -and -not (Get-AppxPackage -Name $appId)) {\n                continue\n            }\n            if (($appId -eq \"Microsoft.Edge\") -and -not ($InstalledList -like \"* Microsoft.Edge *\")) {\n                continue\n            }\n        }\n\n        $friendlyName = if ($appData.FriendlyName) { $appData.FriendlyName } else { $appId }\n        $displayName = if ($appData.FriendlyName) { \"$($appData.FriendlyName) ($appId)\" } else { $appId }\n        $isChecked = if ($InitialCheckedFromJson) { $appData.SelectedByDefault } else { $false }\n\n        $apps += [PSCustomObject]@{\n            AppId = $appId\n            FriendlyName = $friendlyName\n            DisplayName = $displayName\n            IsChecked = $isChecked\n            Description = $appData.Description\n            SelectedByDefault = $appData.SelectedByDefault\n            Recommendation = $appData.Recommendation\n        }\n    }\n\n    return $apps\n}\n"
  },
  {
    "path": "Scripts/FileIO/LoadAppsFromFile.ps1",
    "content": "# Returns list of apps from the specified file, it trims the app names and removes any comments\nfunction LoadAppsFromFile {\n    param (\n        $appsFilePath\n    )\n\n    $appsList = @()\n\n    if (-not (Test-Path $appsFilePath)) {\n        return $appsList\n    }\n\n    try {\n        # Check if file is JSON or text format\n        if ($appsFilePath -like \"*.json\") {\n            # JSON file format\n            $jsonContent = Get-Content -Path $appsFilePath -Raw | ConvertFrom-Json\n            Foreach ($appData in $jsonContent.Apps) {\n                $appId = $appData.AppId.Trim()\n                $selectedByDefault = $appData.SelectedByDefault\n                if ($selectedByDefault -and $appId.length -gt 0) {\n                    $appsList += $appId\n                }\n            }\n        }\n        else {\n            # Legacy text file format\n            Foreach ($app in (Get-Content -Path $appsFilePath | Where-Object { $_ -notmatch '^#.*' -and $_ -notmatch '^\\s*$' } )) { \n                if (-not ($app.IndexOf('#') -eq -1)) {\n                    $app = $app.Substring(0, $app.IndexOf('#'))\n                }\n\n                $app = $app.Trim()\n                $appString = $app.Trim('*')\n                $appsList += $appString\n            }\n        }\n\n        return $appsList\n    } \n    catch {\n        Write-Error \"Unable to read apps list from file: $appsFilePath\"\n        AwaitKeyToExit\n    }\n}\n"
  },
  {
    "path": "Scripts/FileIO/LoadJsonFile.ps1",
    "content": "# Loads a JSON file from the specified path and returns the parsed object\n# Returns $null if the file doesn't exist or if parsing fails\nfunction LoadJsonFile {\n    param (\n        [string]$filePath,\n        [string]$expectedVersion = $null,\n        [switch]$optionalFile\n    )\n    \n    if (-not (Test-Path $filePath)) {\n        if (-not $optionalFile) {\n            Write-Error \"File not found: $filePath\"\n        }\n        return $null\n    }\n    \n    try {\n        $jsonContent = Get-Content -Path $filePath -Raw | ConvertFrom-Json\n        \n        # Validate version if specified\n        if ($expectedVersion -and $jsonContent.Version -and $jsonContent.Version -ne $expectedVersion) {\n            Write-Error \"$(Split-Path $filePath -Leaf) version mismatch (expected $expectedVersion, found $($jsonContent.Version))\"\n            return $null\n        }\n        \n        return $jsonContent\n    }\n    catch {\n        Write-Error \"Failed to parse JSON file: $filePath\"\n        return $null\n    }\n}\n"
  },
  {
    "path": "Scripts/FileIO/LoadSettings.ps1",
    "content": "# Loads settings from a JSON file and adds them to script params\nfunction LoadSettings {\n    param (\n        [string]$filePath,\n        [string]$expectedVersion = \"1.0\"\n    )\n    \n    $settingsJson = LoadJsonFile -filePath $filePath -expectedVersion $expectedVersion\n    \n    if (-not $settingsJson -or -not $settingsJson.Settings) {\n        throw \"Failed to load settings from $(Split-Path $filePath -Leaf)\"\n    }\n\n    # Get current Windows build version\n    $WinVersion = Get-ItemPropertyValue 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion' CurrentBuild\n    \n    foreach ($setting in $settingsJson.Settings) {\n        if ($setting.Value -eq $false) {\n            continue\n        }\n\n        $feature = $script:Features[$setting.Name]\n\n        # Check version and feature compatibility using Features.json\n        if (($feature.MinVersion -and $WinVersion -lt $feature.MinVersion) -or ($feature.MaxVersion -and $WinVersion -gt $feature.MaxVersion) -or ($feature.FeatureId -eq 'DisableModernStandbyNetworking' -and (-not $script:ModernStandbySupported))) {\n           continue\n        }\n        \n        AddParameter $setting.Name $setting.Value\n    }\n}\n"
  },
  {
    "path": "Scripts/FileIO/SaveCustomAppsListToFile.ps1",
    "content": "# Saves the provided appsList to the CustomAppsList file\nfunction SaveCustomAppsListToFile {\n    param (\n        $appsList\n    )\n\n    $script:SelectedApps = $appsList\n\n    # Create file that stores selected apps if it doesn't exist\n    if (-not (Test-Path $script:CustomAppsListFilePath)) {\n        $null = New-Item $script:CustomAppsListFilePath -ItemType File\n    }\n\n    Set-Content -Path $script:CustomAppsListFilePath -Value $script:SelectedApps\n}\n"
  },
  {
    "path": "Scripts/FileIO/SaveSettings.ps1",
    "content": "# Saves the current settings, excluding control parameters, to 'LastUsedSettings.json' file\nfunction SaveSettings {\n    $settings = @{\n        \"Version\" = \"1.0\"\n        \"Settings\" = @()\n    }\n    \n    foreach ($param in $script:Params.Keys) {\n        if ($script:ControlParams -notcontains $param) {\n            $value = $script:Params[$param]\n\n            $settings.Settings += @{\n                \"Name\" = $param\n                \"Value\" = $value\n            }\n        }\n    }\n\n    try {\n        $settings | ConvertTo-Json -Depth 10 | Set-Content $script:SavedSettingsFilePath\n    }\n    catch {\n        Write-Output \"\"\n        Write-Host \"Error: Failed to save settings to LastUsedSettings.json file\" -ForegroundColor Red\n    }\n}"
  },
  {
    "path": "Scripts/FileIO/ValidateAppslist.ps1",
    "content": "# Returns a validated list of apps based on the provided appsList and the supported apps from Apps.json\nfunction ValidateAppslist {\n    param (\n        $appsList\n    )\n\n    $supportedAppsList = (LoadAppsDetailsFromJson | ForEach-Object { $_.AppId })\n    $validatedAppsList = @()\n\n    # Validate provided appsList against supportedAppsList\n    Foreach ($app in $appsList) {\n        $app = $app.Trim()\n        $appString = $app.Trim('*')\n\n        if ($supportedAppsList -notcontains $appString) {\n            Write-Host \"Removal of app '$appString' is not supported and will be skipped\" -ForegroundColor Yellow\n            continue\n        }\n\n        $validatedAppsList += $appString\n    }\n\n    return $validatedAppsList\n}\n"
  },
  {
    "path": "Scripts/GUI/ApplySettingsToUiControls.ps1",
    "content": "# Applies settings from a JSON object to UI controls (checkboxes and comboboxes)\n# Used by LoadDefaultsBtn and LoadLastUsedBtn in the UI\nfunction ApplySettingsToUiControls {\n    param (\n        $window,\n        $settingsJson,\n        $uiControlMappings\n    )\n    \n    if (-not $settingsJson -or -not $settingsJson.Settings) {\n        return $false\n    }\n    \n    if (-not $uiControlMappings) {\n        return $true\n    }\n\n    # Build control cache and reverse index (featureId -> control info) in a single pass\n    $controlCache = @{}\n    $featureIdIndex = @{}\n\n    foreach ($comboName in $uiControlMappings.Keys) {\n        $control = $window.FindName($comboName)\n        if (-not $control) { continue }\n        $controlCache[$comboName] = $control\n\n        $mapping = $uiControlMappings[$comboName]\n        if ($mapping.Type -eq 'group') {\n            $i = 1\n            foreach ($val in $mapping.Values) {\n                foreach ($fid in $val.FeatureIds) {\n                    $featureIdIndex[$fid] = @{ ComboName = $comboName; Control = $control; Index = $i; MappingType = 'group' }\n                }\n                $i++\n            }\n        }\n        elseif ($mapping.Type -eq 'feature') {\n            $featureIdIndex[$mapping.FeatureId] = @{ ComboName = $comboName; Control = $control; MappingType = 'feature' }\n        }\n\n        # Reset control to default state\n        if ($control -is [System.Windows.Controls.CheckBox]) {\n            $control.IsChecked = $false\n        }\n        elseif ($control -is [System.Windows.Controls.ComboBox]) {\n            $control.SelectedIndex = 0\n        }\n    }\n    \n    # Apply settings using O(1) lookups\n    foreach ($setting in $settingsJson.Settings) {\n        if ($setting.Value -ne $true) { continue }\n        if ($setting.Name -eq 'CreateRestorePoint') { continue }\n\n        $entry = $featureIdIndex[$setting.Name]\n        if (-not $entry) { continue }\n\n        $control = $entry.Control\n        if (-not $control -or $control.Visibility -ne 'Visible') { continue }\n\n        if ($entry.MappingType -eq 'group') {\n            if ($control -is [System.Windows.Controls.ComboBox]) {\n                $control.SelectedIndex = $entry.Index\n            }\n        }\n        else {\n            if ($control -is [System.Windows.Controls.CheckBox]) {\n                $control.IsChecked = $true\n            }\n            elseif ($control -is [System.Windows.Controls.ComboBox]) {\n                $control.SelectedIndex = 1\n            }\n        }\n    }\n    \n    return $true\n}\n"
  },
  {
    "path": "Scripts/GUI/AttachShiftClickBehavior.ps1",
    "content": "# Attaches shift-click selection behavior to a checkbox in an apps panel\n# Parameters:\n#   - $checkbox: The checkbox to attach the behavior to\n#   - $appsPanel: The StackPanel containing checkbox items\n#   - $lastSelectedCheckboxRef: A reference to a variable storing the last clicked checkbox\n#   - $updateStatusCallback: Optional callback to update selection status\nfunction AttachShiftClickBehavior {\n    param (\n        [System.Windows.Controls.CheckBox]$checkbox,\n        [System.Windows.Controls.StackPanel]$appsPanel,\n        [ref]$lastSelectedCheckboxRef,\n        [scriptblock]$updateStatusCallback = $null\n    )\n\n    # Use a closure to capture the parameters\n    $checkbox.Add_PreviewMouseLeftButtonDown({\n        param(\n            $sender,\n            $e\n        )\n        \n        $isShiftPressed = [System.Windows.Input.Keyboard]::IsKeyDown([System.Windows.Input.Key]::LeftShift) -or \n                          [System.Windows.Input.Keyboard]::IsKeyDown([System.Windows.Input.Key]::RightShift)\n        \n        if ($isShiftPressed -and $null -ne $lastSelectedCheckboxRef.Value) {\n            # Get all visible checkboxes in the panel\n            $visibleCheckboxes = @()\n            foreach ($child in $appsPanel.Children) {\n                if ($child -is [System.Windows.Controls.CheckBox] -and $child.Visibility -eq 'Visible') {\n                    $visibleCheckboxes += $child\n                }\n            }\n\n            # Find indices of the last selected and current checkbox\n            $lastIndex = -1\n            $currentIndex = -1\n\n            for ($i = 0; $i -lt $visibleCheckboxes.Count; $i++) {\n                if ($visibleCheckboxes[$i] -eq $lastSelectedCheckboxRef.Value) {\n                    $lastIndex = $i\n                }\n                if ($visibleCheckboxes[$i] -eq $sender) {\n                    $currentIndex = $i\n                }\n            }\n\n            if ($lastIndex -ge 0 -and $currentIndex -ge 0 -and $lastIndex -ne $currentIndex) {\n                $startIndex = [Math]::Min($lastIndex, $currentIndex)\n                $endIndex = [Math]::Max($lastIndex, $currentIndex)\n\n                $shouldDeselect = $sender.IsChecked\n\n                # Set all checkboxes in the range to the appropriate state\n                for ($i = $startIndex; $i -le $endIndex; $i++) {\n                    $visibleCheckboxes[$i].IsChecked = -not $shouldDeselect\n                }\n\n                if ($updateStatusCallback) {\n                    & $updateStatusCallback\n                }\n\n                # Mark the event as handled to prevent the default toggle behavior\n                $e.Handled = $true\n                return\n            }\n        }\n\n        # Update the last selected checkbox reference for next time\n        $lastSelectedCheckboxRef.Value = $sender\n    }.GetNewClosure())\n}\n"
  },
  {
    "path": "Scripts/GUI/GetSystemUsesDarkMode.ps1",
    "content": "# Checks if the system is set to use dark mode for apps\nfunction GetSystemUsesDarkMode {\n    try {\n        return (Get-ItemProperty -Path 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize' -Name 'AppsUseLightTheme').AppsUseLightTheme -eq 0\n    }\n    catch {\n        return $false\n    }\n}\n"
  },
  {
    "path": "Scripts/GUI/SetWindowThemeResources.ps1",
    "content": "# Sets resource colors for a WPF window based on dark mode preference\nfunction SetWindowThemeResources {\n    param (\n        $window,\n        [bool]$usesDarkMode\n    )\n\n    if ($usesDarkMode) {\n        $window.Resources.Add(\"BgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#202020\")))\n        $window.Resources.Add(\"FgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#FFFFFF\")))\n        $window.Resources.Add(\"CardBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#2b2b2b\")))\n        $window.Resources.Add(\"BorderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#404040\")))\n        $window.Resources.Add(\"ButtonBorderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#404040\")))\n        $window.Resources.Add(\"CheckBoxBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#272727\")))\n        $window.Resources.Add(\"CheckBoxBorderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#808080\")))\n        $window.Resources.Add(\"CheckBoxHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#343434\")))\n        $window.Resources.Add(\"ComboBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#373737\")))\n        $window.Resources.Add(\"ComboHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#434343\")))\n        $window.Resources.Add(\"ComboItemBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#2c2c2c\")))\n        $window.Resources.Add(\"ComboItemHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#383838\")))\n        $window.Resources.Add(\"ComboItemSelectedColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#343434\")))\n        $window.Resources.Add(\"AccentColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#FFD700\")))\n        $window.Resources.Add(\"ButtonDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#434343\")))\n        $window.Resources.Add(\"ButtonTextDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#989898\")))\n        $window.Resources.Add(\"SecondaryButtonBg\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#393939\")))\n        $window.Resources.Add(\"SecondaryButtonHover\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#2a2a2a\")))\n        $window.Resources.Add(\"SecondaryButtonPressed\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#1e1e1e\")))\n        $window.Resources.Add(\"SecondaryButtonDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#3b3b3b\")))\n        $window.Resources.Add(\"SecondaryButtonTextDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#787878\")))\n        $window.Resources.Add(\"InputFocusColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#1f1f1f\")))\n        $window.Resources.Add(\"ScrollBarThumbColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#3d3d3d\")))\n        $window.Resources.Add(\"ScrollBarThumbHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#4b4b4b\")))\n        $window.Resources.Add(\"TitlebarButtonHover\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#2d2d2d\")))\n        $window.Resources.Add(\"TitlebarButtonPressed\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#292929\")))\n        $window.Resources.Add(\"AppIdColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#afafaf\")))\n        $window.Resources.Add(\"SearchHighlightColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#4A4A2A\")))\n        $window.Resources.Add(\"SearchHighlightActiveColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#8A7000\")))\n        $window.Resources.Add(\"TableHeaderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#333333\")))\n    }\n    else {\n        $window.Resources.Add(\"BgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f3f3f3\")))\n        $window.Resources.Add(\"FgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#000000\")))\n        $window.Resources.Add(\"CardBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#fbfbfb\")))\n        $window.Resources.Add(\"BorderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#ededed\")))\n        $window.Resources.Add(\"ButtonBorderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#d3d3d3\")))\n        $window.Resources.Add(\"CheckBoxBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f5f5f5\")))\n        $window.Resources.Add(\"CheckBoxBorderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#898989\")))\n        $window.Resources.Add(\"CheckBoxHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#ececec\")))\n        $window.Resources.Add(\"ComboBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#FFFFFF\")))\n        $window.Resources.Add(\"ComboHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f8f8f8\")))\n        $window.Resources.Add(\"ComboItemBgColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f9f9f9\")))\n        $window.Resources.Add(\"ComboItemHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f0f0f0\")))\n        $window.Resources.Add(\"ComboItemSelectedColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f3f3f3\")))\n        $window.Resources.Add(\"AccentColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#ffae00\")))\n        $window.Resources.Add(\"ButtonDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#bfbfbf\")))\n        $window.Resources.Add(\"ButtonTextDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#ffffff\")))\n        $window.Resources.Add(\"SecondaryButtonBg\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#fbfbfb\")))\n        $window.Resources.Add(\"SecondaryButtonHover\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f6f6f6\")))\n        $window.Resources.Add(\"SecondaryButtonPressed\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f0f0f0\")))\n        $window.Resources.Add(\"SecondaryButtonDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#f7f7f7\")))\n        $window.Resources.Add(\"SecondaryButtonTextDisabled\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#b7b7b7\")))\n        $window.Resources.Add(\"InputFocusColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#fbfbfb\")))\n        $window.Resources.Add(\"ScrollBarThumbColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#b9b9b9\")))\n        $window.Resources.Add(\"ScrollBarThumbHoverColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#8b8b8b\")))\n        $window.Resources.Add(\"TitlebarButtonHover\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#e1e1e1\")))\n        $window.Resources.Add(\"TitlebarButtonPressed\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#e6e6e6\")))\n        $window.Resources.Add(\"AppIdColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#666666\")))\n        $window.Resources.Add(\"SearchHighlightColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#FFF4CE\")))\n        $window.Resources.Add(\"SearchHighlightActiveColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#FFD966\")))\n        $window.Resources.Add(\"TableHeaderColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#ffffff\")))\n    }\n\n    $window.Resources.Add(\"ButtonBg\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#0067c0\")))\n    $window.Resources.Add(\"ButtonHover\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#1E88E5\")))\n    $window.Resources.Add(\"ButtonPressed\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#3284cc\")))\n    $window.Resources.Add(\"CloseHover\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#c42b1c\")))\n    $window.Resources.Add(\"InformationIconColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#0078D4\")))\n    $window.Resources.Add(\"WarningIconColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#FFB900\")))\n    $window.Resources.Add(\"ErrorIconColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#E81123\")))\n    $window.Resources.Add(\"QuestionIconColor\", [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#0078D4\")))\n\n    # Load and merge shared styles\n    if ($script:SharedStylesSchema -and (Test-Path $script:SharedStylesSchema)) {\n        $sharedXaml = Get-Content -Path $script:SharedStylesSchema -Raw\n        $sharedReader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($sharedXaml))\n        try {\n            $sharedDict = [System.Windows.Markup.XamlReader]::Load($sharedReader)\n            $window.Resources.MergedDictionaries.Add($sharedDict)\n        }\n        finally {\n            $sharedReader.Close()\n        }\n    }\n}\n"
  },
  {
    "path": "Scripts/GUI/Show-AboutDialog.ps1",
    "content": "function Show-AboutDialog {\n    param (\n        [Parameter(Mandatory=$false)]\n        [System.Windows.Window]$Owner = $null\n    )\n    \n    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null\n    \n    $usesDarkMode = GetSystemUsesDarkMode\n    \n    # Determine owner window\n    $ownerWindow = if ($Owner) { $Owner } else { $script:GuiWindow }\n    \n    # Show overlay if owner window exists\n    $overlay = $null\n    if ($ownerWindow) {\n        try {\n            $overlay = $ownerWindow.FindName('ModalOverlay')\n            if ($overlay) {\n                $ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })\n            }\n        }\n        catch { }\n    }\n    \n    # Load XAML from file\n    $xaml = Get-Content -Path $script:AboutWindowSchema -Raw\n    $reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))\n    try {\n        $aboutWindow = [System.Windows.Markup.XamlReader]::Load($reader)\n    }\n    finally {\n        $reader.Close()\n    }\n    \n    # Set owner to owner window if it exists\n    if ($ownerWindow) {\n        try {\n            $aboutWindow.Owner = $ownerWindow\n        }\n        catch { }\n    }\n    \n    # Apply theme resources\n    SetWindowThemeResources -window $aboutWindow -usesDarkMode $usesDarkMode\n    \n    # Get UI elements\n    $titleBar = $aboutWindow.FindName('TitleBar')\n    $versionText = $aboutWindow.FindName('VersionText')\n    $projectLink = $aboutWindow.FindName('ProjectLink')\n    $kofiLink = $aboutWindow.FindName('KofiLink')\n    $closeButton = $aboutWindow.FindName('CloseButton')\n    \n    # Set version\n    $versionText.Text = $script:Version\n    \n    # Title bar drag to move window\n    $titleBar.Add_MouseLeftButtonDown({\n        $aboutWindow.DragMove()\n    })\n    \n    # Project link click handler\n    $projectLink.Add_MouseLeftButtonDown({\n        Start-Process \"https://github.com/Raphire/Win11Debloat\"\n    })\n    \n    # Ko-fi link click handler\n    $kofiLink.Add_MouseLeftButtonDown({\n        Start-Process \"https://ko-fi.com/raphire\"\n    })\n    \n    # Close button handler\n    $closeButton.Add_Click({\n        $aboutWindow.Close()\n    })\n    \n    # Handle Escape key to close\n    $aboutWindow.Add_KeyDown({\n        param($sender, $e)\n        if ($e.Key -eq 'Escape') {\n            $aboutWindow.Close()\n        }\n    })\n    \n    # Show dialog\n    $aboutWindow.ShowDialog() | Out-Null\n    \n    # Hide overlay after dialog closes\n    if ($overlay) {\n        try {\n            $ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })\n        }\n        catch { }\n    }\n}"
  },
  {
    "path": "Scripts/GUI/Show-AppSelectionWindow.ps1",
    "content": "# Shows application selection window that allows the user to select what apps they want to remove or keep\nfunction Show-AppSelectionWindow {\n    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null\n\n    $usesDarkMode = GetSystemUsesDarkMode\n    \n    # Show overlay if main window exists\n    $overlay = $null\n    if ($script:GuiWindow) {\n        try {\n            $overlay = $script:GuiWindow.FindName('ModalOverlay')\n            if ($overlay) {\n                $script:GuiWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })\n            }\n        }\n        catch { }\n    }\n\n    # Load XAML from file\n    $xaml = Get-Content -Path $script:AppSelectionSchema -Raw\n    $reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))\n    try {\n        $window = [System.Windows.Markup.XamlReader]::Load($reader)\n    }\n    finally {\n        $reader.Close()\n    }\n    \n    # Set owner to main window if it exists\n    if ($script:GuiWindow) {\n        try {\n            $window.Owner = $script:GuiWindow\n        }\n        catch { }\n    }\n\n    SetWindowThemeResources -window $window -usesDarkMode $usesDarkMode\n\n    $appsPanel = $window.FindName('AppsPanel')\n    $checkAllBox = $window.FindName('CheckAllBox')\n    $onlyInstalledBox = $window.FindName('OnlyInstalledBox')\n    $confirmBtn = $window.FindName('ConfirmBtn')\n    $loadingIndicator = $window.FindName('LoadingAppsIndicator')\n    $titleBar = $window.FindName('TitleBar')\n    \n    # Track the last selected checkbox for shift-click range selection\n    $script:AppSelectionWindowLastSelectedCheckbox = $null\n\n    # Loads apps into the apps UI\n    function LoadApps {\n        # Show loading indicator\n        $loadingIndicator.Visibility = 'Visible'\n        $window.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{})\n\n        $appsPanel.Children.Clear()\n        $listOfApps = \"\"\n\n        if ($onlyInstalledBox.IsChecked -and ($script:WingetInstalled -eq $true)) {\n            # Attempt to get a list of installed apps via WinGet, times out after 10 seconds\n            $listOfApps = GetInstalledAppsViaWinget -TimeOut 10\n            if (-not $listOfApps) {\n                # Show error that the script was unable to get list of apps from WinGet\n                Show-MessageBox -Message 'Unable to load list of installed apps via WinGet.' -Title 'Error' -Button 'OK' -Icon 'Error' -Owner $window | Out-Null\n                $onlyInstalledBox.IsChecked = $false\n            }\n        }\n\n        $appsToAdd = LoadAppsDetailsFromJson -OnlyInstalled:$onlyInstalledBox.IsChecked -InstalledList $listOfApps -InitialCheckedFromJson:$true\n\n        # Reset the last selected checkbox when loading a new list\n        $script:AppSelectionWindowLastSelectedCheckbox = $null\n\n        # Sort apps alphabetically and add to panel\n        $appsToAdd | Sort-Object -Property DisplayName | ForEach-Object {\n            $checkbox = New-Object System.Windows.Controls.CheckBox\n            $checkbox.Content = $_.DisplayName\n            $checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $_.DisplayName)\n            $checkbox.Tag = $_.AppId\n            $checkbox.IsChecked = $_.IsChecked\n            $checkbox.ToolTip = $_.Description\n            $checkbox.Style = $window.Resources[\"AppsPanelCheckBoxStyle\"]\n            \n            # Attach shift-click behavior for range selection\n            AttachShiftClickBehavior -checkbox $checkbox -appsPanel $appsPanel -lastSelectedCheckboxRef ([ref]$script:AppSelectionWindowLastSelectedCheckbox)\n            \n            $appsPanel.Children.Add($checkbox) | Out-Null\n        }\n\n        # Hide loading indicator\n        $loadingIndicator.Visibility = 'Collapsed'\n    }\n\n    # Event handlers\n    $titleBar.Add_MouseLeftButtonDown({\n        $window.DragMove()\n    })\n\n    $checkAllBox.Add_Checked({\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox]) {\n                $child.IsChecked = $true\n            }\n        }\n    })\n\n    $checkAllBox.Add_Unchecked({\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox]) {\n                $child.IsChecked = $false\n            }\n        }\n    })\n\n    $onlyInstalledBox.Add_Checked({ LoadApps })\n    $onlyInstalledBox.Add_Unchecked({ LoadApps })\n\n    $confirmBtn.Add_Click({\n        $selectedApps = @()\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox] -and $child.IsChecked) {\n                $selectedApps += $child.Tag\n            }\n        }\n\n        # Close form without saving if no apps were selected\n        if ($selectedApps.Count -eq 0) {\n            $window.Close()\n            return\n        }\n\n        if ($selectedApps -contains \"Microsoft.WindowsStore\" -and -not $Silent) {\n            $result = Show-MessageBox -Message 'Are you sure you wish to uninstall the Microsoft Store? This app cannot easily be reinstalled.' -Title 'Are you sure?' -Button 'YesNo' -Icon 'Warning' -Owner $window\n\n            if ($result -eq 'No') {\n                return\n            }\n        }\n\n        SaveCustomAppsListToFile -appsList $selectedApps\n\n        $window.DialogResult = $true\n    })\n\n    # Load apps after window is shown (allows UI to render first)\n    $window.Add_ContentRendered({ \n        $window.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{ LoadApps }) | Out-Null\n    })\n\n    # Show the window and return dialog result\n    $result = $window.ShowDialog()\n    \n    # Hide overlay after dialog closes\n    if ($overlay) {\n        try {\n            $script:GuiWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })\n        }\n        catch { }\n    }\n    \n    return $result\n}\n"
  },
  {
    "path": "Scripts/GUI/Show-ApplyModal.ps1",
    "content": "function Show-ApplyModal {\n    param (\n        [Parameter(Mandatory=$false)]\n        [System.Windows.Window]$Owner = $null,\n        [Parameter(Mandatory=$false)]\n        [bool]$RestartExplorer = $false\n    )\n    \n    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null\n\n    # P/Invoke helpers for forcing focus back after Explorer restart\n    if (-not ([System.Management.Automation.PSTypeName]'Win11Debloat.FocusHelper').Type) {\n        Add-Type -Namespace Win11Debloat -Name FocusHelper -MemberDefinition @'\n            [DllImport(\"user32.dll\")] public static extern bool SetForegroundWindow(IntPtr hWnd);\n            [DllImport(\"user32.dll\")] public static extern IntPtr GetForegroundWindow();\n            [DllImport(\"user32.dll\")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr lpdwProcessId);\n            [DllImport(\"user32.dll\")] public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);\n            [DllImport(\"kernel32.dll\")] public static extern uint GetCurrentThreadId();\n\n            public static void ForceActivate(IntPtr hwnd) {\n                IntPtr fg = GetForegroundWindow();\n                uint fgThread = GetWindowThreadProcessId(fg, IntPtr.Zero);\n                uint myThread = GetCurrentThreadId();\n                if (fgThread != myThread) AttachThreadInput(myThread, fgThread, true);\n                SetForegroundWindow(hwnd);\n                if (fgThread != myThread) AttachThreadInput(myThread, fgThread, false);\n            }\n'@\n    }\n    \n    $usesDarkMode = GetSystemUsesDarkMode\n    \n    # Determine owner window\n    $ownerWindow = if ($Owner) { $Owner } else { $script:GuiWindow }\n    \n    # Show overlay if owner window exists\n    $overlay = $null\n    if ($ownerWindow) {\n        try {\n            $overlay = $ownerWindow.FindName('ModalOverlay')\n            if ($overlay) {\n                $ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })\n            }\n        }\n        catch { }\n    }\n    \n    # Load XAML from file\n    $xaml = Get-Content -Path $script:ApplyChangesWindowSchema -Raw\n    $reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))\n    try {\n        $applyWindow = [System.Windows.Markup.XamlReader]::Load($reader)\n    }\n    finally {\n        $reader.Close()\n    }\n    \n    # Set owner to owner window if it exists\n    if ($ownerWindow) {\n        try {\n            $applyWindow.Owner = $ownerWindow\n        }\n        catch { }\n    }\n    \n    # Apply theme resources\n    SetWindowThemeResources -window $applyWindow -usesDarkMode $usesDarkMode\n    \n    # Get UI elements\n    $script:ApplyInProgressPanel = $applyWindow.FindName('ApplyInProgressPanel')\n    $script:ApplyCompletionPanel = $applyWindow.FindName('ApplyCompletionPanel')\n    $script:ApplyStepNameEl = $applyWindow.FindName('ApplyStepName')\n    $script:ApplyStepCounterEl = $applyWindow.FindName('ApplyStepCounter')\n    $script:ApplyProgressBarEl = $applyWindow.FindName('ApplyProgressBar')\n    $script:ApplyCompletionTitleEl = $applyWindow.FindName('ApplyCompletionTitle')\n    $script:ApplyCompletionMessageEl = $applyWindow.FindName('ApplyCompletionMessage')\n    $script:ApplyCompletionIconEl = $applyWindow.FindName('ApplyCompletionIcon')\n    $applyRebootPanel = $applyWindow.FindName('ApplyRebootPanel')\n    $applyRebootList = $applyWindow.FindName('ApplyRebootList')\n    $applyCloseBtn = $applyWindow.FindName('ApplyCloseBtn')\n    $applyKofiBtn = $applyWindow.FindName('ApplyKofiBtn')\n    $applyCancelBtn = $applyWindow.FindName('ApplyCancelBtn')\n    \n    # Initialize in-progress state\n    $script:ApplyInProgressPanel.Visibility = 'Visible'\n    $script:ApplyCompletionPanel.Visibility = 'Collapsed'\n    $script:ApplyStepNameEl.Text = \"Preparing...\"\n    $script:ApplyStepCounterEl.Text = \"Preparing...\"\n    $script:ApplyProgressBarEl.Value = 0\n    $script:ApplyModalInErrorState = $false\n    \n    # Set up progress callback for ExecuteAllChanges\n    $script:ApplyProgressCallback = {\n        param($currentStep, $totalSteps, $stepName)\n        $script:ApplyStepNameEl.Text = $stepName\n        $script:ApplyStepCounterEl.Text = \"Step $currentStep of $totalSteps\"\n        # Store current step/total in Tag properties for sub-step interpolation\n        $script:ApplyStepCounterEl.Tag = $currentStep\n        $script:ApplyProgressBarEl.Tag = $totalSteps\n        # Show progress at the start of each step (empty at step 1, full after last step completes)\n        $pct = if ($totalSteps -gt 0) { [math]::Round((($currentStep - 1) / $totalSteps) * 100) } else { 0 }\n        $script:ApplyProgressBarEl.Value = $pct\n        # Process pending window messages to keep UI responsive\n        DoEvents\n    }\n\n    # Sub-step callback updates step name and interpolates progress bar within the current step\n    $script:ApplySubStepCallback = {\n        param($subStepName, $subIndex, $subCount)\n        $script:ApplyStepNameEl.Text = $subStepName\n        # Interpolate progress bar between previous step and current step\n        $currentStep = [int]($script:ApplyStepCounterEl.Tag)\n        $totalSteps = [int]($script:ApplyProgressBarEl.Tag)\n        if ($totalSteps -gt 0 -and $subCount -gt 0) {\n            $baseProgress = ($currentStep - 1) / $totalSteps\n            $stepFraction = ($subIndex / $subCount) / $totalSteps\n            $script:ApplyProgressBarEl.Value = [math]::Round(($baseProgress + $stepFraction) * 100)\n        }\n        DoEvents\n    }\n    \n    # Run changes in background to keep UI responsive\n    $applyWindow.Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{\n        try {\n            ExecuteAllChanges\n            \n            # Restart explorer if requested\n            if ($RestartExplorer -and -not $script:CancelRequested) {\n                RestartExplorer\n                \n                # Wait for Explorer to finish relaunching, then reclaim focus.\n                Start-Sleep -Milliseconds 800\n                $applyWindow.Dispatcher.Invoke([action]{\n                    $hwnd = (New-Object System.Windows.Interop.WindowInteropHelper($applyWindow)).Handle\n                    [Win11Debloat.FocusHelper]::ForceActivate($hwnd)\n                })\n            }\n            \n            Write-Host \"\"\n            if ($script:CancelRequested) {\n                Write-Host \"Script execution was cancelled by the user. Some changes may not have been applied.\"\n            } else {\n                Write-Host \"All changes have been applied successfully!\"\n            }\n            \n            # Show completion state\n            $script:ApplyProgressBarEl.Value = 100\n            $script:ApplyInProgressPanel.Visibility = 'Collapsed'\n            $script:ApplyCompletionPanel.Visibility = 'Visible'\n            \n            if ($script:CancelRequested) {\n                $script:ApplyCompletionIconEl.Text = [char]0xE7BA\n                $script:ApplyCompletionIconEl.Foreground = [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#e8912d\"))\n                $script:ApplyCompletionTitleEl.Text = \"Cancelled\"\n                $script:ApplyCompletionMessageEl.Text = \"Script execution was cancelled by the user.\"\n            } else {\n                $script:ApplyCompletionTitleEl.Text = \"Changes Applied\"\n\n                # Show completion message with reboot instructions if any applied features require reboot\n                if ($RestartExplorer) {\n                    $rebootFeatures = @()\n                    foreach ($paramKey in $script:Params.Keys) {\n                        if ($script:Features.ContainsKey($paramKey) -and $script:Features[$paramKey].RequiresReboot -eq $true) {\n                            $feature = $script:Features[$paramKey]\n                            $rebootFeatures += \"$($feature.Action) $($feature.Label)\"\n                        }\n                    }\n\n                    if ($rebootFeatures.Count -gt 0) {\n                        foreach ($featureName in $rebootFeatures) {\n                            $tb = [System.Windows.Controls.TextBlock]::new()\n                            $tb.Text = \"$([char]0x2022) $featureName\"\n                            $tb.FontSize = 12\n                            $tb.SetResourceReference([System.Windows.Controls.TextBlock]::ForegroundProperty, 'FgColor')\n                            $tb.Opacity = 0.85\n                            $tb.Margin = [System.Windows.Thickness]::new(0, 2, 0, 0)\n                            $applyRebootList.Children.Add($tb) | Out-Null\n                        }\n                        $applyRebootPanel.Visibility = 'Visible'\n                    }\n                    else {\n                        $script:ApplyCompletionMessageEl.Text = \"Your clean system is ready. Thanks for using Win11Debloat!\"\n                    }\n                }\n            }\n            $applyWindow.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Render, [action]{})\n        }\n        catch {\n            Write-Host \"Error: $($_.Exception.Message)\"\n            $script:ApplyInProgressPanel.Visibility = 'Collapsed'\n            $script:ApplyCompletionPanel.Visibility = 'Visible'\n            $script:ApplyCompletionIconEl.Text = [char]0xEA39\n            $script:ApplyCompletionIconEl.Foreground = [System.Windows.Media.SolidColorBrush]::new([System.Windows.Media.ColorConverter]::ConvertFromString(\"#c42b1c\"))\n            $script:ApplyCompletionTitleEl.Text = \"Error\"\n            $script:ApplyCompletionMessageEl.Text = \"An error occurred while applying changes: $($_.Exception.Message)\"\n            \n            # Set error state to change Kofi button to report link\n            $script:ApplyModalInErrorState = $true\n\n            # Update Kofi button to be a report issue button\n            $applyKofiBtn.Content = $null\n            \n            $reportText = [System.Windows.Controls.TextBlock]::new()\n            $reportText.Text = 'Report a bug'\n            $reportText.VerticalAlignment = 'Center'\n            $reportText.FontSize = 14\n            $reportText.Margin = [System.Windows.Thickness]::new(0, 0, 0, 1)\n\n            $applyKofiBtn.Content = $reportText\n            \n            [System.Windows.Automation.AutomationProperties]::SetName($applyKofiBtn, 'Report a bug')\n            \n            $applyWindow.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Render, [action]{})\n        }\n        finally {\n            $script:ApplyProgressCallback = $null\n            $script:ApplySubStepCallback = $null\n        }\n    }) | Out-Null\n    \n    # Button handlers\n    $applyCloseBtn.Add_Click({\n        $applyWindow.Close()\n    })\n\n    $applyKofiBtn.Add_Click({\n        if ($script:ApplyModalInErrorState) {\n            Start-Process \"https://github.com/Raphire/Win11Debloat/issues/new\"\n        } else {\n            Start-Process \"https://ko-fi.com/raphire\"\n        }\n    })\n\n    $applyCancelBtn.Add_Click({\n        if ($script:ApplyCompletionPanel.Visibility -eq 'Visible') {\n            # Completion state - just close\n            $applyWindow.Close()\n        } else {\n            # In-progress state - request cancellation\n            $script:CancelRequested = $true\n        }\n    })\n    \n    # Show dialog\n    $applyWindow.ShowDialog() | Out-Null\n    \n    # Hide overlay after dialog closes\n    if ($overlay) {\n        try {\n            $ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })\n        }\n        catch { }\n    }\n}\n"
  },
  {
    "path": "Scripts/GUI/Show-Bubble.ps1",
    "content": "function Hide-Bubble {\n    param (\n        [Parameter(Mandatory=$false)]\n        [switch]$Immediate\n    )\n\n    if ($script:BubbleTimer) {\n        $script:BubbleTimer.Stop()\n        $script:BubbleTimer = $null\n    }\n\n    if (-not $script:BubblePopup) { return }\n\n    if ($Immediate -or -not $script:BubblePopup.Child) {\n        $script:BubblePopup.IsOpen = $false\n        $script:BubblePopup = $null\n        $script:BubbleIsClosing = $false\n        return\n    }\n\n    if ($script:BubbleIsClosing) { return }\n    $script:BubbleIsClosing = $true\n\n    $bubblePanel = $script:BubblePopup.Child\n    $fadeOut = New-Object System.Windows.Media.Animation.DoubleAnimation\n    $fadeOut.From = [double]$bubblePanel.Opacity\n    $fadeOut.To = 0\n    $fadeOut.Duration = [System.Windows.Duration]::new([TimeSpan]::FromMilliseconds(220))\n    $fadeOut.Add_Completed({\n        if ($script:BubblePopup) {\n            $script:BubblePopup.IsOpen = $false\n            $script:BubblePopup = $null\n        }\n        $script:BubbleIsClosing = $false\n    })\n\n    $bubblePanel.BeginAnimation([System.Windows.UIElement]::OpacityProperty, $fadeOut)\n}\n\nfunction Show-Bubble {\n    param (\n        [Parameter(Mandatory=$true)]\n        [System.Windows.Controls.Control]$TargetControl,\n\n        [Parameter(Mandatory=$false)]\n        [string]$Message = 'View the selected changes here',\n\n        [Parameter(Mandatory=$false)]\n        [int]$DurationSeconds = 5\n    )\n\n    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null\n\n    if (-not $TargetControl) { return }\n\n    Hide-Bubble -Immediate\n\n    $xaml = Get-Content -Path $script:BubbleHintSchema -Raw\n    $reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))\n    try {\n        $bubblePanel = [System.Windows.Markup.XamlReader]::Load($reader)\n    }\n    finally {\n        $reader.Close()\n    }\n\n    $bubbleText = $bubblePanel.FindName('BubbleText')\n    if ($bubbleText) {\n        $bubbleText.Text = $Message\n    }\n\n    $bubblePanel.BeginAnimation([System.Windows.UIElement]::OpacityProperty, $null)\n    $bubblePanel.Opacity = 0\n\n    $popup = New-Object System.Windows.Controls.Primitives.Popup\n    $popup.AllowsTransparency = $true\n    $popup.PopupAnimation = 'None'\n    $popup.StaysOpen = $true\n    $popup.PlacementTarget = $TargetControl\n    $popup.Placement = [System.Windows.Controls.Primitives.PlacementMode]::Top\n    $popup.VerticalOffset = -1\n    $popup.Child = $bubblePanel\n\n    $popup.Add_Opened({\n        param($sender, $e)\n\n        if (-not $sender) { return }\n        $panel = $sender.Child\n        $target = $sender.PlacementTarget\n        if (-not $panel -or -not $target) { return }\n\n        $panel.Measure([System.Windows.Size]::new([double]::PositiveInfinity, [double]::PositiveInfinity))\n        $bubbleWidth = $panel.DesiredSize.Width\n        $targetWidth = $target.ActualWidth\n        $sender.HorizontalOffset = ($targetWidth - $bubbleWidth) / 2\n\n        $fadeIn = New-Object System.Windows.Media.Animation.DoubleAnimation\n        $fadeIn.From = 0\n        $fadeIn.To = 1\n        $fadeIn.BeginTime = [TimeSpan]::FromMilliseconds(30)\n        $fadeIn.Duration = [System.Windows.Duration]::new([TimeSpan]::FromMilliseconds(320))\n        $panel.BeginAnimation([System.Windows.UIElement]::OpacityProperty, $fadeIn)\n    })\n\n    $script:BubbleIsClosing = $false\n    $script:BubblePopup = $popup\n    $script:BubblePopup.IsOpen = $true\n\n    $script:BubbleTimer = New-Object System.Windows.Threading.DispatcherTimer\n    $script:BubbleTimer.Interval = [TimeSpan]::FromSeconds([Math]::Max(1, $DurationSeconds))\n    $script:BubbleTimer.Add_Tick({\n        Hide-Bubble\n    })\n    $script:BubbleTimer.Start()\n}\n"
  },
  {
    "path": "Scripts/GUI/Show-MainWindow.ps1",
    "content": "function Show-MainWindow {\n    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase,System.Windows.Forms | Out-Null\n\n    # Get current Windows build version\n    $WinVersion = Get-ItemPropertyValue 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion' CurrentBuild\n\n    $usesDarkMode = GetSystemUsesDarkMode\n\n    # Load XAML from file\n    $xaml = Get-Content -Path $script:MainWindowSchema -Raw\n    $reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))\n    try {\n        $window = [System.Windows.Markup.XamlReader]::Load($reader)\n    }\n    finally {\n        $reader.Close()\n    }\n\n    SetWindowThemeResources -window $window -usesDarkMode $usesDarkMode\n\n    # Get named elements\n    $titleBar = $window.FindName('TitleBar')\n    $kofiBtn = $window.FindName('KofiBtn')\n    $menuBtn = $window.FindName('MenuBtn')\n    $closeBtn = $window.FindName('CloseBtn')\n    $menuDocumentation = $window.FindName('MenuDocumentation')\n    $menuReportBug = $window.FindName('MenuReportBug')\n    $menuLogs = $window.FindName('MenuLogs')\n    $menuAbout = $window.FindName('MenuAbout')\n\n    # Title bar event handlers\n    $titleBar.Add_MouseLeftButtonDown({\n        if ($_.OriginalSource -is [System.Windows.Controls.Grid] -or $_.OriginalSource -is [System.Windows.Controls.Border] -or $_.OriginalSource -is [System.Windows.Controls.TextBlock]) {\n            $window.DragMove()\n        }\n    })\n    \n    $kofiBtn.Add_Click({\n        Start-Process \"https://ko-fi.com/raphire\"\n    })\n    \n    $menuBtn.Add_Click({\n        $menuBtn.ContextMenu.PlacementTarget = $menuBtn\n        $menuBtn.ContextMenu.Placement = [System.Windows.Controls.Primitives.PlacementMode]::Bottom\n        $menuBtn.ContextMenu.IsOpen = $true\n    })\n\n    $menuDocumentation.Add_Click({\n        Start-Process \"https://github.com/Raphire/Win11Debloat/wiki\"\n    })\n\n    $menuReportBug.Add_Click({\n        Start-Process \"https://github.com/Raphire/Win11Debloat/issues\"\n    })\n\n    $menuLogs.Add_Click({\n        $logsFolder = Join-Path $PSScriptRoot \"../../Logs\"\n        if (Test-Path $logsFolder) {\n            Start-Process \"explorer.exe\" -ArgumentList $logsFolder\n        }\n        else {\n            Show-MessageBox -Message \"No logs folder found at: $logsFolder\" -Title \"Logs\" -Button 'OK' -Icon 'Information'\n        }\n    })\n\n    $menuAbout.Add_Click({\n        Show-AboutDialog -Owner $window\n    })\n\n    $closeBtn.Add_Click({\n        $window.Close()\n    })\n\n    # Ensure closing the main window stops all execution\n    $window.Add_Closing({\n        $script:CancelRequested = $true\n    })\n\n    # Implement window resize functionality\n    $resizeLeft = $window.FindName('ResizeLeft')\n    $resizeRight = $window.FindName('ResizeRight')\n    $resizeTop = $window.FindName('ResizeTop')\n    $resizeBottom = $window.FindName('ResizeBottom')\n    $resizeTopLeft = $window.FindName('ResizeTopLeft')\n    $resizeTopRight = $window.FindName('ResizeTopRight')\n    $resizeBottomLeft = $window.FindName('ResizeBottomLeft')\n    $resizeBottomRight = $window.FindName('ResizeBottomRight')\n\n    $script:resizing = $false\n    $script:resizeEdges = $null\n    $script:resizeStart = $null\n    $script:windowStart = $null\n    $script:resizeElement = $null\n\n    $resizeHandler = {\n        param($sender, $e)\n        \n        $script:resizing = $true\n        $script:resizeElement = $sender\n        $script:resizeStart = [System.Windows.Forms.Cursor]::Position\n        $script:windowStart = @{\n            Left = $window.Left\n            Top = $window.Top\n            Width = $window.ActualWidth\n            Height = $window.ActualHeight\n        }\n        \n        # Parse direction tag into edge flags for cleaner resize logic\n        $direction = $sender.Tag\n        $script:resizeEdges = @{\n            Left = $direction -match 'Left'\n            Right = $direction -match 'Right'\n            Top = $direction -match 'Top'\n            Bottom = $direction -match 'Bottom'\n        }\n        \n        $sender.CaptureMouse()\n        $e.Handled = $true\n    }\n\n    $moveHandler = {\n        param($sender, $e)\n        if (-not $script:resizing) { return }\n        \n        $current = [System.Windows.Forms.Cursor]::Position\n        $deltaX = $current.X - $script:resizeStart.X\n        $deltaY = $current.Y - $script:resizeStart.Y\n\n        # Handle horizontal resize\n        if ($script:resizeEdges.Left) {\n            $newWidth = [Math]::Max($window.MinWidth, $script:windowStart.Width - $deltaX)\n            if ($newWidth -ne $window.Width) {\n                $window.Left = $script:windowStart.Left + ($script:windowStart.Width - $newWidth)\n                $window.Width = $newWidth\n            }\n        }\n        elseif ($script:resizeEdges.Right) {\n            $window.Width = [Math]::Max($window.MinWidth, $script:windowStart.Width + $deltaX)\n        }\n\n        # Handle vertical resize\n        if ($script:resizeEdges.Top) {\n            $newHeight = [Math]::Max($window.MinHeight, $script:windowStart.Height - $deltaY)\n            if ($newHeight -ne $window.Height) {\n                $window.Top = $script:windowStart.Top + ($script:windowStart.Height - $newHeight)\n                $window.Height = $newHeight\n            }\n        }\n        elseif ($script:resizeEdges.Bottom) {\n            $window.Height = [Math]::Max($window.MinHeight, $script:windowStart.Height + $deltaY)\n        }\n        \n        $e.Handled = $true\n    }\n\n    $releaseHandler = {\n        param($sender, $e)\n        if ($script:resizing -and $script:resizeElement) {\n            $script:resizing = $false\n            $script:resizeEdges = $null\n            $script:resizeElement.ReleaseMouseCapture()\n            $script:resizeElement = $null\n            $e.Handled = $true\n        }\n    }\n\n    # Set tags and add event handlers for resize borders\n    $resizeLeft.Tag = 'Left'\n    $resizeLeft.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeLeft.Add_MouseMove($moveHandler)\n    $resizeLeft.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeRight.Tag = 'Right'\n    $resizeRight.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeRight.Add_MouseMove($moveHandler)\n    $resizeRight.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeTop.Tag = 'Top'\n    $resizeTop.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeTop.Add_MouseMove($moveHandler)\n    $resizeTop.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeBottom.Tag = 'Bottom'\n    $resizeBottom.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeBottom.Add_MouseMove($moveHandler)\n    $resizeBottom.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeTopLeft.Tag = 'TopLeft'\n    $resizeTopLeft.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeTopLeft.Add_MouseMove($moveHandler)\n    $resizeTopLeft.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeTopRight.Tag = 'TopRight'\n    $resizeTopRight.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeTopRight.Add_MouseMove($moveHandler)\n    $resizeTopRight.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeBottomLeft.Tag = 'BottomLeft'\n    $resizeBottomLeft.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeBottomLeft.Add_MouseMove($moveHandler)\n    $resizeBottomLeft.Add_MouseLeftButtonUp($releaseHandler)\n    \n    $resizeBottomRight.Tag = 'BottomRight'\n    $resizeBottomRight.Add_PreviewMouseLeftButtonDown($resizeHandler)\n    $resizeBottomRight.Add_MouseMove($moveHandler)\n    $resizeBottomRight.Add_MouseLeftButtonUp($releaseHandler)\n\n    # Integrated App Selection UI\n    $appsPanel = $window.FindName('AppSelectionPanel')\n    $onlyInstalledAppsBox = $window.FindName('OnlyInstalledAppsBox')\n    $loadingAppsIndicator = $window.FindName('LoadingAppsIndicator')\n    $appSelectionStatus = $window.FindName('AppSelectionStatus')\n    $headerNameBtn = $window.FindName('HeaderNameBtn')\n    $headerDescriptionBtn = $window.FindName('HeaderDescriptionBtn')\n    $headerAppIdBtn = $window.FindName('HeaderAppIdBtn')\n    $sortArrowName = $window.FindName('SortArrowName')\n    $sortArrowDescription = $window.FindName('SortArrowDescription')\n    $sortArrowAppId = $window.FindName('SortArrowAppId')\n    $presetsBtn = $window.FindName('PresetsBtn')\n    $presetsPopup = $window.FindName('PresetsPopup')\n    $presetDefaultApps = $window.FindName('PresetDefaultApps')\n    $presetLastUsed = $window.FindName('PresetLastUsed')\n    $jsonPresetsPanel = $window.FindName('JsonPresetsPanel')\n    $presetsArrow = $window.FindName('PresetsArrow')\n    $clearAppSelectionBtn = $window.FindName('ClearAppSelectionBtn')\n\n    # Load JSON-defined presets and build dynamic preset checkboxes\n    $script:JsonPresetCheckboxes = @()\n    foreach ($preset in (LoadAppPresetsFromJson)) {\n        $checkbox = New-Object System.Windows.Controls.CheckBox\n        $checkbox.Content = $preset.Name\n        $checkbox.IsThreeState = $true\n        $checkbox.Style = $window.Resources['PresetCheckBoxStyle']\n        $checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $preset.Name)\n        Add-Member -InputObject $checkbox -MemberType NoteProperty -Name 'PresetAppIds' -Value $preset.AppIds\n        $jsonPresetsPanel.Children.Add($checkbox) | Out-Null\n        $script:JsonPresetCheckboxes += $checkbox\n\n        $checkbox.Add_Click({\n            if ($script:UpdatingPresets) { return }\n            $check = ($this.IsChecked -eq $true)\n            if ($this.IsChecked -eq $null) { $this.IsChecked = $false; $check = $false }\n            $presetIds = $this.PresetAppIds\n            ApplyPresetToApps -MatchFilter { param($c) $presetIds -contains $c.Tag }.GetNewClosure() -Check $check\n        })\n    }\n    \n    # Track the last selected checkbox for shift-click range selection\n    $script:MainWindowLastSelectedCheckbox = $null\n    \n    # Guard flag: true while a load is in progress; prevents concurrent loads\n    $script:IsLoadingApps = $false\n    # Flag set when Default Mode is clicked before apps have finished loading\n    $script:PendingDefaultMode = $false\n    # Holds apps data preloaded before ShowDialog() so the first load skips the background job\n    $script:PreloadedAppData = $null\n    \n    # Set script-level variable for GUI window reference\n    $script:GuiWindow = $window\n\n    # Guard flag to prevent preset handlers from firing when we update their state programmatically\n    $script:UpdatingPresets = $false\n\n    # Sort state for the app table\n    $script:SortColumn = 'Name'\n    $script:SortAscending = $true\n\n    function UpdateSortArrows {\n        $ease = New-Object System.Windows.Media.Animation.CubicEase\n        $ease.EasingMode = 'EaseOut'\n        $arrows = @{\n            'Name'        = $sortArrowName\n            'Description' = $sortArrowDescription\n            'AppId'       = $sortArrowAppId\n        }\n        foreach ($col in $arrows.Keys) {\n            $tb = $arrows[$col]\n            # Active column: full opacity, rotate to indicate direction (0 = up/asc, 180 = down/desc)\n            # Inactive columns: dim, reset to 0\n            if ($col -eq $script:SortColumn) {\n                $targetAngle = if ($script:SortAscending) { 0 } else { 180 }\n                $tb.Opacity = 1.0\n            } else {\n                $targetAngle = 0\n                $tb.Opacity = 0.3\n            }\n            $anim = New-Object System.Windows.Media.Animation.DoubleAnimation\n            $anim.To = $targetAngle\n            $anim.Duration = [System.Windows.Duration]::new([System.TimeSpan]::FromMilliseconds(200))\n            $anim.EasingFunction = $ease\n            $tb.RenderTransform.BeginAnimation([System.Windows.Media.RotateTransform]::AngleProperty, $anim)\n        }\n    }\n\n    # Rebuilds $script:AppSearchMatches by scanning appsPanel children in their current order,\n    # collecting any that are still highlighted. Preserves the active match across reorderings.\n    function RebuildAppSearchIndex {\n        param($activeMatch = $null)\n        $newMatches = @()\n        $newActiveIndex = -1\n        $i = 0\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox] -and $child.Background -ne [System.Windows.Media.Brushes]::Transparent) {\n                $newMatches += $child\n                if ($null -ne $activeMatch -and [System.Object]::ReferenceEquals($child, $activeMatch)) {\n                    $newActiveIndex = $i\n                }\n                $i++\n            }\n        }\n        $script:AppSearchMatches = $newMatches\n        $script:AppSearchMatchIndex = if ($newActiveIndex -ge 0) { $newActiveIndex } elseif ($newMatches.Count -gt 0) { 0 } else { -1 }\n    }\n\n    function SortApps {\n        $children = @($appsPanel.Children)\n        $key = switch ($script:SortColumn) {\n            'Name'        { { $_.AppName } }\n            'Description' { { $_.AppDescription } }\n            'AppId'       { { $_.Tag } }\n        }\n        $sorted = $children | Sort-Object $key -Descending:(-not $script:SortAscending)\n        $appsPanel.Children.Clear()\n        foreach ($checkbox in $sorted) {\n            $appsPanel.Children.Add($checkbox) | Out-Null\n        }\n        UpdateSortArrows\n\n        # Rebuild search match list in new sorted order so keyboard navigation stays correct\n        if ($script:AppSearchMatches.Count -gt 0) {\n            $activeMatch = if ($script:AppSearchMatchIndex -ge 0 -and $script:AppSearchMatchIndex -lt $script:AppSearchMatches.Count) {\n                $script:AppSearchMatches[$script:AppSearchMatchIndex]\n            } else { $null }\n            RebuildAppSearchIndex -activeMatch $activeMatch\n        }\n    }\n\n    function SetSortColumn($column) {\n        if ($script:SortColumn -eq $column) {\n            $script:SortAscending = -not $script:SortAscending\n        } else {\n            $script:SortColumn = $column\n            $script:SortAscending = $true\n        }\n        SortApps\n    }\n\n    function UpdateAppSelectionStatus {\n        $selectedCount = 0\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox] -and $child.IsChecked) {\n                $selectedCount++\n            }\n        }\n        $appSelectionStatus.Text = \"$selectedCount app(s) selected for removal\"\n    }\n\n    # Applies a preset by checking/unchecking apps that match the given filter\n    # When -Exclusive is set, all apps are unchecked first so only matching apps end up selected\n    function ApplyPresetToApps {\n        param ( \n            [scriptblock]$MatchFilter,\n            [bool]$Check,\n            [switch]$Exclusive\n        )\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox]) {\n                if ($Exclusive) {\n                    $child.IsChecked = (& $MatchFilter $child)\n                } elseif (& $MatchFilter $child) {\n                    $child.IsChecked = $Check\n                }\n            }\n        }\n        UpdatePresetStates\n    }\n\n    # Update preset checkboxes to reflect checked/indeterminate/unchecked state\n    function UpdatePresetStates {\n        $script:UpdatingPresets = $true\n        try {\n            # Build a set of currently checked app tags for fast lookup\n            $checkedTags = @{}\n            foreach ($child in $appsPanel.Children) {\n                if ($child -is [System.Windows.Controls.CheckBox] -and $child.IsChecked) {\n                    $checkedTags[$child.Tag] = $true\n                }\n            }\n\n            # Helper: count matching and checked apps, set checkbox state\n            function SetPresetState($checkbox, [scriptblock]$MatchFilter) {\n                $total = 0; $checked = 0\n                foreach ($child in $appsPanel.Children) {\n                    if ($child -is [System.Windows.Controls.CheckBox]) {\n                        if (& $MatchFilter $child) {\n                            $total++\n                            if ($checkedTags.ContainsKey($child.Tag)) { $checked++ }\n                        }\n                    }\n                }\n                if ($total -eq 0) {\n                    $checkbox.IsChecked = $false\n                    $checkbox.IsEnabled = $false\n                } else {\n                    $checkbox.IsEnabled = $true\n                    if ($checked -eq 0) {\n                        $checkbox.IsChecked = $false\n                    } elseif ($checked -eq $total) {\n                        $checkbox.IsChecked = $true\n                    } else {\n                        $checkbox.IsChecked = [System.Nullable[bool]]$null\n                    }\n                }\n            }\n\n            SetPresetState $presetDefaultApps { param($c) $c.SelectedByDefault -eq $true }\n            foreach ($jsonCb in $script:JsonPresetCheckboxes) {\n                $localIds = $jsonCb.PresetAppIds\n                SetPresetState $jsonCb { param($c) $localIds -contains $c.Tag }.GetNewClosure()\n            }\n\n            # Last used preset: only update if it's visible (has saved apps)\n            if ($presetLastUsed.Visibility -ne 'Collapsed' -and $script:SavedAppIds) {\n                SetPresetState $presetLastUsed { param($c) $script:SavedAppIds -contains $c.Tag }\n            }\n        }\n        finally {\n            $script:UpdatingPresets = $false\n        }\n    }\n\n    # Dynamically builds Tweaks UI from Features.json\n    function BuildDynamicTweaks {\n        $featuresJson = LoadJsonFile -filePath $script:FeaturesFilePath -expectedVersion \"1.0\"\n\n        if (-not $featuresJson) {\n            Show-MessageBox -Message \"Unable to load Features.json file!\" -Title \"Error\" -Button 'OK' -Icon 'Error' | Out-Null\n            Exit\n        }\n\n        # Column containers\n        $col0 = $window.FindName('Column0Panel')\n        $col1 = $window.FindName('Column1Panel')\n        $col2 = $window.FindName('Column2Panel')\n        $columns = @($col0, $col1, $col2) | Where-Object { $_ -ne $null }\n\n        # Clear all columns for fully dynamic panel creation\n        foreach ($col in $columns) {\n            if ($col) { $col.Children.Clear() }\n        }\n\n        $script:UiControlMappings = @{}\n        $script:CategoryCardMap = @{}\n\n        function CreateLabeledCombo($parent, $labelText, $comboName, $items) {\n            # If only 2 items (No Change + one option), use a checkbox instead\n            if ($items.Count -eq 2) {\n                $checkbox = New-Object System.Windows.Controls.CheckBox\n                $checkbox.Content = $labelText\n                $checkbox.Name = $comboName\n                $checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $labelText)\n                $checkbox.IsChecked = $false\n                $checkbox.Style = $window.Resources[\"FeatureCheckboxStyle\"]\n                $parent.Children.Add($checkbox) | Out-Null\n                \n                # Register the checkbox with the window's name scope\n                try {\n                    [System.Windows.NameScope]::SetNameScope($checkbox, [System.Windows.NameScope]::GetNameScope($window))\n                    $window.RegisterName($comboName, $checkbox)\n                }\n                catch {\n                    # Name might already be registered, ignore\n                }\n                \n                return $checkbox\n            }\n            \n            # Otherwise use a combobox for multiple options\n            # Wrap label in a Border for search highlighting\n            $lblBorder = New-Object System.Windows.Controls.Border\n            $lblBorder.Style = $window.Resources['LabelBorderStyle']\n            $lblBorderName = \"$comboName`_LabelBorder\"\n            $lblBorder.Name = $lblBorderName\n            \n            $lbl = New-Object System.Windows.Controls.TextBlock\n            $lbl.Text = $labelText\n            $lbl.Style = $window.Resources['LabelStyle']\n            $labelName = \"$comboName`_Label\"\n            $lbl.Name = $labelName\n            \n            $lblBorder.Child = $lbl\n            $parent.Children.Add($lblBorder) | Out-Null\n            \n            # Register the label border with the window's name scope\n            try {\n                [System.Windows.NameScope]::SetNameScope($lblBorder, [System.Windows.NameScope]::GetNameScope($window))\n                $window.RegisterName($lblBorderName, $lblBorder)\n            }\n            catch {\n                # Name might already be registered, ignore\n            }\n\n            $combo = New-Object System.Windows.Controls.ComboBox\n            $combo.Name = $comboName\n            $combo.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $labelText)\n            foreach ($item in $items) { $comboItem = New-Object System.Windows.Controls.ComboBoxItem; $comboItem.Content = $item; $combo.Items.Add($comboItem) | Out-Null }\n            $combo.SelectedIndex = 0\n            $parent.Children.Add($combo) | Out-Null\n            \n            # Register the combo box with the window's name scope\n            try {\n                [System.Windows.NameScope]::SetNameScope($combo, [System.Windows.NameScope]::GetNameScope($window))\n                $window.RegisterName($comboName, $combo)\n            }\n            catch {\n                # Name might already be registered, ignore\n            }\n            \n            return $combo\n        }\n\n        function GetWikiUrlForCategory($category) {\n            if (-not $category) { return 'https://github.com/Raphire/Win11Debloat/wiki/Features' }\n\n            $slug = $category.ToLowerInvariant()\n            $slug = $slug -replace '&', ''\n            $slug = $slug -replace '[^a-z0-9\\s-]', ''\n            $slug = $slug -replace '\\s', '-'\n\n            return \"https://github.com/Raphire/Win11Debloat/wiki/Features#$slug\"\n        }\n\n        function GetOrCreateCategoryCard($categoryObj) {\n            $categoryName = $categoryObj.Name\n            $categoryIcon = $categoryObj.Icon\n\n            if ($script:CategoryCardMap.ContainsKey($categoryName)) { return $script:CategoryCardMap[$categoryName] }\n\n            # Create a new card Border + StackPanel and add to shortest column\n            $target = $columns | Sort-Object @{Expression={$_.Children.Count}; Ascending=$true}, @{Expression={$columns.IndexOf($_)}; Ascending=$true} | Select-Object -First 1\n\n            $border = New-Object System.Windows.Controls.Border\n            $border.Style = $window.Resources['CategoryCardBorderStyle']\n            $border.Tag = 'DynamicCategory'\n\n            $panel = New-Object System.Windows.Controls.StackPanel\n            $safe = ($categoryName -replace '[^a-zA-Z0-9_]','_')\n            $panel.Name = \"Category_{0}_Panel\" -f $safe\n\n            $headerRow = New-Object System.Windows.Controls.StackPanel\n            $headerRow.Orientation = 'Horizontal'\n\n            # Add category icon\n            $icon = New-Object System.Windows.Controls.TextBlock\n            # Convert HTML entity to character (e.g., &#xE72E; -> actual character)\n            if ($categoryIcon -match '&#x([0-9A-Fa-f]+);') {\n                $hexValue = [Convert]::ToInt32($matches[1], 16)\n                $icon.Text = [char]$hexValue\n            }\n            $icon.Style = $window.Resources['CategoryHeaderIcon']\n            $headerRow.Children.Add($icon) | Out-Null\n\n            $header = New-Object System.Windows.Controls.TextBlock\n            $header.Text = $categoryName\n            $header.Style = $window.Resources['CategoryHeaderTextBlock']\n            $headerRow.Children.Add($header) | Out-Null\n\n            $helpIcon = New-Object System.Windows.Controls.TextBlock\n            $helpIcon.Text = '(?)'\n            $helpIcon.Style = $window.Resources['CategoryHelpLinkTextStyle']\n\n            $helpBtn = New-Object System.Windows.Controls.Button\n            $helpBtn.Content = $helpIcon\n            $helpBtn.ToolTip = \"Open wiki for more info on '$categoryName' tweaks\"\n            $helpBtn.Tag = (GetWikiUrlForCategory -category $categoryName)\n            $helpBtn.Style = $window.Resources['CategoryHelpLinkButtonStyle']\n            $helpBtn.Add_Click({\n                param($sender, $e)\n                if ($sender.Tag) { Start-Process $sender.Tag }\n            })\n            $headerRow.Children.Add($helpBtn) | Out-Null\n\n            $panel.Children.Add($headerRow) | Out-Null\n\n            $border.Child = $panel\n            $target.Children.Add($border) | Out-Null\n\n            $script:CategoryCardMap[$categoryName] = $panel\n            return $panel\n        }\n\n        # Determine categories present (from lists and features)\n        $categoriesPresent = @{}\n        if ($featuresJson.UiGroups) {\n            foreach ($g in $featuresJson.UiGroups) { if ($g.Category) { $categoriesPresent[$g.Category] = $true } }\n        }\n        foreach ($f in $featuresJson.Features) { if ($f.Category) { $categoriesPresent[$f.Category] = $true } }\n\n        # Create cards in the order defined in Features.json Categories (if present)\n        $orderedCategories = @()\n        if ($featuresJson.Categories) {\n            foreach ($c in $featuresJson.Categories) {\n                $categoryName = if ($c -is [string]) { $c } else { $c.Name }\n                if ($categoriesPresent.ContainsKey($categoryName)) {\n                    # Store the full category object (or create one with default icon for string categories)\n                    $categoryObj = if ($c -is [string]) { @{Name = $c; Icon = '&#xE712;'} } else { $c }\n                    $orderedCategories += $categoryObj\n                }\n            }\n        } else {\n            # For backward compatibility, create category objects from keys\n            foreach ($catName in $categoriesPresent.Keys) {\n                $orderedCategories += @{Name = $catName; Icon = '&#xE712;'}\n            }\n        }\n\n        foreach ($categoryObj in $orderedCategories) {\n            $categoryName = $categoryObj.Name\n            \n            # Create/get card for this category\n            $panel = GetOrCreateCategoryCard -categoryObj $categoryObj\n            if (-not $panel) { continue }\n\n            # Collect groups and features for this category, then sort by priority\n            $categoryItems = @()\n\n            # Add any groups for this category\n            if ($featuresJson.UiGroups) {\n                $groupIndex = 0\n                foreach ($group in $featuresJson.UiGroups) {\n                    if ($group.Category -ne $categoryName) { $groupIndex++; continue }\n                    $categoryItems += [PSCustomObject]@{\n                        Type = 'group'\n                        Data = $group\n                        Priority = if ($null -ne $group.Priority) { $group.Priority } else { [int]::MaxValue }\n                        OriginalIndex = $groupIndex\n                    }\n                    $groupIndex++\n                }\n            }\n\n            # Add individual features for this category\n            $featureIndex = 0\n            foreach ($feature in $featuresJson.Features) {\n                if ($feature.Category -ne $categoryName) { $featureIndex++; continue }\n                \n                # Check version and feature compatibility using Features.json\n                if (($feature.MinVersion -and $WinVersion -lt $feature.MinVersion) -or ($feature.MaxVersion -and $WinVersion -gt $feature.MaxVersion) -or ($feature.FeatureId -eq 'DisableModernStandbyNetworking' -and (-not $script:ModernStandbySupported))) {\n                    $featureIndex++; continue\n                }\n\n                # Skip if feature part of a group\n                $inGroup = $false\n                if ($featuresJson.UiGroups) {\n                    foreach ($g in $featuresJson.UiGroups) { foreach ($val in $g.Values) { if ($val.FeatureIds -contains $feature.FeatureId) { $inGroup = $true; break } }; if ($inGroup) { break } }\n                }\n                if ($inGroup) { $featureIndex++; continue }\n\n                $categoryItems += [PSCustomObject]@{\n                    Type = 'feature'\n                    Data = $feature\n                    Priority = if ($null -ne $feature.Priority) { $feature.Priority } else { [int]::MaxValue }\n                    OriginalIndex = $featureIndex\n                }\n                $featureIndex++\n            }\n\n            # Sort by priority first, then by original index for items with same/no priority\n            $sortedItems = $categoryItems | Sort-Object -Property Priority, OriginalIndex\n\n            # Render sorted items\n            foreach ($item in $sortedItems) {\n                if ($item.Type -eq 'group') {\n                    $group = $item.Data\n                    $items = @('No Change') + ($group.Values | ForEach-Object { $_.Label })\n                    $comboName = 'Group_{0}Combo' -f $group.GroupId\n                    $combo = CreateLabeledCombo -parent $panel -labelText $group.Label -comboName $comboName -items $items\n                    # attach tooltip from UiGroups if present\n                    if ($group.ToolTip) {\n                        $tipBlock = New-Object System.Windows.Controls.TextBlock\n                        $tipBlock.Text = $group.ToolTip\n                        $tipBlock.TextWrapping = 'Wrap'\n                        $tipBlock.MaxWidth = 420\n                        $combo.ToolTip = $tipBlock\n                        $lblBorderObj = $null\n                        try { $lblBorderObj = $window.FindName(\"$comboName`_LabelBorder\") } catch {}\n                        if ($lblBorderObj) { $lblBorderObj.ToolTip = $tipBlock }\n                    }\n                    $script:UiControlMappings[$comboName] = @{ Type='group'; Values = $group.Values; Label = $group.Label }\n                }\n                elseif ($item.Type -eq 'feature') {\n                    $feature = $item.Data\n                    $opt = 'Apply'\n                    if ($feature.FeatureId -match '^Disable') { $opt = 'Disable' } elseif ($feature.FeatureId -match '^Enable') { $opt = 'Enable' }\n                    $items = @('No Change', $opt)\n                    $comboName = (\"Feature_{0}_Combo\" -f $feature.FeatureId) -replace '[^a-zA-Z0-9_]',''\n                    $combo = CreateLabeledCombo -parent $panel -labelText ($feature.Action + ' ' + $feature.Label) -comboName $comboName -items $items\n                    # attach tooltip from Features.json if present\n                    if ($feature.ToolTip) {\n                        $tipBlock = New-Object System.Windows.Controls.TextBlock\n                        $tipBlock.Text = $feature.ToolTip\n                        $tipBlock.TextWrapping = 'Wrap'\n                        $tipBlock.MaxWidth = 420\n                        $combo.ToolTip = $tipBlock\n                        $lblBorderObj = $null\n                        try { $lblBorderObj = $window.FindName(\"$comboName`_LabelBorder\") } catch {}\n                        if ($lblBorderObj) { $lblBorderObj.ToolTip = $tipBlock }\n                    }\n                    $script:UiControlMappings[$comboName] = @{ Type='feature'; FeatureId = $feature.FeatureId; Action = $feature.Action; Label = $feature.Label }\n                }\n            }\n        }\n\n        # Build a feature-label lookup so GenerateOverview can resolve feature IDs without reloading JSON\n        $script:FeatureLabelLookup = @{}\n        foreach ($f in $featuresJson.Features) {\n            $script:FeatureLabelLookup[$f.FeatureId] = $f.Action + ' ' + $f.Label\n        }\n    }\n\n    # Helper function to load apps and populate the app list panel\n    function script:LoadAppsWithList($listOfApps) {\n        $script:MainWindowLastSelectedCheckbox = $null\n\n        $loaderScriptPath = $script:LoadAppsDetailsScriptPath\n        $appsFilePath  = $script:AppsListFilePath\n        $onlyInstalled = [bool]$onlyInstalledAppsBox.IsChecked\n\n        # Use preloaded data if available; otherwise load in background job\n        if (-not $onlyInstalled -and $script:PreloadedAppData) {\n            $rawAppData = $script:PreloadedAppData\n            $script:PreloadedAppData = $null\n        } else {\n            # Load apps details in a background job to keep the UI responsive\n            $rawAppData = Invoke-NonBlocking -ScriptBlock {\n                param($loaderScript, $appsListFilePath, $installedList, $onlyInstalled)\n                $script:AppsListFilePath = $appsListFilePath\n                . $loaderScript\n                LoadAppsDetailsFromJson -OnlyInstalled:$onlyInstalled -InstalledList $installedList -InitialCheckedFromJson:$false\n            } -ArgumentList $loaderScriptPath, $appsFilePath, $listOfApps, $onlyInstalled\n        }\n\n        $appsToAdd = @($rawAppData | Where-Object { $_ -and ($_.AppId -or $_.FriendlyName) } | Sort-Object -Property FriendlyName)\n\n        $loadingAppsIndicator.Visibility = 'Collapsed'\n\n        if ($appsToAdd.Count -eq 0) {\n            $window.FindName('DeploymentApplyBtn').IsEnabled = $true\n            return\n        }\n\n        $brushSafe    = [System.Windows.Media.BrushConverter]::new().ConvertFromString('#4CAF50')\n        $brushUnsafe  = [System.Windows.Media.BrushConverter]::new().ConvertFromString('#F44336')\n        $brushDefault = [System.Windows.Media.BrushConverter]::new().ConvertFromString('#FFC107')\n        $brushSafe.Freeze(); $brushUnsafe.Freeze(); $brushDefault.Freeze()\n\n        # Create WPF controls; pump the Dispatcher every batch so the spinner keeps animating.\n        $batchSize = 20\n        for ($i = 0; $i -lt $appsToAdd.Count; $i++) {\n            $app = $appsToAdd[$i]\n\n            $checkbox = New-Object System.Windows.Controls.CheckBox\n            $automationName = if ($app.FriendlyName) { $app.FriendlyName } elseif ($app.AppId) { $app.AppId } else { $null }\n            if ($automationName) { $checkbox.SetValue([System.Windows.Automation.AutomationProperties]::NameProperty, $automationName) }\n            $checkbox.Tag       = $app.AppId\n            $checkbox.IsChecked = $app.IsChecked\n            $checkbox.Style     = $window.Resources['AppsPanelCheckBoxStyle']\n\n            # Build table row: Recommendation dot | Name | Description | App ID\n            $row = New-Object System.Windows.Controls.Grid\n            $row.Style = $window.Resources['AppTableRowStyle']\n            $c0 = New-Object System.Windows.Controls.ColumnDefinition; $c0.Width = $window.Resources['AppTableDotColWidth']\n            $c1 = New-Object System.Windows.Controls.ColumnDefinition; $c1.Width = $window.Resources['AppTableNameColWidth']\n            $c2 = New-Object System.Windows.Controls.ColumnDefinition; $c2.Width = $window.Resources['AppTableDescColWidth']\n            $c3 = New-Object System.Windows.Controls.ColumnDefinition; $c3.Width = $window.Resources['AppTableIdColWidth']\n            $row.ColumnDefinitions.Add($c0); $row.ColumnDefinitions.Add($c1)\n            $row.ColumnDefinitions.Add($c2); $row.ColumnDefinitions.Add($c3)\n\n            $dot = New-Object System.Windows.Shapes.Ellipse\n            $dot.Style = $window.Resources['AppRecommendationDotStyle']\n            $dot.Fill  = switch ($app.Recommendation) { 'safe' { $brushSafe } 'unsafe' { $brushUnsafe } default { $brushDefault } }\n            $dot.ToolTip = switch ($app.Recommendation) {\n                'safe'   { '[Recommended] Safe to remove for most users' }\n                'unsafe' { '[Not Recommended] Only remove if you know what you are doing' }\n                default  { \"[Optional] Remove if you don't need this app\" }\n            }\n            [System.Windows.Controls.Grid]::SetColumn($dot, 0)\n\n            $tbName = New-Object System.Windows.Controls.TextBlock\n            $tbName.Text  = $app.FriendlyName\n            $tbName.Style = $window.Resources['AppNameTextStyle']\n            [System.Windows.Controls.Grid]::SetColumn($tbName, 1)\n\n            $tbDesc = New-Object System.Windows.Controls.TextBlock\n            $tbDesc.Text    = $app.Description\n            $tbDesc.Style   = $window.Resources['AppDescTextStyle']\n            $tbDesc.ToolTip = $app.Description\n            [System.Windows.Controls.Grid]::SetColumn($tbDesc, 2)\n\n            $tbId = New-Object System.Windows.Controls.TextBlock\n            $tbId.Text    = $app.AppId\n            $tbId.Style   = $window.Resources['AppIdTextStyle']\n            $tbId.ToolTip = $app.AppId\n            [System.Windows.Controls.Grid]::SetColumn($tbId, 3)\n\n            $row.Children.Add($dot)    | Out-Null\n            $row.Children.Add($tbName) | Out-Null\n            $row.Children.Add($tbDesc) | Out-Null\n            $row.Children.Add($tbId)   | Out-Null\n            $checkbox.Content = $row\n\n            Add-Member -InputObject $checkbox -MemberType NoteProperty -Name 'AppName'          -Value $app.FriendlyName\n            Add-Member -InputObject $checkbox -MemberType NoteProperty -Name 'AppDescription'   -Value $app.Description\n            Add-Member -InputObject $checkbox -MemberType NoteProperty -Name 'SelectedByDefault' -Value $app.SelectedByDefault\n\n            $checkbox.Add_Checked({ UpdateAppSelectionStatus })\n            $checkbox.Add_Unchecked({ UpdateAppSelectionStatus })\n            AttachShiftClickBehavior -checkbox $checkbox -appsPanel $appsPanel `\n                -lastSelectedCheckboxRef ([ref]$script:MainWindowLastSelectedCheckbox) `\n                -updateStatusCallback { UpdateAppSelectionStatus }\n\n            $appsPanel.Children.Add($checkbox) | Out-Null\n\n            if (($i + 1) % $batchSize -eq 0) { DoEvents }\n        }\n\n        SortApps\n\n        # If Default Mode was clicked while apps were still loading, apply defaults now\n        if ($script:PendingDefaultMode) {\n            $script:PendingDefaultMode = $false\n            ApplyPresetToApps -MatchFilter { param($c) $c.SelectedByDefault -eq $true } -Exclusive\n        }\n        \n        UpdateAppSelectionStatus\n\n        # Re-enable Apply button now that the full, correctly-checked app list is ready\n        $window.FindName('DeploymentApplyBtn').IsEnabled = $true\n    }\n\n    # Loads apps into the UI\n    function LoadAppsIntoMainUI {\n        # Prevent concurrent loads\n        if ($script:IsLoadingApps) { return }\n        $script:IsLoadingApps = $true\n\n        # Show loading indicator and clear existing apps\n        $loadingAppsIndicator.Visibility = 'Visible'\n        $appsPanel.Children.Clear()\n\n        # Disable Apply button while apps are loading so it can't be clicked with a partial list\n        $window.FindName('DeploymentApplyBtn').IsEnabled = $false\n\n        # Update navigation buttons to disable Next/Previous\n        UpdateNavigationButtons\n\n        # Force a render so the loading indicator is visible, then schedule the\n        # actual loading at Background priority so this call returns immediately.\n        # This is critical when called from Add_Loaded: the window must finish\n        # its initialization before we start a nested message pump via DoEvents.\n        $window.Dispatcher.Invoke([System.Windows.Threading.DispatcherPriority]::Render, [action]{})\n        $window.Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Background, [action]{\n            try {\n                $listOfApps = \"\"\n\n                if ($onlyInstalledAppsBox.IsChecked -and ($script:WingetInstalled -eq $true)) {\n                    $listOfApps = GetInstalledAppsViaWinget -TimeOut 10 -NonBlocking\n\n                    if ($null -eq $listOfApps) {\n                        Show-MessageBox -Message 'Unable to load list of installed apps via WinGet.' -Title 'Error' -Button 'OK' -Icon 'Error' | Out-Null\n                        $onlyInstalledAppsBox.IsChecked = $false\n                    }\n                }\n\n                LoadAppsWithList $listOfApps\n            }\n            finally {\n                $script:IsLoadingApps = $false\n            }\n        }) | Out-Null\n    }\n\n    # Event handlers for app selection\n    $onlyInstalledAppsBox.Add_Checked({\n        LoadAppsIntoMainUI\n    })\n    $onlyInstalledAppsBox.Add_Unchecked({\n        LoadAppsIntoMainUI\n    })\n\n    # Animate arrow when popup opens/closes, and lazily update preset states\n    $presetsPopup.Add_Opened({\n        UpdatePresetStates\n        $animation = New-Object System.Windows.Media.Animation.DoubleAnimation\n        $animation.To = 180\n        $animation.Duration = [System.Windows.Duration]::new([System.TimeSpan]::FromMilliseconds(200))\n        $animation.EasingFunction = New-Object System.Windows.Media.Animation.CubicEase\n        $animation.EasingFunction.EasingMode = 'EaseOut'\n        $presetsArrow.RenderTransform.BeginAnimation([System.Windows.Media.RotateTransform]::AngleProperty, $animation)\n    })\n    $presetsPopup.Add_Closed({\n        $animation = New-Object System.Windows.Media.Animation.DoubleAnimation\n        $animation.To = 0\n        $animation.Duration = [System.Windows.Duration]::new([System.TimeSpan]::FromMilliseconds(200))\n        $animation.EasingFunction = New-Object System.Windows.Media.Animation.CubicEase\n        $animation.EasingFunction.EasingMode = 'EaseOut'\n        $presetsArrow.RenderTransform.BeginAnimation([System.Windows.Media.RotateTransform]::AngleProperty, $animation)\n        $presetsBtn.IsChecked = $false\n    })\n\n    # Close popup when clicking anywhere outside the popup or the presets button.\n    $window.Add_PreviewMouseDown({\n        if (-not $presetsPopup.IsOpen) { return }\n        if ($presetsPopup.Child -ne $null -and $presetsPopup.Child.IsMouseOver) { return }\n        $src = $_.OriginalSource -as [System.Windows.DependencyObject]\n        if ($src -ne $null) {\n            $inBtn = $presetsBtn.IsAncestorOf($src) -or [System.Object]::ReferenceEquals($presetsBtn, $src)\n            if (-not $inBtn) { $presetsPopup.IsOpen = $false }\n        }\n    })\n\n    # Close the preset menu when the main window loses focus (e.g., user switches to another app).\n    $window.Add_Deactivated({\n        if ($presetsPopup.IsOpen) { $presetsPopup.IsOpen = $false }\n    })\n\n    # Toggle popup on button click\n    $presetsBtn.Add_Click({\n        $presetsPopup.IsOpen = -not $presetsPopup.IsOpen\n        $presetsBtn.IsChecked = $presetsPopup.IsOpen\n    })\n\n    # Preset: Default selection\n    $presetDefaultApps.Add_Click({\n        if ($script:UpdatingPresets) { return }\n        $check = ($this.IsChecked -eq $true)\n        if ($this.IsChecked -eq $null) { $this.IsChecked = $false; $check = $false }\n        ApplyPresetToApps -MatchFilter { param($c) $c.SelectedByDefault -eq $true } -Check $check\n    })\n\n    # Clear selection button + reset all preset checkboxes\n    $clearAppSelectionBtn.Add_Click({\n        ApplyPresetToApps -MatchFilter { param($c) $true } -Check $false\n    })\n\n    # Column header sort handlers\n    $headerNameBtn.Add_MouseLeftButtonUp({ SetSortColumn 'Name' })\n    $headerDescriptionBtn.Add_MouseLeftButtonUp({ SetSortColumn 'Description' })\n    $headerAppIdBtn.Add_MouseLeftButtonUp({ SetSortColumn 'AppId' })\n\n    # Helper function to scroll to an item if it's not visible, centering it in the viewport\n    function ScrollToItemIfNotVisible {\n        param (\n            [System.Windows.Controls.ScrollViewer]$scrollViewer,\n            [System.Windows.UIElement]$item,\n            [System.Windows.UIElement]$container\n        )\n        \n        if (-not $scrollViewer -or -not $item -or -not $container) { return }\n        \n        try {\n            $itemPosition = $item.TransformToAncestor($container).Transform([System.Windows.Point]::new(0, 0)).Y\n            $viewportHeight = $scrollViewer.ViewportHeight\n            $itemHeight = $item.ActualHeight\n            $currentOffset = $scrollViewer.VerticalOffset\n            \n            # Check if the item is currently visible in the viewport\n            $itemTop = $itemPosition - $currentOffset\n            $itemBottom = $itemTop + $itemHeight\n            \n            $isVisible = ($itemTop -ge 0) -and ($itemBottom -le $viewportHeight)\n            \n            # Only scroll if the item is not visible\n            if (-not $isVisible) {\n                # Center the item in the viewport\n                $targetOffset = $itemPosition - ($viewportHeight / 2) + ($itemHeight / 2)\n                $scrollViewer.ScrollToVerticalOffset([Math]::Max(0, $targetOffset))\n            }\n        }\n        catch {\n            # Fallback to simple bring into view\n            $item.BringIntoView()\n        }\n    }\n    \n    # Helper function to find the parent ScrollViewer of an element\n    function FindParentScrollViewer {\n        param ([System.Windows.UIElement]$element)\n        \n        $parent = [System.Windows.Media.VisualTreeHelper]::GetParent($element)\n        while ($null -ne $parent) {\n            if ($parent -is [System.Windows.Controls.ScrollViewer]) {\n                return $parent\n            }\n            $parent = [System.Windows.Media.VisualTreeHelper]::GetParent($parent)\n        }\n        return $null\n    }\n\n    # App Search Box functionality\n    $appSearchBox = $window.FindName('AppSearchBox')\n    $appSearchPlaceholder = $window.FindName('AppSearchPlaceholder')\n    \n    # Track current search matches and active index for Enter-key navigation\n    $script:AppSearchMatches = @()\n    $script:AppSearchMatchIndex = -1\n    \n    $appSearchBox.Add_TextChanged({\n        $searchText = $appSearchBox.Text.ToLower().Trim()\n        \n        # Show/hide placeholder\n        $appSearchPlaceholder.Visibility = if ([string]::IsNullOrWhiteSpace($appSearchBox.Text)) { 'Visible' } else { 'Collapsed' }\n        \n        # Clear all highlights first\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox]) {\n                $child.Background = [System.Windows.Media.Brushes]::Transparent\n            }\n        }\n        \n        $script:AppSearchMatches = @()\n        $script:AppSearchMatchIndex = -1\n        \n        if ([string]::IsNullOrWhiteSpace($searchText)) { return }\n        \n        # Find and highlight all matching apps\n        $highlightBrush = $window.Resources[\"SearchHighlightColor\"]\n        $activeHighlightBrush = $window.Resources[\"SearchHighlightActiveColor\"]\n        \n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox] -and $child.Visibility -eq 'Visible') {\n                $appName = if ($child.AppName) { $child.AppName } else { '' }\n                $appId = if ($child.Tag) { $child.Tag.ToString() } else { '' }\n                $appDesc = if ($child.AppDescription) { $child.AppDescription } else { '' }\n                if ($appName.ToLower().Contains($searchText) -or $appId.ToLower().Contains($searchText) -or $appDesc.ToLower().Contains($searchText)) {\n                    $child.Background = $highlightBrush\n                    $script:AppSearchMatches += $child\n                }\n            }\n        }\n        \n        # Scroll to first match and mark it as active\n        if ($script:AppSearchMatches.Count -gt 0) {\n            $script:AppSearchMatchIndex = 0\n            $script:AppSearchMatches[0].Background = $activeHighlightBrush\n            $scrollViewer = FindParentScrollViewer -element $appsPanel\n            if ($scrollViewer) {\n                ScrollToItemIfNotVisible -scrollViewer $scrollViewer -item $script:AppSearchMatches[0] -container $appsPanel\n            }\n        }\n    })\n    \n    $appSearchBox.Add_KeyDown({\n        param($sender, $e)\n        if ($e.Key -eq [System.Windows.Input.Key]::Enter -and $script:AppSearchMatches.Count -gt 0) {\n            # Reset background of current active match\n            $script:AppSearchMatches[$script:AppSearchMatchIndex].Background = $window.Resources[\"SearchHighlightColor\"]\n            # Advance to next match (wrapping)\n            $script:AppSearchMatchIndex = ($script:AppSearchMatchIndex + 1) % $script:AppSearchMatches.Count\n            # Highlight new active match\n            $script:AppSearchMatches[$script:AppSearchMatchIndex].Background = $window.Resources[\"SearchHighlightActiveColor\"]\n            $scrollViewer = FindParentScrollViewer -element $appsPanel\n            if ($scrollViewer) {\n                ScrollToItemIfNotVisible -scrollViewer $scrollViewer -item $script:AppSearchMatches[$script:AppSearchMatchIndex] -container $appsPanel\n            }\n            $e.Handled = $true\n        }\n    })\n\n    # Tweak Search Box functionality\n    $tweakSearchBox = $window.FindName('TweakSearchBox')\n    $tweakSearchPlaceholder = $window.FindName('TweakSearchPlaceholder')\n    $tweakSearchBorder = $window.FindName('TweakSearchBorder')\n    $tweaksScrollViewer = $window.FindName('TweaksScrollViewer')\n    $tweaksGrid = $window.FindName('TweaksGrid')\n    $col0 = $window.FindName('Column0Panel')\n    $col1 = $window.FindName('Column1Panel')\n    $col2 = $window.FindName('Column2Panel')\n    \n    # Monitor scrollbar visibility and adjust searchbar margin\n    $tweaksScrollViewer.Add_ScrollChanged({\n        if ($tweaksScrollViewer.ScrollableHeight -gt 0) {\n            # The 17px accounts for the scrollbar width + some padding\n            $tweakSearchBorder.Margin = [System.Windows.Thickness]::new(0, 0, 17, 0)\n        } else {\n            $tweakSearchBorder.Margin = [System.Windows.Thickness]::new(0)\n        }\n    })\n    \n    # Helper function to clear all tweak highlights\n    function ClearTweakHighlights {\n        $columns = @($col0, $col1, $col2) | Where-Object { $_ -ne $null }\n        foreach ($column in $columns) {\n            foreach ($card in $column.Children) {\n                if ($card -is [System.Windows.Controls.Border] -and $card.Child -is [System.Windows.Controls.StackPanel]) {\n                    foreach ($control in $card.Child.Children) {\n                        if ($control -is [System.Windows.Controls.CheckBox] -or \n                            ($control -is [System.Windows.Controls.Border] -and $control.Name -like '*_LabelBorder')) {\n                            $control.Background = [System.Windows.Media.Brushes]::Transparent\n                        }\n                    }\n                }\n            }\n        }\n    }\n    \n    # Helper function to check if a ComboBox contains matching items\n    function ComboBoxContainsMatch {\n        param ([System.Windows.Controls.ComboBox]$comboBox, [string]$searchText)\n        \n        foreach ($item in $comboBox.Items) {\n            $itemText = if ($item -is [System.Windows.Controls.ComboBoxItem]) { $item.Content.ToString().ToLower() } else { $item.ToString().ToLower() }\n            if ($itemText.Contains($searchText)) { return $true }\n        }\n        return $false\n    }\n    \n    $tweakSearchBox.Add_TextChanged({\n        $searchText = $tweakSearchBox.Text.ToLower().Trim()\n        \n        # Show/hide placeholder\n        $tweakSearchPlaceholder.Visibility = if ([string]::IsNullOrWhiteSpace($tweakSearchBox.Text)) { 'Visible' } else { 'Collapsed' }\n        \n        # Clear all highlights\n        ClearTweakHighlights\n        \n        if ([string]::IsNullOrWhiteSpace($searchText)) { return }\n        \n        # Find and highlight all matching tweaks\n        $firstMatch = $null\n        $highlightBrush = $window.Resources[\"SearchHighlightColor\"]\n        $columns = @($col0, $col1, $col2) | Where-Object { $_ -ne $null }\n        \n        foreach ($column in $columns) {\n            foreach ($card in $column.Children) {\n                if ($card -is [System.Windows.Controls.Border] -and $card.Child -is [System.Windows.Controls.StackPanel]) {\n                    $controlsList = @($card.Child.Children)\n                    for ($i = 0; $i -lt $controlsList.Count; $i++) {\n                        $control = $controlsList[$i]\n                        $matchFound = $false\n                        $controlToHighlight = $null\n                        \n                        if ($control -is [System.Windows.Controls.CheckBox]) {\n                            if ($control.Content.ToString().ToLower().Contains($searchText)) {\n                                $matchFound = $true\n                                $controlToHighlight = $control\n                            }\n                        }\n                        elseif ($control -is [System.Windows.Controls.Border] -and $control.Name -like '*_LabelBorder') {\n                            $labelText = if ($control.Child) { $control.Child.Text.ToLower() } else { \"\" }\n                            $comboBox = if ($i + 1 -lt $controlsList.Count -and $controlsList[$i + 1] -is [System.Windows.Controls.ComboBox]) { $controlsList[$i + 1] } else { $null }\n                            \n                            # Check label text or combo box items\n                            if ($labelText.Contains($searchText) -or ($comboBox -and (ComboBoxContainsMatch -comboBox $comboBox -searchText $searchText))) {\n                                $matchFound = $true\n                                $controlToHighlight = $control\n                            }\n                        }\n                        \n                        if ($matchFound -and $controlToHighlight) {\n                            $controlToHighlight.Background = $highlightBrush\n                            if ($null -eq $firstMatch) { $firstMatch = $controlToHighlight }\n                        }\n                    }\n                }\n            }\n        }\n        \n        # Scroll to first match if not visible\n        if ($firstMatch -and $tweaksScrollViewer) {\n            ScrollToItemIfNotVisible -scrollViewer $tweaksScrollViewer -item $firstMatch -container $tweaksGrid\n        }\n    })\n\n    # Add Ctrl+F keyboard shortcut to focus search box on current tab\n    $window.Add_KeyDown({\n        param($sender, $e)\n        \n        # Check if Ctrl+F was pressed\n        if ($e.Key -eq [System.Windows.Input.Key]::F -and \n            ([System.Windows.Input.Keyboard]::Modifiers -band [System.Windows.Input.ModifierKeys]::Control)) {\n            \n            $currentTab = $tabControl.SelectedItem\n            \n            # Focus AppSearchBox if on App Removal tab\n            if ($currentTab.Header -eq \"App Removal\" -and $appSearchBox) {\n                $appSearchBox.Focus()\n                $e.Handled = $true\n            }\n            # Focus TweakSearchBox if on Tweaks tab\n            elseif ($currentTab.Header -eq \"Tweaks\" -and $tweakSearchBox) {\n                $tweakSearchBox.Focus()\n                $e.Handled = $true\n            }\n        }\n    })\n\n    # Wizard Navigation\n    $tabControl = $window.FindName('MainTabControl')\n    $previousBtn = $window.FindName('PreviousBtn')\n    $nextBtn = $window.FindName('NextBtn')\n    $userSelectionCombo = $window.FindName('UserSelectionCombo')\n    $userSelectionDescription = $window.FindName('UserSelectionDescription')\n    $otherUserPanel = $window.FindName('OtherUserPanel')\n    $otherUsernameTextBox = $window.FindName('OtherUsernameTextBox')\n    $usernameTextBoxPlaceholder = $window.FindName('UsernameTextBoxPlaceholder')\n    $usernameValidationMessage = $window.FindName('UsernameValidationMessage')\n    $appRemovalScopeCombo = $window.FindName('AppRemovalScopeCombo')\n    $appRemovalScopeDescription = $window.FindName('AppRemovalScopeDescription')\n    $appRemovalScopeSection = $window.FindName('AppRemovalScopeSection')\n    $appRemovalScopeCurrentUser = $window.FindName('AppRemovalScopeCurrentUser')\n    $appRemovalScopeTargetUser = $window.FindName('AppRemovalScopeTargetUser')\n\n    # Navigation button handlers\n    function UpdateNavigationButtons {\n        $currentIndex = $tabControl.SelectedIndex\n        $totalTabs = $tabControl.Items.Count\n        \n        $homeIndex = 0\n        $overviewIndex = $totalTabs - 1\n\n        # Navigation button visibility\n        if ($currentIndex -eq $homeIndex) {\n            $nextBtn.Visibility = 'Collapsed'\n            $previousBtn.Visibility = 'Collapsed'\n        } elseif ($currentIndex -eq $overviewIndex) {\n            $nextBtn.Visibility = 'Collapsed'\n            $previousBtn.Visibility = 'Visible'\n        } else {\n            $nextBtn.Visibility = 'Visible'\n            $previousBtn.Visibility = 'Visible'\n        }\n        \n        # Update progress indicators\n        # Tab indices: 0=Home, 1=App Removal, 2=Tweaks, 3=Deployment Settings\n        $progressIndicator1 = $window.FindName('ProgressIndicator1') # App Removal\n        $progressIndicator2 = $window.FindName('ProgressIndicator2') # Tweaks\n        $progressIndicator3 = $window.FindName('ProgressIndicator3') # Deployment Settings\n        $bottomNavGrid = $window.FindName('BottomNavGrid')\n        \n        # Hide bottom navigation on home page\n        if ($currentIndex -eq 0) {\n            $bottomNavGrid.Visibility = 'Collapsed'\n        } else {\n            $bottomNavGrid.Visibility = 'Visible'\n        }\n        \n        # Update indicator colors based on current tab\n        # Indicator 1 (App Removal) - tab index 1\n        if ($currentIndex -ge 1) {\n            $progressIndicator1.Fill = $window.Resources['ProgressActiveColor']\n        } else {\n            $progressIndicator1.Fill = $window.Resources['ProgressInactiveColor']\n        }\n        \n        # Indicator 2 (Tweaks) - tab index 2\n        if ($currentIndex -ge 2) {\n            $progressIndicator2.Fill = $window.Resources['ProgressActiveColor']\n        } else {\n            $progressIndicator2.Fill = $window.Resources['ProgressInactiveColor']\n        }\n        \n        # Indicator 3 (Deployment Settings) - tab index 3\n        if ($currentIndex -ge 3) {\n            $progressIndicator3.Fill = $window.Resources['ProgressActiveColor']\n        } else {\n            $progressIndicator3.Fill = $window.Resources['ProgressInactiveColor']\n        }\n    }\n\n    # Update user selection description and show/hide other user panel\n    $userSelectionCombo.Add_SelectionChanged({\n        switch ($userSelectionCombo.SelectedIndex) {\n            0 { \n                $userSelectionDescription.Text = \"Changes will be applied to the currently logged-in user profile.\"\n                $otherUserPanel.Visibility = 'Collapsed'\n                $usernameValidationMessage.Text = \"\"\n                # Show \"Current user only\" option, hide \"Target user only\" option\n                $appRemovalScopeCurrentUser.Visibility = 'Visible'\n                $appRemovalScopeTargetUser.Visibility = 'Collapsed'\n                # Enable app removal scope selection for current user\n                $appRemovalScopeCombo.IsEnabled = $true\n                $appRemovalScopeCombo.SelectedIndex = 0\n            }\n            1 { \n                $userSelectionDescription.Text = \"Changes will be applied to a different user profile on this system.\"\n                $otherUserPanel.Visibility = 'Visible'\n                $usernameValidationMessage.Text = \"\"\n                # Hide \"Current user only\" option, show \"Target user only\" option\n                $appRemovalScopeCurrentUser.Visibility = 'Collapsed'\n                $appRemovalScopeTargetUser.Visibility = 'Visible'\n                # Enable app removal scope selection for other user\n                $appRemovalScopeCombo.IsEnabled = $true\n                $appRemovalScopeCombo.SelectedIndex = 0\n            }\n            2 { \n                $userSelectionDescription.Text = \"Changes will be applied to the default user template, affecting all new users created after this point. Useful for Sysprep deployment.\"\n                $otherUserPanel.Visibility = 'Collapsed'\n                $usernameValidationMessage.Text = \"\"\n                # Hide other user options since they don't apply to default user template\n                $appRemovalScopeCurrentUser.Visibility = 'Collapsed'\n                $appRemovalScopeTargetUser.Visibility = 'Collapsed'\n                # Lock app removal scope to \"All users\" when applying to sysprep\n                $appRemovalScopeCombo.IsEnabled = $false\n                $appRemovalScopeCombo.SelectedIndex = 0\n            }\n        }\n    })\n\n    # Helper function to update app removal scope description\n    function UpdateAppRemovalScopeDescription {\n        $selectedItem = $appRemovalScopeCombo.SelectedItem\n        if ($selectedItem) {\n            switch ($selectedItem.Content) {\n                \"All users\" { \n                    $appRemovalScopeDescription.Text = \"Apps will be removed for all users and from the Windows image to prevent reinstallation for new users.\"\n                }\n                \"Current user only\" { \n                    $appRemovalScopeDescription.Text = \"Apps will only be removed for the current user. Other users and new users will not be affected.\"\n                }\n                \"Target user only\" { \n                    $appRemovalScopeDescription.Text = \"Apps will only be removed for the specified target user. Other users and new users will not be affected.\"\n                }\n            }\n        }\n    }\n\n    # Update app removal scope description\n    $appRemovalScopeCombo.Add_SelectionChanged({\n        UpdateAppRemovalScopeDescription\n    })\n\n    $otherUsernameTextBox.Add_TextChanged({\n        # Show/hide placeholder\n        if ([string]::IsNullOrWhiteSpace($otherUsernameTextBox.Text)) {\n            $usernameTextBoxPlaceholder.Visibility = 'Visible'\n        } else {\n            $usernameTextBoxPlaceholder.Visibility = 'Collapsed'\n        }\n        \n        ValidateOtherUsername\n    })\n\n    function ValidateOtherUsername {\n        # Only validate if \"Other User\" is selected\n        if ($userSelectionCombo.SelectedIndex -ne 1) {\n            return $true\n        }\n\n        $username = $otherUsernameTextBox.Text.Trim()\n\n        $errorBrush   = $window.Resources['ValidationErrorColor']\n        $successBrush = $window.Resources['ValidationSuccessColor']\n\n        if ($username.Length -eq 0) {\n            $usernameValidationMessage.Text = \"Please enter a username\"\n            $usernameValidationMessage.Foreground = $errorBrush\n            return $false\n        }\n        \n        if ($username -eq $env:USERNAME) {\n            $usernameValidationMessage.Text = \"Cannot enter your own username, use 'Current User' option instead\"\n            $usernameValidationMessage.Foreground = $errorBrush\n            return $false\n        }\n        \n        $userExists = CheckIfUserExists -Username $username\n\n        if ($userExists) {\n            if (TestIfUserIsLoggedIn -Username $username) {\n                $usernameValidationMessage.Text = \"User '$username' is currently logged in. Please sign out that user first.\"\n                $usernameValidationMessage.Foreground = $errorBrush\n                return $false\n            }\n\n            $usernameValidationMessage.Text = \"User found: $username\"\n            $usernameValidationMessage.Foreground = $successBrush\n            return $true\n        }\n\n        $usernameValidationMessage.Text = \"User not found, please enter a valid username\"\n        $usernameValidationMessage.Foreground = $errorBrush\n        return $false\n    }\n\n    function GenerateOverview {\n        $changesList = @()\n        \n        # Collect selected apps\n        $selectedAppsCount = 0\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox] -and $child.IsChecked) {\n                $selectedAppsCount++\n            }\n        }\n        if ($selectedAppsCount -gt 0) {\n            $changesList += \"Remove $selectedAppsCount application(s)\"\n        }\n        \n        # Update app removal scope section based on whether apps are selected\n        if ($selectedAppsCount -gt 0) {\n            # Enable app removal scope selection (unless locked by sysprep mode)\n            if ($userSelectionCombo.SelectedIndex -ne 2) {\n                $appRemovalScopeCombo.IsEnabled = $true\n            }\n            $appRemovalScopeSection.Opacity = 1.0\n            UpdateAppRemovalScopeDescription\n        }\n        else {\n            # Disable app removal scope selection when no apps selected\n            $appRemovalScopeCombo.IsEnabled = $false\n            $appRemovalScopeSection.Opacity = 0.5\n            $appRemovalScopeDescription.Text = \"No apps selected for removal.\"\n        }\n        \n        # Collect all ComboBox/CheckBox selections from dynamically created controls\n        if ($script:UiControlMappings) {\n            foreach ($mappingKey in $script:UiControlMappings.Keys) {\n                $control = $window.FindName($mappingKey)\n                $isSelected = $false\n                \n                # Check if it's a checkbox or combobox\n                if ($control -is [System.Windows.Controls.CheckBox]) {\n                    $isSelected = $control.IsChecked -eq $true\n                }\n                elseif ($control -is [System.Windows.Controls.ComboBox]) {\n                    $isSelected = $control.SelectedIndex -gt 0\n                }\n                \n                if ($control -and $isSelected) {\n                    $mapping = $script:UiControlMappings[$mappingKey]\n                    if ($mapping.Type -eq 'group') {\n                        # For combobox: SelectedIndex 0 = No Change, so subtract 1 to index into Values\n                        $selectedValue = $mapping.Values[$control.SelectedIndex - 1]\n                        foreach ($fid in $selectedValue.FeatureIds) {\n                            $label = $script:FeatureLabelLookup[$fid]\n                            if ($label) { $changesList += $label }\n                        }\n                    }\n                    elseif ($mapping.Type -eq 'feature') {\n                        $label = $script:FeatureLabelLookup[$mapping.FeatureId]\n                        if (-not $label) { $label = $mapping.Action + ' ' + $mapping.Label }\n                        $changesList += $label\n                    }\n                }\n            }\n        }\n        \n        return $changesList\n    }\n\n    function ShowChangesOverview {\n        $changesList = GenerateOverview\n\n        if ($changesList.Count -eq 0) {\n            Show-MessageBox -Message 'No changes have been selected.' -Title 'Selected Changes' -Button 'OK' -Icon 'Information'\n            return\n        }\n\n        $message = ($changesList | ForEach-Object { \"$([char]0x2022) $_\" }) -join \"`n\"\n        Show-MessageBox -Message $message -Title 'Selected Changes' -Button 'OK' -Icon 'None' -Width 600\n    }\n\n    $previousBtn.Add_Click({\n        Hide-Bubble -Immediate\n        if ($tabControl.SelectedIndex -gt 0) {\n            $tabControl.SelectedIndex--\n            UpdateNavigationButtons\n        }\n    })\n\n    $nextBtn.Add_Click({\n        if ($tabControl.SelectedIndex -lt ($tabControl.Items.Count - 1)) {\n            $tabControl.SelectedIndex++\n            UpdateNavigationButtons\n        }\n    })\n\n    # Handle Home Start button\n    $homeStartBtn = $window.FindName('HomeStartBtn')\n    $homeStartBtn.Add_Click({\n        # Navigate to first tab after home (App Removal)\n        $tabControl.SelectedIndex = 1\n        UpdateNavigationButtons\n    })\n\n    # Handle Home Default Mode button - apply defaults and navigate directly to overview\n    $homeDefaultModeBtn = $window.FindName('HomeDefaultModeBtn')\n    $homeDefaultModeBtn.Add_Click({\n        # Load and apply default settings\n        $defaultsJson = LoadJsonFile -filePath $script:DefaultSettingsFilePath -expectedVersion \"1.0\"\n        if ($defaultsJson) {\n            ApplySettingsToUiControls -window $window -settingsJson $defaultsJson -uiControlMappings $script:UiControlMappings\n        }\n\n        # Deselect all apps, then select default apps (defer if apps are still loading in the background)\n        if ($script:IsLoadingApps) {\n            $script:PendingDefaultMode = $true\n        } else {\n            ApplyPresetToApps -MatchFilter { param($c) $c.SelectedByDefault -eq $true } -Exclusive\n        }\n\n        # Navigate directly to the Deployment Settings tab\n        $tabControl.SelectedIndex = 3\n        UpdateNavigationButtons\n\n        # Show contextual hint bubble for the Review Changes link\n        $window.Dispatcher.BeginInvoke([System.Windows.Threading.DispatcherPriority]::Loaded, [action]{\n            Show-Bubble -TargetControl $reviewChangesBtn -Message 'View the selected changes here'\n        }) | Out-Null\n    })\n\n    # Handle Review Changes link button\n    $reviewChangesBtn = $window.FindName('ReviewChangesBtn')\n    $reviewChangesBtn.Add_Click({\n        Hide-Bubble\n        ShowChangesOverview\n    })\n\n    # Handle Apply Changes button - validates and immediately starts applying changes\n    $deploymentApplyBtn = $window.FindName('DeploymentApplyBtn')\n    $deploymentApplyBtn.Add_Click({\n        if (-not (ValidateOtherUsername)) {\n            $validationMessage = if (-not [string]::IsNullOrWhiteSpace($usernameValidationMessage.Text)) {\n                $usernameValidationMessage.Text\n            }\n            else {\n                \"Please enter a valid username.\"\n            }\n            Show-MessageBox -Message $validationMessage -Title \"Invalid Username\" -Button 'OK' -Icon 'Warning' | Out-Null\n            return\n        }\n\n        Hide-Bubble -Immediate\n\n        # App Removal - collect selected apps from integrated UI\n        $selectedApps = @()\n        foreach ($child in $appsPanel.Children) {\n            if ($child -is [System.Windows.Controls.CheckBox] -and $child.IsChecked) {\n                $selectedApps += $child.Tag\n            }\n        }\n        \n        if ($selectedApps.Count -gt 0) {\n            # Check if Microsoft Store is selected\n            if ($selectedApps -contains \"Microsoft.WindowsStore\") {\n                $result = Show-MessageBox -Message 'Are you sure you wish to uninstall the Microsoft Store? This app cannot easily be reinstalled.' -Title 'Are you sure?' -Button 'YesNo' -Icon 'Warning'\n\n                if ($result -eq 'No') {\n                    return\n                }\n            }\n            \n            AddParameter 'RemoveApps'\n            AddParameter 'Apps' ($selectedApps -join ',')\n            \n            # Add app removal target parameter based on selection\n            $selectedScopeItem = $appRemovalScopeCombo.SelectedItem\n            if ($selectedScopeItem) {\n                switch ($selectedScopeItem.Content) {\n                    \"All users\" { \n                        AddParameter 'AppRemovalTarget' 'AllUsers'\n                    }\n                    \"Current user only\" { \n                        AddParameter 'AppRemovalTarget' 'CurrentUser'\n                    }\n                    \"Target user only\" { \n                        # Use the target username from Other User panel\n                        AddParameter 'AppRemovalTarget' ($otherUsernameTextBox.Text.Trim())\n                    }\n                }\n            }\n        }\n\n        # Apply dynamic tweaks selections\n        if ($script:UiControlMappings) {\n            foreach ($mappingKey in $script:UiControlMappings.Keys) {\n                $control = $window.FindName($mappingKey)\n                $isSelected = $false\n                $selectedIndex = 0\n                \n                # Check if it's a checkbox or combobox\n                if ($control -is [System.Windows.Controls.CheckBox]) {\n                    $isSelected = $control.IsChecked -eq $true\n                    $selectedIndex = if ($isSelected) { 1 } else { 0 }\n                }\n                elseif ($control -is [System.Windows.Controls.ComboBox]) {\n                    $isSelected = $control.SelectedIndex -gt 0\n                    $selectedIndex = $control.SelectedIndex\n                }\n                \n                if ($control -and $isSelected) {\n                    $mapping = $script:UiControlMappings[$mappingKey]\n                    if ($mapping.Type -eq 'group') {\n                        if ($selectedIndex -gt 0 -and $selectedIndex -le $mapping.Values.Count) {\n                            $selectedValue = $mapping.Values[$selectedIndex - 1]\n                            foreach ($fid in $selectedValue.FeatureIds) { \n                                AddParameter $fid\n                            }\n                        }\n                    }\n                    elseif ($mapping.Type -eq 'feature') {\n                        AddParameter $mapping.FeatureId\n                    }\n                }\n            }\n        }\n\n        $controlParamsCount = 0\n        foreach ($Param in $script:ControlParams) {\n            if ($script:Params.ContainsKey($Param)) {\n                $controlParamsCount++\n            }\n        }\n\n        # Check if any changes were selected\n        $totalChanges = $script:Params.Count - $controlParamsCount\n\n        # Apps parameter does not count as a change itself\n        if ($script:Params.ContainsKey('Apps')) {\n            $totalChanges = $totalChanges - 1\n        }\n\n        if ($totalChanges -eq 0) {\n            Show-MessageBox -Message 'No changes have been selected, please select at least one option to proceed.' -Title 'No Changes Selected' -Button 'OK' -Icon 'Information'\n            return\n        }\n\n        # Check RestorePointCheckBox\n        $restorePointCheckBox = $window.FindName('RestorePointCheckBox')\n        if ($restorePointCheckBox -and $restorePointCheckBox.IsChecked) {\n            AddParameter 'CreateRestorePoint'\n        }\n        \n        # Store selected user mode\n        switch ($userSelectionCombo.SelectedIndex) {\n            0 { \n                Write-Host \"Selected user mode: current user ($(GetUserName))\"\n            }\n            1 { \n                Write-Host \"Selected user mode: $($otherUsernameTextBox.Text.Trim())\"\n                AddParameter User ($otherUsernameTextBox.Text.Trim()) \n            }\n            2 {\n                Write-Host \"Selected user mode: default user profile (Sysprep)\"\n                AddParameter Sysprep\n            }\n        }\n\n        SaveSettings\n\n        # Check if user wants to restart explorer\n        $restartExplorerCheckBox = $window.FindName('RestartExplorerCheckBox')\n        $shouldRestartExplorer = $restartExplorerCheckBox -and $restartExplorerCheckBox.IsChecked\n\n        # Show the apply changes window\n        Show-ApplyModal -Owner $window -RestartExplorer $shouldRestartExplorer\n\n        # Close the main window after the apply dialog closes\n        $window.Close()\n    })\n\n    # Initialize UI elements on window load\n    $window.Add_Loaded({\n        BuildDynamicTweaks\n\n        LoadAppsIntoMainUI\n\n        # Update Current User label with username\n        if ($userSelectionCombo -and $userSelectionCombo.Items.Count -gt 0) {\n            $currentUserItem = $userSelectionCombo.Items[0]\n            if ($currentUserItem -is [System.Windows.Controls.ComboBoxItem]) {\n                $currentUserItem.Content = \"Current User ($(GetUserName))\"\n            }\n        }\n\n        # Disable Restart Explorer option if NoRestartExplorer parameter is set\n        $restartExplorerCheckBox = $window.FindName('RestartExplorerCheckBox')\n        if ($restartExplorerCheckBox -and $script:Params.ContainsKey(\"NoRestartExplorer\")) {\n            $restartExplorerCheckBox.IsChecked = $false\n            $restartExplorerCheckBox.IsEnabled = $false\n        }\n\n        # Force Apply Changes To setting if Sysprep or User parameters are set\n        if ($script:Params.ContainsKey(\"Sysprep\")) {\n            $userSelectionCombo.SelectedIndex = 2\n            $userSelectionCombo.IsEnabled = $false\n        }\n        elseif ($script:Params.ContainsKey(\"User\")) {\n            $userSelectionCombo.SelectedIndex = 1\n            $userSelectionCombo.IsEnabled = $false\n            $otherUsernameTextBox.Text = $script:Params.Item(\"User\")\n            $otherUsernameTextBox.IsEnabled = $false\n        }\n\n        UpdateNavigationButtons\n    })\n\n    # Add event handler for tab changes\n    $tabControl.Add_SelectionChanged({\n        # Regenerate overview when switching to Overview tab\n        if ($tabControl.SelectedIndex -eq ($tabControl.Items.Count - 2)) {\n            GenerateOverview\n        }\n        UpdateNavigationButtons\n    })\n\n    # Handle Load Defaults button\n    $loadDefaultsBtn = $window.FindName('LoadDefaultsBtn')\n    $loadDefaultsBtn.Add_Click({\n        $defaultsJson = LoadJsonFile -filePath $script:DefaultSettingsFilePath -expectedVersion \"1.0\"\n\n        if (-not $defaultsJson) {\n            Show-MessageBox -Message \"Failed to load default settings file\" -Title \"Error\" -Button 'OK' -Icon 'Error'\n            return\n        }\n        \n        ApplySettingsToUiControls -window $window -settingsJson $defaultsJson -uiControlMappings $script:UiControlMappings\n    })\n\n    # Handle Load Last Used settings and Load Last Used apps\n    $loadLastUsedBtn = $window.FindName('LoadLastUsedBtn')\n\n    $lastUsedSettingsJson = LoadJsonFile -filePath $script:SavedSettingsFilePath -expectedVersion \"1.0\" -optionalFile\n\n    $hasSettings = $false\n    $appsSetting = $null\n    if ($lastUsedSettingsJson -and $lastUsedSettingsJson.Settings) {\n        foreach ($s in $lastUsedSettingsJson.Settings) {\n            # Only count as hasSettings if a setting other than RemoveApps/Apps is present and true\n            if ($s.Value -eq $true -and $s.Name -ne 'RemoveApps' -and $s.Name -ne 'Apps') { $hasSettings = $true }\n            if ($s.Name -eq 'Apps' -and $s.Value) { $appsSetting = $s.Value }\n        }\n    }\n\n    # Show option to load last used settings if they exist\n    if ($hasSettings) {\n        $loadLastUsedBtn.Add_Click({\n            try {\n                ApplySettingsToUiControls -window $window -settingsJson $lastUsedSettingsJson -uiControlMappings $script:UiControlMappings\n            }\n            catch {\n                Show-MessageBox -Message \"Failed to load last used settings: $_\" -Title \"Error\" -Button 'OK' -Icon 'Error'\n            }\n        })\n    }\n    else {\n        $loadLastUsedBtn.Visibility = 'Collapsed'\n    }\n\n    # Preset: Last used selection (wired to PresetLastUsed checkbox)\n    if ($appsSetting -and $appsSetting.ToString().Trim().Length -gt 0) {\n        # Parse and store saved app IDs for UpdatePresetStates\n        $script:SavedAppIds = @()\n        if ($appsSetting -is [string]) { $script:SavedAppIds = $appsSetting.Split(',') }\n        elseif ($appsSetting -is [array]) { $script:SavedAppIds = $appsSetting }\n        $script:SavedAppIds = $script:SavedAppIds | ForEach-Object { $_.Trim() } | Where-Object { $_ -ne '' }\n\n        $presetLastUsed.Add_Click({\n            if ($script:UpdatingPresets) { return }\n            $check = ($this.IsChecked -eq $true)\n            if ($this.IsChecked -eq $null) { $this.IsChecked = $false; $check = $false }\n            ApplyPresetToApps -MatchFilter { param($c) $script:SavedAppIds -contains $c.Tag } -Check $check\n        })\n    }\n    else {\n        $script:SavedAppIds = $null\n        $presetLastUsed.Visibility = 'Collapsed'\n    }\n\n    # Clear All Tweaks button\n    $clearAllTweaksBtn = $window.FindName('ClearAllTweaksBtn')\n    $clearAllTweaksBtn.Add_Click({\n        # Reset all ComboBoxes to index 0 (No Change) and uncheck all CheckBoxes\n        if ($script:UiControlMappings) {\n            foreach ($comboName in $script:UiControlMappings.Keys) {\n                $control = $window.FindName($comboName)\n                if ($control -is [System.Windows.Controls.CheckBox]) {\n                    $control.IsChecked = $false\n                }\n                elseif ($control -is [System.Windows.Controls.ComboBox]) {\n                    $control.SelectedIndex = 0\n                }\n            }\n        }\n    })\n\n    # Preload app data to speed up loading when user navigates to App Removal tab\n    try {\n        $script:PreloadedAppData = LoadAppsDetailsFromJson -OnlyInstalled:$false -InstalledList '' -InitialCheckedFromJson:$false\n    }\n    catch {\n        Write-Warning \"Failed to preload apps list: $_\"\n    }\n\n    # Show the window\n    return $window.ShowDialog()\n}\n"
  },
  {
    "path": "Scripts/GUI/Show-MessageBox.ps1",
    "content": "# Shows a Windows 11 styled custom message box\nfunction Show-MessageBox {\n    param (\n        [Parameter(Mandatory=$true)]\n        [string]$Message,\n        \n        [Parameter(Mandatory=$false)]\n        [string]$Title = \"Win11Debloat\",\n        \n        [Parameter(Mandatory=$false)]\n        [ValidateSet('OK', 'OKCancel', 'YesNo')]\n        [string]$Button = 'OK',\n        \n        [Parameter(Mandatory=$false)]\n        [ValidateSet('None', 'Information', 'Warning', 'Error', 'Question')]\n        [string]$Icon = 'None',\n        \n        [Parameter(Mandatory=$false)]\n        [System.Windows.Window]$Owner = $null,\n        \n        [Parameter(Mandatory=$false)]\n        [int]$Width = 0\n    )\n    \n    Add-Type -AssemblyName PresentationFramework,PresentationCore,WindowsBase | Out-Null\n    \n    $usesDarkMode = GetSystemUsesDarkMode\n    \n    # Determine owner window - use provided Owner, or fall back to main GUI window\n    $ownerWindow = if ($Owner) { $Owner } else { $script:GuiWindow }\n    \n    # Show overlay if owner window exists\n    $overlay = $null\n    $overlayWasAlreadyVisible = $false\n    if ($ownerWindow) {\n        try {\n            $overlay = $ownerWindow.FindName('ModalOverlay')\n            if ($overlay) {\n                $overlayWasAlreadyVisible = ($overlay.Visibility -eq 'Visible')\n                if (-not $overlayWasAlreadyVisible) {\n                    $ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Visible' })\n                }\n            }\n        }\n        catch { }\n    }\n    \n    # Load XAML from file\n    $xaml = Get-Content -Path $script:MessageBoxSchema -Raw\n    $reader = [System.Xml.XmlReader]::Create([System.IO.StringReader]::new($xaml))\n    try {\n        $msgWindow = [System.Windows.Markup.XamlReader]::Load($reader)\n    }\n    finally {\n        $reader.Close()\n    }\n    \n    # Set owner to owner window if it exists\n    if ($ownerWindow) {\n        try {\n            $msgWindow.Owner = $ownerWindow\n        }\n        catch { }\n    }\n    \n    # Apply custom width if specified\n    if ($Width -gt 0) {\n        $msgWindow.Width = $Width\n    }\n    \n    # Apply theme resources\n    SetWindowThemeResources -window $msgWindow -usesDarkMode $usesDarkMode\n    \n    # Get UI elements\n    $titleText = $msgWindow.FindName('TitleText')\n    $messageText = $msgWindow.FindName('MessageText')\n    $iconText = $msgWindow.FindName('IconText')\n    $button1 = $msgWindow.FindName('Button1')\n    $button2 = $msgWindow.FindName('Button2')\n    $titleBar = $msgWindow.FindName('TitleBar')\n    \n    # Set title and message\n    $titleText.Text = $Title\n    $messageText.Text = $Message\n    \n    # Configure icon\n    switch ($Icon) {\n        'Information' { \n            $iconText.Text = [char]0xE946\n            $iconText.Foreground = $msgWindow.FindResource('InformationIconColor')\n            $iconText.Visibility = 'Visible'\n        }\n        'Warning' { \n            $iconText.Text = [char]0xE7BA\n            $iconText.Foreground = $msgWindow.FindResource('WarningIconColor')\n            $iconText.Visibility = 'Visible'\n        }\n        'Error' { \n            $iconText.Text = [char]0xEA39\n            $iconText.Foreground = $msgWindow.FindResource('ErrorIconColor')\n            $iconText.Visibility = 'Visible'\n        }\n        'Question' { \n            $iconText.Text = [char]0xE897\n            $iconText.Foreground = $msgWindow.FindResource('QuestionIconColor')\n            $iconText.Visibility = 'Visible'\n        }\n        default {\n            $iconText.Visibility = 'Collapsed'\n        }\n    }\n    \n    # Configure buttons - store result in window's Tag property\n    switch ($Button) {\n        'OK' {\n            $button1.Content = 'OK'\n            $button1.Add_Click({ $msgWindow.Tag = 'OK'; $msgWindow.Close() })\n            $button2.Visibility = 'Collapsed'\n        }\n        'OKCancel' {\n            $button1.Content = 'OK'\n            $button2.Content = 'Cancel'\n            $button1.Add_Click({ $msgWindow.Tag = 'OK'; $msgWindow.Close() })\n            $button2.Add_Click({ $msgWindow.Tag = 'Cancel'; $msgWindow.Close() })\n            $button2.Visibility = 'Visible'\n        }\n        'YesNo' {\n            $button1.Content = 'Yes'\n            $button2.Content = 'No'\n            $button1.Add_Click({ $msgWindow.Tag = 'Yes'; $msgWindow.Close() })\n            $button2.Add_Click({ $msgWindow.Tag = 'No'; $msgWindow.Close() })\n            $button2.Visibility = 'Visible'\n        }\n    }\n    \n    # Title bar drag to move window\n    $titleBar.Add_MouseLeftButtonDown({\n        $msgWindow.DragMove()\n    })\n    \n    # Handle Escape key to close\n    $msgWindow.Add_KeyDown({\n        param($sender, $e)\n        if ($e.Key -eq 'Escape') {\n            if ($Button -eq 'OK') {\n                $msgWindow.Tag = 'OK'\n            } else {\n                $msgWindow.Tag = 'Cancel'\n            }\n            $msgWindow.Close()\n        }\n    })\n    \n    # Show dialog and return result from Tag\n    $msgWindow.ShowDialog() | Out-Null\n    \n    # Hide overlay after dialog closes (only if this dialog was the one that showed it)\n    if ($overlay -and -not $overlayWasAlreadyVisible) {\n        try {\n            $ownerWindow.Dispatcher.Invoke([action]{ $overlay.Visibility = 'Collapsed' })\n        }\n        catch { }\n    }\n    \n    return $msgWindow.Tag\n}\n"
  },
  {
    "path": "Scripts/Get.ps1",
    "content": "param (\n    [switch]$CLI,\n    [switch]$Silent,\n    [switch]$Verbose,\n    [switch]$Sysprep,\n    [string]$LogPath,\n    [string]$User,\n    [switch]$NoRestartExplorer,\n    [switch]$CreateRestorePoint,\n    [switch]$RunAppsListGenerator,\n    [switch]$RunDefaults,\n    [switch]$RunDefaultsLite,\n    [switch]$RunSavedSettings,\n    [string]$Apps,\n    [string]$AppRemovalTarget,\n    [switch]$RemoveApps,\n    [switch]$RemoveAppsCustom,\n    [switch]$RemoveGamingApps,\n    [switch]$RemoveCommApps,\n    [switch]$RemoveHPApps,\n    [switch]$RemoveW11Outlook,\n    [switch]$ForceRemoveEdge,\n    [switch]$DisableDVR,\n    [switch]$DisableGameBarIntegration,\n    [switch]$EnableWindowsSandbox,\n    [switch]$EnableWindowsSubsystemForLinux,\n    [switch]$DisableTelemetry,\n    [switch]$DisableSearchHistory,\n    [switch]$DisableFastStartup,\n    [switch]$DisableBitlockerAutoEncryption,\n    [switch]$DisableModernStandbyNetworking,\n    [switch]$DisableStorageSense,\n    [switch]$DisableUpdateASAP,\n    [switch]$PreventUpdateAutoReboot,\n    [switch]$DisableDeliveryOptimization,\n    [switch]$DisableBing,\n    [switch]$DisableStoreSearchSuggestions,\n    [switch]$DisableDesktopSpotlight,\n    [switch]$DisableLockscreenTips,\n    [switch]$DisableSuggestions,\n    [switch]$DisableLocationServices,\n    [switch]$DisableFindMyDevice,\n    [switch]$DisableEdgeAds,\n    [switch]$DisableBraveBloat,\n    [switch]$DisableSettings365Ads,\n    [switch]$DisableSettingsHome,\n    [switch]$ShowHiddenFolders,\n    [switch]$ShowKnownFileExt,\n    [switch]$HideDupliDrive,\n    [switch]$EnableDarkMode,\n    [switch]$DisableTransparency,\n    [switch]$DisableAnimations,\n    [switch]$TaskbarAlignLeft,\n    [switch]$CombineTaskbarAlways, [switch]$CombineTaskbarWhenFull, [switch]$CombineTaskbarNever,\n    [switch]$CombineMMTaskbarAlways, [switch]$CombineMMTaskbarWhenFull, [switch]$CombineMMTaskbarNever,\n    [switch]$MMTaskbarModeAll, [switch]$MMTaskbarModeMainActive, [switch]$MMTaskbarModeActive,\n    [switch]$HideSearchTb, [switch]$ShowSearchIconTb, [switch]$ShowSearchLabelTb, [switch]$ShowSearchBoxTb,\n    [switch]$HideTaskview,\n    [switch]$DisableStartRecommended,\n    [switch]$DisableStartAllApps,\n    [switch]$DisableStartPhoneLink,\n    [switch]$DisableCopilot,\n    [switch]$DisableRecall,\n    [switch]$DisableClickToDo,\n    [switch]$DisableAISvcAutoStart,\n    [switch]$DisablePaintAI,\n    [switch]$DisableNotepadAI,\n    [switch]$DisableEdgeAI,\n    [switch]$DisableSearchHighlights,\n    [switch]$DisableWidgets,\n    [switch]$HideChat,\n    [switch]$EnableEndTask,\n    [switch]$EnableLastActiveClick,\n    [switch]$ClearStart,\n    [string]$ReplaceStart,\n    [switch]$ClearStartAllUsers,\n    [string]$ReplaceStartAllUsers,\n    [switch]$RevertContextMenu,\n    [switch]$DisableDragTray,\n    [switch]$DisableMouseAcceleration,\n    [switch]$DisableStickyKeys,\n    [switch]$DisableWindowSnapping,\n    [switch]$DisableSnapAssist,\n    [switch]$DisableSnapLayouts,\n    [switch]$HideTabsInAltTab, [switch]$Show3TabsInAltTab, [switch]$Show5TabsInAltTab, [switch]$Show20TabsInAltTab,\n    [switch]$HideHome,\n    [switch]$HideGallery,\n    [switch]$ExplorerToHome,\n    [switch]$ExplorerToThisPC,\n    [switch]$ExplorerToDownloads,\n    [switch]$ExplorerToOneDrive,\n    [switch]$AddFoldersToThisPC,\n    [switch]$HideOnedrive,\n    [switch]$Hide3dObjects,\n    [switch]$HideMusic,\n    [switch]$HideIncludeInLibrary,\n    [switch]$HideGiveAccessTo,\n    [switch]$HideShare\n)\n\n# Show error if current powershell environment does not have LanguageMode set to FullLanguage \nif ($ExecutionContext.SessionState.LanguageMode -ne \"FullLanguage\") {\n   Write-Host \"Error: Win11Debloat is unable to run on your system. PowerShell execution is restricted by security policies\" -ForegroundColor Red\n   Write-Output \"\"\n   Write-Output \"Press enter to exit...\"\n   Read-Host | Out-Null\n   Exit\n}\n\nClear-Host\nWrite-Output \"-------------------------------------------------------------------------------------------\"\nWrite-Output \" Win11Debloat Script - Get\"\nWrite-Output \"-------------------------------------------------------------------------------------------\"\n\nWrite-Output \"> Downloading Win11Debloat...\"\n\n# Download latest version of Win11Debloat from GitHub as zip archive\ntry {\n    $LatestReleaseUri = (Invoke-RestMethod https://api.github.com/repos/Raphire/Win11Debloat/releases/latest).zipball_url\n    Invoke-RestMethod $LatestReleaseUri -OutFile \"$env:TEMP/win11debloat.zip\"\n}\ncatch {\n    Write-Host \"Error: Unable to fetch latest release from GitHub. Please check your internet connection and try again.\" -ForegroundColor Red\n    Write-Output \"\"\n    Write-Output \"Press enter to exit...\"\n    Read-Host | Out-Null\n    Exit\n}\n\nWrite-Output \"\"\nWrite-Output \"> Cleaning up old Win11Debloat folder...\"\n\n# Remove old script folder if it exists, but keep config and log files\nif (Test-Path \"$env:TEMP/Win11Debloat\") {\n    Get-ChildItem -Path \"$env:TEMP/Win11Debloat\" -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log,Config,Logs | Remove-Item -Recurse -Force\n}\n\n$configDir = \"$env:TEMP/Win11Debloat/Config\"\n$backupDir = \"$env:TEMP/Win11Debloat/ConfigOld\"\n\n# Temporarily move existing config files if they exist to prevent them from being overwritten by the new script files, will be moved back after the new script is unpacked\nif (Test-Path \"$configDir\") {\n    New-Item -ItemType Directory -Path \"$backupDir\" -Force | Out-Null\n\n    $filesToKeep = @(\n        'CustomAppsList',\n        'LastUsedSettings.json'\n    )\n\n    Get-ChildItem -Path \"$configDir\" -Recurse | Where-Object { $_.Name -in $filesToKeep } | Move-Item -Destination \"$backupDir\"\n\n    Remove-Item \"$configDir\" -Recurse -Force\n}\n\nWrite-Output \"\"\nWrite-Output \"> Unpacking...\"\n\n# Unzip archive to Win11Debloat folder\nExpand-Archive \"$env:TEMP/win11debloat.zip\" \"$env:TEMP/Win11Debloat\"\n\n# Remove archive\nRemove-Item \"$env:TEMP/win11debloat.zip\"\n\n# Move files\nGet-ChildItem -Path \"$env:TEMP/Win11Debloat/Raphire-Win11Debloat-*\" -Recurse | Move-Item -Destination \"$env:TEMP/Win11Debloat\"\n\n# Add existing config files back to Config folder\nif (Test-Path \"$backupDir\") {\n    if (-not (Test-Path \"$configDir\")) {\n        New-Item -ItemType Directory -Path \"$configDir\" -Force | Out-Null\n    }\n\n    Get-ChildItem -Path \"$backupDir\" -Recurse | Move-Item -Destination \"$configDir\"\n    Remove-Item \"$backupDir\" -Recurse -Force\n}\n\n# Make list of arguments to pass on to the script\n$arguments = $($PSBoundParameters.GetEnumerator() | ForEach-Object {\n    if ($_.Value -eq $true) {\n        \"-$($_.Key)\"\n    } \n    else {\n         \"-$($_.Key) \"\"$($_.Value)\"\"\"\n    }\n})\n\nWrite-Output \"\"\nWrite-Output \"> Running Win11Debloat...\"\n\n# Minimize the powershell window when no parameters are provided\nif ($arguments.Count -eq 0) {\n    $windowStyle = \"Minimized\"\n}\nelse {\n    $windowStyle = \"Normal\"\n}\n\n# Remove Powershell 7 modules from path to prevent module loading issues in the script\nif ($PSVersionTable.PSVersion.Major -ge 7) {\n    $NewPSModulePath = $env:PSModulePath -split ';' | Where-Object -FilterScript { $_ -like '*WindowsPowerShell*' }\n    $env:PSModulePath = $NewPSModulePath -join ';'\n}\n\n# Run Win11Debloat script with the provided arguments\n$debloatProcess = Start-Process powershell.exe -WindowStyle $windowStyle -PassThru -ArgumentList \"-executionpolicy bypass -File $env:TEMP\\Win11Debloat\\Win11Debloat.ps1 $arguments\" -Verb RunAs\n\n# Wait for the process to finish before continuing\nif ($null -ne $debloatProcess) {\n    $debloatProcess.WaitForExit()\n}\n\n# Remove all remaining script files, except for CustomAppsList and LastUsedSettings.json files\nif (Test-Path \"$env:TEMP/Win11Debloat\") {\n    Write-Output \"\"\n    Write-Output \"> Cleaning up...\"\n\n    # Cleanup, remove Win11Debloat directory\n    Get-ChildItem -Path \"$env:TEMP/Win11Debloat\" -Exclude CustomAppsList,LastUsedSettings.json,Win11Debloat.log,Win11Debloat-Run.log,Config,Logs | Remove-Item -Recurse -Force\n}\n\nWrite-Output \"\"\n"
  },
  {
    "path": "Scripts/Helpers/AddParameter.ps1",
    "content": "# Add parameter to script and write to file\nfunction AddParameter {\n    param (\n        $parameterName,\n        $value = $true\n    )\n\n    # Add parameter or update its value if key already exists\n    if (-not $script:Params.ContainsKey($parameterName)) {\n        $script:Params.Add($parameterName, $value)\n    }\n    else {\n        $script:Params[$parameterName] = $value\n    }\n}\n"
  },
  {
    "path": "Scripts/Helpers/CheckIfUserExists.ps1",
    "content": "function CheckIfUserExists {\n    param (\n        $userName\n    )\n\n    if ($userName -match '[<>:\"|?*]') {\n        return $false\n    }\n\n    if ([string]::IsNullOrWhiteSpace($userName)) {\n        return $false\n    }\n\n    try {\n        $userExists = Test-Path \"$env:SystemDrive\\Users\\$userName\"\n\n        if ($userExists) {\n            return $true\n        }\n\n        $userExists = Test-Path ($env:USERPROFILE -Replace ('\\\\' + $env:USERNAME + '$'), \"\\$userName\")\n\n        if ($userExists) {\n            return $true\n        }\n    }\n    catch {\n        Write-Error \"Something went wrong when trying to find the user directory path for user $userName. Please ensure the user exists on this system\"\n    }\n\n    return $false\n}\n"
  },
  {
    "path": "Scripts/Helpers/CheckModernStandbySupport.ps1",
    "content": "# Check if this machine supports S0 Modern Standby power state. Returns true if S0 Modern Standby is supported, false otherwise.\nfunction CheckModernStandbySupport {\n    $count = 0\n\n    try {\n        switch -Regex (powercfg /a) {\n            ':' {\n                $count += 1\n            }\n\n            '(.*S0.{1,}\\))' {\n                if ($count -eq 1) {\n                    return $true\n                }\n            }\n        }\n    }\n    catch {\n        Write-Host \"Error: Unable to check for S0 Modern Standby support, powercfg command failed\" -ForegroundColor Red\n        Write-Host \"\"\n        Write-Host \"Press any key to continue...\"\n        $null = [System.Console]::ReadKey()\n        return $true\n    }\n\n    return $false\n}\n"
  },
  {
    "path": "Scripts/Helpers/GenerateAppsList.ps1",
    "content": "# Generates a list of apps to remove based on the Apps parameter\nfunction GenerateAppsList {\n    if (-not ($script:Params[\"Apps\"] -and $script:Params[\"Apps\"] -is [string])) {\n        return @()\n    }\n\n    $appMode = $script:Params[\"Apps\"].toLower()\n\n    switch ($appMode) {\n        'default' {\n            $appsList = LoadAppsFromFile $script:AppsListFilePath\n            return $appsList\n        }\n        default {\n            $appsList = $script:Params[\"Apps\"].Split(',') | ForEach-Object { $_.Trim() }\n            $validatedAppsList = ValidateAppslist $appsList\n            return $validatedAppsList\n        }\n    }\n}\n"
  },
  {
    "path": "Scripts/Helpers/GetFriendlyTargetUserName.ps1",
    "content": "function GetFriendlyTargetUserName {\n    $target = GetTargetUserForAppRemoval\n\n    switch ($target) {\n        \"AllUsers\" { return \"all users\" }\n        \"CurrentUser\" { return \"the current user\" }\n        default { return \"user $target\" }\n    }\n}\n"
  },
  {
    "path": "Scripts/Helpers/GetTargetUserForAppRemoval.ps1",
    "content": "# Target is determined from $script:Params[\"AppRemovalTarget\"] or defaults to \"AllUsers\"\n# Target values: \"AllUsers\" (removes for all users + from image), \"CurrentUser\", or a specific username\nfunction GetTargetUserForAppRemoval {\n    if ($script:Params.ContainsKey(\"AppRemovalTarget\")) {\n        return $script:Params[\"AppRemovalTarget\"]\n    }\n    \n    return \"AllUsers\"\n}\n"
  },
  {
    "path": "Scripts/Helpers/GetUserDirectory.ps1",
    "content": "# Returns the directory path of the specified user, exits script if user path can't be found\nfunction GetUserDirectory {\n    param (\n        $userName,\n        $fileName = \"\",\n        $exitIfPathNotFound = $true\n    )\n\n    try {\n        if (-not (CheckIfUserExists -userName $userName) -and $userName -ne \"*\") {\n            Write-Error \"User $userName does not exist on this system\"\n            AwaitKeyToExit\n        }\n\n        $userDirectoryExists = Test-Path \"$env:SystemDrive\\Users\\$userName\"\n        $userPath = \"$env:SystemDrive\\Users\\$userName\\$fileName\"\n\n        if ((Test-Path $userPath) -or ($userDirectoryExists -and (-not $exitIfPathNotFound))) {\n            return $userPath\n        }\n\n        $userDirectoryExists = Test-Path ($env:USERPROFILE -Replace ('\\\\' + $env:USERNAME + '$'), \"\\$userName\")\n        $userPath = $env:USERPROFILE -Replace ('\\\\' + $env:USERNAME + '$'), \"\\$userName\\$fileName\"\n\n        if ((Test-Path $userPath) -or ($userDirectoryExists -and (-not $exitIfPathNotFound))) {\n            return $userPath\n        }\n    }\n    catch {\n        Write-Error \"Something went wrong when trying to find the user directory path for user $userName. Please ensure the user exists on this system\"\n        AwaitKeyToExit\n    }\n\n    Write-Error \"Unable to find user directory path for user $userName\"\n    AwaitKeyToExit\n}\n"
  },
  {
    "path": "Scripts/Helpers/GetUserName.ps1",
    "content": "function GetUserName {\n    if ($script:Params.ContainsKey(\"User\")) {\n        return $script:Params.Item(\"User\")\n    }\n\n    return $env:USERNAME\n}\n"
  },
  {
    "path": "Scripts/Helpers/TestIfUserIsLoggedIn.ps1",
    "content": "function TestIfUserIsLoggedIn {\n    param(\n        [Parameter(Mandatory)]\n        [string]$Username\n    )\n\n    try {\n        $quserOutput = @(& quser 2>$null)\n        if ($LASTEXITCODE -ne 0 -or -not $quserOutput) {\n            return $false\n        }\n\n        foreach ($line in ($quserOutput | Select-Object -Skip 1)) {\n            if ([string]::IsNullOrWhiteSpace($line)) { continue }\n\n            # Remove current-session marker and split columns.\n            $normalizedLine = $line.TrimStart('>', ' ')\n            $parts = $normalizedLine -split '\\s+'\n            if ($parts.Count -eq 0) { continue }\n\n            $sessionUser = $parts[0]\n            if ([string]::IsNullOrWhiteSpace($sessionUser)) { continue }\n\n            # Normalize possible DOMAIN\\user or user@domain formats.\n            if ($sessionUser.Contains('\\')) {\n                $sessionUser = ($sessionUser -split '\\\\')[-1]\n            }\n            if ($sessionUser.Contains('@')) {\n                $sessionUser = ($sessionUser -split '@')[0]\n            }\n\n            if ($sessionUser.Equals($Username, [System.StringComparison]::OrdinalIgnoreCase)) {\n                return $true\n            }\n        }\n    }\n    catch {\n        return $false\n    }\n\n    return $false\n}\n"
  },
  {
    "path": "Scripts/Threading/DoEvents.ps1",
    "content": "# Processes all pending WPF window messages (input, render, etc.) to keep the UI responsive\n# during long-running operations on the UI thread. Equivalent to Application.DoEvents().\nfunction DoEvents {\n    if (-not $script:GuiWindow) { return }\n    $frame = [System.Windows.Threading.DispatcherFrame]::new()\n    $null = [System.Windows.Threading.Dispatcher]::CurrentDispatcher.BeginInvoke(\n        [System.Windows.Threading.DispatcherPriority]::Background,\n        [System.Windows.Threading.DispatcherOperationCallback]{\n            param($f)\n            $f.Continue = $false\n            return $null\n        },\n        $frame\n    )\n    $null = [System.Windows.Threading.Dispatcher]::PushFrame($frame)\n}\n"
  },
  {
    "path": "Scripts/Threading/Invoke-NonBlocking.ps1",
    "content": "# Runs a scriptblock in a background PowerShell runspace while keeping the UI responsive.\n# In GUI mode, the work executes on a separate thread and the UI thread pumps messages (~60fps).\n# In CLI mode, the scriptblock runs directly in the current session.\nfunction Invoke-NonBlocking {\n    param(\n        [scriptblock]$ScriptBlock,\n        [object[]]$ArgumentList = @(),\n        [int]$TimeoutSeconds = 0\n    )\n\n    # CLI mode without timeout: run directly in-process\n    if (-not $script:GuiWindow -and $TimeoutSeconds -eq 0) {\n        return (& $ScriptBlock @ArgumentList)\n    }\n\n    $ps = [powershell]::Create()\n    try {\n        $null = $ps.AddScript($ScriptBlock.ToString())\n        foreach ($arg in $ArgumentList) {\n            $null = $ps.AddArgument($arg)\n        }\n\n        $handle = $ps.BeginInvoke()\n\n        if ($script:GuiWindow) {\n            # GUI mode: pump UI messages while waiting\n            $stopwatch = if ($TimeoutSeconds -gt 0) { [System.Diagnostics.Stopwatch]::StartNew() } else { $null }\n\n            while (-not $handle.IsCompleted) {\n                if ($stopwatch -and $stopwatch.Elapsed.TotalSeconds -ge $TimeoutSeconds) {\n                    $ps.Stop()\n                    throw \"Operation timed out after $TimeoutSeconds seconds\"\n                }\n                DoEvents\n                Start-Sleep -Milliseconds 16\n            }\n        }\n        else {\n            # CLI mode with timeout: block until completion or timeout\n            if (-not $handle.AsyncWaitHandle.WaitOne($TimeoutSeconds * 1000)) {\n                $ps.Stop()\n                throw \"Operation timed out after $TimeoutSeconds seconds\"\n            }\n        }\n\n        $result = $ps.EndInvoke($handle)\n\n        if ($result.Count -eq 0) { return $null }\n        if ($result.Count -eq 1) { return $result[0] }\n        return @($result)\n    }\n    finally {\n        $ps.Dispose()\n    }\n}\n"
  },
  {
    "path": "Win11Debloat.ps1",
    "content": "#Requires -RunAsAdministrator\n\n[CmdletBinding(SupportsShouldProcess)]\nparam (\n    [switch]$CLI,\n    [switch]$Silent,\n    [switch]$Sysprep,\n    [string]$LogPath,\n    [string]$User,\n    [switch]$NoRestartExplorer,\n    [switch]$CreateRestorePoint,\n    [switch]$RunAppsListGenerator,\n    [switch]$RunDefaults,\n    [switch]$RunDefaultsLite,\n    [switch]$RunSavedSettings,\n    [string]$Apps,\n    [string]$AppRemovalTarget,\n    [switch]$RemoveApps,\n    [switch]$RemoveAppsCustom,\n    [switch]$RemoveGamingApps,\n    [switch]$RemoveCommApps,\n    [switch]$RemoveHPApps,\n    [switch]$RemoveW11Outlook,\n    [switch]$ForceRemoveEdge,\n    [switch]$DisableDVR,\n    [switch]$DisableGameBarIntegration,\n    [switch]$EnableWindowsSandbox,\n    [switch]$EnableWindowsSubsystemForLinux,\n    [switch]$DisableTelemetry,\n    [switch]$DisableSearchHistory,\n    [switch]$DisableFastStartup,\n    [switch]$DisableBitlockerAutoEncryption,\n    [switch]$DisableModernStandbyNetworking,\n    [switch]$DisableStorageSense,\n    [switch]$DisableUpdateASAP,\n    [switch]$PreventUpdateAutoReboot,\n    [switch]$DisableDeliveryOptimization,\n    [switch]$DisableBing,\n    [switch]$DisableStoreSearchSuggestions,\n    [switch]$DisableSearchHighlights,\n    [switch]$DisableDesktopSpotlight,\n    [switch]$DisableLockscreenTips,\n    [switch]$DisableSuggestions,\n    [switch]$DisableLocationServices,\n    [switch]$DisableFindMyDevice,\n    [switch]$DisableEdgeAds,\n    [switch]$DisableBraveBloat,\n    [switch]$DisableSettings365Ads,\n    [switch]$DisableSettingsHome,\n    [switch]$ShowHiddenFolders,\n    [switch]$ShowKnownFileExt,\n    [switch]$HideDupliDrive,\n    [switch]$EnableDarkMode,\n    [switch]$DisableTransparency,\n    [switch]$DisableAnimations,\n    [switch]$TaskbarAlignLeft,\n    [switch]$CombineTaskbarAlways, [switch]$CombineTaskbarWhenFull, [switch]$CombineTaskbarNever,\n    [switch]$CombineMMTaskbarAlways, [switch]$CombineMMTaskbarWhenFull, [switch]$CombineMMTaskbarNever,\n    [switch]$MMTaskbarModeAll, [switch]$MMTaskbarModeMainActive, [switch]$MMTaskbarModeActive,\n    [switch]$HideSearchTb, [switch]$ShowSearchIconTb, [switch]$ShowSearchLabelTb, [switch]$ShowSearchBoxTb,\n    [switch]$HideTaskview,\n    [switch]$DisableStartRecommended,\n    [switch]$DisableStartAllApps,\n    [switch]$DisableStartPhoneLink,\n    [switch]$DisableCopilot,\n    [switch]$DisableRecall,\n    [switch]$DisableClickToDo,\n    [switch]$DisableAISvcAutoStart,\n    [switch]$DisablePaintAI,\n    [switch]$DisableNotepadAI,\n    [switch]$DisableEdgeAI,\n    [switch]$DisableWidgets,\n    [switch]$HideChat,\n    [switch]$EnableEndTask,\n    [switch]$EnableLastActiveClick,\n    [switch]$ClearStart,\n    [string]$ReplaceStart,\n    [switch]$ClearStartAllUsers,\n    [string]$ReplaceStartAllUsers,\n    [switch]$RevertContextMenu,\n    [switch]$DisableDragTray,\n    [switch]$DisableMouseAcceleration,\n    [switch]$DisableStickyKeys,\n    [switch]$DisableWindowSnapping,\n    [switch]$DisableSnapAssist,\n    [switch]$DisableSnapLayouts,\n    [switch]$HideTabsInAltTab, [switch]$Show3TabsInAltTab, [switch]$Show5TabsInAltTab, [switch]$Show20TabsInAltTab,\n    [switch]$HideHome,\n    [switch]$HideGallery,\n    [switch]$ExplorerToHome,\n    [switch]$ExplorerToThisPC,\n    [switch]$ExplorerToDownloads,\n    [switch]$ExplorerToOneDrive,\n    [switch]$AddFoldersToThisPC,\n    [switch]$HideOnedrive,\n    [switch]$Hide3dObjects,\n    [switch]$HideMusic,\n    [switch]$HideIncludeInLibrary,\n    [switch]$HideGiveAccessTo,\n    [switch]$HideShare\n)\n\n\n\n# Define script-level variables & paths\n$script:Version = \"2026.03.15\"\n$script:AppsListFilePath = \"$PSScriptRoot/Config/Apps.json\"\n$script:DefaultSettingsFilePath = \"$PSScriptRoot/Config/DefaultSettings.json\"\n$script:FeaturesFilePath = \"$PSScriptRoot/Config/Features.json\"\n$script:SavedSettingsFilePath = \"$PSScriptRoot/Config/LastUsedSettings.json\"\n$script:CustomAppsListFilePath = \"$PSScriptRoot/Config/CustomAppsList\"\n$script:DefaultLogPath = \"$PSScriptRoot/Logs/Win11Debloat.log\"\n$script:RegfilesPath = \"$PSScriptRoot/Regfiles\"\n$script:AssetsPath = \"$PSScriptRoot/Assets\"\n$script:AppSelectionSchema = \"$PSScriptRoot/Schemas/AppSelectionWindow.xaml\"\n$script:MainWindowSchema = \"$PSScriptRoot/Schemas/MainWindow.xaml\"\n$script:MessageBoxSchema = \"$PSScriptRoot/Schemas/MessageBoxWindow.xaml\"\n$script:AboutWindowSchema = \"$PSScriptRoot/Schemas/AboutWindow.xaml\"\n$script:ApplyChangesWindowSchema = \"$PSScriptRoot/Schemas/ApplyChangesWindow.xaml\"\n$script:SharedStylesSchema = \"$PSScriptRoot/Schemas/SharedStyles.xaml\"\n$script:BubbleHintSchema = \"$PSScriptRoot/Schemas/BubbleHint.xaml\"\n$script:LoadAppsDetailsScriptPath = \"$PSScriptRoot/Scripts/FileIO/LoadAppsDetailsFromJson.ps1\"\n\n$script:ControlParams = 'WhatIf', 'Confirm', 'Verbose', 'Debug', 'LogPath', 'Silent', 'Sysprep', 'User', 'NoRestartExplorer', 'RunDefaults', 'RunDefaultsLite', 'RunSavedSettings', 'RunAppsListGenerator', 'CLI', 'AppRemovalTarget'\n\n# Script-level variables for GUI elements\n$script:GuiWindow = $null\n$script:CancelRequested = $false\n$script:ApplyProgressCallback = $null\n$script:ApplySubStepCallback = $null\n\n# Check if current powershell environment is limited by security policies\nif ($ExecutionContext.SessionState.LanguageMode -ne \"FullLanguage\") {\n    Write-Error \"Win11Debloat is unable to run on your system, powershell execution is restricted by security policies\"\n    Write-Output \"Press any key to exit...\"\n    $null = [System.Console]::ReadKey()\n    Exit\n}\n\n# Display ASCII art launch logo in CLI\nClear-Host\nWrite-Host \"\"\nWrite-Host \"\"\nWrite-Host \"                   \" -NoNewline; Write-Host \"      ^\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"     / \\\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"    /   \\\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"   /     \\\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"  / ===== \\\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"  |\" -ForegroundColor Blue -NoNewline; Write-Host \"  ---  \" -ForegroundColor White -NoNewline; Write-Host \"|\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"  |\" -ForegroundColor Blue -NoNewline; Write-Host \" ( O ) \" -ForegroundColor DarkCyan -NoNewline; Write-Host \"|\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"  |\" -ForegroundColor Blue -NoNewline; Write-Host \"  ---  \" -ForegroundColor White -NoNewline; Write-Host \"|\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"  |       |\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \" /|       |\\\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"/ |       | \\\" -ForegroundColor Blue\nWrite-Host \"                   \" -NoNewline; Write-Host \"  |  \" -ForegroundColor DarkGray -NoNewline; Write-Host \"'''\" -ForegroundColor Red -NoNewline; Write-Host \"  |\" -ForegroundColor DarkGray -NoNewline; Write-Host \"    *\" -ForegroundColor Yellow\nWrite-Host \"                   \" -NoNewline; Write-Host \"   (\" -ForegroundColor Yellow -NoNewline; Write-Host \"'''\" -ForegroundColor Red -NoNewline; Write-Host \") \" -ForegroundColor Yellow -NoNewline; Write-Host \"   *  *\" -ForegroundColor DarkYellow\nWrite-Host \"                   \" -NoNewline; Write-Host \"   ( \" -ForegroundColor DarkYellow -NoNewline; Write-Host \"'\" -ForegroundColor Red -NoNewline; Write-Host \" )   \" -ForegroundColor DarkYellow -NoNewline; Write-Host \"*\" -ForegroundColor Yellow\nWrite-Host \"\"\nWrite-Host \"             Win11Debloat is launching...\" -ForegroundColor White\nWrite-Host \"               Leave this window open\" -ForegroundColor DarkGray\nWrite-Host \"\"\n\n# Log script output to 'Win11Debloat.log' at the specified path\nif ($LogPath -and (Test-Path $LogPath)) {\n    Start-Transcript -Path \"$LogPath/Win11Debloat.log\" -Append -IncludeInvocationHeader -Force | Out-Null\n}\nelse {\n    Start-Transcript -Path $script:DefaultLogPath -Append -IncludeInvocationHeader -Force | Out-Null\n}\n\n# Check if script has all required files\nif (-not ((Test-Path $script:DefaultSettingsFilePath) -and (Test-Path $script:AppsListFilePath) -and (Test-Path $script:RegfilesPath) -and (Test-Path $script:AssetsPath) -and (Test-Path $script:AppSelectionSchema) -and (Test-Path $script:ApplyChangesWindowSchema) -and (Test-Path $script:SharedStylesSchema) -and (Test-Path $script:BubbleHintSchema) -and (Test-Path $script:FeaturesFilePath))) {\n    Write-Error \"Win11Debloat is unable to find required files, please ensure all script files are present\"\n    Write-Output \"\"\n    Write-Output \"Press any key to exit...\"\n    $null = [System.Console]::ReadKey()\n    Exit\n}\n\n# Load feature info from file\n$script:Features = @{}\ntry {\n    $featuresData = Get-Content -Path $script:FeaturesFilePath -Raw | ConvertFrom-Json\n    foreach ($feature in $featuresData.Features) {\n        $script:Features[$feature.FeatureId] = $feature\n    }\n}\ncatch {\n    Write-Error \"Failed to load feature info from Features.json file\"\n    Write-Output \"\"\n    Write-Output \"Press any key to exit...\"\n    $null = [System.Console]::ReadKey()\n    Exit\n}\n\n# Check if WinGet is installed & if it is, check if the version is at least v1.4\ntry {\n    if (Get-Command winget -ErrorAction SilentlyContinue) {\n        $script:WingetInstalled = $true\n    }\n    else {\n        $script:WingetInstalled = $false\n    }\n}\ncatch {\n    Write-Error \"Unable to determine if WinGet is installed, winget command failed: $_\"\n    $script:WingetInstalled = $false\n}\n\n# Show WinGet warning that requires user confirmation, Suppress confirmation if Silent parameter was passed\nif (-not $script:WingetInstalled -and -not $Silent) {\n    Write-Warning \"WinGet is not installed or outdated, this may prevent Win11Debloat from removing certain apps\"\n    Write-Output \"\"\n    Write-Output \"Press any key to continue anyway...\"\n    $null = [System.Console]::ReadKey()\n}\n\n\n\n##################################################################################################################\n#                                                                                                                #\n#                                                FUNCTION IMPORTS                                                #\n#                                                                                                                #\n##################################################################################################################\n\n# App removal functions\n. \"$PSScriptRoot/Scripts/AppRemoval/ForceRemoveEdge.ps1\"\n. \"$PSScriptRoot/Scripts/AppRemoval/RemoveApps.ps1\"\n. \"$PSScriptRoot/Scripts/AppRemoval/GetInstalledAppsViaWinget.ps1\"\n\n# CLI functions\n. \"$PSScriptRoot/Scripts/CLI/AwaitKeyToExit.ps1\"\n. \"$PSScriptRoot/Scripts/CLI/ShowCLILastUsedSettings.ps1\"  \n. \"$PSScriptRoot/Scripts/CLI/ShowCLIDefaultModeAppRemovalOptions.ps1\"\n. \"$PSScriptRoot/Scripts/CLI/ShowCLIDefaultModeOptions.ps1\"\n. \"$PSScriptRoot/Scripts/CLI/ShowCLIAppRemoval.ps1\"\n. \"$PSScriptRoot/Scripts/CLI/ShowCLIMenuOptions.ps1\"\n. \"$PSScriptRoot/Scripts/CLI/PrintPendingChanges.ps1\"\n. \"$PSScriptRoot/Scripts/CLI/PrintHeader.ps1\"\n\n# Features functions\n. \"$PSScriptRoot/Scripts/Features/ExecuteChanges.ps1\"\n. \"$PSScriptRoot/Scripts/Features/CreateSystemRestorePoint.ps1\"\n. \"$PSScriptRoot/Scripts/Features/DisableStoreSearchSuggestions.ps1\"\n. \"$PSScriptRoot/Scripts/Features/EnableWindowsFeature.ps1\"\n. \"$PSScriptRoot/Scripts/Features/ImportRegistryFile.ps1\"\n. \"$PSScriptRoot/Scripts/Features/ReplaceStartMenu.ps1\"\n. \"$PSScriptRoot/Scripts/Features/RestartExplorer.ps1\"\n\n# File I/O functions\n. \"$PSScriptRoot/Scripts/FileIO/LoadJsonFile.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/SaveSettings.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/LoadSettings.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/SaveCustomAppsListToFile.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/ValidateAppslist.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/LoadAppsFromFile.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/LoadAppsDetailsFromJson.ps1\"\n. \"$PSScriptRoot/Scripts/FileIO/LoadAppPresetsFromJson.ps1\"\n\n# GUI functions\n. \"$PSScriptRoot/Scripts/GUI/GetSystemUsesDarkMode.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/SetWindowThemeResources.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/AttachShiftClickBehavior.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/ApplySettingsToUiControls.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/Show-MessageBox.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/Show-ApplyModal.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/Show-AppSelectionWindow.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/Show-MainWindow.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/Show-AboutDialog.ps1\"\n. \"$PSScriptRoot/Scripts/GUI/Show-Bubble.ps1\"\n\n# Helper functions\n. \"$PSScriptRoot/Scripts/Helpers/AddParameter.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/CheckIfUserExists.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/CheckModernStandbySupport.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/GenerateAppsList.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/GetFriendlyTargetUserName.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/GetTargetUserForAppRemoval.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/GetUserDirectory.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/GetUserName.ps1\"\n. \"$PSScriptRoot/Scripts/Helpers/TestIfUserIsLoggedIn.ps1\"\n\n# Threading functions\n. \"$PSScriptRoot/Scripts/Threading/DoEvents.ps1\"\n. \"$PSScriptRoot/Scripts/Threading/Invoke-NonBlocking.ps1\"\n\n\n\n##################################################################################################################\n#                                                                                                                #\n#                                                  SCRIPT START                                                  #\n#                                                                                                                #\n##################################################################################################################\n\n\n\n# Get current Windows build version\n$WinVersion = Get-ItemPropertyValue 'HKLM:\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion' CurrentBuild\n\n# Check if the machine supports Modern Standby, this is used to determine if the DisableModernStandbyNetworking option can be used\n$script:ModernStandbySupported = CheckModernStandbySupport\n\n$script:Params = $PSBoundParameters\n\n# Add default Apps parameter when RemoveApps is requested and Apps was not explicitly provided\nif ((-not $script:Params.ContainsKey(\"Apps\")) -and $script:Params.ContainsKey(\"RemoveApps\")) {\n    $script:Params.Add('Apps', 'Default')\n}\n\n$controlParamsCount = 0\n\n# Count how many control parameters are set, to determine if any changes were selected by the user during runtime\nforeach ($Param in $script:ControlParams) {\n    if ($script:Params.ContainsKey($Param)) {\n        $controlParamsCount++\n    }\n}\n\n# Hide progress bars for app removal, as they block Win11Debloat's output\nif (-not ($script:Params.ContainsKey(\"Verbose\"))) {\n    $ProgressPreference = 'SilentlyContinue'\n}\nelse {\n    Write-Host \"Verbose mode is enabled\"\n    Write-Output \"\"\n    Write-Output \"Press any key to continue...\"\n    $null = [System.Console]::ReadKey()\n\n    $ProgressPreference = 'Continue'\n}\n\nif ($script:Params.ContainsKey(\"Sysprep\")) {\n    $defaultUserPath = GetUserDirectory -userName \"Default\"\n\n    # Exit script if run in Sysprep mode on Windows 10\n    if ($WinVersion -lt 22000) {\n        Write-Error \"Win11Debloat Sysprep mode is not supported on Windows 10\"\n        AwaitKeyToExit\n    }\n}\n\n# Ensure that target user exists, if User or AppRemovalTarget parameter was provided\nif ($script:Params.ContainsKey(\"User\")) {\n    $userPath = GetUserDirectory -userName $script:Params.Item(\"User\")\n}\nif ($script:Params.ContainsKey(\"AppRemovalTarget\")) {\n    $userPath = GetUserDirectory -userName $script:Params.Item(\"AppRemovalTarget\")\n}\n\n# Remove LastUsedSettings.json file if it exists and is empty\nif ((Test-Path $script:SavedSettingsFilePath) -and ([String]::IsNullOrWhiteSpace((Get-content $script:SavedSettingsFilePath)))) {\n    Remove-Item -Path $script:SavedSettingsFilePath -recurse\n}\n\n# Only run the app selection form if the 'RunAppsListGenerator' parameter was passed to the script\nif ($RunAppsListGenerator) {\n    PrintHeader \"Custom Apps List Generator\"\n\n    $result = Show-AppSelectionWindow\n\n    # Show different message based on whether the app selection was saved or cancelled\n    if ($result -ne $true) {\n        Write-Host \"Application selection window was closed without saving.\" -ForegroundColor Red\n    }\n    else {\n        Write-Output \"Your app selection was saved to the 'CustomAppsList' file, found at:\"\n        Write-Host \"$PSScriptRoot\" -ForegroundColor Yellow\n    }\n\n    AwaitKeyToExit\n}\n\n# Change script execution based on provided parameters or user input\nif ((-not $script:Params.Count) -or $RunDefaults -or $RunDefaultsLite -or $RunSavedSettings -or ($controlParamsCount -eq $script:Params.Count)) {\n    if ($RunDefaults -or $RunDefaultsLite) {\n        ShowCLIDefaultModeOptions\n    }\n    elseif ($RunSavedSettings) {\n        if (-not (Test-Path $script:SavedSettingsFilePath)) {\n            PrintHeader 'Custom Mode'\n            Write-Error \"Unable to find LastUsedSettings.json file, no changes were made\"\n            AwaitKeyToExit\n        }\n\n        ShowCLILastUsedSettings\n    }\n    else {\n        if ($CLI) {\n            $Mode = ShowCLIMenuOptions \n        }\n        else {\n            try {\n                $result = Show-MainWindow\n            \n                Stop-Transcript\n                Exit\n            }\n            catch {\n                Write-Warning \"Unable to load WPF GUI (not supported in this environment), falling back to CLI mode\"\n                if (-not $Silent) {\n                    Write-Host \"\"\n                    Write-Host \"Press any key to continue...\"\n                    $null = [System.Console]::ReadKey()\n                }\n\n                $Mode = ShowCLIMenuOptions\n            }\n        }\n    }\n\n    # Add execution parameters based on the mode\n    switch ($Mode) {\n        # Default mode, loads defaults and app removal options\n        '1' { \n            ShowCLIDefaultModeOptions\n        }\n\n        # App removal, remove apps based on user selection\n        '2' {\n            ShowCLIAppRemoval\n        }\n\n        # Load last used options from the \"LastUsedSettings.json\" file\n        '3' {\n            ShowCLILastUsedSettings\n        }\n    }\n}\nelse {\n    PrintHeader 'Configuration'\n}\n\n# If the number of keys in ControlParams equals the number of keys in Params then no modifications/changes were selected\n#  or added by the user, and the script can exit without making any changes.\nif (($controlParamsCount -eq $script:Params.Keys.Count) -or ($script:Params.Keys.Count -eq 1 -and ($script:Params.Keys -contains 'CreateRestorePoint' -or $script:Params.Keys -contains 'Apps'))) {\n    Write-Output \"The script completed without making any changes.\"\n    AwaitKeyToExit\n}\n\n# Execute all selected/provided parameters using the consolidated function\n# (This also handles restore point creation if requested)\nExecuteAllChanges\n\nRestartExplorer\n\nWrite-Output \"\"\nWrite-Output \"\"\nWrite-Output \"\"\nWrite-Output \"Script completed! Please check above for any errors.\"\n\nAwaitKeyToExit\n"
  }
]