diff --git a/.github/workflows/release.yml b/.github/workflows/build-offline.yml similarity index 63% rename from .github/workflows/release.yml rename to .github/workflows/build-offline.yml index ac67fd23..2b80932d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/build-offline.yml @@ -1,4 +1,4 @@ -# Copyright (c) 2021-2023 Jonah Aragon +# Copyright (c) 2024 Jonah Aragon # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to @@ -18,59 +18,49 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -name: 📦 Releases +name: Build Offline Website on: - push: - tags: - - '*' + workflow_call: + +permissions: + contents: read jobs: - production: - name: Push release to production - runs-on: ubuntu-latest - environment: - name: actions-ssh - permissions: - contents: write - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: '0' - ssh-key: ${{ secrets.ACTIONS_SSH_KEY }} - submodules: 'true' - - - name: Push to production branch - run: | - git push origin HEAD:production - build: - name: Create release packages runs-on: ubuntu-latest - environment: - name: actions-ssh + permissions: + contents: read steps: - name: Checkout repository uses: actions/checkout@v4 with: - fetch-depth: '0' - ssh-key: ${{ secrets.ACTIONS_SSH_KEY }} - submodules: 'true' + persist-credentials: 'false' + + - uses: actions/download-artifact@v4 + with: + pattern: repo-* + path: modules + + - run: | + rmdir modules/mkdocs-material + mv modules/repo-mkdocs-material-insiders modules/mkdocs-material + rmdir theme/assets/brand + mv modules/repo-brand theme/assets/brand - name: Python setup uses: actions/setup-python@v5 with: - python-version: '3.8' cache: 'pipenv' - - name: Cache files - uses: actions/cache@v4.0.2 + - uses: actions/cache/restore@v4.0.2 with: - key: ${{ github.ref }} + key: site-cache-${{ github.repository }}-en-${{ github.ref }}-${{ hashfiles('.cache/**') }} path: .cache + restore-keys: | + site-cache-${{ github.repository }}-en-${{ github.ref }}- + site-cache-${{ github.repository }}-en- - name: Install Python dependencies run: | @@ -91,6 +81,11 @@ jobs: tar -czvf offline.tar.gz site zip -r -q offline.zip site + - uses: actions/cache/save@v4.0.2 + with: + key: site-cache-${{ github.repository }}-en-${{ github.ref }}-${{ hashfiles('.cache/**') }} + path: .cache + - name: Upload tar.gz file uses: actions/upload-artifact@v4 with: @@ -109,37 +104,10 @@ jobs: image: ghcr.io/openzim/zim-tools:3.1.3 options: -v ${{ github.workspace }}:/data run: | - zimwriterfs -w index.html -I assets/brand/logos/png/square/pg-yellow.png -l eng -t "Privacy Guides" -d "Your central privacy and security resource to protect yourself online." -c "Privacy Guides" -p "Jonah Aragon" -n "Privacy Guides" -e "https://github.com/privacyguides/privacyguides.org" /data/site /data/privacy_guides.zim + zimwriterfs -w index.html -I assets/brand/logos/png/square/pg-yellow.png -l eng -t "Privacy Guides" -d "Your central privacy and security resource to protect yourself online." -c "Privacy Guides" -p "Jonah Aragon" -n "Privacy Guides" -e "https://github.com/privacyguides/privacyguides.org" /data/site /data/offline-privacy_guides.zim - name: Upload ZIM file uses: actions/upload-artifact@v4 with: - name: privacy_guides.zim - path: privacy_guides.zim - - release: - name: Create release notes - needs: build - runs-on: ubuntu-latest - permissions: - contents: write - - steps: - - uses: actions/download-artifact@v4 - with: - name: offline.tar.gz - - - uses: actions/download-artifact@v4 - with: - name: offline.zip - - - uses: actions/download-artifact@v4 - with: - name: privacy_guides.zim - - - name: Create release notes - uses: ncipollo/release-action@v1 - with: - generateReleaseNotes: true - token: ${{ secrets.REPO_TOKEN }} - artifacts: "offline.zip,offline.tar.gz,privacy_guides.zim" + name: offline-privacy_guides.zim + path: offline-privacy_guides.zim diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 02cc3a85..1e853962 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,75 +30,107 @@ on: required: true type: string lang: - required: true type: string - i18n: - required: true + default: en + context: + type: string + default: deploy-preview + continue-on-error: type: boolean + default: true + +permissions: + contents: read jobs: build: runs-on: ubuntu-latest - continue-on-error: ${{ inputs.i18n }} + continue-on-error: ${{ inputs.continue-on-error }} permissions: contents: read steps: - - name: Checkout repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 with: repository: ${{ inputs.repo }} ref: ${{ inputs.ref }} persist-credentials: 'false' + fetch-depth: 0 - uses: actions/download-artifact@v4 with: + pattern: repo-* path: modules - run: | rmdir modules/mkdocs-material - mv modules/mkdocs-material-insiders modules/mkdocs-material + mv modules/repo-mkdocs-material-insiders modules/mkdocs-material rmdir theme/assets/brand - mv modules/brand theme/assets/brand + mv modules/repo-brand theme/assets/brand - - if: inputs.i18n + - if: inputs.lang != 'en' run: | - cp -rl modules/i18n/i18n . - cp -rl modules/i18n/includes . - cp -rl modules/i18n/theme . + cp -rl modules/repo-i18n/i18n . + cp -rl modules/repo-i18n/includes . + cp -rl modules/repo-i18n/theme . - - name: Python setup - uses: actions/setup-python@v5 + - uses: actions/setup-python@v5 with: - python-version: '3.8' cache: 'pipenv' - - name: Cache files - uses: actions/cache@v4.0.2 + - uses: actions/cache/restore@v4.0.2 with: - key: ${{ inputs.ref }} + key: site-cache-${{ inputs.repo }}-${{ inputs.ref }}-${{ hashfiles('.cache/**') }} path: .cache + restore-keys: | + site-cache-${{ inputs.repo }}-${{ inputs.ref }}- + site-cache-${{ inputs.repo }}- - - name: Install Python dependencies - run: | + - uses: actions/cache/restore@v4.0.2 + with: + key: card-cache-${{ inputs.repo }}-${{ inputs.lang }}-${{ inputs.ref }}-${{ hashfiles('config/.cache/plugin/social/manifest.json') }} + path: | + config/.cache/plugin/social/manifest.json + config/.cache/plugin/social/assets + restore-keys: | + card-cache-${{ inputs.repo }}-${{ inputs.lang }}-${{ inputs.ref }}- + card-cache-${{ inputs.repo }}-${{ inputs.lang }}- + + - run: | pip install pipenv pipenv install sudo apt install pngquant - - name: Build website - env: + - if: inputs.lang != 'en' + uses: falti/dotenv-action@v1.1 + with: + path: includes/strings.${{ inputs.lang }}.env + export-variables: true + keys-case: bypass + + - env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CARDS: false - CONTEXT: deploy-preview - NETLIFY: true + CONTEXT: ${{ inputs.context }} + PRODUCTION: true run: | pipenv run mkdocs build --config-file config/mkdocs.${{ inputs.lang }}.yml cp -r static/* site/ pipenv run mkdocs --version tar -czvf site-build-${{ inputs.lang }}.tar.gz site - - name: Upload tar.gz file - uses: actions/upload-artifact@v4 + - uses: actions/cache/save@v4.0.2 + with: + key: site-cache-${{ inputs.repo }}-${{ inputs.ref }}-${{ hashfiles('.cache/**') }} + path: .cache + + - uses: actions/cache/save@v4.0.2 + with: + key: card-cache-${{ inputs.repo }}-${{ inputs.lang }}-${{ inputs.ref }}-${{ hashfiles('config/.cache/plugin/social/manifest.json') }} + path: | + config/.cache/plugin/social/manifest.json + config/.cache/plugin/social/assets + + - uses: actions/upload-artifact@v4 with: name: site-build-${{ inputs.lang }}.tar.gz path: site-build-${{ inputs.lang }}.tar.gz diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml index edb70251..3275c0f7 100644 --- a/.github/workflows/cleanup.yml +++ b/.github/workflows/cleanup.yml @@ -24,26 +24,10 @@ on: workflow_call: jobs: - brand: + cleanup: runs-on: ubuntu-latest steps: - uses: geekyeggo/delete-artifact@v5 with: - name: brand - failOnError: false - - i18n: - runs-on: ubuntu-latest - steps: - - uses: geekyeggo/delete-artifact@v5 - with: - name: i18n - failOnError: false - - mkdocs-material-insiders: - runs-on: ubuntu-latest - steps: - - uses: geekyeggo/delete-artifact@v5 - with: - name: mkdocs-material-insiders + name: repo-* failOnError: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 54f7502b..4a25bd38 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -18,31 +18,43 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -name: Cleanup Artifacts +name: Deploy Website Build on: workflow_call: inputs: - netlify: + netlify_preview: type: boolean netlify_alias: type: string + netlify_production: + type: boolean + github_pages: + type: boolean + bunnycdn_production: + type: boolean + minio_production: + type: boolean outputs: - netlify_address: - value: ${{ jobs.netlify.outputs.address }} + netlify_preview_address: + value: ${{ jobs.netlify_preview.outputs.address }} secrets: NETLIFY_TOKEN: + PROD_BUNNYCDN_API_KEY: + PROD_BUNNYCDN_PASSWORD: + PROD_MINIO_KEY_ID: + PROD_MINIO_SECRET_KEY: jobs: - netlify: - if: inputs.netlify + netlify_preview: + if: inputs.netlify_preview runs-on: ubuntu-latest - outputs: - address: ${{ steps.deployment.outputs.address }} - environment: - name: preview-netlify - url: ${{ steps.deployment.outputs.address }} + permissions: + contents: read + + outputs: + address: ${{ steps.address.outputs.address }} steps: - uses: actions/download-artifact@v4 @@ -60,13 +72,166 @@ jobs: - run: | npm install netlify-cli -g - - name: Limit length of Netlify alias to 12 + - if: inputs.netlify_preview + name: Limit length of Netlify alias to 12 run: echo "SHORT_ALIAS=`echo ${{ inputs.netlify_alias }} | cut -c1-12`" >> $GITHUB_ENV - - id: deployment + - if: inputs.netlify_preview + id: deployment env: NETLIFY_SITE_ID: ${{ vars.NETLIFY_SITE }} NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_TOKEN }} run: | netlify deploy --dir=site --alias=${{ env.SHORT_ALIAS }} - echo "address=https://${{ env.SHORT_ALIAS }}--${{ vars.NETLIFY_SITE }}.netlify.app/" >> "$GITHUB_OUTPUT" + echo "DEPLOYED_ADDRESS=https://${{ env.SHORT_ALIAS }}--${{ vars.NETLIFY_SITE }}.netlify.app/" >> "$GITHUB_ENV" + + - id: address + run: | + echo "address=$DEPLOYED_ADDRESS" >> "$GITHUB_OUTPUT" + + netlify_production: + if: inputs.netlify_production + runs-on: ubuntu-latest + + permissions: + contents: read + + environment: + name: production + url: https://illustrious-bavarois-56cf30.netlify.app/ + + steps: + - uses: actions/download-artifact@v4 + with: + pattern: site-build-* + merge-multiple: true + + - run: | + for file in *.tar.gz; do tar -zxf "$file"; done + wget https://raw.githubusercontent.com/privacyguides/privacyguides.org/main/netlify.toml + ls -la site/ + + - uses: actions/setup-node@v4 + + - run: | + npm install netlify-cli -g + + - id: prod_deployment + env: + NETLIFY_SITE_ID: ${{ vars.PROD_NETLIFY_SITE }} + NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_TOKEN }} + run: | + netlify deploy --dir=site --prod-if-unlocked + + github_pages: + if: inputs.github_pages + runs-on: ubuntu-latest + + concurrency: + group: "pages" + + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + contents: read + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + steps: + - uses: actions/configure-pages@v5 + + - uses: actions/download-artifact@v4 + with: + pattern: site-build-* + merge-multiple: true + + - run: | + for file in *.tar.gz; do tar -zxf "$file"; done + ls -la site/ + + - uses: 1arp/create-a-file-action@0.4.4 + with: + path: site + file: index.html + content: | + + + Redirecting to English site... + + + + + - uses: actions/upload-pages-artifact@v3 + with: + path: site + + - id: deployment + uses: actions/deploy-pages@main + + bunnycdn_production: + if: inputs.bunnycdn_production + runs-on: ubuntu-latest + + permissions: + contents: read + + environment: + name: production + url: https://privacyguides-org-production.b-cdn.net + + steps: + - uses: actions/download-artifact@v4 + with: + pattern: site-build-* + merge-multiple: true + + - run: | + for file in *.tar.gz; do tar -zxf "$file"; done + ls -la site/ + + - uses: own3d/bunny-action@bfaa5c6bc8b7a7ebd599ddd4912347d7c3847e78 + env: + BUNNY_API_ACCESS_KEY: ${{ secrets.PROD_BUNNYCDN_API_KEY }} + BUNNY_STORAGE_HOSTNAME: storage.bunnycdn.com + BUNNY_STORAGE_USERNAME: ${{ vars.PROD_BUNNYCDN_USER }} + BUNNY_STORAGE_PASSWORD: ${{ secrets.PROD_BUNNYCDN_PASSWORD }} + BUNNY_PULL_ZONE_ID: 2117106 + with: + args: deploy --dir=site + + minio_production: + if: inputs.minio_production + runs-on: ubuntu-latest + + permissions: + contents: read + + environment: + name: production + url: https://privacyguides-org-production.stor1-minio.jonaharagon.net + + steps: + - uses: actions/download-artifact@v4 + with: + pattern: site-build-* + merge-multiple: true + + - run: | + for file in *.tar.gz; do tar -zxf "$file"; done + ls -la site/ + + - uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read --follow-symlinks --delete + env: + SOURCE_DIR: "site/" + AWS_S3_BUCKET: ${{ vars.PROD_MINIO_BUCKET }} + AWS_S3_ENDPOINT: ${{ vars.PROD_MINIO_HOSTNAME }} + AWS_ACCESS_KEY_ID: ${{ secrets.PROD_MINIO_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.PROD_MINIO_SECRET_KEY }} diff --git a/.github/workflows/download-repo.yml b/.github/workflows/download-repo.yml index 730d3f0a..cc80ef9d 100644 --- a/.github/workflows/download-repo.yml +++ b/.github/workflows/download-repo.yml @@ -18,7 +18,7 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -name: Download repository +name: Download Repository on: workflow_call: @@ -33,18 +33,16 @@ on: jobs: download: runs-on: ubuntu-latest - environment: - name: actions-ssh steps: - name: Checkout repository uses: actions/checkout@v4 with: repository: 'privacyguides/${{ inputs.repo }}' - path: ${{ inputs.repo }} + path: repo-${{ inputs.repo }} ssh-key: ${{ secrets.ACTIONS_SSH_KEY }} - uses: actions/upload-artifact@v4 with: - name: ${{ inputs.repo }} - path: ${{ inputs.repo }} + name: repo-${{ inputs.repo }} + path: repo-${{ inputs.repo }} retention-days: 1 diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml deleted file mode 100644 index f45243db..00000000 --- a/.github/workflows/pages.yml +++ /dev/null @@ -1,100 +0,0 @@ -# Copyright (c) 2022-2024 Jonah Aragon - -# Permission is hereby granted, free of charge, to any person obtaining a copy -# of this software and associated documentation files (the "Software"), to -# deal in the Software without restriction, including without limitation the -# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -# sell copies of the Software, and to permit persons to whom the Software is -# furnished to do so, subject to the following conditions: - -# The above copyright notice and this permission notice shall be included in -# all copies or substantial portions of the Software. - -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -# IN THE SOFTWARE. - -name: 🛠️ Deploy to GitHub Pages - -on: - workflow_dispatch: - release: - types: [published] - -# Allow one concurrent deployment -concurrency: - group: "pages" - cancel-in-progress: true - -env: - PYTHON_VERSION: 3.8 - -jobs: - build: - name: Build - - runs-on: ubuntu-latest - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: '0' - ssh-key: ${{ secrets.ACTIONS_SSH_KEY }} - submodules: 'true' - - - name: Pages setup - uses: actions/configure-pages@v4 - - - name: Python setup - uses: actions/setup-python@v5 - with: - python-version: '3.8' - cache: 'pipenv' - - - name: Cache files - uses: actions/cache@v4.0.2 - with: - key: ${{ github.ref }} - path: .cache - - - name: Install Python dependencies - run: | - pip install pipenv - pipenv install - sudo apt install pngquant - - - name: Build website - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - CARDS: true - run: | - pipenv run mkdocs build --config-file config/mkdocs.en.yml - pipenv run mkdocs --version - - - name: Package website - uses: actions/upload-pages-artifact@v3 - with: - path: site - - deploy: - name: Deploy - needs: build - - # Grant GITHUB_TOKEN the permissions required to make a Pages deployment - permissions: - pages: write # to deploy to Pages - id-token: write # to verify the deployment originates from an appropriate source - - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@main diff --git a/.github/workflows/mirror.yml b/.github/workflows/publish-mirror.yml similarity index 88% rename from .github/workflows/mirror.yml rename to .github/workflows/publish-mirror.yml index 0c71de90..be05831c 100644 --- a/.github/workflows/mirror.yml +++ b/.github/workflows/publish-mirror.yml @@ -29,9 +29,6 @@ concurrency: jobs: gitlab: runs-on: ubuntu-latest - environment: - name: actions-ssh - url: https://gitlab.com/privacyguides/privacyguides.org steps: - name: Mirror to GitLab uses: wearerequired/git-mirror-action@v1 @@ -43,9 +40,6 @@ jobs: codeberg: runs-on: ubuntu-latest - environment: - name: actions-ssh - url: https://codeberg.org/privacyguides/privacyguides.org steps: - name: Mirror to Codeberg uses: wearerequired/git-mirror-action@v1 @@ -57,9 +51,6 @@ jobs: sourcehut: runs-on: ubuntu-latest - environment: - name: actions-ssh - url: https://git.sr.ht/~jonaharagon/privacyguides.org steps: - name: Mirror to SourceHut uses: wearerequired/git-mirror-action@v1 diff --git a/.github/workflows/preview-pr.yml b/.github/workflows/publish-pr.yml similarity index 71% rename from .github/workflows/preview-pr.yml rename to .github/workflows/publish-pr.yml index a69bda34..0c24bb87 100644 --- a/.github/workflows/preview-pr.yml +++ b/.github/workflows/publish-pr.yml @@ -18,17 +18,23 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. -name: Build Pull Request Preview +name: 📦 Publish Pull Request Preview on: pull_request_target: +concurrency: + group: ${{github.event.pull_request.head.ref}} + cancel-in-progress: true + permissions: pull-requests: write contents: read + pages: write + id-token: write jobs: - downloadSubmodules: + submodule: strategy: matrix: repo: [mkdocs-material-insiders, brand, i18n] @@ -39,14 +45,14 @@ jobs: ACTIONS_SSH_KEY: ${{ secrets.ACTIONS_SSH_KEY }} build: - needs: downloadSubmodules + needs: submodule strategy: matrix: lang: [es, fr, he, it, nl, ru, zh-Hant] - i18n: [true] + allow-error: [true] include: - lang: en - i18n: false + allow-error: false fail-fast: false permissions: contents: read @@ -55,13 +61,17 @@ jobs: ref: ${{github.event.pull_request.head.ref}} repo: ${{github.event.pull_request.head.repo.full_name}} lang: ${{ matrix.lang }} - i18n: ${{ matrix.i18n }} + continue-on-error: ${{ matrix.allow-error }} deploy: needs: build + permissions: + contents: read + pages: write + id-token: write uses: ./.github/workflows/deploy.yml with: - netlify: true + netlify_preview: true netlify_alias: ${{ github.event.pull_request.head.sha }} secrets: NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }} @@ -72,15 +82,21 @@ jobs: needs: deploy runs-on: ubuntu-latest env: - address: ${{ needs.deploy.outputs.netlify_address }} + address: ${{ needs.deploy.outputs.netlify_preview_address }} steps: - - uses: thollander/actions-comment-pull-request@v2 + - uses: thollander/actions-comment-pull-request@v2.5.0 with: message: | - This is a test :eyes: ${{ env.address }} + ### Your preview is ready! + + | Name | Link | + | :---: | ---- | + | Latest commit | ${{ github.event.pull_request.head.sha }} | + | Preview | ${{ env.address }} | comment_tag: deployment cleanup: - needs: deploy + if: ${{ always() }} + needs: build uses: ./.github/workflows/cleanup.yml diff --git a/.github/workflows/publish-release.yml b/.github/workflows/publish-release.yml new file mode 100644 index 00000000..49ba6f35 --- /dev/null +++ b/.github/workflows/publish-release.yml @@ -0,0 +1,103 @@ +# Copyright (c) 2021-2024 Jonah Aragon + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +name: 📦 Publish Release + +on: + push: + tags: + - '*' + +permissions: + contents: write + pages: write + id-token: write + +jobs: + submodule: + strategy: + matrix: + repo: [mkdocs-material-insiders, brand, i18n] + uses: ./.github/workflows/download-repo.yml + with: + repo: ${{ matrix.repo }} + secrets: + ACTIONS_SSH_KEY: ${{ secrets.ACTIONS_SSH_KEY }} + + build: + needs: submodule + strategy: + matrix: + lang: [en, es, fr, he, it, nl, ru, zh-Hant] + permissions: + contents: read + uses: ./.github/workflows/build.yml + with: + ref: ${{ github.ref }} + repo: ${{ github.repository }} + lang: ${{ matrix.lang }} + context: production + continue-on-error: false + + buildoffline: + needs: submodule + permissions: + contents: read + uses: ./.github/workflows/build-offline.yml + + release: + name: Create release notes + needs: buildoffline + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - uses: actions/download-artifact@v4 + with: + pattern: offline* + merge-multiple: true + + - name: Create release notes + uses: ncipollo/release-action@v1 + with: + generateReleaseNotes: true + artifacts: "offline.zip,offline.tar.gz,offline-privacy_guides.zim" + makeLatest: true + + deploy: + needs: build + uses: ./.github/workflows/deploy.yml + with: + netlify_production: true + github_pages: true + bunnycdn_production: true + minio_production: true + secrets: + NETLIFY_TOKEN: ${{ secrets.NETLIFY_TOKEN }} + PROD_BUNNYCDN_API_KEY: ${{ secrets.PROD_BUNNYCDN_API_KEY }} + PROD_BUNNYCDN_PASSWORD: ${{ secrets.PROD_BUNNYCDN_PASSWORD }} + PROD_MINIO_KEY_ID: ${{ secrets.PROD_MINIO_KEY_ID }} + PROD_MINIO_SECRET_KEY: ${{ secrets.PROD_MINIO_SECRET_KEY }} + + cleanup: + if: ${{ always() }} + needs: [build, buildoffline] + uses: ./.github/workflows/cleanup.yml diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml new file mode 100644 index 00000000..abe6f836 --- /dev/null +++ b/.github/workflows/test-build.yml @@ -0,0 +1,64 @@ +# Copyright (c) 2024 Jonah Aragon + +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +# IN THE SOFTWARE. + +name: 📦 Manual Test Build + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + submodule: + strategy: + matrix: + repo: [mkdocs-material-insiders, brand, i18n] + uses: ./.github/workflows/download-repo.yml + with: + repo: ${{ matrix.repo }} + secrets: + ACTIONS_SSH_KEY: ${{ secrets.ACTIONS_SSH_KEY }} + + build: + needs: submodule + strategy: + matrix: + lang: [en, es, fr, he, it, nl, ru, zh-Hant] + fail-fast: false + permissions: + contents: read + uses: ./.github/workflows/build.yml + with: + ref: ${{ github.ref }} + repo: ${{ github.repository }} + lang: ${{ matrix.lang }} + continue-on-error: true + + buildoffline: + needs: submodule + permissions: + contents: read + uses: ./.github/workflows/build-offline.yml + + cleanup: + if: ${{ always() }} + needs: [build, buildoffline] + uses: ./.github/workflows/cleanup.yml diff --git a/.github/workflows/crowdin-upload.yml b/.github/workflows/upload-crowdin.yml similarity index 100% rename from .github/workflows/crowdin-upload.yml rename to .github/workflows/upload-crowdin.yml diff --git a/.python-version b/.python-version index cc1923a4..e4fba218 100644 --- a/.python-version +++ b/.python-version @@ -1 +1 @@ -3.8 +3.12 diff --git a/.vscode/extensions.json b/.vscode/extensions.json index f6da553c..07f7ef05 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -21,6 +21,8 @@ { "recommendations": [ "EditorConfig.EditorConfig", - "DavidAnson.vscode-markdownlint" + "DavidAnson.vscode-markdownlint", + "wholroyd.jinja", + "mikestead.dotenv" ] } diff --git a/Brewfile.netlify b/Brewfile.netlify deleted file mode 100644 index 63805763..00000000 --- a/Brewfile.netlify +++ /dev/null @@ -1,2 +0,0 @@ -brew "pngquant" -brew "crowdin" diff --git a/Brewfile.preview.netlify b/Brewfile.preview.netlify deleted file mode 100644 index 16f4516f..00000000 --- a/Brewfile.preview.netlify +++ /dev/null @@ -1 +0,0 @@ -brew "pngquant" diff --git a/Pipfile b/Pipfile index 55e418b4..459a02ae 100644 --- a/Pipfile +++ b/Pipfile @@ -24,15 +24,14 @@ verify_ssl = true name = "pypi" [packages] -mkdocs-material = {path = "./modules/mkdocs-material"} +mkdocs-material = {extras = ["imaging"], path = "./modules/mkdocs-material"} mkdocs-git-revision-date-localized-plugin = "~=1.2" mkdocs-git-committers-plugin-2 = "~=1.1" mkdocs-macros-plugin = "~=1.0" -pillow = "~=10.0" -cairosvg = "~=2.7" +jieba = "~=0.42" [dev-packages] scour = "~=0.38" [requires] -python_version = "3.8" +python_version = "3.12" diff --git a/Pipfile.lock b/Pipfile.lock index ccadb0e7..8509d8ae 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,11 +1,11 @@ { "_meta": { "hash": { - "sha256": "fd39f7100d809e16f8cc4d8a332f0c2b41f10db166678f87c06e23c795383768" + "sha256": "93ebf65ff6386809b3bea7cadd6e1eb71f8b0bb066846d81ec8d95422d32af64" }, "pipfile-spec": 6, "requires": { - "python_version": "3.8" + "python_version": "3.12" }, "sources": [ { @@ -29,7 +29,7 @@ "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051", "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed" ], - "markers": "python_version >= '3.6'", + "markers": "python_full_version >= '3.6.0'", "version": "==4.12.3" }, "cairocffi": { @@ -45,7 +45,7 @@ "sha256:432531d72347291b9a9ebfb6777026b607563fd8719c46ee742db0aef7271ba0", "sha256:8a5222d4e6c3f86f1f7046b63246877a63b49923a1cd202184c3a634ef546b3b" ], - "index": "pypi", + "markers": "python_version >= '3.5'", "version": "==2.7.1" }, "certifi": { @@ -207,7 +207,7 @@ "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" ], - "markers": "python_version >= '3.7'", + "markers": "python_full_version >= '3.7.0'", "version": "==3.3.2" }, "click": { @@ -259,11 +259,11 @@ }, "gitpython": { "hashes": [ - "sha256:1bf9cd7c9e7255f77778ea54359e54ac22a72a5b51288c457c881057b7bb9ecd", - "sha256:2d99869e0fef71a73cbd242528105af1d6c1b108c60dfabd994bf292f76c3ceb" + "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c", + "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff" ], "markers": "python_version >= '3.7'", - "version": "==3.1.42" + "version": "==3.1.43" }, "idna": { "hashes": [ @@ -273,13 +273,12 @@ "markers": "python_version >= '3.5'", "version": "==3.6" }, - "importlib-metadata": { + "jieba": { "hashes": [ - "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", - "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2" + "sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2" ], - "markers": "python_version < '3.10'", - "version": "==7.1.0" + "index": "pypi", + "version": "==0.42.1" }, "jinja2": { "hashes": [ @@ -291,87 +290,122 @@ }, "lxml": { "hashes": [ - "sha256:13521a321a25c641b9ea127ef478b580b5ec82aa2e9fc076c86169d161798b01", - "sha256:14deca1460b4b0f6b01f1ddc9557704e8b365f55c63070463f6c18619ebf964f", - "sha256:16018f7099245157564d7148165132c70adb272fb5a17c048ba70d9cc542a1a1", - "sha256:16dd953fb719f0ffc5bc067428fc9e88f599e15723a85618c45847c96f11f431", - "sha256:19a1bc898ae9f06bccb7c3e1dfd73897ecbbd2c96afe9095a6026016e5ca97b8", - "sha256:1ad17c20e3666c035db502c78b86e58ff6b5991906e55bdbef94977700c72623", - "sha256:22b7ee4c35f374e2c20337a95502057964d7e35b996b1c667b5c65c567d2252a", - "sha256:24ef5a4631c0b6cceaf2dbca21687e29725b7c4e171f33a8f8ce23c12558ded1", - "sha256:25663d6e99659544ee8fe1b89b1a8c0aaa5e34b103fab124b17fa958c4a324a6", - "sha256:262bc5f512a66b527d026518507e78c2f9c2bd9eb5c8aeeb9f0eb43fcb69dc67", - "sha256:280f3edf15c2a967d923bcfb1f8f15337ad36f93525828b40a0f9d6c2ad24890", - "sha256:2ad3a8ce9e8a767131061a22cd28fdffa3cd2dc193f399ff7b81777f3520e372", - "sha256:2befa20a13f1a75c751f47e00929fb3433d67eb9923c2c0b364de449121f447c", - "sha256:2f37c6d7106a9d6f0708d4e164b707037b7380fcd0b04c5bd9cae1fb46a856fb", - "sha256:304128394c9c22b6569eba2a6d98392b56fbdfbad58f83ea702530be80d0f9df", - "sha256:342e95bddec3a698ac24378d61996b3ee5ba9acfeb253986002ac53c9a5f6f84", - "sha256:3aeca824b38ca78d9ee2ab82bd9883083d0492d9d17df065ba3b94e88e4d7ee6", - "sha256:3d184e0d5c918cff04cdde9dbdf9600e960161d773666958c9d7b565ccc60c45", - "sha256:3e3898ae2b58eeafedfe99e542a17859017d72d7f6a63de0f04f99c2cb125936", - "sha256:3eea6ed6e6c918e468e693c41ef07f3c3acc310b70ddd9cc72d9ef84bc9564ca", - "sha256:3f14a4fb1c1c402a22e6a341a24c1341b4a3def81b41cd354386dcb795f83897", - "sha256:436a943c2900bb98123b06437cdd30580a61340fbdb7b28aaf345a459c19046a", - "sha256:4946e7f59b7b6a9e27bef34422f645e9a368cb2be11bf1ef3cafc39a1f6ba68d", - "sha256:49a9b4af45e8b925e1cd6f3b15bbba2c81e7dba6dce170c677c9cda547411e14", - "sha256:4f8b0c78e7aac24979ef09b7f50da871c2de2def043d468c4b41f512d831e912", - "sha256:52427a7eadc98f9e62cb1368a5079ae826f94f05755d2d567d93ee1bc3ceb354", - "sha256:5e53d7e6a98b64fe54775d23a7c669763451340c3d44ad5e3a3b48a1efbdc96f", - "sha256:5fcfbebdb0c5d8d18b84118842f31965d59ee3e66996ac842e21f957eb76138c", - "sha256:601f4a75797d7a770daed8b42b97cd1bb1ba18bd51a9382077a6a247a12aa38d", - "sha256:61c5a7edbd7c695e54fca029ceb351fc45cd8860119a0f83e48be44e1c464862", - "sha256:6a2a2c724d97c1eb8cf966b16ca2915566a4904b9aad2ed9a09c748ffe14f969", - "sha256:6d48fc57e7c1e3df57be5ae8614bab6d4e7b60f65c5457915c26892c41afc59e", - "sha256:6f11b77ec0979f7e4dc5ae081325a2946f1fe424148d3945f943ceaede98adb8", - "sha256:704f5572ff473a5f897745abebc6df40f22d4133c1e0a1f124e4f2bd3330ff7e", - "sha256:725e171e0b99a66ec8605ac77fa12239dbe061482ac854d25720e2294652eeaa", - "sha256:7cfced4a069003d8913408e10ca8ed092c49a7f6cefee9bb74b6b3e860683b45", - "sha256:7ec465e6549ed97e9f1e5ed51c657c9ede767bc1c11552f7f4d022c4df4a977a", - "sha256:82bddf0e72cb2af3cbba7cec1d2fd11fda0de6be8f4492223d4a268713ef2147", - "sha256:82cd34f1081ae4ea2ede3d52f71b7be313756e99b4b5f829f89b12da552d3aa3", - "sha256:843b9c835580d52828d8f69ea4302537337a21e6b4f1ec711a52241ba4a824f3", - "sha256:877efb968c3d7eb2dad540b6cabf2f1d3c0fbf4b2d309a3c141f79c7e0061324", - "sha256:8b9f19df998761babaa7f09e6bc169294eefafd6149aaa272081cbddc7ba4ca3", - "sha256:8cf5877f7ed384dabfdcc37922c3191bf27e55b498fecece9fd5c2c7aaa34c33", - "sha256:8d2900b7f5318bc7ad8631d3d40190b95ef2aa8cc59473b73b294e4a55e9f30f", - "sha256:8d7b4beebb178e9183138f552238f7e6613162a42164233e2bda00cb3afac58f", - "sha256:8f52fe6859b9db71ee609b0c0a70fea5f1e71c3462ecf144ca800d3f434f0764", - "sha256:98f3f020a2b736566c707c8e034945c02aa94e124c24f77ca097c446f81b01f1", - "sha256:9aa543980ab1fbf1720969af1d99095a548ea42e00361e727c58a40832439114", - "sha256:9b99f564659cfa704a2dd82d0684207b1aadf7d02d33e54845f9fc78e06b7581", - "sha256:9bcf86dfc8ff3e992fed847c077bd875d9e0ba2fa25d859c3a0f0f76f07f0c8d", - "sha256:9bd0ae7cc2b85320abd5e0abad5ccee5564ed5f0cc90245d2f9a8ef330a8deae", - "sha256:9d3c0f8567ffe7502d969c2c1b809892dc793b5d0665f602aad19895f8d508da", - "sha256:9e5ac3437746189a9b4121db2a7b86056ac8786b12e88838696899328fc44bb2", - "sha256:a36c506e5f8aeb40680491d39ed94670487ce6614b9d27cabe45d94cd5d63e1e", - "sha256:a5ab722ae5a873d8dcee1f5f45ddd93c34210aed44ff2dc643b5025981908cda", - "sha256:a96f02ba1bcd330807fc060ed91d1f7a20853da6dd449e5da4b09bfcc08fdcf5", - "sha256:acb6b2f96f60f70e7f34efe0c3ea34ca63f19ca63ce90019c6cbca6b676e81fa", - "sha256:ae15347a88cf8af0949a9872b57a320d2605ae069bcdf047677318bc0bba45b1", - "sha256:af8920ce4a55ff41167ddbc20077f5698c2e710ad3353d32a07d3264f3a2021e", - "sha256:afd825e30f8d1f521713a5669b63657bcfe5980a916c95855060048b88e1adb7", - "sha256:b21b4031b53d25b0858d4e124f2f9131ffc1530431c6d1321805c90da78388d1", - "sha256:b4b68c961b5cc402cbd99cca5eb2547e46ce77260eb705f4d117fd9c3f932b95", - "sha256:b66aa6357b265670bb574f050ffceefb98549c721cf28351b748be1ef9577d93", - "sha256:b9e240ae0ba96477682aa87899d94ddec1cc7926f9df29b1dd57b39e797d5ab5", - "sha256:bc64d1b1dab08f679fb89c368f4c05693f58a9faf744c4d390d7ed1d8223869b", - "sha256:bf8443781533b8d37b295016a4b53c1494fa9a03573c09ca5104550c138d5c05", - "sha256:c26aab6ea9c54d3bed716b8851c8bfc40cb249b8e9880e250d1eddde9f709bf5", - "sha256:c3cd1fc1dc7c376c54440aeaaa0dcc803d2126732ff5c6b68ccd619f2e64be4f", - "sha256:c7257171bb8d4432fe9d6fdde4d55fdbe663a63636a17f7f9aaba9bcb3153ad7", - "sha256:d42e3a3fc18acc88b838efded0e6ec3edf3e328a58c68fbd36a7263a874906c8", - "sha256:d74fcaf87132ffc0447b3c685a9f862ffb5b43e70ea6beec2fb8057d5d2a1fea", - "sha256:d8c1d679df4361408b628f42b26a5d62bd3e9ba7f0c0e7969f925021554755aa", - "sha256:e856c1c7255c739434489ec9c8aa9cdf5179785d10ff20add308b5d673bed5cd", - "sha256:eac68f96539b32fce2c9b47eb7c25bb2582bdaf1bbb360d25f564ee9e04c542b", - "sha256:ed7326563024b6e91fef6b6c7a1a2ff0a71b97793ac33dbbcf38f6005e51ff6e", - "sha256:ed8c3d2cd329bf779b7ed38db176738f3f8be637bb395ce9629fc76f78afe3d4", - "sha256:f4c9bda132ad108b387c33fabfea47866af87f4ea6ffb79418004f0521e63204", - "sha256:f643ffd2669ffd4b5a3e9b41c909b72b2a1d5e4915da90a77e119b8d48ce867a" + "sha256:0382e6a3eefa3f6699b14fa77c2eb32af2ada261b75120eaf4fc028a20394975", + "sha256:03e3962d6ad13a862dacd5b3a3ea60b4d092a550f36465234b8639311fd60989", + "sha256:05fc3720250d221792b6e0d150afc92d20cb10c9cdaa8c8f93c2a00fbdd16015", + "sha256:06036d60fccb21e22dd167f6d0e422b9cbdf3588a7e999a33799f9cbf01e41a5", + "sha256:0947d1114e337dc2aae2fa14bbc9ed5d9ca1a0acd6d2f948df9926aef65305e9", + "sha256:0e95ae029396382a0d2e8174e4077f96befcd4a2184678db363ddc074eb4d3b2", + "sha256:11acfcdf5a38cf89c48662123a5d02ae0a7d99142c7ee14ad90de5c96a9b6f06", + "sha256:11e41ffd3cd27b0ca1c76073b27bd860f96431d9b70f383990f1827ca19f2f52", + "sha256:1459a998c10a99711ac532abe5cc24ba354e4396dafef741c7797f8830712d56", + "sha256:16e65223f34fd3d65259b174f0f75a4bb3d9893698e5e7d01e54cd8c5eb98d85", + "sha256:1cce2eaad7e38b985b0f91f18468dda0d6b91862d32bec945b0e46e2ffe7222e", + "sha256:1eace37a9f4a1bef0bb5c849434933fd6213008ec583c8e31ee5b8e99c7c8500", + "sha256:1ede2a7a86a977b0c741654efaeca0af7860a9b1ae39f9268f0936246a977ee0", + "sha256:1effc10bf782f0696e76ecfeba0720ea02c0c31d5bffb7b29ba10debd57d1c3d", + "sha256:200f70b5d95fc79eb9ed7f8c4888eef4e274b9bf380b829d3d52e9ed962e9231", + "sha256:21dc490cdb33047bc7f7ad76384f3366fa8f5146b86cc04c4af45de901393b90", + "sha256:246c93e2503c710cf02c7e9869dc0258223cbefe5e8f9ecded0ac0aa07fd2bf8", + "sha256:25fef8794f0dc89f01bdd02df6a7fec4bcb2fbbe661d571e898167a83480185e", + "sha256:27877732946843f4b6bfc56eb40d865653eef34ad2edeed16b015d5c29c248df", + "sha256:281ee1ffeb0ab06204dfcd22a90e9003f0bb2dab04101ad983d0b1773bc10588", + "sha256:2a34e74ffe92c413f197ff4967fb1611d938ee0691b762d062ef0f73814f3aa4", + "sha256:2ad364026c2cebacd7e01d1138bd53639822fefa8f7da90fc38cd0e6319a2699", + "sha256:2bbe335f0d1a86391671d975a1b5e9b08bb72fba6b567c43bdc2e55ca6e6c086", + "sha256:32d44af078485c4da9a7ec460162392d49d996caf89516fa0b75ad0838047122", + "sha256:347ec08250d5950f5b016caa3e2e13fb2cb9714fe6041d52e3716fb33c208663", + "sha256:356f8873b1e27b81793e30144229adf70f6d3e36e5cb7b6d289da690f4398953", + "sha256:35e39c6fd089ad6674eb52d93aa874d6027b3ae44d2381cca6e9e4c2e102c9c8", + "sha256:3603a8a41097daf7672cae22cc4a860ab9ea5597f1c5371cb21beca3398b8d6a", + "sha256:371aab9a397dcc76625ad3b02fa9b21be63406d69237b773156e7d1fc2ce0cae", + "sha256:3ac7c8a60b8ad51fe7bca99a634dd625d66492c502fd548dc6dc769ce7d94b6a", + "sha256:3cefb133c859f06dab2ae63885d9f405000c4031ec516e0ed4f9d779f690d8e3", + "sha256:3f06e4460e76468d99cc36d5b9bc6fc5f43e6662af44960e13e3f4e040aacb35", + "sha256:4add722393c99da4d51c8d9f3e1ddf435b30677f2d9ba9aeaa656f23c1b7b580", + "sha256:4c232726f7b6df5143415a06323faaa998ef8abbe1c0ed00d718755231d76f08", + "sha256:4d16b44ad0dd8c948129639e34c8d301ad87ebc852568ace6fe9a5ad9ce67ee1", + "sha256:50a26f68d090594477df8572babac64575cd5c07373f7a8319c527c8e56c0f99", + "sha256:5188f22c00381cb44283ecb28c8d85c2db4a3035774dd851876c8647cb809c27", + "sha256:5261c858c390ae9a19aba96796948b6a2d56649cbd572968970dc8da2b2b2a42", + "sha256:52d6cdea438eb7282c41c5ac00bd6d47d14bebb6e8a8d2a1c168ed9e0cacfbab", + "sha256:53c0e56f41ef68c1ce4e96f27ecdc2df389730391a2fd45439eb3facb02d36c8", + "sha256:56591e477bea531e5e1854f5dfb59309d5708669bc921562a35fd9ca5182bdcd", + "sha256:56835b9e9a7767202fae06310c6b67478963e535fe185bed3bf9af5b18d2b67e", + "sha256:57402d6cdd8a897ce21cf8d1ff36683583c17a16322a321184766c89a1980600", + "sha256:57cbadf028727705086047994d2e50124650e63ce5a035b0aa79ab50f001989f", + "sha256:5810fa80e64a0c689262a71af999c5735f48c0da0affcbc9041d1ef5ef3920be", + "sha256:59ec2948385336e9901008fdf765780fe30f03e7fdba8090aafdbe5d1b7ea0cd", + "sha256:5f6e4e5a62114ae76690c4a04c5108d067442d0a41fd092e8abd25af1288c450", + "sha256:60847dfbdfddf08a56c4eefe48234e8c1ab756c7eda4a2a7c1042666a5516564", + "sha256:60a3983d32f722a8422c01e4dc4badc7a307ca55c59e2485d0e14244a52c482f", + "sha256:641a8da145aca67671205f3e89bfec9815138cf2fe06653c909eab42e486d373", + "sha256:6a7e0935f05e1cf1a3aa1d49a87505773b04f128660eac2a24a5594ea6b1baa7", + "sha256:6e45fd5213e5587a610b7e7c8c5319a77591ab21ead42df46bb342e21bc1418d", + "sha256:6f0d2b97a5a06c00c963d4542793f3e486b1ed3a957f8c19f6006ed39d104bb0", + "sha256:703d60e59ab45c17485c2c14b11880e4f7f0eab07134afa9007573fa5a779a5a", + "sha256:7250030a7835bfd5ba6ca7d1ad483ec90f9cbc29978c5e75c1cc3e031d3c4160", + "sha256:73e69762cf740ac3ae81137ef9d6f15f93095f50854e233d50b29e7b8a91dbc6", + "sha256:75a4117b43694c72a0d89f6c18a28dc57407bde4650927d4ef5fd384bdf6dcc7", + "sha256:7a1611fb9de0a269c05575c024e6d8cdf2186e3fa52b364e3b03dcad82514d57", + "sha256:7c556bbf88a8b667c849d326dd4dd9c6290ede5a33383ffc12b0ed17777f909d", + "sha256:7c61ce3cdd6e6c9f4003ac118be7eb3036d0ce2afdf23929e533e54482780f74", + "sha256:7efbce96719aa275d49ad5357886845561328bf07e1d5ab998f4e3066c5ccf15", + "sha256:7fac15090bb966719df06f0c4f8139783746d1e60e71016d8a65db2031ca41b8", + "sha256:80cc2b55bb6e35d3cb40936b658837eb131e9f16357241cd9ba106ae1e9c5ecb", + "sha256:883e382695f346c2ea3ad96bdbdf4ca531788fbeedb4352be3a8fcd169fc387d", + "sha256:8aa11638902ac23f944f16ce45c9f04c9d5d57bb2da66822abb721f4efe5fdbb", + "sha256:92bb37c96215c4b2eb26f3c791c0bf02c64dd251effa532b43ca5049000c4478", + "sha256:931a3a13e0f574abce8f3152b207938a54304ccf7a6fd7dff1fdb2f6691d08af", + "sha256:93eede9bcc842f891b2267c7f0984d811940d1bc18472898a1187fe560907a99", + "sha256:947fa8bf15d1c62c6db36c6ede9389cac54f59af27010251747f05bddc227745", + "sha256:a00f5931b7cccea775123c3c0a2513aee58afdad8728550cc970bff32280bdd2", + "sha256:a3c39def0965e8fb5c8d50973e0c7b4ce429a2fa730f3f9068a7f4f9ce78410b", + "sha256:a9b67b850ab1d304cb706cf71814b0e0c3875287083d7ec55ee69504a9c48180", + "sha256:ada8ce9e6e1d126ef60d215baaa0c81381ba5841c25f1d00a71cdafdc038bd27", + "sha256:ae550cbd7f229cdf2841d9b01406bcca379a5fb327b9efb53ba620a10452e835", + "sha256:ae69524fd6a68b288574013f8fadac23cacf089c75cd3fc5b216277a445eb736", + "sha256:af64df85fecd3cf3b2e792f0b5b4d92740905adfa8ce3b24977a55415f1a0c40", + "sha256:b0181c22fdb89cc19e70240a850e5480817c3e815b1eceb171b3d7a3aa3e596a", + "sha256:b03531f6cd6ce4b511dcece060ca20aa5412f8db449274b44f4003f282e6272f", + "sha256:b3b4bb89a785f4fd60e05f3c3a526c07d0d68e3536f17f169ca13bf5b5dd75a5", + "sha256:b7150e630b879390e02121e71ceb1807f682b88342e2ea2082e2c8716cf8bd93", + "sha256:b8f842df9ba26135c5414e93214e04fe0af259bb4f96a32f756f89467f7f3b45", + "sha256:ba3a86b0d5a5c93104cb899dff291e3ae13729c389725a876d00ef9696de5425", + "sha256:ba4d02aed47c25be6775a40d55c5774327fdedba79871b7c2485e80e45750cb2", + "sha256:bc2259243ee734cc736e237719037efb86603c891fd363cc7973a2d0ac8a0e3f", + "sha256:be5c8e776ecbcf8c1bce71a7d90e3a3680c9ceae516cac0be08b47e9fac0ca43", + "sha256:be5faa2d5c8c8294d770cfd09d119fb27b5589acc59635b0cf90f145dbe81dca", + "sha256:c53164f29ed3c3868787144e8ea8a399ffd7d8215f59500a20173593c19e96eb", + "sha256:c54f8d6160080831a76780d850302fdeb0e8d0806f661777b0714dfb55d9a08a", + "sha256:c74e77df9e36c8c91157853e6cd400f6f9ca7a803ba89981bfe3f3fc7e5651ef", + "sha256:c84dce8fb2e900d4fb094e76fdad34a5fd06de53e41bddc1502c146eb11abd74", + "sha256:ca3236f31d565555139d5b00b790ed2a98ac6f0c4470c4032f8b5e5a5dba3c1a", + "sha256:d2b339fb790fc923ae2e9345c8633e3d0064d37ea7920c027f20c8ae6f65a91f", + "sha256:d46df6f0b1a0cda39d12c5c4615a7d92f40342deb8001c7b434d7c8c78352e58", + "sha256:da12b4efc93d53068888cb3b58e355b31839f2428b8f13654bd25d68b201c240", + "sha256:dc7b630c4fb428b8a40ddd0bfc4bc19de11bb3c9b031154f77360e48fe8b4451", + "sha256:dd0f25a431cd16f70ec1c47c10b413e7ddfe1ccaaddd1a7abd181e507c012374", + "sha256:ddbea6e58cce1a640d9d65947f1e259423fc201c9cf9761782f355f53b7f3097", + "sha256:ddda5ba8831f258ac7e6364be03cb27aa62f50c67fd94bc1c3b6247959cc0369", + "sha256:df7dfbdef11702fd22c2eaf042d7098d17edbc62d73f2199386ad06cbe466f6d", + "sha256:e08784288a179b59115b5e57abf6d387528b39abb61105fe17510a199a277a40", + "sha256:e283b24c14361fe9e04026a1d06c924450415491b83089951d469509900d9f32", + "sha256:e4366e58c0508da4dee4c7c70cee657e38553d73abdffa53abbd7d743711ee11", + "sha256:e6cb8f7a332eaa2d876b649a748a445a38522e12f2168e5e838d1505a91cdbb7", + "sha256:e8359fb610c8c444ac473cfd82dae465f405ff807cabb98a9b9712bbd0028751", + "sha256:eaf5e308a5e50bc0548c4fdca0117a31ec9596f8cfc96592db170bcecc71a957", + "sha256:ed1fe80e1fcdd1205a443bddb1ad3c3135bb1cd3f36cc996a1f4aed35960fbe8", + "sha256:f1f164e4cc6bc646b1fc86664c3543bf4a941d45235797279b120dc740ee7af5", + "sha256:f2cb157e279d28c66b1c27e0948687dc31dc47d1ab10ce0cd292a8334b7de3d5", + "sha256:f354d62345acdf22aa3e171bd9723790324a66fafe61bfe3873b86724cf6daaa", + "sha256:f46f8033da364bacc74aca5e319509a20bb711c8a133680ca5f35020f9eaf025", + "sha256:f90c36ca95a44d2636bbf55a51ca30583b59b71b6547b88d954e029598043551", + "sha256:f9e27841cddfaebc4e3ffbe5dbdff42891051acf5befc9f5323944b2c61cef16", + "sha256:fadda215e32fe375d65e560b7f7e2a37c7f9c4ecee5315bb1225ca6ac9bf5838" ], "markers": "python_version >= '3.6'", - "version": "==5.1.0" + "version": "==5.2.0" }, "markdown": { "hashes": [ @@ -469,6 +503,7 @@ "sha256:921da26b3f4393e6c170279ac34089151dfc22cd29ec4fbce3506218541685c8" ], "index": "pypi", + "markers": "python_version >= '3.8' and python_version < '4'", "version": "==1.2.0" }, "mkdocs-git-revision-date-localized-plugin": { @@ -477,6 +512,7 @@ "sha256:1f94eb510862ef94e982a2910404fa17a1657ecf29f45a07b0f438c00767fc85" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.2.4" }, "mkdocs-macros-plugin": { @@ -485,11 +521,14 @@ "sha256:fe348d75f01c911f362b6d998c57b3d85b505876dde69db924f2c512c395c328" ], "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==1.0.5" }, "mkdocs-material": { - "path": "./modules/mkdocs-material", - "version": "==9.5.15+insiders.4.53.3" + "extras": [ + "imaging" + ], + "path": "./modules/mkdocs-material" }, "mkdocs-material-extensions": { "hashes": [ @@ -592,7 +631,7 @@ "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" ], - "index": "pypi", + "markers": "python_version >= '3.8'", "version": "==10.2.0" }, "platformdirs": { @@ -605,10 +644,11 @@ }, "pycparser": { "hashes": [ - "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9", - "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206" + "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", + "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc" ], - "version": "==2.21" + "markers": "python_version >= '3.8'", + "version": "==2.22" }, "pygments": { "hashes": [ @@ -903,14 +943,6 @@ "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" ], "version": "==0.5.1" - }, - "zipp": { - "hashes": [ - "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", - "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" - ], - "markers": "python_version >= '3.8'", - "version": "==3.18.1" } }, "develop": { diff --git a/README.md b/README.md index b44539d9..bf912768 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@
- - Privacy Guides + + Privacy Guides @@ -92,7 +92,7 @@ This website uses [`mkdocs-material-insiders`](https://squidfunk.github.io/mkdoc 1. Clone this repository and submodules: `git clone --recurse-submodules https://github.com/privacyguides/privacyguides.org.git` 2. Enable SSH commit verification with our local [`.allowed_signers`](/.allowed_signers) file: `git config gpg.ssh.allowedSignersFile .allowed_signers` -3. Install Python **3.8**, this is the only version supported by Netlify +3. Install Python **3.12**. 4. Install **pipenv**: `pip install pipenv` 5. Install dependencies: `pipenv install --dev` (install [Pillow and CairoSVG](https://squidfunk.github.io/mkdocs-material/setup/setting-up-social-cards/#dependencies) as well to generate social cards) 6. Serve the site locally: `pipenv run mkdocs serve --config-file config/mkdocs.en.yml` (set `CARDS=true` to generate social cards) @@ -107,7 +107,8 @@ If you commit to `main` with commits signed with your SSH key, you should add yo 1. Install the [Crowdin CLI Tool](https://developer.crowdin.com/cli-tool) (`brew install crowdin`) 2. Set the `CROWDIN_PERSONAL_TOKEN` environment variable to your Crowdin personal access token 3. Run `crowdin download` in the root of this repo -4. Serve the site locally: `pipenv run mkdocs serve --config-file config/mkdocs.fr.yml` (replacing the config file with any language in [/config](/config)) +4. Import the language's environment variables: `set -a; source includes/strings.fr.env; set +a` (replacing fr with the appropriate language) +5. Serve the site locally: `pipenv run mkdocs serve --config-file config/mkdocs.fr.yml` (replacing fr with the appropriate language in [/config](/config)) Translations downloaded from Crowdin are [.gitignore](/.gitignore)'d, so any local changes to the translated site cannot be committed to this repo. Actual modifications need to be made on Crowdin. As an alternative to steps 1-3, you can copy the folders from [privacyguides/i18n](https://github.com/privacyguides/i18n) to the root of this repo to obtain the translated files. @@ -115,10 +116,9 @@ Translations downloaded from Crowdin are [.gitignore](/.gitignore)'d, so any loc It is required to create a GitHub release to publish the current site to privacyguides.org. The current `main` branch can be previewed at [https://main.staging.privacyguides.dev](https://main.staging.privacyguides.dev) prior to release. -1. Create a new tag: `git tag -s v3.X.X -m 'Some message'` - - [View existing tags](https://github.com/privacyguides/privacyguides.org/tags) - - Tag [numbering](https://semver.org): Increment the MINOR (2nd) number when making significant changes (adding/deleting pages, etc.), increment the PATCH (3rd) number when making minor changes (typos, bug fixes). Probably leave the MAJOR number at 3 until a massive revamp (v1 -> v2 was the Jekyll to MkDocs transition, v2 -> v3 was the introduction of translations). - - Consider enabling GPG tag signing by default (`git config tag.gpgSign true`) to avoid missing signatures +1. Create a new tag: `git tag -s YYYY.MM.DD -m 'Some message'` + - Tag numbering: `YYYY.MM.DD` - if two+ releases are published on the same day, append short commit sha to next release, e.g. `YYYY.MM.DD-6aa14e8` + - Enable GPG tag signing by default (`git config tag.gpgSign true`) to avoid missing signatures 2. Push the tag to GitHub: `git push --tags` 3. A GitHub Release will be automatically created and deployed to the live site. - You may wish to manually check or edit the release changelog/title after it is published for accuracy. diff --git a/config/layouts/home.yml b/config/layouts/home.yml index a859b453..6f9d2594 100644 --- a/config/layouts/home.yml +++ b/config/layouts/home.yml @@ -25,7 +25,7 @@ definitions: {{ page.meta.get("title", page.title) }} - &page_description >- - {{ config.extra.homepage_description or "A socially motivated website which provides information about protecting your online data privacy and security." }} + {{ config.extra.homepage_description }} - &og_description >- {{ page.meta.get("description", config.site_description) or "" }} diff --git a/config/layouts/page.yml b/config/layouts/page.yml index 3223f747..99f53186 100644 --- a/config/layouts/page.yml +++ b/config/layouts/page.yml @@ -26,6 +26,13 @@ definitions: Bagnard {%- endif -%} + - &title_font_style >- + {%- if config.theme.language == "he" -%} + Regular + {%- else -%} + Bold + {%- endif -%} + - &font_family >- {%- if config.theme.language == "he" -%} Suez One @@ -128,7 +135,7 @@ layers: height: 1.5 font: family: *title_font_family - style: Bold + style: *title_font_style # Page description - size: { width: 864, height: 96 } diff --git a/config/mkdocs-common.yml b/config/mkdocs-common.yml index 67c83267..65d7dd4b 100644 --- a/config/mkdocs-common.yml +++ b/config/mkdocs-common.yml @@ -18,25 +18,39 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS # IN THE SOFTWARE. +docs_dir: '../docs' +site_url: "https://www.privacyguides.org/" +site_dir: '../site' + +site_name: Privacy Guides +site_description: !ENV [SITE_DESCRIPTION, "Privacy Guides is your central privacy and security resource to protect yourself online."] +copyright: !ENV [FOOTER_COPYRIGHT, "© 2019 Privacy Guides and contributors."] +edit_uri: edit/main/docs/ + extra: + generator: false context: !ENV [CONTEXT, "production"] deploy: !ENV DEPLOY_ID + homepage_description: !ENV [DESCRIPTION_HOMEPAGE, "A socially motivated website which provides information about protecting your online data privacy and security."] + translation_notice: !ENV DESCRIPTION_TRANSLATION + translation_notice_cta: !ENV [DESCRIPTION_TRANSLATION_CTA, "Visit Crowdin"] + translation_notice_language: !ENV LANG_ENGLISH social: - icon: simple/mastodon link: https://mastodon.neat.computer/@privacyguides - name: Mastodon + name: !ENV [SOCIAL_MASTODON, "Mastodon"] - icon: simple/matrix link: https://matrix.to/#/#privacyguides:matrix.org - name: Matrix + name: !ENV [SOCIAL_MATRIX, "Matrix"] - icon: simple/discourse link: https://discuss.privacyguides.net/ - name: Forum + name: !ENV [SOCIAL_FORUM, "Forum"] - icon: simple/github link: https://github.com/privacyguides - name: GitHub + name: !ENV [SOCIAL_GITHUB, "GitHub"] - icon: simple/torbrowser link: http://www.xoe4vn5uwdztif6goazfbmogh6wh5jc4up35bqdflu6bkdc5cas5vjqd.onion/ - name: Hidden service + name: !ENV [SOCIAL_TOR_SITE, "Hidden service"] alternate: - name: English link: /en/ @@ -54,7 +68,7 @@ extra: link: /he/ lang: he icon: https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1ee-1f1f1.svg - - name: Italian + - name: Italiano link: /it/ lang: it icon: https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1ee-1f1f9.svg @@ -66,18 +80,42 @@ extra: link: /zh-hant/ lang: zh-Hant icon: https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1ed-1f1f0.svg - - name: Russian + - name: русский link: /ru/ lang: ru icon: https://raw.githubusercontent.com/twitter/twemoji/master/assets/svg/1f1f7-1f1fa.svg repo_url: https://github.com/privacyguides/privacyguides.org repo_name: "" +edit_uri: edit/main/docs/ theme: name: material + language: en custom_dir: ../theme logo: ../../theme/assets/brand/logos/svg/logo/privacy-guides-logo-notext-colorbg.svg + font: + text: Public Sans + code: DM Mono + palette: + - media: "(prefers-color-scheme)" + scheme: default + accent: deep purple + toggle: + icon: material/brightness-auto + name: !ENV [THEME_DARK, "Switch to dark mode"] + - media: "(prefers-color-scheme: dark)" + scheme: slate + accent: amber + toggle: + icon: material/brightness-2 + name: !ENV [THEME_LIGHT, "Switch to light mode"] + - media: "(prefers-color-scheme: light)" + scheme: default + accent: deep purple + toggle: + icon: material/brightness-5 + name: !ENV [THEME_AUTO, "Switch to system theme"] favicon: assets/brand/logos/png/favicon-32x32.png icon: repo: simple/github @@ -109,11 +147,11 @@ plugins: macros: {} meta: {} git-committers: - enabled: !ENV [NETLIFY, false] + enabled: !ENV [GITCOMMITTERS, PRODUCTION, NETLIFY, false] repository: privacyguides/privacyguides.org branch: main git-revision-date-localized: - enabled: !ENV [NETLIFY, false] + enabled: !ENV [GITREVISIONDATE, PRODUCTION, NETLIFY, false] exclude: - index.md fallback_to_build_date: true @@ -121,10 +159,10 @@ plugins: assets_exclude: - cdn.jsdelivr.net/npm/mathjax@3/* optimize: - enabled: !ENV [NETLIFY, false] + enabled: !ENV [OPTIMIZE, PRODUCTION, NETLIFY, false] typeset: {} social: - cards: !ENV [CARDS, true] + cards: !ENV [CARDS, PRODUCTION, NETLIFY, true] cards_dir: assets/img/social cards_layout_dir: config/layouts cards_layout: page @@ -147,7 +185,9 @@ markdown_extensions: pymdownx.keys: {} pymdownx.mark: {} pymdownx.tilde: {} - pymdownx.snippets: {} + pymdownx.snippets: + auto_append: + - includes/abbreviations.en.txt pymdownx.tasklist: custom_checkbox: true attr_list: {} @@ -163,3 +203,87 @@ markdown_extensions: toc: permalink: true toc_depth: 4 + +nav: + - !ENV [NAV_HOME, 'Home']: 'index.md' + - !ENV [NAV_KNOWLEDGE_BASE, 'Knowledge Base']: + - 'basics/why-privacy-matters.md' + - 'basics/threat-modeling.md' + - 'basics/common-threats.md' + - 'basics/common-misconceptions.md' + - 'basics/account-creation.md' + - 'basics/account-deletion.md' + - !ENV [NAV_TECHNOLOGY_ESSENTIALS, 'Technology Essentials']: + - 'basics/passwords-overview.md' + - 'basics/multi-factor-authentication.md' + - 'basics/email-security.md' + - 'basics/vpn-overview.md' + - !ENV [NAV_ADVANCED_TOPICS, 'Advanced Topics']: + - 'advanced/dns-overview.md' + - 'advanced/tor-overview.md' + - 'advanced/payments.md' + - 'advanced/communication-network-types.md' + - !ENV [NAV_OPERATING_SYSTEMS, 'Operating Systems']: + - 'os/android-overview.md' + - 'os/ios-overview.md' + - 'os/linux-overview.md' + - 'os/macos-overview.md' + - 'os/qubes-overview.md' + - kb-archive.md + - !ENV [NAV_RECOMMENDATIONS, 'Recommendations']: + - 'tools.md' + - !ENV [NAV_INTERNET_BROWSING, 'Internet Browsing']: + - 'tor.md' + - 'desktop-browsers.md' + - 'mobile-browsers.md' + - !ENV [NAV_PROVIDERS, 'Providers']: + - 'cloud.md' + - 'dns.md' + - 'email-aliasing.md' + - 'email.md' + - 'financial-services.md' + - 'photo-management.md' + - 'search-engines.md' + - 'vpn.md' + - !ENV [NAV_SOFTWARE, 'Software']: + - 'calendar.md' + - 'cryptocurrency.md' + - 'data-redaction.md' + - 'email-clients.md' + - 'encryption.md' + - 'file-sharing.md' + - 'frontends.md' + - 'multi-factor-authentication.md' + - 'news-aggregators.md' + - 'notebooks.md' + - 'passwords.md' + - 'productivity.md' + - 'real-time-communication.md' + - !ENV [NAV_OPERATING_SYSTEMS, 'Operating Systems']: + - 'android.md' + - 'desktop.md' + - 'router.md' + - !ENV [NAV_ADVANCED, 'Advanced']: + - 'device-integrity.md' + - !ENV [NAV_ABOUT, 'About']: + - 'about/index.md' + - 'about/criteria.md' + - 'about/notices.md' + - 'about/privacy-policy.md' + - !ENV [NAV_COMMUNITY, 'Community']: + - 'about/donate.md' + - !ENV [NAV_ONLINE_SERVICES, 'Online Services']: 'about/services.md' + - !ENV [NAV_CODE_OF_CONDUCT, 'Code of Conduct']: 'CODE_OF_CONDUCT.md' + - 'about/privacytools.md' + - !ENV [NAV_CONTRIBUTING, 'Contributing']: + - !ENV [NAV_WRITING_GUIDE, 'Writing Guide']: + - 'meta/writing-style.md' + - 'meta/admonitions.md' + - 'meta/brand.md' + - 'meta/translations.md' + - !ENV [NAV_TECHNICAL_GUIDES, 'Technical Guides']: + - 'meta/uploading-images.md' + - 'meta/git-recommendations.md' + - !ENV [NAV_CHANGELOG, 'Changelog']: 'https://github.com/privacyguides/privacyguides.org/releases' + - !ENV [NAV_FORUM, 'Forum']: 'https://discuss.privacyguides.net/' + - !ENV [NAV_BLOG, 'Blog']: 'https://blog.privacyguides.org/' diff --git a/config/mkdocs-offline.yml b/config/mkdocs-offline.yml index 384dc69f..55173031 100644 --- a/config/mkdocs-offline.yml +++ b/config/mkdocs-offline.yml @@ -1,4 +1,4 @@ -# Copyright (c) 2023 Jonah Aragon +# Copyright (c) 2023-2024 Jonah Aragon # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to @@ -19,53 +19,18 @@ # IN THE SOFTWARE. INHERIT: mkdocs-common.yml -docs_dir: '../docs' -site_url: "https://www.privacyguides.org/" -site_dir: '../site' -site_name: Privacy Guides -site_description: | - Privacy Guides is your central privacy and security resource to protect yourself online. -copyright: | - Privacy Guides is a non-profit, socially motivated website that provides information for protecting your data security and privacy.
- We do not make money from recommending certain products, and we do not use affiliate links.
- © 2019 - 2024 Privacy Guides and contributors. - - Content licensed under CC BY-ND 4.0. +# Disable any GitHub integrations repo_url: "" extra: - generator: false - analytics: false + # Disable language switcher alternate: false offline: true theme: - language: en - # this logo needs to be set separately because the relative path is different + # OFFLINE ONLY: this logo needs to be set separately because the relative path is different logo: ../theme/assets/brand/logos/svg/logo/privacy-guides-logo-notext-colorbg.svg - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Switch to dark mode" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Switch to light mode" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Switch to system theme" features: - navigation.tabs - navigation.sections @@ -80,88 +45,4 @@ plugins: social: enabled: false -markdown_extensions: - pymdownx.snippets: - auto_append: - - includes/abbreviations.en.txt - -nav: - - Home: 'index.md' - - Knowledge Base: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - Technology Essentials: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - Advanced Topics: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - Operating Systems: - - 'os/android-overview.md' - - 'os/linux-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Recommendations: - - 'tools.md' - - Internet Browsing: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - Providers: - - 'cloud.md' - - 'dns.md' - - 'email.md' - - 'email-aliasing.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - Software: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - Operating Systems: - - 'android.md' - - 'desktop.md' - - 'router.md' - - About: - - 'about/index.md' - - 'about/criteria.md' - - 'about/statistics.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Community: - - 'about/donate.md' - - Online Services: 'about/services.md' - - Code of Conduct: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Contributing: - - Writing Guide: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - Technical Guides: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - Changelog: 'https://github.com/privacyguides/privacyguides.org/releases' - - Forum: 'https://discuss.privacyguides.net/' - - Blog: 'https://blog.privacyguides.org/' +# Edit the offline-mode navbar in mkdocs-common.yml diff --git a/config/mkdocs.en.yml b/config/mkdocs.en.yml index 0bb5a0dc..9308ba0d 100644 --- a/config/mkdocs.en.yml +++ b/config/mkdocs.en.yml @@ -19,137 +19,9 @@ # IN THE SOFTWARE. INHERIT: mkdocs-common.yml -docs_dir: '../docs' site_url: "https://www.privacyguides.org/en/" site_dir: '../site/en' -site_name: Privacy Guides -site_description: | - Privacy Guides is your central privacy and security resource to protect yourself online. -copyright: | - Privacy Guides is a non-profit, socially motivated website that provides information for protecting your data security and privacy.
- We do not make money from recommending certain products, and we do not use affiliate links.
- © 2019 - 2024 Privacy Guides and contributors. - - Content licensed under CC BY-ND 4.0. -edit_uri: edit/main/docs/ - -extra: - generator: false - theme: - language: en # ENGLISH ONLY: this logo needs to be set separately because the relative path is different - logo: ../theme/assets/brand/logos/svg/logo/privacy-guides-logo-notext-colorbg.svg - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Switch to dark mode" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Switch to light mode" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Switch to system theme" - -markdown_extensions: - pymdownx.snippets: - auto_append: - - includes/abbreviations.en.txt - -nav: - - Home: 'index.md' - - Knowledge Base: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - Technology Essentials: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - Advanced Topics: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - Operating Systems: - - 'os/android-overview.md' - - 'os/ios-overview.md' - - 'os/linux-overview.md' - - 'os/macos-overview.md' - - 'os/windows-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Recommendations: - - 'tools.md' - - Internet Browsing: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - Providers: - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - Software: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - Operating Systems: - - 'android.md' - - 'desktop.md' - - 'router.md' - - Advanced: - - 'device-integrity.md' - - About: - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Community: - - 'about/donate.md' - - Online Services: 'about/services.md' - - Code of Conduct: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Contributing: - - Writing Guide: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - Technical Guides: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - Changelog: 'https://github.com/privacyguides/privacyguides.org/releases' - - Forum: 'https://discuss.privacyguides.net/' - - Blog: 'https://blog.privacyguides.org/' + logo: ../theme/assets/brand/logos/svg/logo/privacy-guides-logo-notext-colorbg.svg \ No newline at end of file diff --git a/config/mkdocs.es.yml b/config/mkdocs.es.yml index 38b0b701..f47c0bbd 100644 --- a/config/mkdocs.es.yml +++ b/config/mkdocs.es.yml @@ -23,130 +23,12 @@ docs_dir: '../i18n/es' site_url: "https://www.privacyguides.org/es/" site_dir: '../site/es' -site_name: Privacy Guides -site_description: | - Privacy Guides es tu recurso central de privacidad y seguridad para protegerte en línea. -copyright: | - Privacy Guides es un sitio web sin fines lucrativos y de motivación social que ofrece información para proteger la seguridad y privacidad de sus datos.
- No ganamos dinero por recomendar determinados productos y no utilizamos enlaces de afiliados.
- © 2019 - 2024 Privacy Guides y colaboradores. - - Contenido bajo licencia CC BY-ND 4.0. edit_uri: edit/main/i18n/es/ -extra: - generator: false - theme: language: es - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Cambiar a modo oscuro" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Cambiar a modo claro" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Cambiar al tema del sistema" markdown_extensions: pymdownx.snippets: - auto_append: + auto_append: - includes/abbreviations.es.txt - -nav: - - Inicio: 'index.md' - - Base de conocimientos: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - "Aspectos tecnológicos esenciales": - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - Temas avanzados: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - Sistemas operativos: - - 'os/android-overview.md' - - 'os/ios-overview.md' - - 'os/linux-overview.md' - - 'os/macos-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Recomendaciones: - - 'tools.md' - - "Navegación por Internet": - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - Proveedores: - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - Software: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - Sistemas operativos: - - 'android.md' - - 'desktop.md' - - 'router.md' - - Advanced: - - 'device-integrity.md' - - Acerca de: - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Comunidad: - - 'about/donate.md' - - Servicios en línea: 'about/services.md' - - "Código de conducta": 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Contribuir: - - "Guía de redacción": - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - "Guías técnicas": - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - "Registro de cambios": 'https://github.com/privacyguides/privacyguides.org/releases' - - Foro: 'https://discuss.privacyguides.net/' - - Blog: 'https://blog.privacyguides.org/' diff --git a/config/mkdocs.fr.yml b/config/mkdocs.fr.yml index e51f1972..8ff85401 100644 --- a/config/mkdocs.fr.yml +++ b/config/mkdocs.fr.yml @@ -23,130 +23,12 @@ docs_dir: '../i18n/fr' site_url: "https://www.privacyguides.org/fr/" site_dir: '../site/fr' -site_name: Privacy Guides -site_description: | - Privacy Guides est votre ressource centrale en matière de vie privée et de sécurité pour vous protéger en ligne. -copyright: | - Privacy Guides est un site web à but non lucratif et à vocation sociale qui fournit des informations pour protéger la sécurité de vos données et votre vie privée.
- Nous ne gagnons pas d'argent en recommandant certains produits et nous n'utilisons pas de liens d'affiliation.
- © 2019 - 2024 Privacy Guides et contributeurs. - - Contenu sous licence CC BY-ND 4.0. edit_uri: edit/main/i18n/fr/ -extra: - generator: false - theme: language: fr - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Basculer en mode sombre" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Basculer en mode clair" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Basculer vers le thème du système" markdown_extensions: pymdownx.snippets: - auto_append: + auto_append: - includes/abbreviations.fr.txt - -nav: - - Accueil: 'index.md' - - Base de connaissances: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - Les essentiels de la technologie: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - "Sujets avancés": - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - "Systèmes d'exploitation": - - 'os/android-overview.md' - - 'os/ios-overview.md' - - 'os/linux-overview.md' - - 'os/macos-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Recommandations: - - 'tools.md' - - Navigation internet: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - "Fournisseurs": - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - "Logiciels": - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - "Systèmes d'exploitation": - - 'android.md' - - 'desktop.md' - - 'router.md' - - "Advanced": - - 'device-integrity.md' - - "À propos": - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - "Communauté": - - 'about/donate.md' - - "Services en ligne": 'about/services.md' - - "Code de conduite": 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - "Contribuer": - - "Guide de rédaction": - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - "Guides techniques": - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - Journal des modifications: 'https://github.com/privacyguides/privacyguides.org/releases' - - Forum: 'https://discuss.privacyguides.net/' - - Blog: 'https://blog.privacyguides.org/' diff --git a/config/mkdocs.he.yml b/config/mkdocs.he.yml index 5be48ff7..33fc6949 100644 --- a/config/mkdocs.he.yml +++ b/config/mkdocs.he.yml @@ -23,20 +23,8 @@ docs_dir: '../i18n/he' site_url: "https://www.privacyguides.org/he/" site_dir: '../site/he' -site_name: Privacy Guides -site_description: | - Privacy Guides (מדריכי פרטיות) הם משאב הפרטיות והאבטחה המרכזי שלכם כדי להגן על עצמכם באופן מקוון. -copyright: | - Privacy Guides is a non-profit, socially motivated website that provides information for protecting your data security and privacy.
- We do not make money from recommending certain products, and we do not use affiliate links.
- © 2019 - 2024 Privacy Guides and contributors. - - Content licensed under CC BY-ND 4.0. edit_uri: edit/main/i18n/he/ -extra: - generator: false - extra_css: - assets/stylesheets/extra.css?v=3.2.0 - assets/stylesheets/lang-he.css?v=3.4.0 @@ -46,111 +34,8 @@ theme: font: text: Open Sans code: Cousine - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "עבור למצב כהה" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "עבור למצב בהיר" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "עבור לערכת הנושא של המערכת" markdown_extensions: pymdownx.snippets: - auto_append: + auto_append: - includes/abbreviations.he.txt - -nav: - - "דף הבית": 'index.md' - - "ידע בסיסי": - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - "יסודות הטכנולוגיה": - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - "נושאים מתקדמים": - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - "מערכות הפעלה": - - 'os/android-overview.md' - - 'os/ios-overview.md' - - 'os/linux-overview.md' - - 'os/macos-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - "המלצות": - - 'tools.md' - - "גלישה באינטרנט": - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - "ספקים": - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - "תוכנה": - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - "מערכות הפעלה": - - 'android.md' - - 'desktop.md' - - 'router.md' - - "Advanced": - - 'device-integrity.md' - - "על אודות": - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Community: - - 'about/donate.md' - - Online Services: 'about/services.md' - - Code of Conduct: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Contributing: - - Writing Guide: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - Technical Guides: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - "יומן שינויים": 'https://github.com/privacyguides/privacyguides.org/releases' - - "פורום": 'https://discuss.privacyguides.net/' - - "בלוג": 'https://blog.privacyguides.org/' diff --git a/config/mkdocs.it.yml b/config/mkdocs.it.yml index f22f0f56..5694891a 100644 --- a/config/mkdocs.it.yml +++ b/config/mkdocs.it.yml @@ -23,130 +23,12 @@ docs_dir: '../i18n/it' site_url: "https://www.privacyguides.org/it/" site_dir: '../site/it' -site_name: Privacy Guides -site_description: | - Privacy Guides è la risorsa centrale per la privacy e la sicurezza per proteggersi online. -copyright: | - Privacy Guides è un sito web senza fini di lucro e a sfondo sociale che fornisce informazioni per proteggere la sicurezza e la privacy dei dati.
- Non guadagniamo denaro consigliando determinati prodotti e non utilizziamo link di affiliazione.
- © 2019 - 2024 Privacy Guides e collaboratori. - - Contenuto sotto licenza CC BY-ND 4.0. edit_uri: edit/main/i18n/it/ -extra: - generator: false - theme: language: it - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Passa al tema scuro" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Passa al tema chiaro" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Passa al tema di sistema" markdown_extensions: pymdownx.snippets: - auto_append: + auto_append: - includes/abbreviations.it.txt - -nav: - - Pagina iniziale: 'index.md' - - Conoscenze di base: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - Elementi essenziali della tecnologia: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - Argomenti avanzati: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - Sistemi operativi: - - 'os/android-overview.md' - - 'os/ios-overview.md' - - 'os/linux-overview.md' - - 'os/macos-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Raccomandazioni: - - 'tools.md' - - Navigazione su Internet: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - Fornitori: - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - Software: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - Sistemi operativi: - - 'android.md' - - 'desktop.md' - - 'router.md' - - "Advanced": - - 'device-integrity.md' - - Informazioni: - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Comunità: - - 'about/donate.md' - - Servizi online: 'about/services.md' - - Codice di condotta: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Contribuisci: - - Guida alla scrittura: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - Guide tecniche: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - Registro delle modifiche: 'https://github.com/privacyguides/privacyguides.org/releases' - - Forum: 'https://discuss.privacyguides.net/' - - Blog: 'https://blog.privacyguides.org/' diff --git a/config/mkdocs.nl.yml b/config/mkdocs.nl.yml index 368e8dff..642694b9 100644 --- a/config/mkdocs.nl.yml +++ b/config/mkdocs.nl.yml @@ -23,130 +23,12 @@ docs_dir: '../i18n/nl' site_url: "https://www.privacyguides.org/nl/" site_dir: '../site/nl' -site_name: Privacy Guides -site_description: | - Privacy Guides is jouw centrale bron voor privacy en beveiliging om jezelf online te beschermen. -copyright: | - Privacy Guides is een non-profit, sociaal gemotiveerde website die informatie biedt voor de bescherming van jouw gegevensbeveiliging en privacy.
- Wij verdienen geen geld met het aanbevelen van bepaalde producten, en wij maken geen gebruik van affiliate links.
- © 2019 - 2024 Privacy Guides en medewerkers. - - Inhoud gelicentieerd onder CC BY-ND 4.0. edit_uri: edit/main/i18n/nl/ -extra: - generator: false - theme: language: nl - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Verander naar donker thema" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Verander naar licht thema" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Verander naar systeem thema" markdown_extensions: pymdownx.snippets: - auto_append: + auto_append: - includes/abbreviations.nl.txt - -nav: - - Home: 'index.md' - - Kennisbank: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - Technologie essenties: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - Gevorderde onderwerpen: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - Besturings systemen: - - 'os/android-overview.md' - - 'os/ios-overview.md' - - 'os/linux-overview.md' - - 'os/macos-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Recommendaties: - - 'tools.md' - - Surfen op het internet: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - Providers: - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - Software: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - Besturings systemen: - - 'android.md' - - 'desktop.md' - - 'router.md' - - "Advanced": - - 'device-integrity.md' - - Over ons: - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Gemeenschap: - - 'about/donate.md' - - Online diensten: 'about/services.md' - - Gedragscode: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Bijdragen: - - Schrijfgids: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - Technische gids: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - Wijzigingslogboek: 'https://github.com/privacyguides/privacyguides.org/releases' - - Forum: 'https://discuss.privacyguides.net/' - - Blog: 'https://blog.privacyguides.org/' diff --git a/config/mkdocs.ru.yml b/config/mkdocs.ru.yml index fb225c8b..f007a593 100644 --- a/config/mkdocs.ru.yml +++ b/config/mkdocs.ru.yml @@ -23,132 +23,16 @@ docs_dir: '../i18n/ru' site_url: "https://www.privacyguides.org/ru/" site_dir: '../site/ru' -site_name: Privacy Guides -site_description: | - Privacy Guides - это ваш главный ресурс по конфиденциальности и безопасности для защиты себя в Интернете. -copyright: | - Privacy Guides - некоммерческий сайт, предоставляющий информацию по защите безопасности и конфиденциальности ваших данных.
- Мы не зарабатываем на рекомендациях определенных продуктов и не используем партнерские ссылки.
- © 2019 - 2023 Privacy Guides и поддерживающие. - - Содержание доступно под лицензией CC BY-ND 4.0. edit_uri: edit/main/docs/ -extra: - generator: false - extra_css: - assets/stylesheets/extra.css?v=3.2.0 - assets/stylesheets/lang-ru.css?v=3.13.0 theme: language: ru - font: - text: Public Sans - code: DM Mono - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "Включить тёмную тему" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "Включить светлую тему" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "Переключиться на тему системы" markdown_extensions: pymdownx.snippets: auto_append: - includes/abbreviations.ru.txt - -nav: - - Главная: 'index.md' - - База знаний: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - Технологические аспекты: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - Дополнительные темы: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - Операционные системы: - - 'os/android-overview.md' - - 'os/linux-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - Рекомендации: - - 'tools.md' - - Интернет-браузинг: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - Провайдеры: - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - Программное обеспечение: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - Операционные системы: - - 'android.md' - - 'desktop.md' - - 'router.md' - - Advanced: - - 'device-integrity.md' - - О сайте: - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - Сообщество: - - 'about/donate.md' - - Онлайн-сервисы: 'about/services.md' - - Правила поведения: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - Помощь проекту: - - Руководство по написанию: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - Технические руководства: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - Список изменений: 'https://github.com/privacyguides/privacyguides.org/releases' - - Форум: 'https://discuss.privacyguides.net/' - - Блог: 'https://blog.privacyguides.org/' diff --git a/config/mkdocs.zh-Hant.yml b/config/mkdocs.zh-Hant.yml index f41d5cbc..7c2616b5 100644 --- a/config/mkdocs.zh-Hant.yml +++ b/config/mkdocs.zh-Hant.yml @@ -23,20 +23,8 @@ docs_dir: '../i18n/zh-Hant' site_url: "https://www.privacyguides.org/zh-Hant/" site_dir: '../site/zh-Hant' -site_name: Privacy Guides -site_description: | - Privacy Guides 是您重要的網路隱私與安全資源。 -copyright: | - Privacy Guides 是一個非營利、社會導向的網站,旨在提供有關資訊以確保您的資料安全和隱私。
- 我們不會通過推薦某些產品來賺錢,我們也不會使用推廣回贈鏈接。 - © 2019 - 2024 Privacy Guides 和貢獻者。 - - 根據CC BY-ND 4.0授權的內容。 CC BY-ND 4.0. edit_uri: edit/main/i18n/zh-Hant/ -extra: - generator: false - extra_css: - assets/stylesheets/extra.css?v=3.2.0 - assets/stylesheets/lang-zh-Hant.css?v=3.13.0 @@ -46,109 +34,8 @@ theme: font: text: Noto Sans TC code: Noto Sans TC - palette: - - media: "(prefers-color-scheme)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-auto - name: "切換至深色模式" - - media: "(prefers-color-scheme: dark)" - scheme: slate - accent: amber - toggle: - icon: material/brightness-2 - name: "切換至淺色模式" - - media: "(prefers-color-scheme: light)" - scheme: default - accent: deep purple - toggle: - icon: material/brightness-5 - name: "切換到系統主題" markdown_extensions: pymdownx.snippets: - auto_append: + auto_append: - includes/abbreviations.zh-Hant.txt - -nav: - - 首頁: 'index.md' - - 知識庫: - - 'basics/why-privacy-matters.md' - - 'basics/threat-modeling.md' - - 'basics/common-threats.md' - - 'basics/common-misconceptions.md' - - 'basics/account-creation.md' - - 'basics/account-deletion.md' - - 技術精華: - - 'basics/passwords-overview.md' - - 'basics/multi-factor-authentication.md' - - 'basics/email-security.md' - - 'basics/vpn-overview.md' - - 進階主題: - - 'advanced/dns-overview.md' - - 'advanced/tor-overview.md' - - 'advanced/payments.md' - - 'advanced/communication-network-types.md' - - 作業系統: - - 'os/android-overview.md' - - 'os/linux-overview.md' - - 'os/qubes-overview.md' - - kb-archive.md - - 推薦: - - 'tools.md' - - 網際網路瀏覽: - - 'tor.md' - - 'desktop-browsers.md' - - 'mobile-browsers.md' - - 提供者: - - 'cloud.md' - - 'dns.md' - - 'email-aliasing.md' - - 'email.md' - - 'financial-services.md' - - 'photo-management.md' - - 'search-engines.md' - - 'vpn.md' - - 軟體: - - 'calendar.md' - - 'cryptocurrency.md' - - 'data-redaction.md' - - 'email-clients.md' - - 'encryption.md' - - 'file-sharing.md' - - 'frontends.md' - - 'multi-factor-authentication.md' - - 'news-aggregators.md' - - 'notebooks.md' - - 'passwords.md' - - 'productivity.md' - - 'real-time-communication.md' - - 作業系統: - - 'android.md' - - 'desktop.md' - - 'router.md' - - Advanced: - - 'device-integrity.md' - - 關於: - - 'about/index.md' - - 'about/criteria.md' - - 'about/notices.md' - - 'about/privacy-policy.md' - - 社群: - - 'about/donate.md' - - 線上服務: 'about/services.md' - - 行為守則: 'CODE_OF_CONDUCT.md' - - 'about/privacytools.md' - - 貢獻: - - 寫作指南: - - 'meta/writing-style.md' - - 'meta/admonitions.md' - - 'meta/brand.md' - - 'meta/translations.md' - - 技術指導: - - 'meta/uploading-images.md' - - 'meta/git-recommendations.md' - - 變更記錄: 'https://github.com/privacyguides/privacyguides.org/releases' - - 論壇: 'https://discuss.privacyguides.net/' - - 部落格: 'https://blog.privacyguides.org/' diff --git a/docs/advanced/dns-overview.md b/docs/advanced/dns-overview.md index 72e409c5..327c9057 100644 --- a/docs/advanced/dns-overview.md +++ b/docs/advanced/dns-overview.md @@ -82,6 +82,24 @@ Encrypted DNS can refer to one of a number of protocols, the most common ones be Native implementation of DoH showed up in iOS 14, macOS 11, Microsoft Windows, and Android 13 (however, it won't be enabled [by default](https://android-review.googlesource.com/c/platform/packages/modules/DnsResolver/+/1833144)). General Linux desktop support is waiting on the systemd [implementation](https://github.com/systemd/systemd/issues/8639) so [installing third-party software is still required](../dns.md#encrypted-dns-proxies). +### Native Operating System Support + +#### Android + +Android 9 and above support DNS over TLS. The settings can be found in: **Settings** → **Network & Internet** → **Private DNS**. + +#### Apple Devices + +The latest versions of iOS, iPadOS, tvOS, and macOS, support both DoT and DoH. Both protocols are supported natively via [configuration profiles](https://support.apple.com/guide/security/configuration-profile-enforcement-secf6fb9f053/web) or through the [DNS Settings API](https://developer.apple.com/documentation/networkextension/dns_settings). + +After installation of either a configuration profile or an app that uses the DNS Settings API, the DNS configuration can be selected. If a VPN is active, resolution within the VPN tunnel will use the VPN's DNS settings and not your system-wide settings. + +Apple does not provide a native interface for creating encrypted DNS profiles. [Secure DNS profile creator](https://dns.notjakob.com/tool.html) is an unofficial tool for creating your own encrypted DNS profiles, however they will not be signed. Signed profiles are preferred; signing validates a profile's origin and helps to ensure the integrity of the profiles. A green "Verified" label is given to signed configuration profiles. For more information on code signing, see [About Code Signing](https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html). + +#### Linux + +`systemd-resolved`, which many Linux distributions use to do their DNS lookups, doesn't yet [support DoH](https://github.com/systemd/systemd/issues/8639). If you want to use DoH, you'll need to install a proxy like [dnscrypt-proxy](https://github.com/DNSCrypt/dnscrypt-proxy) and [configure it](https://wiki.archlinux.org/title/Dnscrypt-proxy) to take all the DNS queries from your system resolver and forward them over HTTPS. + ## What can an outside party see? In this example we will record what happens when we make a DoH request: @@ -319,4 +337,27 @@ The [EDNS Client Subnet](https://en.wikipedia.org/wiki/EDNS_Client_Subnet) is a It's intended to "speed up" delivery of data by giving the client an answer that belongs to a server that is close to them such as a [content delivery network](https://en.wikipedia.org/wiki/Content_delivery_network), which are often used in video streaming and serving JavaScript web apps. -This feature does come at a privacy cost, as it tells the DNS server some information about the client's location. +This feature does come at a privacy cost, as it tells the DNS server some information about the client's location, generally your IP network. For example, if your IP address is `198.51.100.32` the DNS provider might share `198.51.100.0/24` with the authoritative server. Some DNS providers anonymize this data by providing another IP address which is approximately near your location. + +If you have `dig` installed you can test whether your DNS provider gives EDNS information out to DNS nameservers with the following command: + +```bash +dig +nocmd -t txt o-o.myaddr.l.google.com +nocomments +noall +answer +stats +``` + +Note that this command will contact Google for the test, and return your IP as well as EDNS client subnet information. If you want to test another DNS resolver you can specify their IP, to test `9.9.9.11` for example: + +```bash +dig +nocmd @9.9.9.11 -t txt o-o.myaddr.l.google.com +nocomments +noall +answer +stats +``` + +If the results include a second edns0-client-subnet TXT record (like shown below), then your DNS server is passing along EDNS information. The IP or network shown after is the precise information which was shared with Google by your DNS provider. + +```text +o-o.myaddr.l.google.com. 60 IN TXT "198.51.100.32" +o-o.myaddr.l.google.com. 60 IN TXT "edns0-client-subnet 198.51.100.0/24" +;; Query time: 64 msec +;; SERVER: 9.9.9.11#53(9.9.9.11) +;; WHEN: Wed Mar 13 10:23:08 CDT 2024 +;; MSG SIZE rcvd: 130 +``` diff --git a/docs/android.md b/docs/android.md index 58896dce..d6da9542 100644 --- a/docs/android.md +++ b/docs/android.md @@ -426,13 +426,6 @@ In some rare cases, the developer of an app will only distribute it through F-Dr **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Operating Systems - Must be open-source software. diff --git a/docs/calendar.md b/docs/calendar.md index 0de03b59..8a37d1f7 100644 --- a/docs/calendar.md +++ b/docs/calendar.md @@ -67,13 +67,6 @@ Unfortunately, as of January 2024 Proton has [still](https://discuss.privacyguid **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Qualifications - Must sync and store information with E2EE to ensure data is not visible to the service provider. diff --git a/docs/cloud.md b/docs/cloud.md index 9fda0d76..46075c30 100644 --- a/docs/cloud.md +++ b/docs/cloud.md @@ -90,13 +90,6 @@ They have also received the Digital Trust Label, a certification from the [Swiss **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Requirements - Must enforce end-to-end encryption. diff --git a/docs/cryptocurrency.md b/docs/cryptocurrency.md index d92742f9..de350372 100644 --- a/docs/cryptocurrency.md +++ b/docs/cryptocurrency.md @@ -55,11 +55,4 @@ Ultimately, Monero is the strongest contender for a privacy-friendly cryptocurre **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Cryptocurrency must provide private/untraceable transactions by default. diff --git a/docs/data-redaction.md b/docs/data-redaction.md index 394e1a35..a5c50022 100644 --- a/docs/data-redaction.md +++ b/docs/data-redaction.md @@ -169,12 +169,5 @@ exiftool -all= *.file_extension **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Apps developed for open-source operating systems must be open source. - Apps must be free and should not include ads or other limitations. diff --git a/docs/desktop-browsers.md b/docs/desktop-browsers.md index fdd2bfa4..3c9234b3 100644 --- a/docs/desktop-browsers.md +++ b/docs/desktop-browsers.md @@ -240,14 +240,13 @@ Brave is built upon the Chromium web browser project, so it should feel familiar - [:simple-github: GitHub](https://github.com/brave/brave-browser/releases) - [:simple-windows11: Windows](https://brave.com/download) - [:simple-apple: macOS](https://brave.com/download) -- [:simple-linux: Linux](https://brave.com/linux) (1) +- [:simple-linux: Linux](https://brave.com/linux) +- [:simple-flathub: Flathub](https://flathub.org/apps/com.brave.Browser)
-1. We advise against using the Flatpak version of Brave, as it replaces Chromium's sandbox with Flatpak's, which is less effective. Additionally, the package is not maintained by Brave Software, Inc. - **macOS users:** The download for Brave Browser from their official website is a `.pkg` installer which requires admin privileges to run (and may run other unnecessary scripts on your machine). As an alternative, you can download the latest `Brave-Browser-universal.dmg` file from their [GitHub releases](https://github.com/brave/brave-browser/releases/latest) page, which provides a traditional "drag to Applications folder" install.
@@ -426,13 +425,6 @@ uBlock Origin Lite only receives block list updates whenever the extension is up **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Requirements - Must be open-source software. diff --git a/docs/dns.md b/docs/dns.md index d93c8f07..5fac3961 100644 --- a/docs/dns.md +++ b/docs/dns.md @@ -13,64 +13,132 @@ Encrypted DNS with third-party servers should only be used to get around basic [ ## Recommended Providers -| DNS Provider | Privacy Policy | Protocols | Logging | ECS | Filtering | -| ------------ | -------------- | --------- | ------- | --- | --------- | -| [**AdGuard**](https://adguard.com/en/adguard-dns/overview.html) | [:octicons-link-external-24:](https://adguard.com/en/privacy/dns.html) | Cleartext
DoH/3
DoT
DoQ
DNSCrypt | Some[^1] | Yes | Based on personal configuration. Filter list being used can be found here. [:octicons-link-external-24:](https://github.com/AdguardTeam/AdGuardDNS) | -| [**Cloudflare**](https://developers.cloudflare.com/1.1.1.1/setup) | [:octicons-link-external-24:](https://developers.cloudflare.com/1.1.1.1/privacy/public-dns-resolver) | Cleartext
DoH/3
DoT | Some[^2] | No | Based on personal configuration.| -| [**Control D**](https://controld.com/free-dns) | [:octicons-link-external-24:](https://controld.com/privacy) | Cleartext
DoH/3
DoT
DoQ| Optional[^3] | No | Based on personal configuration. | -| [**Mullvad**](https://mullvad.net/en/help/dns-over-https-and-dns-over-tls) | [:octicons-link-external-24:](https://mullvad.net/en/help/no-logging-data-policy) | DoH
DoT | No[^4] | No | Based on personal configuration. Filter list being used can be found here. [:octicons-link-external-24:](https://github.com/mullvad/dns-adblock) | -| [**NextDNS**](https://nextdns.io) | [:octicons-link-external-24:](https://nextdns.io/privacy) | Cleartext
DoH/3
DoT
DoQ | Optional[^5] | Optional | Based on personal configuration. | -| [**Quad9**](https://quad9.net) | [:octicons-link-external-24:](https://quad9.net/privacy/policy) | Cleartext
DoH
DoT
DNSCrypt | Some[^6] | Optional | Based on personal configuration, Malware blocking by default. | +These are our favorite public DNS resolvers based on their privacy and security characteristics, and their worldwide performance. Some of these services offer basic DNS-level blocking of malware or trackers depending on the server you choose, but if you want to be able to see and customize what is blocked you should use a dedicated DNS filtering product instead. + +| DNS Provider | Privacy Policy | Protocols | Logging | [ECS](advanced/dns-overview.md#what-is-edns-client-subnet-ecs) | Filtering | Signed Apple Profile | +|---|---|---|---|---|---|---| +| [**AdGuard Public DNS**](https://adguard-dns.io/en/public-dns.html) | [:octicons-link-external-24:](https://adguard.com/en/privacy/dns.html) | Cleartext DoH/3 DoT DoQ DNSCrypt | Some[^1] | Anonymized | Based on server choice. Filter list being used can be found here. [:octicons-link-external-24:](https://github.com/AdguardTeam/AdGuardDNS) | Yes [:octicons-link-external-24:](https://adguard.com/en/blog/encrypted-dns-ios-14.html) | +| [**Cloudflare**](https://developers.cloudflare.com/1.1.1.1/setup) | [:octicons-link-external-24:](https://developers.cloudflare.com/1.1.1.1/privacy/public-dns-resolver) | Cleartext DoH/3 DoT | Some[^2] | No | Based on server choice. | No [:octicons-link-external-24:](https://community.cloudflare.com/t/requesting-1-1-1-1-signed-profiles-for-apple/571846) | +| [**Control D Free DNS**](https://controld.com/free-dns) | [:octicons-link-external-24:](https://controld.com/privacy) | Cleartext DoH/3 DoT DoQ | Optional[^3] | No | Based on server choice. | Yes [:octicons-link-external-24:](https://docs.controld.com/docs/macos-platform) | +| [**dns0.eu**](https://dns0.eu) | [:octicons-link-external-24:](https://dns0.eu/privacy) | Cleartext DoH/3 DoH DoT DoQ | No | Anonymized | Based on server choice. | Yes [:octicons-link-external-24:](https://www.dns0.eu/zero.dns0.eu.mobileconfig) | +| [**Mullvad**](https://mullvad.net/en/help/dns-over-https-and-dns-over-tls) | [:octicons-link-external-24:](https://mullvad.net/en/help/no-logging-data-policy) | DoH DoT | No[^4] | No | Based on server choice. Filter list being used can be found here. [:octicons-link-external-24:](https://github.com/mullvad/dns-adblock) | Yes [:octicons-link-external-24:](https://mullvad.net/en/blog/profiles-to-configure-our-encrypted-dns-on-apple-devices) | +| [**Quad9**](https://quad9.net) | [:octicons-link-external-24:](https://quad9.net/privacy/policy) | Cleartext DoH DoT DNSCrypt | Some[^5] | Optional | Based on server choice, malware blocking by default. | Yes [:octicons-link-external-24:](https://quad9.net/news/blog/ios-mobile-provisioning-profiles) | [^1]: AdGuard stores aggregated performance metrics of their DNS servers, namely the number of complete requests to a particular server, the number of blocked requests, and the speed of processing requests. They also keep and store the database of domains requested in within last 24 hours. "We need this information to identify and block new trackers and threats." "We also log how many times this or that tracker has been blocked. We need this information to remove outdated rules from our filters." [https://adguard.com/en/privacy/dns.html](https://adguard.com/en/privacy/dns.html) [^2]: Cloudflare collects and stores only the limited DNS query data that is sent to the 1.1.1.1 resolver. The 1.1.1.1 resolver service does not log personal data, and the bulk of the limited non-personally identifiable query data is stored only for 25 hours. [https://developers.cloudflare.com/1.1.1.1/privacy/public-dns-resolver/](https://developers.cloudflare.com/1.1.1.1/privacy/public-dns-resolver) [^3]: Control D only logs for Premium resolvers with custom DNS profiles. Free resolvers do not log data. [https://controld.com/privacy](https://controld.com/privacy) [^4]: Mullvad's DNS service is available to both subscribers and non-subscribers of Mullvad VPN. Their privacy policy explicitly claims they do not log DNS requests in any way. [https://mullvad.net/en/help/no-logging-data-policy/](https://mullvad.net/en/help/no-logging-data-policy) -[^5]: When used with an account, NextDNS will enable insights and logging features by default (as some features require it). You can choose retention time and log storage location for any logs you choose to keep, or disable logs altogether. If used without an account, no data is logged. [https://nextdns.io/privacy](https://nextdns.io/privacy) -[^6]: Quad9 collects some data for the purposes of threat monitoring and response. That data may then be remixed and shared, such as for the purpose of security research. Quad9 does not collect or record IP addresses or other data they deem personally identifiable. [https://quad9.net/privacy/policy](https://quad9.net/privacy/policy) +[^5]: Quad9 collects some data for the purposes of threat monitoring and response. That data may then be remixed and shared, such as for the purpose of security research. Quad9 does not collect or record IP addresses or other data they deem personally identifiable. [https://quad9.net/privacy/policy](https://quad9.net/privacy/policy) -### Criteria +## Self-Hosted DNS Filtering -**Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. +A self-hosted DNS solution is useful for providing filtering on controlled platforms, such as Smart TVs and other IoT devices, as no client-side software is needed. -
-

This section is new

+### Pi-hole -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. +
+ +![Pi-hole logo](assets/img/dns/pi-hole.svg){ align=right } + +**Pi-hole** is an open-source [DNS-sinkhole](https://en.wikipedia.org/wiki/DNS_sinkhole) which uses [DNS filtering](https://cloudflare.com/learning/access-management/what-is-dns-filtering) to block unwanted web content, such as advertisements. + +Pi-hole is designed to be hosted on a Raspberry Pi, but it is not limited to such hardware. The software features a friendly web interface to view insights and manage blocked content. + +[:octicons-home-16: Homepage](https://pi-hole.net){ .md-button .md-button--primary } +[:octicons-eye-16:](https://pi-hole.net/privacy){ .card-link title="Privacy Policy" } +[:octicons-info-16:](https://docs.pi-hole.net){ .card-link title=Documentation} +[:octicons-code-16:](https://github.com/pi-hole/pi-hole){ .card-link title="Source Code" } +[:octicons-heart-16:](https://pi-hole.net/donate){ .card-link title=Contribute } + +
-- Must support [DNSSEC](advanced/dns-overview.md#what-is-dnssec). -- [QNAME Minimization](advanced/dns-overview.md#what-is-qname-minimization). -- Allow for [ECS](advanced/dns-overview.md#what-is-edns-client-subnet-ecs) to be disabled. -- Prefer [anycast](https://en.wikipedia.org/wiki/Anycast#Addressing_methods) support or geo-steering support. +### AdGuard Home -## Native Operating System Support +
-### Android +![AdGuard Home logo](assets/img/dns/adguard-home.svg){ align=right } -Android 9 and above support DNS over TLS. The settings can be found in: **Settings** → **Network & Internet** → **Private DNS**. +**AdGuard Home** is an open-source [DNS-sinkhole](https://en.wikipedia.org/wiki/DNS_sinkhole) which uses [DNS filtering](https://cloudflare.com/learning/access-management/what-is-dns-filtering) to block unwanted web content, such as advertisements. -### Apple Devices +AdGuard Home features a polished web interface to view insights and manage blocked content. -The latest versions of iOS, iPadOS, tvOS, and macOS, support both DoT and DoH. Both protocols are supported natively via [configuration profiles](https://support.apple.com/guide/security/configuration-profile-enforcement-secf6fb9f053/web) or through the [DNS Settings API](https://developer.apple.com/documentation/networkextension/dns_settings). +[:octicons-home-16: Homepage](https://adguard.com/adguard-home/overview.html){ .md-button .md-button--primary } +[:octicons-eye-16:](https://adguard.com/privacy/home.html){ .card-link title="Privacy Policy" } +[:octicons-info-16:](https://github.com/AdguardTeam/AdGuardHome/wiki){ .card-link title=Documentation} +[:octicons-code-16:](https://github.com/AdguardTeam/AdGuardHome){ .card-link title="Source Code" } -After installation of either a configuration profile or an app that uses the DNS Settings API, the DNS configuration can be selected. If a VPN is active, resolution within the VPN tunnel will use the VPN's DNS settings and not your system-wide settings. - -#### Signed Profiles - -Apple does not provide a native interface for creating encrypted DNS profiles. [Secure DNS profile creator](https://dns.notjakob.com/tool.html) is an unofficial tool for creating your own encrypted DNS profiles, however they will not be signed. Signed profiles are preferred; signing validates a profile's origin and helps to ensure the integrity of the profiles. A green "Verified" label is given to signed configuration profiles. For more information on code signing, see [About Code Signing](https://developer.apple.com/library/archive/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html). **Signed profiles** are offered by [AdGuard](https://adguard.com/en/blog/encrypted-dns-ios-14.html), [NextDNS](https://apple.nextdns.io), and [Quad9](https://quad9.net/news/blog/ios-mobile-provisioning-profiles). - -
-

Info

- -`systemd-resolved`, which many Linux distributions use to do their DNS lookups, doesn't yet [support DoH](https://github.com/systemd/systemd/issues/8639). If you want to use DoH, you'll need to install a proxy like [dnscrypt-proxy](https://github.com/DNSCrypt/dnscrypt-proxy) and [configure it](https://wiki.archlinux.org/title/Dnscrypt-proxy) to take all the DNS queries from your system resolver and forward them over HTTPS. +
+## Cloud-Based DNS Filtering + +These DNS filtering solutions offer a web dashboard where you can customize the blocklists to your exact needs, similarly to a Pi-hole. These services are usually easier to set up and configure than self-hosted services like the ones above, and can be used more easily across multiple networks (self-hosted solutions are typically restricted to your home/local network unless you set up a more advanced configuration). + +### Control D + +
+ +![Control D logo](assets/img/dns/control-d.svg){ align=right } + +**Control D** is a customizable DNS service which lets you block security threats, unwanted content, and advertisements on a DNS level. In addition to their paid plans, they offer a number of preconfigured DNS resolvers you can use for free. + +[:octicons-home-16: Homepage](https://controld.com){ .md-button .md-button--primary } +[:octicons-eye-16:](https://controld.com/privacy){ .card-link title="Privacy Policy" } +[:octicons-info-16:](https://docs.controld.com/docs/getting-started){ .card-link title=Documentation} +[:octicons-code-16:](https://github.com/Control-D-Inc/ctrld){ .card-link title="Source Code" } + +
+Downloads + +- [:simple-windows11: Windows](https://docs.controld.com/docs/gui-setup-utility) +- [:simple-apple: macOS](https://docs.controld.com/docs/gui-setup-utility) +- [:simple-linux: Linux](https://docs.controld.com/docs/ctrld) +- [:simple-googleplay: Google Play](https://play.google.com/store/apps/details?id=com.controld.setuputility) +- [:simple-appstore: App Store](https://apps.apple.com/app/1518799460) +- [:simple-github: GitHub](https://github.com/Control-D-Inc/ctrld/releases/tag/v1.3.5) + +
+ +
+ +### NextDNS + +
+ +![NextDNS logo](assets/img/dns/nextdns.svg){ align=right } + +**NextDNS** is a customizable DNS service which lets you block security threats, unwanted content, and advertisements on a DNS level. They offer a fully functional free plan for limited use. + +[:octicons-home-16: Homepage](https://nextdns.io){ .md-button .md-button--primary } +[:octicons-eye-16:](https://nextdns.io/privacy){ .card-link title="Privacy Policy" } +[:octicons-info-16:](https://help.nextdns.io){ .card-link title=Documentation} +[:octicons-code-16:](https://github.com/nextdns/nextdns){ .card-link title="Source Code" } + +
+Downloads + +- [:simple-windows11: Windows](https://github.com/nextdns/nextdns/wiki/Windows) +- [:simple-apple: macOS](https://apps.apple.com/us/app/nextdns/id1464122853) +- [:simple-linux: Linux](https://github.com/nextdns/nextdns/wiki) +- [:simple-appstore: App Store](https://apps.apple.com/app/nextdns/id1463342498) +- [:simple-github: GitHub](https://github.com/nextdns/nextdns/releases) + +
+ +
+ +When used with an account, NextDNS will enable insights and logging features by default (as some features require it). You can choose retention time and log storage location for any logs you choose to keep, or disable logs altogether. + +NextDNS's free plan is fully functional, but should not be relied upon for security or other critical filtering applications, because after 300,000 DNS queries in a month all filtering, logging, and other account-based functionality is disabled. It can still be used as a regular DNS provider after that point, so your devices will continue to function and make secure queries via DNS-over-HTTPS, just without your filter lists. + +NextDNS also offers public DNS-over-HTTPS service at `https://dns.nextdns.io` and DNS-over-TLS/QUIC at `dns.nextdns.io`, which are available by default in Firefox and Chromium, and subject to their default no-logging [privacy policy](https://nextdns.io/privacy). + ## Encrypted DNS Proxies -Encrypted DNS proxy software provides a local proxy for the [unencrypted DNS](advanced/dns-overview.md#unencrypted-dns) resolver to forward to. Typically it is used on platforms that don't natively support [encrypted DNS](advanced/dns-overview.md#what-is-encrypted-dns). +Encrypted DNS proxy software provides a local proxy for the [unencrypted DNS](advanced/dns-overview.md#unencrypted-dns) resolver to forward to. Typically, it is used on platforms that don't natively support [encrypted DNS](advanced/dns-overview.md#what-is-encrypted-dns). ### RethinkDNS @@ -124,45 +192,13 @@ Encrypted DNS proxy software provides a local proxy for the [unencrypted DNS](ad
-## Self-hosted Solutions +## Criteria -A self-hosted DNS solution is useful for providing filtering on controlled platforms, such as Smart TVs and other IoT devices, as no client-side software is needed. +**Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -### AdGuard Home +### Minimum Requirements -
- -![AdGuard Home logo](assets/img/dns/adguard-home.svg){ align=right } - -**AdGuard Home** is an open-source [DNS-sinkhole](https://en.wikipedia.org/wiki/DNS_sinkhole) which uses [DNS filtering](https://cloudflare.com/learning/access-management/what-is-dns-filtering) to block unwanted web content, such as advertisements. - -AdGuard Home features a polished web interface to view insights and manage blocked content. - -[:octicons-home-16: Homepage](https://adguard.com/adguard-home/overview.html){ .md-button .md-button--primary } -[:octicons-eye-16:](https://adguard.com/privacy/home.html){ .card-link title="Privacy Policy" } -[:octicons-info-16:](https://github.com/AdguardTeam/AdGuardHome/wiki){ .card-link title=Documentation} -[:octicons-code-16:](https://github.com/AdguardTeam/AdGuardHome){ .card-link title="Source Code" } - - - -
- -### Pi-hole - -
- -![Pi-hole logo](assets/img/dns/pi-hole.svg){ align=right } - -**Pi-hole** is an open-source [DNS-sinkhole](https://en.wikipedia.org/wiki/DNS_sinkhole) which uses [DNS filtering](https://cloudflare.com/learning/access-management/what-is-dns-filtering) to block unwanted web content, such as advertisements. - -Pi-hole is designed to be hosted on a Raspberry Pi, but it is not limited to such hardware. The software features a friendly web interface to view insights and manage blocked content. - -[:octicons-home-16: Homepage](https://pi-hole.net){ .md-button .md-button--primary } -[:octicons-eye-16:](https://pi-hole.net/privacy){ .card-link title="Privacy Policy" } -[:octicons-info-16:](https://docs.pi-hole.net){ .card-link title=Documentation} -[:octicons-code-16:](https://github.com/pi-hole/pi-hole){ .card-link title="Source Code" } -[:octicons-heart-16:](https://pi-hole.net/donate){ .card-link title=Contribute } - - - -
+- [DNSSEC](advanced/dns-overview.md#what-is-dnssec). +- [QNAME Minimization](advanced/dns-overview.md#what-is-qname-minimization). +- Anonymize [ECS](advanced/dns-overview.md#what-is-edns-client-subnet-ecs) or disable it by default. +- Prefer [anycast](https://en.wikipedia.org/wiki/Anycast#Addressing_methods) support or geo-steering support. diff --git a/docs/email-clients.md b/docs/email-clients.md index c05819af..8c169ecb 100644 --- a/docs/email-clients.md +++ b/docs/email-clients.md @@ -272,13 +272,6 @@ NeoMutt is a text-based client that has a steep learning curve. It is however, v **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Qualifications - Apps developed for open-source operating systems must be open source. diff --git a/docs/encryption.md b/docs/encryption.md index bd463707..ea7b6597 100644 --- a/docs/encryption.md +++ b/docs/encryption.md @@ -388,13 +388,6 @@ We recommend taking a look at their [First steps](https://gpgtools.tenderapp.com **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Qualifications - Cross-platform encryption apps must be open source. diff --git a/docs/file-sharing.md b/docs/file-sharing.md index c833d73b..3ec0847d 100644 --- a/docs/file-sharing.md +++ b/docs/file-sharing.md @@ -60,13 +60,6 @@ ffsend upload --host https://send.vis.ee/ FILE **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Must not store decrypted data on a remote server. - Must be open-source software. - Must either have clients for Linux, macOS, and Windows; or have a web interface. @@ -155,13 +148,6 @@ We don't recommend using the [E2EE App](https://apps.nextcloud.com/apps/end_to_e **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- #### Minimum Requirements - Must not require a third-party remote/cloud server. diff --git a/docs/financial-services.md b/docs/financial-services.md index da4edf06..e05b5009 100644 --- a/docs/financial-services.md +++ b/docs/financial-services.md @@ -61,13 +61,6 @@ MySudo's virtual cards are currently only available via their iOS app. **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Allows the creation of multiple cards which function as a shield between the merchant and your personal finances. - Cards must not require you to provide accurate billing address information to the merchant. @@ -95,12 +88,5 @@ These services allow you to purchase gift cards for a variety of merchants onlin **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Accepts payment in [a recommended cryptocurrency](cryptocurrency.md). - No ID requirement. diff --git a/docs/frontends.md b/docs/frontends.md index 1769b24a..8950f22a 100644 --- a/docs/frontends.md +++ b/docs/frontends.md @@ -245,13 +245,6 @@ Piped is useful if you want to use [SponsorBlock](https://sponsor.ajay.app) with **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- Recommended frontends... - Must be open-source software. diff --git a/docs/mobile-browsers.md b/docs/mobile-browsers.md index 98b3095d..4e4eb4bd 100644 --- a/docs/mobile-browsers.md +++ b/docs/mobile-browsers.md @@ -238,13 +238,6 @@ Additional filter lists do slow things down and may increase your attack surface **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Requirements - Must support automatic updates. diff --git a/docs/multi-factor-authentication.md b/docs/multi-factor-authentication.md index 28d2ede4..40462456 100644 --- a/docs/multi-factor-authentication.md +++ b/docs/multi-factor-authentication.md @@ -81,13 +81,6 @@ Nitrokey's firmware is open source, unlike the YubiKey. The firmware on modern N **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- #### Minimum Requirements - Must use high quality, tamper resistant hardware security modules. @@ -116,7 +109,7 @@ We highly recommend that you use mobile TOTP apps instead of desktop alternative ![ente Auth logo](assets/img/multi-factor-authentication/ente-auth.png){ align=right } -**ente Auth** is a free and open-source app which stores and generates TOTP tokens on your mobile device. It can be used with an online account to backup and sync your tokens across your devices (and access them via a web interface) in a secure, end-to-end encrypted fashion. It can also be used offline on a single device with no account necessary. +**ente Auth** is a free and open-source app which stores and generates TOTP tokens. It can be used with an online account to backup and sync your tokens across your devices (and access them via a web interface) in a secure, end-to-end encrypted fashion. It can also be used offline on a single device with no account necessary. [:octicons-home-16: Homepage](https://ente.io/auth){ .md-button .md-button--primary } [:octicons-eye-16:](https://ente.io/privacy){ .card-link title="Privacy Policy" } @@ -127,7 +120,7 @@ We highly recommend that you use mobile TOTP apps instead of desktop alternative - [:simple-googleplay: Google Play](https://play.google.com/store/apps/details?id=io.ente.auth) - [:simple-appstore: App Store](https://apps.apple.com/app/id6444121398) -- [:simple-github: GitHub](https://github.com/ente-io/ente/releases) +- [:simple-github: GitHub](https://github.com/ente-io/ente/releases?q=auth) - [:octicons-globe-16: Web](https://auth.ente.io) @@ -162,13 +155,6 @@ We highly recommend that you use mobile TOTP apps instead of desktop alternative **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Source code must be publicly available. - Must not require internet connectivity. - Must not sync to a third-party cloud sync/backup service. diff --git a/docs/news-aggregators.md b/docs/news-aggregators.md index 00b22c26..25ffa3cb 100644 --- a/docs/news-aggregators.md +++ b/docs/news-aggregators.md @@ -154,13 +154,6 @@ A [news aggregator](https://en.wikipedia.org/wiki/News_aggregator) is a way to k **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Must be open-source software. - Must operate locally, i.e. must not be a cloud service. diff --git a/docs/notebooks.md b/docs/notebooks.md index 570d1392..06121cc5 100644 --- a/docs/notebooks.md +++ b/docs/notebooks.md @@ -153,13 +153,6 @@ Cryptee offers 100MB of storage for free, with paid options if you need more. Si **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Clients must be open source. - Any cloud sync functionality must be E2EE. - Must support exporting documents into a standard format. diff --git a/docs/passwords.md b/docs/passwords.md index dcf64def..279e26e4 100644 --- a/docs/passwords.md +++ b/docs/passwords.md @@ -240,13 +240,6 @@ Psono provides extensive documentation for their product. The web-client for Pso **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- #### Minimum Requirements - Must utilize strong, standards-based/modern E2EE. @@ -377,11 +370,4 @@ These products are minimal password managers that can be used within scripting a **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Must be cross-platform. diff --git a/docs/photo-management.md b/docs/photo-management.md index a3affcc6..44f3e6d0 100644 --- a/docs/photo-management.md +++ b/docs/photo-management.md @@ -88,13 +88,6 @@ Most cloud photo management solutions like Google Photos, Flickr, and Amazon Pho **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Requirements - Cloud-hosted providers must enforce end-to-end encryption. diff --git a/docs/productivity.md b/docs/productivity.md index 65dcc214..55a01519 100644 --- a/docs/productivity.md +++ b/docs/productivity.md @@ -65,13 +65,6 @@ We don't recommend using the [E2EE App](https://apps.nextcloud.com/apps/end_to_e **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- In general, we define collaboration platforms as full-fledged suites which could reasonably act as a replacement to collaboration platforms like Google Drive. - Open source. @@ -149,13 +142,6 @@ Our best-case criteria represents what we would like to see from the perfect pro **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- In general, we define office suites as applications which could reasonably act as a replacement for Microsoft Word for most needs. - Must be cross-platform. @@ -187,13 +173,6 @@ In general, we define office suites as applications which could reasonably act a **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- #### Minimum Requirements - Must be open source. diff --git a/docs/real-time-communication.md b/docs/real-time-communication.md index 6a1f7de0..6e9e547d 100644 --- a/docs/real-time-communication.md +++ b/docs/real-time-communication.md @@ -214,13 +214,6 @@ Session has a [whitepaper](https://arxiv.org/pdf/2002.04609.pdf) describing the **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Has open-source clients. - Does not require sharing personal identifiers (phone numbers or emails in particular) with contacts. - Uses E2EE for private messages by default. diff --git a/docs/router.md b/docs/router.md index 7cfbfa66..b780d7d4 100644 --- a/docs/router.md +++ b/docs/router.md @@ -49,13 +49,6 @@ OPNsense was originally developed as a fork of [pfSense](https://en.wikipedia.or **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- - Must be open source. - Must receive regular updates. - Must support a wide variety of hardware. diff --git a/docs/search-engines.md b/docs/search-engines.md index 755fc1d4..36807b9f 100644 --- a/docs/search-engines.md +++ b/docs/search-engines.md @@ -111,13 +111,6 @@ Startpage's majority shareholder is System1 who is an adtech company. We don't b **Please note we are not affiliated with any of the projects we recommend.** In addition to [our standard criteria](about/criteria.md), we have developed a clear set of requirements to allow us to provide objective recommendations. We suggest you familiarize yourself with this list before choosing to use a project, and conduct your own research to ensure it's the right choice for you. -
-

This section is new

- -We are working on establishing defined criteria for every section of our site, and this may be subject to change. If you have any questions about our criteria, please [ask on our forum](https://discuss.privacyguides.net/latest) and don't assume we didn't consider something when making our recommendations if it is not listed here. There are many factors considered and discussed when we recommend a project, and documenting every single one is a work-in-progress. - -
- ### Minimum Requirements - Must not collect personally identifiable information per their privacy policy. diff --git a/includes/strings.en.env b/includes/strings.en.env new file mode 100644 index 00000000..bfdeb8d7 --- /dev/null +++ b/includes/strings.en.env @@ -0,0 +1,41 @@ +LANG="English" +LANG_ENGLISH="English" +SITE_NAME="Privacy Guides" +SITE_DESCRIPTION="Privacy Guides is your central privacy and security resource to protect yourself online." +FOOTER_COPYRIGHT_INTRO="Privacy Guides is a non-profit, socially motivated website that provides information for protecting your data security and privacy." +FOOTER_COPYRIGHT_AFFILIATE="We do not make money from recommending certain products, and we do not use affiliate links." +FOOTER_COPYRIGHT_DATE="2019 - 2024 Privacy Guides and contributors." +FOOTER_COPYRIGHT_ICON='' +FOOTER_COPYRIGHT_LICENSE="Content license:" +FOOTER_COPYRIGHT="$FOOTER_COPYRIGHT_INTRO
$FOOTER_COPYRIGHT_AFFILIATE
© $FOOTER_COPYRIGHT_DATE $FOOTER_COPYRIGHT_ICON $FOOTER_COPYRIGHT_LICENSE CC BY-ND 4.0." +THEME_LIGHT="Switch to light mode" +THEME_DARK="Switch to dark mode" +THEME_AUTO="Switch to system theme" +DESCRIPTION_HOMEPAGE="A socially motivated website which provides information about protecting your online data privacy and security." +DESCRIPTION_TRANSLATION="You're viewing the $LANG copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out!" +DESCRIPTION_TRANSLATION_CTA="Visit Crowdin" +SOCIAL_MASTODON="Mastodon" +SOCIAL_MATRIX="Matrix" +SOCIAL_FORUM="Forum" +SOCIAL_GITHUB="GitHub" +SOCIAL_TOR_SITE="Hidden service" +NAV_HOME="Home" +NAV_KNOWLEDGE_BASE="Knowledge Base" +NAV_TECHNOLOGY_ESSENTIALS="Technology Essentials" +NAV_OPERATING_SYSTEMS="Operating Systems" +NAV_ADVANCED_TOPICS="Advanced Topics" +NAV_RECOMMENDATIONS="Recommendations" +NAV_INTERNET_BROWSING="Internet Browsing" +NAV_PROVIDERS="Providers" +NAV_SOFTWARE="Software" +NAV_ADVANCED="Advanced" +NAV_ABOUT="About" +NAV_COMMUNITY="Community" +NAV_ONLINE_SERVICES="Online Services" +NAV_CODE_OF_CONDUCT="Code of Conduct" +NAV_CONTRIBUTING="Contributing" +NAV_WRITING_GUIDE="Writing Guide" +NAV_TECHNICAL_GUIDES="Technical Guides" +NAV_CHANGELOG="Changelog" +NAV_FORUM="Forum" +NAV_BLOG="Blog" diff --git a/includes/strings.en.yml b/includes/strings.en.yml deleted file mode 100644 index 6bca4f9d..00000000 --- a/includes/strings.en.yml +++ /dev/null @@ -1,52 +0,0 @@ -# The strings in these files need to be copied MANUALLY to /config/mkdocs.LANG.yml -# This file exists just so these strings can be originally translated on Crowdin. -config: - description: Privacy Guides is your central privacy and security resource to protect yourself online. - copyright: - - 1: | - Privacy Guides is a non-profit, socially motivated website that provides information for protecting your data security and privacy. - - 2: | - We do not make money from recommending certain products, and we do not use affiliate links. - - 3: | - Privacy Guides and contributors. - - 4: | - Content licensed under CC BY-ND 4.0. - feedback: - question: Was this page helpful? - yes: This page was helpful - yes-note: Thanks for your feedback! - no: This page could be improved - no-note: | - Thanks for your feedback! Help us improve this page by opening a discussion on our forum. - theme: - dark: Switch to dark mode - light: Switch to light mode - system: Switch to system theme - -nav: - Home: Home - Knowledge Base: Knowledge Base - Technology Essentials: Technology Essentials - Operating Systems: Operating Systems - Advanced Topics: Advanced Topics - Recommendations: Recommendations - Internet Browsing: Internet Browsing - Providers: Providers - Software: Software - Advanced: Advanced - About: About - Community: Community - Online Services: Online Services - Code of Conduct: Code of Conduct - Contributing: Contributing - Writing Guide: Writing Guide - Technical Guides: Technical Guides - Changelog: Changelog - Forum: Forum - Blog: Blog - -site: - homepage_card: | - A socially motivated website which provides information about protecting your online data privacy and security. - translation: | - You're viewing the English copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide. diff --git a/netlify.toml b/netlify.toml index 553cd18e..2df26ed0 100644 --- a/netlify.toml +++ b/netlify.toml @@ -92,13 +92,13 @@ package = "@netlify/plugin-lighthouse" [[plugins.inputs.audits]] - path = "en/index.html" + path = "en" [[plugins.inputs.audits]] - path = "en/tools/index.html" + path = "en/tools" [[plugins.inputs.audits]] - path = "en/basics/why-privacy-matters/index.html" + path = "en/basics/why-privacy-matters" [[plugins.inputs.audits]] - path = "en/vpn/index.html" + path = "en/vpn" diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7f3cabc6..00000000 --- a/package-lock.json +++ /dev/null @@ -1,2499 +0,0 @@ -{ - "name": "privacyguides.org", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "devDependencies": { - "@netlify/plugin-lighthouse": "^5.0.0" - }, - "engines": { - "node": ">=18.0.0 <19.0.0" - } - }, - "node_modules/@netlify/plugin-lighthouse": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@netlify/plugin-lighthouse/-/plugin-lighthouse-5.0.0.tgz", - "integrity": "sha512-tCaoVYxCU3OB592vChtFkANzUL4kDUNaIk9VCGp3qBecBnH+yFrILUlcqy2d08Is4ecstjTacyHqV+ixKbNYGQ==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "chrome-launcher": "^0.15.0", - "compression": "^1.7.4", - "dotenv": "^16.0.0", - "express": "^4.17.1", - "html-minifier": "^4.0.0", - "lighthouse": "^9.6.3", - "puppeteer": "^18.0.0" - }, - "engines": { - "node": ">=14.15 <20" - } - }, - "node_modules/@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", - "dev": true, - "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", - "dev": true, - "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", - "dev": true, - "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", - "dev": true, - "dependencies": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "dev": true, - "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@types/node": { - "version": "20.8.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.4.tgz", - "integrity": "sha512-ZVPnqU58giiCjSxjVUESDtdPk4QR5WQhhINbc9UBrKLU68MX5BF6kbQzTrkwbolyr0X8ChBpXfavr5mZFKZQ5A==", - "dev": true, - "dependencies": { - "undici-types": "~5.25.1" - } - }, - "node_modules/@types/yauzl": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.1.tgz", - "integrity": "sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==", - "dev": true, - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, - "node_modules/axe-core": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz", - "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", - "dev": true, - "dependencies": { - "@types/node": "*", - "escape-string-regexp": "^4.0.0", - "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" - }, - "bin": { - "print-chrome-path": "bin/print-chrome-path.js" - }, - "engines": { - "node": ">=12.13.0" - } - }, - "node_modules/clean-css": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", - "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true - }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/csp_evaluator": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", - "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==", - "dev": true - }, - "node_modules/cssom": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", - "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", - "dev": true - }, - "node_modules/cssstyle": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.1.tgz", - "integrity": "sha512-7DYm8qe+gPx/h77QlCyFmX80+fGaE/6A/Ekl0zaszYOubvySO2saYFdQ78P29D0UsULxFKCetDGNaNRUdSF+2A==", - "dev": true, - "dependencies": { - "cssom": "0.3.x" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true - }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", - "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/enquirer": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", - "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extract-zip/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/extract-zip/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dev": true, - "dependencies": { - "pend": "~1.2.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", - "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "dev": true, - "dependencies": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-link-header": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-0.8.0.tgz", - "integrity": "sha512-qsh/wKe1Mk1vtYEFr+LpQBFWTO1gxZQBdii2D0Umj+IUQ23r5sT088Rhpq4XzpSyIpaX7vwjB8Rrtx8u9JTg+Q==", - "dev": true - }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/image-ssim": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", - "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", - "dev": true - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/intl-messageformat": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", - "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", - "dev": true, - "dependencies": { - "intl-messageformat-parser": "^1.8.1" - } - }, - "node_modules/intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", - "dev": true - }, - "node_modules/js-library-detector": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", - "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/lighthouse": { - "version": "9.6.8", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-9.6.8.tgz", - "integrity": "sha512-5aRSvnqazci8D2oE7GJM6C7IStvUuMVV+74cGyBuS4n4NCixsDd6+uJdX834XiInSfo+OuVbAJCX4Xu6d2+N9Q==", - "dev": true, - "dependencies": { - "@sentry/node": "^6.17.4", - "axe-core": "4.4.1", - "chrome-launcher": "^0.15.0", - "configstore": "^5.0.1", - "csp_evaluator": "1.1.1", - "cssstyle": "1.2.1", - "enquirer": "^2.3.6", - "http-link-header": "^0.8.0", - "intl-messageformat": "^4.4.0", - "jpeg-js": "^0.4.3", - "js-library-detector": "^6.5.0", - "lighthouse-logger": "^1.3.0", - "lighthouse-stack-packs": "1.8.2", - "lodash": "^4.17.21", - "lookup-closest-locale": "6.2.0", - "metaviewport-parser": "0.2.0", - "open": "^8.4.0", - "parse-cache-control": "1.0.1", - "ps-list": "^8.0.0", - "puppeteer-core": "^13.7.0", - "robots-parser": "^3.0.0", - "semver": "^5.3.0", - "speedline-core": "^1.4.3", - "third-party-web": "^0.17.1", - "ws": "^7.0.0", - "yargs": "^17.3.1", - "yargs-parser": "^21.0.0" - }, - "bin": { - "chrome-debug": "lighthouse-core/scripts/manual-chrome-launcher.js", - "lighthouse": "lighthouse-cli/index.js", - "smokehouse": "lighthouse-cli/test/smokehouse/frontends/smokehouse-bin.js" - }, - "engines": { - "node": ">=14.15" - } - }, - "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", - "dev": true, - "dependencies": { - "debug": "^2.6.9", - "marky": "^1.2.2" - } - }, - "node_modules/lighthouse-stack-packs": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.8.2.tgz", - "integrity": "sha512-vlCUxxQAB8Nu6LQHqPpDRiMi06Du593/my/6JbMttQeEfJ7pf4OS8obSTh5xSOS80U/O7fq59Q8rQGAUxQatUQ==", - "dev": true - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lookup-closest-locale": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", - "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", - "dev": true - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==", - "dev": true - }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, - "node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/marky": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", - "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true - }, - "node_modules/metaviewport-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.2.0.tgz", - "integrity": "sha512-qL5NtY18LGs7lvZCkj3ep2H4Pes9rIiSLZRUyfDdvVw7pWFA0eLwmqaIxApD74RGvUrNEtk9e5Wt1rT+VlCvGw==", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parse-cache-control": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", - "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", - "dev": true - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true - }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/puppeteer": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-18.2.1.tgz", - "integrity": "sha512-7+UhmYa7wxPh2oMRwA++k8UGVDxh3YdWFB52r9C3tM81T6BU7cuusUSxImz0GEYSOYUKk/YzIhkQ6+vc0gHbxQ==", - "deprecated": "< 19.4.0 is no longer supported", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "https-proxy-agent": "5.0.1", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "puppeteer-core": "18.2.1" - }, - "engines": { - "node": ">=14.1.0" - } - }, - "node_modules/puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", - "dev": true, - "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer-core/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/puppeteer/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/puppeteer/node_modules/devtools-protocol": { - "version": "0.0.1045489", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1045489.tgz", - "integrity": "sha512-D+PTmWulkuQW4D1NTiCRCFxF7pQPn0hgp4YyX4wAQ6xYXKOadSWPR3ENGDQ47MW/Ewc9v2rpC/UEEGahgBYpSQ==", - "dev": true - }, - "node_modules/puppeteer/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/puppeteer/node_modules/puppeteer-core": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-18.2.1.tgz", - "integrity": "sha512-MRtTAZfQTluz3U2oU/X2VqVWPcR1+94nbA2V6ZrSZRVEwLqZ8eclZ551qGFQD/vD2PYqHJwWOW/fpC721uznVw==", - "dev": true, - "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.1045489", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.9.0" - }, - "engines": { - "node": ">=14.1.0" - } - }, - "node_modules/puppeteer/node_modules/ws": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.9.0.tgz", - "integrity": "sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/robots-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", - "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/speedline-core": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", - "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", - "dev": true, - "dependencies": { - "@types/node": "*", - "image-ssim": "^0.2.0", - "jpeg-js": "^0.4.1" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "dev": true, - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/third-party-web": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.17.1.tgz", - "integrity": "sha512-X9Mha8cVeBwakunlZXkXL6xRzw8VCcDGWqT59EzeTYAJIi8ien3CuufnEGEx4ZUFahumNQdoOwf4H2T9Ca6lBg==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", - "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", - "dev": true, - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", - "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dev": true, - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, - "node_modules/undici-types": { - "version": "5.25.3", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", - "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", - "dev": true - }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==", - "dev": true - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", - "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", - "dev": true, - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dev": true, - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index f7b24b1f..00000000 --- a/package.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "devDependencies": { - "@netlify/plugin-lighthouse": "^5.0.0" - }, - "engines": { - "node" : ">=18.0.0 <19.0.0" - } -} diff --git a/theme/assets/brand b/theme/assets/brand index 67166ed8..872a38c6 160000 --- a/theme/assets/brand +++ b/theme/assets/brand @@ -1 +1 @@ -Subproject commit 67166ed8b641d8ac1837d0b75329e02ed4056704 +Subproject commit 872a38c628780050bb3217a8c7fea9922b059717 diff --git a/theme/assets/img/dns/control-d.svg b/theme/assets/img/dns/control-d.svg new file mode 100644 index 00000000..d038b121 --- /dev/null +++ b/theme/assets/img/dns/control-d.svg @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + diff --git a/theme/assets/img/dns/nextdns.svg b/theme/assets/img/dns/nextdns.svg new file mode 100644 index 00000000..6fcbc9eb --- /dev/null +++ b/theme/assets/img/dns/nextdns.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/theme/main.html b/theme/main.html index 9eb5ccd7..44efff1a 100644 --- a/theme/main.html +++ b/theme/main.html @@ -121,39 +121,10 @@

Share this website and spread privacy knowledge

Copy this text to easily share Privacy Guides with your friends and family on any social network!

- {% elif config.theme.language == "es" %} + {% elif config.extra.translation_notice %}
-

Está viendo la copia en español de Privacy Guides, traducidas por nuestro fantástico equipo lingüístico en Crowdin. Si nota un error o ve alguna sección sin traducir en esta página, ¡considere ayudar! Para obtener más información y consejos, consulte nuestra guía de traducción.

-

You're viewing the Spanish copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

-
- {% elif config.theme.language == "fr" %} -
-

Vous êtes en train de consulter la copie française de Privacy Guides, traduite par notre fantastique équipe de traducteurs sur Crowdin. Si vous remarquez une erreur, ou si vous voyez des sections non traduites sur cette page, n'hésitez pas à nous aider! Pour plus d'informations et de conseils, consultez notre guide de traduction.

-

You're viewing the French copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

-
- {% elif config.theme.language == "he" %} -
-

אתה צופה בעותק העברי של Privacy Guides, שתורגם על ידי צוות השפה הפנטסטי שלנו ב-Crowdin. אם אתה מבחין בשגיאה, או רואה קטעים לא מתורגמים בדף זה, אנא שקול לעזור! למידע נוסף וטיפים עיין במדריך התרגום שלנו.

-

You're viewing the Hebrew copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

-
- {% elif config.theme.language == "it" %} -
-

Stai visualizzando la versione italiana di Privacy Guides, tradotta dal nostro fantastico team linguistico su Crowdin. Se noti un errore o vedi sezioni non tradotte in questa pagina, ti invitiamo a dare una mano! Per ulteriori informazioni e consigli consulta la nostra guida alla traduzione.

-

You're viewing the Italian copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

-
- {% elif config.theme.language == "nl" %} -
-

Je bekijkt de Nederlandse versie van Privacy Guides, vertaald door ons fantastische taalteam op Crowdin. Als u een fout opmerkt of onvertaalde gedeelten op deze pagina ziet, overweeg dan om te helpen! Voor meer informatie en tips zie onze vertaalgids.

-

You're viewing the Dutch copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

-
- {% elif config.theme.language == "zh-Hant" %} -
-

您正在查看由我們在Crowdin上出色的語言團隊翻譯的《隱私指南》英文版。如果您發現錯誤,或在此頁面上看到任何未翻譯的部分,請考慮提供幫助!有關更多信息和提示,請參閱我們的翻譯指南.

-

You're viewing the Chinese (Traditional) copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

- {% elif config.theme.language == "ru" %} -
-

Вы просматриваете русскую копию Privacy Guides, переведённую нашей невероятной командой переводчиков на Crowdin. Если вы нашли ошибку или непереведённые разделы на этой странице, пожалуйста, помогите нам! Для получения дополнительной информации и советов см. наше руководство по переводу.

-

You're viewing the Russian copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out! For more information and tips see our translation guide.

+

{{ config.extra.translation_notice }} {{ config.extra.translation_notice_cta }}

+

You're viewing the {{ config.extra.translation_notice_language }} copy of Privacy Guides, translated by our fantastic language team on Crowdin. If you notice an error, or see any untranslated sections on this page, please consider helping out!

{% endif %}