├── uninstall ├── remove-chrome-policy.reg ├── remove-edge-policy.reg └── remove-brave-policy.reg ├── pyproject.toml ├── generated ├── linux │ ├── chrome.json │ ├── brave.json │ └── edge.json ├── windows │ ├── chrome.reg │ ├── brave.reg │ └── edge.reg └── macos │ ├── chrome.mobileconfig │ ├── brave.mobileconfig │ └── edge.mobileconfig ├── README.md ├── .gitignore ├── policies.yaml ├── main.py ├── LICENSE └── uv.lock /uninstall/remove-chrome-policy.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome] 4 | [-HKEY_CURRENT_USER\SOFTWARE\Policies\Google\Chrome] -------------------------------------------------------------------------------- /uninstall/remove-edge-policy.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Edge] 4 | [-HKEY_CURRENT_USER\SOFTWARE\Policies\Microsoft\Edge] -------------------------------------------------------------------------------- /uninstall/remove-brave-policy.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave] 4 | 5 | [-HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave\ExtensionInstallForcelist] 6 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "chrome-debloat" 3 | version = "0.1.0" 4 | description = "Browser policies to debloat Chrome/Chromium browsers" 5 | readme = "README.md" 6 | requires-python = ">=3.9" 7 | license = { file = "LICENSE" } 8 | dependencies = ["ruamel-yaml>=0.18.6"] 9 | 10 | 11 | [tool.ruff.lint] 12 | select = ["I"] 13 | -------------------------------------------------------------------------------- /generated/linux/chrome.json: -------------------------------------------------------------------------------- 1 | { 2 | "DefaultGeolocationSetting": 2, 3 | "DefaultNotificationsSetting": 2, 4 | "DefaultLocalFontsSetting": 2, 5 | "DefaultSensorsSetting": 2, 6 | "DefaultSerialGuardSetting": 2, 7 | "CloudReportingEnabled": false, 8 | "DriveDisabled": true, 9 | "PasswordManagerEnabled": false, 10 | "PasswordSharingEnabled": false, 11 | "PasswordLeakDetectionEnabled": false, 12 | "QuickAnswersEnabled": false, 13 | "SafeBrowsingExtendedReportingEnabled": false, 14 | "SafeBrowsingSurveysEnabled": false, 15 | "SafeBrowsingDeepScanningEnabled": false, 16 | "DeviceActivityHeartbeatEnabled": false, 17 | "DeviceMetricsReportingEnabled": false, 18 | "HeartbeatEnabled": false, 19 | "LogUploadEnabled": false, 20 | "ReportAppInventory": [ 21 | "" 22 | ], 23 | "ReportDeviceActivityTimes": false, 24 | "ReportDeviceAppInfo": false, 25 | "ReportDeviceSystemInfo": false, 26 | "ReportDeviceUsers": false, 27 | "ReportWebsiteTelemetry": [ 28 | "" 29 | ], 30 | "AlternateErrorPagesEnabled": false, 31 | "AutofillCreditCardEnabled": false, 32 | "BackgroundModeEnabled": false, 33 | "BrowserGuestModeEnabled": false, 34 | "BrowserSignin": 0, 35 | "BuiltInDnsClientEnabled": false, 36 | "DefaultBrowserSettingEnabled": false, 37 | "MetricsReportingEnabled": false, 38 | "ParcelTrackingEnabled": false, 39 | "RelatedWebsiteSetsEnabled": false, 40 | "ShoppingListEnabled": false, 41 | "ExtensionManifestV2Availability": 2 42 | } -------------------------------------------------------------------------------- /generated/linux/brave.json: -------------------------------------------------------------------------------- 1 | { 2 | "TorDisabled": true, 3 | "BraveRewardsDisabled": true, 4 | "BraveWalletDisabled": true, 5 | "BraveVPNDisabled": true, 6 | "BraveAIChatEnabled": false, 7 | "DefaultGeolocationSetting": 2, 8 | "DefaultNotificationsSetting": 2, 9 | "DefaultLocalFontsSetting": 2, 10 | "DefaultSensorsSetting": 2, 11 | "DefaultSerialGuardSetting": 2, 12 | "CloudReportingEnabled": false, 13 | "DriveDisabled": true, 14 | "PasswordManagerEnabled": false, 15 | "PasswordSharingEnabled": false, 16 | "PasswordLeakDetectionEnabled": false, 17 | "QuickAnswersEnabled": false, 18 | "SafeBrowsingExtendedReportingEnabled": false, 19 | "SafeBrowsingSurveysEnabled": false, 20 | "SafeBrowsingDeepScanningEnabled": false, 21 | "DeviceActivityHeartbeatEnabled": false, 22 | "DeviceMetricsReportingEnabled": false, 23 | "HeartbeatEnabled": false, 24 | "LogUploadEnabled": false, 25 | "ReportAppInventory": [ 26 | "" 27 | ], 28 | "ReportDeviceActivityTimes": false, 29 | "ReportDeviceAppInfo": false, 30 | "ReportDeviceSystemInfo": false, 31 | "ReportDeviceUsers": false, 32 | "ReportWebsiteTelemetry": [ 33 | "" 34 | ], 35 | "AlternateErrorPagesEnabled": false, 36 | "AutofillCreditCardEnabled": false, 37 | "BackgroundModeEnabled": false, 38 | "BrowserGuestModeEnabled": false, 39 | "BrowserSignin": 0, 40 | "BuiltInDnsClientEnabled": false, 41 | "DefaultBrowserSettingEnabled": false, 42 | "MetricsReportingEnabled": false, 43 | "ParcelTrackingEnabled": false, 44 | "RelatedWebsiteSetsEnabled": false, 45 | "ShoppingListEnabled": false, 46 | "ExtensionManifestV2Availability": 2 47 | } -------------------------------------------------------------------------------- /generated/windows/chrome.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome] 4 | "DefaultGeolocationSetting"=dword:00000002 5 | "DefaultNotificationsSetting"=dword:00000002 6 | "DefaultLocalFontsSetting"=dword:00000002 7 | "DefaultSensorsSetting"=dword:00000002 8 | "DefaultSerialGuardSetting"=dword:00000002 9 | "CloudReportingEnabled"=dword:00000000 10 | "DriveDisabled"=dword:00000001 11 | "PasswordManagerEnabled"=dword:00000000 12 | "PasswordSharingEnabled"=dword:00000000 13 | "PasswordLeakDetectionEnabled"=dword:00000000 14 | "QuickAnswersEnabled"=dword:00000000 15 | "SafeBrowsingExtendedReportingEnabled"=dword:00000000 16 | "SafeBrowsingSurveysEnabled"=dword:00000000 17 | "SafeBrowsingDeepScanningEnabled"=dword:00000000 18 | "DeviceActivityHeartbeatEnabled"=dword:00000000 19 | "DeviceMetricsReportingEnabled"=dword:00000000 20 | "HeartbeatEnabled"=dword:00000000 21 | "LogUploadEnabled"=dword:00000000 22 | "ReportAppInventory"="" 23 | "ReportDeviceActivityTimes"=dword:00000000 24 | "ReportDeviceAppInfo"=dword:00000000 25 | "ReportDeviceSystemInfo"=dword:00000000 26 | "ReportDeviceUsers"=dword:00000000 27 | "ReportWebsiteTelemetry"="" 28 | "AlternateErrorPagesEnabled"=dword:00000000 29 | "AutofillCreditCardEnabled"=dword:00000000 30 | "BackgroundModeEnabled"=dword:00000000 31 | "BrowserGuestModeEnabled"=dword:00000000 32 | "BrowserSignin"=dword:00000000 33 | "BuiltInDnsClientEnabled"=dword:00000000 34 | "DefaultBrowserSettingEnabled"=dword:00000000 35 | "MetricsReportingEnabled"=dword:00000000 36 | "ParcelTrackingEnabled"=dword:00000000 37 | "RelatedWebsiteSetsEnabled"=dword:00000000 38 | "ShoppingListEnabled"=dword:00000000 39 | "ExtensionManifestV2Availability"=dword:00000002 -------------------------------------------------------------------------------- /generated/windows/brave.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave] 4 | "TorDisabled"=dword:00000001 5 | "BraveRewardsDisabled"=dword:00000001 6 | "BraveWalletDisabled"=dword:00000001 7 | "BraveVPNDisabled"=dword:00000001 8 | "BraveAIChatEnabled"=dword:00000000 9 | "DefaultGeolocationSetting"=dword:00000002 10 | "DefaultNotificationsSetting"=dword:00000002 11 | "DefaultLocalFontsSetting"=dword:00000002 12 | "DefaultSensorsSetting"=dword:00000002 13 | "DefaultSerialGuardSetting"=dword:00000002 14 | "CloudReportingEnabled"=dword:00000000 15 | "DriveDisabled"=dword:00000001 16 | "PasswordManagerEnabled"=dword:00000000 17 | "PasswordSharingEnabled"=dword:00000000 18 | "PasswordLeakDetectionEnabled"=dword:00000000 19 | "QuickAnswersEnabled"=dword:00000000 20 | "SafeBrowsingExtendedReportingEnabled"=dword:00000000 21 | "SafeBrowsingSurveysEnabled"=dword:00000000 22 | "SafeBrowsingDeepScanningEnabled"=dword:00000000 23 | "DeviceActivityHeartbeatEnabled"=dword:00000000 24 | "DeviceMetricsReportingEnabled"=dword:00000000 25 | "HeartbeatEnabled"=dword:00000000 26 | "LogUploadEnabled"=dword:00000000 27 | "ReportAppInventory"="" 28 | "ReportDeviceActivityTimes"=dword:00000000 29 | "ReportDeviceAppInfo"=dword:00000000 30 | "ReportDeviceSystemInfo"=dword:00000000 31 | "ReportDeviceUsers"=dword:00000000 32 | "ReportWebsiteTelemetry"="" 33 | "AlternateErrorPagesEnabled"=dword:00000000 34 | "AutofillCreditCardEnabled"=dword:00000000 35 | "BackgroundModeEnabled"=dword:00000000 36 | "BrowserGuestModeEnabled"=dword:00000000 37 | "BrowserSignin"=dword:00000000 38 | "BuiltInDnsClientEnabled"=dword:00000000 39 | "DefaultBrowserSettingEnabled"=dword:00000000 40 | "MetricsReportingEnabled"=dword:00000000 41 | "ParcelTrackingEnabled"=dword:00000000 42 | "RelatedWebsiteSetsEnabled"=dword:00000000 43 | "ShoppingListEnabled"=dword:00000000 44 | "ExtensionManifestV2Availability"=dword:00000002 -------------------------------------------------------------------------------- /generated/macos/chrome.mobileconfig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PayloadVersion 6 | 1 7 | PayloadScope 8 | System 9 | PayloadType 10 | Configuration 11 | PayloadRemovalDisallowed 12 | 13 | PayloadUUID 14 | 8568e67e-21ba-4bdc-a944-a30fb301ba02 15 | PayloadDisplayName 16 | Google Chrome Policies 17 | PayloadDescription 18 | Google Chrome Browser system-level policies 19 | PayloadIdentifier 20 | com.google.Chrome 21 | PayloadContent 22 | 23 | 24 | PayloadIdentifier 25 | com.google.Chrome 26 | PayloadType 27 | com.google.Chrome 28 | PayloadUUID 29 | 3eb9eb1f-412c-4f8b-b425-f95f1a67072d 30 | PayloadVersion 31 | 1 32 | PayloadEnabled 33 | 34 | DefaultGeolocationSetting 35 | 2 36 | DefaultNotificationsSetting 37 | 2 38 | DefaultLocalFontsSetting 39 | 2 40 | DefaultSensorsSetting 41 | 2 42 | DefaultSerialGuardSetting 43 | 2 44 | CloudReportingEnabled 45 | 46 | DriveDisabled 47 | 48 | PasswordManagerEnabled 49 | 50 | PasswordSharingEnabled 51 | 52 | PasswordLeakDetectionEnabled 53 | 54 | QuickAnswersEnabled 55 | 56 | SafeBrowsingExtendedReportingEnabled 57 | 58 | SafeBrowsingSurveysEnabled 59 | 60 | SafeBrowsingDeepScanningEnabled 61 | 62 | DeviceActivityHeartbeatEnabled 63 | 64 | DeviceMetricsReportingEnabled 65 | 66 | HeartbeatEnabled 67 | 68 | LogUploadEnabled 69 | 70 | ReportAppInventory 71 | 72 | 73 | 74 | ReportDeviceActivityTimes 75 | 76 | ReportDeviceAppInfo 77 | 78 | ReportDeviceSystemInfo 79 | 80 | ReportDeviceUsers 81 | 82 | ReportWebsiteTelemetry 83 | 84 | 85 | 86 | AlternateErrorPagesEnabled 87 | 88 | AutofillCreditCardEnabled 89 | 90 | BackgroundModeEnabled 91 | 92 | BrowserGuestModeEnabled 93 | 94 | BrowserSignin 95 | 0 96 | BuiltInDnsClientEnabled 97 | 98 | DefaultBrowserSettingEnabled 99 | 100 | MetricsReportingEnabled 101 | 102 | ParcelTrackingEnabled 103 | 104 | RelatedWebsiteSetsEnabled 105 | 106 | ShoppingListEnabled 107 | 108 | ExtensionManifestV2Availability 109 | 2 110 | 111 | 112 | 113 | 114 | -------------------------------------------------------------------------------- /generated/macos/brave.mobileconfig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PayloadVersion 6 | 1 7 | PayloadScope 8 | System 9 | PayloadType 10 | Configuration 11 | PayloadRemovalDisallowed 12 | 13 | PayloadUUID 14 | e143b891-3398-48f9-bee1-54d3b6db44b3 15 | PayloadDisplayName 16 | Brave Policies 17 | PayloadDescription 18 | Brave Browser system-level policies 19 | PayloadIdentifier 20 | com.brave.Browser 21 | PayloadContent 22 | 23 | 24 | PayloadIdentifier 25 | com.brave.Browser 26 | PayloadType 27 | com.brave.Browser 28 | PayloadUUID 29 | 88032831-5301-41ad-8231-10efa9d67ab3 30 | PayloadVersion 31 | 1 32 | PayloadEnabled 33 | 34 | TorDisabled 35 | 36 | BraveRewardsDisabled 37 | 38 | BraveWalletDisabled 39 | 40 | BraveVPNDisabled 41 | 42 | BraveAIChatEnabled 43 | 44 | DefaultGeolocationSetting 45 | 2 46 | DefaultNotificationsSetting 47 | 2 48 | DefaultLocalFontsSetting 49 | 2 50 | DefaultSensorsSetting 51 | 2 52 | DefaultSerialGuardSetting 53 | 2 54 | CloudReportingEnabled 55 | 56 | DriveDisabled 57 | 58 | PasswordManagerEnabled 59 | 60 | PasswordSharingEnabled 61 | 62 | PasswordLeakDetectionEnabled 63 | 64 | QuickAnswersEnabled 65 | 66 | SafeBrowsingExtendedReportingEnabled 67 | 68 | SafeBrowsingSurveysEnabled 69 | 70 | SafeBrowsingDeepScanningEnabled 71 | 72 | DeviceActivityHeartbeatEnabled 73 | 74 | DeviceMetricsReportingEnabled 75 | 76 | HeartbeatEnabled 77 | 78 | LogUploadEnabled 79 | 80 | ReportAppInventory 81 | 82 | 83 | 84 | ReportDeviceActivityTimes 85 | 86 | ReportDeviceAppInfo 87 | 88 | ReportDeviceSystemInfo 89 | 90 | ReportDeviceUsers 91 | 92 | ReportWebsiteTelemetry 93 | 94 | 95 | 96 | AlternateErrorPagesEnabled 97 | 98 | AutofillCreditCardEnabled 99 | 100 | BackgroundModeEnabled 101 | 102 | BrowserGuestModeEnabled 103 | 104 | BrowserSignin 105 | 0 106 | BuiltInDnsClientEnabled 107 | 108 | DefaultBrowserSettingEnabled 109 | 110 | MetricsReportingEnabled 111 | 112 | ParcelTrackingEnabled 113 | 114 | RelatedWebsiteSetsEnabled 115 | 116 | ShoppingListEnabled 117 | 118 | ExtensionManifestV2Availability 119 | 2 120 | 121 | 122 | 123 | 124 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chrome Debloat 2 | 3 | A tool to generate policies for Chromium-based browsers (Chrome, Brave, and Edge) that disable unnecessary features, telemetry, and bloatware while enabling some quality-of-life improvements. 4 | 5 | ## Features 6 | 7 | - Attempts to disable telemetry and usage reporting 8 | - Removes unnecessary features and pre-installed bloatware 9 | - Blocks promotional content and unnecessary UI elements 10 | - Maintains browser functionality while reducing resource usage 11 | - Pre-configures essential extensions: 12 | - uBlock Origin 13 | - Cookie AutoDelete 14 | - Don't f*** with paste 15 | - I still don't care about cookies 16 | - SponsorBlock 17 | - BlockTube 18 | - BlankTab 19 | - Decentraleyes 20 | 21 | ### Supported Browsers 22 | 23 | | Browser | Windows | macOS | Linux | 24 | |---------|---------|-------|-------| 25 | | Google Chrome | ✅ | ✅ | ✅ | 26 | | Microsoft Edge | ✅ | ✅ | ✅ | 27 | | Brave | ✅ | ✅ | ✅ | 28 | 29 | ## Quick Start 30 | 31 | ### Windows 32 | 1. Download the `.reg` file for your browser from [`generated/windows/`](./generated/windows/). 33 | 2. Open the downloaded `.reg` file to add the settings to the Windows Registry. 34 | 3. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies". 35 | 36 | ### macOS 37 | 1. Download the `.mobileconfig` file for your browser from [`generated/macos/`](./generated/macos/). 38 | 2. Open the downloaded `.mobileconfig` file to start the profile installation. 39 | 3. Go to `System Settings` > `Privacy & Security` > `Profiles` and approve the new profile. 40 | 4. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies". 41 | 42 | ### Linux 43 | 1. Download the `.json` file for your browser from [`generated/linux/`](./generated/linux/). 44 | 2. Move the downloaded file to the correct policy directory (create it if needed): 45 | * **Chrome:** `/etc/opt/chrome/policies/managed/chrome.json` 46 | * **Edge:** `/etc/opt/edge/policies/managed/edge.json` 47 | * **Brave:** `/etc/brave/policies/managed/brave.json` 48 | * *Note: You might need `sudo` rights to do this.* 49 | 3. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies". 50 | 51 | ## Custom Configuration 52 | 53 | If you want to customize the policies: 54 | 55 | 1. Clone this repository 56 | 2. Install dependencies: 57 | ```bash 58 | uv sync 59 | ``` 60 | 3. Modify `policies.yaml` according to your needs 61 | 4. Generate new configuration files: 62 | ```bash 63 | uv run main.py 64 | ``` 65 | 5. Find the generated files in `generated/` directory 66 | 67 | 68 | ### Uninstalling Policies 69 | 70 | **Windows:** 71 | 1. Navigate to the [`uninstall/windows/`](./uninstall/) directory in this repository. 72 | 2. Run the `.reg` file corresponding to your browser (e.g., `uninstall_chrome.reg`). This will remove the registry keys added during installation. 73 | 3. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies". 74 | 75 | **macOS:** 76 | 1. Go to `System Settings` > `Privacy & Security` > `Profiles`. 77 | 2. Select the profile associated with your browser (e.g., "Chrome Debloat Policies"). 78 | 3. Click the '-' (minus) button to remove the profile. 79 | 4. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies". 80 | 81 | **Linux:** 82 | 1. Remove the policy JSON file from the browser-specific directory (you might need `sudo` rights): 83 | * **Chrome:** `sudo rm /etc/opt/chrome/policies/managed/chrome.json` 84 | * **Edge:** `sudo rm /etc/opt/edge/policies/managed/edge.json` 85 | * **Brave:** `sudo rm /etc/brave/policies/managed/brave.json` 86 | 2. Restart your browser or go to `chrome://policy` (or `edge://policy`, `brave://policy`) and click "Reload policies". 87 | 88 | ## Policy Documentation 89 | 90 | - [Chrome Enterprise Policies](https://chromeenterprise.google/policies/) 91 | - [Brave Policies](https://support.brave.com/hc/en-us/articles/360039248271-Group-Policy) 92 | - [Microsoft Edge Policies](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies) 93 | 94 | ## License 95 | 96 | [Apache 2.0](./LICENSE) 97 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | custom.policy.yaml 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | *.py[cod] 6 | *$py.class 7 | 8 | # C extensions 9 | *.so 10 | 11 | # Distribution / packaging 12 | .Python 13 | build/ 14 | develop-eggs/ 15 | dist/ 16 | downloads/ 17 | eggs/ 18 | .eggs/ 19 | lib/ 20 | lib64/ 21 | parts/ 22 | sdist/ 23 | var/ 24 | wheels/ 25 | share/python-wheels/ 26 | *.egg-info/ 27 | .installed.cfg 28 | *.egg 29 | MANIFEST 30 | 31 | # PyInstaller 32 | # Usually these files are written by a python script from a template 33 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 34 | *.manifest 35 | *.spec 36 | 37 | # Installer logs 38 | pip-log.txt 39 | pip-delete-this-directory.txt 40 | 41 | # Unit test / coverage reports 42 | htmlcov/ 43 | .tox/ 44 | .nox/ 45 | .coverage 46 | .coverage.* 47 | .cache 48 | nosetests.xml 49 | coverage.xml 50 | *.cover 51 | *.py,cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | cover/ 55 | 56 | # Translations 57 | *.mo 58 | *.pot 59 | 60 | # Django stuff: 61 | *.log 62 | local_settings.py 63 | db.sqlite3 64 | db.sqlite3-journal 65 | 66 | # Flask stuff: 67 | instance/ 68 | .webassets-cache 69 | 70 | # Scrapy stuff: 71 | .scrapy 72 | 73 | # Sphinx documentation 74 | docs/_build/ 75 | 76 | # PyBuilder 77 | .pybuilder/ 78 | target/ 79 | 80 | # Jupyter Notebook 81 | .ipynb_checkpoints 82 | 83 | # IPython 84 | profile_default/ 85 | ipython_config.py 86 | 87 | # pyenv 88 | # For a library or package, you might want to ignore these files since the code is 89 | # intended to run in multiple environments; otherwise, check them in: 90 | # .python-version 91 | 92 | # pipenv 93 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 94 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 95 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 96 | # install all needed dependencies. 97 | #Pipfile.lock 98 | 99 | # UV 100 | # Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control. 101 | # This is especially recommended for binary packages to ensure reproducibility, and is more 102 | # commonly ignored for libraries. 103 | #uv.lock 104 | 105 | # poetry 106 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 107 | # This is especially recommended for binary packages to ensure reproducibility, and is more 108 | # commonly ignored for libraries. 109 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 110 | #poetry.lock 111 | 112 | # pdm 113 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 114 | #pdm.lock 115 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 116 | # in version control. 117 | # https://pdm.fming.dev/latest/usage/project/#working-with-version-control 118 | .pdm.toml 119 | .pdm-python 120 | .pdm-build/ 121 | 122 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 123 | __pypackages__/ 124 | 125 | # Celery stuff 126 | celerybeat-schedule 127 | celerybeat.pid 128 | 129 | # SageMath parsed files 130 | *.sage.py 131 | 132 | # Environments 133 | .env 134 | .venv 135 | env/ 136 | venv/ 137 | ENV/ 138 | env.bak/ 139 | venv.bak/ 140 | 141 | # Spyder project settings 142 | .spyderproject 143 | .spyproject 144 | 145 | # Rope project settings 146 | .ropeproject 147 | 148 | # mkdocs documentation 149 | /site 150 | 151 | # mypy 152 | .mypy_cache/ 153 | .dmypy.json 154 | dmypy.json 155 | 156 | # Pyre type checker 157 | .pyre/ 158 | 159 | # pytype static type analyzer 160 | .pytype/ 161 | 162 | # Cython debug symbols 163 | cython_debug/ 164 | 165 | # PyCharm 166 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 167 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 168 | # and can be added to the global gitignore or merged into this file. For a more nuclear 169 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 170 | #.idea/ 171 | 172 | # Ruff stuff: 173 | .ruff_cache/ 174 | 175 | # PyPI configuration file 176 | .pypirc 177 | 178 | # OS Garbage 179 | .DS_Store 180 | Thumbs.db 181 | 182 | # Project 183 | .vscode 184 | out 185 | -------------------------------------------------------------------------------- /generated/linux/edge.json: -------------------------------------------------------------------------------- 1 | { 2 | "ApplicationGuardFavoritesSyncEnabled": false, 3 | "ApplicationGuardPassiveModeEnabled": false, 4 | "ApplicationGuardUploadBlockingEnabled": false, 5 | "TyposquattingCheckerEnabled": false, 6 | "EdgeWorkspacesEnabled": false, 7 | "ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled": true, 8 | "BlockExternalExtensions": false, 9 | "ExtensionInstallForcelist": [ 10 | "odfafepnkmbhccpbejgmiehpchacaeak", 11 | "djkjpnciiommncecmdefpdllknjdmmmo", 12 | "kkacdgacpkediooahopgcbdahlpipheh", 13 | "ihknoknoahjhldmpdoajjdkfjhddgpcd" 14 | ], 15 | "GenAILocalFoundationalModelSettings": 1, 16 | "ImplicitSignInEnabled": false, 17 | "LinkedAccountEnabled": false, 18 | "ProactiveAuthWorkflowEnabled": false, 19 | "WebToBrowserSignInEnabled": false, 20 | "EdgeManagementEnabled": false, 21 | "EdgeManagementExtensionsFeedbackEnabled": false, 22 | "MAMEnabled": false, 23 | "PasswordGeneratorEnabled": false, 24 | "PasswordRevealEnabled": false, 25 | "PasswordMonitorAllowed": false, 26 | "RelatedWebsiteSetsEnabled": false, 27 | "ScarewareBlockerProtectionEnabled": false, 28 | "SmartScreenEnabled": false, 29 | "SmartScreenPuaEnabled": false, 30 | "SmartScreenForTrustedDownloadsEnabled": false, 31 | "SmartScreenDnsRequestsEnabled": false, 32 | "NewTabPageAppLauncherEnabled": false, 33 | "NewTabPageBingChatEnabled": false, 34 | "NewTabPageContentEnabled": false, 35 | "NewTabPageHideDefaultTopSites": true, 36 | "NewTabPagePrerenderEnabled": false, 37 | "NewTabPageQuickLinksEnabled": false, 38 | "AADWebSiteSSOUsingThisProfileEnabled": false, 39 | "AccessibilityImageLabelsEnabled": false, 40 | "AddressBarMicrosoftSearchInBingProviderEnabled": false, 41 | "AIGenThemesEnabled": false, 42 | "AllowGamesMenu": false, 43 | "AlternateErrorPagesEnabled": false, 44 | "AmbientAuthenticationInPrivateModesEnabled": false, 45 | "AutomaticHttpsDefault": true, 46 | "BingAdsSuppression": true, 47 | "ComposeInlineEnabled": false, 48 | "ConfigureDoNotTrack": false, 49 | "CryptoWalletEnabled": false, 50 | "DiagnosticData": 0, 51 | "Edge3PSerpTelemetryEnabled": false, 52 | "EdgeAssetDeliveryServiceEnabled": false, 53 | "EdgeCollectionsEnabled": false, 54 | "EdgeDiscoverEnabled": false, 55 | "EdgeEDropEnabled": false, 56 | "EdgeEnhanceImagesEnabled": false, 57 | "EdgeFollowEnabled": false, 58 | "EdgeShoppingAssistantEnabled": false, 59 | "EdgeWalletCheckoutEnabled": false, 60 | "EdgeWalletEtreeEnabled": false, 61 | "ExperimentationAndConfigurationServiceControl": 0, 62 | "ForceSync": false, 63 | "HubsSidebarEnabled": false, 64 | "ImageEditorServiceEnabled": false, 65 | "InAppSupportEnabled": false, 66 | "InternetExplorerIntegrationLevel": 0, 67 | "LiveCaptionsAllowed": false, 68 | "LiveTranslationAllowed": false, 69 | "MathSolverEnabled": false, 70 | "MicrosoftEdgeInsiderPromotionEnabled": false, 71 | "MicrosoftEditorProofingEnabled": false, 72 | "MicrosoftEditorSynonymsEnabled": false, 73 | "MicrosoftOfficeMenuEnabled": false, 74 | "OutlookHubMenuEnabled": false, 75 | "PaymentMethodQueryEnabled": false, 76 | "PersonalizationReportingEnabled": false, 77 | "PersonalizeTopSitesInCustomizeSidebarEnabled": false, 78 | "PictureInPictureOverlayEnabled": false, 79 | "PromotionalTabsEnabled": false, 80 | "PromptForDownloadLocation": false, 81 | "ResolveNavigationErrorsUseWebService": false, 82 | "ShowMicrosoftRewards": false, 83 | "ShowRecommendationsEnabled": false, 84 | "SpeechRecognitionEnabled": false, 85 | "StandaloneHubsSidebarEnabled": false, 86 | "TextPredictionEnabled": false, 87 | "TranslateEnabled": true, 88 | "TravelAssistanceEnabled": false, 89 | "UploadFromPhoneEnabled": false, 90 | "UrlDiagnosticDataEnabled": false, 91 | "UserFeedbackAllowed": false, 92 | "VisualSearchEnabled": false, 93 | "WalletDonationEnabled": false, 94 | "WebWidgetAllowed": false, 95 | "DefaultGeolocationSetting": 2, 96 | "DefaultNotificationsSetting": 2, 97 | "DefaultLocalFontsSetting": 2, 98 | "DefaultSensorsSetting": 2, 99 | "DefaultSerialGuardSetting": 2, 100 | "CloudReportingEnabled": false, 101 | "DriveDisabled": true, 102 | "PasswordManagerEnabled": false, 103 | "PasswordSharingEnabled": false, 104 | "PasswordLeakDetectionEnabled": false, 105 | "QuickAnswersEnabled": false, 106 | "SafeBrowsingExtendedReportingEnabled": false, 107 | "SafeBrowsingSurveysEnabled": false, 108 | "SafeBrowsingDeepScanningEnabled": false, 109 | "DeviceActivityHeartbeatEnabled": false, 110 | "DeviceMetricsReportingEnabled": false, 111 | "HeartbeatEnabled": false, 112 | "LogUploadEnabled": false, 113 | "ReportAppInventory": [ 114 | "" 115 | ], 116 | "ReportDeviceActivityTimes": false, 117 | "ReportDeviceAppInfo": false, 118 | "ReportDeviceSystemInfo": false, 119 | "ReportDeviceUsers": false, 120 | "ReportWebsiteTelemetry": [ 121 | "" 122 | ], 123 | "AutofillCreditCardEnabled": false, 124 | "BackgroundModeEnabled": false, 125 | "BrowserGuestModeEnabled": false, 126 | "BrowserSignin": 0, 127 | "BuiltInDnsClientEnabled": false, 128 | "DefaultBrowserSettingEnabled": false, 129 | "MetricsReportingEnabled": false, 130 | "ParcelTrackingEnabled": false, 131 | "ShoppingListEnabled": false, 132 | "ExtensionManifestV2Availability": 2 133 | } -------------------------------------------------------------------------------- /generated/windows/edge.reg: -------------------------------------------------------------------------------- 1 | Windows Registry Editor Version 5.00 2 | 3 | [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge] 4 | "ApplicationGuardFavoritesSyncEnabled"=dword:00000000 5 | "ApplicationGuardPassiveModeEnabled"=dword:00000000 6 | "ApplicationGuardUploadBlockingEnabled"=dword:00000000 7 | "TyposquattingCheckerEnabled"=dword:00000000 8 | "EdgeWorkspacesEnabled"=dword:00000000 9 | "ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled"=dword:00000001 10 | "BlockExternalExtensions"=dword:00000000 11 | "GenAILocalFoundationalModelSettings"=dword:00000001 12 | "ImplicitSignInEnabled"=dword:00000000 13 | "LinkedAccountEnabled"=dword:00000000 14 | "ProactiveAuthWorkflowEnabled"=dword:00000000 15 | "WebToBrowserSignInEnabled"=dword:00000000 16 | "EdgeManagementEnabled"=dword:00000000 17 | "EdgeManagementExtensionsFeedbackEnabled"=dword:00000000 18 | "MAMEnabled"=dword:00000000 19 | "PasswordGeneratorEnabled"=dword:00000000 20 | "PasswordRevealEnabled"=dword:00000000 21 | "PasswordMonitorAllowed"=dword:00000000 22 | "RelatedWebsiteSetsEnabled"=dword:00000000 23 | "ScarewareBlockerProtectionEnabled"=dword:00000000 24 | "SmartScreenEnabled"=dword:00000000 25 | "SmartScreenPuaEnabled"=dword:00000000 26 | "SmartScreenForTrustedDownloadsEnabled"=dword:00000000 27 | "SmartScreenDnsRequestsEnabled"=dword:00000000 28 | "NewTabPageAppLauncherEnabled"=dword:00000000 29 | "NewTabPageBingChatEnabled"=dword:00000000 30 | "NewTabPageContentEnabled"=dword:00000000 31 | "NewTabPageHideDefaultTopSites"=dword:00000001 32 | "NewTabPagePrerenderEnabled"=dword:00000000 33 | "NewTabPageQuickLinksEnabled"=dword:00000000 34 | "AADWebSiteSSOUsingThisProfileEnabled"=dword:00000000 35 | "AccessibilityImageLabelsEnabled"=dword:00000000 36 | "AddressBarMicrosoftSearchInBingProviderEnabled"=dword:00000000 37 | "AIGenThemesEnabled"=dword:00000000 38 | "AllowGamesMenu"=dword:00000000 39 | "AlternateErrorPagesEnabled"=dword:00000000 40 | "AmbientAuthenticationInPrivateModesEnabled"=dword:00000000 41 | "AutomaticHttpsDefault"=dword:00000001 42 | "BingAdsSuppression"=dword:00000001 43 | "ComposeInlineEnabled"=dword:00000000 44 | "ConfigureDoNotTrack"=dword:00000000 45 | "CryptoWalletEnabled"=dword:00000000 46 | "DiagnosticData"=dword:00000000 47 | "Edge3PSerpTelemetryEnabled"=dword:00000000 48 | "EdgeAssetDeliveryServiceEnabled"=dword:00000000 49 | "EdgeCollectionsEnabled"=dword:00000000 50 | "EdgeDiscoverEnabled"=dword:00000000 51 | "EdgeEDropEnabled"=dword:00000000 52 | "EdgeEnhanceImagesEnabled"=dword:00000000 53 | "EdgeFollowEnabled"=dword:00000000 54 | "EdgeShoppingAssistantEnabled"=dword:00000000 55 | "EdgeWalletCheckoutEnabled"=dword:00000000 56 | "EdgeWalletEtreeEnabled"=dword:00000000 57 | "ExperimentationAndConfigurationServiceControl"=dword:00000000 58 | "ForceSync"=dword:00000000 59 | "HubsSidebarEnabled"=dword:00000000 60 | "ImageEditorServiceEnabled"=dword:00000000 61 | "InAppSupportEnabled"=dword:00000000 62 | "InternetExplorerIntegrationLevel"=dword:00000000 63 | "LiveCaptionsAllowed"=dword:00000000 64 | "LiveTranslationAllowed"=dword:00000000 65 | "MathSolverEnabled"=dword:00000000 66 | "MicrosoftEdgeInsiderPromotionEnabled"=dword:00000000 67 | "MicrosoftEditorProofingEnabled"=dword:00000000 68 | "MicrosoftEditorSynonymsEnabled"=dword:00000000 69 | "MicrosoftOfficeMenuEnabled"=dword:00000000 70 | "OutlookHubMenuEnabled"=dword:00000000 71 | "PaymentMethodQueryEnabled"=dword:00000000 72 | "PersonalizationReportingEnabled"=dword:00000000 73 | "PersonalizeTopSitesInCustomizeSidebarEnabled"=dword:00000000 74 | "PictureInPictureOverlayEnabled"=dword:00000000 75 | "PromotionalTabsEnabled"=dword:00000000 76 | "PromptForDownloadLocation"=dword:00000000 77 | "ResolveNavigationErrorsUseWebService"=dword:00000000 78 | "ShowMicrosoftRewards"=dword:00000000 79 | "ShowRecommendationsEnabled"=dword:00000000 80 | "SpeechRecognitionEnabled"=dword:00000000 81 | "StandaloneHubsSidebarEnabled"=dword:00000000 82 | "TextPredictionEnabled"=dword:00000000 83 | "TranslateEnabled"=dword:00000001 84 | "TravelAssistanceEnabled"=dword:00000000 85 | "UploadFromPhoneEnabled"=dword:00000000 86 | "UrlDiagnosticDataEnabled"=dword:00000000 87 | "UserFeedbackAllowed"=dword:00000000 88 | "VisualSearchEnabled"=dword:00000000 89 | "WalletDonationEnabled"=dword:00000000 90 | "WebWidgetAllowed"=dword:00000000 91 | "DefaultGeolocationSetting"=dword:00000002 92 | "DefaultNotificationsSetting"=dword:00000002 93 | "DefaultLocalFontsSetting"=dword:00000002 94 | "DefaultSensorsSetting"=dword:00000002 95 | "DefaultSerialGuardSetting"=dword:00000002 96 | "CloudReportingEnabled"=dword:00000000 97 | "DriveDisabled"=dword:00000001 98 | "PasswordManagerEnabled"=dword:00000000 99 | "PasswordSharingEnabled"=dword:00000000 100 | "PasswordLeakDetectionEnabled"=dword:00000000 101 | "QuickAnswersEnabled"=dword:00000000 102 | "SafeBrowsingExtendedReportingEnabled"=dword:00000000 103 | "SafeBrowsingSurveysEnabled"=dword:00000000 104 | "SafeBrowsingDeepScanningEnabled"=dword:00000000 105 | "DeviceActivityHeartbeatEnabled"=dword:00000000 106 | "DeviceMetricsReportingEnabled"=dword:00000000 107 | "HeartbeatEnabled"=dword:00000000 108 | "LogUploadEnabled"=dword:00000000 109 | "ReportAppInventory"="" 110 | "ReportDeviceActivityTimes"=dword:00000000 111 | "ReportDeviceAppInfo"=dword:00000000 112 | "ReportDeviceSystemInfo"=dword:00000000 113 | "ReportDeviceUsers"=dword:00000000 114 | "ReportWebsiteTelemetry"="" 115 | "AutofillCreditCardEnabled"=dword:00000000 116 | "BackgroundModeEnabled"=dword:00000000 117 | "BrowserGuestModeEnabled"=dword:00000000 118 | "BrowserSignin"=dword:00000000 119 | "BuiltInDnsClientEnabled"=dword:00000000 120 | "DefaultBrowserSettingEnabled"=dword:00000000 121 | "MetricsReportingEnabled"=dword:00000000 122 | "ParcelTrackingEnabled"=dword:00000000 123 | "ShoppingListEnabled"=dword:00000000 124 | "ExtensionManifestV2Availability"=dword:00000002 125 | 126 | [HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge\ExtensionInstallForcelist] 127 | "1"="odfafepnkmbhccpbejgmiehpchacaeak" 128 | "2"="djkjpnciiommncecmdefpdllknjdmmmo" 129 | "3"="kkacdgacpkediooahopgcbdahlpipheh" 130 | "4"="ihknoknoahjhldmpdoajjdkfjhddgpcd" -------------------------------------------------------------------------------- /policies.yaml: -------------------------------------------------------------------------------- 1 | chromeExtensions: &chromeExtensions 2 | ExtensionManifestV2Availability: 2 3 | 4 | # https://chromeenterprise.google/policies/ 5 | chrome: &chrome 6 | <<: *chromeExtensions 7 | # Content Settings 8 | DefaultGeolocationSetting: 2 9 | DefaultNotificationsSetting: 2 10 | DefaultLocalFontsSetting: 2 11 | DefaultSensorsSetting: 2 12 | DefaultSerialGuardSetting: 2 13 | # Cloud Reporting 14 | CloudReportingEnabled: false 15 | # Drive 16 | DriveDisabled: true 17 | # Password 18 | PasswordManagerEnabled: false 19 | PasswordSharingEnabled: false 20 | PasswordLeakDetectionEnabled: false 21 | # Quick Answers 22 | QuickAnswersEnabled: false 23 | # Safe Browsing 24 | SafeBrowsingExtendedReportingEnabled: false 25 | SafeBrowsingSurveysEnabled: false 26 | SafeBrowsingDeepScanningEnabled: false 27 | # User and device reporting 28 | DeviceActivityHeartbeatEnabled: false 29 | DeviceMetricsReportingEnabled: false 30 | HeartbeatEnabled: false 31 | LogUploadEnabled: false 32 | ReportAppInventory: 33 | - "" 34 | ReportDeviceActivityTimes: false 35 | ReportDeviceAppInfo: false 36 | ReportDeviceSystemInfo: false 37 | ReportDeviceUsers: false 38 | ReportWebsiteTelemetry: 39 | - "" 40 | # Miscellaneous 41 | AlternateErrorPagesEnabled: false 42 | AutofillCreditCardEnabled: false 43 | BackgroundModeEnabled: false 44 | BrowserGuestModeEnabled: false 45 | BrowserSignin: 0 46 | BuiltInDnsClientEnabled: false 47 | DefaultBrowserSettingEnabled: false 48 | MetricsReportingEnabled: false 49 | ParcelTrackingEnabled: false 50 | RelatedWebsiteSetsEnabled: false 51 | ShoppingListEnabled: false 52 | 53 | # https://support.brave.com/hc/en-us/articles/360039248271-Group-Policy 54 | brave: &brave 55 | <<: *chrome 56 | TorDisabled: true 57 | BraveRewardsDisabled: true 58 | BraveWalletDisabled: true 59 | BraveVPNDisabled: true 60 | BraveAIChatEnabled: false 61 | 62 | # https://learn.microsoft.com/en-us/deployedge/microsoft-edge-policies 63 | edge: &edge 64 | <<: *chrome 65 | # Application Guard 66 | ApplicationGuardFavoritesSyncEnabled: false 67 | ApplicationGuardPassiveModeEnabled: false 68 | ApplicationGuardUploadBlockingEnabled: false 69 | # Edge Typo Protection settings 70 | TyposquattingCheckerEnabled: false 71 | # Edge Workspaces 72 | EdgeWorkspacesEnabled: false 73 | # Extensions 74 | ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled: true 75 | BlockExternalExtensions: false 76 | ExtensionInstallForcelist: 77 | - odfafepnkmbhccpbejgmiehpchacaeak # uBlock Origin; Edge Web Store 78 | - djkjpnciiommncecmdefpdllknjdmmmo # Cookie AutoDelete; Edge Web Store 79 | - kkacdgacpkediooahopgcbdahlpipheh # I still don't care about cookies; Edge Web Store 80 | - ihknoknoahjhldmpdoajjdkfjhddgpcd # Blank Tab; Edge Web Store 81 | # Generative AI 82 | GenAILocalFoundationalModelSettings: 1 83 | # Identity & SignIn 84 | ImplicitSignInEnabled: false 85 | LinkedAccountEnabled: false 86 | ProactiveAuthWorkflowEnabled: false 87 | WebToBrowserSignInEnabled: false 88 | # Manageability 89 | EdgeManagementEnabled: false 90 | EdgeManagementExtensionsFeedbackEnabled: false 91 | MAMEnabled: false 92 | # Password Manager 93 | PasswordGeneratorEnabled: false 94 | PasswordRevealEnabled: false 95 | PasswordMonitorAllowed: false 96 | # Related Website Sets 97 | RelatedWebsiteSetsEnabled: false 98 | # Scareware Blocker 99 | ScarewareBlockerProtectionEnabled: false 100 | # SmartScreen settings 101 | SmartScreenEnabled: false 102 | SmartScreenPuaEnabled: false 103 | SmartScreenForTrustedDownloadsEnabled: false 104 | SmartScreenDnsRequestsEnabled: false 105 | # Startup, home page and new tab page 106 | NewTabPageAppLauncherEnabled: false 107 | NewTabPageBingChatEnabled: false 108 | NewTabPageContentEnabled: false 109 | NewTabPageHideDefaultTopSites: true 110 | NewTabPagePrerenderEnabled: false 111 | NewTabPageQuickLinksEnabled: false 112 | # Additional 113 | AADWebSiteSSOUsingThisProfileEnabled: false 114 | AccessibilityImageLabelsEnabled: false 115 | AddressBarMicrosoftSearchInBingProviderEnabled: false 116 | AIGenThemesEnabled: false 117 | AllowGamesMenu: false 118 | AlternateErrorPagesEnabled: false 119 | AmbientAuthenticationInPrivateModesEnabled: false 120 | AutomaticHttpsDefault: true # improved QoL 121 | BingAdsSuppression: true 122 | ComposeInlineEnabled: false 123 | ConfigureDoNotTrack: false 124 | CryptoWalletEnabled: false 125 | DiagnosticData: 0 126 | Edge3PSerpTelemetryEnabled: false 127 | EdgeAssetDeliveryServiceEnabled: false 128 | EdgeCollectionsEnabled: false 129 | EdgeDiscoverEnabled: false 130 | EdgeEDropEnabled: false 131 | EdgeEnhanceImagesEnabled: false 132 | EdgeFollowEnabled: false 133 | EdgeShoppingAssistantEnabled: false 134 | EdgeWalletCheckoutEnabled: false 135 | EdgeWalletEtreeEnabled: false 136 | ExperimentationAndConfigurationServiceControl: 0 137 | ForceSync: false 138 | HubsSidebarEnabled: false 139 | ImageEditorServiceEnabled: false 140 | InAppSupportEnabled: false 141 | InternetExplorerIntegrationLevel: 0 142 | LiveCaptionsAllowed: false 143 | LiveTranslationAllowed: false 144 | MathSolverEnabled: false 145 | MicrosoftEdgeInsiderPromotionEnabled: false 146 | MicrosoftEditorProofingEnabled: false 147 | MicrosoftEditorSynonymsEnabled: false 148 | MicrosoftOfficeMenuEnabled: false 149 | OutlookHubMenuEnabled: false 150 | PaymentMethodQueryEnabled: false 151 | PersonalizationReportingEnabled: false 152 | PersonalizeTopSitesInCustomizeSidebarEnabled: false 153 | PictureInPictureOverlayEnabled: false 154 | PromotionalTabsEnabled: false 155 | PromptForDownloadLocation: false # improved QoL 156 | ResolveNavigationErrorsUseWebService: false 157 | ShowMicrosoftRewards: false 158 | ShowRecommendationsEnabled: false 159 | SpeechRecognitionEnabled: false 160 | StandaloneHubsSidebarEnabled: false 161 | TextPredictionEnabled: false 162 | TranslateEnabled: true # improved QoL 163 | TravelAssistanceEnabled: false 164 | UploadFromPhoneEnabled: false 165 | UrlDiagnosticDataEnabled: false 166 | UserFeedbackAllowed: false 167 | VisualSearchEnabled: false 168 | WalletDonationEnabled: false 169 | WebWidgetAllowed: false 170 | -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | import json 2 | import plistlib 3 | from pathlib import Path 4 | 5 | from ruamel.yaml import YAML 6 | 7 | yaml = YAML() 8 | 9 | POLICY_CHROME = "chrome" 10 | POLICY_BRAVE = "brave" 11 | POLICY_EDGE = "edge" 12 | 13 | 14 | METADATA = { 15 | POLICY_CHROME: { 16 | "mobileconfig": { 17 | "PayloadDisplayName": "Google Chrome Policies", 18 | "PayloadDescription": "Google Chrome Browser system-level policies", 19 | "PayloadIdentifier": "com.google.Chrome", 20 | "PayloadType": "com.google.Chrome", 21 | "PayloadUUID": "8568e67e-21ba-4bdc-a944-a30fb301ba02", 22 | "PayloadContentUUID": "3eb9eb1f-412c-4f8b-b425-f95f1a67072d", 23 | }, 24 | "registry": { 25 | "key": r"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome", 26 | }, 27 | }, 28 | POLICY_BRAVE: { 29 | "mobileconfig": { 30 | "PayloadDisplayName": "Brave Policies", 31 | "PayloadDescription": "Brave Browser system-level policies", 32 | "PayloadIdentifier": "com.brave.Browser", 33 | "PayloadType": "com.brave.Browser", 34 | "PayloadUUID": "e143b891-3398-48f9-bee1-54d3b6db44b3", 35 | "PayloadContentUUID": "88032831-5301-41ad-8231-10efa9d67ab3", 36 | }, 37 | "registry": { 38 | "key": r"HKEY_LOCAL_MACHINE\SOFTWARE\Policies\BraveSoftware\Brave", 39 | }, 40 | }, 41 | POLICY_EDGE: { 42 | "mobileconfig": { 43 | "PayloadDisplayName": "Microsoft Edge Policies", 44 | "PayloadDescription": "Microsoft Edge Browser system-level policies", 45 | "PayloadIdentifier": "com.microsoft.Edge", 46 | "PayloadUUID": "778fb3c3-2e58-4337-86dc-1a8044793d2d", 47 | "PayloadContentUUID": "65ffbe44-b556-4c33-88ea-ab684dab69bc", 48 | }, 49 | "registry": { 50 | "key": r"HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Edge", 51 | }, 52 | }, 53 | } 54 | 55 | 56 | def format_reg_value(value) -> str: 57 | if isinstance(value, bool): 58 | return f"dword:{'00000001' if value else '00000000'}" 59 | elif isinstance(value, int): 60 | return f"dword:{value:08x}" 61 | elif isinstance(value, list): 62 | return f'"{";".join(str(item) for item in value)}"' 63 | elif isinstance(value, str): 64 | return f'"{value}"' 65 | else: 66 | return f'"{str(value)}"' 67 | 68 | 69 | def load_policies(path: str) -> dict: 70 | with open(path, "r") as fp: 71 | return yaml.load(fp.read()) 72 | 73 | 74 | def make_registry_config(policies: dict, metadata: dict) -> str: 75 | policies = policies.copy() 76 | content = ["Windows Registry Editor Version 5.00", ""] 77 | base_key = metadata["key"] 78 | extension_policies = { 79 | key: policies.pop(key) 80 | for key in [ 81 | "ExtensionInstallForcelist", 82 | "ExtensionInstallAllowlist", 83 | "ExtensionInstallBlocklist", 84 | ] 85 | if key in policies 86 | } 87 | 88 | # Add the main key and regular policies 89 | content.append(f"[{base_key}]") 90 | for policy_name, policy_value in policies.items(): 91 | if isinstance(policy_value, dict): 92 | # Handle nested policies by creating subkeys 93 | content.append("") 94 | content.append(f"[{base_key}\\{policy_name}]") 95 | for sub_name, sub_value in policy_value.items(): 96 | content.append(f'"{sub_name}"={format_reg_value(sub_value)}') 97 | else: 98 | # Handle direct policy values 99 | content.append(f'"{policy_name}"={format_reg_value(policy_value)}') 100 | 101 | # Add extension policies at the end 102 | for policy_name, extensions in extension_policies.items(): 103 | if extensions: # Only create key if there are extensions 104 | content.append("") 105 | content.append(f"[{base_key}\\{policy_name}]") 106 | for i, ext in enumerate(extensions, 1): 107 | content.append(f'"{i}"="{ext}"') 108 | 109 | # Join all lines with Windows-style line endings 110 | return "\r\n".join(content) 111 | 112 | 113 | def make_mobileconfig(policies: dict, metadata: dict) -> str: 114 | config = { 115 | "PayloadVersion": 1, 116 | "PayloadScope": "System", 117 | "PayloadType": "Configuration", 118 | "PayloadRemovalDisallowed": False, 119 | "PayloadUUID": metadata["PayloadUUID"], 120 | "PayloadDisplayName": metadata["PayloadDisplayName"], 121 | "PayloadDescription": metadata["PayloadDescription"], 122 | "PayloadIdentifier": metadata["PayloadIdentifier"], 123 | "PayloadContent": [ 124 | { 125 | "PayloadIdentifier": metadata["PayloadIdentifier"], 126 | "PayloadType": metadata["PayloadIdentifier"], 127 | "PayloadUUID": metadata["PayloadContentUUID"], 128 | "PayloadVersion": 1, 129 | "PayloadEnabled": True, 130 | **policies, 131 | } 132 | ], 133 | } 134 | return plistlib.dumps(config, sort_keys=False) 135 | 136 | 137 | def write_mobile_config(path: str, policy_content: dict, metadata: dict): 138 | try: 139 | mc_path = Path(path) 140 | mc_path.parent.mkdir(parents=True, exist_ok=True) 141 | conf = make_mobileconfig(policy_content, metadata) 142 | with mc_path.open("wb") as fp: 143 | fp.write(conf) 144 | except Exception as e: 145 | print(f"Error: {e}") 146 | 147 | 148 | def write_reg_config(path: str, policy_content: dict, metadata: dict): 149 | try: 150 | reg_path = Path(path) 151 | reg_path.parent.mkdir(parents=True, exist_ok=True) 152 | conf = make_registry_config(policy_content, metadata) 153 | with reg_path.open("w") as fp: 154 | fp.write(conf) 155 | except Exception as e: 156 | print(f"Error: {e}") 157 | 158 | 159 | def write_json_config(path: str, policy_content: dict, metadata: dict): 160 | try: 161 | json_path = Path(path) 162 | json_path.parent.mkdir(parents=True, exist_ok=True) 163 | with json_path.open("w") as fp: 164 | json.dump(policy_content, fp, indent=2) 165 | except Exception as e: 166 | print(f"Error: {e}") 167 | 168 | 169 | def main(): 170 | """Generate OS-specific browser policies from policy spec""" 171 | 172 | policies = load_policies("policies.yaml") 173 | for pname in [POLICY_CHROME, POLICY_BRAVE, POLICY_EDGE]: 174 | print(f"Generating policies for '{pname}' ({len(policies[pname])} rules)") 175 | write_mobile_config( 176 | f"./generated/macos/{pname}.mobileconfig", 177 | policies[pname], 178 | METADATA[pname]["mobileconfig"], 179 | ) 180 | write_reg_config( 181 | f"./generated/windows/{pname}.reg", 182 | policies[pname], 183 | METADATA[pname]["registry"], 184 | ) 185 | write_json_config( 186 | f"./generated/linux/{pname}.json", 187 | policies[pname], 188 | {}, 189 | ) 190 | 191 | 192 | if __name__ == "__main__": 193 | main() 194 | -------------------------------------------------------------------------------- /generated/macos/edge.mobileconfig: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PayloadVersion 6 | 1 7 | PayloadScope 8 | System 9 | PayloadType 10 | Configuration 11 | PayloadRemovalDisallowed 12 | 13 | PayloadUUID 14 | 778fb3c3-2e58-4337-86dc-1a8044793d2d 15 | PayloadDisplayName 16 | Microsoft Edge Policies 17 | PayloadDescription 18 | Microsoft Edge Browser system-level policies 19 | PayloadIdentifier 20 | com.microsoft.Edge 21 | PayloadContent 22 | 23 | 24 | PayloadIdentifier 25 | com.microsoft.Edge 26 | PayloadType 27 | com.microsoft.Edge 28 | PayloadUUID 29 | 65ffbe44-b556-4c33-88ea-ab684dab69bc 30 | PayloadVersion 31 | 1 32 | PayloadEnabled 33 | 34 | ApplicationGuardFavoritesSyncEnabled 35 | 36 | ApplicationGuardPassiveModeEnabled 37 | 38 | ApplicationGuardUploadBlockingEnabled 39 | 40 | TyposquattingCheckerEnabled 41 | 42 | EdgeWorkspacesEnabled 43 | 44 | ControlDefaultStateOfAllowExtensionFromOtherStoresSettingEnabled 45 | 46 | BlockExternalExtensions 47 | 48 | ExtensionInstallForcelist 49 | 50 | odfafepnkmbhccpbejgmiehpchacaeak 51 | djkjpnciiommncecmdefpdllknjdmmmo 52 | kkacdgacpkediooahopgcbdahlpipheh 53 | ihknoknoahjhldmpdoajjdkfjhddgpcd 54 | 55 | GenAILocalFoundationalModelSettings 56 | 1 57 | ImplicitSignInEnabled 58 | 59 | LinkedAccountEnabled 60 | 61 | ProactiveAuthWorkflowEnabled 62 | 63 | WebToBrowserSignInEnabled 64 | 65 | EdgeManagementEnabled 66 | 67 | EdgeManagementExtensionsFeedbackEnabled 68 | 69 | MAMEnabled 70 | 71 | PasswordGeneratorEnabled 72 | 73 | PasswordRevealEnabled 74 | 75 | PasswordMonitorAllowed 76 | 77 | RelatedWebsiteSetsEnabled 78 | 79 | ScarewareBlockerProtectionEnabled 80 | 81 | SmartScreenEnabled 82 | 83 | SmartScreenPuaEnabled 84 | 85 | SmartScreenForTrustedDownloadsEnabled 86 | 87 | SmartScreenDnsRequestsEnabled 88 | 89 | NewTabPageAppLauncherEnabled 90 | 91 | NewTabPageBingChatEnabled 92 | 93 | NewTabPageContentEnabled 94 | 95 | NewTabPageHideDefaultTopSites 96 | 97 | NewTabPagePrerenderEnabled 98 | 99 | NewTabPageQuickLinksEnabled 100 | 101 | AADWebSiteSSOUsingThisProfileEnabled 102 | 103 | AccessibilityImageLabelsEnabled 104 | 105 | AddressBarMicrosoftSearchInBingProviderEnabled 106 | 107 | AIGenThemesEnabled 108 | 109 | AllowGamesMenu 110 | 111 | AlternateErrorPagesEnabled 112 | 113 | AmbientAuthenticationInPrivateModesEnabled 114 | 115 | AutomaticHttpsDefault 116 | 117 | BingAdsSuppression 118 | 119 | ComposeInlineEnabled 120 | 121 | ConfigureDoNotTrack 122 | 123 | CryptoWalletEnabled 124 | 125 | DiagnosticData 126 | 0 127 | Edge3PSerpTelemetryEnabled 128 | 129 | EdgeAssetDeliveryServiceEnabled 130 | 131 | EdgeCollectionsEnabled 132 | 133 | EdgeDiscoverEnabled 134 | 135 | EdgeEDropEnabled 136 | 137 | EdgeEnhanceImagesEnabled 138 | 139 | EdgeFollowEnabled 140 | 141 | EdgeShoppingAssistantEnabled 142 | 143 | EdgeWalletCheckoutEnabled 144 | 145 | EdgeWalletEtreeEnabled 146 | 147 | ExperimentationAndConfigurationServiceControl 148 | 0 149 | ForceSync 150 | 151 | HubsSidebarEnabled 152 | 153 | ImageEditorServiceEnabled 154 | 155 | InAppSupportEnabled 156 | 157 | InternetExplorerIntegrationLevel 158 | 0 159 | LiveCaptionsAllowed 160 | 161 | LiveTranslationAllowed 162 | 163 | MathSolverEnabled 164 | 165 | MicrosoftEdgeInsiderPromotionEnabled 166 | 167 | MicrosoftEditorProofingEnabled 168 | 169 | MicrosoftEditorSynonymsEnabled 170 | 171 | MicrosoftOfficeMenuEnabled 172 | 173 | OutlookHubMenuEnabled 174 | 175 | PaymentMethodQueryEnabled 176 | 177 | PersonalizationReportingEnabled 178 | 179 | PersonalizeTopSitesInCustomizeSidebarEnabled 180 | 181 | PictureInPictureOverlayEnabled 182 | 183 | PromotionalTabsEnabled 184 | 185 | PromptForDownloadLocation 186 | 187 | ResolveNavigationErrorsUseWebService 188 | 189 | ShowMicrosoftRewards 190 | 191 | ShowRecommendationsEnabled 192 | 193 | SpeechRecognitionEnabled 194 | 195 | StandaloneHubsSidebarEnabled 196 | 197 | TextPredictionEnabled 198 | 199 | TranslateEnabled 200 | 201 | TravelAssistanceEnabled 202 | 203 | UploadFromPhoneEnabled 204 | 205 | UrlDiagnosticDataEnabled 206 | 207 | UserFeedbackAllowed 208 | 209 | VisualSearchEnabled 210 | 211 | WalletDonationEnabled 212 | 213 | WebWidgetAllowed 214 | 215 | DefaultGeolocationSetting 216 | 2 217 | DefaultNotificationsSetting 218 | 2 219 | DefaultLocalFontsSetting 220 | 2 221 | DefaultSensorsSetting 222 | 2 223 | DefaultSerialGuardSetting 224 | 2 225 | CloudReportingEnabled 226 | 227 | DriveDisabled 228 | 229 | PasswordManagerEnabled 230 | 231 | PasswordSharingEnabled 232 | 233 | PasswordLeakDetectionEnabled 234 | 235 | QuickAnswersEnabled 236 | 237 | SafeBrowsingExtendedReportingEnabled 238 | 239 | SafeBrowsingSurveysEnabled 240 | 241 | SafeBrowsingDeepScanningEnabled 242 | 243 | DeviceActivityHeartbeatEnabled 244 | 245 | DeviceMetricsReportingEnabled 246 | 247 | HeartbeatEnabled 248 | 249 | LogUploadEnabled 250 | 251 | ReportAppInventory 252 | 253 | 254 | 255 | ReportDeviceActivityTimes 256 | 257 | ReportDeviceAppInfo 258 | 259 | ReportDeviceSystemInfo 260 | 261 | ReportDeviceUsers 262 | 263 | ReportWebsiteTelemetry 264 | 265 | 266 | 267 | AutofillCreditCardEnabled 268 | 269 | BackgroundModeEnabled 270 | 271 | BrowserGuestModeEnabled 272 | 273 | BrowserSignin 274 | 0 275 | BuiltInDnsClientEnabled 276 | 277 | DefaultBrowserSettingEnabled 278 | 279 | MetricsReportingEnabled 280 | 281 | ParcelTrackingEnabled 282 | 283 | ShoppingListEnabled 284 | 285 | ExtensionManifestV2Availability 286 | 2 287 | 288 | 289 | 290 | 291 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /uv.lock: -------------------------------------------------------------------------------- 1 | version = 1 2 | revision = 2 3 | requires-python = ">=3.9" 4 | 5 | [[package]] 6 | name = "chrome-debloat" 7 | version = "0.1.0" 8 | source = { virtual = "." } 9 | dependencies = [ 10 | { name = "ruamel-yaml" }, 11 | ] 12 | 13 | [package.metadata] 14 | requires-dist = [{ name = "ruamel-yaml", specifier = ">=0.18.6" }] 15 | 16 | [[package]] 17 | name = "ruamel-yaml" 18 | version = "0.18.14" 19 | source = { registry = "https://pypi.org/simple" } 20 | dependencies = [ 21 | { name = "ruamel-yaml-clib", marker = "python_full_version < '3.14' and platform_python_implementation == 'CPython'" }, 22 | ] 23 | sdist = { url = "https://files.pythonhosted.org/packages/39/87/6da0df742a4684263261c253f00edd5829e6aca970fff69e75028cccc547/ruamel.yaml-0.18.14.tar.gz", hash = "sha256:7227b76aaec364df15936730efbf7d72b30c0b79b1d578bbb8e3dcb2d81f52b7", size = 145511, upload-time = "2025-06-09T08:51:09.828Z" } 24 | wheels = [ 25 | { url = "https://files.pythonhosted.org/packages/af/6d/6fe4805235e193aad4aaf979160dd1f3c487c57d48b810c816e6e842171b/ruamel.yaml-0.18.14-py3-none-any.whl", hash = "sha256:710ff198bb53da66718c7db27eec4fbcc9aa6ca7204e4c1df2f282b6fe5eb6b2", size = 118570, upload-time = "2025-06-09T08:51:06.348Z" }, 26 | ] 27 | 28 | [[package]] 29 | name = "ruamel-yaml-clib" 30 | version = "0.2.12" 31 | source = { registry = "https://pypi.org/simple" } 32 | sdist = { url = "https://files.pythonhosted.org/packages/20/84/80203abff8ea4993a87d823a5f632e4d92831ef75d404c9fc78d0176d2b5/ruamel.yaml.clib-0.2.12.tar.gz", hash = "sha256:6c8fbb13ec503f99a91901ab46e0b07ae7941cd527393187039aec586fdfd36f", size = 225315, upload-time = "2024-10-20T10:10:56.22Z" } 33 | wheels = [ 34 | { url = "https://files.pythonhosted.org/packages/70/57/40a958e863e299f0c74ef32a3bde9f2d1ea8d69669368c0c502a0997f57f/ruamel.yaml.clib-0.2.12-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:11f891336688faf5156a36293a9c362bdc7c88f03a8a027c2c1d8e0bcde998e5", size = 131301, upload-time = "2024-10-20T10:12:35.876Z" }, 35 | { url = "https://files.pythonhosted.org/packages/98/a8/29a3eb437b12b95f50a6bcc3d7d7214301c6c529d8fdc227247fa84162b5/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a606ef75a60ecf3d924613892cc603b154178ee25abb3055db5062da811fd969", size = 633728, upload-time = "2024-10-20T10:12:37.858Z" }, 36 | { url = "https://files.pythonhosted.org/packages/35/6d/ae05a87a3ad540259c3ad88d71275cbd1c0f2d30ae04c65dcbfb6dcd4b9f/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd5415dded15c3822597455bc02bcd66e81ef8b7a48cb71a33628fc9fdde39df", size = 722230, upload-time = "2024-10-20T10:12:39.457Z" }, 37 | { url = "https://files.pythonhosted.org/packages/7f/b7/20c6f3c0b656fe609675d69bc135c03aac9e3865912444be6339207b6648/ruamel.yaml.clib-0.2.12-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f66efbc1caa63c088dead1c4170d148eabc9b80d95fb75b6c92ac0aad2437d76", size = 686712, upload-time = "2024-10-20T10:12:41.119Z" }, 38 | { url = "https://files.pythonhosted.org/packages/cd/11/d12dbf683471f888d354dac59593873c2b45feb193c5e3e0f2ebf85e68b9/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:22353049ba4181685023b25b5b51a574bce33e7f51c759371a7422dcae5402a6", size = 663936, upload-time = "2024-10-21T11:26:37.419Z" }, 39 | { url = "https://files.pythonhosted.org/packages/72/14/4c268f5077db5c83f743ee1daeb236269fa8577133a5cfa49f8b382baf13/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:932205970b9f9991b34f55136be327501903f7c66830e9760a8ffb15b07f05cd", size = 696580, upload-time = "2024-10-21T11:26:39.503Z" }, 40 | { url = "https://files.pythonhosted.org/packages/30/fc/8cd12f189c6405a4c1cf37bd633aa740a9538c8e40497c231072d0fef5cf/ruamel.yaml.clib-0.2.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a52d48f4e7bf9005e8f0a89209bf9a73f7190ddf0489eee5eb51377385f59f2a", size = 663393, upload-time = "2024-12-11T19:58:13.873Z" }, 41 | { url = "https://files.pythonhosted.org/packages/80/29/c0a017b704aaf3cbf704989785cd9c5d5b8ccec2dae6ac0c53833c84e677/ruamel.yaml.clib-0.2.12-cp310-cp310-win32.whl", hash = "sha256:3eac5a91891ceb88138c113f9db04f3cebdae277f5d44eaa3651a4f573e6a5da", size = 100326, upload-time = "2024-10-20T10:12:42.967Z" }, 42 | { url = "https://files.pythonhosted.org/packages/3a/65/fa39d74db4e2d0cd252355732d966a460a41cd01c6353b820a0952432839/ruamel.yaml.clib-0.2.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab007f2f5a87bd08ab1499bdf96f3d5c6ad4dcfa364884cb4549aa0154b13a28", size = 118079, upload-time = "2024-10-20T10:12:44.117Z" }, 43 | { url = "https://files.pythonhosted.org/packages/fb/8f/683c6ad562f558cbc4f7c029abcd9599148c51c54b5ef0f24f2638da9fbb/ruamel.yaml.clib-0.2.12-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:4a6679521a58256a90b0d89e03992c15144c5f3858f40d7c18886023d7943db6", size = 132224, upload-time = "2024-10-20T10:12:45.162Z" }, 44 | { url = "https://files.pythonhosted.org/packages/3c/d2/b79b7d695e2f21da020bd44c782490578f300dd44f0a4c57a92575758a76/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:d84318609196d6bd6da0edfa25cedfbabd8dbde5140a0a23af29ad4b8f91fb1e", size = 641480, upload-time = "2024-10-20T10:12:46.758Z" }, 45 | { url = "https://files.pythonhosted.org/packages/68/6e/264c50ce2a31473a9fdbf4fa66ca9b2b17c7455b31ef585462343818bd6c/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb43a269eb827806502c7c8efb7ae7e9e9d0573257a46e8e952f4d4caba4f31e", size = 739068, upload-time = "2024-10-20T10:12:48.605Z" }, 46 | { url = "https://files.pythonhosted.org/packages/86/29/88c2567bc893c84d88b4c48027367c3562ae69121d568e8a3f3a8d363f4d/ruamel.yaml.clib-0.2.12-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:811ea1594b8a0fb466172c384267a4e5e367298af6b228931f273b111f17ef52", size = 703012, upload-time = "2024-10-20T10:12:51.124Z" }, 47 | { url = "https://files.pythonhosted.org/packages/11/46/879763c619b5470820f0cd6ca97d134771e502776bc2b844d2adb6e37753/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cf12567a7b565cbf65d438dec6cfbe2917d3c1bdddfce84a9930b7d35ea59642", size = 704352, upload-time = "2024-10-21T11:26:41.438Z" }, 48 | { url = "https://files.pythonhosted.org/packages/02/80/ece7e6034256a4186bbe50dee28cd032d816974941a6abf6a9d65e4228a7/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7dd5adc8b930b12c8fc5b99e2d535a09889941aa0d0bd06f4749e9a9397c71d2", size = 737344, upload-time = "2024-10-21T11:26:43.62Z" }, 49 | { url = "https://files.pythonhosted.org/packages/f0/ca/e4106ac7e80efbabdf4bf91d3d32fc424e41418458251712f5672eada9ce/ruamel.yaml.clib-0.2.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1492a6051dab8d912fc2adeef0e8c72216b24d57bd896ea607cb90bb0c4981d3", size = 714498, upload-time = "2024-12-11T19:58:15.592Z" }, 50 | { url = "https://files.pythonhosted.org/packages/67/58/b1f60a1d591b771298ffa0428237afb092c7f29ae23bad93420b1eb10703/ruamel.yaml.clib-0.2.12-cp311-cp311-win32.whl", hash = "sha256:bd0a08f0bab19093c54e18a14a10b4322e1eacc5217056f3c063bd2f59853ce4", size = 100205, upload-time = "2024-10-20T10:12:52.865Z" }, 51 | { url = "https://files.pythonhosted.org/packages/b4/4f/b52f634c9548a9291a70dfce26ca7ebce388235c93588a1068028ea23fcc/ruamel.yaml.clib-0.2.12-cp311-cp311-win_amd64.whl", hash = "sha256:a274fb2cb086c7a3dea4322ec27f4cb5cc4b6298adb583ab0e211a4682f241eb", size = 118185, upload-time = "2024-10-20T10:12:54.652Z" }, 52 | { url = "https://files.pythonhosted.org/packages/48/41/e7a405afbdc26af961678474a55373e1b323605a4f5e2ddd4a80ea80f628/ruamel.yaml.clib-0.2.12-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:20b0f8dc160ba83b6dcc0e256846e1a02d044e13f7ea74a3d1d56ede4e48c632", size = 133433, upload-time = "2024-10-20T10:12:55.657Z" }, 53 | { url = "https://files.pythonhosted.org/packages/ec/b0/b850385604334c2ce90e3ee1013bd911aedf058a934905863a6ea95e9eb4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:943f32bc9dedb3abff9879edc134901df92cfce2c3d5c9348f172f62eb2d771d", size = 647362, upload-time = "2024-10-20T10:12:57.155Z" }, 54 | { url = "https://files.pythonhosted.org/packages/44/d0/3f68a86e006448fb6c005aee66565b9eb89014a70c491d70c08de597f8e4/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95c3829bb364fdb8e0332c9931ecf57d9be3519241323c5274bd82f709cebc0c", size = 754118, upload-time = "2024-10-20T10:12:58.501Z" }, 55 | { url = "https://files.pythonhosted.org/packages/52/a9/d39f3c5ada0a3bb2870d7db41901125dbe2434fa4f12ca8c5b83a42d7c53/ruamel.yaml.clib-0.2.12-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:749c16fcc4a2b09f28843cda5a193e0283e47454b63ec4b81eaa2242f50e4ccd", size = 706497, upload-time = "2024-10-20T10:13:00.211Z" }, 56 | { url = "https://files.pythonhosted.org/packages/b0/fa/097e38135dadd9ac25aecf2a54be17ddf6e4c23e43d538492a90ab3d71c6/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bf165fef1f223beae7333275156ab2022cffe255dcc51c27f066b4370da81e31", size = 698042, upload-time = "2024-10-21T11:26:46.038Z" }, 57 | { url = "https://files.pythonhosted.org/packages/ec/d5/a659ca6f503b9379b930f13bc6b130c9f176469b73b9834296822a83a132/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:32621c177bbf782ca5a18ba4d7af0f1082a3f6e517ac2a18b3974d4edf349680", size = 745831, upload-time = "2024-10-21T11:26:47.487Z" }, 58 | { url = "https://files.pythonhosted.org/packages/db/5d/36619b61ffa2429eeaefaab4f3374666adf36ad8ac6330d855848d7d36fd/ruamel.yaml.clib-0.2.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b82a7c94a498853aa0b272fd5bc67f29008da798d4f93a2f9f289feb8426a58d", size = 715692, upload-time = "2024-12-11T19:58:17.252Z" }, 59 | { url = "https://files.pythonhosted.org/packages/b1/82/85cb92f15a4231c89b95dfe08b09eb6adca929ef7df7e17ab59902b6f589/ruamel.yaml.clib-0.2.12-cp312-cp312-win32.whl", hash = "sha256:e8c4ebfcfd57177b572e2040777b8abc537cdef58a2120e830124946aa9b42c5", size = 98777, upload-time = "2024-10-20T10:13:01.395Z" }, 60 | { url = "https://files.pythonhosted.org/packages/d7/8f/c3654f6f1ddb75daf3922c3d8fc6005b1ab56671ad56ffb874d908bfa668/ruamel.yaml.clib-0.2.12-cp312-cp312-win_amd64.whl", hash = "sha256:0467c5965282c62203273b838ae77c0d29d7638c8a4e3a1c8bdd3602c10904e4", size = 115523, upload-time = "2024-10-20T10:13:02.768Z" }, 61 | { url = "https://files.pythonhosted.org/packages/29/00/4864119668d71a5fa45678f380b5923ff410701565821925c69780356ffa/ruamel.yaml.clib-0.2.12-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4c8c5d82f50bb53986a5e02d1b3092b03622c02c2eb78e29bec33fd9593bae1a", size = 132011, upload-time = "2024-10-20T10:13:04.377Z" }, 62 | { url = "https://files.pythonhosted.org/packages/7f/5e/212f473a93ae78c669ffa0cb051e3fee1139cb2d385d2ae1653d64281507/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux2014_aarch64.whl", hash = "sha256:e7e3736715fbf53e9be2a79eb4db68e4ed857017344d697e8b9749444ae57475", size = 642488, upload-time = "2024-10-20T10:13:05.906Z" }, 63 | { url = "https://files.pythonhosted.org/packages/1f/8f/ecfbe2123ade605c49ef769788f79c38ddb1c8fa81e01f4dbf5cf1a44b16/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b7e75b4965e1d4690e93021adfcecccbca7d61c7bddd8e22406ef2ff20d74ef", size = 745066, upload-time = "2024-10-20T10:13:07.26Z" }, 64 | { url = "https://files.pythonhosted.org/packages/e2/a9/28f60726d29dfc01b8decdb385de4ced2ced9faeb37a847bd5cf26836815/ruamel.yaml.clib-0.2.12-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96777d473c05ee3e5e3c3e999f5d23c6f4ec5b0c38c098b3a5229085f74236c6", size = 701785, upload-time = "2024-10-20T10:13:08.504Z" }, 65 | { url = "https://files.pythonhosted.org/packages/84/7e/8e7ec45920daa7f76046578e4f677a3215fe8f18ee30a9cb7627a19d9b4c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:3bc2a80e6420ca8b7d3590791e2dfc709c88ab9152c00eeb511c9875ce5778bf", size = 693017, upload-time = "2024-10-21T11:26:48.866Z" }, 66 | { url = "https://files.pythonhosted.org/packages/c5/b3/d650eaade4ca225f02a648321e1ab835b9d361c60d51150bac49063b83fa/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:e188d2699864c11c36cdfdada94d781fd5d6b0071cd9c427bceb08ad3d7c70e1", size = 741270, upload-time = "2024-10-21T11:26:50.213Z" }, 67 | { url = "https://files.pythonhosted.org/packages/87/b8/01c29b924dcbbed75cc45b30c30d565d763b9c4d540545a0eeecffb8f09c/ruamel.yaml.clib-0.2.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4f6f3eac23941b32afccc23081e1f50612bdbe4e982012ef4f5797986828cd01", size = 709059, upload-time = "2024-12-11T19:58:18.846Z" }, 68 | { url = "https://files.pythonhosted.org/packages/30/8c/ed73f047a73638257aa9377ad356bea4d96125b305c34a28766f4445cc0f/ruamel.yaml.clib-0.2.12-cp313-cp313-win32.whl", hash = "sha256:6442cb36270b3afb1b4951f060eccca1ce49f3d087ca1ca4563a6eb479cb3de6", size = 98583, upload-time = "2024-10-20T10:13:09.658Z" }, 69 | { url = "https://files.pythonhosted.org/packages/b0/85/e8e751d8791564dd333d5d9a4eab0a7a115f7e349595417fd50ecae3395c/ruamel.yaml.clib-0.2.12-cp313-cp313-win_amd64.whl", hash = "sha256:e5b8daf27af0b90da7bb903a876477a9e6d7270be6146906b276605997c7e9a3", size = 115190, upload-time = "2024-10-20T10:13:10.66Z" }, 70 | { url = "https://files.pythonhosted.org/packages/e5/46/ccdef7a84ad745c37cb3d9a81790f28fbc9adf9c237dba682017b123294e/ruamel.yaml.clib-0.2.12-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:fc4b630cd3fa2cf7fce38afa91d7cfe844a9f75d7f0f36393fa98815e911d987", size = 131834, upload-time = "2024-10-20T10:13:11.72Z" }, 71 | { url = "https://files.pythonhosted.org/packages/29/09/932360f30ad1b7b79f08757e0a6fb8c5392a52cdcc182779158fe66d25ac/ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bc5f1e1c28e966d61d2519f2a3d451ba989f9ea0f2307de7bc45baa526de9e45", size = 636120, upload-time = "2024-10-20T10:13:12.84Z" }, 72 | { url = "https://files.pythonhosted.org/packages/a2/2a/5b27602e7a4344c1334e26bf4739746206b7a60a8acdba33a61473468b73/ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a0e060aace4c24dcaf71023bbd7d42674e3b230f7e7b97317baf1e953e5b519", size = 724914, upload-time = "2024-10-20T10:13:14.605Z" }, 73 | { url = "https://files.pythonhosted.org/packages/da/1c/23497017c554fc06ff5701b29355522cff850f626337fff35d9ab352cb18/ruamel.yaml.clib-0.2.12-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2f1c3765db32be59d18ab3953f43ab62a761327aafc1594a2a1fbe038b8b8a7", size = 689072, upload-time = "2024-10-20T10:13:15.939Z" }, 74 | { url = "https://files.pythonhosted.org/packages/68/e6/f3d4ff3223f9ea49c3b7169ec0268e42bd49f87c70c0e3e853895e4a7ae2/ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d85252669dc32f98ebcd5d36768f5d4faeaeaa2d655ac0473be490ecdae3c285", size = 667091, upload-time = "2024-10-21T11:26:52.274Z" }, 75 | { url = "https://files.pythonhosted.org/packages/84/62/ead07043527642491e5011b143f44b81ef80f1025a96069b7210e0f2f0f3/ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e143ada795c341b56de9418c58d028989093ee611aa27ffb9b7f609c00d813ed", size = 699111, upload-time = "2024-10-21T11:26:54.294Z" }, 76 | { url = "https://files.pythonhosted.org/packages/52/b3/fe4d84446f7e4887e3bea7ceff0a7df23790b5ed625f830e79ace88ebefb/ruamel.yaml.clib-0.2.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2c59aa6170b990d8d2719323e628aaf36f3bfbc1c26279c0eeeb24d05d2d11c7", size = 666365, upload-time = "2024-12-11T19:58:20.444Z" }, 77 | { url = "https://files.pythonhosted.org/packages/6e/b3/7feb99a00bfaa5c6868617bb7651308afde85e5a0b23cd187fe5de65feeb/ruamel.yaml.clib-0.2.12-cp39-cp39-win32.whl", hash = "sha256:beffaed67936fbbeffd10966a4eb53c402fafd3d6833770516bf7314bc6ffa12", size = 100863, upload-time = "2024-10-20T10:13:17.244Z" }, 78 | { url = "https://files.pythonhosted.org/packages/93/07/de635108684b7a5bb06e432b0930c5a04b6c59efe73bd966d8db3cc208f2/ruamel.yaml.clib-0.2.12-cp39-cp39-win_amd64.whl", hash = "sha256:040ae85536960525ea62868b642bdb0c2cc6021c9f9d507810c0c604e66f5a7b", size = 118653, upload-time = "2024-10-20T10:13:18.289Z" }, 79 | ] 80 | --------------------------------------------------------------------------------