From d5dbc924740d63ee1efb19b563a7d70759ae8c42 Mon Sep 17 00:00:00 2001 From: Mick Grove Date: Sun, 5 Apr 2026 10:38:20 -0700 Subject: [PATCH] fixed failing windows test setup --- .github/workflows/docs.yml | 62 + Makefile | 30 +- docs-site/docs/assets/icons/aws-s3.svg | 34 + docs-site/docs/assets/icons/azure-devops.svg | 2 + docs-site/docs/assets/icons/bitbucket.svg | 15 + docs-site/docs/assets/icons/confluence.svg | 1 + docs-site/docs/assets/icons/docker.svg | 1 + docs-site/docs/assets/icons/files.svg | 67 + docs-site/docs/assets/icons/gcs.svg | 38 + docs-site/docs/assets/icons/gitea.svg | 1 + docs-site/docs/assets/icons/github.svg | 3 + docs-site/docs/assets/icons/gitlab.svg | 1 + docs-site/docs/assets/icons/huggingface.svg | 41 + docs-site/docs/assets/icons/jira.svg | 1 + docs-site/docs/assets/icons/local-git.svg | 1 + docs-site/docs/assets/icons/slack.svg | 6 + docs-site/docs/assets/icons/teams.svg | 11 + .../docs/assets/images/kingfisher_logo.png | Bin 0 -> 220572 bytes .../docs/assets/images/runtime-comparison.png | Bin 0 -> 56693 bytes .../docs/assets/javascripts/rules-filter.js | 38 + docs-site/docs/assets/stylesheets/extra.css | 265 + docs-site/docs/changelog.md | 562 ++ docs-site/docs/features/access-map.md | 450 ++ docs-site/docs/features/agents.md | 121 + docs-site/docs/features/fingerprints.md | 79 + docs-site/docs/features/parsing.md | 47 + docs-site/docs/features/revocation.md | 47 + .../docs/getting-started/installation.md | 436 ++ docs-site/docs/getting-started/quick-start.md | 103 + docs-site/docs/index.md | 10 + docs-site/docs/reference/architecture.md | 130 + docs-site/docs/reference/comparison.md | 64 + docs-site/docs/reference/library.md | 873 +++ docs-site/docs/reference/python-bindings.md | 96 + docs-site/docs/robots.txt | 4 + docs-site/docs/rules/builtin-rules.md | 5094 +++++++++++++ docs-site/docs/rules/overview.md | 923 +++ docs-site/docs/usage/advanced.md | 453 ++ docs-site/docs/usage/baseline.md | 59 + docs-site/docs/usage/basic-scanning.md | 1137 +++ docs-site/docs/usage/deployment.md | 107 + docs-site/docs/usage/integrations.md | 649 ++ docs-site/mkdocs.yml | 109 + docs-site/requirements.txt | 5 + docs-site/scripts/generate-rules-page.py | 134 + docs-site/scripts/prepare-docs.py | 227 + docs-site/site/assets/icons/aws-s3.svg | 34 + docs-site/site/assets/icons/azure-devops.svg | 2 + docs-site/site/assets/icons/bitbucket.svg | 15 + docs-site/site/assets/icons/confluence.svg | 1 + docs-site/site/assets/icons/docker.svg | 1 + docs-site/site/assets/icons/files.svg | 67 + docs-site/site/assets/icons/gcs.svg | 38 + docs-site/site/assets/icons/gitea.svg | 1 + docs-site/site/assets/icons/github.svg | 3 + docs-site/site/assets/icons/gitlab.svg | 1 + docs-site/site/assets/icons/huggingface.svg | 41 + docs-site/site/assets/icons/jira.svg | 1 + docs-site/site/assets/icons/local-git.svg | 1 + docs-site/site/assets/icons/slack.svg | 6 + docs-site/site/assets/icons/teams.svg | 11 + docs-site/site/assets/images/favicon.png | Bin 0 -> 1870 bytes .../site/assets/images/kingfisher_logo.png | Bin 0 -> 220572 bytes .../site/assets/images/runtime-comparison.png | Bin 0 -> 56693 bytes .../assets/javascripts/bundle.79ae519e.min.js | 16 + .../javascripts/bundle.79ae519e.min.js.map | 7 + .../javascripts/lunr/min/lunr.ar.min.js | 1 + .../javascripts/lunr/min/lunr.da.min.js | 18 + .../javascripts/lunr/min/lunr.de.min.js | 18 + .../javascripts/lunr/min/lunr.du.min.js | 18 + .../javascripts/lunr/min/lunr.el.min.js | 1 + .../javascripts/lunr/min/lunr.es.min.js | 18 + .../javascripts/lunr/min/lunr.fi.min.js | 18 + .../javascripts/lunr/min/lunr.fr.min.js | 18 + .../javascripts/lunr/min/lunr.he.min.js | 1 + .../javascripts/lunr/min/lunr.hi.min.js | 1 + .../javascripts/lunr/min/lunr.hu.min.js | 18 + .../javascripts/lunr/min/lunr.hy.min.js | 1 + .../javascripts/lunr/min/lunr.it.min.js | 18 + .../javascripts/lunr/min/lunr.ja.min.js | 1 + .../javascripts/lunr/min/lunr.jp.min.js | 1 + .../javascripts/lunr/min/lunr.kn.min.js | 1 + .../javascripts/lunr/min/lunr.ko.min.js | 1 + .../javascripts/lunr/min/lunr.multi.min.js | 1 + .../javascripts/lunr/min/lunr.nl.min.js | 18 + .../javascripts/lunr/min/lunr.no.min.js | 18 + .../javascripts/lunr/min/lunr.pt.min.js | 18 + .../javascripts/lunr/min/lunr.ro.min.js | 18 + .../javascripts/lunr/min/lunr.ru.min.js | 18 + .../javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + .../javascripts/lunr/min/lunr.sv.min.js | 18 + .../javascripts/lunr/min/lunr.ta.min.js | 1 + .../javascripts/lunr/min/lunr.te.min.js | 1 + .../javascripts/lunr/min/lunr.th.min.js | 1 + .../javascripts/lunr/min/lunr.tr.min.js | 18 + .../javascripts/lunr/min/lunr.vi.min.js | 1 + .../javascripts/lunr/min/lunr.zh.min.js | 1 + .../site/assets/javascripts/lunr/tinyseg.js | 206 + .../site/assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../site/assets/javascripts/rules-filter.js | 38 + .../workers/search.2c215733.min.js | 42 + .../workers/search.2c215733.min.js.map | 7 + docs-site/site/assets/stylesheets/extra.css | 265 + .../assets/stylesheets/main.484c7ddc.min.css | 1 + .../stylesheets/main.484c7ddc.min.css.map | 1 + .../stylesheets/palette.ab4e12ef.min.css | 1 + .../stylesheets/palette.ab4e12ef.min.css.map | 1 + docs-site/site/robots.txt | 4 + docs-site/site/sitemap.xml | 83 + docs-site/site/sitemap.xml.gz | Bin 0 -> 396 bytes 111 files changed, 20426 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/docs.yml create mode 100644 docs-site/docs/assets/icons/aws-s3.svg create mode 100644 docs-site/docs/assets/icons/azure-devops.svg create mode 100644 docs-site/docs/assets/icons/bitbucket.svg create mode 100644 docs-site/docs/assets/icons/confluence.svg create mode 100644 docs-site/docs/assets/icons/docker.svg create mode 100644 docs-site/docs/assets/icons/files.svg create mode 100644 docs-site/docs/assets/icons/gcs.svg create mode 100644 docs-site/docs/assets/icons/gitea.svg create mode 100644 docs-site/docs/assets/icons/github.svg create mode 100644 docs-site/docs/assets/icons/gitlab.svg create mode 100644 docs-site/docs/assets/icons/huggingface.svg create mode 100644 docs-site/docs/assets/icons/jira.svg create mode 100644 docs-site/docs/assets/icons/local-git.svg create mode 100644 docs-site/docs/assets/icons/slack.svg create mode 100644 docs-site/docs/assets/icons/teams.svg create mode 100644 docs-site/docs/assets/images/kingfisher_logo.png create mode 100644 docs-site/docs/assets/images/runtime-comparison.png create mode 100644 docs-site/docs/assets/javascripts/rules-filter.js create mode 100644 docs-site/docs/assets/stylesheets/extra.css create mode 100644 docs-site/docs/changelog.md create mode 100644 docs-site/docs/features/access-map.md create mode 100644 docs-site/docs/features/agents.md create mode 100644 docs-site/docs/features/fingerprints.md create mode 100644 docs-site/docs/features/parsing.md create mode 100644 docs-site/docs/features/revocation.md create mode 100644 docs-site/docs/getting-started/installation.md create mode 100644 docs-site/docs/getting-started/quick-start.md create mode 100644 docs-site/docs/index.md create mode 100644 docs-site/docs/reference/architecture.md create mode 100644 docs-site/docs/reference/comparison.md create mode 100644 docs-site/docs/reference/library.md create mode 100644 docs-site/docs/reference/python-bindings.md create mode 100644 docs-site/docs/robots.txt create mode 100644 docs-site/docs/rules/builtin-rules.md create mode 100644 docs-site/docs/rules/overview.md create mode 100644 docs-site/docs/usage/advanced.md create mode 100644 docs-site/docs/usage/baseline.md create mode 100644 docs-site/docs/usage/basic-scanning.md create mode 100644 docs-site/docs/usage/deployment.md create mode 100644 docs-site/docs/usage/integrations.md create mode 100644 docs-site/mkdocs.yml create mode 100644 docs-site/requirements.txt create mode 100644 docs-site/scripts/generate-rules-page.py create mode 100644 docs-site/scripts/prepare-docs.py create mode 100644 docs-site/site/assets/icons/aws-s3.svg create mode 100644 docs-site/site/assets/icons/azure-devops.svg create mode 100644 docs-site/site/assets/icons/bitbucket.svg create mode 100644 docs-site/site/assets/icons/confluence.svg create mode 100644 docs-site/site/assets/icons/docker.svg create mode 100644 docs-site/site/assets/icons/files.svg create mode 100644 docs-site/site/assets/icons/gcs.svg create mode 100644 docs-site/site/assets/icons/gitea.svg create mode 100644 docs-site/site/assets/icons/github.svg create mode 100644 docs-site/site/assets/icons/gitlab.svg create mode 100644 docs-site/site/assets/icons/huggingface.svg create mode 100644 docs-site/site/assets/icons/jira.svg create mode 100644 docs-site/site/assets/icons/local-git.svg create mode 100644 docs-site/site/assets/icons/slack.svg create mode 100644 docs-site/site/assets/icons/teams.svg create mode 100644 docs-site/site/assets/images/favicon.png create mode 100644 docs-site/site/assets/images/kingfisher_logo.png create mode 100644 docs-site/site/assets/images/runtime-comparison.png create mode 100644 docs-site/site/assets/javascripts/bundle.79ae519e.min.js create mode 100644 docs-site/site/assets/javascripts/bundle.79ae519e.min.js.map create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 docs-site/site/assets/javascripts/lunr/tinyseg.js create mode 100644 docs-site/site/assets/javascripts/lunr/wordcut.js create mode 100644 docs-site/site/assets/javascripts/rules-filter.js create mode 100644 docs-site/site/assets/javascripts/workers/search.2c215733.min.js create mode 100644 docs-site/site/assets/javascripts/workers/search.2c215733.min.js.map create mode 100644 docs-site/site/assets/stylesheets/extra.css create mode 100644 docs-site/site/assets/stylesheets/main.484c7ddc.min.css create mode 100644 docs-site/site/assets/stylesheets/main.484c7ddc.min.css.map create mode 100644 docs-site/site/assets/stylesheets/palette.ab4e12ef.min.css create mode 100644 docs-site/site/assets/stylesheets/palette.ab4e12ef.min.css.map create mode 100644 docs-site/site/robots.txt create mode 100644 docs-site/site/sitemap.xml create mode 100644 docs-site/site/sitemap.xml.gz diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..8fdf255 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,62 @@ +name: Deploy Documentation + +on: + push: + branches: [main] + paths: + - 'docs-site/**' + - 'docs/**' + - 'crates/kingfisher-rules/data/rules/**' + - '.github/workflows/docs.yml' + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: "pages" + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: astral-sh/setup-uv@v4 + + - uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install dependencies + run: uv pip install --system -r docs-site/requirements.txt + + - name: Prepare documentation + run: python3 docs-site/scripts/prepare-docs.py + + - name: Generate rules page + run: python3 docs-site/scripts/generate-rules-page.py + + - name: Build site + run: cd docs-site && mkdocs build --strict + env: + CI: true + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + path: docs-site/site + + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + needs: build + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/Makefile b/Makefile index e870319..19b616e 100644 --- a/Makefile +++ b/Makefile @@ -298,7 +298,7 @@ endif mingw-w64-x86_64-toolchain \ mingw-w64-x86_64-cmake \ mingw-w64-x86_64-boost \ - mingw-w64-x86_64-pkg-config \ + mingw-w64-x86_64-pkgconf \ mingw-w64-x86_64-ragel \ mingw-w64-x86_64-pcre2 \ mingw-w64-x86_64-zlib \ @@ -812,10 +812,38 @@ fuzz: done @echo "🎉 All fuzz targets passed" +# ============= DOCUMENTATION ============= + +docs-build: + @echo "📝 Preparing documentation…" + @uv run --with mkdocs-material --with mkdocs-minify-plugin --with pyyaml \ + python3 docs-site/scripts/prepare-docs.py + @uv run --with mkdocs-material --with mkdocs-minify-plugin --with pyyaml \ + python3 docs-site/scripts/generate-rules-page.py + @echo "🔨 Building site…" + @cd docs-site && uv run --with mkdocs-material --with mkdocs-minify-plugin \ + mkdocs build + @echo "✅ Site built at docs-site/site/" + +docs-serve: + @echo "📝 Preparing documentation…" + @uv run --with mkdocs-material --with mkdocs-minify-plugin --with pyyaml \ + python3 docs-site/scripts/prepare-docs.py + @uv run --with mkdocs-material --with mkdocs-minify-plugin --with pyyaml \ + python3 docs-site/scripts/generate-rules-page.py + @echo "🌐 Starting dev server at http://127.0.0.1:8000/" + @cd docs-site && uv run --with mkdocs-material --with mkdocs-minify-plugin \ + mkdocs serve + +docs-clean: + @rm -rf docs-site/site + @echo "🧹 Cleaned docs-site/site/" + clean: @echo "Cleaning build artifacts..." cargo clean rm -f .dockerignore + rm -rf docs-site/site notices: @echo "Generating third-party notices..." diff --git a/docs-site/docs/assets/icons/aws-s3.svg b/docs-site/docs/assets/icons/aws-s3.svg new file mode 100644 index 0000000..3f63be5 --- /dev/null +++ b/docs-site/docs/assets/icons/aws-s3.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs-site/docs/assets/icons/azure-devops.svg b/docs-site/docs/assets/icons/azure-devops.svg new file mode 100644 index 0000000..d5db277 --- /dev/null +++ b/docs-site/docs/assets/icons/azure-devops.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/bitbucket.svg b/docs-site/docs/assets/icons/bitbucket.svg new file mode 100644 index 0000000..38af1ce --- /dev/null +++ b/docs-site/docs/assets/icons/bitbucket.svg @@ -0,0 +1,15 @@ + + + + + + + + Bitbucket-blue + + + + + + + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/confluence.svg b/docs-site/docs/assets/icons/confluence.svg new file mode 100644 index 0000000..22249e1 --- /dev/null +++ b/docs-site/docs/assets/icons/confluence.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/docker.svg b/docs-site/docs/assets/icons/docker.svg new file mode 100644 index 0000000..0a9c6b0 --- /dev/null +++ b/docs-site/docs/assets/icons/docker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/files.svg b/docs-site/docs/assets/icons/files.svg new file mode 100644 index 0000000..1ebd008 --- /dev/null +++ b/docs-site/docs/assets/icons/files.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-site/docs/assets/icons/gcs.svg b/docs-site/docs/assets/icons/gcs.svg new file mode 100644 index 0000000..842c121 --- /dev/null +++ b/docs-site/docs/assets/icons/gcs.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/gitea.svg b/docs-site/docs/assets/icons/gitea.svg new file mode 100644 index 0000000..7ed0012 --- /dev/null +++ b/docs-site/docs/assets/icons/gitea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/github.svg b/docs-site/docs/assets/icons/github.svg new file mode 100644 index 0000000..a8d1174 --- /dev/null +++ b/docs-site/docs/assets/icons/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs-site/docs/assets/icons/gitlab.svg b/docs-site/docs/assets/icons/gitlab.svg new file mode 100644 index 0000000..abe3f37 --- /dev/null +++ b/docs-site/docs/assets/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/huggingface.svg b/docs-site/docs/assets/icons/huggingface.svg new file mode 100644 index 0000000..43711df --- /dev/null +++ b/docs-site/docs/assets/icons/huggingface.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + diff --git a/docs-site/docs/assets/icons/jira.svg b/docs-site/docs/assets/icons/jira.svg new file mode 100644 index 0000000..57a68f0 --- /dev/null +++ b/docs-site/docs/assets/icons/jira.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/local-git.svg b/docs-site/docs/assets/icons/local-git.svg new file mode 100644 index 0000000..994fb2c --- /dev/null +++ b/docs-site/docs/assets/icons/local-git.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/docs/assets/icons/slack.svg b/docs-site/docs/assets/icons/slack.svg new file mode 100644 index 0000000..fb55f72 --- /dev/null +++ b/docs-site/docs/assets/icons/slack.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs-site/docs/assets/icons/teams.svg b/docs-site/docs/assets/icons/teams.svg new file mode 100644 index 0000000..46bf8ed --- /dev/null +++ b/docs-site/docs/assets/icons/teams.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs-site/docs/assets/images/kingfisher_logo.png b/docs-site/docs/assets/images/kingfisher_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e045fccbf9da9e4bb2ddf132e5096db9b8b5f79a GIT binary patch literal 220572 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 literal 0 HcmV?d00001 diff --git a/docs-site/docs/assets/javascripts/rules-filter.js b/docs-site/docs/assets/javascripts/rules-filter.js new file mode 100644 index 0000000..76051d1 --- /dev/null +++ b/docs-site/docs/assets/javascripts/rules-filter.js @@ -0,0 +1,38 @@ +// Client-side search/filter for the built-in rules table +document.addEventListener("DOMContentLoaded", function () { + const input = document.querySelector(".rules-search"); + if (!input) return; + + const table = document.querySelector(".rules-table"); + if (!table) return; + + const rows = Array.from(table.querySelectorAll("tbody tr")); + const countEl = document.querySelector(".rules-count"); + const total = rows.length; + + function updateCount(visible) { + if (countEl) { + countEl.textContent = "Showing " + visible + " of " + total + " rules"; + } + } + + let debounceTimer; + input.addEventListener("input", function () { + clearTimeout(debounceTimer); + debounceTimer = setTimeout(function () { + const query = input.value.toLowerCase().trim(); + let visible = 0; + + rows.forEach(function (row) { + const text = row.textContent.toLowerCase(); + const match = !query || text.indexOf(query) !== -1; + row.style.display = match ? "" : "none"; + if (match) visible++; + }); + + updateCount(visible); + }, 150); + }); + + updateCount(total); +}); diff --git a/docs-site/docs/assets/stylesheets/extra.css b/docs-site/docs/assets/stylesheets/extra.css new file mode 100644 index 0000000..b3df9bd --- /dev/null +++ b/docs-site/docs/assets/stylesheets/extra.css @@ -0,0 +1,265 @@ +/* ===== Landing Page Styles ===== */ + +/* Hero */ +.kf-hero { + padding: 4rem 0 2rem; + text-align: center; + background: linear-gradient(135deg, var(--md-primary-fg-color--light) 0%, var(--md-primary-fg-color) 100%); + color: var(--md-primary-bg-color); +} + +.kf-hero__logo { + margin-bottom: 1rem; +} + +.kf-hero__title { + font-size: 3rem; + font-weight: 700; + margin: 0 0 0.5rem; +} + +.kf-hero__subtitle { + font-size: 1.5rem; + font-weight: 400; + opacity: 0.95; + margin: 0 0 1rem; +} + +.kf-hero__tagline { + font-size: 1.1rem; + max-width: 700px; + margin: 0 auto 2rem; + opacity: 0.9; + line-height: 1.6; +} + +.kf-hero__actions { + display: flex; + gap: 1rem; + justify-content: center; + flex-wrap: wrap; +} + +.kf-hero__actions .md-button { + color: var(--md-primary-bg-color); + border-color: var(--md-primary-bg-color); +} + +.kf-hero__actions .md-button--primary { + background-color: var(--md-primary-bg-color); + color: var(--md-primary-fg-color); + border-color: var(--md-primary-bg-color); +} + +.kf-hero__actions .md-button--primary:hover { + background-color: rgba(255, 255, 255, 0.9); +} + +/* Stats bar */ +.kf-stats { + padding: 2rem 0; + background: var(--md-default-bg-color); + border-bottom: 1px solid var(--md-default-fg-color--lightest); +} + +.kf-stats__inner { + display: flex; + justify-content: center; + gap: 3rem; + flex-wrap: wrap; +} + +.kf-stats__item { + text-align: center; +} + +.kf-stats__number { + display: block; + font-size: 2rem; + font-weight: 700; + color: var(--md-primary-fg-color); +} + +.kf-stats__label { + font-size: 0.85rem; + color: var(--md-default-fg-color--light); + text-transform: uppercase; + letter-spacing: 0.05em; +} + +/* Section titles */ +.kf-section__title { + text-align: center; + font-size: 2rem; + margin-bottom: 0.5rem; +} + +.kf-section__desc { + text-align: center; + max-width: 700px; + margin: 0 auto 2rem; + color: var(--md-default-fg-color--light); + line-height: 1.6; +} + +/* Features grid */ +.kf-features { + padding: 4rem 0; +} + +.kf-features__grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 2rem; + margin-top: 2rem; +} + +.kf-feature { + padding: 1.5rem; + border-radius: 0.5rem; + border: 1px solid var(--md-default-fg-color--lightest); + transition: box-shadow 0.2s; +} + +.kf-feature:hover { + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); +} + +.kf-feature h3 { + margin-top: 0; + color: var(--md-primary-fg-color); +} + +.kf-feature p { + color: var(--md-default-fg-color--light); + line-height: 1.6; + margin-bottom: 0; +} + +/* Benchmark */ +.kf-benchmark { + padding: 4rem 0; + background: var(--md-code-bg-color); +} + +.kf-benchmark__chart { + display: block; + max-width: 800px; + margin: 0 auto; + border-radius: 0.5rem; +} + +/* Scan targets */ +.kf-targets { + padding: 4rem 0; +} + +.kf-targets__grid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 2rem; + margin-top: 2rem; +} + +.kf-target { + display: flex; + flex-direction: column; + align-items: center; + gap: 0.5rem; + min-width: 80px; +} + +.kf-target span { + font-size: 0.8rem; + color: var(--md-default-fg-color--light); + text-align: center; +} + +/* Install section */ +.kf-install { + padding: 4rem 0; + background: var(--md-code-bg-color); +} + +.kf-install__tabs { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 1.5rem; + margin-top: 2rem; +} + +.kf-install__tab { + padding: 1rem 1.5rem; + border-radius: 0.5rem; + background: var(--md-default-bg-color); + border: 1px solid var(--md-default-fg-color--lightest); +} + +.kf-install__tab h4 { + margin: 0 0 0.5rem; + color: var(--md-primary-fg-color); +} + +.kf-install__tab .highlight { + margin: 0; +} + +.kf-install__tab pre { + margin: 0; + padding: 0.5rem; + font-size: 0.85rem; + overflow-x: auto; +} + +.kf-install__cta { + text-align: center; + margin-top: 2rem; +} + +/* ===== Rules Table ===== */ + +.rules-search { + width: 100%; + padding: 0.75rem 1rem; + border: 1px solid var(--md-default-fg-color--lightest); + border-radius: 0.5rem; + font-size: 1rem; + background: var(--md-default-bg-color); + color: var(--md-default-fg-color); + margin-bottom: 1rem; + box-sizing: border-box; +} + +.rules-search:focus { + outline: 2px solid var(--md-primary-fg-color); + border-color: var(--md-primary-fg-color); +} + +.rules-count { + color: var(--md-default-fg-color--light); + font-size: 0.9rem; + margin-bottom: 1rem; +} + +/* Responsive */ +@media screen and (max-width: 768px) { + .kf-hero__title { + font-size: 2rem; + } + .kf-hero__subtitle { + font-size: 1.2rem; + } + .kf-stats__inner { + gap: 1.5rem; + } + .kf-stats__number { + font-size: 1.5rem; + } + .kf-features__grid { + grid-template-columns: 1fr; + } + .kf-install__tabs { + grid-template-columns: 1fr; + } +} diff --git a/docs-site/docs/changelog.md b/docs-site/docs/changelog.md new file mode 100644 index 0000000..6439801 --- /dev/null +++ b/docs-site/docs/changelog.md @@ -0,0 +1,562 @@ +--- +title: "Changelog" +description: "Kingfisher release history: new features, rules, bug fixes, and improvements." +--- + +# Changelog + +All notable changes to this project will be documented in this file. + +## [v1.94.0] +- Updated vendored `vectorscan-rs` from v0.0.5 (Vectorscan 5.4.11) to v0.0.6 (Vectorscan 5.4.12). The upstream crate now ships pre-extracted sources instead of a tarball+patch, and fixes the `cpu_native` feature flag. Local Windows and musl build patches have been re-applied. +- Added more built-in rules + +## [v1.93.0] +- **Access Map: added 21 new blast radius providers**, bringing the total to 39. New providers: Airtable, Algolia, Artifactory, Auth0, CircleCI, DigitalOcean, Fastly, HubSpot, IBM Cloud, Jira, MySQL, PayPal, Plaid, SendGrid, Sendinblue/Brevo, Shopify, Square, Stripe, Terraform Cloud, JFrog Xray, and Zendesk. Each provider maps leaked credentials to their effective identity, permissions, and exposed resources. +- **Access Map: expanded provider depth** for existing integrations. AWS now enumerates SQS, SNS, RDS, ECR, and SSM Parameter Store in addition to the earlier core services; Azure Storage now maps Blob containers, File shares, and Queues from account keys; OpenAI now enumerates visible models, files, assistants, and fine-tuning jobs; Hugging Face now includes datasets and Spaces alongside models; Anthropic now surfaces visible organization API keys. +- Folded in a set of safe dependency bumps from open maintenance PRs, including `strum`, `sysinfo`, `hmac`, `sha1`, `sha2`, `gitlab`, and `oci-client`, with small compatibility fixes in runtime hashing, system memory detection, and Azure signing code. +- Added Mermaid architecture documentation in `docs/ARCHITECTURE.md`, covering the main Kingfisher components, command paths, and scan flow at a high level. +- Expanded `docs/LIBRARY.md` with Mermaid diagrams showing the relationships and internal structure of `kingfisher-core`, `kingfisher-rules`, and `kingfisher-scanner`. + +## [v1.92.0] +- Added new built-in rules for Etsy, Flutterwave, Freemius, JFrog, Kraken, KuCoin, Trello, Octopus Deploy, OpenShift, Private AI, SettleMint, Sidekiq, and Polymarket. +- Added live HTTP validation for Etsy, JFrog, Octopus Deploy, OpenShift, and Private AI where provider documentation supported reliable token-only checks. +- Added detection + validation rules for Anthropic Admin, Azure Speech, Azure Translator, Databento, DataStax Astra, DevCycle, Fullstory, GC Notify, and Stytch; built-in runtime rule count is now 601 with `--confidence=low`. +- Added Heroku token revocation support for both legacy UUID-format tokens and `HRKU-` platform tokens via the OAuth authorizations API. +- Added `hmac_sha256_b64key` Liquid filter for HMAC-SHA256 signing with base64-encoded keys (decodes key to raw bytes before signing), enabling correct Azure Notification Hub SAS validation. +- Integrated SLSA v3 provenance generation into the release workflow; hash computation now scopes to build artifacts only for idempotent re-runs. +- Removed Zapier webhook live validation (GET to a catch hook triggers the Zap). +- Hardened Heroku revocation regex to prevent crossing JSON object boundaries when extracting authorization IDs. +- Fixed Zendesk subdomain regex to reject trailing hyphens; renamed `ZENDESK_SUBDOMAIN` to `ZENDESK_HOST` for clarity. +- Fixed Stytch and Polymarket trailing `\b` boundaries that prevented matching base64-padded secrets ending with `=`. +- Tightened Kubernetes API Server URL pattern to require kube-specific identifiers, preventing bootstrap tokens from binding to unrelated `server:` entries. + +## [v1.91.0] +- Added SSRF protection for credential validation: outbound HTTP requests now block connections to loopback, private, link-local, and other non-public IP addresses. HTTP redirect targets are DNS-resolved and validated against the same SSRF rules. Use `--allow-internal-ips` to opt out when scanning internal infrastructure. +- Consolidated JWT SSRF checks to use the shared `is_ssrf_safe_ip` function, covering additional reserved ranges (CGNAT, documentation, benchmarking, IPv6 unique-local). +- Removed `ipnet` dependency from `kingfisher-scanner` (no longer needed). +- Remediated current RustSec vulnerability findings by upgrading core dependencies including `gix`, `mysql_async`, `axum`, `indicatif`, `quick-xml`, and `console`. +- Added `make audit-deps` to run `cargo audit` locally and report vulnerable dependencies. +- Refreshed pinned GitHub Actions for `swatinem/rust-cache`, `msys2/setup-msys2`, and `ncipollo/release-action`, and configured Dependabot to ignore selected GitHub Action major-version bumps. +- OpenSSF Scorecard hardening: added `SECURITY.md`, `.github/dependabot.yml`, pinned all GitHub Actions by SHA, fixed dangerous workflow expression injection patterns, added top-level `permissions: {}` to `pypi.yml`, and added SLSA provenance generation for releases. +- Added ClusterFuzzLite integration with four fuzz targets (entropy, location mapping, base64 decoding, span deduplication) and a `make fuzz` target for local fuzzing. + +## [v1.90.0] +- Added `--max-validation-response-length ` for `scan` to control validation response storage truncation (default: `2048`, `0` disables truncation). +- Updated `--full-validation-response` to bypass both validation storage truncation and reporter truncation, preserving complete response bodies end-to-end for parsing/reporting workflows. +- Added Testkube detection/validation coverage with `kingfisher.testkube.*` rules for API keys plus dependent organization/environment IDs used for live API validation. +- Improved TrueNAS rule + +## [v1.89.0] +- Added TOON output for `scan`, `validate`, and `revoke`, optimized for LLM/agent workflows; prefer `--format toon` when calling Kingfisher from an LLM. +- Expanded built-in revocation support with new YAML revocation flows for Cloudflare, Confluent, Doppler, Mapbox, Particle.io, Twitch, and additional Vercel token formats. +- Added revocation coverage documentation: new `docs/REVOCATION_PROVIDERS.md` matrix and README links highlighting supported revocation providers/rule IDs. +- Access Map: added Microsoft Teams provider. Parses Incoming Webhook URLs (legacy and workflow-based) to extract tenant and webhook identity, probes for active status, and reports channel-level blast radius. Supports standalone `access-map microsoftteams` (alias `msteams`) and automatic mapping for validated `kingfisher.msteams.*` and `kingfisher.microsoftteamswebhook.*` findings. +- Added Microsoft Teams scan target: `kingfisher scan teams "QUERY"` searches Teams messages via Microsoft Graph Search API and scans them for secrets, mirroring the Slack integration. +- Requires `KF_TEAMS_TOKEN` environment variable (Microsoft Graph access token with `ChannelMessage.Read.All` or `Chat.Read` permissions). +- Findings reference Teams message URLs in reports; see `docs/USAGE.md` and `docs/INTEGRATIONS.md` for authentication setup. + +## [v1.88.0] +- Tree-sitter fallback behavior changed to be strictly additive: when parser context is unavailable, findings now fall back to Hyperscan/Vectorscan matches instead of being suppressed. +- Fixed dependent-rule reporting gaps (for example Algolia API keys) by preserving regex findings when tree-sitter is unavailable, while still marking validation as skipped when dependency inputs are missing. +- Expanded parser queries for C, Go, Java, JavaScript, and TypeScript to improve assignment/literal capture coverage (including template/raw string handling in JS/TS/Go). +- Added parser query quality gates: compile-time query validation tests plus fixture-based capture-count regression tests backed by `testdata/parsers/tree_sitter_capture_baseline.json`. +- Added inline-ignore coverage for directives placed on the line immediately before a single-line secret match. +- Updated tree-sitter documentation wording to align with `--turbo` terminology. + +## [v1.87.0] +- Tree-sitter verification now runs for blobs from `0` bytes up to `128 KiB` (previously `1 KiB` to `64 KiB`), while remaining a post-regex verification step applied only to context-dependent candidate matches from Hyperscan/Vectorscan. +- False-positive reduction: Hyperscan/Vectorscan still scans everything first, then tree-sitter performs a second-pass verification only on auto-classified context-dependent findings; self-identifying/token-explicit findings stay regex-first. +- Hardened Perplexity API key validation to reject auth failures (`401`/`403`) and avoid false "Active Credential" results from error payloads. +- Fixed Yelp API key validation false positives by switching to an auth-enforcing endpoint (`/v3/businesses/search`) and adding explicit auth error guards. +- Added 37 new provider detection + HTTP validation rules: Ably, AbstractAPI, AbuseIPDB, AviationStack, Better Stack, Brevo, Clearout, Clerk, Cloudinary, Coinlayer, Contentstack, Currencylayer, Daily, Fixer, Geoapify, Hunter.io, Mux, NewsAPI, Numverify, OneSignal, Pinecone, Pingdom, Positionstack, Railway, Render, Rollbar, Salesloft, Sanity, StatusCake, Storyblok, UptimeRobot, urlscan.io, VirusTotal, WeatherAPI, Webflow, and ZeroBounce. +- Tightened regex specificity for newly added rules by replacing broad variable-length token captures with explicit fixed formats/lengths and aligned examples to pass `rules check`. + +## [v1.86.0] +- GitLab scanning: honor OS-trusted internal CAs without requiring `SSL_CERT_FILE`, and preserve custom GitLab API ports in repository enumeration and artifact fetching. +- Added detection/validation rules for App Center, Branch.io, BrowserStack, Calendly, Cypress, Delighted, DeviantArt, Instagram, Iterable, Keen.io, Lokalise, Pendo, Razorpay, Spotify, WakaTime, WPEngine. +- Added revocation support for DeviantArt access tokens via the OAuth revoke endpoint and BrowserStack access keys via the key recycle endpoint. +- Windows builds: replaced `buildwin.bat` flow with Makefile-driven MinGW targets for `windows-x64` and `windows-arm64`, producing static `kingfisher.exe` artifacts packaged as `kingfisher-windows-*.zip` with checksums. +- GitHub Actions (`ci.yml`, `release.yml`): Windows jobs now build and test both x64 and arm64 via a matrix using `make windows-x64` / `make windows-arm64`. + +## [v1.85.0] +- Report viewer: added `--view-report-port` and `--view-report-address` to `kingfisher scan --view-report`, and `--address` to `kingfisher view`, so the embedded report server can bind to `0.0.0.0` and be reached from the host when running in Docker. Use `--view-report-address 0.0.0.0` with `-p 7890:7890` (or `--view-report-port 7891` with `-p 7891:7891`) to view the HTML report at http://localhost:7890 from your host. +- Updated `kingfisher scan` to accept Git repository URLs as positional targets (for example `kingfisher scan github.com/org/repo` or `kingfisher scan https://gitlab.com/group/project.git`) without requiring `--git-url`. +- Deprecated `--git-url` while preserving backward compatibility; using the flag now emits a migration warning to prefer positional URL targets. +- Updated README/integration/usage/install/demo examples and CLI tests to use positional Git URL scanning syntax. +- Jira scanning: added `kingfisher scan jira --include-comments` and `--include-changelog` to scan per-issue comments and changelog entries, with paginated Jira comment fetching and ADF text normalization preserved for issue/comment content. +- Added `--turbo` mode: sets `--commit-metadata=false`, `--no-base64`, disables language detection, and disables tree-sitter parsing...for maximum scan speed. Findings will omit Git commit context (author, date, commit hash) and will not include Base64-decoded secrets. +- SQLite database scanning: kingfisher now detects and extracts SQLite files (`.db`, `.sqlite`, `.sqlite3`, etc.), dumping each table as SQL text with named columns so secrets stored in database rows are scannable. Extraction is enabled by default and can be disabled with `--no-extract-archives`. +- Python bytecode (.pyc) scanning: extracts string constants from compiled Python (`.pyc`, `.pyo`) files via marshal parsing so secrets embedded in bytecode are scannable. Extraction is enabled by default and can be disabled with `--no-extract-archives`. +- Performance: pipelined ODB enumeration — scanning now begins while blob OIDs are still being discovered, overlapping I/O with pattern matching. +- Performance: skip blobs smaller than 20 bytes during enumeration (too small to contain any secret). +- Performance: preserve pack-ascending blob order in the metadata path for better I/O locality when Rayon splits work. +- Performance: defer Git committer metadata materialization until commits actually introduce scannable blobs, reducing unnecessary string/time parsing work. +- Performance: push `--exclude` filtering into Git tree traversal so excluded paths/subtrees are pruned before blob-introduction bookkeeping. +- Performance: make Git repository object indexing single-pass (removed the extra ODB scan in `RepositoryIndex::new`). + +## [v1.84.0] +- Added/updated `pipedrive` and `amplitude` rules +- Access Map: added Buildkite provider. Enumerates token scopes, user identity, organizations, and pipelines with severity classification based on scope risk. +- Access Map: added Harness provider. Uses `x-api-key` authentication to enumerate organizations/projects when permitted (best-effort). +- Access Map: added OpenAI provider. Supports standalone `access-map openai` and automatic mapping for validated `kingfisher.openai.*` findings. Enumerates organizations (from `/v1/me`), projects, and API key permission scopes by probing endpoints for restricted key detection. +- Access Map: added Anthropic provider. Supports standalone `access-map anthropic` and automatic mapping for validated `kingfisher.anthropic.*` findings. +- Access Map: added Salesforce provider. Supports standalone `access-map salesforce` (token + instance) and automatic mapping for validated `kingfisher.salesforce.*` findings. +- Added Weights & Biases support: new `kingfisher.wandb.2` rule for `wandb_v1_...` keys (legacy `kingfisher.wandb.1` retained), plus Access Map provider/CLI support (`weightsandbiases`, alias `wandb`). +- Reports: always emit `validate`/`revoke` command hints when supported by a rule (no suppression for missing template vars). +- Access Map GCP: added resource enumeration for Cloud KMS key rings, Cloud Functions, Firestore databases, Cloud Spanner instances, and project service accounts. +- Access Map GCP: populated `token_details` with service account metadata (display name, unique ID, disabled status). +- Access Map GCP: fixed BigQuery and Secret Manager risk assessment to detect write permissions and `secretmanager.versions.access`. +- Access Map GCP: added risk notes for KMS decrypt, Cloud Functions deploy, instance metadata injection, and secret value read access. +- Access Map GCP: expanded `testIamPermissions` fallback with 11 additional permission candidates. + +## [v1.83.0] +- Kingfisher can now generate an auditor-friendly HTML report: `--format html --output kingfisher-audit.html` +- Architecture: split `matcher.rs` into a `src/matcher/` module directory with focused sub-modules (`base64_decode`, `captures`, `conversion`, `dedup`, `filter`, `fingerprint`). Decomposed `filter_match` into smaller validation helpers. +- Architecture: refactored `scanner/runner.rs` god function into phase-based helpers (`enumerate_all_repos`, `fetch_all_artifacts`, `run_sequential_scan`, `run_parallel_scan`, etc.) with a `ValidationDeps` type alias. +- Architecture: consolidated duplicated matching primitives (base64 detection, dedup, fingerprinting, secret capture selection) into `kingfisher-scanner::primitives` as the single source of truth; both the scanner crate and binary now share one implementation. +- Architecture: introduced `TokenAccessMapper` trait for access map providers, implemented for GitHub, GitLab, Slack, HuggingFace, Gitea, and Bitbucket. +- Architecture: moved `content_type` module to `kingfisher-core` crate where it logically belongs (zero binary-crate dependencies). +- Library crates: added an external-consumer integration test (`tests/library_crates_external_project.rs`) and fixed `kingfisher-scanner` manifest wiring by making `serde` a required dependency, ensuring `kingfisher-core`/`kingfisher-rules`/`kingfisher-scanner` compile and run from a non-kingfisher Rust project. +- Improved tree-sitter parsing + structured secret detection in source files. A Vectorscan pre-filter over the combined tree-sitter output avoids the O(results × rules) regex cost. +- Access Map: added Hugging Face, Gitea, Bitbucket, PostgreSQL, and MongoDB providers. All perform read-only enumeration with severity classification. +- Access Map: Hugging Face, Bitbucket, Postgres, and MongoDB credentials from scans are now auto-collected when using `--access-map`. +- Access Map CLI: added providers `huggingface`/`hf`, `gitea`, `bitbucket`, `postgres`, `mongodb`/`mongo`. +- Added `kingfisher.gitea.1` rule for Gitea access tokens with validation; self-revocation not supported (API requires Basic Auth). +- Added revocation for GitHub App Server-to-Server tokens (`ghs_`, `kingfisher.github.5`) via `DELETE /installation/token`. Note: `ghu_` (user-to-server) tokens cannot be self-revoked; they require the GitHub App's client credentials or manual revocation via GitHub Settings. +- Fixed GitHub Access Map failing for all token types due to `GitHubUser` struct field mismatch (`_id` vs API `"id"`). +- Viewer: replaced the Access Map tree view with a card-based layout showing identity, resource count, permission tags, and token details at a glance with expandable inline detail. +- Viewer: added per-finding Blast Radius section linking findings to their access map entries with an auto-generated risk rationale (critical/high/medium/low) based on credential status, resource count, and permission severity. +- Viewer: added two new report types — Risk Report (findings + blast radius per credential, for researchers/bug bounty) and Scan Report (executive summary + scan metadata + findings table, for defenders/tickets). Both support "Active credentials only" filtering. +- Viewer: redesigned the Access Map export report to match the Scan/Risk report quality with summary stats, per-identity cards, token details, and resource/permission grids. +- Viewer: added scan metadata bar (timestamp, target, duration, version) to the Dashboard view. + +## [v1.82.0] +- Added Vercel credential rules for new token formats introduced February 2026: `vcp_` (personal access), `vci_` (integration), `vca_` (app access), `vcr_` (app refresh), `vck_` (AI Gateway API key). All use CRC32/Base62 checksum validation. Legacy 24-char format retained as `kingfisher.vercel.1`. +- Added revocation support for Vercel app tokens (`vca_`, `vcr_`) via `https://api.vercel.com/login/oauth/token/revoke`. Requires `VERCEL_APP_CLIENT_ID` (or `NEXT_PUBLIC_VERCEL_APP_CLIENT_ID`) and `VERCEL_APP_CLIENT_SECRET`. +- Fixed validate/revoke command generation to omit regex named captures (e.g., `BODY`, `CHECKSUM`) when they are not used by validation/revocation templates, so rules like Vercel no longer produce unnecessary `--var BODY=...` arguments. +- Fixed HTTP validation incorrectly marking valid credentials as inactive when response bodies exceeded 2048 bytes. Matchers (`JsonValid`, `WordMatch`, etc.) now run against the full response; only the stored preview remains truncated for reporting. +- Fixed validation flakiness under service rate limiting by retrying HTTP validations on 429/408 in addition to transient 5xx failures. +- Added optional validation rate limiting via `--validation-rps` (global) and repeatable `--validation-rps-rule ` (per-rule override) for both `scan` and `validate`. Throttling now applies across built-in validator types (HTTP/gRPC plus AWS, GCP, Coinbase, MongoDB, Postgres, MySQL, JDBC, JWT, and Azure Storage). Rule selectors support the short form (for example, `github=2` matches `kingfisher.github.*`) with longest-prefix precedence when multiple selectors apply. +- Prevented transient HTTP validation failures (429/5xx) from being cached, avoiding cache poisoning that could suppress later successful validations in the same scan. +- Added `kingfisher.temporal.1` rule for Temporal Cloud API keys (namespace-scoped and user-scoped JWT formats) with Temporal-specific pattern matching. +- Added Temporal Cloud active credential validation via `GET https://saas-api.tmprl.cloud/cloud/current-identity` using bearer auth, so Temporal keys validate against provider APIs instead of generic OIDC discovery. +- Fixed JWT issuer normalization to treat bare host issuers (e.g. `iss: "temporal.io"`) as HTTPS URLs during discovery, avoiding low-level URL builder failures. +- Added `crates/kingfisher-rules/build.rs` to ensure embedded rule assets rebuild when files under `crates/kingfisher-rules/data` change. + +## [v1.81.0] +- Fixed checksum-template evaluation for prefixed tokens by using explicit checksum/body captures in NPM, GitHub, Confluent, and GitLab rules. +- Updated references sections to rules with API documentation links. +- Updated Google OAuth credentials rule requirements so bundled client-id/client-secret examples pass `rules check` consistently. +- Added gRPC validation support for gRPC-only APIs via `validation: type: Grpc` (e.g., Modal administrative keys). + +## [v1.80.0] +- Added `--full-validation-response` flag to include complete validation response bodies without truncation. By default, validation responses are still truncated to 512 characters for readability. When enabled, users can parse and present full validation responses as needed (e.g., for GitHub token validation responses that include user metadata beyond the first 512 characters). +- Improved AWS rule. +- Enhanced HTTP multi-step revocation extraction by allowing Liquid rendering in extractors; updated NPM rules accordingly. + +## [v1.79.0] +- Added revocation support for SendGrid, Tailscale, MongoDB Atlas, Twilio, and NPM using multi-step (lookup ID then delete) pattern. +- Added new Sumo Logic rule with direct revocation support. +- Added `docs/TOKEN_REVOCATION_SUPPORT.md` with detailed revocation implementation guide and testing examples. +- Fixed AWS access key validation to support temporary/session keys (ASIA prefix) in addition to long-lived keys (AKIA prefix). +- Consolidated all validator implementations into the `kingfisher-scanner` crate to eliminate code duplication. Validators for AWS, Azure, Coinbase, GCP, JWT, JDBC, MongoDB, MySQL, Postgres, and HTTP are now maintained in a single location with proper feature gating. + +## [v1.78.0] +- Added "Skipped Validations" counter to scan summary output to distinguish between validations that failed (HTTP errors, connection failures) and validations that were skipped due to missing preconditions (e.g., missing dependent rules). This provides better visibility into validation coverage for large scans. +- Improved error messages for `kingfisher validate` command when rules require dependent variables from `depends_on` sections. Now clearly explains which variables are needed and from which dependent rules they are normally captured. +- Fixed `validate_command` and `revoke_command` generation in scan output to include all required `--var` arguments for rules with `depends_on` sections (e.g., PubNub, Azure Storage). Commands now include dependent variables like `--var SUBSCRIPTIONTOKEN=` or `--var AZURENAME=`. +- Updated Azure Storage validation to use `AZURENAME` variable (matching the `depends_on_rule` configuration) with `STORAGE_ACCOUNT` maintained as a backward-compatible alias. +- Added internal `dependent_captures` field to match records to preserve variables from dependent rules through the validation pipeline for accurate command generation. +- Added `--tls-mode ` global flag to control TLS certificate validation behavior during credential validation: + - `strict` (default): Full WebPKI certificate validation with trusted CA chains, hostname verification, and expiration checks + - `lax`: Accept self-signed or unknown CA certificates, useful for database connections (PostgreSQL, MySQL, MongoDB) and services using private CAs (e.g., Amazon RDS) + - `off`: Disable all TLS validation (equivalent to legacy `--ignore-certs`) +- Added rule-level `tls_mode` field allowing individual rules to opt into relaxed TLS validation when appropriate. Rules for PostgreSQL, MySQL, MongoDB, JDBC, and JWT now include `tls_mode: lax` by default. +- The `--ignore-certs` flag remains supported as a deprecated alias for `--tls-mode=off` for backward compatibility. +- Updated documentation to explain TLS validation modes and their security implications. +- Added comprehensive test coverage for TLS mode functionality including unit tests, integration tests, and rule configuration verification. +- Fixed deprecated `commit` stage name in `.pre-commit-hooks.yaml` to use `pre-commit` stage name, eliminating pre-commit framework warnings. + +## [v1.77.0] +- Added `kingfisher revoke` subcommand for revoking leaked credentials directly with the provider. +- Added optional `revocation` section to rules to support credential revocation (currently supporting AWS, GCP, GitHub, GitLab, Slack, and Buildkite). +- Added `kingfisher validate` subcommand to validate credentials without running a full scan. +- Added `validate_command` and `revoke_command` fields to scan output (pretty, JSON, JSONL, BSON, SARIF formats) showing the exact `kingfisher validate` or `kingfisher revoke` command to run for each finding. The `validate_command` is included for all findings with validation support; `revoke_command` is included only for active credentials with revocation support. These fields are omitted when `--redact` is used since they contain the secret value. +- Updated the HTML report viewer to display validate and revoke commands in the Finding Details panel with copy-to-clipboard functionality. +- Refactored project into multiple crates for better modularity and maintainability. +- Ensured more CLI arguments are global and available across all subcommands. +- Added `kingfisher-auto` pre-commit hook that automatically downloads and caches the appropriate binary for your platform (no Docker or manual installation required). +- Added Husky integration support with `install-husky.sh` helper script and documentation fclearor Node.js projects. +- Added `kingfisher-pre-commit-auto.sh` and `kingfisher-pre-commit-auto.ps1` scripts for automatic binary download in Git hooks (Linux, macOS, Windows support). + +## [v1.76.0] +- Fixed validation deduplication for rules with nested unnamed captures (e.g. `(?...(ABC|DEF)...)`) to use the primary capture for grouping, ensuring each unique match triggers a separate validation request. +- Added trace-level (`-vv`) logging for internal validation dedup keys and grouping to aid debugging. +- Switched compression dependencies to pure-Rust bzip2/lzma implementations and pared zip features to avoid C-based codecs for bz2/xz handling. + +## [v1.75.0] +- Enhanced Access Map View: added fingerprint display, enabled searching by fingerprint, and implemented bidirectional navigation between Findings and Access Map nodes. +- Added Slack Access Map support with granular permissions in the tree view. +- Improved HTML report +- Improved several rules +- Added new rules for Apollo, Clay, CodeRabbit, Customer.io, Instantly, Vast.ai +- Skipped per-repository report writes when an output file is specified and emit a single aggregated report after multi-repository scans to preserve full output content in files. + +## [v1.74.0] +- Added new rules: cursor, definednetworking, filezilla, harness, intra42, klingai, lark, mergify, naver, plaid, resend, retellai + +## [v1.73.0] +- Will now prefer git history findings when identical secrets appear in both current files and git history (dedup only). +- Fixed report viewer to add support for opening JSONL. +- Add opt-in contributor repository enumeration for GitHub/GitLab `--git-url` scans with `--include-contributors`, plus `--repo-clone-limit` to cap repo cloning. +- Add `--git-clone-dir` to set the parent clone directory and `--keep-clones` to preserve cloned repos after scans. +- Added several new rules. +- Added configurable validation timeout and retry settings for `kingfisher scan`. + +## [v1.72.0] +- Fixed deduplication for dependency-provider rules so dependent validations run per blob +- Updated Artifactory rule entropy and added new artifactory rule +- Aliased "kingfisher self-update" as "kingfisher update" +- Map SARIF result levels from rule confidence +- Added tag selection support to the bash and PowerShell install scripts. + +## [v1.71.0] +- Improved Report Viewer layout +- Improved Salesforce rule + +## [v1.70.0] +- Added `--staged` argument to support new `pre-commit` behavior and added integration coverage to ensure validated secrets block commits when used as pre-commit hook +- Added new rules for AWS Bedrock, Voyage.ai, Posthog, Atlassian +- Added an embedded web-based report and access-map viewer via `kingfisher view` subcommand that can load JSON or JSONL reports passed on the CLI (or upload them in the browser) +- Updated Jira create to gouqi, which supports Jira api v2 and v3 + +## [v1.69.0] +- Reduced per-match memory usage by compacting stored source locations and interning repeated capture names. +- Stored optional validation response bodies as boxed strings to avoid allocating empty payloads and to streamline validator caches. +- Parallelized git cloning based on the configured job count and begin scanning repositories as soon as each clone finishes to reduce end-to-end scan times. +- Combined per-repository results into a single aggregate summary after scans complete. +- Added initial access-map support and report viewer html file. Currently beta features. + +## [v1.68.0] +- Fixed Bitbucket authenticated cloning bug + +## [v1.67.0] +- Added checksum to GitLab rule +- Fixed deduplication to consider rule identifiers so overlapping patterns are not merged before validation +- After scan summaries, emit the styled outdated-version notice to stderr when a newer release is available +- Reduced false positives across a number of rules +- Updated Summary to include scan date, kingfisher version ran, and latest kingfisher version available + +## [v1.66.0] +- Updating to support Bitbucket App Passwords +- Improved boundaries for several rules +- Added more rules + +## [v1.65.0] +- Skip reporting MongoDB and Postgres findings when their connection strings cannot be parsed, even when validation is disabled. +- Improve MySQL detection by broadening URI coverage and adding live validation that skips clearly invalid connection strings. +- Added a helper to truncate validation response bodies only at UTF-8 character boundaries to prevent panics during validation. + +## [v1.64.0] +- Fixed a bug when using --redact, that broke validation +- Added JDBC rule with validator +- Filter out empty 'KF_BITBUCKET_*' environment values when constructing the Bitbucket authentication configuration so blank variables no longer override valid credentials + +## [v1.63.1] +- Updated allocator + +## [v1.63.0] +- Fixed bug when retrieving some finding values and injecting them as TOKENS in the rule templates +- Improved Datadog rule +- Improved AWS rule + +## [v1.62.0] +- Added `pattern_requirements` checks to rules, providing lightweight post-regex character-class validation without lookarounds. See docs/RULES.md for detail +- Added an `ignore_if_contains` option to `pattern_requirements` to drop matches containing case-insensitive placeholder words, with tests covering the new behavior. +- Updated rules to adopt the new `pattern_requirements` support. +- Added checksum comparisons to `pattern_requirements`, new `suffix`, `crc32`, and `base62` Liquid filters, and verbose logging so mismatched checksums are skipped with context rather than reported as findings. +- Split GitHub token detections into fine-grained/fixed-format variants and enforce checksum validation for modern GitHub token families (PAT, OAuth, App, refresh) while preserving legacy coverage. +- Added a rule for Zuplo tokens. +- Added checksum calculation for Confluent, GitHub, and Zuplo tokens, which can drastically reduce false positive reports. +- Improved OpsGenie validation. +- Automatically enable `--no-dedup` when `--manage-baseline` is supplied so baseline management keeps every finding. +- This release is focused on further improving detection accuracy, before even attempting to validate findings. +- Updated GitHub Actions CI for Windows and buildwin.bat script + +## [v1.61.0] +- Fixed local filesystem scans to keep `open_path_as_is` enabled when opening Git repositories and only disable it for diff-based scans. +- Created Linux and Windows specific installer script +- Updated diff-focused scanning so `--branch-root-commit` can be provided alongside `--branch`, letting you diff from a chosen commit while targeting a specific branch tip (still defaulting back to the `--branch` ref when the commit is omitted). +- Updated rules + +## [v1.60.0] +- Removed the `--bitbucket-username`, `--bitbucket-token`, and `--bitbucket-oauth-token` flags in favour of `KF_BITBUCKET_*` environment variables when authenticating to Bitbucket. +- Added provider-specific `kingfisher scan` subcommands (for example `kingfisher scan github …`) that translate into the legacy flags under the hood. The new layout keeps backwards compatibility while removing the wall of provider options from `kingfisher scan --help`. +- Updated the README so every provider example (GitHub, GitLab, Bitbucket, Azure Repos, Gitea, Hugging Face, Slack, Jira, Confluence, S3, GCS, Docker) uses the new subcommand style. +- Legacy provider flags (for example `--github-user`, `--gitlab-group`, `--bitbucket-workspace`, `--s3-bucket`) still work but now emit a deprecation warning to encourage migration to the new `kingfisher scan ` flow. +- Kept the direct `kingfisher scan /path/to/dir` flow for local filesystem / local git repo scans while adding a `--list-only` switch to each provider subcommand so repository enumeration no longer requires the standalone `github repos`, `gitlab repos`, etc. commands. +- Removed the legacy top-level provider commands (`kingfisher github`, `kingfisher gitlab`, `kingfisher gitea`, `kingfisher bitbucket`, `kingfisher azure`, `kingfisher huggingface`) now that enumeration lives under `kingfisher scan --list-only`. + +## [v1.59.0] +- Fixed `kingfisher scan github …` (and other provider-specific subcommands) so they no longer demand placeholder path arguments before the CLI accepts the request. +- Fixed `kingfisher scan` so that providing `--branch` without `--since-commit` now diffs the branch against the empty tree and scans every commit reachable from that branch. +- Added rules for meraki, duffel, finnhub, frameio, freshbooks, gitter, infracost, launchdarkly, lob, maxmind, messagebird, nytimes, prefect, scalingo, sendinblue, sentry, shippo, twitch, typeform + +- ## [v1.58.0] +- Added first-class Hugging Face scanning support, including CLI enumeration, token authentication, and integration with remote scans. +- Condensed GitError formatting to report the exit status and the first informative lines from stdout/stderr, producing concise git clone failure logs. +- Added support for scanning Google Cloud Storage buckets via `--gcs-bucket`, including optional prefixes and service-account authentication. +- Added `--skip-aws-account` (now accepting comma-separated values) and `--skip-aws-account-file` to bypass live AWS validation for known canary/honey-token account IDs without triggering alerts. Kingfisher now ships with several canary AWS account IDs pre-seeded in the skip list and now reports matching findings as "Not Attempted" with the "Response" containing "(skip list entry)" so it's clear that validation was intentionally skipped and why. + +## [v1.57.0] +- Added inline ignore directive detection to treat suppression tokens anywhere on surrounding lines, including multi-line handling +- Added a `--no-ignore` CLI flag to disable inline directives when you need every potential secret reported +- Added: repeatable `--ignore-comment ` flag to reuse inline directives from other scanners (for example `NOSONAR`, `kics-scan ignore`, `gitleaks:allow`, etc) +- Respect user color settings in update messages by using the same color helper as the main reporter, ensuring consistent output and no ANSI codes on update check, when color is disabled + +## [v1.56.0] +- Fixed tree-sitter scanning bug where passing --no-base64 caused errors to be printed when the file type couldn’t be determined + +## [v1.55.0] +- Added first-class Azure Repos support, including CLI commands, enumeration, and documentation updates +- Improved performance of tree-sitter parsing +- Updated Windows build script to ensure static binary is produced + +## [v1.54.0] +- Added first-class Gitea support, including CLI commands, environment-based authentication, documentation, and integration with scans and repository enumeration. +- Populate the finding path from git blob metadata so history-derived secrets display their file location instead of an empty path +- Replaced Match::finding_id’s SHA1-based hashing with a fast xxh3_64 digest that keeps IDs deterministic while eliminating a hot-path SHA1 dependency + +## [v1.53.0] +- Added first-class Bitbucket support, including CLI commands, authentication helpers, documentation, and integration testing. + +## [v1.52.0] +- Enabled ANSI formatting in the tracing formatter whenever stderr is attached to a terminal so colorized updater messages render correctly instead of showing escape sequences. +- Added a new CLI flag, `--user-agent-suffix` to allow developers to append additional information to the user-agent +- Removed the unused --rlimit-nofile flag + +## [1.51.0] +- Added diff-only Git scanning via `--since-commit` and `--branch`, including remote-aware ref resolution so CI jobs can pair `--git-url` clones with pull request branches + +## [1.50.0] +- Added `--github-exclude` and `--gitlab-exclude` options to skip specific repositories when scanning or listing GitHub and GitLab sources, including support for gitignore-style glob patterns + +## [1.49.0] +- Enabled MongoDB URI validation +- AWS + GCP validators now respect HTTPS_PROXY and share a consistent user agent across AWS, GCP, and HTTP validation +- Increase max-file-size default to 256 mb (up from 64 mb) +- Improved AWS rule + +## [1.48.0] +- Improved error message when self-update cannot find the current binary +- Optimized memory usage via string interning and extensive data sharing +- Replaced quadratic match filtering with a per-rule span map, fixing missed secrets in extremely large files and improving scan performance +- Support scanning extremely large files by chunking input into 1 GiB segments with small overlaps, avoiding vectorscan buffer limits while preserving match offsets +- Always use chunked vectorscan, eliminating the slow regex fallback for blobs over 4 GiB +- Skip Base64 scanning for blobs over 64 MB to avoid a second pass over massive files +- Increased max-file-size default to 64 MB (up from 25 MB) + +## [1.47.0] +- MongoDB validator now validates `mongodb+srv://` URIs with a fast timeout instead of skipping them +- Improved rules: github oauth2, diffbot, mailchimp, aws +- Added validation to SauceLabs rule +- Added rules: shodan, bitly, flickr +- Decode Base64 blobs and scan their contents for secrets while skipping short strings for performance. This has a small performance impact and can be disabled with `--no-base64` + +## [1.46.0] +- Improved rules: AWS, pem +- Added rule for Ollama, Weights and Biases, Cerebras, Friendli, Fireworks.ai, NVIDIA NIM, together.ai, zhipu +- Added `self-update` command to update the binary independently. Now supports updating over homebrew managed binary +- MongoDB validator now checks `mongodb+srv://` URIs with fast-fail timeouts + +## [1.45.0] +- Added `--repo-artifacts` flag to scan repository issues, gists/snippets, and wikis when cloning via `--git-url` +- Added rules for sendbird, mattermost, langchain, notion +- JWT validation hardened to reject alg:none by default (only allowed if explicitly configured), require iss for OIDC/JWKS verification, ensuring "Active Credential" means cryptographically verified and time-valid, not just unexpired +- Updated the Git cloning logic to include all refs and minimize clone output, allowing Kingfisher to analyze pull request and deleted branch history + +## [1.44.0] +- Fixed issue with self-update on Linux +- Reverted the change to json and jsonl outputs by rule +- Added `--skip-regex` and `--skip-word` flags to ignore secrets matching custom patterns or skipwords + +## [1.43.0] +- Added rules for clearbit, kickbox, azure container registry, improved Azure Storage key +- Grouped JSON and JSONL outputs by rule, restoring `matches` arrays in reports + +## [1.42.0] +- Fixed pagination issue when calling gitlab api +- Expanded directory exclusion handling to interpret plain patterns as prefixes, ensuring options like --exclude .git also skip all nested paths +- Updated baseline management to track encountered findings and remove entries that are no longer present, saving the baseline file whenever entries are pruned or new matches are added +- Added rules for authress, clickhouse, codecov, contentful, curl, dropbox, fly.io, hubspot, firecrawl +- Internal refactoring of rule loader, git enumerator, and filetype guesser +- Improved language detection + +## [1.41.0] +- Added support for scanning gitlab subgroups, with `kingfisher scan --gitlab-group my-group --gitlab-include-subgroups` +- Added rule for Vercel + +## [1.40.0] +- Dropped the “prevalidated” flag from rule definitions and validation logic so every finding now flows through the standard active/inactive/unknown pipeline, simplifying rule configuration and preventing special‑case bypasses +- Improved Tailscale api key detectors + +## [1.39.0] +- Added support for scanning Confluence pages via `--confluence-url` and `--cql` + +## [1.38.0] +- `--quiet` now suppresses scan summaries and rule statistics unless `--rule-stats` is explicitly provided +- Added X Consumer key detection and validation + +## [1.37.0] +- GitLab: Matched GitLab group repository listings to glab by only enumerating projects that belong directly to each group, without automatically traversing subgroups + +## [1.36.0] +- Fixed GitHub organization and GitLab group scans when using `--git-history=none` +- JWT tokens without both `iss` and `aud` are no longer reported as active credentials + +## [1.35.0] +- Remote scans with `--git-history=none` now clone repositories with a working tree and scan the current files instead of erroring with "No inputs to scan". +- Fixed issue where `--redact` did not function properly +- Fixed validation logic for clarifai rule + +## [1.34.0] +- Use system TLS root certificates to support self-hosted GitLab instances with internal CAs +- Added new rule: Coze personal access token +- Updated Supabase rule to detect project url's and validate their corresponding tokens + +## [1.33.0] +- Fixed header precedence so custom HTTP validation headers like `Accept` are preserved +- Added new Heroku rule + +## [1.32.0] +- Added support for scanning AWS S3 buckets via `--s3-bucket` and optional `--s3-prefix` +- Added `--role-arn` and `--aws-local-profile` flags for S3 authentication alongside `KF_AWS_KEY`/`KF_AWS_SECRET` +- Added progress bar for scanning s3 buckets +- Refactored output reporting and formatting logic + +## [1.31.0] +- New rules: Telegram bot token, OpenWeatherMap, Apify, Groq +- New OpenAI detectors added (@joshlarsen) +- Fixed bug that broke validation when using unnamed group captures + +## [1.30.0] +- Fixed validation caching for HTTP validators to include rendered headers so inactive secrets no longer appear active. +- Removed pre-commit installation hook, due to bugs + +## [1.29.0] +- Fixed issue when more than 1 named capture group is used in a rule variable +- Added a new liquid template filters: `b64dec` +- Added custom validator for Coinbase, and a Coinbase rule that uses it + +## [1.28.0] +- Added support for scanning Slack + +## [1.27.0] +- Added Buildkite rule +- Added support for scanning Docker images via `--docker-image` + +## [1.26.0] +- Added rule for ElevenLabs +- Added support for scanning Jira issues via a given JQL (Jira Query Language) + +## [1.25.0] +- Fixed GitLab authentication bug +- Added pre-commit and pre-receive installation hooks +- MongoDB validator now skips `mongodb+srv://` URIs and returns a message that validation was skipped +- Fixed noisy Baseten rule + +## [1.24.0] +- Now generating DEB and RPM packages +- Now releasing Docker images, and updated README +- Added rule for Scale, Deepgram, AssemblyAI + + +## [1.23.0] +- Updating GitHub Action to generate Docker image +- Added rules for Diffbot, ai21, baseten +- Fixed supabase rule +- Added 'alg' to JWT validation output + +## [1.22.0] +- Added rules for Google Gemini AI, Cohere, Stability.ai, Replicate, Runway, Clarifai +- Upgraded dependencies + +## [1.21.0] +- Improved Azure Storage rule +- Added rule to detect TravisCI encrypted values +- Added baseline feature with `--baseline-file` and `--manage-baseline` flags +- Introduced `--exclude` option for skipping paths +- Added tests covering baseline and exclude workflow +- Added validation for JWT tokens that checks `exp` and `nbf` claims +- JWT validation performs OpenID Connect discovery using the `iss` claim and verifies signatures via JWKS +- Removed `--ignore-tests` argument, because the `--exclude` flag provides more granular functionality +- DigitalOcean rule update +- Adafruit rule update + +## [1.20.0] +- Removed confirmation prompt when user provides --self-update flag +- Added support for HTTP request bodies in rule validation +- Added new liquid-rs filters: HmacSha1, IsoTimestampNoFracFilter, Replace +- Added rules for mistral, perplexity +- Added validation for Alibaba rule +- Set GIT_TERMINAL_PROMPT=0 when cloning git repos + +## [1.19.0] +- JSON output was missing committer name and email +- Fixed Gitlab rule which was incorrectly identifying certain tokens as valid + +## [1.18.1] +- Restored --version cli argument +- Added test for the argument + +## [1.18.0] +- Added rules for DeepSeek, xAI +- Removed branding +- Added NOTICE file + +## [1.17.1] +- Fixed broken sourcegraph rule +- Added test to prevent this and similar issues + +## [1.17.0] +- Updated README to give proper attribution to Nosey Parker! +- Added rules for sonarcloud, sonarqube, sourcegraph, shopify, truenas, square, sendgrid, nasa, teamcity, truenas, shopify +- Introduced `--ignore-tests` flag – skip files/dirs whose path resembles tests (`test`, `spec`, `fixture`, `example`, `sample`), reducing noise. +## [1.16.0] +- Fix: HTML detection now requires both HTML content-type and " [credential_file]` + This reads a credential artifact from disk and maps it directly. + +> Access mapping runs additional network requests. Only use it when you are authorized to inspect the target account/workspace. + +## How Access Map Works + +### Standalone Flow + +```mermaid +flowchart LR + CLI[kingfisher access-map] --> Args[Provider and credential input] + Args --> Dispatch[Provider dispatch] + Dispatch --> Provider[Provider mapper] + Provider --> APIs[Provider APIs] + APIs --> Result[AccessMapResult] + Result --> JSON[JSON stdout or file] + Result --> HTML[Optional HTML report] +``` + +### Scan-Time Flow + +```mermaid +flowchart LR + Scan[kingfisher scan --access-map] --> Detect[Detect findings] + Detect --> Validate[Validate supported credentials] + Validate --> Collect[AccessMapCollector] + Collect --> Requests[AccessMapRequest values] + Requests --> Map[access_map::map_requests] + Map --> Results[AccessMapResult values] + Results --> Report[Report and viewer output] +``` + +### Provider Dispatch Model + +```mermaid +flowchart TD + Request[Access map request] --> Kind{Credential kind} + + Kind --> Token[Single token providers] + Kind --> Complex[Structured credential providers] + + Token --> Trait[TokenAccessMapper] + Trait --> Modules[GitHub GitLab Slack Gitea Bitbucket and similar providers] + + Complex --> Custom[Custom provider mapping] + Custom --> ComplexModules[AWS GCP Azure Postgres MongoDB and other multi-field providers] + + Modules --> Result[AccessMapResult] + ComplexModules --> Result +``` + +## What “supported tokens” means + +Access map only runs for credential types Kingfisher knows how to authenticate with and enumerate. In the codebase, these map to `AccessMapRequest` variants recorded from validated findings (see `src/scanner/validation.rs`). + +## Providers and supported credential formats + +### GitHub (`github`) + +- **Credential**: a single GitHub token string (read from a file for `kingfisher access-map github `). +- **Token types supported**: any token accepted by GitHub’s REST API `Authorization` scheme used by Kingfisher (`Authorization: token `), including: + - Classic PATs (commonly `ghp_...`) + - Fine-grained PATs (commonly `github_pat_...`) + - OAuth / user tokens (various prefixes; GitHub controls these) + - GitHub App tokens (Kingfisher detects `ghu_...` and `ghs_...` and uses the installations APIs for richer mapping) + +#### Standalone example (GitHub) + +```bash +printf '%s' 'ghp_example...' > ./github.token +kingfisher access-map github ./github.token --json-out github.access-map.json +``` + +#### Notes (GitHub) + +- Access map currently uses `https://api.github.com` as the API base. + +### GitLab (`gitlab`) + +- **Credential**: a single GitLab token string (read from a file for `kingfisher access-map gitlab `). +- **Token types supported**: any token accepted by GitLab’s `PRIVATE-TOKEN` header (PATs like `glpat-...`, plus other GitLab token types that work with that header). + When available, Kingfisher also queries the token-self endpoint for metadata; some token types may not expose token details there. + +#### Standalone example (GitLab) + +```bash +printf '%s' 'glpat-example...' > ./gitlab.token +kingfisher access-map gitlab ./gitlab.token --json-out gitlab.access-map.json +``` + +#### Notes (GitLab) + +- Access map currently uses `https://gitlab.com/api/v4/` as the API base. + +### Slack (`slack`) + +- **Credential**: a single Slack token string (read from a file for `kingfisher access-map slack `). +- **Token types supported**: tokens accepted by Slack Web API with `Authorization: Bearer ` (for example `xoxp-...`, `xoxb-...`, etc.). + Kingfisher derives scopes from the `x-oauth-scopes` response header when Slack returns it. + +#### Standalone example (Slack) + +```bash +printf '%s' 'xoxp-example...' > ./slack.token +kingfisher access-map slack ./slack.token --json-out slack.access-map.json +``` + +### AWS (`aws`) + +- **Credential**: AWS access key credentials. +- **Supported formats for `kingfisher access-map aws `**: + - **JSON object** with case-insensitive support for the following keys: + - `access_key_id` / `accessKeyId` / `aws_access_key_id` / `AccessKeyId` + - `secret_access_key` / `secretAccessKey` / `aws_secret_access_key` / `SecretAccessKey` + - optional `session_token` / `sessionToken` / `aws_session_token` / `SessionToken` + - **Key/value file** containing `KEY=VALUE` lines (comments allowed with `#`), supporting: + - `aws_access_key_id` or `access_key_id` + - `aws_secret_access_key` or `secret_access_key` + - optional `aws_session_token` or `session_token` + +#### Standalone examples (AWS) + +```bash +cat > ./aws.json <<'EOF' +{ + "access_key_id": "AKIA....", + "secret_access_key": "....", + "session_token": "...." +} +EOF + +kingfisher access-map aws ./aws.json --json-out aws.access-map.json +``` + +```bash +cat > ./aws.env <<'EOF' +aws_access_key_id=AKIA.... +aws_secret_access_key=.... +aws_session_token=.... +EOF + +kingfisher access-map aws ./aws.env --json-out aws.access-map.json +``` + +Kingfisher performs read-only enumeration for the IAM principal and, when allowed by the credential, visible resources in several common AWS services including S3, EC2, IAM, Lambda, DynamoDB, KMS, Secrets Manager, SQS, SNS, RDS, ECR, and SSM Parameter Store. + +### GCP (`gcp`) + +- **Credential**: a Google Cloud **service account key JSON** file. + +#### Standalone example (GCP) + +```bash +kingfisher access-map gcp ./service-account.json --json-out gcp.access-map.json +``` + +### Azure Storage (`azure`) + +- **Credential**: a JSON file containing: + - `storage_account` (string) + - `storage_key` (string, base64-encoded account key as provided by Azure) + +#### Standalone example (Azure Storage) + +```bash +cat > ./azure-storage.json <<'EOF' +{ + "storage_account": "mystorageacct", + "storage_key": "base64==" +} +EOF + +kingfisher access-map azure ./azure-storage.json --json-out azure.access-map.json +``` + +Kingfisher treats the account key as full-control Storage credentials and performs best-effort enumeration across Blob containers, File shares, and Queue resources reachable with that key. + +### Azure DevOps (scan `--access-map` only) + +Azure DevOps access mapping is supported when a **validated Azure DevOps PAT** is discovered during scanning (the access-map record includes both the PAT and the organization). At the moment, there is **no standalone** `kingfisher access-map azure-devops ...` provider flag. + +### PostgreSQL (`postgres`) + +- **Credential**: a single Postgres connection URI string (read from a file). + +#### Standalone example (Postgres) + +```bash +printf '%s' 'postgres://user:pass@db.example.com:5432/mydb' > ./postgres.uri +kingfisher access-map postgres ./postgres.uri --json-out postgres.access-map.json +``` + +### MongoDB (`mongodb` / `mongo`) + +- **Credential**: a single MongoDB connection URI string (read from a file), including `mongodb+srv://...` URIs. + +#### Standalone example (MongoDB) + +```bash +printf '%s' 'mongodb+srv://user:pass@cluster.example.net/?retryWrites=true&w=majority' > ./mongodb.uri +kingfisher access-map mongodb ./mongodb.uri --json-out mongodb.access-map.json +``` + +### Hugging Face (`huggingface` / `hf`) + +- **Credential**: a single Hugging Face token string (read from a file for `kingfisher access-map huggingface `). +- **Token types supported**: tokens accepted by the Hugging Face API with `Authorization: Bearer `, including: + - User access tokens (commonly `hf_...`) + - Organization API tokens (commonly `api_org_...`) + +Kingfisher queries the `/api/whoami-v2` endpoint to resolve the token identity, role, and organization memberships. It also performs best-effort enumeration of authored models, datasets, and Spaces for the user and visible organizations to assess the blast radius. + +#### Standalone example (Hugging Face) + +```bash +printf '%s' 'hf_example...' > ./huggingface.token +kingfisher access-map huggingface ./huggingface.token --json-out huggingface.access-map.json +``` + +#### Notes (Hugging Face) + +- Access map uses `https://huggingface.co/api` as the API base. +- Token role (read, write, admin, fineGrained) is derived from the `auth` section of the whoami response when available. + +### Gitea (`gitea`) + +- **Credential**: a single Gitea token string (read from a file for `kingfisher access-map gitea `). +- **Token types supported**: any token accepted by Gitea's `Authorization: token ` header (personal access tokens). + +Kingfisher queries `/api/v1/user` for identity, enumerates organizations via `/api/v1/user/orgs`, and lists accessible repositories via `/api/v1/user/repos`. Repository-level permissions (admin, push, pull) are used to classify risk. + +#### Standalone example (Gitea) + +```bash +printf '%s' 'your_gitea_pat...' > ./gitea.token +kingfisher access-map gitea ./gitea.token --json-out gitea.access-map.json +``` + +#### Notes (Gitea) + +- Access map currently uses `https://gitea.com/api/v1/` as the default API base. +- If the token belongs to a site administrator, severity is classified as Critical. + +### Bitbucket (`bitbucket`) + +- **Credential**: a single Bitbucket token string (read from a file for `kingfisher access-map bitbucket `). +- **Token types supported**: tokens accepted by Bitbucket Cloud's `Authorization: Bearer ` header (OAuth access tokens, app passwords, repository access tokens). + +Kingfisher queries `/2.0/user` for identity, enumerates workspace memberships and permissions via `/2.0/user/permissions/workspaces`, and lists accessible repositories via `/2.0/repositories?role=member`. Workspace ownership and private repository access are used to classify risk. + +#### Standalone example (Bitbucket) + +```bash +printf '%s' 'your_bitbucket_token...' > ./bitbucket.token +kingfisher access-map bitbucket ./bitbucket.token --json-out bitbucket.access-map.json +``` + +#### Notes (Bitbucket) + +- Access map uses `https://api.bitbucket.org/2.0` as the API base. +- Workspace owners are classified as High severity. + +### Buildkite (`buildkite`) + +- **Credential**: a single Buildkite API token string (read from a file for `kingfisher access-map buildkite `). +- **Token types supported**: tokens accepted by Buildkite's REST API with `Authorization: Bearer ` (API access tokens, commonly `bkua_...`). + +Kingfisher queries `/v2/access-token` for token metadata and scopes, `/v2/user` for identity, `/v2/organizations` for organization memberships, and `/v2/organizations/{org}/pipelines` for pipeline enumeration. Token scopes and organization access are used to classify risk. + +#### Standalone example (Buildkite) + +```bash +printf '%s' 'bkua_example...' > ./buildkite.token +kingfisher access-map buildkite ./buildkite.token --json-out buildkite.access-map.json +``` + +#### Notes (Buildkite) + +- Access map uses `https://api.buildkite.com/v2` as the API base. +- Tokens with `write_organizations` or `write_teams` scopes are classified as High severity. + +### Harness (`harness`) + +- **Credential**: a single Harness API key / personal access token (PAT) string (read from a file for `kingfisher access-map harness `). +- **Auth header**: Harness APIs authenticate via `x-api-key: ` (see the Harness API docs). + +Kingfisher performs best-effort, read-only enumeration: + +- Queries the API key aggregate endpoint for basic token metadata (when available). +- Enumerates organizations via `GET https://app.harness.io/v1/orgs` and projects via `GET https://app.harness.io/v1/orgs/{org}/projects` when the key has permission. + +If organizations/projects are not enumerable (scope-limited keys), Kingfisher still produces an access-map record with a conservative severity and a note explaining the limitation. + +#### Standalone example (Harness) + +```bash +printf '%s' 'pat.example...' > ./harness.token +kingfisher access-map harness ./harness.token --json-out harness.access-map.json +``` + +#### Notes (Harness) + +- Access map uses `https://app.harness.io` as the API base. + +### OpenAI (`openai`) + +- **Credential**: a single OpenAI API key string (read from a file for `kingfisher access-map openai `). +- **Token types supported**: OpenAI keys accepted by `Authorization: Bearer ` (for example `sk-...`, `sk-proj-...`, `sk-svcacct-...`). + +Kingfisher performs read-only scope probing and best-effort resource enumeration via: + +- `GET https://api.openai.com/v1/models` to verify Models API read access and enumerate visible models. +- `GET https://api.openai.com/v1/me` for token identity metadata when available. +- `GET https://api.openai.com/v1/organization/projects` for project visibility when the key has permission. +- `GET https://api.openai.com/v1/files` to enumerate visible uploaded files when the key has file-list access. +- `GET https://api.openai.com/v1/assistants` to enumerate visible assistants when the key has assistant read access. +- `GET https://api.openai.com/v1/fine_tuning/jobs` to enumerate visible fine-tuning jobs when the key has fine-tuning read access. + +#### Standalone example (OpenAI) + +```bash +printf '%s' 'sk-example...' > ./openai.token +kingfisher access-map openai ./openai.token --json-out openai.access-map.json +``` + +#### Notes (OpenAI) + +- Access map uses `https://api.openai.com/v1` as the API base. + +### Anthropic (`anthropic`) + +- **Credential**: a single Anthropic API key string (read from a file for `kingfisher access-map anthropic `). +- **Token types supported**: Anthropic keys accepted via `x-api-key`, including standard API keys and admin-style keys when exposed by Anthropic. + +Kingfisher performs read-only enumeration via: + +- `GET https://api.anthropic.com/v1/models` to enumerate visible models. +- `GET https://api.anthropic.com/v1/organizations/api_keys/me` or `GET https://api.anthropic.com/v1/api_keys/me` to introspect the current key when supported. +- `GET https://api.anthropic.com/v1/organizations/api_keys` to enumerate visible organization API keys when the credential can access them. + +#### Standalone example (Anthropic) + +```bash +printf '%s' 'sk-ant-api-example...' > ./anthropic.token +kingfisher access-map anthropic ./anthropic.token --json-out anthropic.access-map.json +``` + +#### Notes (Anthropic) + +- Access map uses `https://api.anthropic.com/v1` as the API base. +- Keys that can enumerate organization API keys are treated as having broader administrative visibility. + +### Salesforce (`salesforce`) + +- **Credential**: Salesforce access token plus instance domain. +- **Supported standalone formats** for `kingfisher access-map salesforce `: + - JSON: + - `token` (or `access_token`) + - `instance_url` (or `instance`), such as `https://mydomain.my.salesforce.com` + - Free-form text containing both: + - a Salesforce access token (`00...!...`) + - an instance host (`.my.salesforce.com`) + +Kingfisher performs read-only enumeration via: + +- `GET /services/data/v60.0/limits` to confirm API access and gather account-level API context. +- `GET /services/oauth2/userinfo` for identity metadata when available. +- `GET /services/data/v60.0/sobjects` for visible object metadata (best-effort). + +#### Standalone example (Salesforce) + +```bash +cat > ./salesforce.json <<'EOF' +{ + "token": "00DE0X0A0M0PeLE!AQcAQH0dMHEXAMPLE...", + "instance_url": "https://mydomain.my.salesforce.com" +} +EOF + +kingfisher access-map salesforce ./salesforce.json --json-out salesforce.access-map.json +``` + +#### Notes (Salesforce) + +- Access map currently targets `https://.my.salesforce.com` and API version `v60.0`. + +### Weights & Biases (`weightsandbiases` / `wandb`) + +- **Credential**: a single Weights & Biases API key string (read from a file for `kingfisher access-map weightsandbiases `). +- **Token types supported**: + - Legacy 40-character hex API keys + - New v1 keys (`wandb_v1_...`) + +Kingfisher performs read-only identity resolution via: + +- `POST https://api.wandb.ai/graphql` with a GraphQL `viewer` query. + +#### Standalone example (Weights & Biases) + +```bash +printf '%s' 'wandb_v1_example...' > ./wandb.token +kingfisher access-map weightsandbiases ./wandb.token --json-out wandb.access-map.json +``` + +#### Notes (Weights & Biases) + +- Access map uses `https://api.wandb.ai/graphql` as the API endpoint. +- W&B key introspection does not currently expose fine-grained scopes in this workflow, so risk is reported conservatively. + +### Microsoft Teams (`microsoftteams` / `msteams`) + +- **Credential**: a Microsoft Teams Incoming Webhook URL (read from a file for `kingfisher access-map microsoftteams `). +- **Webhook types supported**: + - Legacy Incoming Webhooks (`*.office.com/webhook/...`) + - Workflow-based webhooks (`*.webhook.office.com/webhookb2/...`) + +Kingfisher parses the webhook URL to extract the tenant ID and webhook identity, then sends a benign probe (`{"text":""}`) to determine whether the webhook is still active. Active webhooks can post messages to the configured Teams channel. + +#### Standalone example (Microsoft Teams) + +```bash +printf '%s' 'https://contoso.webhook.office.com/webhookb2/...' > ./teams.webhook +kingfisher access-map microsoftteams ./teams.webhook --json-out teams.access-map.json +``` + +#### Notes (Microsoft Teams) + +- The webhook URL is the credential — it contains the tenant ID and grants write access to a single Teams channel. +- Access map severity is Medium for active webhooks (write-only to one channel) and Low for inactive/removed webhooks. +- The probe request does not post any visible message; Teams responds with HTTP 400 "Text is required" for valid endpoints. + +## Notes on access-map generation during `scan --access-map` + +- Access-map entries are only recorded for **validated** findings. +- Some providers require extra context that Kingfisher infers from the finding context or validation response (for example, Azure DevOps organization name). +- Validated Hugging Face, Gitea, Bitbucket, Buildkite, Harness, OpenAI, Anthropic, Salesforce, Weights & Biases, and Microsoft Teams credentials discovered during scans with `--access-map` are automatically collected and mapped, matching the existing behavior for other platforms. diff --git a/docs-site/docs/features/agents.md b/docs-site/docs/features/agents.md new file mode 100644 index 0000000..ff75282 --- /dev/null +++ b/docs-site/docs/features/agents.md @@ -0,0 +1,121 @@ +--- +title: "LLM & Agent Integration" +description: "Use Kingfisher with LLMs and AI agents. TOON output format for token-efficient scanning, prompt redaction, and structured output for automated workflows." +--- + +# LLM & Agent Integration + +Kingfisher is designed to work seamlessly with LLMs and AI agent workflows. Whether you're building an automated security pipeline, using an AI coding assistant, or need to redact secrets from prompts before sending them to an LLM, Kingfisher has you covered. + +## TOON Output Format + +The **TOON** (Token-Optimized Output Notation) format is purpose-built for LLM consumption. It produces a flattened, token-efficient output that's easy for AI models to parse and reason about. + +```bash +# Use TOON format for LLM-friendly output +kingfisher scan /path/to/code --format toon +``` + +TOON is also available for `validate` and `revoke` subcommands: + +```bash +kingfisher validate --rule github "ghp_xxx" --format toon +kingfisher revoke --rule slack "xoxb-..." --format toon +``` + +!!! tip "When to use TOON" + Prefer `--format toon` when calling Kingfisher from an LLM or agent. + It uses fewer tokens than JSON while retaining all essential information, + and its flat row-based structure is easier for models to process than deeply nested JSON. + +## JSON Output for Agents + +For agents that need structured data for programmatic processing, JSON works well: + +```bash +# JSON output for structured processing +kingfisher scan /path/to/code --format json --output findings.json + +# JSONL for streaming line-by-line processing +kingfisher scan /path/to/code --format jsonl +``` + +## Redacting Secrets from LLM Prompts + +A key use case is scanning text for secrets **before** sending it to an LLM. This prevents accidentally leaking credentials through AI prompts: + +```bash +# Pipe text through Kingfisher to check for secrets before sending to an LLM +cat prompt.txt | kingfisher scan - --format toon --no-validate +``` + +If Kingfisher finds secrets, your agent can redact them before forwarding the text. + +## CI/CD Integration with Agents + +Combine Kingfisher with your CI/CD pipeline and agent workflows: + +```bash +# Scan only staged changes (pre-commit) +kingfisher scan . --staged --quiet --no-update-check + +# Scan changes since a branch point (CI) +kingfisher scan . --since-commit origin/main --format json + +# Exit codes for automated decision-making: +# 0 = no findings +# 200 = findings discovered +# 205 = validated (live) findings discovered +``` + +## Available Output Formats + +| Format | Best For | Flag | +|--------|----------|------| +| **TOON** | LLM/agent consumption | `--format toon` | +| **JSON** | Structured processing | `--format json` | +| **JSONL** | Streaming/line processing | `--format jsonl` | +| **SARIF** | IDE and GitHub integration | `--format sarif` | +| **HTML** | Human review/audit reports | `--format html` | +| **Pretty** | Terminal output (default) | `--format pretty` | + +## Embedding in Rust Applications + +For deep integration, use Kingfisher as a library in your Rust-based agent: + +```rust +use kingfisher_scanner::ScannerBuilder; +use kingfisher_rules::RuleDatabase; + +// Build a scanner with default rules +let rules = RuleDatabase::from_default_rules()?; +let scanner = ScannerBuilder::new(&rules).build()?; + +// Scan a string +let findings = scanner.scan_blob("my text with secrets")?; +``` + +See [Rust Library Crates](../reference/library.md) for complete documentation. + +## Python Integration + +Kingfisher is available as a Python package for integration with Python-based agent frameworks: + +```bash +uv tool install kingfisher-bin +``` + +Then call it from your Python agent: + +```python +import subprocess +import json + +result = subprocess.run( + ["kingfisher", "scan", "-", "--format", "json", "--no-validate"], + input=user_prompt, + capture_output=True, + text=True, +) +findings = json.loads(result.stdout) if result.stdout else [] +``` diff --git a/docs-site/docs/features/fingerprints.md b/docs-site/docs/features/fingerprints.md new file mode 100644 index 0000000..88226ba --- /dev/null +++ b/docs-site/docs/features/fingerprints.md @@ -0,0 +1,79 @@ +--- +title: "Finding Fingerprints" +description: "Stable fingerprints for deduplication and tracking of discovered secrets across scans." +--- + +# Finding Fingerprints + +Every reported finding carries a **64-bit fingerprint** that acts as a stable, privacy-safe ID. +It lets the scanner **deduplicate** repeated hits of the *same logical issue* while still treating different locations as distinct. + +```bash +🔓 AWS SECRET ACCESS KEY => [KINGFISHER.AWS.2] + |Finding.......: 4HKmwiS1GzI[...]2TF6zYz7 + |Fingerprint...: 14085685380484734428 + |Confidence....: medium + |Entropy.......: 5.12 +[...] + +``` +--- + +### How the *reported* fingerprint is calculated + +1. **Finding Bytes** – the matched finding pattern + +2. **Origin label** – one of + *`"git"`*, *`"file"`*, *`"ext"`*, identifying whether the hit came from a Git + history, a plain on-disk file, or an extended source. + +3. **Byte offsets** – `offset_start` and `offset_end`, the exact byte range of + the match inside the blob/file (little-endian `u64` each). + +Those four fields are concatenated: + +```bash +< finding_bytes> + + + +``` + +The resulting buffer is hashed with **XXH3-64**, producing a single unsigned-64 value: + +```bash +finding-bytes + origin + start-offset + end-offset -> XXH3-64 -> finding_fingerprint +``` + + +This fingerprint is what you see reported in the finding output. + +--- + +### Why the rule’s SHA-1 is used (and not the secret) + +The fingerprint is a [XXH3-64](https://github.com/Cyan4973/xxHash) hash of the following components concatenated together: + +* The content of the matched secret. +* A coarse-grained origin label (`git`, `file`, or `ext`). +* The start and end byte-offsets of the match. + +This content-aware approach provides several benefits: + +| Reason | Benefit | +| --------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| **Accurate Secret Tracking** | If a key is rotated (e.g., from `AKIA…AAA` to `AKIA…BBB`), the new key correctly receives a new fingerprint. This allows for precise tracking of a secret's lifecycle. | +| **Location Uniqueness** | Because byte offsets are part of the hash, two identical secrets found on different lines will have separate fingerprints. | +| **Privacy-Safe by Design** | The fingerprint is a one-way hash, not the raw secret itself. This prevents sensitive credential data from being exposed in reports and logs. | +| **Light-weight Origin** | Using a coarse origin label (`git`, `file`, etc.) avoids fingerprint churn across commits while still separating findings from different types of scans. | + +This method ensures that every unique secret is tracked precisely, providing a clear and accurate picture of sensitive data exposure. + +--- +### Controlling deduplication + +By default the CLI **deduplicates** findings that share the same fingerprint, so you see only one entry even if the secret appears in multiple commits. + + +If you want to see **every individual occurrence**, run with `--no-dedup`: + +```bash +kingfisher scan /path/to/repo --no-dedup +``` \ No newline at end of file diff --git a/docs-site/docs/features/parsing.md b/docs-site/docs/features/parsing.md new file mode 100644 index 0000000..fc90e8d --- /dev/null +++ b/docs-site/docs/features/parsing.md @@ -0,0 +1,47 @@ +--- +title: "Source Code Parsing" +description: "Language-aware secret detection using tree-sitter parsing for 13+ languages including Python, JavaScript, Go, Rust, and more." +--- + +# Kingfisher Source Code Parsing + +Kingfisher leverages tree-sitter as an extra layer of analysis when scanning source files written in supported programming languages. In practice, after its initial regex-based scan (powered by Vectorscan/Hyperscan), Kingfisher can run a targeted verification pass for context-dependent rules. + +If so, it creates a Checker (see below) that uses tree‐sitter to parse the file and run language‐specific queries. This additional pass refines the detection by capturing more structured patterns—such as secret-like tokens—that might be obscured or spread over code constructs. + +## How It’s Called + +In the scanning phase (in the Matcher's implementation), Kingfisher does the following: + +- **Primary Regex Pass:** Kingfisher always scans the full blob with Vectorscan/Hyperscan first. +- **Candidate Selection:** Findings from rules classified as context-dependent become tree-sitter verification candidates. +- **Language Detection:** If a language string is provided (for example from metadata or extension), the code calls a helper (such as `get_language_and_queries`) to retrieve the corresponding tree-sitter language and queries. +- **Checker Creation:** With those values, a `Checker` is instantiated with the target language and query map. +- **Parsing and Querying:** The Checker retrieves a thread-local parser (to avoid recreating it on every call), sets language, parses source, and runs queries to extract structured snippets (for example `key = value` pairs). +- **Verification Decision:** Candidate findings are kept only if parser-extracted context verifies the matched secret. If tree-sitter is unavailable, fallback behavior is profile-driven (for strict generic keyword+token rules, findings are suppressed). + *(See the implementation details in the parser module – for example, the `modify_regex` function in the Checker, and the conditional tree‐sitter call in Matcher::scan_blob)* + +## Supported Languages + +The design supports many common source code languages. The Language enum (defined in the parser module) includes variants for: + +- **Scripting:** Bash, Python, Ruby, PHP +- **Compiled languages:** C, C++, C#, Rust, Java +- **Web-related languages:** CSS, HTML, JavaScript, TypeScript, YAML, Toml +- **Others:** Go, and even a generic “Regex” mode + +Each variant maps to its corresponding tree‐sitter language through the `get_ts_language()` method. + +## When Tree‐sitter Is Not Called + +Tree‐sitter won’t be invoked in certain cases: + +- **No Language Identified:** If the file isn’t recognized as belonging to one of the supported languages or no language hint is provided, the Checker isn’t even constructed. +- **Non-source Files:** Binary files or files that aren’t expected to contain code (or aren’t extracted from archives) bypass tree‐sitter parsing. +- **Fallback on Errors:** If tree‐sitter parsing fails (e.g. due to malformed code or other errors), Kingfisher will fall back on its regex/Vectorscan matches without the additional tree‐sitter insights. + +## Summary + +In essence, Kingfisher’s use of tree‐sitter is conditional and complementary. It is called only when the scanned file is a source code file written in a supported language, and its role is to enrich the scanning results by leveraging the syntax tree and language-specific queries. When files are non-source, binary, or if no language is provided, tree‐sitter is not invoked, and Kingfisher relies solely on its regex-based detection. + +This layered approach helps improve the accuracy of secret detection while maintaining high performance. diff --git a/docs-site/docs/features/revocation.md b/docs-site/docs/features/revocation.md new file mode 100644 index 0000000..9741f6f --- /dev/null +++ b/docs-site/docs/features/revocation.md @@ -0,0 +1,47 @@ +--- +title: "Secret Revocation" +description: "Revoke compromised credentials directly from the CLI. Supports 20+ providers including GitHub, GitLab, Slack, AWS, and GCP." +--- + +# Revocation Support Matrix + +Kingfisher supports direct secret revocation through rule-level `revocation:` blocks. + +Current coverage in built-in rules: +- `23` provider families +- `39` revocation-enabled rules + +Use `kingfisher revoke --rule ` to invoke these flows. See [USAGE.md](../usage/basic-scanning.md#direct-secret-revocation-with-kingfisher-revoke) for command details. + +## Supported Providers + +| Provider | Revocation Rule Count | Rule IDs | +|---|---:|---| +| `aws` | 1 | `kingfisher.aws.2` | +| `browserstack` | 1 | `kingfisher.browserstack.1` | +| `buildkite` | 1 | `kingfisher.buildkite.1` | +| `cloudflare` | 1 | `kingfisher.cloudflare.1` | +| `confluent` | 2 | `kingfisher.confluent.2`, `kingfisher.confluent.3` | +| `deviantart` | 1 | `kingfisher.deviantart.1` | +| `doppler` | 6 | `kingfisher.doppler.1`, `kingfisher.doppler.2`, `kingfisher.doppler.3`, `kingfisher.doppler.4`, `kingfisher.doppler.5`, `kingfisher.doppler.6` | +| `gcp` | 1 | `kingfisher.gcp.1` | +| `github` | 3 | `kingfisher.github.1`, `kingfisher.github.2`, `kingfisher.github.5` | +| `gitlab` | 2 | `kingfisher.gitlab.1`, `kingfisher.gitlab.4` | +| `harness` | 1 | `kingfisher.harness.pat.1` | +| `mapbox` | 1 | `kingfisher.mapbox.2` | +| `mongodb` | 1 | `kingfisher.mongodb.1` | +| `npm` | 2 | `kingfisher.npm.1`, `kingfisher.npm.2` | +| `particle.io` | 2 | `kingfisher.particleio.1`, `kingfisher.particleio.2` | +| `sendgrid` | 1 | `kingfisher.sendgrid.1` | +| `slack` | 2 | `kingfisher.slack.1`, `kingfisher.slack.2` | +| `sumologic` | 1 | `kingfisher.sumologic.2` | +| `tailscale` | 1 | `kingfisher.tailscale.1` | +| `twilio` | 1 | `kingfisher.twilio.2` | +| `twitch` | 1 | `kingfisher.twitch.1` | +| `unkey` | 1 | `kingfisher.unkey.2` | +| `vercel` | 5 | `kingfisher.vercel.1`, `kingfisher.vercel.2`, `kingfisher.vercel.3`, `kingfisher.vercel.4`, `kingfisher.vercel.5` | + +## Notes + +- Coverage above is derived from built-in YAML rules under `crates/kingfisher-rules/data/rules/` that currently define a `revocation:` block. +- A provider may have additional detection/validation rules that do not yet support revocation. diff --git a/docs-site/docs/getting-started/installation.md b/docs-site/docs/getting-started/installation.md new file mode 100644 index 0000000..35c36b1 --- /dev/null +++ b/docs-site/docs/getting-started/installation.md @@ -0,0 +1,436 @@ +--- +title: "Installation" +description: "Install Kingfisher via Homebrew, PyPI, Docker, install scripts, or compile from source. Includes pre-commit hook setup." +--- + +# Installation Guide + +This guide covers all installation methods for Kingfisher, including pre-commit hook setup. + +## Table of Contents + +- [Pre-built Releases](#pre-built-releases) +- [Homebrew](#homebrew) +- [Linux and macOS](#linux-and-macos) +- [Windows](#windows) +- [Pre-commit Hooks](#pre-commit-hooks) + - [macOS and Linux](#macos-and-linux) + - [Windows PowerShell](#windows-powershell) + - [Using the pre-commit Framework](#using-the-pre-commit-framework) + - [Using Husky (Node.js projects)](#using-husky-nodejs-projects) +- [Compile from Source](#compile-from-source) +- [PyPI Wheels](#pypi-wheels) +- [Run Kingfisher in Docker](#run-kingfisher-in-docker) + +## Pre-built Releases + +Pre-built binaries are available from the [Releases](https://github.com/mongodb/kingfisher/releases) section. + +## Homebrew + +![Homebrew Formula Version](https://img.shields.io/homebrew/v/kingfisher) + +```bash +brew install kingfisher +``` + +## Linux and macOS + +Use the bundled installer script to fetch the latest release and place it in +`~/.local/bin` (or a directory of your choice): + +```bash +# Linux, macOS +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher.sh | \ + bash +``` + +To install into a custom location, pass the desired directory as an argument: + +```bash +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher.sh | \ + bash -s -- /opt/kingfisher +``` + +To install a specific tag: + +```bash +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher.sh | \ + bash -s -- --tag v1.71.0 +``` + +## Windows + +Download and run the PowerShell installer to place the binary in +`$env:USERPROFILE\bin` (or another directory you specify): + +```powershell +# Windows +Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force +Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher.ps1' -OutFile install-kingfisher.ps1 +./install-kingfisher.ps1 +``` + +The installer auto-detects your Windows architecture and downloads the matching +release artifact (`windows-x64` or `windows-arm64`). + +You can provide a custom destination using the `-InstallDir` parameter: + +```powershell +./install-kingfisher.ps1 -InstallDir 'C:\Tools\Kingfisher' +``` + +To install a specific tag: + +```powershell +./install-kingfisher.ps1 -Tag v1.71.0 +``` + +To explicitly override architecture selection: + +```powershell +./install-kingfisher.ps1 -Arch arm64 +``` + +## Pre-commit Hooks + +Install a Git pre-commit hook to block commits that introduce new secrets. + +The installer: + +- Preserves any existing `pre-commit` hook by chaining it **before** Kingfisher. +- Supports custom hook directories via `--hooks-path` (or Git's `core.hooksPath`). +- Can be installed either **per-repository** or as a **global** hook. + +### macOS and Linux + +Install a **per-repository** hook from the root of the repo you want to protect: + +```bash +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher-pre-commit.sh | \ + bash +``` + +Uninstall from that repository: + +```bash +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher-pre-commit.sh | \ + bash -s -- --uninstall +``` + +Install as a **global** pre-commit hook (using core.hooksPath): + +```bash +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher-pre-commit.sh | \ + bash -s -- --global +``` + +Uninstall the **global** hook: + +```bash +curl --silent --location \ + https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher-pre-commit.sh | \ + bash -s -- --global --uninstall +``` + +### Windows PowerShell + +Install a **per-repository** hook from the root of the target repo: + +```powershell +Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force +Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher-pre-commit.ps1' -OutFile install-kingfisher-pre-commit.ps1 +./install-kingfisher-pre-commit.ps1 +``` + +Uninstall from that repository: + +```powershell +./install-kingfisher-pre-commit.ps1 -Uninstall +``` + +Install as a **global** hook (using core.hooksPath): + +```powershell +./install-kingfisher-pre-commit.ps1 -Global +``` + +Uninstall the **global** hook: + +```powershell +./install-kingfisher-pre-commit.ps1 -Global -Uninstall +``` + +> The installer automatically runs any existing `pre-commit` hook first, then +> executes `kingfisher scan . --staged --quiet --no-update-check` +> against the staged diff (anchored to `HEAD` when no commits exist yet). + +### Using the `pre-commit` Framework + +Add Kingfisher as a hook in your `.pre-commit-config.yaml`: + +```yaml +repos: + - repo: https://github.com/mongodb/kingfisher + rev: + hooks: + # Recommended: Auto-downloads and caches the binary - no manual install or Docker required + - id: kingfisher-auto + + # Alternative: Runs Kingfisher from Docker (requires Docker) + - id: kingfisher-docker + + # Alternative: Uses locally installed Kingfisher (fastest, requires manual install) + - id: kingfisher +``` + +**Available hooks:** + +| Hook ID | Description | Requirements | +| ------- | ----------- | ------------ | +| `kingfisher-auto` | Automatically downloads and caches the appropriate binary for your platform | curl, tar (or unzip on Windows) | +| `kingfisher-docker` | Runs Kingfisher in Docker | Docker | +| `kingfisher` | Uses locally installed Kingfisher binary | Manual installation | + +The `kingfisher-auto` hook is recommended for most users as it: + +- Automatically downloads the correct binary for your OS and architecture +- Caches the binary in `~/.cache/kingfisher` (Linux/macOS) or `%LOCALAPPDATA%\kingfisher` (Windows) +- Works across Linux, macOS, and Windows (via Git Bash which comes with Git for Windows) +- Requires no Docker or manual installation + +**Windows users:** The `kingfisher-auto` hook uses a bash script that runs via Git Bash (included with [Git for Windows](https://gitforwindows.org/)). For native PowerShell, a `kingfisher-pre-commit-auto.ps1` script is also available in the `scripts/` directory. + +The PowerShell auto-hook script also auto-detects Windows architecture and +downloads the matching `windows-x64` or `windows-arm64` binary. + +Then install the hook via `pre-commit install`. Every hook now drives Kingfisher +directly with the built-in `--staged` flag: + +```bash +kingfisher scan . --staged --quiet --no-update-check +``` + +When `--staged` is set, Kingfisher snapshots the staged index into a temporary +commit, diffs it against `HEAD` (or an empty tree if no commits exist yet), and +scans only those staged changes. + +> Exit codes: Kingfisher exits `0` when no findings are present and returns +> `205` when validated credentials are discovered (other findings use codes in +> the `200` range). The hook surfaces those exit codes directly to `pre-commit`, +> so no extra handling is required—the commit will fail automatically on +> non-zero exits. + +To trigger a hook in CI without installing to `.git/hooks`, run (for example): + +```bash +pre-commit run kingfisher-auto --all-files +``` + +**Pin to a specific version:** + +To use a specific Kingfisher version with the `kingfisher-auto` hook, set the `KINGFISHER_VERSION` environment variable: + +```yaml +repos: + - repo: https://github.com/mongodb/kingfisher + rev: v1.76.0 + hooks: + - id: kingfisher-auto + # Optional: pin to a specific kingfisher binary version + # env: + # KINGFISHER_VERSION: "1.76.0" +``` + +### Using Husky (Node.js projects) + +For Node.js projects using [Husky](https://typicode.github.io/husky/), you can add Kingfisher to your pre-commit hooks: + +**Quick setup (recommended):** + +```bash +# Initialize Husky if you haven't already +npx husky init + +# Add Kingfisher to the pre-commit hook (auto-downloads binary) +echo 'curl -fsSL https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/kingfisher-pre-commit-auto.sh | bash' >> .husky/pre-commit +``` + +**Or use the helper script:** + +```bash +curl -fsSL https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-husky.sh | bash -s -- --auto-install +``` + +**Available options:** + +```bash +# Use auto-download (recommended - no pre-installation needed) +./scripts/install-husky.sh --auto-install + +# Use Docker (requires Docker, no binary installation) +./scripts/install-husky.sh --use-docker + +# Use local binary (requires kingfisher to be installed) +./scripts/install-husky.sh + +# Uninstall +./scripts/install-husky.sh --uninstall +``` + +**Manual setup:** + +If you prefer to configure Husky manually, add one of these to your `.husky/pre-commit`: + +```bash +# Option 1: Auto-download binary (recommended) +curl -fsSL https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/kingfisher-pre-commit-auto.sh | bash + +# Option 2: Use Docker +docker run --rm -v "$(pwd)":/src ghcr.io/mongodb/kingfisher:latest scan /src --staged --quiet --no-update-check + +# Option 3: Use locally installed binary +kingfisher scan . --staged --quiet --no-update-check +``` + +**Windows with PowerShell:** + +For Windows users preferring native PowerShell over Git Bash, create a `.husky/pre-commit.ps1` or add to your hook: + +```powershell +# Download and run the PowerShell auto-install script +Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/kingfisher-pre-commit-auto.ps1' -OutFile "$env:TEMP\kf-scan.ps1" +& "$env:TEMP\kf-scan.ps1" +``` + +If needed, you can override architecture explicitly: + +```powershell +& "$env:TEMP\kf-scan.ps1" -Arch arm64 +``` + +Or if Kingfisher is already installed: + +```powershell +kingfisher scan . --staged --quiet --no-update-check +``` + +## Compile from Source + +You may compile for your platform via `make`: + +```bash +# NOTE: Requires Docker +make linux + +# macOS --- must build from a macOS host +make darwin + +# Windows x64 --- requires building from a Windows host with Visual Studio installed +./buildwin.bat -force +``` + +```bash +# Build all targets +make linux-all # builds both x64 and arm64 +make darwin-all # builds both x64 and arm64 +make all # builds for every OS and architecture supported +``` + +## Run Kingfisher in Docker + +Run the dockerized Kingfisher container: + +```bash +# GitHub Container Registry +docker run --rm ghcr.io/mongodb/kingfisher:latest --version + +# Scan the current working directory +# (mounts your code at /src and scans it) +docker run --rm \ + -v "$PWD":/src \ + ghcr.io/mongodb/kingfisher:latest scan /src + + +# Scan while providing a GitHub token +# Mounts your working dir at /proj and passes in the token: +docker run --rm \ + -e KF_GITHUB_TOKEN=ghp_… \ + -v "$PWD":/proj \ + ghcr.io/mongodb/kingfisher:latest \ + scan https://github.com/org/private_repo.git + +# Scan an S3 bucket +# Credentials can come from KF_AWS_KEY/KF_AWS_SECRET, --role-arn, or --profile +docker run --rm \ + -e KF_AWS_KEY=AKIA... \ + -e KF_AWS_SECRET=g5nYW... \ + ghcr.io/mongodb/kingfisher:latest \ + scan s3 bucket-name + + +# Scan and write a JSON report locally +# Here we: +# 1. Mount $PWD → /proj +# 2. Tell Kingfisher to write findings.json inside /proj/reports +# 3. Ensure ./reports exists on your host so Docker can mount it +mkdir -p reports + +# run and output into host's ./reports directory +docker run --rm \ + -v "$PWD":/proj \ + ghcr.io/mongodb/kingfisher:latest \ + scan /proj \ + --format json \ + --output /proj/reports/findings.json + + +# Tip: you can combine multiple mounts if you prefer separating source vs. output: +# Here /src is read‑only, and /out holds your generated reports +docker run --rm \ + -v "$PWD":/src:ro \ + -v "$PWD/reports":/out \ + ghcr.io/mongodb/kingfisher:latest \ + scan /src \ + --format json \ + --output /out/findings.json + +# Scan and view the HTML report in your browser (Docker) +# Use --view-report-address 0.0.0.0 and -p to expose the report server to the host +docker run --rm \ + -v "$PWD":/src \ + -p 7890:7890 \ + ghcr.io/mongodb/kingfisher:latest \ + scan /src --access-map --view-report --view-report-address 0.0.0.0 +# Then open http://localhost:7890 in your browser +``` + +## PyPI Wheels + +If you want to run Kingfisher from PyPI, you can install it using `uv`, `pip`, or run it directly with `uvx`: + +```bash +# Install with uv (recommended) +uv tool install kingfisher-bin + +# Or install with pip +pip install kingfisher-bin + +# Then run Kingfisher +kingfisher --help +``` + +Or run it without installation using `uvx`: + +```bash +uvx kingfisher-bin --help +``` + +For maintainers who need to build and publish wheels, see +[docs/PYPI.md](../reference/python-bindings.md). diff --git a/docs-site/docs/getting-started/quick-start.md b/docs-site/docs/getting-started/quick-start.md new file mode 100644 index 0000000..e9204ac --- /dev/null +++ b/docs-site/docs/getting-started/quick-start.md @@ -0,0 +1,103 @@ +--- +title: "Quick Start" +description: "Get up and running with Kingfisher in under a minute. Scan files, Git repos, and cloud platforms for leaked secrets." +--- + +# Quick Start + +Get scanning in under a minute. + +## 1. Install Kingfisher + +=== "Homebrew" + + ```bash + brew install kingfisher + ``` + +=== "PyPI" + + ```bash + uv tool install kingfisher-bin + ``` + +=== "Docker" + + ```bash + docker run --rm -v "$PWD":/src ghcr.io/mongodb/kingfisher:latest scan /src + ``` + +=== "Script (Linux/macOS)" + + ```bash + curl -sSL https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher.sh | bash + ``` + +=== "PowerShell (Windows)" + + ```powershell + Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass -Force + Invoke-WebRequest -Uri 'https://raw.githubusercontent.com/mongodb/kingfisher/main/scripts/install-kingfisher.ps1' -OutFile install-kingfisher.ps1 + ./install-kingfisher.ps1 + ``` + +For all installation options, see the [Installation Guide](installation.md). + +## 2. Scan a Directory + +```bash +kingfisher scan /path/to/code +``` + +Kingfisher automatically detects whether the path is a Git repo or plain directory. + +## 3. View Results in Your Browser + +```bash +kingfisher scan /path/to/code --view-report +``` + +## 4. Show Only Live Secrets + +Filter to only secrets confirmed active by provider APIs: + +```bash +kingfisher scan /path/to/code --only-valid +``` + +## 5. Map the Blast Radius + +See exactly what resources a leaked credential can access: + +```bash +kingfisher scan /path/to/code --access-map --view-report +``` + +## 6. Revoke a Compromised Secret + +```bash +# Revoke a GitHub token +kingfisher revoke --rule github "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Revoke AWS credentials +kingfisher revoke --rule aws --arg "AKIAIOSFODNN7EXAMPLE" "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" +``` + +## 7. Scan a GitHub Organization + +```bash +KF_GITHUB_TOKEN="ghp_..." kingfisher scan github --organization my-org +``` + +## 8. Output JSON for CI/CD + +```bash +kingfisher scan /path/to/code --format json --output findings.json +``` + +## What's Next? + +- [Basic Scanning](../usage/basic-scanning.md) — full scanning guide with all options +- [Platform Integrations](../usage/integrations.md) — GitHub, GitLab, S3, Docker, Slack, and more +- [Writing Custom Rules](../rules/overview.md) — create detection rules for your own patterns +- [Access Map](../features/access-map.md) — blast radius mapping for 39 providers diff --git a/docs-site/docs/index.md b/docs-site/docs/index.md new file mode 100644 index 0000000..0def3fb --- /dev/null +++ b/docs-site/docs/index.md @@ -0,0 +1,10 @@ +--- +title: Kingfisher — Open Source Secret Scanner with Live Validation +description: >- + Kingfisher is an open source secret scanner with live validation, blast radius + mapping, and credential revocation. 734+ detection rules. Built in Rust by MongoDB. +template: home.html +hide: + - navigation + - toc +--- diff --git a/docs-site/docs/reference/architecture.md b/docs-site/docs/reference/architecture.md new file mode 100644 index 0000000..73b35cf --- /dev/null +++ b/docs-site/docs/reference/architecture.md @@ -0,0 +1,130 @@ +--- +title: "Architecture" +description: "High-level architecture of Kingfisher: CLI, scanner pipeline, rule engine, validation, access mapping, and output formats." +--- + +# Kingfisher Architecture + +This document focuses on the runtime architecture of Kingfisher as implemented in this repository today. + +It shows: + +- a high-level component map of the main crates, modules, command paths, and outputs +- the execution flow for `kingfisher scan` + +## Component Map + +```mermaid +flowchart LR + User[User or CI] --> CLI[kingfisher CLI] --> Main[Dispatch and runtime] + + subgraph Commands[Commands] + ScanCmd[scan] + ValidateCmd[validate] + RevokeCmd[revoke] + AccessMapCmd[access-map] + ViewCmd[view] + RulesCmd[rules] + end + + Main --> ScanCmd + Main --> ValidateCmd + Main --> RevokeCmd + Main --> AccessMapCmd + Main --> ViewCmd + Main --> RulesCmd + + subgraph Inputs[Inputs] + FS[Files and dirs] + Git[Git repos and history] + Hosts[Git hosts] + Docs[Jira Confluence Slack Teams] + Remote[S3 GCS Docker] + end + + subgraph Pipeline[Scan pipeline] + Runner[Scan runner] + Enumerate[Enumerate and fetch] + Process[Process blobs] + Match[Match secrets] + Store[FindingsStore] + Filter[Dedup baseline safelist] + Validate[Validate] + Map[Access map] + Report[Report] + Viewer[Viewer] + end + + subgraph Crates[Reusable crates] + Core[kingfisher-core] + Rules[kingfisher-rules] + ScannerLib[kingfisher-scanner] + end + + subgraph Engines[Engines] + Vector[vectorscan] + ScanPool[scanner pool] + Tree[tree-sitter] + Liquid[Liquid templates] + end + + APIs[Provider APIs] + Output[Terminal and report files] + Browser[Browser UI] + + ScanCmd --> Runner --> Enumerate --> Process --> Match --> Store --> Filter + Filter --> Validate + Filter --> Report + Validate --> Map + Validate --> Report + Map --> Report + Report --> Output + Report --> Viewer --> Browser + + FS --> Enumerate + Git --> Enumerate + Hosts --> Enumerate + Docs --> Enumerate + Remote --> Enumerate + + Core --> Process + Core --> Match + Rules --> Match + ScannerLib --> Match + ScannerLib --> Validate + + Match --> Vector --> ScanPool + Match --> Tree + Validate --> Liquid + Validate --> APIs + + ValidateCmd --> Liquid + ValidateCmd --> APIs + RevokeCmd --> Liquid + RevokeCmd --> APIs + AccessMapCmd --> APIs + ViewCmd --> Viewer +``` + +## What Lives Where + +- `src/main.rs`: top-level command dispatch, Tokio runtime setup, allocator selection (mimalloc/jemalloc/system), update checks, and command routing. +- `src/scanner/runner.rs`: the orchestration hub for `scan`, including repo enumeration, clone streaming, artifact fetching, validation setup, sequential or parallel scan execution (threshold: >10 git repos triggers parallel mode), reporting, and summary generation. +- `src/scanner/*`: input enumeration (`enumerate.rs`), repository handling and artifact fetching (`repos.rs`), blob processing (`processing.rs`), validation coordination (`validation.rs`), scan summaries (`summary.rs`), Docker image scanning (`docker.rs`), and utilities (`util.rs`). +- `src/matcher/*`: the main detection engine (`mod.rs`), including vectorscan callbacks, regex helpers, Base64 discovery (`base64_decode.rs`), capture group handling (`captures.rs`), dedup support (`dedup.rs`), filtering (`filter.rs`), and finding fingerprinting (`fingerprint.rs`). +- `src/parser.rs`: tree-sitter integration for language-aware parsing, supporting 17+ languages (Bash, C, C#, C++, CSS, Go, HTML, Java, JavaScript, PHP, Python, Ruby, Rust, TOML, TypeScript, YAML, and regex). +- `src/scanner_pool.rs`: thread-local vectorscan `BlockScanner` pool, providing safe reuse of compiled pattern databases across scan threads. +- `src/reporter.rs` and `src/reporter/*`: report rendering for pretty, JSON, BSON, TOON, SARIF, and HTML outputs, plus the data model used by the viewer. +- `src/direct_validate.rs`: direct validation of a known secret without going through pattern matching. Supports HTTP, AWS, Azure, GCP, JDBC, MongoDB, MySQL, PostgreSQL, JWT, and Coinbase validators, with Liquid template integration for custom validation logic. +- `src/direct_revoke.rs`: direct revocation of a known secret without going through the scan pipeline. Uses Liquid templates for revocation configurations and supports multi-step HTTP revocation flows. +- `src/access_map.rs` and `src/access_map/*`: standalone blast-radius mapping with 24 provider implementations including AWS, Azure, GCP, GitHub, GitLab, Slack, Bitbucket, Gitea, Hugging Face, Buildkite, Anthropic, OpenAI, and more. + +## Notes And Boundaries + +- The main CLI scan path is implemented primarily in the application modules under `src/`, not in `kingfisher-scanner`. +- `kingfisher-scanner` is still important: it provides the embeddable scanner API plus shared validation and primitive functionality reused by the application. +- Direct `validate`, `revoke`, and standalone `access-map` are sibling command paths. They are not downstream stages of `FindingsStore`. +- Reporting is downstream from the datastore, which lets Kingfisher emit multiple output formats and drive the local viewer from the same finding set. +- The matching layer is intentionally hybrid: vectorscan provides high-throughput SIMD-accelerated pattern detection, while regex helpers, Base64 support, and tree-sitter verification improve accuracy and reduce false positives. +- `FindingsStore` uses an in-memory store with a Bloom filter for deduplication, replacing the earlier SQLite-based storage model. +- Validation and revocation templates are rendered via Liquid, allowing rule authors to define HTTP request sequences, variable extraction, and multi-step flows in YAML without touching Rust code. diff --git a/docs-site/docs/reference/comparison.md b/docs-site/docs/reference/comparison.md new file mode 100644 index 0000000..b9bce2b --- /dev/null +++ b/docs-site/docs/reference/comparison.md @@ -0,0 +1,64 @@ +--- +title: "Benchmarks & Comparison" +description: "Benchmark results comparing Kingfisher performance against TruffleHog, GitLeaks, and detect-secrets across major open source repositories." +--- + +# Benchmark Comparison + +## Runtime Comparison (seconds) +*Lower runtimes are better.* + +| Repository | Kingfisher Runtime | TruffleHog Runtime | GitLeaks Runtime | detect-secrets Runtime | +|------------|--------------------|--------------------|------------------|------------------------| +| croc | 2.64 | 10.36 | 3.10 | 0.16 | +| rails | 8.75 | 24.19 | 24.24 | 0.48 | +| ruby | 22.93 | 132.68 | 61.37 | 0.79 | +| gitlab | 135.41 | 325.93 | 350.84 | 5.04 | +| django | 6.91 | 227.63 | 59.50 | 0.61 | +| lucene | 15.62 | 89.11 | 76.24 | 0.66 | +| mongodb | 25.37 | 174.93 | 175.80 | 2.74 | +| linux | 205.19 | 597.51 | 548.96 | 5.49 | +| typescript | 64.99 | 183.04 | 232.34 | 4.23 | + +

+ Kingfisher Runtime Comparison +

+ +### Validated/Verified Findings Comparison + +Note: For GitLeaks and detect-secrets, validated/verified counts are not available. + +| Repository | Kingfisher Validated | TruffleHog Verified | GitLeaks Verified | detect-secrets Verified | +|------------|----------------------|---------------------|-------------------|-------------------------| +| croc | 0 | 0 | 0 | 0 | +| rails | 0 | 0 | 0 | 0 | +| ruby | 0 | 0 | 0 | 0 | +| gitlab | 6 | 6 | 0 | 0 | +| django | 0 | 0 | 0 | 0 | +| lucene | 0 | 0 | 0 | 0 | +| mongodb | 0 | 0 | 0 | 0 | +| linux | 0 | 0 | 0 | 0 | +| typescript | 0 | 0 | 0 | 0 | + +### Network Requests Comparison +*'Network Requests' shows the total number of HTTP calls made during a scan. Since Gitleaks and detect‑secrets don’t validate secrets, they never make any network requests.* + +| Repository | Kingfisher Network Requests | TruffleHog Network Requests | GitLeaks Network Requests | detect-secrets Network Requests | +|------------|-----------------------------|-----------------------------|---------------------------|----------------------------------| +| croc | 0 | 17 | 0 | 0 | +| rails | 1 | 25 | 0 | 0 | +| ruby | 3 | 33 | 0 | 0 | +| gitlab | 17 | 15624 | 0 | 0 | +| django | 0 | 66 | 0 | 0 | +| lucene | 0 | 116 | 0 | 0 | +| mongodb | 1 | 191 | 0 | 0 | +| linux | 0 | 287 | 0 | 0 | +| typescript | 0 | 10 | 0 | 0 | + +*Lower runtimes are better. Validated/Verified counts are reported where available. 'Network Requests' indicates the number of HTTP requests made during scanning.* + +OS: darwin +Architecture: arm64 +CPU Cores: 16 +RAM: 48.00 GB + diff --git a/docs-site/docs/reference/library.md b/docs-site/docs/reference/library.md new file mode 100644 index 0000000..4aa7faf --- /dev/null +++ b/docs-site/docs/reference/library.md @@ -0,0 +1,873 @@ +--- +title: "Rust Library Crates" +description: "Embed Kingfisher's scanning engine in your own Rust applications using kingfisher-core, kingfisher-rules, and kingfisher-scanner crates." +--- + +# Kingfisher Library Crates + +Kingfisher's functionality is available as a set of Rust library crates that can be embedded into other applications. This guide covers how to use these crates for secret scanning in your own Rust projects. + +## Crate Overview + +| Crate | Description | +| ----- | ----------- | +| `kingfisher-core` | Core types: `Blob`, `BlobId`, `Location`, `Origin`, entropy calculation | +| `kingfisher-rules` | Rule definitions, YAML parsing, compiled rule database, builtin rules | +| `kingfisher-scanner` | High-level scanning API with `Scanner` and `Finding` types | + +### Crate Relationships + +```mermaid +flowchart LR + App[Your Rust application] + Core[kingfisher-core] + Rules[kingfisher-rules] + Scanner[kingfisher-scanner] + + App --> Core + App --> Rules + App --> Scanner + Scanner --> Core + Scanner --> Rules +``` + +### Optional Features + +The `kingfisher-scanner` crate supports optional validation features: + +| Feature | Description | +| ------- | ----------- | +| `validation` | Core validation support (includes HTTP validation) | +| `validation-http` | HTTP-based validation for API tokens | +| `validation-aws` | AWS credential validation via STS GetCallerIdentity | +| `validation-all` | Enable all validation features | + +## Quick Start + +Add the crates to your `Cargo.toml`: + +```toml +[dependencies] +kingfisher-core = { git = "https://github.com/mongodb/kingfisher" } +kingfisher-rules = { git = "https://github.com/mongodb/kingfisher" } +kingfisher-scanner = { git = "https://github.com/mongodb/kingfisher" } +``` + +### Basic File Scanning + +```rust +use std::sync::Arc; +use kingfisher_core::Blob; +use kingfisher_rules::{get_builtin_rules, RulesDatabase, Rule}; +use kingfisher_scanner::Scanner; + +fn main() -> anyhow::Result<()> { + // 1. Load the builtin rules + let rules = get_builtin_rules(None)?; + + // 2. Convert to Rule objects and compile into a database + let rule_vec: Vec = rules.iter_rules() + .map(|syntax| Rule::new(syntax.clone())) + .collect(); + let rules_db = Arc::new(RulesDatabase::from_rules(rule_vec)?); + + // 3. Create a scanner + let scanner = Scanner::new(rules_db); + + // 4. Scan a file + let findings = scanner.scan_file("path/to/file.txt")?; + + for finding in findings { + println!( + "Found {} at line {}", + finding.rule_name, + finding.location.line + ); + } + + Ok(()) +} +``` + +### Scanning In-Memory Content + +```rust +use std::sync::Arc; +use kingfisher_rules::{get_builtin_rules, RulesDatabase, Rule}; +use kingfisher_scanner::Scanner; + +fn scan_content(content: &[u8]) -> anyhow::Result<()> { + let rules = get_builtin_rules(None)?; + let rule_vec: Vec = rules.iter_rules() + .map(|syntax| Rule::new(syntax.clone())) + .collect(); + let rules_db = Arc::new(RulesDatabase::from_rules(rule_vec)?); + + let scanner = Scanner::new(rules_db); + + // Scan bytes directly - no file I/O needed + let findings = scanner.scan_bytes(content); + + for finding in &findings { + println!("Secret: {} ({})", finding.rule_name, finding.confidence); + } + + Ok(()) +} +``` + +--- + +## kingfisher-core + +Core types and utilities for working with scannable content. + +### Core Structure + +```mermaid +flowchart TD + Core[kingfisher-core] + Blob[blob module] + Location[location module] + Origin[origin module] + Content[content_type module] + Entropy[entropy module] + GitMeta[git_commit_metadata module] + Escape[bstring_escape module] + Error[error module] + + Core --> Blob + Core --> Location + Core --> Origin + Core --> Content + Core --> Entropy + Core --> GitMeta + Core --> Escape + Core --> Error +``` + +### Blob - Content Abstraction + +`Blob` represents content that can be scanned. It supports: + +- **File-backed content** with memory mapping for large files +- **In-memory content** for programmatic use +- **Borrowed content** for zero-copy scanning + +```rust +use kingfisher_core::Blob; + +// From a file (memory-mapped for efficiency) +let blob = Blob::from_file("secret.txt")?; + +// From owned bytes +let blob = Blob::from_bytes(vec![0x41, 0x42, 0x43]); + +// Access the content +let bytes: &[u8] = blob.bytes(); +let id: BlobId = blob.id(); // SHA-1 based identifier +``` + +### BlobId - Content Identity + +`BlobId` provides a unique identifier for content, computed using a SHA-1 hash (compatible with Git's blob IDs): + +```rust +use kingfisher_core::BlobId; + +let id = BlobId::new(b"hello world"); +println!("Blob ID: {}", id.hex()); // 40-character hex string + +// Parse from hex +let id = BlobId::from_hex("2aae6c35c94fcfb415dbe95f408b9ce91ee846ed")?; +``` + +### Location - Source Positions + +Track positions within scanned content: + +```rust +use kingfisher_core::{LocationMapping, SourceSpan}; + +let content = b"line1\nline2\nline3"; +let mapping = LocationMapping::new(content); + +// Convert byte offset to line/column +let point = mapping.get_source_point(7); // Returns (line: 2, column: 2) + +// Get a span +let span = mapping.get_source_span(6..11); // "line2" +``` + +### Entropy Calculation + +Calculate Shannon entropy to filter high-randomness content: + +```rust +use kingfisher_core::calculate_shannon_entropy; + +let entropy = calculate_shannon_entropy(b"AKIAIOSFODNN7EXAMPLE"); +println!("Entropy: {:.2} bits", entropy); // ~4.0 for random-looking strings +``` + +### Origin - Provenance Tracking + +Track where content came from: + +```rust +use kingfisher_core::{Origin, FileOrigin, GitRepoOrigin}; +use std::path::PathBuf; + +// File origin +let origin = Origin::File(FileOrigin { + path: PathBuf::from("/path/to/file.txt"), +}); + +// Git repository origin +let origin = Origin::GitRepo(GitRepoOrigin { + repo_path: PathBuf::from("/path/to/repo"), + remote_url: Some("https://github.com/org/repo".into()), +}); +``` + +--- + +## kingfisher-rules + +Rule definitions, YAML parsing, and the compiled rule database. + +### Rules Structure + +```mermaid +flowchart TD + Rules[kingfisher-rules] + RuleMod[rule module] + RulesMod[rules module] + Db[rules_database module] + Defaults[defaults module] + Liquid[liquid_filters module] + + Rules --> RuleMod + Rules --> RulesMod + Rules --> Db + Rules --> Defaults + Rules --> Liquid + + RuleMod --> Syntax[Rule and RuleSyntax] + RulesMod --> Collections[Rules collection and loading] + Db --> Compiled[Compiled RulesDatabase] + Defaults --> Builtins[Builtin rules] + Liquid --> Filters[Template filters] +``` + +### Loading Builtin Rules + +Kingfisher comes with 700+ builtin rules for common secret types: + +```rust +use kingfisher_rules::{get_builtin_rules, Confidence}; + +// Load all rules with Medium confidence or higher (default) +let rules = get_builtin_rules(None)?; + +// Load only High confidence rules +let rules = get_builtin_rules(Some(Confidence::High))?; + +println!("Loaded {} rules", rules.num_rules()); +``` + +### Loading Custom Rules + +Load rules from YAML files or directories: + +```rust +use kingfisher_rules::{Rules, Confidence}; + +// From a single file +let rules = Rules::from_paths(&["my-rules.yml"], Confidence::Medium)?; + +// From a directory (recursively finds .yml files) +let rules = Rules::from_paths(&["rules/"], Confidence::Medium)?; + +// Merge multiple sources +let mut rules = Rules::new(); +rules.update(Rules::from_paths(&["builtin/"], Confidence::Medium)?); +rules.update(Rules::from_paths(&["custom/"], Confidence::Medium)?); +``` + +### Rule Syntax YAML Format + +```yaml +rules: + - name: My Custom API Key + id: custom.myapi.1 + pattern: | + (?i) + myapi[_-]?key\s*[:=]\s* + ["']?([A-Za-z0-9]{32})["']? + min_entropy: 3.5 + confidence: high + examples: + - 'MYAPI_KEY=abc123def456ghi789jkl012mno345pq' + validation: + type: Http + content: + request: + method: GET + url: https://api.example.com/validate + headers: + Authorization: Bearer {{ TOKEN }} + response_matcher: + - type: StatusMatch + status: [200] +``` + +### Compiling Rules + +The `RulesDatabase` compiles rules for efficient multi-pattern matching: + +```rust +use std::sync::Arc; +use kingfisher_rules::{get_builtin_rules, RulesDatabase, Rule}; + +let rules = get_builtin_rules(None)?; + +// Convert RuleSyntax to Rule objects +let rule_vec: Vec = rules.iter_rules() + .map(|syntax| Rule::new(syntax.clone())) + .collect(); + +// Compile into a database (uses Vectorscan for fast matching) +let db = Arc::new(RulesDatabase::from_rules(rule_vec)?); + +// Access compiled rules +println!("Compiled {} rules", db.num_rules()); + +// Look up rules by ID +if let Some(rule) = db.get_rule_by_text_id("kingfisher.aws.1") { + println!("Found rule: {}", rule.name()); +} +``` + +### Confidence Levels + +Rules have confidence levels indicating detection accuracy: + +```rust +use kingfisher_rules::Confidence; + +// Available levels (in order) +// Confidence::Low - May have false positives +// Confidence::Medium - Balanced (default) +// Confidence::High - High accuracy + +let conf = Confidence::High; +if conf.is_at_least(&Confidence::Medium) { + println!("Confidence is medium or higher"); +} +``` + +### Liquid Filters for Validation + +The crate includes Liquid template filters for HTTP validation: + +```rust +use kingfisher_rules::register_liquid_filters; +use liquid::ParserBuilder; + +let parser = register_liquid_filters(ParserBuilder::with_stdlib()) + .build()?; + +let template = parser.parse("{{ secret | sha256 }}")?; +``` + +Available filters: + +- **Encoding**: `b64enc`, `b64dec`, `b64url_enc`, `url_encode`, `json_escape` +- **Hashing**: `sha256`, `crc32`, `crc32_dec`, `crc32_hex`, `crc32_le_b64` +- **HMAC**: `hmac_sha256`, `hmac_sha384`, `hmac_sha1`, `hmac_sha256_b64key` +- **Encoding**: `base62`, `base36` +- **Strings**: `prefix`, `suffix`, `replace`, `lstrip_chars`, `random_string`, `newline` +- **Time**: `unix_timestamp`, `iso_timestamp`, `iso_timestamp_no_frac` +- **Other**: `uuid`, `jwt_header` + +--- + +## kingfisher-scanner + +High-level scanning API that combines core types and rules. + +### Scanner Structure + +```mermaid +flowchart TD + Scanner[kingfisher-scanner] + ScanMod[scanner module] + FindingMod[finding module] + PoolMod[scanner_pool module] + Prim[primitives module] + Validation[validation module] + Core[kingfisher-core] + Rules[kingfisher-rules] + + Scanner --> ScanMod + Scanner --> FindingMod + Scanner --> PoolMod + Scanner --> Prim + Scanner --> Validation + Scanner --> Core + Scanner --> Rules + + ScanMod --> API[Scanner and ScannerConfig] + FindingMod --> Finding[Finding types] + PoolMod --> Pool[ScannerPool] + Prim --> Helpers[Matching helpers] + Validation --> Validators[Optional validators] +``` + +### Scanner Configuration + +```rust +use std::sync::Arc; +use kingfisher_rules::{get_builtin_rules, RulesDatabase, Rule}; +use kingfisher_scanner::{Scanner, ScannerConfig}; + +let rules = get_builtin_rules(None)?; +let rule_vec: Vec = rules.iter_rules() + .map(|syntax| Rule::new(syntax.clone())) + .collect(); +let rules_db = Arc::new(RulesDatabase::from_rules(rule_vec)?); + +// Default configuration +let scanner = Scanner::new(Arc::clone(&rules_db)); + +// Custom configuration +let config = ScannerConfig { + enable_base64_decoding: true, // Decode and scan base64 content + enable_dedup: true, // Skip duplicate blobs + min_entropy_override: Some(3.0), // Override minimum entropy + redact_secrets: false, // Don't redact in findings + max_base64_depth: 2, // Max nested base64 decoding +}; +let scanner = Scanner::with_config(Arc::clone(&rules_db), config); +``` + +### Scanning Methods + +```rust +// Scan raw bytes +let findings = scanner.scan_bytes(b"AWS_SECRET_KEY=AKIAIOSFODNN7EXAMPLE"); + +// Scan a file +let findings = scanner.scan_file("config.yml")?; + +// Scan a Blob +use kingfisher_core::Blob; +let blob = Blob::from_file("secrets.env")?; +let findings = scanner.scan_blob(&blob)?; +``` + +### Working with Findings + +```rust +use kingfisher_scanner::Finding; + +for finding in findings { + println!("Rule: {} ({})", finding.rule_name, finding.rule_id); + println!("Secret: {}", finding.secret); + println!( + "Location: line {} col {} - line {} col {}", + finding.location.line, + finding.location.column, + finding.location.end_line, + finding.location.end_column + ); + println!("Entropy: {:.2}", finding.entropy); + println!("Confidence: {:?}", finding.confidence); + println!("Fingerprint: {}", finding.fingerprint); + + // Named captures from the regex + for (name, value) in &finding.captures { + println!(" {}: {}", name, value); + } +} +``` + +### Parallel Scanning + +The scanner is thread-safe and uses a thread-local scanner pool: + +```rust +use std::sync::Arc; +use rayon::prelude::*; + +let scanner = Arc::new(Scanner::new(rules_db)); + +let files = vec!["file1.txt", "file2.txt", "file3.txt"]; + +let all_findings: Vec<_> = files.par_iter() + .flat_map(|file| { + scanner.scan_file(file).unwrap_or_default() + }) + .collect(); +``` + +--- + +## Complete Example + +Here's a complete CLI tool that scans files and directories for secrets with configurable options: + +```rust +use std::sync::Arc; +use std::path::Path; +use walkdir::WalkDir; +use clap::Parser; + +use kingfisher_rules::{get_builtin_rules, RulesDatabase, Rule, Confidence}; +use kingfisher_scanner::{Scanner, ScannerConfig}; + +#[derive(Parser)] +#[command(name = "secret-scanner")] +#[command(about = "Scan files and directories for secrets using Kingfisher", long_about = None)] +struct Cli { + /// Path to scan (file or directory) + #[arg(value_name = "PATH")] + path: String, + + /// Minimum confidence level (low, medium, high) + #[arg(short, long, default_value = "medium")] + confidence: String, + + /// Enable base64 decoding + #[arg(short, long, default_value_t = true)] + base64: bool, + + /// Redact secrets in output + #[arg(short, long, default_value_t = false)] + redact: bool, +} + +fn main() -> anyhow::Result<()> { + let cli = Cli::parse(); + + // Parse confidence level + let confidence = match cli.confidence.to_lowercase().as_str() { + "low" => Confidence::Low, + "medium" => Confidence::Medium, + "high" => Confidence::High, + _ => { + eprintln!("Invalid confidence level. Use: low, medium, or high"); + std::process::exit(1); + } + }; + + // Load builtin rules + println!("Loading {} confidence rules...", cli.confidence); + let rules = get_builtin_rules(Some(confidence))?; + println!("Loaded {} rules", rules.num_rules()); + + // Convert to Rule objects and compile into a database + let rule_vec: Vec = rules + .iter_rules() + .map(|syntax| Rule::new(syntax.clone())) + .collect(); + let rules_db = Arc::new(RulesDatabase::from_rules(rule_vec)?); + + // Configure scanner + let config = ScannerConfig { + enable_base64_decoding: cli.base64, + enable_dedup: true, + redact_secrets: cli.redact, + ..Default::default() + }; + let scanner = Scanner::with_config(rules_db, config); + + // Scan the path + let path = Path::new(&cli.path); + + if !path.exists() { + eprintln!("Error: Path '{}' does not exist", cli.path); + std::process::exit(1); + } + + let mut total_findings = 0; + let mut files_scanned = 0; + + if path.is_file() { + // Scan single file + files_scanned = 1; + println!("\nScanning file: {}", path.display()); + match scanner.scan_file(path) { + Ok(findings) => { + print_findings(path, &findings); + total_findings += findings.len(); + } + Err(e) => eprintln!("Error scanning file: {}", e), + } + } else if path.is_dir() { + // Scan directory recursively + println!("\nScanning directory: {}\n", path.display()); + + for entry in WalkDir::new(path) + .into_iter() + .filter_map(|e| e.ok()) + .filter(|e| e.file_type().is_file()) + { + let file_path = entry.path(); + files_scanned += 1; + + match scanner.scan_file(file_path) { + Ok(findings) if !findings.is_empty() => { + print_findings(file_path, &findings); + total_findings += findings.len(); + } + Err(e) => { + // Silently skip files that can't be scanned (binary, etc.) + if std::env::var("DEBUG").is_ok() { + eprintln!("Error scanning {}: {}", file_path.display(), e); + } + } + _ => {} + } + } + } + + // Print summary + println!("\n{}", "=".repeat(60)); + println!("Scan complete!"); + println!("Files scanned: {}", files_scanned); + println!("Total findings: {}", total_findings); + + if total_findings > 0 { + println!("\n⚠️ WARNING: Secrets detected! Please review the findings above."); + std::process::exit(1); + } else { + println!("✓ No secrets found."); + } + + Ok(()) +} + +fn print_findings(path: &Path, findings: &[kingfisher_scanner::Finding]) { + println!("\n📁 {}", path.display()); + println!("{}", "-".repeat(60)); + + for finding in findings { + println!(" 🔍 {} ({})", finding.rule_name, finding.rule_id); + println!(" Location: line {}:{} - {}:{}", + finding.location.line, + finding.location.column, + finding.location.end_line, + finding.location.end_column); + println!(" Secret: {}", finding.secret); + println!(" Entropy: {:.2}", finding.entropy); + println!(" Confidence: {:?}", finding.confidence); + println!(" Fingerprint: {}", finding.fingerprint); + + if !finding.captures.is_empty() { + println!(" Captures:"); + for (name, value) in &finding.captures { + println!(" {}: {}", name, value); + } + } + println!(); + } +} +``` + +Add these dependencies to your `Cargo.toml`: + +```toml +[package] +name = "secret-scanner" +version = "0.1.0" +edition = "2021" + +[dependencies] +kingfisher-core = { git = "https://github.com/mongodb/kingfisher" } +kingfisher-rules = { git = "https://github.com/mongodb/kingfisher" } +kingfisher-scanner = { git = "https://github.com/mongodb/kingfisher" } +anyhow = "1.0" +walkdir = "2.5" +clap = { version = "4.5", features = ["derive"] } +``` + +Try it out: + +```bash +# Scan a directory with medium confidence rules +cargo run -- -c medium ~/tmp + +# Scan with high confidence only and redact secrets +cargo run -- -c high --redact ~/projects + +# Scan a single file +cargo run -- config.yml +``` + +--- + +## Credential Validation (Optional) + +The `kingfisher-scanner` crate includes optional credential validation support. This allows you to check if detected secrets are still active/valid. + +### Enabling Validation + +Add the validation feature to your `Cargo.toml`: + +```toml +[dependencies] +kingfisher-scanner = { git = "https://github.com/mongodb/kingfisher", features = ["validation"] } +``` + +### Available Features + +| Feature | Description | +| ------- | ----------- | +| `validation` | Core validation support with HTTP validation | +| `validation-http` | HTTP-based validation for API tokens | +| `validation-aws` | AWS credential validation via STS | +| `validation-all` | Enable all validation features | + +### HTTP Validation Example + +```rust +use kingfisher_scanner::validation::{ + build_request_builder, validate_response, CachedResponse, + from_string, GLOBAL_USER_AGENT, +}; +use kingfisher_rules::ResponseMatcher; +use reqwest::Client; +use std::collections::BTreeMap; +use std::time::Duration; + +async fn validate_api_token(token: &str) -> bool { + let client = Client::builder() + .timeout(Duration::from_secs(10)) + .build() + .unwrap(); + + let parser = liquid::ParserBuilder::with_stdlib().build().unwrap(); + let mut globals = liquid::Object::new(); + globals.insert("TOKEN".into(), liquid_core::Value::scalar(token.to_string())); + + let url = reqwest::Url::parse("https://api.example.com/validate").unwrap(); + let mut headers = BTreeMap::new(); + headers.insert("Authorization".to_string(), "Bearer {{ TOKEN }}".to_string()); + + let request = build_request_builder( + &client, + "GET", + &url, + &headers, + &None, + Duration::from_secs(10), + &parser, + &globals, + ).unwrap(); + + match request.send().await { + Ok(resp) => { + let status = resp.status(); + let body = resp.text().await.unwrap_or_default(); + + // Define matchers for valid response + let matchers = vec![ + ResponseMatcher::StatusMatch { + r#type: "status-match".to_string(), + status: vec![200], + match_all_status: false, + negative: false, + }, + ]; + + validate_response(&matchers, &body, &status, resp.headers(), false) + } + Err(_) => false, + } +} +``` + +### AWS Credential Validation + +Enable the `validation-aws` feature to validate AWS credentials: + +```toml +[dependencies] +kingfisher-scanner = { git = "https://github.com/mongodb/kingfisher", features = ["validation-aws"] } +``` + +```rust +use kingfisher_scanner::validation::{ + validate_aws_credentials, validate_aws_credentials_input, + aws_key_to_account_number, set_aws_skip_account_ids, +}; + +async fn check_aws_key(access_key_id: &str, secret_key: &str) { + // Validate format first + if let Err(e) = validate_aws_credentials_input(access_key_id, secret_key) { + println!("Invalid format: {}", e); + return; + } + + // Extract account number from the key + if let Ok(account) = aws_key_to_account_number(access_key_id) { + println!("AWS Account: {}", account); + } + + // Validate credentials via STS + match validate_aws_credentials(access_key_id, secret_key).await { + Ok((true, arn)) => println!("Valid! ARN: {}", arn), + Ok((false, msg)) => println!("Invalid: {}", msg), + Err(e) => println!("Error: {}", e), + } +} + +// Skip validation for known canary/honeypot accounts +fn setup_skip_list() { + set_aws_skip_account_ids(vec![ + "111122223333", // Test account + "444455556666", // Canary account + ]); +} +``` + +### Validation Response Types + +```rust +use kingfisher_scanner::validation::{ + CachedResponse, ValidationResponseBody, + from_string, as_str, VALIDATION_CACHE_SECONDS, +}; +use http::StatusCode; +use std::time::Duration; + +// Create a validation response body +let body = from_string("Credential is valid"); + +// Create a cached response +let cached = CachedResponse::new( + body, + StatusCode::OK, + true, // is_valid +); + +// Check if cache is still fresh +let cache_duration = Duration::from_secs(VALIDATION_CACHE_SECONDS); +if cached.is_still_valid(cache_duration) { + println!("Using cached result: valid={}", cached.is_valid); +} +``` + +--- + +## API Stability + +These crates are currently internal to Kingfisher. The API may change between versions. For stable integration, pin to a specific git commit or tag. + +## See Also + +- [Main README](../README.md) - CLI usage and installation +- [Rule Format](../features/fingerprints.md) - Rule definition details +- [Changelog](../CHANGELOG.md) - Version history diff --git a/docs-site/docs/reference/python-bindings.md b/docs-site/docs/reference/python-bindings.md new file mode 100644 index 0000000..1af0077 --- /dev/null +++ b/docs-site/docs/reference/python-bindings.md @@ -0,0 +1,96 @@ +--- +title: "Python Bindings" +description: "Install and use Kingfisher from Python via PyPI wheels. Build and publish wheels for multiple platforms." +--- + +# PyPI Wheel Distribution (Kingfisher CLI) + +This document describes how to package the Kingfisher Rust binary into +platform-specific Python wheels so users can install and run `kingfisher` via +`pip` or `uv`. + +## Overview + +The Python package is a thin wrapper that bundles the compiled Kingfisher binary +inside `kingfisher/bin/` and exposes a `kingfisher` console entry point that +executes it. + +Users can run it without installation via `uvx`: + +```bash +uvx kingfisher-bin --help +``` + +## Build prerequisites + +1. Build the Kingfisher binary for your target platform (see + [INSTALLATION.md](../getting-started/installation.md) for `make` targets). +2. Install the Python build tooling: + +```bash +python -m pip install build +``` + +## Build a wheel + +Run the helper script from the repo root: + +```bash +scripts/build-pypi-wheel.sh \ + --binary ./path/to/kingfisher \ + --version 1.2.3 \ + --plat-name manylinux_2_17_x86_64 +``` + +For Windows, pass the `.exe` binary and a Windows platform tag: + +```bash +scripts/build-pypi-wheel.sh \ + --binary .\\path\\to\\kingfisher.exe \ + --version 1.2.3 \ + --plat-name win_amd64 +``` + +If you only build a Windows x64 binary, you can still ship a `win_arm64` wheel +using the same executable (it runs under emulation on ARM64 Windows): + +```bash +scripts/build-pypi-wheel.sh \ + --binary .\\path\\to\\kingfisher.exe \ + --version 1.2.3 \ + --plat-name win_arm64 +``` + +The resulting wheel will be placed in `dist-pypi/` by default. + +## Test locally + +```bash +python -m pip install dist-pypi/kingfisher_bin-*.whl +kingfisher --help +``` + +## Publish + +Upload the wheels to PyPI using `twine` (or your preferred tool): + +```bash +python -m pip install twine +python -m twine upload dist-pypi/* +``` + +### GitHub Actions (recommended) + +The repository includes a `pypi-wheels` workflow that: + +1. Downloads the release binaries. +2. Builds platform-tagged wheels. +3. Publishes them to PyPI using Trusted Publishing (OIDC). + +To use Trusted Publishing, create a PyPI project named `kingfisher-bin` and +enable GitHub Actions as a trusted publisher for this repository and workflow. +No API token is required once Trusted Publishing is configured. + +If you do not use Trusted Publishing, generate a PyPI API token and provide it +to `twine` (for example via `TWINE_USERNAME=__token__` and +`TWINE_PASSWORD=`). diff --git a/docs-site/docs/robots.txt b/docs-site/docs/robots.txt new file mode 100644 index 0000000..659d84d --- /dev/null +++ b/docs-site/docs/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Allow: / + +Sitemap: https://mongodb.github.io/kingfisher/sitemap.xml diff --git a/docs-site/docs/rules/builtin-rules.md b/docs-site/docs/rules/builtin-rules.md new file mode 100644 index 0000000..b7317d3 --- /dev/null +++ b/docs-site/docs/rules/builtin-rules.md @@ -0,0 +1,5094 @@ +--- +title: "Built-in Rules List" +description: "Complete list of all 734+ built-in secret detection rules in Kingfisher. Searchable and filterable by provider, confidence level, and validation support." +--- + +# Built-in Rules + +Kingfisher ships with **633 detection rules** across **465 providers**. +Of these, **462** include live validation and **43** support direct revocation. + +!!! tip "Search" + Use the search box below to filter rules by provider name, rule ID, or confidence level. + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ProviderRule NameRule IDConfidenceValidatesRevokes
AblyAbly API Keykingfisher.ably.1MediumYes
AbstractapiAbstractAPI API Keykingfisher.abstractapi.1MediumYes
AbuseipdbAbuseIPDB API Keykingfisher.abuseipdb.1MediumYes
AdafruitioAdafruit IO Keykingfisher.adafruitio.1HighYes
AdobeAdobe Stock API Keykingfisher.adobe.1UnknownYes
AdobeAdobe OAuth Client Secretkingfisher.adobe.3Unknown
AgeAge Identity (X22519 secret key)kingfisher.age.2High
AgeAge Identity (MLKEM768-X25519 secret key)kingfisher.age.4High
AgoraAgora App Certificatekingfisher.agora.2Medium
Ai21AI21 Studio API Keykingfisher.ai21studio.1MediumYes
Ai71AI71 API Keykingfisher.ai71.1MediumYes
AirbrakeAirbrake User Keykingfisher.airbrake.1MediumYes
AirtableAirtable Personal Access Tokenkingfisher.airtable.1MediumYes
AirtableAirtable OAuth Tokenkingfisher.airtable.2MediumYes
AivenAiven API Keykingfisher.aiven.1MediumYes
AkamaiAkamai API Client Secretkingfisher.akamai.2Medium
AlchemyAlchemy API Keykingfisher.alchemy.1MediumYes
AlgoliaAlgolia Admin API Keykingfisher.algolia.1MediumYes
AlibabaAlibaba Access Key Secretkingfisher.alibabacloud.2MediumYes
AmazonmwsAmazon MWS Auth Tokenkingfisher.amazonmws.1High
AmplitudeAmplitude Secret Keykingfisher.amplitude.1MediumYes
AnthropicAnthropic API Keykingfisher.anthropic.1HighYes
AnthropicAnthropic Admin API Keykingfisher.anthropic.2MediumYes
AnypointAnypoint API Keykingfisher.anypoint.1MediumYes
ApifyApify API Tokenkingfisher.apify.1HighYes
ApolloApollo API Keykingfisher.apollo.1MediumYes
AppcenterVisual Studio App Center API Tokenkingfisher.appcenter.1MediumYes
ArtifactoryArtifactory Access Tokenkingfisher.artifactory.1HighYes
ArtifactoryArtifactory Identity Reference Tokenkingfisher.artifactory.3MediumYes
ArtifactoryArtifactory NPM Auth (base64)kingfisher.artifactory.4Medium
AsanaAsana Client IDkingfisher.asana.1Medium
AsanaAsana Client Secretkingfisher.asana.2Medium
AsanaAsana OAuth / Personal Access Token (Legacy)kingfisher.asana.3MediumYes
AsanaAsana OAuth / Personal Access Token (V1)kingfisher.asana.4MediumYes
AsanaAsana OAuth / Personal Access Token (V2)kingfisher.asana.5MediumYes
AssemblyaiAssemblyAI API Keykingfisher.assemblyai.1MediumYes
AtlassianAtlassian API tokenkingfisher.atlassian.1MediumYes
AtlassianAtlassian Admin API Keykingfisher.atlassian.3MediumYes
Auth0Auth0 Client Secretkingfisher.auth0.2MediumYes
AuthressAuthress Service Client Access Keykingfisher.authress.1MediumYes
AviationstackAviationStack API Keykingfisher.aviationstack.1MediumYes
AwsAWS Secret Access Keykingfisher.aws.2MediumYesYes
AwsAWS Session Tokenkingfisher.aws.4Medium
AwsAWS Bedrock API Key (Short-lived)kingfisher.aws.6MediumYes
AwsAWS Bedrock API Key (Long-lived)kingfisher.aws.bedrock.long_livedMediumYes
AzureAzure Connection Stringkingfisher.azure.1Medium
AzureAzure App Configuration Connection Stringkingfisher.azure.2Medium
AzureAzure Personal Access Tokenkingfisher.azure.3Medium
AzureAzure Container Registry Passwordkingfisher.azure.5MediumYes
Azure Notification HubAzure Notification Hub Access Keykingfisher.azure.notificationhub.4MediumYes
AzuredevopsAzure DevOps Personal Access Tokenkingfisher.azure.devops.2MediumYes
AzureopenaiAzure OpenAI API Keykingfisher.azureopenai.1MediumYes
AzuresearchqueryAzure Search Query Keykingfisher.azuresearch.key.1MediumYes
AzuresearchqueryAzure Search URLkingfisher.azuresearch.url.1Medium
AzurespeechAzure Speech API Keykingfisher.azurespeech.2MediumYes
AzurestorageAzure Storage Account Keykingfisher.azurestorage.2MediumYes
AzuretranslatorAzure Translator API Keykingfisher.azuretranslator.2MediumYes
BaremetricsBaremetrics API Keykingfisher.baremetrics.1MediumYes
BasetenBaseten API Keykingfisher.baseten.1MediumYes
BeamerBeamer API tokenkingfisher.beamer.1MediumYes
BetterstackBetter Stack API Tokenkingfisher.betterstack.1MediumYes
BitbucketBitbucket Client IDkingfisher.bitbucket.1MediumYes
BitbucketBitbucket Secretkingfisher.bitbucket.3MediumYes
BitfinexBitfinex API Secretkingfisher.bitfinex.2Medium
BitlyBitly Access Tokenkingfisher.bitly.1MediumYes
BlynkBlynk Device Access Tokenkingfisher.blynk.1Medium
BlynkBlynk Organization Access Tokenkingfisher.blynk.2Medium
BlynkBlynk Organization Access Tokenkingfisher.blynk.3Medium
BlynkBlynk Organization Client Credentialskingfisher.blynk.8Medium
BlynkBlynk Organization Client Credentialskingfisher.blynk.9Medium
BoxBox API Access Tokenkingfisher.box.1MediumYes
BraintreeBraintree Tokenization Keykingfisher.braintree.1Medium
BranchioBranch.io Live Keykingfisher.branchio.1MediumYes
BranchioBranch.io Test Keykingfisher.branchio.2Medium
BraveBrave Search API Keykingfisher.brave.1MediumYes
BrevoBrevo API Tokenkingfisher.brevo.1HighYes
BrowserstackBrowserStack Access Keykingfisher.browserstack.1MediumYesYes
BuildkiteBuildkite API Keykingfisher.buildkite.1MediumYesYes
BunnynetBunny.net API Keykingfisher.bunnynet.1MediumYes
CalendlyCalendly Personal Access Tokenkingfisher.calendly.1MediumYes
CartoCARTO API Access Token (JWT)kingfisher.carto.1Medium
CerebrasCerebras AI API Keykingfisher.cerebras.1HighYes
CheckoutCheckout.com Secret Keykingfisher.checkout.1HighYes
CheckoutCheckout.com Sandbox Secret Keykingfisher.checkout.2HighYes
CircleciCircleCI API Personal Access Tokenkingfisher.circleci.1HighYes
CircleciCircleCI API Project Tokenkingfisher.circleci.2MediumYes
CiscomerakiCisco Meraki API Keykingfisher.ciscomeraki.1MediumYes
ClarifaiClarifai API Keykingfisher.clarifai.1MediumYes
ClayClay API Keykingfisher.clay.1Medium
ClearbitClearbit API Keykingfisher.clearbit.1MediumYes
ClearoutClearout API Tokenkingfisher.clearout.1MediumYes
ClerkClerk Secret Keykingfisher.clerk.1MediumYes
ClickhouseClickHouse Cloud Secret Keykingfisher.clickhouse.1HighYes
ClockworkClockwork SMS API Keykingfisher.clockwork.1MediumYes
ClojarsClojars API Tokenkingfisher.clojars.2Medium
CloudantIBM Cloudant Legacy Credentialskingfisher.cloudant.1High
CloudflareCloudflare API Tokenkingfisher.cloudflare.1MediumYesYes
CloudflareCloudflare CA Keykingfisher.cloudflare.2MediumYes
CloudinaryCloudinary API Secretkingfisher.cloudinary.1MediumYes
CloudsightCloudSight API Keykingfisher.cloudsight.1MediumYes
CodacyCodacy API Keykingfisher.codacy.1MediumYes
CodeclimateCodeClimate Reporter IDkingfisher.codeclimate.1MediumYes
CodecovCodecov Access Tokenkingfisher.codecov.1MediumYes
CoderabbitCodeRabbit API Keykingfisher.coderabbit.1MediumYes
CohereCohere API Keykingfisher.cohere.1MediumYes
CoinbaseCoinbase Access Tokenkingfisher.coinbase.1UnknownYes
CoinbaseCoinbase CDP API Key (ECDSA)kingfisher.coinbase.2UnknownYes
CoinbaseCoinbase CDP API Key (Ed25519)kingfisher.coinbase.3UnknownYes
CoinlayerCoinlayer API Keykingfisher.coinlayer.1MediumYes
ConfluentConfluent API Secretkingfisher.confluent.2MediumYesYes
ConfluentConfluent API Secret - Updated Formatkingfisher.confluent.3MediumYesYes
ContentfulContentful Delivery API Tokenkingfisher.contentful.1MediumYes
ContentfulContentful Personal Access Tokenkingfisher.contentful.2MediumYes
ContentstackContentstack Management Tokenkingfisher.contentstack.1MediumYes
CouchbaseCouchbase Capella API Keykingfisher.couchbase.1MediumYes
CoverallsCoveralls Personal API Tokenkingfisher.coveralls.2MediumYes
CozeCoze Personal Access Tokenkingfisher.coze.1MediumYes
Crates.Iocrates.io API Keykingfisher.cratesio.1Medium
CredentialsCredentials in a URLkingfisher.credentials.1Medium
CurlCurl Basic Authentication Credentialskingfisher.curl.1Low
CurlCurl Header Authenticationkingfisher.curl.2Low
CurrencylayerCurrencylayer API Keykingfisher.currencylayer.1MediumYes
CursorCursor Integrations (User) API Keykingfisher.cursor.1MediumYes
CustomerioCustomer.io Tracking API Keykingfisher.customerio.1Medium
CustomerioCustomer.io App API Keykingfisher.customerio.2MediumYes
CypressCypress Record Keykingfisher.cypress.1MediumYes
DailyDaily API Keykingfisher.daily.1MediumYes
DatabentoDatabento API Keykingfisher.databento.1MediumYes
DatabricksDatabricks API tokenkingfisher.databricks.1Medium
DatabricksDatabricks API Tokenkingfisher.databricks.2MediumYes
DatadogDatadog API Keykingfisher.datadog.2MediumYes
DatadogDatadog Application Keykingfisher.datadog.3MediumYes
DatagovData.gov API Keykingfisher.datagov.1MediumYes
DatastaxDataStax Astra Application Tokenkingfisher.datastax.1MediumYes
Db2IBM DB2 / AS400 Credentialskingfisher.db2.1Medium
DeepgramDeepgram API Keykingfisher.deepgram.1MediumYes
DeepseekDeepSeek API Keykingfisher.deepseek.1MediumYes
DefinednetworkingDefined Networking API Tokenkingfisher.definednetworking.1MediumYes
DelightedDelighted API Keykingfisher.delighted.1MediumYes
DenoDeno Account Tokenkingfisher.deno.1MediumYes
Dependency TrackDependency-Track API Keykingfisher.dtrack.1Medium
DevcycleDevCycle Client SDK Keykingfisher.devcycle.1MediumYes
DevcycleDevCycle Mobile SDK Keykingfisher.devcycle.2MediumYes
DevcycleDevCycle Server SDK Keykingfisher.devcycle.3MediumYes
DeviantartDeviantArt Access Tokenkingfisher.deviantart.1MediumYesYes
DiffbotDiffbot API Keykingfisher.diffbot.1UnknownYes
DifyDify API Keykingfisher.dify.1MediumYes
DigitaloceanDigitalOcean API Keykingfisher.digitalocean.1MediumYes
DigitaloceanDigitalOcean Refresh Tokenkingfisher.digitalocean.2MediumYes
DiscordDiscord Webhook URLkingfisher.discord.1MediumYes
DiscordDiscord Bot Tokenkingfisher.discord.2MediumYes
DisqusDisqus API Keykingfisher.disqus.1MediumYes
DjangoDjango Secret Keykingfisher.django.1Medium
DockerDocker Registry Credentials (auths JSON)kingfisher.docker.1MediumYes
DockerhubDocker Hub Personal Access Tokenkingfisher.dockerhub.1MediumYes
DockerhubDocker Hub Organization Access Tokenkingfisher.dockerhub.3MediumYes
DocusignDocuSign API Secret Keykingfisher.docusign.1Medium
DopplerDoppler CLI Tokenkingfisher.doppler.1MediumYesYes
DopplerDoppler Personal Tokenkingfisher.doppler.2MediumYesYes
DopplerDoppler Service Tokenkingfisher.doppler.3MediumYesYes
DopplerDoppler Service Account Tokenkingfisher.doppler.4MediumYesYes
DopplerDoppler SCIM Tokenkingfisher.doppler.5MediumYesYes
DopplerDoppler Audit Tokenkingfisher.doppler.6MediumYesYes
DroneciDroneCI Access Tokenkingfisher.drone.1MediumYes
DropboxDropbox API secret/keykingfisher.dropbox.1MediumYes
DuffelDuffel API Tokenkingfisher.duffel.1HighYes
DuoDuo Security Secret Keykingfisher.duo.2Medium
DuplocloudDuploCloud API Keykingfisher.duplocloud.1Medium
DwollaDwolla Client Secretkingfisher.dwolla.2Medium
DynatraceDynatrace Tokenkingfisher.dynatrace.1MediumYes
EasypostEasyPost API tokenkingfisher.easypost.1MediumYes
ElasticemailElastic Email API Keykingfisher.elasticemail.1MediumYes
ElevenlabsElevenLabs API Keykingfisher.elevenlabs.1MediumYes
EndorlabsEndor Labs API Secretkingfisher.endorlabs.2MediumYes
EquinixEquinix Metal / Packet API Tokenkingfisher.equinix.1HighYes
EraserioEraser API Keykingfisher.eraser.1MediumYes
EtsyEtsy Open API Keykingfisher.etsy.1MediumYes
EventbriteEventbrite API Keykingfisher.eventbrite.1MediumYes
ExaaiExa AI API Keykingfisher.exa.1MediumYes
FacebookFacebook Secret Keykingfisher.facebook.2UnknownYes
FacebookFacebook Access Tokenkingfisher.facebook.3Medium
FastlyFastly API tokenkingfisher.fastly.1MediumYes
FernetFernet Symmetric Encryption Keykingfisher.fernet.1High
FigmaFigma Personal Access Tokenkingfisher.figma.1MediumYes
FigmaFigma Personal Access Header Tokenkingfisher.figma.2UnknownYes
FileioFileIO Secret Keykingfisher.fileio.1MediumYes
FilezillaFileZilla base64 encoded passwordkingfisher.filezilla.1Low
FilezillaFileZilla stored password (Pass plaintext)kingfisher.filezilla.2Low
FinicityFinicity API tokenkingfisher.finicity.1MediumYes
FinicityFinicity client secretkingfisher.finicity.2MediumYes
FinnhubFinnhub API Tokenkingfisher.finnhub.1MediumYes
FirebaseFirebase Cloud Messaging Server Keykingfisher.firebase.1Medium
FirebaseFirebase Cloud Messaging Device Tokenkingfisher.firebase.2Medium
FirecrawlFirecrawl API Keykingfisher.firecrawl.1MediumYes
FireworksaiFireworks.ai API Keykingfisher.fireworks.1MediumYes
FixerFixer.io API Keykingfisher.fixer.1MediumYes
FleetbaseFleetbase API Keykingfisher.fleetbase.1MediumYes
FlickrFlickr API Keykingfisher.flickr.1MediumYes
FlickrFlickr OAuth Tokenkingfisher.flickr.2MediumYes
FlutterwaveFlutterwave Public Keykingfisher.flutterwave.1Medium
FlutterwaveFlutterwave Secret Keykingfisher.flutterwave.2Medium
FlyioFly.io API Tokenkingfisher.flyio.1MediumYes
ForestadminForest Admin Auth Secretkingfisher.forestadmin.1High
FoursquareFoursquare Client Secretkingfisher.foursquare.2MediumYes
FrameioFrame.io API Tokenkingfisher.frameio.1MediumYes
FreemiusFreemius Secret Keykingfisher.freemius.1Medium
FreshbooksFreshBooks Access Tokenkingfisher.freshbooks.1MediumYes
FreshdeskFreshdesk API Keykingfisher.freshdesk.2MediumYes
FriendliFriendli.ai API Keykingfisher.friendli.1MediumYes
FtpFTP Connection URI Credentialskingfisher.ftp.1Medium
FullcontactFullContact API Keykingfisher.fullcontact.1MediumYes
FullstoryFullstory API Keykingfisher.fullstory.1MediumYes
GcnotifyGC Notify API Keykingfisher.gcnotify.1MediumYes
GcpGCP API Tokenkingfisher.gcp.1HighYesYes
GcpGCP Private Key IDkingfisher.gcp.3Medium
GemfuryGemfury Deploy or Push Tokenkingfisher.gemfury.1High
GemfuryGemfury Full Access Tokenkingfisher.gemfury.2High
GemstashGemstash API Keykingfisher.gemstash.1High
GenericGeneric Secretkingfisher.generic.1Low
GenericGeneric API Keykingfisher.generic.2Low
GenericGeneric Username and Passwordkingfisher.generic.3Low
GenericGeneric Username and Passwordkingfisher.generic.4Low
GenericGeneric Passwordkingfisher.generic.5Low
GenericWeak Password Patternkingfisher.generic.6Low
GenericGeneric Username and Passwordkingfisher.generic.8Low
GenericDocker Robot Credentials (plaintext pair)kingfisher.generic.9Low
GeoapifyGeoapify API Keykingfisher.geoapify.1MediumYes
GitalkGitalk OAuth Credentialskingfisher.gitalk.1Medium
GiteaGitea Access Tokenkingfisher.gitea.1MediumYes
GithubGitHub Personal Access Token - fine-grained permissionskingfisher.github.1UnknownYesYes
GithubGitHub Personal Access Tokenkingfisher.github.2UnknownYesYes
GithubGitHub OAuth Access Tokenkingfisher.github.3MediumYes
GithubGitHub App User-to-Server Tokenkingfisher.github.4UnknownYes
GithubGitHub App Server-to-Server Tokenkingfisher.github.5UnknownYesYes
GithubGitHub Refresh Tokenkingfisher.github.6UnknownYes
GithubGitHub Legacy Secret Keykingfisher.github.8UnknownYes
GitlabGitLab Private Tokenkingfisher.gitlab.1MediumYesYes
GitlabGitLab Runner Registration Tokenkingfisher.gitlab.2UnknownYes
GitlabGitLab Pipeline Trigger Tokenkingfisher.gitlab.3UnknownYes
GitlabGitLab Private Token - Routable Formatkingfisher.gitlab.4MediumYesYes
GitterGitter Access Tokenkingfisher.gitter.1MediumYes
GocardlessGoCardless API Tokenkingfisher.gocardless.1MediumYes
GodaddyGoDaddy API Credentialskingfisher.godaddy.1MediumYes
GoogleGoogle OAuth Client Secretkingfisher.google.2Medium
GoogleGoogle OAuth Client Secretkingfisher.google.3Medium
GoogleGoogle OAuth Access Tokenkingfisher.google.4Medium
GoogleGoogle OAuth Credentialskingfisher.google.6Medium
GoogleGoogle Gemini API Keykingfisher.google.7MediumYes
Googleoauth2Google OAuth2 Access Tokenkingfisher.google.oauth2.1MediumYes
GradleHardcoded Gradle Credentialskingfisher.gradle.1Medium
GrafanaGrafana API Tokenkingfisher.grafana.1MediumYes
GrafanaGrafana Cloud API Tokenkingfisher.grafana.2MediumYes
GrafanaGrafana Service Account Tokenkingfisher.grafana.3MediumYes
GroqGroq API Keykingfisher.groq.1HighYes
GuardianGuardian API Keykingfisher.guardian.1MediumYes
GumroadGumroad Access Tokenkingfisher.gumroad.1MediumYes
HarnessHarness Personal Access Token (PAT)kingfisher.harness.pat.1MediumYesYes
HashesPassword Hash (Kerberos 5, etype 23, AS-REP)kingfisher.krb5.asrep.23.1Medium
HashesPassword Hash (md5crypt)kingfisher.pwhash.1Medium
HashesPassword Hash (bcrypt)kingfisher.pwhash.2Medium
HashesPassword Hash (sha256crypt)kingfisher.pwhash.3Medium
HashesPassword Hash (sha512crypt)kingfisher.pwhash.4Medium
HashesPassword Hash (Cisco IOS PBKDF2 with SHA256)kingfisher.pwhash.5Medium
HashicorpHashicorp Vault Service Token (< v1.10)kingfisher.hashicorp.1Medium
HashicorpHashicorp Vault Batch Token (< v1.10)kingfisher.hashicorp.2Medium
HashicorpHashicorp Vault Recovery Token (< v1.10)kingfisher.hashicorp.3Medium
HashicorpHashicorp Vault Service Token (>= v1.10)kingfisher.hashicorp.4Medium
HashicorpHashicorp Vault Batch Token (>= v1.10)kingfisher.hashicorp.5Medium
HashicorpHashicorp Vault Recovery Token (>= v1.10)kingfisher.hashicorp.6Medium
HashicorpHashicorp Vault Unseal Keykingfisher.hashicorp.7Medium
HeartlandHeartland Portico API Keykingfisher.heartland.1HighYes
HelpscoutHelp Scout OAuth Client Secretkingfisher.helpscout.2MediumYes
HereapiHERE API Keykingfisher.hereapi.1MediumYes
HerokuHeroku API Keykingfisher.heroku.1MediumYesYes
HerokuHeroku API Key (Platform Key)kingfisher.heroku.2MediumYesYes
HoneycombHoneycomb API Keykingfisher.honeycomb.1MediumYes
HttpHTTP Basic Authenticationkingfisher.http.1Low
HttpHTTP Bearer Tokenkingfisher.http.2Low
HuaweiHuawei Open Platform Client Secretkingfisher.huawei.2Medium
HubspotHubSpot Private App Tokenkingfisher.hubspot.1MediumYes
HuggingfaceHuggingFace User Access Tokenkingfisher.huggingface.1MediumYes
HunterioHunter.io API Keykingfisher.hunterio.1MediumYes
IbmIBM Cloud User API Keykingfisher.ibm.1MediumYes
ImagekitImageKit Private API Keykingfisher.imagekit.1MediumYes
InfluxdbInfluxDB API Tokenkingfisher.influxdb.1MediumYes
InfracostInfracost API Tokenkingfisher.infracost.1HighYes
InfuraInfura API Keykingfisher.infura.1MediumYes
InstagramInstagram Graph API Access Tokenkingfisher.instagram.1HighYes
InstantlyInstantly API Keykingfisher.instantly.1MediumYes
IntercomIntercom API Tokenkingfisher.intercom.1MediumYes
Intra42Intra42 Client Secret (s-s4t2ud/af)kingfisher.intra42.2MediumYes
IonicIonic API tokenkingfisher.ionic.1HighYes
IpstackIpStack API Keykingfisher.ipstack.1MediumYes
IterableIterable API Keykingfisher.iterable.1MediumYes
JdbcJDBC connection string with embedded credentialskingfisher.jdbc.1MediumYes
JenkinsJenkins Token or Crumbkingfisher.jenkins.1Medium
JfrogJFrog API Keykingfisher.jfrog.2MediumYes
JfrogJFrog Identity Tokenkingfisher.jfrog.3MediumYes
JinaJina Search Foundation API Keykingfisher.jina.1HighYes
JiraJira Tokenkingfisher.jira.2MediumYes
JotformJotform API Keykingfisher.jotform.1MediumYes
JumpcloudJumpcloud API Keykingfisher.jumpcloud.1MediumYes
JwtJSON Web Token (base64url-encoded)kingfisher.jwt.1MediumYes
KagiKagi API Keykingfisher.kagi.1MediumYes
KairosKairos API Keykingfisher.kairos.2Medium
KeenioKeen.io API Keykingfisher.keenio.1MediumYes
KeycloakKeycloak Client Secretkingfisher.keycloak.2Medium
KickboxKickbox API Keykingfisher.kickbox.1MediumYes
KlaviyoKlaviyo API Keykingfisher.klaviyo.1MediumYes
KlingaiKling AI Secret Keykingfisher.klingai.1MediumYes
KrakenKraken API Secretkingfisher.kraken.1Medium
KubernetesKubernetes Bootstrap Tokenkingfisher.kubernetes.2MediumYes
KubernetesKubernetes Bootstrap Token Pairkingfisher.kubernetes.3MediumYes
KucoinKuCoin API Keykingfisher.kucoin.1Medium
KucoinKuCoin API Secretkingfisher.kucoin.2Medium
LaceworkLacework API Secretkingfisher.lacework.2High
LangchainLangSmith Personal Access Tokenkingfisher.langchain.1UnknownYes
LangchainLangSmith Service Keykingfisher.langchain.2UnknownYes
LangfuseLangfuse Secret Keykingfisher.langfuse.1MediumYes
LaravelLaravel Application Encryption Keykingfisher.laravel.1High
LarkLarkSuite Tenant Access Tokenkingfisher.lark.1MediumYes
LarkLarkSuite User Access Tokenkingfisher.lark.2MediumYes
LarkLarkSuite App Access Tokenkingfisher.lark.3MediumYes
LaunchdarklyLaunchDarkly Access Tokenkingfisher.launchdarkly.1MediumYes
LdapLDAP Credentialskingfisher.ldap.1Medium
LemonsqueezyLemonSqueezy API Keykingfisher.lemonsqueezy.1MediumYes
LineLine Messaging API Tokenkingfisher.line.1MediumYes
LinearLinear API Keykingfisher.linear.1MediumYes
LinkedinLinkedIn Client IDkingfisher.linkedin.1MediumYes
LinkedinLinkedIn Secret Keykingfisher.linkedin.2MediumYes
LinodeLinode Personal Access Tokenkingfisher.linode.1MediumYes
LlamacloudLlama Cloud API Keykingfisher.llamacloud.1High
LobLob API Keykingfisher.lob.1MediumYes
LobLob Publishable API Keykingfisher.lob.2MediumYes
LokaliseLokalise API Tokenkingfisher.lokalise.1MediumYes
LookerLooker Client IDkingfisher.looker.2Medium
LookerLooker Client Secretkingfisher.looker.3MediumYes
MailchimpMailchimp API Keykingfisher.mailchimp.1MediumYes
MailgunMailGun Tokenkingfisher.mailgun.1MediumYes
MailgunMailGun Primary Keykingfisher.mailgun.2MediumYes
MailjetMailJetSMS API Keykingfisher.mailjet.1MediumYes
MailjetMailJet Basic Authkingfisher.mailjet.2MediumYes
MandrillMandrill API Keykingfisher.mandrill.1MediumYes
MapboxMapbox Public Access Tokenkingfisher.mapbox.1MediumYes
MapboxMapbox Secret Access Tokenkingfisher.mapbox.2MediumYesYes
MapboxMapbox Temporary Access Tokenkingfisher.mapbox.3MediumYes
MariadbMariaDB Credentialskingfisher.mariadb.1Medium
MattermostMattermost Access Tokenkingfisher.mattermost.2MediumYes
MaxmindMaxMind License Keykingfisher.maxmind.1MediumYes
MercadopagoMercado Pago Access Tokenkingfisher.mercadopago.1MediumYes
MercuryMercury Production API Tokenkingfisher.mercury.1MediumYes
MercuryMercury Non-Production API Tokenkingfisher.mercury.2MediumYes
MergifyMergify Application API Keykingfisher.mergify.1HighYes
MessagebirdMessageBird API Tokenkingfisher.messagebird.1MediumYes
Microsoft TeamsMicrosoft Teams Webhookkingfisher.msteams.1MediumYes
MicrosoftteamswebhookMicrosoft Teams Webhookkingfisher.microsoftteamswebhook.1MediumYes
MidtransMidtrans Sandbox Server/Client Keykingfisher.midtrans.1HighYes
MidtransMidtrans Production Server/Client Keykingfisher.midtrans.2HighYes
MiroMiro Access Tokenkingfisher.miro.1MediumYes
MistralMistral AI API Keykingfisher.mistral.1MediumYes
MixpanelMixpanel API Secretkingfisher.mixpanel.1MediumYes
ModalModal CLI Token Pairkingfisher.modal.1HighYes
MondayMonday.com API Keykingfisher.monday.1MediumYes
MoneywaveMoneywave / Flutterwave Private Keykingfisher.moneywave.1High
MongodbMongoDB API Private Keykingfisher.mongodb.1UnknownYesYes
MongodbMongoDB URI Connection Stringkingfisher.mongodb.3UnknownYes
MongodbMongoDB Atlas Service Account Tokenkingfisher.mongodb.4UnknownYes
MssqlMSSQL Credentialskingfisher.mssql.1Medium
MuxMux Access Token Secretkingfisher.mux.1MediumYes
MysqlMySQL URI with Credentialskingfisher.mysql.1MediumYes
NasaNASA API Keykingfisher.nasa.1UnknownYes
Neo4JNeo4j Database Credentialskingfisher.neo4j.1Medium
NeonNeon API Keykingfisher.neon.1HighYes
NessusNessus Agent Linking Keykingfisher.nessus.1High
NetlifyNetlify API Keykingfisher.netlify.1UnknownYes
NetlifyNetlify API Keykingfisher.netlify.2MediumYes
Netrcnetrc Credentialskingfisher.netrc.1Medium
NewrelicNew Relic Personal API Keykingfisher.newrelic.1MediumYes
NewsapiNewsAPI API Keykingfisher.newsapi.1MediumYes
NgrokNgrok API Keykingfisher.ngrok.1UnknownYes
NotionNotion Legacy Tokenkingfisher.notion.1MediumYes
NotionNotion Tokenkingfisher.notion.2MediumYes
NotionNotion OAuth Refresh Tokenkingfisher.notion.3Medium
NpmNPM Access Token (fine-grained)kingfisher.npm.1MediumYesYes
NpmNPM Access Token (old format)kingfisher.npm.2MediumYesYes
NugetNuGet API Keykingfisher.nuget.1MediumYes
NugetNuGet API Keykingfisher.nuget.2MediumYes
NumverifyNumverify API Keykingfisher.numverify.1MediumYes
NvidiaNVIDIA NIM API Keykingfisher.nvidia.nim.1MediumYes
NxcloudNx Cloud Access Tokenkingfisher.nxcloud.1HighYes
NylasNylas API Keykingfisher.nylas.1MediumYes
NytimesNew York Times API Keykingfisher.nytimes.1MediumYes
OctopusdeployOctopus Deploy API Keykingfisher.octopusdeploy.2MediumYes
OdbcCredentials in ODBC Connection Stringkingfisher.odbc.1Medium
OktaOkta API Tokenkingfisher.okta.1UnknownYes
OllamaOllama API Keykingfisher.ollama.1MediumYes
Onepassword1Password Service-Account Tokenkingfisher.1password.1MediumYes
Onepassword1Password Account Secret Keykingfisher.1password.2Medium
OnesignalOneSignal REST API Keykingfisher.onesignal.1MediumYes
OpenaiOpenAI API Keykingfisher.openai.1MediumYes
OpenaiOpenAI API Keykingfisher.openai.2MediumYes
OpenaiOpenAI API Key (Short Prefixed)kingfisher.openai.3MediumYes
OpenrouterOpenRouter API Keykingfisher.openrouter.1MediumYes
OpenshiftOpenShift OAuth Access Tokenkingfisher.openshift.2MediumYes
OpenweathermapOpenWeather Map API Keykingfisher.openweather.1MediumYes
OpsgenieOpsGenie API Keykingfisher.opsgenie.1UnknownYes
OptimizelyOptimizely Personal Access Tokenkingfisher.optimizely.1MediumYes
OracleOracle Database Connection URIkingfisher.oracle.1Medium
OvhOVH Application Secretkingfisher.ovh.2Medium
OwlbotOwlbot API Keykingfisher.owlbot.1MediumYes
PackagecloudPackageCloud API Keykingfisher.packagecloud.1MediumYes
PagerdutyapikeyPagerDuty API Keykingfisher.pagerduty.1MediumYes
Particle.Ioparticle.io Access Tokenkingfisher.particleio.1MediumYesYes
Particle.Ioparticle.io Access Tokenkingfisher.particleio.2MediumYesYes
PastebinPastebin API Keykingfisher.pastebin.1MediumYes
PaypalPayPal OAuth Secretkingfisher.paypal.2UnknownYes
PaystackPaystack API Keykingfisher.paystack.1MediumYes
PdflayerPdfLayer API Keykingfisher.pdflayer.1MediumYes
PemPEM-Encoded Private Keykingfisher.pem.1High
PemBase64-PEM-Encoded Private Keykingfisher.pem.2High
PendoPendo Integration Keykingfisher.pendo.1MediumYes
PepipostPepipost API Keykingfisher.pepipost.1MediumYes
PerplexityPerplexity AI API Keykingfisher.perplexity.1MediumYes
PhpmailerPHPMailer Credentialskingfisher.phpmailer.1Medium
PineconePinecone API Keykingfisher.pinecone.1MediumYes
PingdomPingdom API Tokenkingfisher.pingdom.1MediumYes
PingidentityPingOne Client Secretkingfisher.pingidentity.2Medium
PipedrivePipedrive API Tokenkingfisher.pipedrive.1HighYes
PlaidPlaid Secret (Production)kingfisher.plaid.2MediumYes
PlaidPlaid Secret (Sandbox)kingfisher.plaid.3MediumYes
PlaidPlaid Access Token (Production)kingfisher.plaid.4MediumYes
PlaidPlaid Access Token (Sandbox)kingfisher.plaid.5MediumYes
PlanetscalePlanetScale API Tokenkingfisher.planetscale.1UnknownYes
PlivoPlivo Auth Tokenkingfisher.plivo.2MediumYes
PolymarketPolymarket Builder API Keykingfisher.polymarket.3Medium
PositionstackPositionstack API Keykingfisher.positionstack.1MediumYes
PostgresPostgres URL with hardcoded passwordkingfisher.postgres.1MediumYes
PosthogPostHog Personal API Keykingfisher.posthog.2MediumYes
PosthogPostHog Feature Flags Secure API Keykingfisher.posthog.3Medium
PosthogPostHog OAuth Access Tokenkingfisher.posthog.4Medium
PosthogPostHog OAuth Refresh Tokenkingfisher.posthog.5Medium
PostmanPostman API Keykingfisher.postman.1MediumYes
PostmarkPostmark API Tokenkingfisher.postmark.1MediumYes
PrefectPrefect API Tokenkingfisher.prefect.1MediumYes
PrivateaiPrivate AI API Keykingfisher.privateai.1MediumYes
PrivkeyContains encrypted RSA private keykingfisher.privkey.1High
PrivkeyContains Private Keykingfisher.privkey.2High
PsexecCredentials in PsExeckingfisher.psexec.1Medium
PubnubPubNub Publish Keykingfisher.pubnub.1UnknownYes
PubnubPubNub Subscription Keykingfisher.pubnub.2MediumYes
PulumiPulumi API Keykingfisher.pulumi.1UnknownYes
PushbulletPushbullet Access Tokenkingfisher.pushbullet.1MediumYes
PusherPusher Channels App Secretkingfisher.pusher.2Medium
PypiPyPI Upload Tokenkingfisher.pypi.1MediumYes
RabbitmqRabbitMQ Credentialkingfisher.rabbitmq.1Medium
RailsRails Master Keykingfisher.rails.1High
RailsRails Secret Key Basekingfisher.rails.2High
RailwayRailway API Tokenkingfisher.railway.1MediumYes
RapidapiRapidAPI Keykingfisher.rapidapi.1MediumYes
RazorpayRazorpay API Keykingfisher.razorpay.1MediumYes
RazorpayRazorpay Test API Keykingfisher.razorpay.2MediumYes
ReactReact App Usernamekingfisher.reactapp.1Medium
ReactReact App Passwordkingfisher.reactapp.2Medium
ReadmeReadMe API Keykingfisher.readme.1MediumYes
RecaptchareCAPTCHA API Keykingfisher.recaptcha.1MediumYes
RedisRedis URI Connection Stringkingfisher.redis.1Medium
RedisPython Redis Client Debug Outputkingfisher.redis.2Medium
RedisRedis Password (Standalone Config)kingfisher.redis.3Low
RedshiftAmazon Redshift Connection URIkingfisher.redshift.1Medium
RenderRender API Keykingfisher.render.1MediumYes
ReplicateReplicate API Tokenkingfisher.replicate.1MediumYes
ResendResend API Keykingfisher.resend.api_key.1HighYes
RetellaiRetell AI API Keykingfisher.retellai.1MediumYes
RingcentralRingCentral Client Secretkingfisher.ringcentral.2Medium
RiotRiot Games API Keykingfisher.riot.2MediumYes
RollbarRollbar Access Tokenkingfisher.rollbar.1MediumYes
RubygemsRubyGems API Keykingfisher.rubygems.1MediumYes
RunwayRunway API Keykingfisher.runway.1MediumYes
SalesforceSalesforce Access Tokenkingfisher.salesforce.1MediumYes
SalesforceSalesforce Consumer Keykingfisher.salesforce.3Medium
SalesforceSalesforce Consumer Secretkingfisher.salesforce.4Medium
SalesforceSalesforce Consumer Key and Secretkingfisher.salesforce.5Medium
SalesforceSalesforce Refresh Tokenkingfisher.salesforce.6Medium
SalesforceSalesforce Connected App Consumer Key (Prefixed)kingfisher.salesforce.7MediumYes
SalesloftSalesloft API Keykingfisher.salesloft.1MediumYes
SamsaraSamsara API Token (prefixed)kingfisher.samsara.1HighYes
SamsaraSamsara API Token (contextual)kingfisher.samsara.2LowYes
SanitySanity API Tokenkingfisher.sanity.1MediumYes
SauceSauce Labs Access Keykingfisher.saucelabs.3MediumYes
ScaleScale API Keykingfisher.scale.1MediumYes
ScaleScale Callback Auth Keykingfisher.scale.2Medium
ScalewayScaleway Secret Keykingfisher.scaleway.1MediumYes
ScalingoScalingo API Tokenkingfisher.scalingo.1MediumYes
ScalrScalr API Access Tokenkingfisher.scalr.1HighYes
ScraperapiScraperAPI Keykingfisher.scraperapi.1MediumYes
SegmentSegment Public API Tokenkingfisher.segment.1MediumYes
SegmentSegment API Keykingfisher.segment.2MediumYes
SendbirdSendbird API Tokenkingfisher.sendbird.2MediumYes
SendgridSendgrid API tokenkingfisher.sendgrid.1MediumYesYes
SendinblueSendinblue API Tokenkingfisher.sendinblue.1MediumYes
SentrySentry Access Tokenkingfisher.sentry.1MediumYes
SentrySentry Organization Tokenkingfisher.sentry.2MediumYes
SentrySentry User Tokenkingfisher.sentry.3MediumYes
SerpapiSerpApi API Keykingfisher.serpapi.1MediumYes
SettlemintSettleMint Personal Access Tokenkingfisher.settlemint.1Medium
SettlemintSettleMint Application Access Tokenkingfisher.settlemint.2Medium
SettlemintSettleMint Service Access Tokenkingfisher.settlemint.3Medium
ShippoShippo API Tokenkingfisher.shippo.1MediumYes
ShodanSHODAN API Keykingfisher.shodan.1MediumYes
ShopifyShopify access tokenkingfisher.shopify.1UnknownYes
ShortcutShortcut API Tokenkingfisher.shortcut.1MediumYes
ShutterstockShutterstock OAuth Tokenkingfisher.shutterstock.1MediumYes
SidekiqSidekiq Enterprise Credentialkingfisher.sidekiq.1Medium
SidekiqSidekiq Sensitive URLkingfisher.sidekiq.2Medium
SignifydSignifyd API Keykingfisher.signifyd.1MediumYes
SlackSlack App Tokenkingfisher.slack.1UnknownYesYes
SlackSlack Tokenkingfisher.slack.2UnknownYesYes
SlackSlack Webhookkingfisher.slack.4UnknownYes
SmbSMB / CIFS Connection URIkingfisher.smb.1Medium
SmtpSMTP Credentialskingfisher.smtp.1Medium
SnowflakeSnowflake Connection URI Credentialskingfisher.snowflake.1Medium
SnykSnyk API Keykingfisher.snyk.1UnknownYes
SolrApache Solr Connection URIkingfisher.solr.1Medium
SonarcloudSonarCloud API Tokenkingfisher.sonarcloud.1UnknownYes
SonarqubeSonarQube API Keykingfisher.sonarqube.1UnknownYes
SonarqubeSonarQube Tokenkingfisher.sonarqube.3Medium
SourcegraphSourcegraph Access Tokenkingfisher.sourcegraph.1UnknownYes
SourcegraphSourcegraph _Legacy_ API Keykingfisher.sourcegraph.2MediumYes
SourcegraphSourcegraph Cody Gateway Keykingfisher.sourcegraph.3MediumYes
SparkpostSparkPost API Keykingfisher.sparkpost.1MediumYes
SplunkSplunk Authentication Tokenkingfisher.splunk.1Medium
SpotifySpotify Access Tokenkingfisher.spotify.1MediumYes
SqreenSqreen Tokenkingfisher.sqreen.1High
SquareSquare Access Tokenkingfisher.square.1MediumYes
SquareSquare Access Tokenkingfisher.square.2MediumYes
SquareSquare OAuth Secretkingfisher.square.3MediumYes
SquarespaceSquarespace API Keykingfisher.squarespace.1MediumYes
SshpassSSH / SCP Password (sshpass)kingfisher.sshpass.1Medium
SslmateSslMate API Keykingfisher.sslmate.1MediumYes
StabilityaiStability AI API Keykingfisher.stabilityai.1MediumYes
StackhawkStackHawk API Keykingfisher.stackhawk.1MediumYes
StatsigStatsig Server Secret Keykingfisher.statsig.1HighYes
StatuscakeStatusCake API Tokenkingfisher.statuscake.1MediumYes
StatuspageStatuspage API Keykingfisher.statuspage.1MediumYes
StoryblokStoryblok API Tokenkingfisher.storyblok.1MediumYes
StravaStrava Access Tokenkingfisher.strava.1MediumYes
StreamStream.io API Secretkingfisher.stream.2Medium
StripeStripe Publishable Keykingfisher.stripe.1Medium
StripeStripe Secret / Restricted Keykingfisher.stripe.2MediumYes
StytchStytch Project Secretkingfisher.stytch.2MediumYes
SumologicSumo Logic Access Keykingfisher.sumologic.2MediumYesYes
SupabaseSupabase Management Tokenkingfisher.supabase.1MediumYes
SupabaseSupabase Project API Keykingfisher.supabase.2MediumYes
SurgeSurge.sh Deploy Tokenkingfisher.surge.1High
TableauTableau Personal Access Tokenkingfisher.tableau.1Medium
TailscaleTailscale API Keykingfisher.tailscale.1MediumYesYes
TavilyTavily API Keykingfisher.tavily.1MediumYes
TavusTavus API Keykingfisher.tavus.1MediumYes
TeamcityTeamCity API Tokenkingfisher.teamcity.1Unknown
TelegramTelegram Bot Tokenkingfisher.telegram.1MediumYes
TemporalTemporal Cloud API Keykingfisher.temporal.1MediumYes
TencentTencent Cloud Secret Keykingfisher.tencent.2Medium
TerraformTerraform Cloud / HCP Terraform API Tokenkingfisher.terraform.1HighYes
TestkubeTestkube API Keykingfisher.testkube.1MediumYes
ThingsboardThingsBoard Access Tokenkingfisher.thingsboard.1Medium
ThingsboardThingsBoard Provision Device Keykingfisher.thingsboard.2Medium
ThingsboardThingsBoard Provision Device Secretkingfisher.thingsboard.3Medium
ThycoticThycotic / Delinea Secret Server Credentialskingfisher.thycotic.1Medium
TodoistTodoist API Tokenkingfisher.todoist.1MediumYes
TogetheraiTogether.ai API Keykingfisher.together.1MediumYes
TravisciTravis CI Tokenkingfisher.travisci.1MediumYes
TravisciTravis CI Encrypted Variablekingfisher.travisci.2Medium
TrelloTrello API Tokenkingfisher.trello.1Medium
TrendmicroTrend Micro Deep Security API Keykingfisher.trendmicro.1HighYes
TrendmicroTrend Micro Cloud One API Keykingfisher.trendmicro.2HighYes
TruenasTrueNAS API Key (WebSocket)kingfisher.truenas.1MediumYes
TruenasTrueNAS API Key (REST API)kingfisher.truenas.2MediumYes
TruenasTrueNAS API Key (keyword proximity)kingfisher.truenas.4MediumYes
TwilioTwilio API Keykingfisher.twilio.2UnknownYesYes
TwitchTwitch API Tokenkingfisher.twitch.1MediumYesYes
TwitterX / Twitter Bearer Token (App-only)kingfisher.twitter.1MediumYes
TwitterX / Twitter Consumer Secretkingfisher.twitter.3UnknownYes
TypeformTypeform API Tokenkingfisher.typeform.1MediumYes
UberUber Server Tokenkingfisher.uber.1High
UbidotsUbidots API Keykingfisher.ubidots.1High
UnkeyUnkey Root Keykingfisher.unkey.1MediumYes
UnkeyUnkey API Key (key_ prefix)kingfisher.unkey.2MediumYes
UnkeyUnkey API Key Secret (creation-only plaintext)kingfisher.unkey.3Medium
UnsplashUnsplash Access Keykingfisher.unsplash.1MediumYes
UptimerobotUptimeRobot API Keykingfisher.uptimerobot.1MediumYes
UriURI with Username and Secretkingfisher.uri.1MediumYes
Urlscanurlscan.io API Keykingfisher.urlscan.1MediumYes
VapiVapi API Keykingfisher.vapi.1MediumYes
VastaiVast.ai API Keykingfisher.vastai.1MediumYes
VercelVercel API Token (legacy 24-char)kingfisher.vercel.1MediumYesYes
VercelVercel Personal Access Token (vcp_)kingfisher.vercel.2MediumYesYes
VercelVercel Integration Token (vci_)kingfisher.vercel.3MediumYesYes
VercelVercel App Access Token (vca_)kingfisher.vercel.4MediumYesYes
VercelVercel App Refresh Token (vcr_)kingfisher.vercel.5MediumYesYes
VercelVercel AI Gateway API Key (vck_)kingfisher.vercel.6MediumYes
VirustotalVirusTotal API Keykingfisher.virustotal.1MediumYes
VkontakteVKontakte Access Tokenkingfisher.vkontakte.1HighYes
VmwareCredentials in Connect-VIServer Invocationkingfisher.vmware.1Unknown
VonageVonage (Nexmo) API Secretkingfisher.vonage.2MediumYes
VoyageaiVoyage AI API Keykingfisher.voyageai.api_keyHighYes
VultrVultr API Keykingfisher.vultr.1MediumYesYes
WakatimeWakaTime API Keykingfisher.wakatime.1MediumYes
WakatimeWakaTime Prefixed API Keykingfisher.wakatime.2MediumYes
WeatherapiWeatherAPI.com API Keykingfisher.weatherapi.1MediumYes
WebexWebex Integration Client Secretkingfisher.webex.2Medium
WebflowWebflow API Tokenkingfisher.webflow.1MediumYes
WechatWeChat App Secretkingfisher.wechat.2Medium
WeightsandbiasesWeights and Biases API Keykingfisher.wandb.1MediumYes
WeightsandbiasesWeights and Biases API Key (v1)kingfisher.wandb.2MediumYes
WepayWePay Access Tokenkingfisher.wepay.1HighYes
WireguardWireGuard Private Keykingfisher.wireguard.1Medium
WireguardWireGuard Preshared Keykingfisher.wireguard.2Medium
WizWiz Client Secretkingfisher.wiz.2MediumYes
WorkatoWorkato API Tokenkingfisher.workato.1MediumYes
WpengineWPEngine API Keykingfisher.wpengine.1MediumYes
XaixAI (Grok) API Keykingfisher.xai.1MediumYes
YahooYahoo OAuth2 Client Secretkingfisher.yahoo.2Medium
YandexYandex API Keykingfisher.yandex.1MediumYes
YelpYelp API Keykingfisher.yelp.1MediumYes
YousignYouSign API Keykingfisher.yousign.1HighYes
YoutubeYouTube API Keykingfisher.youtube.1MediumYes
ZapierZapier Webhook URLkingfisher.zapier.1Medium
ZendeskZendesk API Tokenkingfisher.zendesk.3MediumYes
ZerobounceZeroBounce API Keykingfisher.zerobounce.1MediumYes
ZhipuZhipu (BigModel) API Keykingfisher.zhipu.1MediumYes
ZohocrmZoho CRM API Access Tokenkingfisher.zohocrm.1MediumYes
ZoomZoom OAuth Client Secretkingfisher.zoom.2Medium
ZuploZuplo API Keykingfisher.zuplo.1MediumYes
diff --git a/docs-site/docs/rules/overview.md b/docs-site/docs/rules/overview.md new file mode 100644 index 0000000..f8780f2 --- /dev/null +++ b/docs-site/docs/rules/overview.md @@ -0,0 +1,923 @@ +--- +title: "Writing Custom Rules" +description: "Write custom YAML-based detection rules with regex patterns, entropy thresholds, validation, revocation, and checksum intelligence." +--- + +# Writing Custom Rules for Kingfisher + +A _rule_ in Kingfisher is a YAML document that describes how to detect and (optionally) validate or revoke secrets in your codebase. With custom rules you can: + +- **Extend** Kingfisher without touching Rust code +- **Tune** sensitivity via entropy and confidence +- **Plug in** live checks against external services + +This document explains how to write custom rules for Kingfisher using a YAML-based rule system. The rules define regular expressions to detect secrets in source code and other textual data, and they can include validation or revocation steps to confirm or invalidate the secret. By using a rules-based system, Kingfisher is highly extensible—new rules can be added or existing ones modified without changing the core code. + +## 1. Rule Schema + +Each rule file defines one or more entries under a top‑level `rules:` list. Every entry supports the following fields: + +```yaml +rules: + - name: # (string) Human-friendly rule name + id: # (string) Unique identifier (e.g. kingfisher.aws.1) + + pattern: | # (multi-line regex) Detection pattern + (?x)(?i) + aws + (?:.|[\n\r]){0,32}? + \b([A-Za-z0-9/+=]{40})\b + + min_entropy: 3.5 # (float) Minimum Shannon entropy + confidence: medium # (enum: low | medium | high) + + examples: # (list) strings that must match + - AWS_SECRET="AKIA…" + + references: # (optional list) context URLs + - https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html + + visible: true # (bool) hide helper matches when false + + depends_on_rule: # (optional) capture chaining + - rule_id: kingfisher.aws.id + variable: AKID # referenced as {{ AKID }} + + pattern_requirements: # (optional) character/word requirements + min_digits: 1 # require at least 1 digit + min_uppercase: 1 # require at least 1 uppercase letter + min_lowercase: 1 # require at least 1 lowercase letter + min_special_chars: 1 # require at least 1 special character + special_chars: "!@#$%^&*()" # optional: custom special character set + ignore_if_contains: # optional: drop matches containing these words + - test + + validation: # (optional) live validation + type: Http + content: + request: + method: GET + url: https://api.example.com/v1/check + headers: + X-Secret: "{{ TOKEN }}" + X-Id: "{{ AKID }}" + response_is_html: true # by default, validation responses containing HTML or considered invalid. Set to `true` if you expect HTML returned from a validation response + response_matcher: + - report_response: true # always include raw payload + - type: StatusMatch + status: [200] # positive check + - type: StatusMatch + status: [401,403] + negative: true # negative check → must NOT match + - type: HeaderMatch + header: content-type + expected: ["application/json"] + - type: JsonValid + + # NOTE: Some providers are gRPC-only (no REST endpoint). For those, use Grpc validation. + validation: + type: Grpc + content: + request: + url: https://api.example.com/./ + headers: + content-type: application/grpc + te: trailers + Authorization: "Bearer {{ TOKEN }}" + # Raw bytes are allowed (YAML \\u0000 escapes become NUL bytes). + body: "\\u0000\\u0000\\u0000\\u0000\\u0000" + response_matcher: + - report_response: true + - type: HeaderMatch + header: grpc-status + expected: ["0"] + + revocation: # (optional) revoke a secret + type: Http + content: + request: + method: POST + url: https://api.example.com/v1/revoke + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - report_response: true + - type: StatusMatch + status: [200, 202] + +``` + +AWS access key revocation can use: + +```yaml +revocation: + type: AWS +``` + +GCP service account key revocation can use: + +```yaml +revocation: + type: GCP +``` + +### Multi-Step Revocation + +Some services require a 2-step revocation process: +1. **Lookup Step**: Make a request to retrieve an ID or token +2. **Delete Step**: Use that ID to perform the actual revocation + +For these cases, use `HttpMultiStep`: + +```yaml +revocation: + type: HttpMultiStep + content: + steps: + - name: lookup_token_id # Step 1: Get the token ID + request: + method: GET + url: https://api.example.com/v1/tokens/current + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - type: StatusMatch + status: [200] + extract: # Extract values from response + TOKEN_ID: # Variable name (uppercase) + type: JsonPath # Extraction method + path: "$.data.id" # JSONPath to the value + + - name: revoke_token # Step 2: Delete using the ID + request: + method: DELETE + url: https://api.example.com/v1/tokens/{{ TOKEN_ID }} + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - report_response: true + - type: StatusMatch + status: [204] +``` + +| Field | What it does | +| ----------------------- | -------------------------------------------------------------------- | +| name | Friendly name shown in reports | +| id | Unique text ID (namespace.v#) used internally | +| pattern | Regex used to spot secrets (free‑spacing & flags allowed) | +| min_entropy | Threshold to guard against low‑complexity false positives | +| confidence | Suggests severity: low → high | +| examples | Good matches; used for testing | +| visible | false to hide non‑secret captures (e.g. IDs) | +| depends_on_rule | Chain rules: use captures from one rule in another's validation | +| pattern_requirements | Require character types and/or exclude placeholder words from matches | +| validation | Configure HTTP, AWS, GCP, etc. checks to verify live validity | +| revocation | Configure HTTP, AWS, or multi-step revocation for a detected secret | + +## gRPC Validation (Grpc) + +Some services (notably CLI/SDK control planes) are **gRPC-only**. For these, `validation: type: Http` +is not sufficient because gRPC status is typically returned via HTTP/2 trailers (`grpc-status`, +`grpc-message`). Kingfisher’s `Grpc` validator performs an HTTP/2 request and evaluates matchers +against the merged headers+trailers. + +`Grpc` is currently intended for unary requests and expects you to provide a fully-qualified method URL: + +```yaml +validation: + type: Grpc + content: + request: + url: https://api.modal.com/modal.client.ModalClient/ClientHello + headers: + content-type: application/grpc + te: trailers + x-modal-token-id: "{{ TOKEN_ID }}" + x-modal-token-secret: "{{ TOKEN }}" + x-modal-client-type: "1" + x-modal-client-version: "1.0.0" + body: "\u0000\u0000\u0000\u0000\u0000" # Empty protobuf frame + response_matcher: + - report_response: true + - type: HeaderMatch + header: grpc-status + expected: ["0"] +``` + + +*responser_matcher* variants. Multiple can be used + +| Variant | Required keys | Behavior | +|-----------------|-------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------| +| **StatusMatch** | `status` (list\)
`negative` (bool, default `false`) | Pass when codes match (or don’t match if `negative`). | +| **WordMatch** | `words` (list\)
`match_all_words` (bool)
`negative` (bool) | Word/substring checks in body. | +| **HeaderMatch** | `header` (string)
`expected` (list\)
`match_all_values` (bool) | Header value assertions. | +| **JsonValid** | – | Pass only if body parses as JSON. Use when response is expected as JSON data | +| **XmlValid** | – | Pass only if body parses as well-formed XML. Use when response is expected as XML data | +| **ReportResponse** | `report_response` (bool) | Include raw payload in finding for debugging. | + +## 2. Multi-Step Revocation + +Some APIs require a two-step revocation process: + +1. **Step 1 (Lookup)**: Query the API to retrieve an internal ID, token identifier, or other metadata +2. **Step 2 (Delete)**: Use the extracted value(s) to perform the actual revocation/deletion + +Kingfisher supports up to 2 sequential steps in a revocation workflow. Each step can extract values from its response, making them available as variables in subsequent steps. + +### Response Extractors + +Values can be extracted from HTTP responses using the following methods: + +| Extractor Type | Description | Example | +|----------------|-------------|---------| +| **JsonPath** | Extract from JSON response using JSONPath syntax | `$.data.id`, `$.items[0].token_id` | +| **Regex** | Extract using regex with a capture group | `"token_id":\s*"([^"]+)"` | +| **Header** | Extract an HTTP response header value | `X-Token-ID` | +| **Body** | Use the entire response body as-is | - | +| **StatusCode** | Extract the HTTP status code as a string | - | + +### Multi-Step Revocation Schema + +```yaml +revocation: + type: HttpMultiStep + content: + steps: + - name: # Optional: human-readable step name + request: # Standard HTTP request configuration + method: GET|POST|DELETE|... + url: https://api.example.com/... + headers: + Header-Name: "value" + body: "optional request body" + response_matcher: # Required for final step only + - type: StatusMatch + status: [200] + extract: # Optional: extract variables from response + VARIABLE_NAME: # Variable name (uppercase recommended) + type: JsonPath|Regex|Header|Body|StatusCode + path: "$.path.to.value" # For JsonPath + pattern: "regex pattern" # For Regex (use first capture group) + name: "header-name" # For Header + + - name: # Subsequent steps can use extracted variables + request: + method: DELETE + url: https://api.example.com/tokens/{{ VARIABLE_NAME }} + response_matcher: + - type: StatusMatch + status: [204] +``` + +### Multi-Step Revocation Requirements + +- **Minimum 1, Maximum 2 steps**: You must define at least 1 step and no more than 2 steps +- **Final step requires response_matcher**: The last step must include a `response_matcher` to determine success/failure +- **Intermediate steps are optional**: Earlier steps don't require response matchers but can have them for validation +- **Variables flow forward**: Variables extracted in step 1 are available in step 2 via Liquid templates (e.g., `{{ TOKEN_ID }}`) +- **All standard Liquid filters apply**: You can use filters on extracted variables just like with `{{ TOKEN }}` + +### Example 1: Basic Two-Step Revocation + +This example shows a service that requires looking up a token's ID before deletion: + +```yaml +rules: + - name: Example Service Token + id: kingfisher.example.1 + pattern: | + (?xi) + example_token_ + [A-Za-z0-9]{32} + min_entropy: 3.5 + examples: + - example_token_abc123def456ghi789jkl012mno345 + validation: + type: Http + content: + request: + method: GET + url: https://api.example.com/v1/auth/verify + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - type: StatusMatch + status: [200] + revocation: + type: HttpMultiStep + content: + steps: + # Step 1: Look up the token ID + - name: lookup_token_id + request: + method: GET + url: https://api.example.com/v1/tokens/current + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - type: StatusMatch + status: [200] + extract: + TOKEN_ID: + type: JsonPath + path: "$.data.token_id" + + # Step 2: Delete the token using the ID + - name: delete_token + request: + method: DELETE + url: https://api.example.com/v1/tokens/{{ TOKEN_ID }} + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - report_response: true + - type: StatusMatch + status: [204] +``` + +### Example 2: Using Multiple Extraction Methods + +This example demonstrates extracting values using different methods: + +```yaml +revocation: + type: HttpMultiStep + content: + steps: + # Step 1: Get metadata from multiple sources + - name: get_token_metadata + request: + method: GET + url: https://api.service.com/tokens/info + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - type: StatusMatch + status: [200] + extract: + # Extract from JSON body + TOKEN_ID: + type: JsonPath + path: "$.id" + + # Extract from response header + ACCOUNT_ID: + type: Header + name: X-Account-ID + + # Extract using regex + TOKEN_TYPE: + type: Regex + pattern: '"type":\s*"([^"]+)"' + + # Step 2: Use all extracted values + - name: revoke_token + request: + method: POST + url: https://api.service.com/accounts/{{ ACCOUNT_ID }}/tokens/{{ TOKEN_ID }}/revoke + headers: + Authorization: "Bearer {{ TOKEN }}" + Content-Type: application/json + body: '{"token_type":"{{ TOKEN_TYPE }}"}' + response_matcher: + - type: StatusMatch + status: [200, 204] +``` + +### Example 3: Complex JSONPath Extraction + +JSONPath supports nested objects and array indexing: + +```yaml +extract: + # Extract from nested object + USER_ID: + type: JsonPath + path: "$.data.user.id" + + # Extract from array (first element) + FIRST_TOKEN_ID: + type: JsonPath + path: "$.tokens[0].id" + + # Extract from nested array + SESSION_ID: + type: JsonPath + path: "$.data.sessions[0].session_id" +``` + +### Example 4: Single-Step Migration Path + +Existing single-step revocations remain unchanged and continue to work: + +```yaml +# This continues to work as before +revocation: + type: Http + content: + request: + method: DELETE + url: https://api.service.com/tokens/revoke + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - type: StatusMatch + status: [204] +``` + +### When to Use Multi-Step Revocation + +Use multi-step revocation when: + +- **The API requires looking up an ID first**: Some services don't accept the token directly for revocation +- **You need metadata from the token**: The revocation endpoint requires additional information only available via a separate API call +- **The service uses indirect revocation**: The token must be associated with another resource (session, key, credential) that needs to be identified first + +Do NOT use multi-step revocation when: + +- **The API accepts the token directly**: Use the simpler single-step `Http` revocation +- **You need more than 2 steps**: Kingfisher supports a maximum of 2 steps +- **The service provides a native revocation method**: Use `AWS` or `GCP` types when applicable + +## 3. Templating with Liquid +Kingfisher leverages the Liquid template engine for dynamic parts of HTTP request bodies, headers, query parameters, and multipart payloads. The engine supports both built-in and custom filters to manipulate the captured secret (TOKEN) or other named captures ({{ NAME }}). + +### Using Liquid Filters in Validation and Revocation +- **Capture Injection**: The unnamed capture from your regex becomes {{ TOKEN }}. Named captures are made available as uppercase variables (e.g. {{ RDMVAL }}). +- **Filter Pipeline**: You can chain filters using the pipe (|) syntax: + +```liquid +{{ TOKEN | b64enc | url_encode }} +``` +Arguments: Some filters accept parameters, provided after a colon: + +```liquid +{{ TOKEN | hmac_sha256: "my-secret-key" }} +``` + +### Built-in & Custom Liquid Filters + +Below is the complete list of Liquid filters available in Kingfisher, along with their usage patterns and examples. + +| Filter | Parameters | Description | Example | +| --------------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------- | +| `b64enc` | – | Base64-encodes the input using the standard alphabet. | `{{ TOKEN \| b64enc }}` | +| `b64url_enc` | – | URL-safe Base64 (no padding). Useful for JWT headers & payloads. | `{{ TOKEN \| b64url_enc }}` | +| `b64dec` | – | Decodes a Base64 string. | `{{ "aGVsbG8=" \| b64dec }}` | +| `sha256` | – | Computes the SHA-256 hex digest of the input. | `{{ TOKEN \| sha256 }}` | +| `crc32` | – | Computes the CRC32 checksum of the input and returns a decimal value. | `{{ TOKEN \| crc32 }}` | +| `crc32_dec` | `digits` (integer, optional) | Computes the CRC32 checksum and returns the last `digits` decimal characters (zero-padded). Defaults to the full value when omitted. | `{{ TOKEN \| crc32_dec: 6 }}` | +| `crc32_hex` | `digits` (integer, optional) | Computes the CRC32 checksum and returns the last `digits` hexadecimal characters (zero-padded). Defaults to the full value when omitted. | `{{ TOKEN \| crc32_hex: 8 }}` | +| `crc32_le_b64` | `len` (integer, optional) | Computes the CRC32 checksum, encodes the little-endian bytes using Base64, and optionally truncates to the first `len` characters. | `{{ TOKEN \| crc32_le_b64: 6 }}` | +| `hmac_sha1` | `key` (string) | Computes HMAC-SHA1 over the input, returns Base64-encoded result. | `{{ TOKEN \| hmac_sha1: "secret-key" }}` | +| `hmac_sha256` | `key` (string) | Computes HMAC-SHA256 over the input, returns Base64-encoded result. | `{{ TOKEN \| hmac_sha256: "secret-key" }}` | +| `hmac_sha384` | `key` (string) | Computes HMAC-SHA384 over the input, returns Base64-encoded result. | `{{ TOKEN \| hmac_sha384: "secret-key" }}` | +| `hmac_sha256_b64key` | `key` (string, base64-encoded) | Decodes the key from Base64 to raw bytes, then computes HMAC-SHA256. Returns Base64. Use for Azure SAS and other protocols where the signing key is base64-encoded. | `{{ to_sign \| hmac_sha256_b64key: TOKEN }}` | +| `random_string` | `len` (integer, optional) | Generates a cryptographically-secure random alphanumeric string of the specified length (default: 32). | `{{ "" \| random_string: 16 }}` | +| `prefix` | `len` (integer, optional) | Returns the first `len` characters from the string (default: full). | `{{ TOKEN \| prefix: 6 }}` | +| `suffix` | `len` (integer, optional) | Returns the last `len` characters from the string (default: full). | `{{ TOKEN \| suffix: 6 }}` | +| `base62` | `width` (integer, optional) | Encodes the input number as Base62, left-padding with zeros as needed. | `{{ TOKEN \| crc32 \| base62: 6 }}` | +| `url_encode` | – | Percent-encodes the input according to RFC 3986. | `{{ TOKEN \| url_encode }}` | +| `json_escape` | – | Escapes special characters so a string can be safely injected into JSON contexts. | `{{ TOKEN \| json_escape }}` | +| `unix_timestamp` | – | Returns the current Unix epoch time in seconds (UTC). | `{{ "" \| unix_timestamp }}` | +| `iso_timestamp` | – | Returns the current UTC timestamp in full ISO-8601 format (may include fractional seconds). | `{{ "" \| iso_timestamp }}` | +| `iso_timestamp_no_frac` | – | Current ISO-8601 timestamp (UTC) **without** fractional seconds. | `{{ "" \| iso_timestamp_no_frac }}` | +| `uuid` | – | Generates a random UUIDv4 string. | `{{ "" \| uuid }}` | +| `jwt_header` | – | Builds a minimal JWT header JSON (`{"typ":"JWT","alg":…}`) and Base64URL-encodes it. | `{{ "HS256" \| jwt_header }}` | +| `replace` | `from` (string), `to` (string) | Replaces every occurrence of `from` with `to` in the input string. | `{{ "hello world" \| replace: "world", "mars" }}` | +| `newline` | – | Returns a single newline character (`\n`). Useful inside YAML block scalars where a literal newline would break indentation. | `{{ "" \| newline }}` | +| `base36` | `width` (integer, optional) | Encodes the input number as Base36, left-padding with zeros as needed. | `{{ TOKEN \| crc32 \| base36: 6 }}` | + + +**Chaining & Composition:** Filters can be stacked; e.g.: + +```liquid +Authorization: Basic {{ "api:" | append: TOKEN | b64enc }} +``` + +**Runtime Values:** Filters like unix_timestamp and uuid are evaluated at runtime, enabling nonces, timestamps, and unique IDs in your requests. +### How depends_on_rule Works + +- **Dependency Declaration:** + In your YAML rule definition, you add a `depends_on_rule` section. Here you specify: + - **rule_id:** The identifier of the rule whose output is required. + - **variable:** The name (typically in uppercase) that will be used to reference the captured value from the dependency rule. + +- **Chaining Captures:** + When Kingfisher scans a file, it processes rules in a specific order. If a rule has a dependency, the engine first checks whether the dependent rule has already matched on the same input (or blob). If it did, the captured value (for example, an access key ID) is made available to the dependent rule. + +- **Using the Captured Value:** + This captured value can then be used during the validation phase. For instance, if you have a rule for an Algolia Admin API Key that depends on an Algolia Application ID (captured as `APPID`), the validation logic can incorporate the `APPID` value to confirm that the secret matches the expected pattern or format for that specific account. + +### Use depends_on_rule to require one rule before another runs: + +```yaml +depends_on_rule: + - rule_id: kingfisher.algolia.app_id # must match first + variable: APPID # captured as {{ APPID }} +``` + +- **Capture flow**: First rule captures `APPID` → second rule injects `{{ APPID }}` into validation HTTP request or pattern +- **Visible control:** set `visible: false` on the supporting rule so it doesn’t clutter your report for non-secret matches +## Algolia Example + +Consider this example rule for an Algolia Application ID and Admin Key combination. To validate that this is an active credential, both must be matched: + +```yaml +rules: + - name: Algolia Admin API Key + id: kingfisher.algolia.1 + pattern: | + (?xi) + algolia + (?:.|[\n\r]){0,32}? + \b + ( + [a-z0-9]{32} + ) + \b + min_entropy: 3.5 + confidence: medium + examples: + - algolia_api_key = "ij1mut5oe606wlrf5z4u8u31264z3gag" + validation: + type: Http + content: + request: + headers: + X-Algolia-API-Key: '{{ TOKEN }}' + X-Algolia-Application-Id: '{{ APPID }}' + method: GET + response_matcher: + - report_response: true + - status: + - 200 + type: StatusMatch + url: https://{{ APPID }}-dsn.algolia.net/1/keys + depends_on_rule: + - rule_id: "kingfisher.algolia.2" + variable: APPID + + - name: Algolia Application ID + id: kingfisher.algolia.2 + pattern: | + (?xi) + algolia + (?:.|[\n\r]){0,16}? + \b + ( + [A-Z0-9]{10} + ) + \b + min_entropy: 3.5 + visible: false + confidence: medium + examples: + - algolia_app_id = "WRB8YLFW7Y" + +``` + +### How It Works: + +* Algolia Application ID Rule (kingfisher.algolia.2): + + This rule scans for an Algolia Application ID—a 10-character alphanumeric string. It is marked with visible: false so that even if it matches, the finding is not directly reported. Its primary role is to provide a supporting value for other rules rather than to be flagged as a secret by itself. + +* Algolia Admin API Key Rule (kingfisher.algolia.1): + This rule detects the Algolia Admin API Key using a regex pattern. It includes a depends_on_rule property that specifies a dependency on the Algolia Application ID rule. + + * The dependency declares that the rule requires the output of the Algolia Application ID rule, and the captured value is assigned to the variable APPID. + * In the validation section, this captured `APPID` is used dynamically in the HTTP request (for example, in the header `X-Algolia-Application-Id` and in the URL). + +The dependency mechanism (depends_on_rule) ensures that: + +* Non-secret data (like an application ID) is captured without cluttering the scan report (thanks to visible: false). +* The secret (the API key) is validated in context, with the necessary supporting information automatically injected. +* Rules remain modular and extensible; you can update the dependent rule or its pattern independently, and the change will automatically be reflected where the value is used. + +## The `visible: false` Property + +The `visible: false` property tells Kingfisher to hide the finding from the final scan report. This is particularly useful for rules that capture data not meant to be reported as a secret, but rather to serve as supporting context for another rule. + +For example, a rule might match a username, an email address, an AWS Access Key ID, or an Application ID. While these pieces of information are captured during scanning, they are not secrets on their own. Instead, they are used by other rules—via the `depends_on_rule` mechanism—to validate an associated secret. By marking such rules as `visible: false`, you prevent these non-secret findings from cluttering your report, yet their values remain available for dependent rules. + +`visible: false` helps keep the scan output focused on actual secrets while still capturing important contextual data needed for comprehensive validation. + +## Character Requirements + +The `pattern_requirements` field allows you to specify data type requirements for matched secrets. This is particularly useful when: + +- Your regex pattern must be permissive (due to Hyperscan limitations) +- You want to enforce password complexity requirements +- You need to filter out low-quality matches that lack certain character types + +Kingfisher's regex engine (Hyperscan) does not support lookahead assertions like `(?=.*\d)` to require specific character types. Instead, use the `pattern_requirements` field to filter matches post-detection. + +### Available Requirements + +```yaml +pattern_requirements: + min_digits: 1 # Require at least 1 digit (0-9) + min_uppercase: 1 # Require at least 1 uppercase letter (A-Z) + min_lowercase: 1 # Require at least 1 lowercase letter (a-z) + min_special_chars: 1 # Require at least 1 special character + special_chars: "!@#$%^&*" # Optional: define which characters are "special" + ignore_if_contains: # Optional: reject matches containing any of these (case-insensitive) + - test + - demo + checksum: # Optional: compare rendered values to drop mismatched formats + actual: + template: "{{ MATCH | suffix: 6 }}" # Liquid template for the observed checksum + requires_capture: checksum # (optional) skip unless this capture is present + expected: "{{ BODY | crc32 | base62: 6 }}" # Liquid template to render the expected checksum + skip_if_missing: true # (optional) treat missing captures as legacy tokens +``` + +All fields are optional. If `special_chars` is not specified, the default set includes: `!@#$%^&*()_+-=[]{}|;:'",.<>?/\`~` + +`ignore_if_contains` performs a case-insensitive substring check. If any entry (after trimming whitespace) appears within the match, the match is discarded. This is helpful for dropping known dummy tokens such as "test" or "demo" that otherwise satisfy the regex. + +The optional `checksum` block renders Liquid templates against the match to determine whether the captured checksum matches your expectation. Both templates gain access to `{{ MATCH }}`, `{{ FULL_MATCH }}`, and every named capture in two forms: the original capture name and its uppercase alias (e.g. `{{ body }}` and `{{ BODY }}`). Use helper filters like `suffix`, `crc32`, and `base62` to mirror provider-specific checksum pipelines. If a required capture is missing or the rendered values differ, Kingfisher skips the finding—logging the reason, including checksum lengths, at the `DEBUG` level. Set `skip_if_missing` to `true` to treat absent captures as legacy matches. + +When any of these filters remove a match it is logged at the `DEBUG` level so you can see exactly why the skip occurred. If you need to keep every match even when one of these substrings appears, pass `--no-ignore-if-contains` to `kingfisher scan`. The flag disables this post-processing step without changing the rule definitions. + +### Are `requires_capture` and `skip_if_missing` equivalent? + +`requires_capture` + - Optional field that names a specific regex capture that must be present before the checksum templates are evaluated. + - In the engine, Kingfisher checks whether that capture exists in the match context. If it’s missing, the behavior falls back to whatever `skip_if_missing` dictates (fail or treat as a legacy match). + +`skip_if_missing` + - Boolean switch that controls what happens when Kingfisher can’t render the checksum—because there’s no match context or a required capture is absent. + - `true`: silently skip (pass) the match so legacy, non-checksum tokens are still accepted. + - `false`: treat the situation as a validation failure. + +In short, `requires_capture` identifies which capture must exist, while `skip_if_missing` determines whether missing data is a hard failure or an allowed legacy case. + +### Example: Secure API Key + +```yaml +rules: + - name: Secure API Key + id: custom.secure_api.1 + pattern: | + (?xi) + api[_-]?key + (?:.|[\n\r]){0,32}? + \b + ([A-Za-z0-9!@#$%^&*]{20,}) + \b + min_entropy: 4.0 + confidence: high + pattern_requirements: + min_digits: 1 # Must contain at least 1 digit + min_uppercase: 1 # Must contain at least 1 uppercase letter + min_lowercase: 1 # Must contain at least 1 lowercase letter + min_special_chars: 1 # Must contain at least 1 special character + ignore_if_contains: + - test + examples: + - api_key = "MyS3cur3K3y!2024" + - 'api-key: "Abc123!@#Token"' +``` + +In this example: +- The regex pattern is permissive: `[A-Za-z0-9!@#$%^&*]{20,}` matches any combination of those characters +- The `pattern_requirements` filters out matches that don't have at least one of each required type +- A match like `"abcdefghijklmnopqrst"` would be rejected (no uppercase, no digit, no special) +- A match like `"Abc123!SecureToken"` would be accepted (has all required types) +- A match like `"Test123!SecureToken"` would be rejected because it contains the `ignore_if_contains` term `test` + +### Example: Excluding Dummy Values + +```yaml +rules: + - name: Token without placeholders + id: custom.token.2 + pattern: |- + (?i)token[:=]\s*([A-Za-z0-9]{12,}) + pattern_requirements: + ignore_if_contains: + - placeholder + - sample + examples: + - token: "REALVALUE1234" + negative_examples: + - token = "SAMPLETOKEN9999" # dropped by ignore_if_contains +``` + +### Example: Custom Special Characters + +```yaml +rules: + - name: Token with Custom Special Chars + id: custom.token.1 + pattern: | + (?xi) + token + (?:.|[\n\r]){0,16}? + \b([A-Za-z0-9$%^]{16,})\b + min_entropy: 3.5 + confidence: medium + pattern_requirements: + min_special_chars: 2 + special_chars: "$%^" # Only these characters count as "special" + examples: + - token = "abc$%defgh123456" +``` + +### How It Works + +1. Hyperscan regex matches a pattern in the input +2. Entropy check filters low-complexity matches (if `min_entropy` is set) +3. **Character requirements check filters matches that don't meet the criteria** +4. Validation checks verify the secret is live (if `validation` is configured) + +Matches that fail the character requirements check are silently dropped with a debug log message. + + +## Writing Custom Rules + +When writing custom rules, consider the following best practices: + +1. **Multi-line Regex:** Write your regex patterns over multiple lines for clarity. Use the `(?x)` flag to enable free-spacing mode. +2. **Optimize for Performance:** Structure your regex to minimize backtracking. Use non-capturing groups where possible and keep the pattern as concise as possible. +3. **Validation Integration:** Define a `validation` section if you want to verify the detected secret. You can use Liquid templating to insert dynamic values—use the unnamed capture as `TOKEN` and any named captures in uppercase. +4. **Revocation Integration:** Define a `revocation` section if you want to revoke a detected secret. It uses the same HTTP request format and template variables as `validation`. +5. **Test with Examples:** Always include examples that should match and, optionally, negative examples to ensure your rule behaves as expected. + +## Examples + +Below are some examples to guide you in writing custom rules + +### Anthropic API Key + +```yaml +rules: + - name: Anthropic API Key + id: kingfisher.anthropic.1 + pattern: | + (?xi) + \b + ( + sk-ant-api + \d{2,4} + - + [\w\-]{93} + AA + ) + \b + min_entropy: 3.3 + confidence: medium + examples: + - sk-ant-api668-Clm512odot9WDD7itfUU9R880nefA1EtYZDbpE-C9b0XQEWpqFKf9DQUo03vOfXl16oSmyar1CLF1SzV3YzpZJ6bahcpLAA + categories: + - api + - secret + references: + - https://docs.anthropic.com/claude/reference/authentication + validation: + type: Http + content: + request: + body: | + { + "model": "claude-3-haiku-20240307", + "max_tokens": 1024, + "messages": [ + {"role": "user", "content": "respond only with 'success'"} + ] + } + headers: + Content-Type: application/json + anthropic-version: "2023-06-01" + x-api-key: '{{ TOKEN }}' + method: POST + response_matcher: + - report_response: true + - status: + - 200 + type: StatusMatch + - report_response: true + - type: WordMatch + words: + - '"type":"invalid_request_error"' + url: https://api.anthropic.com/v1/messages +``` + +### FileIO Secret Key +```yaml +rules: + - name: FileIO Secret Key + id: kingfisher.fileio.1 + pattern: | + (?xi) + \b + fileio + (?:.|[\n\r]){0,32}? + (?:SECRET|PRIVATE|ACCESS|KEY|TOKEN) + (?:.|[\n\r]){0,16}? + \b + ( + [A-Z0-9]{16} + (?:\.[A-Z0-9]{7}){2} + \.[A-Z0-9]{8} + ) + \b + min_entropy: 3.3 + confidence: medium + examples: + - fileio SECRETKEY = Z9Y8X7W6V5U4T3S2R1Q0.P9O8N7M6L5K4J3H2G1F + - fileio.PRIVATE.TOKEN = F0E1D2C3B4A596877869.5E4D3C2B1A0Z9Y8X7W6V + - fileio_key = M8N6B4V2C0X9Z7L5K3J1.H2G4F6D8S0A9P7O5I3U1 + validation: + type: Http + content: + request: + method: GET + url: https://file.io/api/v2/account + headers: + Authorization: "Bearer {{ TOKEN }}" + response_matcher: + - report_response: true + - type: StatusMatch + status: [200] + - type: HeaderMatch + header: content-type + expected: ["application/json"] + - type: JsonValid + +``` + +## Advanced Example + +This advanced example uses the liquid-rs filters included with Kingfisher to sign a request to validate Alibaba Cloud credential pairs: + +```yaml +rules: + - name: Alibaba Access Key ID + id: kingfisher.alibabacloud.1 + pattern: | + (?xi) + \b + ( + LTAI[a-z0-9]{17,21} + ) + \b + min_entropy: 4.0 + confidence: medium + visible: false + examples: + - LTAI8x2NiGqfyJGx7eLDhp12 + - LTAI5GqyJGhp12ad31L5hpix + - name: Alibaba Access Key Secret + id: kingfisher.alibabacloud.2 + pattern: | + (?xi) + \b + alibaba + (?:.|[\n\r]){0,32}? + \b + ( + [a-z0-9]{30} + ) + \b + min_entropy: 4.2 + confidence: medium + examples: + - alibaba_secret = 7jkWdTjKLnSlGddwPR5gBn65PHcZG6 + - alibaba-token = aJHKLnSlGddwPR5g7jkWdTBn65PHc5 + validation: + type: Http + content: + request: + method: GET + url: > + {%- assign nonce = "" | uuid | upcase -%} + {%- assign raw_timestamp = "" | iso_timestamp_no_frac -%} + {%- assign timestamp = raw_timestamp | replace: ":", "%3A" -%} + + {%- capture params -%} + AccessKeyId={{ AKID | url_encode }}&Action=GetCallerIdentity&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce={{ nonce }}&SignatureVersion=1.0&Timestamp={{ timestamp }}&Version=2015-04-01 + {%- endcapture -%} + {%- assign encoded_params = params | replace: "+", "%20" | replace: "*", "%2A" | replace: "%7E", "~" -%} + {%- assign query_string = encoded_params | url_encode | replace: "%2D", "-" | replace: "%2E", "." -%} + + {%- assign signature_base_string = "GET&%2F&" | append: query_string -%} + {%- assign token_amp = TOKEN | append: "&" -%} + + {%- assign hmacsignature = signature_base_string | hmac_sha1: token_amp | url_encode -%} + + https://sts.aliyuncs.com/?{{ params }}&Signature={{ hmacsignature }} + headers: + Accept: application/json + response_matcher: + - report_response: true + - type: StatusMatch + status: [200] + - type: WordMatch + words: ['"Arn"'] + depends_on_rule: + - rule_id: kingfisher.alibabacloud.1 + variable: AKID``` \ No newline at end of file diff --git a/docs-site/docs/usage/advanced.md b/docs-site/docs/usage/advanced.md new file mode 100644 index 0000000..6d06d28 --- /dev/null +++ b/docs-site/docs/usage/advanced.md @@ -0,0 +1,453 @@ +--- +title: "Advanced Configuration" +description: "Advanced Kingfisher features: confidence levels, validation tuning, CI pipeline scanning, filtering, suppression, and profiling." +--- + +# Advanced Configuration + +This guide covers advanced Kingfisher features for power users. + +## Table of Contents + +- [Advanced Configuration](#advanced-configuration) + - [Table of Contents](#table-of-contents) + - [Baseline Management](#baseline-management) + - [Understanding Confidence Levels](#understanding-confidence-levels) + - [Filtering and Suppression](#filtering-and-suppression) + - [Skip Known False Positives](#skip-known-false-positives) + - [Skip Canary Tokens (AWS)](#skip-canary-tokens-aws) + - [Common CLI flows](#common-cli-flows) + - [Inline Ignore Directives](#inline-ignore-directives) + - [Validation Tuning](#validation-tuning) + - [Scanning in CI Pipelines](#scanning-in-ci-pipelines) + - [Custom Rules](#custom-rules) + - [Scan with only custom rules](#scan-with-only-custom-rules) + - [Add custom rules alongside built-ins](#add-custom-rules-alongside-built-ins) + - [Check custom rules](#check-custom-rules) + - [Scan using a rule family](#scan-using-a-rule-family) + - [Rule Performance Profiling](#rule-performance-profiling) + - [Notable Scan Options](#notable-scan-options) + - [Exclude specific paths](#exclude-specific-paths) + - [Scan while ignoring likely test files](#scan-while-ignoring-likely-test-files) + - [Limit maximum file size scanned](#limit-maximum-file-size-scanned) + - [Customize the HTTP User-Agent](#customize-the-http-user-agent) + - [Finding Fingerprints](#finding-fingerprints) + - [Update Checks](#update-checks) + - [Exit Codes](#exit-codes) + +## Baseline Management + +There are situations where a repository already contains checked‑in secrets, but you want to ensure no **new** secrets are introduced. A baseline file lets you document the known findings so future scans only report anything that is not already in that list. + +The easiest way to create a baseline is to run a normal scan with the `--manage-baseline` flag (typically at a low confidence level to capture all potential matches): + +```bash +kingfisher scan /path/to/code \ + --confidence low \ + --manage-baseline \ + --baseline-file ./baseline-file.yml +``` + +`--manage-baseline` automatically enables `--no-dedup` so the baseline captures every individual occurrence. + +Use the same YAML file with the `--baseline-file` option on future scans to hide all recorded findings: + +```bash +kingfisher scan /path/to/code \ + --baseline-file /path/to/baseline-file.yaml +``` + +Running the scan again with `--manage-baseline` refreshes the baseline by adding new findings and pruning entries for secrets that no longer appear. See [BASELINE.md](../usage/baseline.md) for full detail. + +## Understanding Confidence Levels + +The `--confidence` flag sets a minimum confidence threshold, not an exact match. + +- If you pass `--confidence medium`, findings with **medium and higher** confidence (medium + high) will be included. +- If you pass `--confidence low`, you'll see **all levels** (low, medium, high). + +```bash +# Only show high-confidence findings +kingfisher scan /path/to/code --confidence high + +# Show medium and high confidence findings +kingfisher scan /path/to/code --confidence medium + +# Show all findings (low, medium, high) +kingfisher scan /path/to/code --confidence low +``` + +## Filtering and Suppression + +### Skip Known False Positives + +Use `--skip-regex` and `--skip-word` to suppress findings you know are benign. Both flags may be provided multiple times and are tested against the secret value **and** the full match context. + +With `--skip-regex`, these should be Rust compatible regular expressions, which you can test out at [regex101](https://regex101.com) + +```bash +# Skip any finding where the finding mentions TEST_KEY +kingfisher scan --skip-regex '(?i)TEST_KEY' path/ + +# Skip findings that contain the word "dummy" anywhere in the match +kingfisher scan --skip-word dummy path/ + +# Combine multiple patterns +kingfisher scan \ + --skip-regex 'AKIA[0-9A-Z]{16}' \ + --skip-word placeholder \ + --skip-word dummy \ + path/ +``` + +If a `--skip-regex` regular expression fails to compile, the scan aborts with an error so that typos are caught early. + +### Skip Canary Tokens (AWS) + +Canary/honey tokens are intentionally leaked credentials used to catch misuse. Kingfisher can **recognize and skip** known AWS canary accounts so hygiene scans don't set off alerts. + +**How to skip** +Pass the 12-digit AWS account IDs for your canaries via `--skip-aws-account` (comma-separated) or `--skip-aws-account-file` (one ID per line; blank lines and `#` comments allowed). Kingfisher also ships with a **pre-seeded (but not exhaustive)** list of Thinkst Canary account IDs used by canarytokens.org, so many are skipped automatically. + +```bash +kingfisher scan /path/to/code \ + --skip-aws-account "171436882533,534261010715" + +# or combine preloaded canary IDs with a just-created decoy account +printf '999900001111 \n534261010715' > /tmp/canary_accounts.txt + +kingfisher scan /path/to/repo \ + --skip-aws-account-file /tmp/canary_accounts.txt +``` + +**What you'll see** +Findings tied to a skip-listed account report `Validation: Not Attempted` and note in the `Response:` that the entry came from the skip list: + +```bash +AWS SECRET ACCESS KEY => [KINGFISHER.AWS.2] + |Finding.......: + |Fingerprint...: 2141074333616819500 + |Confidence....: medium + |Entropy.......: 5.00 + |Validation....: Not Attempted + |__Response....: (skip list entry) AWS validation not attempted for account 171436882533. + |Language......: Unknown + |Line Num......: 21 + |Path..........: /tmp/test_canary_accounts.log +``` + +**Why this matters** +Skipping prevents noisy tripwires in prod telemetry while keeping the status explicit—"Not Attempted" isn't a pass. If needed, verify these credentials out-of-band or with a safe, non-triggering method. + +#### Common CLI flows + +```bash +# Skip a few in-house canaries during a filesystem scan +kingfisher scan repo/ \ + --skip-aws-account "111122223333,444455556666" + +# Read a longer list from disk +kingfisher scan repo/ \ + --skip-aws-account-file /tmp/scripts/canary_accounts.txt + +# Combine preloaded canary IDs with a just-created decoy account +printf '999900001111\n534261010715\n' > /tmp/new_canary.txt + +kingfisher scan /path/to/repo \ + --skip-aws-account-file /tmp/new_canary.txt +``` + +Tip: if you manage multiple canary fleets (Thinkst, self-hosted alternatives, or bespoke decoys), checkpoint the account IDs alongside your infrastructure-as-code so security teams can rotate or expand the skip list without editing pipelines. + +### Inline Ignore Directives + +Add `kingfisher:ignore` anywhere on the same line as a finding to silence it. Multi-line strings and PEM-style blocks may also be ignored by placing the directive on the closing delimiter line (for example, `""" # kingfisher:ignore`), on the next logical line after the string, **or** on a comment immediately before the value: + +```python +# kingfisher:ignore +API_KEY = """ +line 1 +line 2 +""" +# kingfisher:ignore +``` + +Kingfisher searches the surrounding lines for these tokens without requiring language-specific comment markers. To reuse existing inline directives from other scanners, add them with repeatable `--ignore-comment` flags (for example `--ignore-comment "gitleaks:allow" --ignore-comment "NOSONAR"`). Use `--no-ignore` when you want to disable inline suppressions entirely. + +## Validation Tuning + +Use these options with `kingfisher scan` to customize live validation behavior: + +```bash +# Set per-request timeout (default: 10 seconds, range: 1-60) +kingfisher scan /path/to/code --validation-timeout 15 + +# Set number of retry attempts (default: 1, range: 0-5) +kingfisher scan /path/to/code --validation-retries 2 + +# Increase validation response storage limit (default: 2048 bytes) +kingfisher scan /path/to/code --max-validation-response-length 8192 + +# Disable validation response storage truncation entirely (0 = unlimited) +kingfisher scan /path/to/code --max-validation-response-length 0 + +# Include full validation response bodies end-to-end (no validation or reporter truncation) +kingfisher scan /path/to/code --full-validation-response + +# Combine options +kingfisher scan /path/to/code \ + --validation-timeout 20 \ + --validation-retries 3 \ + --max-validation-response-length 8192 +``` + +- `--validation-timeout SECONDS`: per-request and per-match timeout for validation (default: 10, range: 1-60). +- `--validation-retries N`: number of retry attempts for validation requests (default: 1, range: 0-5). +- `--max-validation-response-length BYTES`: maximum bytes stored from validation response bodies (default: 2048; `0` disables truncation at storage time). +- `--full-validation-response`: include complete validation response bodies end-to-end. This bypasses both storage-time truncation and reporter display truncation, and takes precedence over `--max-validation-response-length`. + +## Scanning in CI Pipelines + +Limit scanning to the delta between your default branch and a pull request branch by combining `--since-commit` with `--branch` (defaults to `HEAD`). This only scans files that differ between the two references, which keeps CI runs fast while still blocking new secrets. + +Use `--branch-root-commit` alongside `--branch` when you need to include a specific commit (and everything after it) in a diff-focused scan without re-examining earlier history. Provide the branch tip (or other comparison ref) via `--branch`, and pass the commit or merge-base you want to include with `--branch-root-commit`. If you omit `--branch-root-commit`, you can still enable `--branch-root` to fall back to treating the `--branch` ref itself as the inclusive root for backwards compatibility. This is especially useful in long-lived branches where you want to resume scanning from a previous review point or from the commit where a hotfix forked. + +> **How is this different from `--since-commit`?** +> `--since-commit` computes a diff between the branch tip and another ref, so it only inspects files that changed between those two points in history. `--branch-root-commit` rewinds to the parent of the commit you provide and then scans everything introduced from that commit forward, even if the files are unchanged relative to another baseline. Reach for `--since-commit` to keep CI scans fast by checking only the latest delta, and use `--branch-root-commit` when you want to re-audit the full contents of a branch starting at a specific commit. + +```bash +kingfisher scan . \ + --since-commit origin/main \ + --branch "$CI_BRANCH" +``` + +Another example: + +```bash +cd /tmp +git clone https://github.com/micksmix/SecretsTest.git + +cd /tmp/SecretsTest +git checkout feature-1 +# +# scan diff between main and feature-1 branch +kingfisher scan /tmp/SecretsTest --branch feature-1 \ + --since-commit=$(git -C /tmp/SecretsTest merge-base main feature-1) +# +# scan only a specific commit +kingfisher scan /tmp/SecretsTest \ + --branch baba6ccb453963d3f6136d1ace843e48d7007c3f +# +# scan feature-1 starting at a specific commit (inclusive) +kingfisher scan /tmp/SecretsTest --branch feature-1 \ + --branch-root-commit baba6ccb453963d3f6136d1ace843e48d7007c3f +# +# scan feature-1 starting from the commit where the branch diverged from main +kingfisher scan /tmp/SecretsTest --branch feature-1 \ + --branch-root-commit $(git -C /tmp/SecretsTest merge-base main feature-1) +# +# scan from a hotfix commit that should be re-checked before merging +HOTFIX_COMMIT=$(git -C /tmp/SecretsTest rev-parse hotfix~1) +kingfisher scan /tmp/SecretsTest --branch hotfix \ + --branch-root-commit "$HOTFIX_COMMIT" +``` + +When the branch under test is already checked out, `--branch HEAD` or omitting `--branch` entirely is sufficient. Kingfisher exits with `200` when any findings are discovered and `205` when validated secrets are present, allowing CI jobs to fail automatically if new credentials slip in. + +> **Tip:** You can point Kingfisher at a local working tree and scan another branch or commit without changing checkouts. The CLI now resolves repositories from their worktree roots, so commands like the following work without needing to pass the `.git` directory explicitly: + +```bash +kingfisher scan /path/to/local/repo --branch +kingfisher scan C:\\src\\repo --branch +``` + +The same diff-focused workflow works when cloning repositories on the fly by passing a Git URL directly to `scan`. Kingfisher automatically tries remote-tracking names like `origin/main` and `origin/feature-1`, so you can target the branches involved in a pull request without performing a local checkout first. + +```bash +kingfisher scan https://github.com/org/repo.git \ + --since-commit main \ + --branch development +``` + +When `--since-commit` is omitted, specifying `--branch` scans the requested ref directly. This makes it easy to analyze a feature branch without checking it out locally. + +```bash +# Scan a branch from an existing checkout +kingfisher scan ~/tmp/repo --branch feature-123 + +# Or scan a branch when cloning on the fly +kingfisher scan https://github.com/org/repo.git \ + --branch origin/feature-123 +``` + +In CI systems that expose the base and head commits explicitly, you can pass those SHAs directly while scanning a Git URL: + +```bash +kingfisher scan https://github.com/org/repo.git \ + --since-commit "$BASE_COMMIT" \ + --branch "$PR_HEAD_COMMIT" +``` + +If you want to know which files are being skipped, enable verbose debugging (-v) when scanning, which will report any files being skipped by the baseline file (or via --exclude): + +```bash +# Skip all Python files and any directory named tests, and report to stderr any skipped files +kingfisher scan ./my-project \ + --exclude '*.py' \ + --exclude tests \ + -v +``` + +## Custom Rules + +Kingfisher ships with 700+ rules, but you may want to add your own custom rules or modify existing detection to better suit your needs. + +First, review [RULES.md](../rules/overview.md) to learn how to create custom Kingfisher rules. + +### Scan with only custom rules + +To scan using **only** your own `my_rules.yaml`: + +```bash +kingfisher scan \ + --load-builtins=false \ + --rules-path path/to/my_rules.yaml \ + ./src/ +``` + +### Add custom rules alongside built-ins + +To add your rules alongside the built‑ins: + +```bash +kingfisher scan \ + --rules-path ./custom-rules/ \ + --rules-path my_rules.yml \ + ~/path/to/project-dir/ +``` + +### Check custom rules + +```bash +# Check custom rules - ensures all regexes compile and match rule examples +kingfisher rules check --rules-path ./my_rules.yml + +# List all built-in rules +kingfisher rules list +``` + +### Scan using a rule family + +_(prefix matching: `--rule kingfisher.aws` loads `kingfisher.aws.*`)_ + +```bash +# Only apply AWS-related rules (kingfisher.aws.1 + kingfisher.aws.2) +kingfisher scan /path/to/repo --rule kingfisher.aws +``` + +## Rule Performance Profiling + +Use `--rule-stats` to collect timing information for every rule. After scanning, the summary prints a **Rule Performance Stats** section showing how many matches each rule produced along with its slowest and average match times. Useful when creating rules or debugging rules. + +```bash +kingfisher scan /path/to/repo --rule-stats +``` + +## Notable Scan Options + +- `--no-dedup`: Report every occurrence of a finding (disable the default de-duplicate behavior) +- `--no-base64`: By default, Kingfisher finds and decodes base64 blobs and scans them for secrets. This adds a slight performance overhead; use this flag to disable +- `--confidence `: (low|medium|high) +- `--min-entropy `: Override default threshold +- `--include-contributors`: When scanning GitHub or GitLab URLs, include contributor-owned repos in the scan +- `--git-clone-dir
`: Choose the parent directory for cloned repos and scan artifacts (use with Git URL scans) +- `--keep-clones`: Preserve cloned repositories on disk after a scan completes +- `--repo-clone-limit `: Cap the number of GitHub/GitLab repositories cloned when enumerating orgs/groups or contributor repos +- `--no-binary`: Skip binary files +- `--no-extract-archives`: Do not scan inside archives +- `--extraction-depth `: Specifies how deep nested archives should be extracted and scanned (default: 2) +- `--redact`: Replaces discovered secrets with a one-way hash for secure output +- `--exclude `: Skip any file or directory whose path matches this glob pattern (repeatable, uses gitignore-style syntax, case sensitive) +- `--baseline-file `: Ignore matches listed in a baseline YAML file +- `--manage-baseline`: Create or update the baseline file with current findings (automatically enables `--no-dedup`) +- `--skip-regex `: Ignore findings whose text matches this regex (repeatable) +- `--skip-word `: Ignore findings containing this case-insensitive word (repeatable) +- `--skip-aws-account `: Skip live AWS validation for findings tied to the specified AWS account number (repeatable, accepts comma-separated lists) +- `--skip-aws-account-file `: Load AWS account numbers to skip from a file (one account per line; `#` comments allowed) +- `--ignore-comment `: Honor additional inline directives from other scanners (repeatable; e.g. `--ignore-comment "gitleaks:allow"`) +- `--no-ignore`: Disable inline directives entirely so every match is reported +- `--no-ignore-if-contains`: Ignore the `ignore_if_contains` filter in rules so placeholder words still produce findings +- `--validation-timeout SECONDS`: per-request and per-match timeout for validation (default: 10, range: 1-60). +- `--validation-retries N`: number of retry attempts for validation requests (default: 1, range: 0-5). +- `--max-validation-response-length BYTES`: maximum bytes stored from validation response bodies (default: 2048; `0` disables truncation at storage time). +- `--full-validation-response`: include complete validation response bodies end-to-end (bypasses storage and reporter truncation). + +### Exclude specific paths + +```bash +# Skip all Python files and any directory named tests +kingfisher scan ./my-project \ + --exclude '*.py' \ + --exclude '[Tt]ests' +``` + +### Scan while ignoring likely test files + +`--exclude` skips any file or directory whose path matches this glob pattern (repeatable, uses gitignore-style syntax, case sensitive) + +```bash +# Scan source but skip likely unit / integration tests +kingfisher scan ./my-project \ + --exclude='[Tt]est' \ + --exclude='spec' \ + --exclude='[Ff]ixture' \ + --exclude='example' \ + --exclude='sample' +``` + +### Limit maximum file size scanned + +By default, Kingfisher skips files larger than **256 MB**. You can raise or lower this cap per run with `--max-file-size`, which takes a value in **megabytes**. + +```bash +# Scan files up to 500 mb in size +kingfisher scan /some/file --max-file-size 500 +``` + +### Customize the HTTP User-Agent + +Kingfisher identifies its HTTP requests with a user-agent that includes the binary name and version followed by a browser-style +string. Some environments require extra context, such as a contact address, a change-ticket number, or a temporary test label. +Use the global `--user-agent-suffix` flag to append this information between the Kingfisher identifier and the browser portion: + +```bash +# Attach a contact email to all outbound validation requests +kingfisher --user-agent-suffix "contact=security@example.com" scan path/ + +# Label a one-off experiment +kingfisher --user-agent-suffix "Sept 2025 testing" scan github --user my-user --list-only +``` + +When omitted, Kingfisher defaults to `kingfisher/ Mozilla/5.0 ...`. The suffix is trimmed; passing an empty string has no effect. + +## Finding Fingerprints + +The document below details the four-field formula (rule SHA-1, origin label, start & end offsets) hashed with XXH3-64 to create Kingfisher's 64-bit finding fingerprint, and explains how this ID powers safe deduplication; plus how `--no-dedup` can be used shows every raw match. + +See [FINGERPRINT.md](../features/fingerprints.md) for complete details. + +## Update Checks + +Kingfisher automatically queries GitHub for a newer release when it starts and tells you whether an update is available. + +- **Manual update** – Run `kingfisher update` to update the binary without scanning + +- **Disable version checks** – Pass `--no-update-check` to skip both the startup and shutdown checks entirely + +## Exit Codes + +| Code | Meaning | +| ---- | ----------------------------- | +| 0 | No findings | +| 200 | Findings discovered | +| 205 | Validated findings discovered | diff --git a/docs-site/docs/usage/baseline.md b/docs-site/docs/usage/baseline.md new file mode 100644 index 0000000..798ed0d --- /dev/null +++ b/docs-site/docs/usage/baseline.md @@ -0,0 +1,59 @@ +--- +title: "Baseline Management" +description: "Track known secrets with baselines to suppress known findings and detect only new credential leaks." +--- + +# Build a Baseline / Detect Only New Secrets + +There are situations where a repository already contains checked‑in secrets, but you want to ensure no **new** secrets are introduced. A baseline file lets you document the known findings so future scans only report anything that is not already in that list. + +The easiest way to create a baseline is to run a normal scan with the `--manage-baseline` flag (typically at a low confidence level to capture all potential matches): + +```bash +kingfisher scan /path/to/code \ + --confidence low \ + --manage-baseline \ + --baseline-file ./baseline-file.yml +``` + +This generates a YAML file named `baseline-file.yml` in the current directory. The file tracks each finding under an `ExactFindings` section: + +```yaml +ExactFindings: + matches: + - filepath: ruby_vulnerable.rb/ + fingerprint: 056876f00ffd0622 + linenum: 52 + lastupdated: Mon, 14 Jul 2025 10:17:56 -0700 + - filepath: ruby_vulnerable.rb/ + fingerprint: ce41d19b83b2b1b0 + linenum: 53 + lastupdated: Mon, 14 Jul 2025 10:17:56 -0700 + - filepath: ruby_vulnerable.rb/ + fingerprint: e8644d91fa6654f5 + linenum: 40 + lastupdated: Mon, 14 Jul 2025 10:17:56 -0700 +``` + +`fingerprint` reuses Kingfisher's 64-bit *finding fingerprint* algorithm with offsets set to zero. It hashes the secret value together with the normalized filepath, so moving a secret around does not create a new entry. + +Running another scan with `--manage-baseline` rewrites the file so it only contains findings that still exist in the repository. Use the same YAML file with the `--baseline-file` option on future scans to hide all recorded findings: + +```bash +kingfisher scan /path/to/code \ + --baseline-file /path/to/baseline-file.yaml +``` + +If you intentionally add a new secret that should be ignored later, rerun the scan with both `--manage-baseline` and `--baseline-file` to refresh the baseline. New matches are appended and entries for secrets that no longer appear (for example, because files were removed or excluded) are pruned: + +```bash +kingfisher scan /path/to/code \ + --manage-baseline \ + --baseline-file /path/to/baseline-file.yml +``` + +If you want to know which files are being skipped, enable verbose debugging (-v) when scanning, which will report any files being skipped by the baseline file (or via `--exclude`): + +```bash +kingfisher scan /path/to/project -v +``` \ No newline at end of file diff --git a/docs-site/docs/usage/basic-scanning.md b/docs-site/docs/usage/basic-scanning.md new file mode 100644 index 0000000..54bf874 --- /dev/null +++ b/docs-site/docs/usage/basic-scanning.md @@ -0,0 +1,1137 @@ +--- +title: "Basic Scanning" +description: "Learn how to scan files, Git repos, and platforms for secrets with Kingfisher. Includes output formats, filtering, and validation options." +--- + +# Usage Guide + +This guide covers all scan targets and usage patterns for Kingfisher. + +## Table of Contents + +- [Basic Examples](#basic-examples) +- [Scanning Platform-Specific Targets](#scanning-platform-specific-targets) + - [AWS S3](#aws-s3) + - [Google Cloud Storage](#google-cloud-storage) + - [Docker Images](#docker-images) + - [GitHub](#github) + - [GitLab](#gitlab) + - [Azure Repos](#azure-repos) + - [Gitea](#gitea) + - [Bitbucket](#bitbucket) + - [Hugging Face](#hugging-face) + - [Jira](#jira) + - [Confluence](#confluence) + - [Slack](#slack) + - [Microsoft Teams](#microsoft-teams) +- [TLS Certificate Validation](#tls-certificate-validation) +- [Understanding the Scan Summary](#understanding-the-scan-summary) +- [Environment Variables](#environment-variables) +- [Exit Codes](#exit-codes) + +--- + +## Basic Examples + +> **Note:** `kingfisher scan` detects whether the input is a Git repository or a plain directory, no extra flags required. + +### Scan with secret validation + +```bash +kingfisher scan /path/to/code +## NOTE: This path can refer to: +# 1. a local git repo +# 2. a directory with many git repos +# 3. or just a folder with files and subdirectories + +## To explicitly prevent scanning git commit history add: +# `--git-history=none` +``` + +### Scan a directory containing multiple Git repositories + +```bash +kingfisher scan /projects/mono‑repo‑dir +``` + +### Scan a Git repository without validation + +```bash +kingfisher scan ~/src/myrepo --no-validate +``` + +### Display only secrets confirmed active by third‑party APIs + +```bash +kingfisher scan /path/to/repo --only-valid +``` + +### Output JSON and capture to a file + +```bash +kingfisher scan . --format json | tee kingfisher.json +``` + +### Output TOON for LLM and agent workflows + +```bash +kingfisher scan . --format toon +``` + +Use `--format toon` when Kingfisher is being called by an LLM or agent runtime. The TOON report is optimized for token efficiency, keeps the scan summary up front, and flattens each finding into an easier-to-reason-about row. + +### Output SARIF directly to disk + +```bash +kingfisher scan /path/to/repo --format sarif --output findings.sarif +``` + +### Generate an auditor-friendly HTML report + +```bash +kingfisher scan /path/to/repo --format html --output kingfisher-audit.html +``` + +The HTML audit report is standalone and includes scan metadata designed for evidence workflows, including scan timestamp, sanitized CLI arguments, version, and finding summary counts. + +### Access map outputs and viewer + +**Stop Guessing, Start Mapping: Understand Your True Blast Radius** + +Finding a leaked credential is only the first step. The critical question isn't just "Is this a secret?"—it's "What can an attacker do with it?" + +Kingfisher's `--access-map` feature transforms secret detection from a simple alert into a comprehensive threat assessment. Instead of leaving you with a cryptic API key, Kingfisher actively authenticates against your cloud provider (AWS, GCP, Azure Storage, Azure DevOps, GitHub, GitLab, Slack, or Microsoft Teams) to map the full extent of the credential's power. + +* Instant Identity Resolution: Immediately identify who the key belongs to—whether it's a specific IAM user, an assumed role, or a service account. +* Visualize the Blast Radius: See exactly which resources (S3 buckets, EC2 instances, projects, storage containers) are exposed and at risk. + + +Add `--access-map` to enrich TOON, JSON, JSONL, BSON, pretty, and SARIF reports with an `access_map` containing the resources and the permissions that the key can access - for each resource (grouped when identical). +- If you validated cloud credentials without `--access-map`, Kingfisher will remind you on stderr to rerun with the flag so the access map appears in the output. +- Run `kingfisher view ./kingfisher.json` to explore a report locally in a local web UI (opens your browser automatically when a report is provided). +- Or use `kingfisher scan --view-report ...` to generate a JSON report, start the viewer at `http://127.0.0.1:7890`, and open it in your browser. + +> **Use the access map functionality only when you are authorized to inspect the target account, as Kingfisher will issue additional network requests to determine what access the secret grants** + +### View access-map reports locally + +```bash +kingfisher view kingfisher.json +``` + +The `view` subcommand starts a server (default port `7890`, bind address `127.0.0.1`) that bundles the HTML, CSS, and JavaScript for the access-map viewer directly into the Kingfisher binary. Provide a JSON or JSONL report to load it automatically and Kingfisher will open your browser, or open the page and upload a report in the browser. If port 7890 is already in use, re-run with `--port `. To allow access from Docker or other hosts, use `--address 0.0.0.0`. + +### Pipe any text directly into Kingfisher by passing `-` + +```bash +cat /path/to/file.py | kingfisher scan - +``` + +### Direct secret validation with `kingfisher validate` + +When you already know a secret's type and have the raw value, use `kingfisher validate` to check if it's still active—without needing the surrounding context that detection rules require. + +This is useful for: +- Re-validating a known secret from a previous scan +- Checking if a credential is still active before rotation +- Validating secrets from external sources (password managers, ticketing systems, etc.) + +> **Note:** The `kingfisher.` prefix is optional for built-in rules. You can use `--rule aws` instead of `--rule kingfisher.aws`. + +To reduce API pressure during validation, you can limit request rate: + +- `--validation-rps ` applies a global rate limit to network validators. +- `--validation-rps-rule ` applies a rule-scoped override and can be repeated. + +Rule selectors use the same prefix behavior as `--rule`: `github=2` targets `kingfisher.github.*`. + +```bash +# Global limit for all validation requests +kingfisher scan ./repo --validation-rps 5 + +# Per-rule overrides (prefix match, kingfisher. prefix optional) +kingfisher scan ./repo \ + --validation-rps 10 \ + --validation-rps-rule github=2 \ + --validation-rps-rule pypi=0.5 + +# Direct validation can use the same limiter options +kingfisher validate --rule github "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" \ + --validation-rps-rule github=1 +``` + +```bash +# Validate an OpsGenie API key (using rule prefix matching) +kingfisher validate --rule opsgenie "12345678-9abc-def0-1234-56789abcdef0" + +# Validate from stdin +echo "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" | kingfisher validate --rule github - + +# TOON output for LLMs and agent tooling +kingfisher validate --rule slack "xoxb-..." --format toon + +# JSON output for scripting +kingfisher validate --rule slack "xoxb-..." --format json + +# AWS credentials - use --arg to auto-assign additional values +kingfisher validate --rule aws --arg AKIAIOSFODNN7EXAMPLE \ + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + +# Or use --var if you know the variable name (explicit rule ID still works) +kingfisher validate --rule kingfisher.aws.2 --var AKID=AKIAIOSFODNN7EXAMPLE \ + "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + +# GCP service account (pass JSON as secret) +kingfisher validate --rule gcp "$(cat service-account.json)" + +# MongoDB connection string +kingfisher validate --rule mongodb.3 \ + "mongodb+srv://user:password@cluster.mongodb.net/db" + +# PostgreSQL connection +kingfisher validate --rule postgres \ + "postgres://admin:password@db.example.com:5432/mydb" + +# JWT token +kingfisher validate --rule jwt \ + "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." +``` + +**Supported validators:** HTTP, Grpc, AWS, GCP, MongoDB, MySQL, Postgres, JDBC, JWT, Azure Storage, and Coinbase. + +**Exit codes:** Returns `0` if any matching rule validates the secret as valid, `1` if all are invalid or an error occurred. + +**Passing additional values (`--arg` and `--var`):** + +Some validators need more than just the secret. For example, AWS needs both an access key ID and the secret key (see the rule for `dependent_rule` section): + +- `--arg VALUE` — Auto-assigns values to template variables (in alphabetical order). Use when you don't know the exact variable name. +- `--var NAME=VALUE` — Explicitly sets a variable. Use when you know the exact name, or to override `--arg`. + +```bash +# --arg auto-assigns to AKID (the only non-TOKEN variable for AWS) +kingfisher validate --rule aws --arg AKIAEXAMPLE "secret_key" + +# --var for explicit assignment +kingfisher validate --rule aws --var AKID=AKIAEXAMPLE "secret_key" +``` + +**Rule prefix matching:** Use partial rule IDs like `opsgenie` instead of the full `kingfisher.opsgenie.1`. If the prefix matches multiple rules, **all matching rules with compatible variables are tried**: + +```bash +$ kingfisher validate --rule aws --arg AKIAEXAMPLE "secret_key" +Rule: AWS Secret Access Key (kingfisher.aws.2) +Result: ✓ VALID +Response: arn:aws:iam::123456789012:user/example +``` + +### Direct secret revocation with `kingfisher revoke` + +When you need to invalidate a known token immediately, use `kingfisher revoke` to call the rule's `revocation` configuration without scanning files. Revocation requests use the same Liquid templating and response matchers as `validation`. + +This is useful for: +- Responding to a leaked credential quickly +- Revoking tokens discovered during incident response +- Automating cleanup after rotation + +```bash +# Revoke a Slack token +kingfisher revoke --rule slack "xoxb-..." + +# Revoke a GitHub PAT +kingfisher revoke --rule github "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" + +# Revoke a GitLab personal access token (self revoke) +kingfisher revoke --rule gitlab "glpat-xxxxxxxxxxxxxxxxxxxx" + +# Revoke an Atlassian API token (requires account_id, tokenId, admin access token) +kingfisher revoke --rule atlassian --arg "" --arg "" "" + +# Revoke AWS credentials (sets access key to Inactive) +kingfisher revoke --rule aws --arg "AKIAIOSFODNN7EXAMPLE" "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY" + +# Revoke a GCP service account key (JSON key file) +kingfisher revoke --rule gcp '{"type":"service_account","project_id":"example","private_key_id":"abcd1234","private_key":"-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n","client_email":"example@project.iam.gserviceaccount.com","token_uri":"https://oauth2.googleapis.com/token"}' + +kingfisher revoke --rule gcp "$(cat service-account.json)" + +# JSON output for scripting +kingfisher revoke --rule slack "xoxb-..." --format json + +# TOON output for LLMs and agent tooling +kingfisher revoke --rule slack "xoxb-..." --format toon +``` + +**Exit codes:** Returns `0` if any matching rule reports a successful revocation, `1` if all are failures or an error occurred. + +**Passing additional values (`--arg` and `--var`):** Works the same as `kingfisher validate` when a revocation request requires extra variables. + +### Limit maximum file size scanned (`--max-file-size`) + +By default, Kingfisher skips files larger than **256 MB**. You can raise or lower this cap per run with `--max-file-size`, which takes a value in **megabytes**. + +```bash +# Scan files up to 500 mb in size +kingfisher scan /some/file --max-file-size 500 +``` + +### Scan using a rule _family_ with one flag + +_(prefix matching: `--rule kingfisher.aws` loads `kingfisher.aws.*`)_ + +```bash +# Only apply AWS-related rules (kingfisher.aws.1 + kingfisher.aws.2) +kingfisher scan /path/to/repo --rule kingfisher.aws +``` + +### Display rule performance statistics + +```bash +kingfisher scan /path/to/repo --rule-stats +``` + +### Scan while ignoring likely test files + +`--exclude` skips any file or directory whose path matches this glob pattern (repeatable, uses gitignore-style syntax, case sensitive) + +```bash +# Scan source but skip likely unit / integration tests +kingfisher scan ./my-project \ + --exclude='[Tt]est' \ + --exclude='spec' \ + --exclude='[Ff]ixture' \ + --exclude='example' \ + --exclude='sample' +``` + +### Exclude specific paths + +```bash +# Skip all Python files and any directory named tests +kingfisher scan ./my-project \ + --exclude '*.py' \ + --exclude '[Tt]ests' +``` + +### Scan changes in CI pipelines + +Limit scanning to the delta between your default branch and a pull request branch by combining `--since-commit` with `--branch` (defaults to `HEAD`). This only scans files that differ between the two references, which keeps CI runs fast while still blocking new secrets. + +Use `--branch-root-commit` alongside `--branch` when you need to include a specific commit (and everything after it) in a diff-focused scan without re-examining earlier history. Provide the branch tip (or other comparison ref) via `--branch`, and pass the commit or merge-base you want to include with `--branch-root-commit`. If you omit `--branch-root-commit`, you can still enable `--branch-root` to fall back to treating the `--branch` ref itself as the inclusive root for backwards compatibility. This is especially useful in long-lived branches where you want to resume scanning from a previous review point or from the commit where a hotfix forked. + +> **How is this different from `--since-commit`?** +> `--since-commit` computes a diff between the branch tip and another ref, so it only inspects files that changed between those two points in history. `--branch-root-commit` rewinds to the parent of the commit you provide and then scans everything introduced from that commit forward, even if the files are unchanged relative to another baseline. Reach for `--since-commit` to keep CI scans fast by checking only the latest delta, and use `--branch-root-commit` when you want to re-audit the full contents of a branch starting at a specific commit. + +```bash +kingfisher scan . \ + --since-commit origin/main \ + --branch "$CI_BRANCH" +``` + +Another example: + +```bash +cd /tmp +git clone https://github.com/micksmix/SecretsTest.git + +cd /tmp/SecretsTest +git checkout feature-1 +# +# scan diff between main and feature-1 branch +kingfisher scan /tmp/SecretsTest --branch feature-1 \ + --since-commit=$(git -C /tmp/SecretsTest merge-base main feature-1) +# +# scan only a specific commit +kingfisher scan /tmp/SecretsTest \ + --branch baba6ccb453963d3f6136d1ace843e48d7007c3f +# +# scan feature-1 starting at a specific commit (inclusive) +kingfisher scan /tmp/SecretsTest --branch feature-1 \ + --branch-root-commit baba6ccb453963d3f6136d1ace843e48d7007c3f +# +# scan feature-1 starting from the commit where the branch diverged from main +kingfisher scan /tmp/SecretsTest --branch feature-1 \ + --branch-root-commit $(git -C /tmp/SecretsTest merge-base main feature-1) +# +# scan from a hotfix commit that should be re-checked before merging +HOTFIX_COMMIT=$(git -C /tmp/SecretsTest rev-parse hotfix~1) +kingfisher scan /tmp/SecretsTest --branch hotfix \ + --branch-root-commit "$HOTFIX_COMMIT" +``` + +When the branch under test is already checked out, `--branch HEAD` or omitting `--branch` entirely is sufficient. Kingfisher exits with `200` when any findings are discovered and `205` when validated secrets are present, allowing CI jobs to fail automatically if new credentials slip in. + +> **Tip:** You can point Kingfisher at a local working tree and scan another branch or commit without changing checkouts. The CLI now resolves repositories from their worktree roots, so commands like the following work without needing to pass the `.git` directory explicitly: + +```bash +kingfisher scan /path/to/local/repo --branch +kingfisher scan C:\\src\\repo --branch +``` + +The same diff-focused workflow works when cloning repositories on the fly by passing a Git URL directly to `scan`. Kingfisher automatically tries remote-tracking names like `origin/main` and `origin/feature-1`, so you can target the branches involved in a pull request without performing a local checkout first. + +```bash +kingfisher scan https://github.com/org/repo.git \ + --since-commit main \ + --branch development +``` + +When `--since-commit` is omitted, specifying `--branch` scans the requested ref directly. This makes it easy to analyze a feature branch without checking it out locally. + +```bash +# Scan a branch from an existing checkout +kingfisher scan ~/tmp/repo --branch feature-123 + +# Or scan a branch when cloning on the fly +kingfisher scan https://github.com/org/repo.git \ + --branch origin/feature-123 +``` + +In CI systems that expose the base and head commits explicitly, you can pass those SHAs directly while scanning a Git URL: + +```bash +kingfisher scan https://github.com/org/repo.git \ + --since-commit "$BASE_COMMIT" \ + --branch "$PR_HEAD_COMMIT" +``` + +If you want to know which files are being skipped, enable verbose debugging (-v) when scanning, which will report any files being skipped by the baseline file (or via --exclude): + +```bash +# Skip all Python files and any directory named tests, and report to stderr any skipped files +kingfisher scan ./my-project \ + --exclude '*.py' \ + --exclude tests \ + -v +``` + +--- + +## Scanning Platform-Specific Targets + +> **Deprecated** +> Legacy scan flags such as `--github-user`, `--gitlab-group`, +> `--bitbucket-workspace`, `--azure-organization`, `--huggingface-user`, +> `--slack-query`, `--jira-url`, `--confluence-url`, `--s3-bucket`, +> `--gcs-bucket`, and `--docker-image` still work for now, but they trigger a +> warning and will be removed in a future release. Migrate to the +> `kingfisher scan ` subcommands below to future-proof your automations. + +--- + +## AWS S3 + +You can scan S3 objects directly: + +```bash +kingfisher scan s3 bucket-name [--prefix path/] +``` + +Credential resolution happens in this order: + +1. `KF_AWS_KEY` and `KF_AWS_SECRET` environment variables (optionally `KF_AWS_SESSION_TOKEN` for temporary credentials) +2. `--profile` pointing to a profile in `~/.aws/config` (works with AWS SSO) +3. anonymous access for public buckets + +If `--role-arn` is supplied, the credentials from steps 1–2 are used to assume that role. + +**Examples:** + +```bash +# using explicit keys +export KF_AWS_KEY=AKIA... +export KF_AWS_SECRET=g5nYW... +kingfisher scan s3 some-example-bucket + +# Above can also be run as: +KF_AWS_KEY=AKIA... KF_AWS_SECRET=g5nYW... kingfisher scan s3 some-example-bucket + +# using a local profile (e.g., SSO) that exists in your AWS profile (~/.aws/config) +kingfisher scan s3 some-example-bucket --profile default + +# anonymous scan of a bucket, while providing an object prefix to only scan subset of the s3 bucket +kingfisher scan s3 awsglue-datasets \ + --prefix examples/us-legislators/all + +# assuming a role when scanning +kingfisher scan s3 some-example-bucket \ + --role-arn arn:aws:iam::123456789012:role/MyRole + +# anonymous scan of a public bucket +kingfisher scan s3 some-example-bucket +``` + +**Docker example:** + +```bash +docker run --rm \ + -e KF_AWS_KEY=AKIA... \ + -e KF_AWS_SECRET=g5nYW... \ + ghcr.io/mongodb/kingfisher:latest \ + scan s3 bucket-name +``` + +--- + +## Google Cloud Storage + +Use the `gcs` scan subcommand to stream objects directly from Google Cloud Storage. Authentication uses Application Default Credentials, so you can provide a service-account JSON file via the `GOOGLE_APPLICATION_CREDENTIALS` environment variable or by passing `--service-account`. Public buckets work without credentials. + +```bash +kingfisher scan gcs bucket-name + +# scan a sub-tree inside the bucket +kingfisher scan gcs bucket-name --prefix path/to/data/ + +# supply a service-account key explicitly +kingfisher scan gcs bucket-name --service-account /path/to/key.json +``` + +**Functional example:** + +```bash +kingfisher scan gcs cloud-samples-data --prefix "storage/" +``` + +--- + +## Docker Images + +Kingfisher will first try to use any locally available image, then fall back to pulling via OCI. + +Authentication happens *in this order*: + +1. **`KF_DOCKER_TOKEN`** env var + - If it contains `user:pass`, it's used as Basic auth + - Otherwise it's sent as a Bearer token +2. **Docker CLI credentials** + - Checks `credHelpers` (per-registry) and `credsStore` in `~/.docker/config.json`. + - Falls back to the legacy `auths` → `auth` (base64) entries. +3. **Anonymous** (no credentials) + +```bash +# 1) Scan public or already-pulled image +kingfisher scan docker ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master + +# 2) For private registries, explicitly set KF_DOCKER_TOKEN: +# - Basic auth: "user:pass" +# - Bearer only: "TOKEN" +export KF_DOCKER_TOKEN="AWS:$(aws ecr get-login-password --region us-east-1)" +kingfisher scan docker some-private-registry.dkr.ecr.us-east-1.amazonaws.com/base/amazonlinux2023:latest + +# 3) Or rely on your Docker CLI login/keychain: +# (e.g. aws ecr get-login-password … | docker login …) +kingfisher scan docker private.registry.example.com/my-image:tag +``` + +--- + +## GitHub + +### Scan GitHub organization (requires `KF_GITHUB_TOKEN`) + +```bash +kingfisher scan github --organization my-org +kingfisher scan github --organization my-org --repo-clone-limit 500 +``` + +### Skip specific GitHub repositories during enumeration + +Repeat `--github-exclude` for every repository you want to ignore when scanning users or organizations. You can provide exact repositories like `OWNER/REPO` or gitignore-style glob patterns such as `owner/*-archive` (matching is case-insensitive). + +```bash +kingfisher scan github --organization my-org \ + --github-exclude my-org/huge-repo \ + --github-exclude my-org/*-archive +``` + +### Scan remote GitHub repository + +Pass a repository URL as a positional scan target to clone and scan its files and history. (The legacy `--git-url` flag still works but is deprecated.) When the URL targets GitHub and you pass `--include-contributors`, Kingfisher enumerates repository contributors and attempts to clone **all public repos owned by those contributors**—a common offensive and blue-team pivot when developers leak secrets in personal or side projects. Use `--repo-clone-limit` to cap how many repositories are cloned during this enumeration. + +**NOTE**: This may cause you to be temporarily rate-limited by GitHub. Providing a token (`KF_GITHUB_TOKEN`) will provide a higher rate limit. + +To inspect related server-side data, supply `--repo-artifacts`. This flag pulls down the repository's issues (including pull requests), wiki, and any public gists owned by the repository owner and scans them for secrets. Fetching these extras counts against API rate limits and private artifacts require a `KF_GITHUB_TOKEN`. + +Use `--git-clone-dir` to choose where cloned repositories land and `--keep-clones` to preserve them for follow-on analysis. + +> **Why can scanning a remote URL report fewer findings than scanning a local checkout?**. +> +> Remote clones default to `--mirror`/bare mode so Kingfisher only reads the Git history. When you point Kingfisher at an existing working tree (for example `kingfisher scan ./repo`), it enumerates both the filesystem contents *and* the Git history. Any secrets that are present in the checked-out files therefore appear twice: once from the working tree path and once from the commit where the secret entered the history. To replicate the remote behavior locally, either scan a bare clone or disable history scanning with `--git-history none` when targeting a working tree. + +```bash +# Scan the repository only +kingfisher scan github.com/org/repo + +# Scan the repository plus contributor repos, but cap the crawl +kingfisher scan https://github.com/org/repo.git \ + --include-contributors \ + --repo-clone-limit 250 + +# Keep clones for later manual inspection +kingfisher scan https://github.com/org/repo.git \ + --git-clone-dir ./kingfisher-clones \ + --keep-clones + +# Include issues, wiki, and owner gists +kingfisher scan https://github.com/org/repo.git --repo-artifacts + +# Private repositories or artifacts +KF_GITHUB_TOKEN="ghp_…" kingfisher scan https://github.com/org/private_repo.git --repo-artifacts +``` + +--- + +## GitLab + +### Scan GitLab group (requires `KF_GITLAB_TOKEN`) + +```bash +kingfisher scan gitlab --group my-group +# include repositories from all nested subgroups +kingfisher scan gitlab --group my-group --include-subgroups +kingfisher scan gitlab --group my-group --repo-clone-limit 500 +``` + +### Scan GitLab user + +```bash +kingfisher scan gitlab --user johndoe +``` + +### Skip specific GitLab projects during enumeration + +Repeat `--gitlab-exclude` for every project path you want to ignore when scanning users or groups. Specify project paths as `group/project` (case-insensitive) or use gitignore-style glob patterns like `group/**/archive-*` to drop families of projects across nested subgroups. + +```bash +kingfisher scan gitlab --group my-group \ + --gitlab-exclude my-group/huge-project \ + --gitlab-exclude my-group/**/archive-* +``` + +### Scan remote GitLab repository by URL + +A Git URL target by itself clones the project repository. When the URL targets GitLab and you pass `--include-contributors`, Kingfisher enumerates contributors and tries to clone **their other public projects** to catch secrets that escape the main repo. Apply `--repo-clone-limit` to cap the total repos cloned during this pivot. + +**NOTE**: This may cause you to be temporarily rate-limited by GitLab. Providing a token (`KF_GITLAB_TOKEN`) will provide a higher rate limit. + +To include server-side artifacts owned by the project, add `--repo-artifacts`. Kingfisher will retrieve the project's issues, wiki, and snippets and scan them for secrets. These extra requests may take longer and require a `KF_GITLAB_TOKEN` for private projects. + +Use `--git-clone-dir` to choose where cloned projects land and `--keep-clones` to preserve them for later review. + +```bash +# Scan the repository only +kingfisher scan gitlab.com/group/project.git + +# Scan the repository plus contributor projects, but cap the crawl +kingfisher scan https://gitlab.com/group/project.git \ + --include-contributors \ + --repo-clone-limit 250 + +# Keep clones for later manual inspection +kingfisher scan https://gitlab.com/group/project.git \ + --git-clone-dir ./kingfisher-clones \ + --keep-clones + +# Include issues, wiki, and snippets +kingfisher scan https://gitlab.com/group/project.git --repo-artifacts + +# Private projects or artifacts +KF_GITLAB_TOKEN="glpat-…" kingfisher scan https://gitlab.com/group/private_project.git --repo-artifacts +``` + +### List GitLab repositories + +```bash +kingfisher scan gitlab --group my-group --list-only +# include repositories from all nested subgroups +kingfisher scan gitlab --group my-group --include-subgroups --list-only +# skip specific projects when listing or scanning (supports glob patterns) +kingfisher scan gitlab --group my-group --gitlab-exclude my-group/**/legacy-* --list-only +``` + +--- + +## Azure Repos + +### Scan Azure Repos organization or collection (requires `KF_AZURE_TOKEN` or `KF_AZURE_PAT`) + +```bash +kingfisher scan azure --organization my-org + +# Azure Repos Server example +KF_AZURE_PAT="pat" kingfisher scan azure --organization DefaultCollection --azure-base-url https://ado.internal.example/tfs/ +``` + +### Scan specific Azure Repos projects + +Projects are specified as `ORGANIZATION/PROJECT`. Repeat the flag for multiple projects. + +```bash +kingfisher scan azure --project my-org/payments \ + --project my-org/core-platform +``` + +### Skip specific Azure repositories during enumeration + +Repeat `--azure-exclude` to ignore repositories when scanning organizations or projects. Use identifiers like `ORGANIZATION/PROJECT/REPOSITORY`. Repositories that share the same name as their project can be excluded with `ORGANIZATION/PROJECT`, and gitignore-style patterns such as `my-org/*/archive-*` are also supported. + +```bash +kingfisher scan azure --organization my-org \ + --azure-exclude my-org/payments/legacy-service \ + --azure-exclude my-org/**/archive-* +``` + +### List Azure repositories + +```bash +kingfisher scan azure --organization my-org --list-only +# list repositories for specific projects +kingfisher scan azure --project my-org/app --project my-org/api --list-only +# skip specific repositories while listing (supports glob patterns) +kingfisher scan azure --organization my-org --azure-exclude my-org/**/experimental-* --list-only +``` + +--- + +## Gitea + +### Scan Gitea organization (requires `KF_GITEA_TOKEN`) + +```bash +kingfisher scan gitea --organization my-org +# self-hosted example +KF_GITEA_TOKEN="gtoken" kingfisher scan gitea --organization platform --gitea-api-url https://gitea.internal.example/api/v1/ +``` + +### Scan Gitea user + +```bash +kingfisher scan gitea --user johndoe +``` + +### Skip specific Gitea repositories during enumeration + +Repeat `--gitea-exclude` for each repository you want to ignore when scanning users or organizations. Accepts `owner/repo` identifiers or gitignore-style glob patterns like `team/**/archive-*`. + +```bash +kingfisher scan gitea --organization my-org \ + --gitea-exclude my-org/legacy-repo \ + --gitea-exclude my-org/**/archive-* +``` + +### Scan remote Gitea repository by URL + +A Git URL target clones the repository and scans its history. Adding `--repo-artifacts` also clones the repository wiki if one exists. Private repositories and wikis require `KF_GITEA_TOKEN` (and `KF_GITEA_USERNAME` when cloning via HTTPS). + +```bash +# Scan the repository only +kingfisher scan https://gitea.com/org/repo.git + +# Include the repository wiki (if present) +KF_GITEA_TOKEN="gtoken" KF_GITEA_USERNAME="org" \ + kingfisher scan https://gitea.com/org/repo.git --repo-artifacts +``` + +### List Gitea repositories + +```bash +kingfisher scan gitea --organization my-org --list-only +# enumerate every organization visible to the authenticated user +KF_GITEA_TOKEN="gtoken" kingfisher scan gitea --all-gitea-organizations --list-only +# self-hosted example +KF_GITEA_TOKEN="gtoken" kingfisher scan gitea --user johndoe --gitea-api-url https://gitea.internal.example/api/v1/ --list-only +``` + +--- + +## Bitbucket + +### Scan Bitbucket workspace + +```bash +kingfisher scan bitbucket --workspace my-team +# include Bitbucket Cloud repositories from every accessible workspace +KF_BITBUCKET_TOKEN="$BITBUCKET_TOKEN" \ + kingfisher scan bitbucket --all-workspaces +``` + +### Scan Bitbucket user + +```bash +kingfisher scan bitbucket --user johndoe +``` + +### Skip specific Bitbucket repositories during enumeration + +Use `--bitbucket-exclude` to ignore repositories while scanning users, workspaces, or projects. Patterns accept either `owner/repo` (case-insensitive) or gitignore-style globs such as `workspace/**/archive-*`. + +```bash +kingfisher scan bitbucket --workspace my-team \ + --bitbucket-exclude my-team/legacy-repo \ + --bitbucket-exclude my-team/**/archive-* +``` + +### Scan remote Bitbucket repository by URL + +A Git URL target clones the repository and scans its files and history. To inspect Bitbucket artifacts such as issues, add `--repo-artifacts`. Private artifacts require credentials (see [Authenticate to Bitbucket](#authenticate-to-bitbucket)). + +```bash +# Scan the repository only +kingfisher scan https://bitbucket.org/hashashash/secretstest.git + +# Include repository issues +KF_BITBUCKET_TOKEN="$BITBUCKET_TOKEN" \ + kingfisher scan https://bitbucket.org/workspace/project.git --repo-artifacts +``` + +### List Bitbucket repositories + +```bash +kingfisher scan bitbucket --workspace my-team --list-only +# enumerate all accessible workspaces or projects +KF_BITBUCKET_TOKEN="$BITBUCKET_TOKEN" \ + kingfisher scan bitbucket --all-workspaces --list-only +# filter out repositories using glob patterns +kingfisher scan bitbucket --workspace my-team --bitbucket-exclude my-team/**/experimental-* --list-only +``` + +### Authenticate to Bitbucket + +Kingfisher supports Bitbucket Cloud and Bitbucket Server credentials: + +- **Workspace API token (Cloud)** – set `KF_BITBUCKET_TOKEN`. Kingfisher automatically uses the token for Bitbucket REST APIs and authenticates git operations as `x-token-auth`. +- **Bitbucket Server token** – set `KF_BITBUCKET_USERNAME` and either `KF_BITBUCKET_TOKEN` or `KF_BITBUCKET_PASSWORD`. +- **Legacy app password (Cloud)** – set `KF_BITBUCKET_USERNAME` and `KF_BITBUCKET_APP_PASSWORD`. +- **OAuth/PAT token** – set `KF_BITBUCKET_OAUTH_TOKEN`. + +These credentials match the options described in the [ghorg setup guide](https://github.com/gabrie30/ghorg/blob/master/README.md#bitbucket-setup). + +Bitbucket no longer supports App Tokens as of September 9, 2025: https://support.atlassian.com/bitbucket-cloud/docs/api-tokens/ + +> As of September 9, 2025, app passwords can no longer be created. Use API tokens with scopes instead. All existing app passwords will be disabled on June 9, 2026. Migrate any integrations before then to avoid disruptions. + +### Self-hosted Bitbucket Server + +Use `--bitbucket-api-url` to point Kingfisher at your server's REST endpoint, for example `https://bitbucket.example.com/rest/api/1.0/`. Provide credentials with `KF_BITBUCKET_USERNAME` plus either `KF_BITBUCKET_TOKEN` or `KF_BITBUCKET_PASSWORD`, and pass `--tls-mode=off` (or the legacy `--ignore-certs`) when connecting to HTTP or otherwise insecure instances. + +--- + +## Hugging Face + +Hugging Face hosts git repositories for models, datasets, and Spaces. Kingfisher can enumerate and scan all three resource types. + +### Scan Hugging Face user + +```bash +kingfisher scan huggingface --user +``` + +### Scan Hugging Face organization + +```bash +kingfisher scan huggingface --organization +``` + +### Scan specific Hugging Face resources + +Scan individual repositories by ID (owner/name) or by passing the full HTTPS URL: + +```bash +kingfisher scan huggingface --model +kingfisher scan huggingface --dataset https://huggingface.co/datasets// +kingfisher scan huggingface --space +``` + +Use `--huggingface-exclude` to omit results returned by user or organization enumeration. Prefix values with `model:`, `dataset:`, or `space:` when you only want to skip a specific resource type. + +### List Hugging Face repositories + +```bash +kingfisher scan huggingface --user --list-only +``` + +### Authenticate to Hugging Face + +Private repositories require an access token provided through the `KF_HUGGINGFACE_TOKEN` environment variable. For git authentication the helper also honours `KF_HUGGINGFACE_USERNAME` (default `hf_user`). + +--- + +## Jira + +### Scan Jira issues matching a JQL query + +```bash +KF_JIRA_TOKEN="token" kingfisher scan jira --url https://jira.company.com \ + --jql "project = TEST AND status = Open" \ + --max-results 500 +``` + +### Include Jira comments and changelog entries + +```bash +KF_JIRA_TOKEN="token" kingfisher scan jira --url https://jira.company.com \ + --jql "project = TEST AND status = Open" \ + --include-comments \ + --include-changelog +``` + +`--include-comments` writes and scans per-issue `comments.json` artifacts. +`--include-changelog` writes and scans per-issue `changelog.json` artifacts. + +### Scan the last 1,000 Jira issues + +```bash +KF_JIRA_TOKEN="token" kingfisher scan jira --url https://jira.mongodb.org \ + --jql 'ORDER BY created DESC' \ + --max-results 1000 +``` + +--- + +## Confluence + +### Scan Confluence pages matching a CQL query + +```bash +# Bearer token +KF_CONFLUENCE_TOKEN="token" kingfisher scan confluence --url https://confluence.company.com \ + --cql "label = secret" \ + --max-results 500 + +# Basic auth with username and token +KF_CONFLUENCE_USER="user@example.com" KF_CONFLUENCE_TOKEN="token" \ + kingfisher scan confluence --url https://confluence.company.com \ + --cql "text ~ 'password'" \ + --max-results 500 +``` + +Use the base URL of your Confluence site for `--confluence-url`. Kingfisher automatically adds `/rest/api` to the end, so `https://example.com/wiki` and `https://example.com` both work depending on your server configuration. + +Generate a personal access token and set it in the `KF_CONFLUENCE_TOKEN` environment variable. By default, Kingfisher sends the token as a bearer token in the `Authorization` header. + +To use basic authentication instead, also set `KF_CONFLUENCE_USER` to your Confluence email address; Kingfisher will then send the username and `KF_CONFLUENCE_TOKEN` as a Basic auth header. If the server responds with a redirect to a login page, the credentials are invalid or lack the required permissions. + +--- + +## Slack + +### Scan Slack messages matching a search query + +```bash +KF_SLACK_TOKEN="xoxp-1234..." kingfisher scan slack "from:username has:link" \ + --max-results 1000 + +KF_SLACK_TOKEN="xoxp-1234..." kingfisher scan slack "akia" \ + --max-results 1000 +``` + +*The Slack token must be a user token with the `search:read` scope. Bot tokens (those beginning with `xoxb-`) cannot call the Slack search API.* + +--- + +## Microsoft Teams + +### Scan Teams messages matching a search query + +```bash +KF_TEAMS_TOKEN="eyJ0..." kingfisher scan teams "password OR api_key" \ + --max-results 1000 + +KF_TEAMS_TOKEN="eyJ0..." kingfisher scan teams "akia" \ + --max-results 1000 +``` + +The token must be a Microsoft Graph API access token with `ChannelMessage.Read.All` (application) or `Chat.Read` (delegated) permissions. You can obtain one via Azure AD app registration or the Azure CLI: + +```bash +az login +KF_TEAMS_TOKEN=$(az account get-access-token --resource https://graph.microsoft.com --query accessToken -o tsv) +kingfisher scan teams "secret OR password" +``` + +**Note:** Microsoft Graph does not support personal Microsoft accounts for Teams chat operations. Teams scanning requires a **Microsoft 365 work or school account**; free/personal Teams accounts are not supported by the Graph API. + +--- + +## TLS Certificate Validation + +Kingfisher validates TLS certificates when connecting to endpoints during secret validation (database connections, API calls, JWKS fetching, etc.). The `--tls-mode` flag controls this behavior: + +| Mode | Description | +| ---- | ----------- | +| `strict` | **Default.** Full WebPKI certificate validation: trusted CA chain, hostname match, certificate not expired. | +| `lax` | Accept self-signed or unknown CA certificates for rules that opt into it. Still enforces TLS 1.2+. Useful for database connections using self-signed certs or private CAs (e.g., Amazon RDS). | +| `off` | Disable all certificate validation. Use with extreme caution. | + +### When to use `--tls-mode=lax` + +The `lax` mode is designed for environments where: + +- **Database connections** use self-signed certificates (common for PostgreSQL, MySQL, MongoDB) +- **Private CAs** are used (e.g., Amazon RDS uses an Amazon-issued CA that may not be in your system trust store) +- **Internal services** have certificates not signed by public CAs + +Rules must opt into lax TLS by declaring `tls_mode: lax` in their definition. When you pass `--tls-mode=lax`, only rules with this declaration will use relaxed certificate validation. SaaS API validators (GitHub, Slack, AWS, etc.) always use strict validation regardless of this flag. + +### Examples + +```bash +# Default: strict TLS everywhere +kingfisher scan ./repo + +# Lax TLS for database connection rules (Postgres, MySQL, MongoDB, JDBC, JWT) +kingfisher scan --tls-mode=lax ./repo + +# Disable all TLS validation (not recommended) +kingfisher scan --tls-mode=off ./repo +``` + +The legacy `--ignore-certs` flag is still supported as an alias for `--tls-mode=off`. + +--- + +## SSRF Protection + +Kingfisher makes outbound HTTP requests during credential validation, with URLs sometimes constructed from user-controlled data found in scanned content (e.g., domain names extracted alongside API keys). To prevent Server-Side Request Forgery (SSRF), Kingfisher blocks validation requests that would connect to non-public IP addresses. + +### What is blocked + +By default, validation requests are rejected if the target hostname resolves to any of these address ranges: + +| Range | Description | +| ----- | ----------- | +| `127.0.0.0/8`, `::1` | Loopback (localhost) | +| `0.0.0.0/8`, `::` | Unspecified / "this network" (RFC 1122) | +| `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` | Private networks (RFC 1918) | +| `169.254.0.0/16`, `fe80::/10` | Link-local (includes cloud metadata at `169.254.169.254`) | +| `100.64.0.0/10` | CGNAT / Shared Address Space | +| `fc00::/7` | IPv6 unique-local | +| `2001:db8::/32` | IPv6 documentation (RFC 3849) | +| `::ffff:0:0/96` | IPv4-mapped IPv6 (checked against IPv4 rules) | +| `::/96` | IPv4-compatible IPv6 (deprecated) | +| `240.0.0.0/4` | Reserved for future use (includes broadcast) | +| `fec0::/10` | IPv6 site-local (deprecated, RFC 3879) | +| Multicast, benchmarking ranges | Other reserved ranges | + +HTTP redirects during credential validation are also validated: each redirect target is resolved via DNS and checked against the same SSRF rules above. Redirects to non-public IPs are blocked. When `--allow-internal-ips` is used, redirect validation is disabled along with all other SSRF protections. + +### `--allow-internal-ips` + +If you are scanning infrastructure that uses internal endpoints for credential validation (e.g., self-hosted GitLab, Artifactory, or Vault behind a private network), use `--allow-internal-ips` to disable SSRF protections: + +```bash +# Scan with SSRF protection disabled (allows requests to internal IPs) +kingfisher scan --allow-internal-ips ./repo + +# Also works with the validate command +kingfisher validate --allow-internal-ips --rule kingfisher.artifactory.1 +``` + +> **Warning:** Only use `--allow-internal-ips` when you trust the content being scanned. Malicious content could cause Kingfisher to make requests to internal services. + +--- + +## Understanding the Scan Summary + +After each scan, Kingfisher displays a summary with validation statistics: + +``` +========================================== +Scan Summary: +========================================== + |Findings....................: 15 + |__Successful Validations....: 3 + |__Failed Validations........: 5 + |__Skipped Validations.......: 2 + |Rules Applied...............: 120 + |__Blobs Scanned.............: 1,234 + |Bytes Scanned...............: 45.2 MB + |Scan Duration...............: 12s 345ms + ... +``` + +### Validation Counters + +| Counter | Description | +| ------- | ----------- | +| **Successful Validations** | Credentials confirmed as active by the provider (e.g., API returned valid response) | +| **Failed Validations** | Validations that were attempted but failed (HTTP errors, connection timeouts, invalid credentials) | +| **Skipped Validations** | Validations that could not be attempted due to missing preconditions (e.g., missing dependent rules) | + +### Why Validations Are Skipped + +Validations are marked as "skipped" when: + +- **Missing dependent rules**: Some rules require values from other rules to validate. For example, an AWS Secret Key rule needs the Access Key ID from the AWS Access Key rule. If the dependent rule wasn't matched, validation cannot proceed. +- **Preconditions not met**: The validation endpoint requires additional context that wasn't available in the scan. + +When a validation is skipped, the finding will show: + +``` + |Validation....: Inactive Credential + |__Response....: Validation skipped - missing dependent rules: helper-rule-id +``` + +This distinction helps you understand validation coverage: **Failed Validations** represent actual validation attempts, while **Skipped Validations** indicate opportunities to improve rule coverage or provide additional context. + +--- + +## Environment Variables + +| Variable | Purpose | +| ----------------- | ---------------------------- | +| `KF_GITHUB_TOKEN` | GitHub Personal Access Token | +| `KF_GITLAB_TOKEN` | GitLab Personal Access Token | +| `KF_GITEA_TOKEN` | Gitea Personal Access Token | +| `KF_GITEA_USERNAME` | Username for private Gitea clones (used with `KF_GITEA_TOKEN`) | +| `KF_AZURE_TOKEN` / `KF_AZURE_PAT` | Azure Repos Personal Access Token | +| `KF_AZURE_USERNAME` | Username to use with Azure Repos PATs (defaults to `pat` when unset) | +| `KF_BITBUCKET_TOKEN` | Bitbucket Cloud workspace API token or Bitbucket Server PAT | +| `KF_BITBUCKET_USERNAME` | Optional Bitbucket username for legacy app passwords or server tokens | +| `KF_BITBUCKET_APP_PASSWORD` | Legacy Bitbucket app password (deprecated September 9, 2025; disabled June 9, 2026) | +| `KF_BITBUCKET_OAUTH_TOKEN` | Bitbucket OAuth or PAT token | +| `KF_HUGGINGFACE_TOKEN` | Hugging Face access token for API enumeration and git cloning | +| `KF_HUGGINGFACE_USERNAME` | Optional username for Hugging Face git operations (defaults to `hf_user`) | +| `KF_JIRA_TOKEN` | Jira API token | +| `KF_CONFLUENCE_TOKEN` | Confluence API token | +| `KF_SLACK_TOKEN` | Slack API token | +| `KF_TEAMS_TOKEN` | Microsoft Graph API token for Teams message search | +| `KF_DOCKER_TOKEN` | Docker registry token (`user:pass` or bearer token). If unset, credentials from the Docker keychain are used | +| `KF_AWS_KEY`, `KF_AWS_SECRET`, and `KF_AWS_SESSION_TOKEN` | AWS credentials for S3 bucket scanning. Session token is optional, for temporary credentials | + +Set them temporarily per command: + +```bash +KF_GITLAB_TOKEN="glpat-…" kingfisher scan gitlab --group my-group +``` + +Or export for the session: + +```bash +export KF_GITLAB_TOKEN="glpat-…" +``` + +To authenticate Jira requests: + +```bash +export KF_JIRA_TOKEN="token" +``` + +To authenticate Confluence requests: + +```bash +export KF_CONFLUENCE_TOKEN="token" +``` + +_If no token is provided Kingfisher still works for public repositories._ + +--- + +## Exit Codes + +| Code | Meaning | +| ---- | ----------------------------- | +| 0 | No findings | +| 200 | Findings discovered | +| 205 | Validated findings discovered | diff --git a/docs-site/docs/usage/deployment.md b/docs-site/docs/usage/deployment.md new file mode 100644 index 0000000..af789f6 --- /dev/null +++ b/docs-site/docs/usage/deployment.md @@ -0,0 +1,107 @@ +--- +title: "Deployment" +description: "Deployment strategies for Kingfisher: self-serve CLI, CI/pre-commit enforcement, centralized scanning, and embedded library." +--- + +# Deployment Strategies + +This guide summarizes practical ways to deploy Kingfisher in teams, CI systems, and shared security workflows. + +## Deployment Models + +### Self-Serve CLI + +Best for developers, security engineers, and incident responders who want a local tool. + +- Install via Homebrew, PyPI, Docker, or release binaries. +- Run scans directly against local repositories, remote git hosts, cloud storage, chat exports, and other supported inputs. +- Use `--format toon`, `json`, `sarif`, or `html` depending on whether the consumer is a human, CI system, or another tool. + +Good fit: + +- local triage +- ad hoc repo reviews +- one-off credential validation or revocation +- pre-commit and developer workstation enforcement + +See: + +- [INSTALLATION.md](../getting-started/installation.md) +- [USAGE.md](../usage/basic-scanning.md) +- [INTEGRATIONS.md](../usage/integrations.md) + +### CI and Pre-Commit + +Best for preventing new secrets from landing in repositories. + +- Run `kingfisher scan` in CI against the working tree or a branch diff. +- Use pre-commit hooks for developer-side enforcement before code is pushed. +- Emit SARIF when integrating with code scanning or security dashboards. + +Common patterns: + +- scan the entire repository on protected branches +- scan only changed content in pull request workflows +- fail builds on findings or validated findings depending on policy + +See: + +- [INSTALLATION.md](../getting-started/installation.md) +- [ADVANCED.md](../usage/advanced.md) + +### Centralized Security Scanning + +Best for security teams scanning many repositories or data sources from a controlled environment. + +- Run Kingfisher from a dedicated automation host, container job, or scheduled workflow. +- Store platform credentials in your existing secret manager and inject them at runtime. +- Prefer structured outputs like JSON, SARIF, or HTML for downstream ingestion and review. +- Use `--access-map` when you are authorized to assess blast radius for validated credentials. + +Typical centralized inputs: + +- GitHub, GitLab, Gitea, Bitbucket, Azure Repos, Hugging Face +- Jira, Confluence, Slack, Microsoft Teams +- S3, GCS, and Docker images + +See: + +- [INTEGRATIONS.md](../usage/integrations.md) +- [ACCESS_MAP.md](../features/access-map.md) +- [ARCHITECTURE.md](../reference/architecture.md) + +### Embedded Library Usage + +Best when you want Kingfisher scanning inside another Rust application or service. + +- Use `kingfisher-core` for shared content and location types. +- Use `kingfisher-rules` to load or compile rules. +- Use `kingfisher-scanner` for the embeddable scanning API. + +This model is useful for: + +- internal developer platforms +- custom ingestion pipelines +- security automation services +- specialized report generation + +See: + +- [LIBRARY.md](../reference/library.md) + +## Operational Guidance + +- Start with self-serve or CI deployment before building centralized automation. +- Prefer scoped credentials for integrations and validation. +- Use structured output formats when results are consumed by other systems. +- Treat `--access-map`, validation, and revocation as privileged operations and run them only where authorized. +- Keep rules and binaries updated together so documentation, features, and provider coverage stay aligned. + +## Related Documentation + +- [INSTALLATION.md](../getting-started/installation.md) +- [USAGE.md](../usage/basic-scanning.md) +- [ADVANCED.md](../usage/advanced.md) +- [INTEGRATIONS.md](../usage/integrations.md) +- [ACCESS_MAP.md](../features/access-map.md) +- [LIBRARY.md](../reference/library.md) diff --git a/docs-site/docs/usage/integrations.md b/docs-site/docs/usage/integrations.md new file mode 100644 index 0000000..bdc5d21 --- /dev/null +++ b/docs-site/docs/usage/integrations.md @@ -0,0 +1,649 @@ +--- +title: "Platform Integrations" +description: "Scan GitHub, GitLab, Azure Repos, Bitbucket, Gitea, Hugging Face, Docker, S3, Jira, Confluence, Slack, and Teams for leaked secrets." +--- + +# Platform Integrations + +This guide covers how to scan various platforms and services with Kingfisher. + +## Table of Contents + +- [AWS S3](#aws-s3) +- [Google Cloud Storage](#google-cloud-storage) +- [Docker](#docker) +- [GitHub](#github) +- [GitLab](#gitlab) +- [Azure Repos](#azure-repos) +- [Gitea](#gitea) +- [Bitbucket](#bitbucket) +- [Hugging Face](#hugging-face) +- [Jira](#jira) +- [Confluence](#confluence) +- [Slack](#slack) +- [Microsoft Teams](#microsoft-teams) +- [Environment Variables](#environment-variables) + +## AWS S3 + +You can scan S3 objects directly: + +```bash +kingfisher scan s3 bucket-name [--prefix path/] +``` + +Credential resolution happens in this order: + +1. `KF_AWS_KEY` and `KF_AWS_SECRET` environment variables (optionally `KF_AWS_SESSION_TOKEN` for temporary credentials) +2. `--profile` pointing to a profile in `~/.aws/config` (works with AWS SSO) +3. anonymous access for public buckets + +If `--role-arn` is supplied, the credentials from steps 1–2 are used to assume that role. + +### Examples + +```bash +# using explicit keys +export KF_AWS_KEY=AKIA... +export KF_AWS_SECRET=g5nYW... +kingfisher scan s3 some-example-bucket + +# Above can also be run as: +KF_AWS_KEY=AKIA... KF_AWS_SECRET=g5nYW... kingfisher scan s3 some-example-bucket + +# using a local profile (e.g., SSO) that exists in your AWS profile (~/.aws/config) +kingfisher scan s3 some-example-bucket --profile default + +# anonymous scan of a bucket, while providing an object prefix to only scan subset of the s3 bucket +kingfisher scan s3 awsglue-datasets \ + --prefix examples/us-legislators/all + +# assuming a role when scanning +kingfisher scan s3 some-example-bucket \ + --role-arn arn:aws:iam::123456789012:role/MyRole + +# anonymous scan of a public bucket +kingfisher scan s3 some-example-bucket +``` + +Docker example: + +```bash +docker run --rm \ + -e KF_AWS_KEY=AKIA... \ + -e KF_AWS_SECRET=g5nYW... \ + ghcr.io/mongodb/kingfisher:latest \ + scan s3 bucket-name +``` + +## Google Cloud Storage + +Use the `gcs` scan subcommand to stream objects directly from Google Cloud Storage. Authentication +uses Application Default Credentials, so you can provide a service-account JSON file via the +`GOOGLE_APPLICATION_CREDENTIALS` environment variable or by passing `--service-account`. Public +buckets work without credentials. + +```bash +kingfisher scan gcs bucket-name + +# scan a sub-tree inside the bucket +kingfisher scan gcs bucket-name --prefix path/to/data/ + +# supply a service-account key explicitly +kingfisher scan gcs bucket-name --service-account /path/to/key.json +``` + +Functional example: +```bash +kingfisher scan gcs cloud-samples-data --prefix "storage/" +``` + +## Docker + +Kingfisher will first try to use any locally available image, then fall back to pulling via OCI. + +Authentication happens *in this order*: + +1. **`KF_DOCKER_TOKEN`** env var + - If it contains `user:pass`, it's used as Basic auth + - Otherwise it's sent as a Bearer token +2. **Docker CLI credentials** + - Checks `credHelpers` (per-registry) and `credsStore` in `~/.docker/config.json`. + - Falls back to the legacy `auths` → `auth` (base64) entries. +3. **Anonymous** (no credentials) + +### Examples + +```bash +# 1) Scan public or already-pulled image +kingfisher scan docker ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master + +# 2) For private registries, explicitly set KF_DOCKER_TOKEN: +# - Basic auth: "user:pass" +# - Bearer only: "TOKEN" +export KF_DOCKER_TOKEN="AWS:$(aws ecr get-login-password --region us-east-1)" +kingfisher scan docker some-private-registry.dkr.ecr.us-east-1.amazonaws.com/base/amazonlinux2023:latest + +# 3) Or rely on your Docker CLI login/keychain: +# (e.g. aws ecr get-login-password … | docker login …) +kingfisher scan docker private.registry.example.com/my-image:tag +``` + +> **Deprecated** +> Legacy scan flags such as `--github-user`, `--gitlab-group`, +> `--bitbucket-workspace`, `--azure-organization`, `--huggingface-user`, +> `--slack-query`, `--jira-url`, `--confluence-url`, `--s3-bucket`, +> `--gcs-bucket`, and `--docker-image` still work for now, but they trigger a +> warning and will be removed in a future release. Migrate to the +> `kingfisher scan ` subcommands below to future-proof your automations. + +## GitHub + +### Scan GitHub organization (requires `KF_GITHUB_TOKEN`) + +```bash +kingfisher scan github --organization my-org +kingfisher scan github --organization my-org --repo-clone-limit 500 +``` + +### Skip specific GitHub repositories during enumeration + +Repeat `--github-exclude` for every repository you want to ignore when scanning +users or organizations. You can provide exact repositories like +`OWNER/REPO` or gitignore-style glob patterns such as `owner/*-archive` +(matching is case-insensitive). + +```bash +kingfisher scan github --organization my-org \ + --github-exclude my-org/huge-repo \ + --github-exclude my-org/*-archive +``` + +### Scan remote GitHub repository + +Pass a repository URL as a positional scan target to clone and scan its files and history. +(The legacy `--git-url` flag still works but is deprecated.) When the URL +targets GitHub and you pass `--include-contributors`, Kingfisher enumerates +repository contributors and attempts to clone **all public repos owned by those +contributors**—a common offensive and blue-team pivot when developers leak +secrets in personal or side projects. Use `--repo-clone-limit` to cap how many +repositories are cloned during this enumeration. + +**NOTE**: This may cause you to be temporarily rate-limited by GitHub. +Providing a token (`KF_GITHUB_TOKEN`) will provide a higher rate limit. + +To inspect related server-side data, supply `--repo-artifacts`. This flag pulls +down the repository's issues (including pull requests), wiki, and any public +gists owned by the repository owner and scans them for secrets. Fetching these +extras counts against API rate limits and private artifacts require a +`KF_GITHUB_TOKEN`. + +Use `--git-clone-dir` to choose where cloned repositories land and +`--keep-clones` to preserve them for follow-on analysis. + +> **Why can scanning a remote URL report fewer findings than scanning a local checkout?**. +> +> Remote clones default to `--mirror`/bare mode so Kingfisher only +> reads the Git history. When you point Kingfisher at an existing working tree (for example +> `kingfisher scan ./repo`), it enumerates both the filesystem contents *and* the Git +> history. Any secrets that are present in the checked-out files therefore appear twice: +> once from the working tree path and once from the commit where the secret entered the +> history. To replicate the remote behavior locally, either scan a bare clone or disable +> history scanning with `--git-history none` when targeting a working tree. + +```bash +# Scan the repository only +kingfisher scan github.com/org/repo + +# Scan the repository plus contributor repos, but cap the crawl +kingfisher scan https://github.com/org/repo.git \ + --include-contributors \ + --repo-clone-limit 250 + +# Keep clones for later manual inspection +kingfisher scan https://github.com/org/repo.git \ + --git-clone-dir ./kingfisher-clones \ + --keep-clones + +# Include issues, wiki, and owner gists +kingfisher scan https://github.com/org/repo.git --repo-artifacts + +# Private repositories or artifacts +KF_GITHUB_TOKEN="ghp_…" kingfisher scan https://github.com/org/private_repo.git --repo-artifacts +``` + +## GitLab + +### Scan GitLab group (requires `KF_GITLAB_TOKEN`) + +```bash +kingfisher scan gitlab --group my-group +# include repositories from all nested subgroups +kingfisher scan gitlab --group my-group --include-subgroups +kingfisher scan gitlab --group my-group --repo-clone-limit 500 +``` + +### Scan GitLab user + +```bash +kingfisher scan gitlab --user johndoe +``` + +### Skip specific GitLab projects during enumeration + +Repeat `--gitlab-exclude` for every project path you want to ignore when scanning +users or groups. Specify project paths as `group/project` (case-insensitive) or +use gitignore-style glob patterns like `group/**/archive-*` to drop families of +projects across nested subgroups. + +```bash +kingfisher scan gitlab --group my-group \ + --gitlab-exclude my-group/huge-project \ + --gitlab-exclude my-group/**/archive-* +``` + +### Scan remote GitLab repository by URL + +A Git URL target by itself clones the project repository. When the URL targets +GitLab and you pass `--include-contributors`, Kingfisher enumerates contributors +and tries to clone **their other public projects** to catch secrets that escape +the main repo. Apply `--repo-clone-limit` to cap the total repos cloned during +this pivot. + +**NOTE**: This may cause you to be temporarily rate-limited by GitLab. +Providing a token (`KF_GITLAB_TOKEN`) will provide a higher rate limit. + +To include server-side artifacts owned by the project, add `--repo-artifacts`. +Kingfisher will retrieve the project's issues, wiki, and snippets and scan them +for secrets. These extra requests may take longer and require a +`KF_GITLAB_TOKEN` for private projects. + +Use `--git-clone-dir` to choose where cloned projects land and `--keep-clones` +to preserve them for later review. + +```bash +# Scan the repository only +kingfisher scan gitlab.com/group/project.git + +# Scan the repository plus contributor projects, but cap the crawl +kingfisher scan https://gitlab.com/group/project.git \ + --include-contributors \ + --repo-clone-limit 250 + +# Keep clones for later manual inspection +kingfisher scan https://gitlab.com/group/project.git \ + --git-clone-dir ./kingfisher-clones \ + --keep-clones + +# Include issues, wiki, and snippets +kingfisher scan https://gitlab.com/group/project.git --repo-artifacts + +# Private projects or artifacts +KF_GITLAB_TOKEN="glpat-…" kingfisher scan https://gitlab.com/group/private_project.git --repo-artifacts +``` + +### List GitLab repositories + +```bash +kingfisher scan gitlab --group my-group --list-only +# include repositories from all nested subgroups +kingfisher scan gitlab --group my-group --include-subgroups --list-only +# skip specific projects when listing or scanning (supports glob patterns) +kingfisher scan gitlab --group my-group --gitlab-exclude my-group/**/legacy-* --list-only +``` + +## Azure Repos + +### Scan Azure Repos organization or collection (requires `KF_AZURE_TOKEN` or `KF_AZURE_PAT`) + +```bash +kingfisher scan azure --organization my-org + +# Azure Repos Server example +KF_AZURE_PAT="pat" kingfisher scan azure --organization DefaultCollection --azure-base-url https://ado.internal.example/tfs/ +``` + +### Scan specific Azure Repos projects + +Projects are specified as `ORGANIZATION/PROJECT`. Repeat the flag for multiple projects. + +```bash +kingfisher scan azure --project my-org/payments \ + --project my-org/core-platform +``` + +### Skip specific Azure repositories during enumeration + +Repeat `--azure-exclude` to ignore repositories when scanning organizations or projects. +Use identifiers like `ORGANIZATION/PROJECT/REPOSITORY`. Repositories that share the same +name as their project can be excluded with `ORGANIZATION/PROJECT`, and gitignore-style +patterns such as `my-org/*/archive-*` are also supported. + +```bash +kingfisher scan azure --organization my-org \ + --azure-exclude my-org/payments/legacy-service \ + --azure-exclude my-org/**/archive-* +``` + +### List Azure repositories + +```bash +kingfisher scan azure --organization my-org --list-only +# list repositories for specific projects +kingfisher scan azure --project my-org/app --project my-org/api --list-only +# skip specific repositories while listing (supports glob patterns) +kingfisher scan azure --organization my-org --azure-exclude my-org/**/experimental-* --list-only +``` + +## Gitea + +### Scan Gitea organization (requires `KF_GITEA_TOKEN`) + +```bash +kingfisher scan gitea --organization my-org +# self-hosted example +KF_GITEA_TOKEN="gtoken" kingfisher scan gitea --organization platform --gitea-api-url https://gitea.internal.example/api/v1/ +``` + +### Scan Gitea user + +```bash +kingfisher scan gitea --user johndoe +``` + +### Skip specific Gitea repositories during enumeration + +Repeat `--gitea-exclude` for each repository you want to ignore when scanning users +or organizations. Accepts `owner/repo` identifiers or gitignore-style glob patterns +like `team/**/archive-*`. + +```bash +kingfisher scan gitea --organization my-org \ + --gitea-exclude my-org/legacy-repo \ + --gitea-exclude my-org/**/archive-* +``` + +### Scan remote Gitea repository by URL + +A Git URL target clones the repository and scans its history. Adding `--repo-artifacts` +also clones the repository wiki if one exists. Private repositories and wikis +require `KF_GITEA_TOKEN` (and `KF_GITEA_USERNAME` when cloning via HTTPS). + +```bash +# Scan the repository only +kingfisher scan https://gitea.com/org/repo.git + +# Include the repository wiki (if present) +KF_GITEA_TOKEN="gtoken" KF_GITEA_USERNAME="org" \ + kingfisher scan https://gitea.com/org/repo.git --repo-artifacts +``` + +### List Gitea repositories + +```bash +kingfisher scan gitea --organization my-org --list-only +# enumerate every organization visible to the authenticated user +KF_GITEA_TOKEN="gtoken" kingfisher scan gitea --all-gitea-organizations --list-only +# self-hosted example +KF_GITEA_TOKEN="gtoken" kingfisher scan gitea --user johndoe --gitea-api-url https://gitea.internal.example/api/v1/ --list-only +``` + +## Bitbucket + +### Scan Bitbucket workspace + +```bash +kingfisher scan bitbucket --workspace my-team +# include Bitbucket Cloud repositories from every accessible workspace +KF_BITBUCKET_TOKEN="$BITBUCKET_TOKEN" \ + kingfisher scan bitbucket --all-workspaces +``` + +### Scan Bitbucket user + +```bash +kingfisher scan bitbucket --user johndoe +``` + +### Skip specific Bitbucket repositories during enumeration + +Use `--bitbucket-exclude` to ignore repositories while scanning users, workspaces, +or projects. Patterns accept either `owner/repo` (case-insensitive) or +gitignore-style globs such as `workspace/**/archive-*`. + +```bash +kingfisher scan bitbucket --workspace my-team \ + --bitbucket-exclude my-team/legacy-repo \ + --bitbucket-exclude my-team/**/archive-* +``` + +### Scan remote Bitbucket repository by URL + +A Git URL target clones the repository and scans its files and history. To inspect +Bitbucket artifacts such as issues, add `--repo-artifacts`. Private artifacts +require credentials (see [Authenticate to Bitbucket](#authenticate-to-bitbucket)). + +```bash +# Scan the repository only +kingfisher scan https://bitbucket.org/hashashash/secretstest.git + +# Include repository issues +KF_BITBUCKET_TOKEN="$BITBUCKET_TOKEN" \ + kingfisher scan https://bitbucket.org/workspace/project.git --repo-artifacts +``` + +### List Bitbucket repositories + +```bash +kingfisher scan bitbucket --workspace my-team --list-only +# enumerate all accessible workspaces or projects +KF_BITBUCKET_TOKEN="$BITBUCKET_TOKEN" \ + kingfisher scan bitbucket --all-workspaces --list-only +# filter out repositories using glob patterns +kingfisher scan bitbucket --workspace my-team --bitbucket-exclude my-team/**/experimental-* --list-only +``` + +### Authenticate to Bitbucket + +Kingfisher supports Bitbucket Cloud and Bitbucket Server credentials: + +- **Workspace API token (Cloud)** – set `KF_BITBUCKET_TOKEN`. Kingfisher automatically uses the token for Bitbucket REST APIs and authenticates git operations as `x-token-auth`. +- **Bitbucket Server token** – set `KF_BITBUCKET_USERNAME` and either + `KF_BITBUCKET_TOKEN` or `KF_BITBUCKET_PASSWORD`. +- **Legacy app password (Cloud)** – set `KF_BITBUCKET_USERNAME` and + `KF_BITBUCKET_APP_PASSWORD`. +- **OAuth/PAT token** – set `KF_BITBUCKET_OAUTH_TOKEN`. + +These credentials match the options described in the [ghorg setup +guide](https://github.com/gabrie30/ghorg/blob/master/README.md#bitbucket-setup). + +Bitbucket no longer supports App Tokens as of September 9, 2025: +https://support.atlassian.com/bitbucket-cloud/docs/api-tokens/ + +> As of September 9, 2025, app passwords can no longer be created. Use API tokens with scopes instead. All existing app passwords will be disabled on June 9, 2026. Migrate any integrations before then to avoid disruptions. + +### Self-hosted Bitbucket Server + +Use `--bitbucket-api-url` to point Kingfisher at your server's REST endpoint, for example +`https://bitbucket.example.com/rest/api/1.0/`. Provide credentials with +`KF_BITBUCKET_USERNAME` plus either `KF_BITBUCKET_TOKEN` or `KF_BITBUCKET_PASSWORD`, +and pass `--ignore-certs` when connecting to HTTP or otherwise insecure instances. + +## Hugging Face + +Hugging Face hosts git repositories for models, datasets, and Spaces. Kingfisher can enumerate and scan all three resource types. + +### Scan Hugging Face user + +```bash +kingfisher scan huggingface --user +``` + +### Scan Hugging Face organization + +```bash +kingfisher scan huggingface --organization +``` + +### Scan specific Hugging Face resources + +Scan individual repositories by ID (owner/name) or by passing the full HTTPS URL: + +```bash +kingfisher scan huggingface --model +kingfisher scan huggingface --dataset https://huggingface.co/datasets// +kingfisher scan huggingface --space +``` + +Use `--huggingface-exclude` to omit results returned by user or organization enumeration. Prefix values with `model:`, `dataset:`, or `space:` when you only want to skip a specific resource type. + +### List Hugging Face repositories + +```bash +kingfisher scan huggingface --user --list-only +``` + +### Authenticate to Hugging Face + +Private repositories require an access token provided through the `KF_HUGGINGFACE_TOKEN` environment variable. For git authentication the helper also honours `KF_HUGGINGFACE_USERNAME` (default `hf_user`). + +## Jira + +### Scan Jira issues matching a JQL query + +```bash +KF_JIRA_TOKEN="token" kingfisher scan jira --url https://jira.company.com \ + --jql "project = TEST AND status = Open" \ + --max-results 500 +``` + +### Include Jira comments and changelog entries + +```bash +KF_JIRA_TOKEN="token" kingfisher scan jira --url https://jira.company.com \ + --jql "project = TEST AND status = Open" \ + --include-comments \ + --include-changelog +``` + +`--include-comments` writes and scans per-issue `comments.json` artifacts. +`--include-changelog` writes and scans per-issue `changelog.json` artifacts. + +### Scan the last 1,000 Jira issues + +```bash +KF_JIRA_TOKEN="token" kingfisher scan jira --url https://jira.mongodb.org \ + --jql 'ORDER BY created DESC' \ + --max-results 1000 +``` + +## Confluence + +### Scan Confluence pages matching a CQL query + +```bash +# Bearer token +KF_CONFLUENCE_TOKEN="token" kingfisher scan confluence --url https://confluence.company.com \ + --cql "label = secret" \ + --max-results 500 + +# Basic auth with username and token +KF_CONFLUENCE_USER="user@example.com" KF_CONFLUENCE_TOKEN="token" \ + kingfisher scan confluence --url https://confluence.company.com \ + --cql "text ~ 'password'" \ + --max-results 500 +``` + +Use the base URL of your Confluence site for `--confluence-url`. Kingfisher +automatically adds `/rest/api` to the end, so `https://example.com/wiki` and +`https://example.com` both work depending on your server configuration. + +Generate a personal access token and set it in the `KF_CONFLUENCE_TOKEN` environment variable. By default, Kingfisher sends the token as a bearer token in the `Authorization` header. + +To use basic authentication instead, also set `KF_CONFLUENCE_USER` to your Confluence email address; Kingfisher will then send the username and `KF_CONFLUENCE_TOKEN` as a Basic auth header. If the server responds with a redirect to a login page, the credentials are invalid or lack the required permissions. + +## Slack + +### Scan Slack messages matching a search query + +```bash +KF_SLACK_TOKEN="xoxp-1234..." kingfisher scan slack "from:username has:link" \ + --max-results 1000 + +KF_SLACK_TOKEN="xoxp-1234..." kingfisher scan slack "akia" \ + --max-results 1000 +``` + +*The Slack token must be a user token with the `search:read` scope. Bot tokens (those beginning with `xoxb-`) cannot call the Slack search API.* + +## Microsoft Teams + +### Scan Teams messages matching a search query + +```bash +KF_TEAMS_TOKEN="eyJ0..." kingfisher scan teams "password OR api_key" \ + --max-results 1000 + +KF_TEAMS_TOKEN="eyJ0..." kingfisher scan teams "akia" \ + --max-results 1000 +``` + +The token must be a Microsoft Graph API access token with `ChannelMessage.Read.All` (application) or `Chat.Read` (delegated) permissions. + +**Note:** Microsoft Graph does not support personal Microsoft accounts for Teams chat operations. Teams scanning requires a **Microsoft 365 work or school account**; free/personal Teams accounts are not supported by the Graph API. + +**Obtaining a token:** + +1. Register an application in Azure Active Directory (Microsoft Entra ID) +2. Grant `ChannelMessage.Read.All` (application) or `Chat.Read` (delegated) API permission +3. Obtain an access token using one of: + - Azure CLI: `az account get-access-token --resource https://graph.microsoft.com --query accessToken -o tsv` + - Client credentials flow for application permissions + - Authorization code flow for delegated permissions + +## Environment Variables + +| Variable | Purpose | +| ----------------- | ---------------------------- | +| `KF_GITHUB_TOKEN` | GitHub Personal Access Token | +| `KF_GITLAB_TOKEN` | GitLab Personal Access Token | +| `KF_GITEA_TOKEN` | Gitea Personal Access Token | +| `KF_GITEA_USERNAME` | Username for private Gitea clones (used with `KF_GITEA_TOKEN`) | +| `KF_AZURE_TOKEN` / `KF_AZURE_PAT` | Azure Repos Personal Access Token | +| `KF_AZURE_USERNAME` | Username to use with Azure Repos PATs (defaults to `pat` when unset) | +| `KF_BITBUCKET_TOKEN` | Bitbucket Cloud workspace API token or Bitbucket Server PAT | +| `KF_BITBUCKET_USERNAME` | Optional Bitbucket username for legacy app passwords or server tokens | +| `KF_BITBUCKET_APP_PASSWORD` | Legacy Bitbucket app password (deprecated September 9, 2025; disabled June 9, 2026) | +| `KF_BITBUCKET_OAUTH_TOKEN` | Bitbucket OAuth or PAT token | +| `KF_HUGGINGFACE_TOKEN` | Hugging Face access token for API enumeration and git cloning | +| `KF_HUGGINGFACE_USERNAME` | Optional username for Hugging Face git operations (defaults to `hf_user`) | +| `KF_JIRA_TOKEN` | Jira API token | +| `KF_CONFLUENCE_TOKEN` | Confluence API token | +| `KF_SLACK_TOKEN` | Slack API token | +| `KF_TEAMS_TOKEN` | Microsoft Graph API token for Teams message search | +| `KF_DOCKER_TOKEN` | Docker registry token (`user:pass` or bearer token). If unset, credentials from the Docker keychain are used | +| `KF_AWS_KEY`, `KF_AWS_SECRET`, and `KF_AWS_SESSION_TOKEN` | AWS credentials for S3 bucket scanning. Session token is optional, for temporary credentials | + +Set them temporarily per command: + +```bash +KF_GITLAB_TOKEN="glpat-…" kingfisher scan gitlab --group my-group +``` + +Or export for the session: + +```bash +export KF_GITLAB_TOKEN="glpat-…" +``` + +To authenticate Jira requests: +```bash +export KF_JIRA_TOKEN="token" +``` + +To authenticate Confluence requests: +```bash +export KF_CONFLUENCE_TOKEN="token" +``` + +*If no token is provided Kingfisher still works for public repositories.* diff --git a/docs-site/mkdocs.yml b/docs-site/mkdocs.yml new file mode 100644 index 0000000..2e24637 --- /dev/null +++ b/docs-site/mkdocs.yml @@ -0,0 +1,109 @@ +site_name: Kingfisher +site_url: https://mongodb.github.io/kingfisher +site_description: >- + Open source secret scanner with live validation. 734+ detection rules, + blast radius mapping, and credential revocation. Built in Rust by MongoDB. +site_author: MongoDB +repo_url: https://github.com/mongodb/kingfisher +repo_name: mongodb/kingfisher + +copyright: Copyright © 2024-2026 MongoDB, Inc. + +theme: + name: material + custom_dir: overrides + logo: assets/images/kingfisher_logo.png + favicon: assets/images/kingfisher_logo.png + palette: + - scheme: default + primary: teal + accent: teal + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - scheme: slate + primary: teal + accent: teal + toggle: + icon: material/brightness-4 + name: Switch to light mode + features: + - navigation.instant + - navigation.tracking + - navigation.tabs + - navigation.tabs.sticky + - navigation.sections + - navigation.top + - search.suggest + - search.highlight + - content.code.copy + - content.tabs.link + - toc.follow + icon: + repo: fontawesome/brands/github + +plugins: + - search + - minify: + minify_html: true + +markdown_extensions: + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + - pymdownx.tabbed: + alternate_style: true + - pymdownx.details + - pymdownx.snippets + - admonition + - attr_list + - md_in_html + - tables + - toc: + permalink: true + - def_list + - pymdownx.tasklist: + custom_checkbox: true + +nav: + - Home: index.md + - Getting Started: + - Installation: getting-started/installation.md + - Quick Start: getting-started/quick-start.md + - Usage: + - Basic Scanning: usage/basic-scanning.md + - Platform Integrations: usage/integrations.md + - Advanced Configuration: usage/advanced.md + - Baseline Management: usage/baseline.md + - Deployment: usage/deployment.md + - Features: + - Access Map (Blast Radius): features/access-map.md + - Secret Revocation: features/revocation.md + - Source Code Parsing: features/parsing.md + - Finding Fingerprints: features/fingerprints.md + - LLM & Agent Integration: features/agents.md + - Rules: + - Writing Custom Rules: rules/overview.md + - Built-in Rules List: rules/builtin-rules.md + - Reference: + - Architecture: reference/architecture.md + - Rust Library Crates: reference/library.md + - Python Bindings: reference/python-bindings.md + - Benchmarks & Comparison: reference/comparison.md + - Changelog: changelog.md + +extra: + social: + - icon: fontawesome/brands/github + link: https://github.com/mongodb/kingfisher + +extra_css: + - assets/stylesheets/extra.css + +extra_javascript: + - assets/javascripts/rules-filter.js diff --git a/docs-site/requirements.txt b/docs-site/requirements.txt new file mode 100644 index 0000000..67e1b48 --- /dev/null +++ b/docs-site/requirements.txt @@ -0,0 +1,5 @@ +mkdocs-material>=9.5 +mkdocs-minify-plugin>=0.8 +pillow>=10.0 +cairosvg>=2.7 +pyyaml>=6.0 diff --git a/docs-site/scripts/generate-rules-page.py b/docs-site/scripts/generate-rules-page.py new file mode 100644 index 0000000..3635d0b --- /dev/null +++ b/docs-site/scripts/generate-rules-page.py @@ -0,0 +1,134 @@ +#!/usr/bin/env python3 +""" +Reads all YAML rule definition files from crates/kingfisher-rules/data/rules/ +and generates a searchable markdown page listing all built-in rules. +""" + +import os +import yaml +from pathlib import Path + +REPO_ROOT = Path(__file__).resolve().parent.parent.parent +RULES_DIR = REPO_ROOT / "crates" / "kingfisher-rules" / "data" / "rules" +OUTPUT = REPO_ROOT / "docs-site" / "docs" / "rules" / "builtin-rules.md" + + +def load_rules(): + """Load all rules from YAML files.""" + all_rules = [] + + for yml_file in sorted(RULES_DIR.glob("*.yml")): + provider = yml_file.stem.replace("_", " ").replace("-", " ").title() + try: + with open(yml_file, "r", encoding="utf-8") as f: + data = yaml.safe_load(f) + except Exception as e: + print(f" WARNING: Failed to parse {yml_file.name}: {e}") + continue + + if not data: + continue + + # Rules can be a list at top level or under a 'rules' key + rules = data if isinstance(data, list) else data.get("rules", [data]) + + for rule in rules: + if not isinstance(rule, dict): + continue + # Skip invisible rules + if rule.get("visible") is False: + continue + + name = rule.get("name", "Unknown") + rule_id = rule.get("id", "") + confidence = rule.get("confidence", "unknown") + has_validation = "validation" in rule + has_revocation = "revocation" in rule + + all_rules.append({ + "provider": provider, + "name": name, + "id": rule_id, + "confidence": confidence, + "validates": has_validation, + "revokes": has_revocation, + }) + + return all_rules + + +def generate_markdown(rules): + """Generate the markdown page content.""" + total = len(rules) + validated = sum(1 for r in rules if r["validates"]) + revocable = sum(1 for r in rules if r["revokes"]) + providers = len(set(r["provider"] for r in rules)) + + lines = [ + '---', + 'title: "Built-in Rules List"', + 'description: "Complete list of all 734+ built-in secret detection rules in Kingfisher. Searchable and filterable by provider, confidence level, and validation support."', + '---', + '', + '# Built-in Rules', + '', + f'Kingfisher ships with **{total} detection rules** across **{providers} providers**.', + f'Of these, **{validated}** include live validation and **{revocable}** support direct revocation.', + '', + '!!! tip "Search"', + ' Use the search box below to filter rules by provider name, rule ID, or confidence level.', + '', + '', + '
', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + '', + ] + + for rule in sorted(rules, key=lambda r: (r["provider"].lower(), r["id"])): + validates = "Yes" if rule["validates"] else "" + revokes = "Yes" if rule["revokes"] else "" + confidence = rule["confidence"].capitalize() + lines.append(f'') + lines.append(f'') + lines.append(f'') + lines.append(f'') + lines.append(f'') + lines.append(f'') + lines.append(f'') + lines.append(f'') + + lines.extend([ + '', + '
ProviderRule NameRule IDConfidenceValidatesRevokes
{rule["provider"]}{rule["name"]}{rule["id"]}{confidence}{validates}{revokes}
', + ]) + + return "\n".join(lines) + "\n" + + +def main(): + print("Generating built-in rules page...") + rules = load_rules() + print(f" Found {len(rules)} rules") + + content = generate_markdown(rules) + + OUTPUT.parent.mkdir(parents=True, exist_ok=True) + with open(OUTPUT, "w", encoding="utf-8") as f: + f.write(content) + + print(f" Written to {OUTPUT.relative_to(REPO_ROOT)}") + + +if __name__ == "__main__": + main() diff --git a/docs-site/scripts/prepare-docs.py b/docs-site/scripts/prepare-docs.py new file mode 100644 index 0000000..15ab278 --- /dev/null +++ b/docs-site/scripts/prepare-docs.py @@ -0,0 +1,227 @@ +#!/usr/bin/env python3 +""" +Copies documentation from /docs/ into docs-site/docs/ with transformations: +- Removes breadcrumb links ([<- Back to README](../README.md)) +- Rewrites internal links for MkDocs site structure +- Adds SEO frontmatter (title + description) +""" + +import os +import re +import shutil + +REPO_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) +DOCS_SRC = os.path.join(REPO_ROOT, "docs") +DOCS_DST = os.path.join(REPO_ROOT, "docs-site", "docs") + +# Mapping: source filename -> (destination path, title, description) +DOC_MAP = { + "INSTALLATION.md": ( + "getting-started/installation.md", + "Installation", + "Install Kingfisher via Homebrew, PyPI, Docker, install scripts, or compile from source. Includes pre-commit hook setup.", + ), + "USAGE.md": ( + "usage/basic-scanning.md", + "Basic Scanning", + "Learn how to scan files, Git repos, and platforms for secrets with Kingfisher. Includes output formats, filtering, and validation options.", + ), + "INTEGRATIONS.md": ( + "usage/integrations.md", + "Platform Integrations", + "Scan GitHub, GitLab, Azure Repos, Bitbucket, Gitea, Hugging Face, Docker, S3, Jira, Confluence, Slack, and Teams for leaked secrets.", + ), + "ADVANCED.md": ( + "usage/advanced.md", + "Advanced Configuration", + "Advanced Kingfisher features: confidence levels, validation tuning, CI pipeline scanning, filtering, suppression, and profiling.", + ), + "BASELINE.md": ( + "usage/baseline.md", + "Baseline Management", + "Track known secrets with baselines to suppress known findings and detect only new credential leaks.", + ), + "DEPLOYMENT.md": ( + "usage/deployment.md", + "Deployment", + "Deployment strategies for Kingfisher: self-serve CLI, CI/pre-commit enforcement, centralized scanning, and embedded library.", + ), + "ACCESS_MAP.md": ( + "features/access-map.md", + "Access Map (Blast Radius)", + "Map the blast radius of leaked credentials. Authenticate against 39 providers to enumerate accessible resources and permissions.", + ), + "REVOCATION_PROVIDERS.md": ( + "features/revocation.md", + "Secret Revocation", + "Revoke compromised credentials directly from the CLI. Supports 20+ providers including GitHub, GitLab, Slack, AWS, and GCP.", + ), + "PARSING.md": ( + "features/parsing.md", + "Source Code Parsing", + "Language-aware secret detection using tree-sitter parsing for 13+ languages including Python, JavaScript, Go, Rust, and more.", + ), + "FINGERPRINT.md": ( + "features/fingerprints.md", + "Finding Fingerprints", + "Stable fingerprints for deduplication and tracking of discovered secrets across scans.", + ), + "RULES.md": ( + "rules/overview.md", + "Writing Custom Rules", + "Write custom YAML-based detection rules with regex patterns, entropy thresholds, validation, revocation, and checksum intelligence.", + ), + "ARCHITECTURE.md": ( + "reference/architecture.md", + "Architecture", + "High-level architecture of Kingfisher: CLI, scanner pipeline, rule engine, validation, access mapping, and output formats.", + ), + "LIBRARY.md": ( + "reference/library.md", + "Rust Library Crates", + "Embed Kingfisher's scanning engine in your own Rust applications using kingfisher-core, kingfisher-rules, and kingfisher-scanner crates.", + ), + "PYPI.md": ( + "reference/python-bindings.md", + "Python Bindings", + "Install and use Kingfisher from Python via PyPI wheels. Build and publish wheels for multiple platforms.", + ), + "COMPARISON.md": ( + "reference/comparison.md", + "Benchmarks & Comparison", + "Benchmark results comparing Kingfisher performance against TruffleHog, GitLeaks, and detect-secrets across major open source repositories.", + ), +} + +# Link rewriting rules: old link target -> new relative path +# These are approximate; the script handles common patterns +LINK_REWRITES = { + "INSTALLATION.md": "../getting-started/installation.md", + "USAGE.md": "../usage/basic-scanning.md", + "INTEGRATIONS.md": "../usage/integrations.md", + "ADVANCED.md": "../usage/advanced.md", + "BASELINE.md": "../usage/baseline.md", + "DEPLOYMENT.md": "../usage/deployment.md", + "ACCESS_MAP.md": "../features/access-map.md", + "REVOCATION_PROVIDERS.md": "../features/revocation.md", + "TOKEN_REVOCATION_SUPPORT.md": "../features/revocation.md", + "MULTI_STEP_REVOCATION.md": "../features/revocation.md", + "PARSING.md": "../features/parsing.md", + "TREE_SITTER.md": "../features/parsing.md", + "FINGERPRINT.md": "../features/fingerprints.md", + "RULES.md": "../rules/overview.md", + "ARCHITECTURE.md": "../reference/architecture.md", + "LIBRARY.md": "../reference/library.md", + "PYPI.md": "../reference/python-bindings.md", + "COMPARISON.md": "../reference/comparison.md", +} + + +def add_frontmatter(content: str, title: str, description: str) -> str: + """Add YAML frontmatter to the beginning of the content.""" + # Remove existing frontmatter if present + if content.startswith("---"): + end = content.find("---", 3) + if end != -1: + content = content[end + 3:].lstrip("\n") + + frontmatter = f"""--- +title: "{title}" +description: "{description}" +--- + +""" + return frontmatter + content + + +def remove_breadcrumbs(content: str) -> str: + """Remove [<- Back to README](../README.md) style links.""" + content = re.sub( + r"\[←?\s*Back to README\]\([^\)]+\)\s*\n?", "", content + ) + return content + + +def rewrite_links(content: str) -> str: + """Rewrite internal documentation links to match site structure.""" + for old, new in LINK_REWRITES.items(): + # Handle various link patterns: + # [text](FILENAME.md) or [text](./FILENAME.md) or [text](docs/FILENAME.md) + content = re.sub( + rf"\((?:\./|docs/)?{re.escape(old)}(#[^\)]+)?\)", + lambda m: f"({new}{m.group(1) if m.group(1) else ''})", + content, + ) + # Rewrite image references from docs/ relative paths (markdown and HTML src=) + content = content.replace("](./runtime-comparison.png", "](../assets/images/runtime-comparison.png") + content = content.replace('src="./runtime-comparison.png"', 'src="../assets/images/runtime-comparison.png"') + content = content.replace("](./assets/icons/", "](../assets/icons/") + return content + + +def fix_table_spacing(content: str) -> str: + """Ensure a blank line exists before markdown table headers. + + Markdown requires a blank line before a table when preceded by other + block-level content (like italic text). Without it, the table renders + as plain text. + """ + # Match a non-blank line followed immediately by a table header row + content = re.sub( + r"(\S[^\n]*)\n(\|[^\n]+\|\s*\n\|[-| :]+\|)", + r"\1\n\n\2", + content, + ) + return content + + +def process_file(src_path: str, dst_path: str, title: str, description: str): + """Read, transform, and write a single documentation file.""" + with open(src_path, "r", encoding="utf-8") as f: + content = f.read() + + content = remove_breadcrumbs(content) + content = rewrite_links(content) + content = fix_table_spacing(content) + content = add_frontmatter(content, title, description) + + os.makedirs(os.path.dirname(dst_path), exist_ok=True) + with open(dst_path, "w", encoding="utf-8") as f: + f.write(content) + + print(f" {os.path.basename(src_path)} -> {os.path.relpath(dst_path, DOCS_DST)}") + + +def copy_changelog(): + """Copy CHANGELOG.md to docs-site with frontmatter.""" + src = os.path.join(REPO_ROOT, "CHANGELOG.md") + dst = os.path.join(DOCS_DST, "changelog.md") + if os.path.exists(src): + with open(src, "r", encoding="utf-8") as f: + content = f.read() + content = add_frontmatter( + content, + "Changelog", + "Kingfisher release history: new features, rules, bug fixes, and improvements.", + ) + with open(dst, "w", encoding="utf-8") as f: + f.write(content) + print(f" CHANGELOG.md -> changelog.md") + + +def main(): + print("Preparing documentation...") + for src_name, (dst_rel, title, desc) in DOC_MAP.items(): + src_path = os.path.join(DOCS_SRC, src_name) + dst_path = os.path.join(DOCS_DST, dst_rel) + if os.path.exists(src_path): + process_file(src_path, dst_path, title, desc) + else: + print(f" WARNING: {src_name} not found, skipping") + + copy_changelog() + print("Done.") + + +if __name__ == "__main__": + main() diff --git a/docs-site/site/assets/icons/aws-s3.svg b/docs-site/site/assets/icons/aws-s3.svg new file mode 100644 index 0000000..3f63be5 --- /dev/null +++ b/docs-site/site/assets/icons/aws-s3.svg @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + diff --git a/docs-site/site/assets/icons/azure-devops.svg b/docs-site/site/assets/icons/azure-devops.svg new file mode 100644 index 0000000..d5db277 --- /dev/null +++ b/docs-site/site/assets/icons/azure-devops.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/docs-site/site/assets/icons/bitbucket.svg b/docs-site/site/assets/icons/bitbucket.svg new file mode 100644 index 0000000..38af1ce --- /dev/null +++ b/docs-site/site/assets/icons/bitbucket.svg @@ -0,0 +1,15 @@ + + + + + + + + Bitbucket-blue + + + + + + + \ No newline at end of file diff --git a/docs-site/site/assets/icons/confluence.svg b/docs-site/site/assets/icons/confluence.svg new file mode 100644 index 0000000..22249e1 --- /dev/null +++ b/docs-site/site/assets/icons/confluence.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/site/assets/icons/docker.svg b/docs-site/site/assets/icons/docker.svg new file mode 100644 index 0000000..0a9c6b0 --- /dev/null +++ b/docs-site/site/assets/icons/docker.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/site/assets/icons/files.svg b/docs-site/site/assets/icons/files.svg new file mode 100644 index 0000000..1ebd008 --- /dev/null +++ b/docs-site/site/assets/icons/files.svg @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs-site/site/assets/icons/gcs.svg b/docs-site/site/assets/icons/gcs.svg new file mode 100644 index 0000000..842c121 --- /dev/null +++ b/docs-site/site/assets/icons/gcs.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs-site/site/assets/icons/gitea.svg b/docs-site/site/assets/icons/gitea.svg new file mode 100644 index 0000000..7ed0012 --- /dev/null +++ b/docs-site/site/assets/icons/gitea.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/site/assets/icons/github.svg b/docs-site/site/assets/icons/github.svg new file mode 100644 index 0000000..a8d1174 --- /dev/null +++ b/docs-site/site/assets/icons/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs-site/site/assets/icons/gitlab.svg b/docs-site/site/assets/icons/gitlab.svg new file mode 100644 index 0000000..abe3f37 --- /dev/null +++ b/docs-site/site/assets/icons/gitlab.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/site/assets/icons/huggingface.svg b/docs-site/site/assets/icons/huggingface.svg new file mode 100644 index 0000000..43711df --- /dev/null +++ b/docs-site/site/assets/icons/huggingface.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + diff --git a/docs-site/site/assets/icons/jira.svg b/docs-site/site/assets/icons/jira.svg new file mode 100644 index 0000000..57a68f0 --- /dev/null +++ b/docs-site/site/assets/icons/jira.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/site/assets/icons/local-git.svg b/docs-site/site/assets/icons/local-git.svg new file mode 100644 index 0000000..994fb2c --- /dev/null +++ b/docs-site/site/assets/icons/local-git.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs-site/site/assets/icons/slack.svg b/docs-site/site/assets/icons/slack.svg new file mode 100644 index 0000000..fb55f72 --- /dev/null +++ b/docs-site/site/assets/icons/slack.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs-site/site/assets/icons/teams.svg b/docs-site/site/assets/icons/teams.svg new file mode 100644 index 0000000..46bf8ed --- /dev/null +++ b/docs-site/site/assets/icons/teams.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/docs-site/site/assets/images/favicon.png b/docs-site/site/assets/images/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..1cf13b9f9d978896599290a74f77d5dbe7d1655c GIT binary patch literal 1870 zcmV-U2eJ5xP)Gc)JR9QMau)O=X#!i9;T z37kk-upj^(fsR36MHs_+1RCI)NNu9}lD0S{B^g8PN?Ww(5|~L#Ng*g{WsqleV}|#l zz8@ri&cTzw_h33bHI+12+kK6WN$h#n5cD8OQt`5kw6p~9H3()bUQ8OS4Q4HTQ=1Ol z_JAocz`fLbT2^{`8n~UAo=#AUOf=SOq4pYkt;XbC&f#7lb$*7=$na!mWCQ`dBQsO0 zLFBSPj*N?#u5&pf2t4XjEGH|=pPQ8xh7tpx;US5Cx_Ju;!O`ya-yF`)b%TEt5>eP1ZX~}sjjA%FJF?h7cX8=b!DZl<6%Cv z*G0uvvU+vmnpLZ2paivG-(cd*y3$hCIcsZcYOGh{$&)A6*XX&kXZd3G8m)G$Zz-LV z^GF3VAW^Mdv!)4OM8EgqRiz~*Cji;uzl2uC9^=8I84vNp;ltJ|q-*uQwGp2ma6cY7 z;`%`!9UXO@fr&Ebapfs34OmS9^u6$)bJxrucutf>`dKPKT%%*d3XlFVKunp9 zasduxjrjs>f8V=D|J=XNZp;_Zy^WgQ$9WDjgY=z@stwiEBm9u5*|34&1Na8BMjjgf3+SHcr`5~>oz1Y?SW^=K z^bTyO6>Gar#P_W2gEMwq)ot3; zREHn~U&Dp0l6YT0&k-wLwYjb?5zGK`W6S2v+K>AM(95m2C20L|3m~rN8dprPr@t)5lsk9Hu*W z?pS990s;Ez=+Rj{x7p``4>+c0G5^pYnB1^!TL=(?HLHZ+HicG{~4F1d^5Awl_2!1jICM-!9eoLhbbT^;yHcefyTAaqRcY zmuctDopPT!%k+}x%lZRKnzykr2}}XfG_ne?nRQO~?%hkzo;@RN{P6o`&mMUWBYMTe z6i8ChtjX&gXl`nvrU>jah)2iNM%JdjqoaeaU%yVn!^70x-flljp6Q5tK}5}&X8&&G zX3fpb3E(!rH=zVI_9Gjl45w@{(ITqngWFe7@9{mX;tO25Z_8 zQHEpI+FkTU#4xu>RkN>b3Tnc3UpWzPXWm#o55GKF09j^Mh~)K7{QqbO_~(@CVq! zS<8954|P8mXN2MRs86xZ&Q4EfM@JB94b=(YGuk)s&^jiSF=t3*oNK3`rD{H`yQ?d; ztE=laAUoZx5?RC8*WKOj`%LXEkgDd>&^Q4M^z`%u0rg-It=hLCVsq!Z%^6eB-OvOT zFZ28TN&cRmgU}Elrnk43)!>Z1FCPL2K$7}gwzIc48NX}#!A1BpJP?#v5wkNprhV** z?Cpalt1oH&{r!o3eSKc&ap)iz2BTn_VV`4>9M^b3;(YY}4>#ML6{~(4mH+?%07*qo IM6N<$f(jP3KmY&$ literal 0 HcmV?d00001 diff --git a/docs-site/site/assets/images/kingfisher_logo.png b/docs-site/site/assets/images/kingfisher_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e045fccbf9da9e4bb2ddf132e5096db9b8b5f79a GIT binary patch literal 220572 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 literal 0 HcmV?d00001 diff --git a/docs-site/site/assets/javascripts/bundle.79ae519e.min.js b/docs-site/site/assets/javascripts/bundle.79ae519e.min.js new file mode 100644 index 0000000..3df3e5e --- /dev/null +++ b/docs-site/site/assets/javascripts/bundle.79ae519e.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Zi=Object.create;var _r=Object.defineProperty;var ea=Object.getOwnPropertyDescriptor;var ta=Object.getOwnPropertyNames,Bt=Object.getOwnPropertySymbols,ra=Object.getPrototypeOf,Ar=Object.prototype.hasOwnProperty,bo=Object.prototype.propertyIsEnumerable;var ho=(e,t,r)=>t in e?_r(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,P=(e,t)=>{for(var r in t||(t={}))Ar.call(t,r)&&ho(e,r,t[r]);if(Bt)for(var r of Bt(t))bo.call(t,r)&&ho(e,r,t[r]);return e};var vo=(e,t)=>{var r={};for(var o in e)Ar.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Bt)for(var o of Bt(e))t.indexOf(o)<0&&bo.call(e,o)&&(r[o]=e[o]);return r};var Cr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var oa=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of ta(t))!Ar.call(e,n)&&n!==r&&_r(e,n,{get:()=>t[n],enumerable:!(o=ea(t,n))||o.enumerable});return e};var $t=(e,t,r)=>(r=e!=null?Zi(ra(e)):{},oa(t||!e||!e.__esModule?_r(r,"default",{value:e,enumerable:!0}):r,e));var go=(e,t,r)=>new Promise((o,n)=>{var i=c=>{try{a(r.next(c))}catch(p){n(p)}},s=c=>{try{a(r.throw(c))}catch(p){n(p)}},a=c=>c.done?o(c.value):Promise.resolve(c.value).then(i,s);a((r=r.apply(e,t)).next())});var xo=Cr((kr,yo)=>{(function(e,t){typeof kr=="object"&&typeof yo!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(kr,(function(){"use strict";function e(r){var o=!0,n=!1,i=null,s={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function a(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function c(k){var ut=k.type,je=k.tagName;return!!(je==="INPUT"&&s[ut]&&!k.readOnly||je==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function p(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(a(r.activeElement)&&p(r.activeElement),o=!0)}function u(k){o=!1}function d(k){a(k.target)&&(o||c(k.target))&&p(k.target)}function v(k){a(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function S(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",ee),document.addEventListener("mousedown",ee),document.addEventListener("mouseup",ee),document.addEventListener("pointermove",ee),document.addEventListener("pointerdown",ee),document.addEventListener("pointerup",ee),document.addEventListener("touchmove",ee),document.addEventListener("touchstart",ee),document.addEventListener("touchend",ee)}function re(){document.removeEventListener("mousemove",ee),document.removeEventListener("mousedown",ee),document.removeEventListener("mouseup",ee),document.removeEventListener("pointermove",ee),document.removeEventListener("pointerdown",ee),document.removeEventListener("pointerup",ee),document.removeEventListener("touchmove",ee),document.removeEventListener("touchstart",ee),document.removeEventListener("touchend",ee)}function ee(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,re())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",S,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",v,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)}))});var ro=Cr((jy,Rn)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var qa=/["'&<>]/;Rn.exports=Ka;function Ka(e){var t=""+e,r=qa.exec(t);if(!r)return t;var o,n="",i=0,s=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof Nt=="object"&&typeof io=="object"?io.exports=r():typeof define=="function"&&define.amd?define([],r):typeof Nt=="object"?Nt.ClipboardJS=r():t.ClipboardJS=r()})(Nt,function(){return(function(){var e={686:(function(o,n,i){"use strict";i.d(n,{default:function(){return Xi}});var s=i(279),a=i.n(s),c=i(370),p=i.n(c),l=i(817),f=i.n(l);function u(q){try{return document.execCommand(q)}catch(C){return!1}}var d=function(C){var _=f()(C);return u("cut"),_},v=d;function S(q){var C=document.documentElement.getAttribute("dir")==="rtl",_=document.createElement("textarea");_.style.fontSize="12pt",_.style.border="0",_.style.padding="0",_.style.margin="0",_.style.position="absolute",_.style[C?"right":"left"]="-9999px";var D=window.pageYOffset||document.documentElement.scrollTop;return _.style.top="".concat(D,"px"),_.setAttribute("readonly",""),_.value=q,_}var X=function(C,_){var D=S(C);_.container.appendChild(D);var N=f()(D);return u("copy"),D.remove(),N},re=function(C){var _=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},D="";return typeof C=="string"?D=X(C,_):C instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(C==null?void 0:C.type)?D=X(C.value,_):(D=f()(C),u("copy")),D},ee=re;function k(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(_){return typeof _}:k=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},k(q)}var ut=function(){var C=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},_=C.action,D=_===void 0?"copy":_,N=C.container,G=C.target,We=C.text;if(D!=="copy"&&D!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(G!==void 0)if(G&&k(G)==="object"&&G.nodeType===1){if(D==="copy"&&G.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(D==="cut"&&(G.hasAttribute("readonly")||G.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if(We)return ee(We,{container:N});if(G)return D==="cut"?v(G):ee(G,{container:N})},je=ut;function R(q){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?R=function(_){return typeof _}:R=function(_){return _&&typeof Symbol=="function"&&_.constructor===Symbol&&_!==Symbol.prototype?"symbol":typeof _},R(q)}function se(q,C){if(!(q instanceof C))throw new TypeError("Cannot call a class as a function")}function ce(q,C){for(var _=0;_0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof N.action=="function"?N.action:this.defaultAction,this.target=typeof N.target=="function"?N.target:this.defaultTarget,this.text=typeof N.text=="function"?N.text:this.defaultText,this.container=R(N.container)==="object"?N.container:document.body}},{key:"listenClick",value:function(N){var G=this;this.listener=p()(N,"click",function(We){return G.onClick(We)})}},{key:"onClick",value:function(N){var G=N.delegateTarget||N.currentTarget,We=this.action(G)||"copy",Yt=je({action:We,container:this.container,target:this.target(G),text:this.text(G)});this.emit(Yt?"success":"error",{action:We,text:Yt,trigger:G,clearSelection:function(){G&&G.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(N){return Mr("action",N)}},{key:"defaultTarget",value:function(N){var G=Mr("target",N);if(G)return document.querySelector(G)}},{key:"defaultText",value:function(N){return Mr("text",N)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(N){var G=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return ee(N,G)}},{key:"cut",value:function(N){return v(N)}},{key:"isSupported",value:function(){var N=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],G=typeof N=="string"?[N]:N,We=!!document.queryCommandSupported;return G.forEach(function(Yt){We=We&&!!document.queryCommandSupported(Yt)}),We}}]),_})(a()),Xi=Ji}),828:(function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function s(a,c){for(;a&&a.nodeType!==n;){if(typeof a.matches=="function"&&a.matches(c))return a;a=a.parentNode}}o.exports=s}),438:(function(o,n,i){var s=i(828);function a(l,f,u,d,v){var S=p.apply(this,arguments);return l.addEventListener(u,S,v),{destroy:function(){l.removeEventListener(u,S,v)}}}function c(l,f,u,d,v){return typeof l.addEventListener=="function"?a.apply(null,arguments):typeof u=="function"?a.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(S){return a(S,f,u,d,v)}))}function p(l,f,u,d){return function(v){v.delegateTarget=s(v.target,f),v.delegateTarget&&d.call(l,v)}}o.exports=c}),879:(function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var s=Object.prototype.toString.call(i);return i!==void 0&&(s==="[object NodeList]"||s==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var s=Object.prototype.toString.call(i);return s==="[object Function]"}}),370:(function(o,n,i){var s=i(879),a=i(438);function c(u,d,v){if(!u&&!d&&!v)throw new Error("Missing required arguments");if(!s.string(d))throw new TypeError("Second argument must be a String");if(!s.fn(v))throw new TypeError("Third argument must be a Function");if(s.node(u))return p(u,d,v);if(s.nodeList(u))return l(u,d,v);if(s.string(u))return f(u,d,v);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function p(u,d,v){return u.addEventListener(d,v),{destroy:function(){u.removeEventListener(d,v)}}}function l(u,d,v){return Array.prototype.forEach.call(u,function(S){S.addEventListener(d,v)}),{destroy:function(){Array.prototype.forEach.call(u,function(S){S.removeEventListener(d,v)})}}}function f(u,d,v){return a(document.body,u,d,v)}o.exports=c}),817:(function(o){function n(i){var s;if(i.nodeName==="SELECT")i.focus(),s=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var a=i.hasAttribute("readonly");a||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),a||i.removeAttribute("readonly"),s=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var c=window.getSelection(),p=document.createRange();p.selectNodeContents(i),c.removeAllRanges(),c.addRange(p),s=c.toString()}return s}o.exports=n}),279:(function(o){function n(){}n.prototype={on:function(i,s,a){var c=this.e||(this.e={});return(c[i]||(c[i]=[])).push({fn:s,ctx:a}),this},once:function(i,s,a){var c=this;function p(){c.off(i,p),s.apply(a,arguments)}return p._=s,this.on(i,p,a)},emit:function(i){var s=[].slice.call(arguments,1),a=((this.e||(this.e={}))[i]||[]).slice(),c=0,p=a.length;for(c;c0&&i[i.length-1])&&(p[0]===6||p[0]===2)){r=0;continue}if(p[0]===3&&(!i||p[1]>i[0]&&p[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function K(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],s;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(a){s={error:a}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(s)throw s.error}}return i}function B(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||c(d,S)})},v&&(n[d]=v(n[d])))}function c(d,v){try{p(o[d](v))}catch(S){u(i[0][3],S)}}function p(d){d.value instanceof dt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){c("next",d)}function f(d){c("throw",d)}function u(d,v){d(v),i.shift(),i.length&&c(i[0][0],i[0][1])}}function To(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof Oe=="function"?Oe(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(s){return new Promise(function(a,c){s=e[i](s),n(a,c,s.done,s.value)})}}function n(i,s,a,c){Promise.resolve(c).then(function(p){i({value:p,done:a})},s)}}function I(e){return typeof e=="function"}function yt(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var Jt=yt(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Ze(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var qe=(function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var s=this._parentage;if(s)if(this._parentage=null,Array.isArray(s))try{for(var a=Oe(s),c=a.next();!c.done;c=a.next()){var p=c.value;p.remove(this)}}catch(S){t={error:S}}finally{try{c&&!c.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}else s.remove(this);var l=this.initialTeardown;if(I(l))try{l()}catch(S){i=S instanceof Jt?S.errors:[S]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=Oe(f),d=u.next();!d.done;d=u.next()){var v=d.value;try{So(v)}catch(S){i=i!=null?i:[],S instanceof Jt?i=B(B([],K(i)),K(S.errors)):i.push(S)}}}catch(S){o={error:S}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new Jt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)So(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Ze(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Ze(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=(function(){var t=new e;return t.closed=!0,t})(),e})();var $r=qe.EMPTY;function Xt(e){return e instanceof qe||e&&"closed"in e&&I(e.remove)&&I(e.add)&&I(e.unsubscribe)}function So(e){I(e)?e():e.unsubscribe()}var De={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var xt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,s=n.isStopped,a=n.observers;return i||s?$r:(this.currentObservers=null,a.push(r),new qe(function(){o.currentObservers=null,Ze(a,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,s=o.isStopped;n?r.error(i):s&&r.complete()},t.prototype.asObservable=function(){var r=new F;return r.source=this,r},t.create=function(r,o){return new Ho(r,o)},t})(F);var Ho=(function(e){ie(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:$r},t})(T);var jr=(function(e){ie(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t})(T);var Rt={now:function(){return(Rt.delegate||Date).now()},delegate:void 0};var It=(function(e){ie(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=Rt);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,s=o._infiniteTimeWindow,a=o._timestampProvider,c=o._windowTime;n||(i.push(r),!s&&i.push(a.now()+c)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,s=n._buffer,a=s.slice(),c=0;c0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t})(St);var Ro=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t})(Ot);var Dr=new Ro(Po);var Io=(function(e){ie(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=Tt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var s=r.actions;o!=null&&o===r._scheduled&&((i=s[s.length-1])===null||i===void 0?void 0:i.id)!==o&&(Tt.cancelAnimationFrame(o),r._scheduled=void 0)},t})(St);var Fo=(function(e){ie(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o;r?o=r.id:(o=this._scheduled,this._scheduled=void 0);var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t})(Ot);var ye=new Fo(Io);var y=new F(function(e){return e.complete()});function tr(e){return e&&I(e.schedule)}function Vr(e){return e[e.length-1]}function pt(e){return I(Vr(e))?e.pop():void 0}function Fe(e){return tr(Vr(e))?e.pop():void 0}function rr(e,t){return typeof Vr(e)=="number"?e.pop():t}var Lt=(function(e){return e&&typeof e.length=="number"&&typeof e!="function"});function or(e){return I(e==null?void 0:e.then)}function nr(e){return I(e[wt])}function ir(e){return Symbol.asyncIterator&&I(e==null?void 0:e[Symbol.asyncIterator])}function ar(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function fa(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var sr=fa();function cr(e){return I(e==null?void 0:e[sr])}function pr(e){return wo(this,arguments,function(){var r,o,n,i;return Gt(this,function(s){switch(s.label){case 0:r=e.getReader(),s.label=1;case 1:s.trys.push([1,,9,10]),s.label=2;case 2:return[4,dt(r.read())];case 3:return o=s.sent(),n=o.value,i=o.done,i?[4,dt(void 0)]:[3,5];case 4:return[2,s.sent()];case 5:return[4,dt(n)];case 6:return[4,s.sent()];case 7:return s.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function lr(e){return I(e==null?void 0:e.getReader)}function U(e){if(e instanceof F)return e;if(e!=null){if(nr(e))return ua(e);if(Lt(e))return da(e);if(or(e))return ha(e);if(ir(e))return jo(e);if(cr(e))return ba(e);if(lr(e))return va(e)}throw ar(e)}function ua(e){return new F(function(t){var r=e[wt]();if(I(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function da(e){return new F(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?g(function(n,i){return e(n,i,o)}):be,Ee(1),r?Qe(t):tn(function(){return new fr}))}}function Yr(e){return e<=0?function(){return y}:E(function(t,r){var o=[];t.subscribe(w(r,function(n){o.push(n),e=2,!0))}function le(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new T}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,s=i===void 0?!0:i,a=e.resetOnRefCountZero,c=a===void 0?!0:a;return function(p){var l,f,u,d=0,v=!1,S=!1,X=function(){f==null||f.unsubscribe(),f=void 0},re=function(){X(),l=u=void 0,v=S=!1},ee=function(){var k=l;re(),k==null||k.unsubscribe()};return E(function(k,ut){d++,!S&&!v&&X();var je=u=u!=null?u:r();ut.add(function(){d--,d===0&&!S&&!v&&(f=Br(ee,c))}),je.subscribe(ut),!l&&d>0&&(l=new bt({next:function(R){return je.next(R)},error:function(R){S=!0,X(),f=Br(re,n,R),je.error(R)},complete:function(){v=!0,X(),f=Br(re,s),je.complete()}}),U(k).subscribe(l))})(p)}}function Br(e,t){for(var r=[],o=2;oe.next(document)),e}function M(e,t=document){return Array.from(t.querySelectorAll(e))}function j(e,t=document){let r=ue(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function ue(e,t=document){return t.querySelector(e)||void 0}function Ne(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var Ra=L(h(document.body,"focusin"),h(document.body,"focusout")).pipe(Ae(1),Q(void 0),m(()=>Ne()||document.body),Z(1));function Ye(e){return Ra.pipe(m(t=>e.contains(t)),Y())}function it(e,t){return H(()=>L(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?jt(r=>He(+!r*t)):be,Q(e.matches(":hover"))))}function sn(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)sn(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)sn(o,n);return o}function br(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function _t(e){let t=x("script",{src:e});return H(()=>(document.head.appendChild(t),L(h(t,"load"),h(t,"error").pipe(b(()=>Nr(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),A(()=>document.head.removeChild(t)),Ee(1))))}var cn=new T,Ia=H(()=>typeof ResizeObserver=="undefined"?_t("https://unpkg.com/resize-observer-polyfill"):$(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>cn.next(t)))),b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function de(e){return{width:e.offsetWidth,height:e.offsetHeight}}function Le(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ia.pipe(O(r=>r.observe(t)),b(r=>cn.pipe(g(o=>o.target===t),A(()=>r.unobserve(t)))),m(()=>de(e)),Q(de(e)))}function At(e){return{width:e.scrollWidth,height:e.scrollHeight}}function vr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function pn(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Be(e){return{x:e.offsetLeft,y:e.offsetTop}}function ln(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function mn(e){return L(h(window,"load"),h(window,"resize")).pipe($e(0,ye),m(()=>Be(e)),Q(Be(e)))}function gr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ge(e){return L(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe($e(0,ye),m(()=>gr(e)),Q(gr(e)))}var fn=new T,Fa=H(()=>$(new IntersectionObserver(e=>{for(let t of e)fn.next(t)},{threshold:0}))).pipe(b(e=>L(tt,$(e)).pipe(A(()=>e.disconnect()))),Z(1));function mt(e){return Fa.pipe(O(t=>t.observe(e)),b(t=>fn.pipe(g(({target:r})=>r===e),A(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function un(e,t=16){return Ge(e).pipe(m(({y:r})=>{let o=de(e),n=At(e);return r>=n.height-o.height-t}),Y())}var yr={drawer:j("[data-md-toggle=drawer]"),search:j("[data-md-toggle=search]")};function dn(e){return yr[e].checked}function at(e,t){yr[e].checked!==t&&yr[e].click()}function Je(e){let t=yr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function ja(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Ua(){return L(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function hn(){let e=h(window,"keydown").pipe(g(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:dn("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),g(({mode:t,type:r})=>{if(t==="global"){let o=Ne();if(typeof o!="undefined")return!ja(o,r)}return!0}),le());return Ua().pipe(b(t=>t?y:e))}function we(){return new URL(location.href)}function st(e,t=!1){if(V("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function bn(){return new T}function vn(){return location.hash.slice(1)}function gn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Zr(e){return L(h(window,"hashchange"),e).pipe(m(vn),Q(vn()),g(t=>t.length>0),Z(1))}function yn(e){return Zr(e).pipe(m(t=>ue(`[id="${t}"]`)),g(t=>typeof t!="undefined"))}function Wt(e){let t=matchMedia(e);return ur(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function xn(){let e=matchMedia("print");return L(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function eo(e,t){return e.pipe(b(r=>r?t():y))}function to(e,t){return new F(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let s=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+s*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function ze(e,t){return to(e,t).pipe(b(r=>r.text()),m(r=>JSON.parse(r)),Z(1))}function xr(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),Z(1))}function En(e,t){let r=new DOMParser;return to(e,t).pipe(b(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),Z(1))}function wn(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function Tn(){return L(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(wn),Q(wn()))}function Sn(){return{width:innerWidth,height:innerHeight}}function On(){return h(window,"resize",{passive:!0}).pipe(m(Sn),Q(Sn()))}function Ln(){return z([Tn(),On()]).pipe(m(([e,t])=>({offset:e,size:t})),Z(1))}function Er(e,{viewport$:t,header$:r}){let o=t.pipe(ne("size")),n=z([o,r]).pipe(m(()=>Be(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:s,size:a},{x:c,y:p}])=>({offset:{x:s.x-c,y:s.y-p+i},size:a})))}function Wa(e){return h(e,"message",t=>t.data)}function Da(e){let t=new T;return t.subscribe(r=>e.postMessage(r)),t}function Mn(e,t=new Worker(e)){let r=Wa(t),o=Da(t),n=new T;n.subscribe(o);let i=o.pipe(oe(),ae(!0));return n.pipe(oe(),Ve(r.pipe(W(i))),le())}var Va=j("#__config"),Ct=JSON.parse(Va.textContent);Ct.base=`${new URL(Ct.base,we())}`;function Te(){return Ct}function V(e){return Ct.features.includes(e)}function Me(e,t){return typeof t!="undefined"?Ct.translations[e].replace("#",t.toString()):Ct.translations[e]}function Ce(e,t=document){return j(`[data-md-component=${e}]`,t)}function me(e,t=document){return M(`[data-md-component=${e}]`,t)}function Na(e){let t=j(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>j(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function _n(e){if(!V("announce.dismiss")||!e.childElementCount)return y;if(!e.hidden){let t=j(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return H(()=>{let t=new T;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Na(e).pipe(O(r=>t.next(r)),A(()=>t.complete()),m(r=>P({ref:e},r)))})}function za(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function An(e,t){let r=new T;return r.subscribe(({hidden:o})=>{e.hidden=o}),za(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))}function Dt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function wr(...e){return x("div",{class:"md-tooltip2",role:"dialog"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function Cn(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function kn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Dt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Hn(e){return x("button",{class:"md-code__button",title:Me("clipboard.copy"),"data-clipboard-target":`#${e} > code`,"data-md-type":"copy"})}function $n(){return x("button",{class:"md-code__button",title:"Toggle line selection","data-md-type":"select"})}function Pn(){return x("nav",{class:"md-code__nav"})}var In=$t(ro());function oo(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(c=>!e.terms[c]).reduce((c,p)=>[...c,x("del",null,(0,In.default)(p))," "],[]).slice(0,-1),i=Te(),s=new URL(e.location,i.base);V("search.highlight")&&s.searchParams.set("h",Object.entries(e.terms).filter(([,c])=>c).reduce((c,[p])=>`${c} ${p}`.trim(),""));let{tags:a}=Te();return x("a",{href:`${s}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&x("nav",{class:"md-tags"},e.tags.map(c=>{let p=a?c in a?`md-tag-icon md-tag--${a[c]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${p}`},c)})),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Me("search.result.term.missing"),": ",...n)))}function Fn(e){let t=e[0].score,r=[...e],o=Te(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),s=r.findIndex(l=>l.scoreoo(l,1)),...c.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,c.length>0&&c.length===1?Me("search.result.more.one"):Me("search.result.more.other",c.length))),...c.map(l=>oo(l,1)))]:[]];return x("li",{class:"md-search-result__item"},p)}function jn(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?br(r):r)))}function no(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function Un(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function Qa(e){var o;let t=Te(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function Wn(e,t){var o;let r=Te();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Me("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map(Qa)))}var Ya=0;function Ba(e,t=250){let r=z([Ye(e),it(e,t)]).pipe(m(([n,i])=>n||i),Y()),o=H(()=>pn(e)).pipe(J(Ge),gt(1),Pe(r),m(()=>ln(e)));return r.pipe(Re(n=>n),b(()=>z([r,o])),m(([n,i])=>({active:n,offset:i})),le())}function Vt(e,t,r=250){let{content$:o,viewport$:n}=t,i=`__tooltip2_${Ya++}`;return H(()=>{let s=new T,a=new jr(!1);s.pipe(oe(),ae(!1)).subscribe(a);let c=a.pipe(jt(l=>He(+!l*250,Dr)),Y(),b(l=>l?o:y),O(l=>l.id=i),le());z([s.pipe(m(({active:l})=>l)),c.pipe(b(l=>it(l,250)),Q(!1))]).pipe(m(l=>l.some(f=>f))).subscribe(a);let p=a.pipe(g(l=>l),te(c,n),m(([l,f,{size:u}])=>{let d=e.getBoundingClientRect(),v=d.width/2;if(f.role==="tooltip")return{x:v,y:8+d.height};if(d.y>=u.height/2){let{height:S}=de(f);return{x:v,y:-16-S}}else return{x:v,y:16+d.height}}));return z([c,s,p]).subscribe(([l,{offset:f},u])=>{l.style.setProperty("--md-tooltip-host-x",`${f.x}px`),l.style.setProperty("--md-tooltip-host-y",`${f.y}px`),l.style.setProperty("--md-tooltip-x",`${u.x}px`),l.style.setProperty("--md-tooltip-y",`${u.y}px`),l.classList.toggle("md-tooltip2--top",u.y<0),l.classList.toggle("md-tooltip2--bottom",u.y>=0)}),a.pipe(g(l=>l),te(c,(l,f)=>f),g(l=>l.role==="tooltip")).subscribe(l=>{let f=de(j(":scope > *",l));l.style.setProperty("--md-tooltip-width",`${f.width}px`),l.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(Y(),xe(ye),te(c)).subscribe(([l,f])=>{f.classList.toggle("md-tooltip2--active",l)}),z([a.pipe(g(l=>l)),c]).subscribe(([l,f])=>{f.role==="dialog"?(e.setAttribute("aria-controls",i),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",i)}),a.pipe(g(l=>!l)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ba(e,r).pipe(O(l=>s.next(l)),A(()=>s.complete()),m(l=>P({ref:e},l)))})}function Xe(e,{viewport$:t},r=document.body){return Vt(e,{content$:new F(o=>{let n=e.title,i=Cn(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t},0)}function Ga(e,t){let r=H(()=>z([mn(e),Ge(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:s,height:a}=de(e);return{x:o-i.x+s/2,y:n-i.y+a/2}}));return Ye(e).pipe(b(o=>r.pipe(m(n=>({active:o,offset:n})),Ee(+!o||1/0))))}function Dn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return H(()=>{let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({offset:a}){e.style.setProperty("--md-tooltip-x",`${a.x}px`),e.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),mt(e).pipe(W(s)).subscribe(a=>{e.toggleAttribute("data-md-visible",a)}),L(i.pipe(g(({active:a})=>a)),i.pipe(Ae(250),g(({active:a})=>!a))).subscribe({next({active:a}){a?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe($e(16,ye)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?e.style.setProperty("--md-tooltip-0",`${-a}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(W(s),g(a=>!(a.metaKey||a.ctrlKey))).subscribe(a=>{a.stopPropagation(),a.preventDefault()}),h(n,"mousedown").pipe(W(s),te(i)).subscribe(([a,{active:c}])=>{var p;if(a.button!==0||a.metaKey||a.ctrlKey)a.preventDefault();else if(c){a.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(p=Ne())==null||p.blur()}}),r.pipe(W(s),g(a=>a===o),nt(125)).subscribe(()=>e.focus()),Ga(e,t).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function Ja(e){let t=Te();if(e.tagName!=="CODE")return[e];let r=[".c",".c1",".cm"];if(t.annotate&&typeof t.annotate=="object"){let o=e.closest("[class|=language]");if(o)for(let n of Array.from(o.classList)){if(!n.startsWith("language-"))continue;let[,i]=n.split("-");i in t.annotate&&r.push(...t.annotate[i])}}return M(r.join(", "),e)}function Xa(e){let t=[];for(let r of Ja(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let s;for(;s=/(\(\d+\))(!)?/.exec(i.textContent);){let[,a,c]=s;if(typeof c=="undefined"){let p=i.splitText(s.index);i=p.splitText(a.length),t.push(p)}else{i.textContent=a,t.push(i);break}}}}return t}function Vn(e,t){t.append(...Array.from(e.childNodes))}function Tr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,s=new Map;for(let a of Xa(t)){let[,c]=a.textContent.match(/\((\d+)\)/);ue(`:scope > li:nth-child(${c})`,e)&&(s.set(c,kn(c,i)),a.replaceWith(s.get(c)))}return s.size===0?y:H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=[];for(let[l,f]of s)p.push([j(".md-typeset",f),j(`:scope > li:nth-child(${l})`,e)]);return o.pipe(W(c)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of p)l?Vn(f,u):Vn(u,f)}),L(...[...s].map(([,l])=>Dn(l,t,{target$:r}))).pipe(A(()=>a.complete()),le())})}function Nn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Nn(t)}}function zn(e,t){return H(()=>{let r=Nn(e);return typeof r!="undefined"?Tr(r,e,t):y})}var Kn=$t(ao());var Za=0,qn=L(h(window,"keydown").pipe(m(()=>!0)),L(h(window,"keyup"),h(window,"contextmenu")).pipe(m(()=>!1))).pipe(Q(!1),Z(1));function Qn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Qn(t)}}function es(e){return Le(e).pipe(m(({width:t})=>({scrollable:At(e).width>t})),ne("scrollable"))}function Yn(e,t){let{matches:r}=matchMedia("(hover)"),o=H(()=>{let n=new T,i=n.pipe(Yr(1));n.subscribe(({scrollable:d})=>{d&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let s=[],a=e.closest("pre"),c=a.closest("[id]"),p=c?c.id:Za++;a.id=`__code_${p}`;let l=[],f=e.closest(".highlight");if(f instanceof HTMLElement){let d=Qn(f);if(typeof d!="undefined"&&(f.classList.contains("annotate")||V("content.code.annotate"))){let v=Tr(d,e,t);l.push(Le(f).pipe(W(i),m(({width:S,height:X})=>S&&X),Y(),b(S=>S?v:y)))}}let u=M(":scope > span[id]",e);if(u.length&&(e.classList.add("md-code__content"),e.closest(".select")||V("content.code.select")&&!e.closest(".no-select"))){let d=+u[0].id.split("-").pop(),v=$n();s.push(v),V("content.tooltips")&&l.push(Xe(v,{viewport$}));let S=h(v,"click").pipe(Ut(R=>!R,!1),O(()=>v.blur()),le());S.subscribe(R=>{v.classList.toggle("md-code__button--active",R)});let X=fe(u).pipe(J(R=>it(R).pipe(m(se=>[R,se]))));S.pipe(b(R=>R?X:y)).subscribe(([R,se])=>{let ce=ue(".hll.select",R);if(ce&&!se)ce.replaceWith(...Array.from(ce.childNodes));else if(!ce&&se){let he=document.createElement("span");he.className="hll select",he.append(...Array.from(R.childNodes).slice(1)),R.append(he)}});let re=fe(u).pipe(J(R=>h(R,"mousedown").pipe(O(se=>se.preventDefault()),m(()=>R)))),ee=S.pipe(b(R=>R?re:y),te(qn),m(([R,se])=>{var he;let ce=u.indexOf(R)+d;if(se===!1)return[ce,ce];{let Se=M(".hll",e).map(Ue=>u.indexOf(Ue.parentElement)+d);return(he=window.getSelection())==null||he.removeAllRanges(),[Math.min(ce,...Se),Math.max(ce,...Se)]}})),k=Zr(y).pipe(g(R=>R.startsWith(`__codelineno-${p}-`)));k.subscribe(R=>{let[,,se]=R.split("-"),ce=se.split(":").map(Se=>+Se-d+1);ce.length===1&&ce.push(ce[0]);for(let Se of M(".hll:not(.select)",e))Se.replaceWith(...Array.from(Se.childNodes));let he=u.slice(ce[0]-1,ce[1]);for(let Se of he){let Ue=document.createElement("span");Ue.className="hll",Ue.append(...Array.from(Se.childNodes).slice(1)),Se.append(Ue)}}),k.pipe(Ee(1),xe(pe)).subscribe(R=>{if(R.includes(":")){let se=document.getElementById(R.split(":")[0]);se&&setTimeout(()=>{let ce=se,he=-64;for(;ce!==document.body;)he+=ce.offsetTop,ce=ce.offsetParent;window.scrollTo({top:he})},1)}});let je=fe(M('a[href^="#__codelineno"]',f)).pipe(J(R=>h(R,"click").pipe(O(se=>se.preventDefault()),m(()=>R)))).pipe(W(i),te(qn),m(([R,se])=>{let he=+j(`[id="${R.hash.slice(1)}"]`).parentElement.id.split("-").pop();if(se===!1)return[he,he];{let Se=M(".hll",e).map(Ue=>+Ue.parentElement.id.split("-").pop());return[Math.min(he,...Se),Math.max(he,...Se)]}}));L(ee,je).subscribe(R=>{let se=`#__codelineno-${p}-`;R[0]===R[1]?se+=R[0]:se+=`${R[0]}:${R[1]}`,history.replaceState({},"",se),window.dispatchEvent(new HashChangeEvent("hashchange",{newURL:window.location.origin+window.location.pathname+se,oldURL:window.location.href}))})}if(Kn.default.isSupported()&&(e.closest(".copy")||V("content.code.copy")&&!e.closest(".no-copy"))){let d=Hn(a.id);s.push(d),V("content.tooltips")&&l.push(Xe(d,{viewport$}))}if(s.length){let d=Pn();d.append(...s),a.insertBefore(d,e)}return es(e).pipe(O(d=>n.next(d)),A(()=>n.complete()),m(d=>P({ref:e},d)),Ve(L(...l).pipe(W(i))))});return V("content.lazy")?mt(e).pipe(g(n=>n),Ee(1),b(()=>o)):o}function ts(e,{target$:t,print$:r}){let o=!0;return L(t.pipe(m(n=>n.closest("details:not([open])")),g(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(g(n=>n||!o),O(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function Bn(e,t){return H(()=>{let r=new T;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),ts(e,t).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}var Gn=0;function rs(e){let t=document.createElement("h3");t.innerHTML=e.innerHTML;let r=[t],o=e.nextElementSibling;for(;o&&!(o instanceof HTMLHeadingElement);)r.push(o),o=o.nextElementSibling;return r}function os(e,t){for(let r of M("[href], [src]",e))for(let o of["href","src"]){let n=r.getAttribute(o);if(n&&!/^(?:[a-z]+:)?\/\//i.test(n)){r[o]=new URL(r.getAttribute(o),t).toString();break}}for(let r of M("[name^=__], [for]",e))for(let o of["id","for","name"]){let n=r.getAttribute(o);n&&r.setAttribute(o,`${n}$preview_${Gn}`)}return Gn++,$(e)}function Jn(e,t){let{sitemap$:r}=t;if(!(e instanceof HTMLAnchorElement))return y;if(!(V("navigation.instant.preview")||e.hasAttribute("data-preview")))return y;e.removeAttribute("title");let o=z([Ye(e),it(e)]).pipe(m(([i,s])=>i||s),Y(),g(i=>i));return rt([r,o]).pipe(b(([i])=>{let s=new URL(e.href);return s.search=s.hash="",i.has(`${s}`)?$(s):y}),b(i=>xr(i).pipe(b(s=>os(s,i)))),b(i=>{let s=e.hash?`article [id="${e.hash.slice(1)}"]`:"article h1",a=ue(s,i);return typeof a=="undefined"?y:$(rs(a))})).pipe(b(i=>{let s=new F(a=>{let c=wr(...i);return a.next(c),document.body.append(c),()=>c.remove()});return Vt(e,P({content$:s},t))}))}var Xn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.flowchartTitleText{fill:var(--md-mermaid-label-fg-color)}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color)}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}.classDiagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs marker.marker.composition.class path,defs marker.marker.dependency.class path,defs marker.marker.extension.class path{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs marker.marker.aggregation.class path{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}.statediagramTitleText{fill:var(--md-mermaid-label-fg-color)}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}[id^=entity] path,[id^=entity] rect{fill:var(--md-default-bg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs .marker.oneOrMore.er *,defs .marker.onlyOne.er *,defs .marker.zeroOrMore.er *,defs .marker.zeroOrOne.er *{stroke:var(--md-mermaid-edge-color)!important}text:not([class]):last-child{fill:var(--md-mermaid-label-fg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var so,is=0;function as(){return typeof mermaid=="undefined"||mermaid instanceof Element?_t("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):$(void 0)}function Zn(e){return e.classList.remove("mermaid"),so||(so=as().pipe(O(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Xn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),Z(1))),so.subscribe(()=>go(null,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${is++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),s=r.attachShadow({mode:"closed"});s.innerHTML=n,e.replaceWith(r),i==null||i(s)})),so.pipe(m(()=>({ref:e})))}var ei=x("table");function ti(e){return e.replaceWith(ei),ei.replaceWith(Un(e)),$({ref:e})}function ss(e){let t=e.find(r=>r.checked)||e[0];return L(...e.map(r=>h(r,"change").pipe(m(()=>j(`label[for="${r.id}"]`))))).pipe(Q(j(`label[for="${t.id}"]`)),m(r=>({active:r})))}function ri(e,{viewport$:t,target$:r}){let o=j(".tabbed-labels",e),n=M(":scope > input",e),i=no("prev");e.append(i);let s=no("next");return e.append(s),H(()=>{let a=new T,c=a.pipe(oe(),ae(!0));z([a,Le(e),mt(e)]).pipe(W(c),$e(1,ye)).subscribe({next([{active:p},l]){let f=Be(p),{width:u}=de(p);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=gr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ge(o),Le(o)]).pipe(W(c)).subscribe(([p,l])=>{let f=At(o);i.hidden=p.x<16,s.hidden=p.x>f.width-l.width-16}),L(h(i,"click").pipe(m(()=>-1)),h(s,"click").pipe(m(()=>1))).pipe(W(c)).subscribe(p=>{let{width:l}=de(o);o.scrollBy({left:l*p,behavior:"smooth"})}),r.pipe(W(c),g(p=>n.includes(p))).subscribe(p=>p.click()),o.classList.add("tabbed-labels--linked");for(let p of n){let l=j(`label[for="${p.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(W(c),g(f=>!(f.metaKey||f.ctrlKey)),O(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return V("content.tabs.link")&&a.pipe(Ie(1),te(t)).subscribe(([{active:p},{offset:l}])=>{let f=p.innerText.trim();if(p.hasAttribute("data-md-switching"))p.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let v of M("[data-tabs]"))for(let S of M(":scope > input",v)){let X=j(`label[for="${S.id}"]`);if(X!==p&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),S.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),a.pipe(W(c)).subscribe(()=>{for(let p of M("audio, video",e))p.offsetWidth&&p.autoplay?p.play().catch(()=>{}):p.pause()}),ss(n).pipe(O(p=>a.next(p)),A(()=>a.complete()),m(p=>P({ref:e},p)))}).pipe(et(pe))}function oi(e,t){let{viewport$:r,target$:o,print$:n}=t;return L(...M(".annotate:not(.highlight)",e).map(i=>zn(i,{target$:o,print$:n})),...M("pre:not(.mermaid) > code",e).map(i=>Yn(i,{target$:o,print$:n})),...M("a",e).map(i=>Jn(i,t)),...M("pre.mermaid",e).map(i=>Zn(i)),...M("table:not([class])",e).map(i=>ti(i)),...M("details",e).map(i=>Bn(i,{target$:o,print$:n})),...M("[data-tabs]",e).map(i=>ri(i,{viewport$:r,target$:o})),...M("[title]:not([data-preview])",e).filter(()=>V("content.tooltips")).map(i=>Xe(i,{viewport$:r})),...M(".footnote-ref",e).filter(()=>V("content.footnote.tooltips")).map(i=>Vt(i,{content$:new F(s=>{let a=new URL(i.href).hash.slice(1),c=Array.from(document.getElementById(a).cloneNode(!0).children),p=wr(...c);return s.next(p),document.body.append(p),()=>p.remove()}),viewport$:r})))}function cs(e,{alert$:t}){return t.pipe(b(r=>L($(!0),$(!1).pipe(nt(2e3))).pipe(m(o=>({message:r,active:o})))))}function ni(e,t){let r=j(".md-typeset",e);return H(()=>{let o=new T;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),cs(e,t).pipe(O(n=>o.next(n)),A(()=>o.complete()),m(n=>P({ref:e},n)))})}var ps=0;function ls(e,t){document.body.append(e);let{width:r}=de(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=vr(t),n=typeof o!="undefined"?Ge(o):$({x:0,y:0}),i=L(Ye(t),it(t)).pipe(Y());return z([i,n]).pipe(m(([s,a])=>{let{x:c,y:p}=Be(t),l=de(t),f=t.closest("table");return f&&t.parentElement&&(c+=f.offsetLeft+t.parentElement.offsetLeft,p+=f.offsetTop+t.parentElement.offsetTop),{active:s,offset:{x:c-a.x+l.width/2-r/2,y:p-a.y+l.height+8}}}))}function ii(e){let t=e.title;if(!t.length)return y;let r=`__tooltip_${ps++}`,o=Dt(r,"inline"),n=j(".md-typeset",o);return n.innerHTML=t,H(()=>{let i=new T;return i.subscribe({next({offset:s}){o.style.setProperty("--md-tooltip-x",`${s.x}px`),o.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),L(i.pipe(g(({active:s})=>s)),i.pipe(Ae(250),g(({active:s})=>!s))).subscribe({next({active:s}){s?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe($e(16,ye)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(gt(125,ye),g(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?o.style.setProperty("--md-tooltip-0",`${-s}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),ls(o,e).pipe(O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))}).pipe(et(pe))}function ms({viewport$:e}){if(!V("header.autohide"))return $(!1);let t=e.pipe(m(({offset:{y:n}})=>n),ot(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),Y()),o=Je("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),Y(),b(n=>n?r:$(!1)),Q(!1))}function ai(e,t){return H(()=>z([Le(e),ms(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),Y((r,o)=>r.height===o.height&&r.hidden===o.hidden),Z(1))}function si(e,{header$:t,main$:r}){return H(()=>{let o=new T,n=o.pipe(oe(),ae(!0));o.pipe(ne("active"),Pe(t)).subscribe(([{active:s},{hidden:a}])=>{e.classList.toggle("md-header--shadow",s&&!a),e.hidden=a});let i=fe(M("[title]",e)).pipe(g(()=>V("content.tooltips")),J(s=>ii(s)));return r.subscribe(o),t.pipe(W(n),m(s=>P({ref:e},s)),Ve(i.pipe(W(n))))})}function fs(e,{viewport$:t,header$:r}){return Er(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=de(e);return{active:n>0&&o>=n}}),ne("active"))}function ci(e,t){return H(()=>{let r=new T;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=ue(".md-content h1");return typeof o=="undefined"?y:fs(o,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))})}function pi(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),Y()),n=o.pipe(b(()=>Le(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ne("bottom"))));return z([o,n,t]).pipe(m(([i,{top:s,bottom:a},{offset:{y:c},size:{height:p}}])=>(p=Math.max(0,p-Math.max(0,s-c,i)-Math.max(0,p+c-a)),{offset:s-i,height:p,active:s-i<=c})),Y((i,s)=>i.offset===s.offset&&i.height===s.height&&i.active===s.active))}function us(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return $(...e).pipe(J(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),Z(1))}function li(e){let t=M("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Wt("(prefers-color-scheme: light)");return H(()=>{let i=new T;return i.subscribe(s=>{if(document.body.setAttribute("data-md-color-switching",""),s.color.media==="(prefers-color-scheme)"){let a=matchMedia("(prefers-color-scheme: light)"),c=document.querySelector(a.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");s.color.scheme=c.getAttribute("data-md-color-scheme"),s.color.primary=c.getAttribute("data-md-color-primary"),s.color.accent=c.getAttribute("data-md-color-accent")}for(let[a,c]of Object.entries(s.color))document.body.setAttribute(`data-md-color-${a}`,c);for(let a=0;as.key==="Enter"),te(i,(s,a)=>a)).subscribe(({index:s})=>{s=(s+1)%t.length,t[s].click(),t[s].focus()}),i.pipe(m(()=>{let s=Ce("header"),a=window.getComputedStyle(s);return o.content=a.colorScheme,a.backgroundColor.match(/\d+/g).map(c=>(+c).toString(16).padStart(2,"0")).join("")})).subscribe(s=>r.content=`#${s}`),i.pipe(xe(pe)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),us(t).pipe(W(n.pipe(Ie(1))),vt(),O(s=>i.next(s)),A(()=>i.complete()),m(s=>P({ref:e},s)))})}function mi(e,{progress$:t}){return H(()=>{let r=new T;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(O(o=>r.next({value:o})),A(()=>r.complete()),m(o=>({ref:e,value:o})))})}function fi(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function ds(e,t){let r=new Map;for(let o of M("url",e)){let n=j("loc",o),i=[fi(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let s of M("[rel=alternate]",o)){let a=s.getAttribute("href");a!=null&&i.push(fi(new URL(a),t))}}return r}function kt(e){return En(new URL("sitemap.xml",e)).pipe(m(t=>ds(t,new URL(e))),ve(()=>$(new Map)),le())}function ui({document$:e}){let t=new Map;e.pipe(b(()=>M("link[rel=alternate]")),m(r=>new URL(r.href)),g(r=>!t.has(r.toString())),J(r=>kt(r).pipe(m(o=>[r,o]),ve(()=>y)))).subscribe(([r,o])=>{t.set(r.toString().replace(/\/$/,""),o)}),h(document.body,"click").pipe(g(r=>!r.metaKey&&!r.ctrlKey),b(r=>{if(r.target instanceof Element){let o=r.target.closest("a");if(o&&!o.target){let n=[...t].find(([f])=>o.href.startsWith(`${f}/`));if(typeof n=="undefined")return y;let[i,s]=n,a=we();if(a.href.startsWith(i))return y;let c=Te(),p=a.href.replace(c.base,"");p=`${i}/${p}`;let l=s.has(p.split("#")[0])?new URL(p,c.base):new URL(i);return r.preventDefault(),$(l)}}return y})).subscribe(r=>st(r,!0))}var co=$t(ao());function hs(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function di({alert$:e}){co.default.isSupported()&&new F(t=>{new co.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||hs(j(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(O(t=>{t.trigger.focus()}),m(()=>Me("clipboard.copied"))).subscribe(e)}function hi(e,t){if(!(e.target instanceof Element))return y;let r=e.target.closest("a");if(r===null)return y;if(r.target||e.metaKey||e.ctrlKey)return y;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),$(r)):y}function bi(e){let t=new Map;for(let r of M(":scope > *",e.head))t.set(r.outerHTML,r);return t}function vi(e){for(let t of M("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return $(e)}function bs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...V("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=ue(o),i=ue(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=bi(document);for(let[o,n]of bi(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Ce("container");return Ke(M("script",r)).pipe(b(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new F(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),y}),oe(),ae(document))}function gi({sitemap$:e,location$:t,viewport$:r,progress$:o}){if(location.protocol==="file:")return y;$(document).subscribe(vi);let n=h(document.body,"click").pipe(Pe(e),b(([a,c])=>hi(a,c)),m(({href:a})=>new URL(a)),le()),i=h(window,"popstate").pipe(m(we),le());n.pipe(te(r)).subscribe(([a,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",a)}),L(n,i).subscribe(t);let s=t.pipe(ne("pathname"),b(a=>xr(a,{progress$:o}).pipe(ve(()=>(st(a,!0),y)))),b(vi),b(bs),le());return L(s.pipe(te(t,(a,c)=>c)),s.pipe(b(()=>t),ne("hash")),t.pipe(Y((a,c)=>a.pathname===c.pathname&&a.hash===c.hash),b(()=>n),O(()=>history.back()))).subscribe(a=>{var c,p;history.state!==null||!a.hash?window.scrollTo(0,(p=(c=history.state)==null?void 0:c.y)!=null?p:0):(history.scrollRestoration="auto",gn(a.hash),history.scrollRestoration="manual")}),t.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),r.pipe(ne("offset"),Ae(100)).subscribe(({offset:a})=>{history.replaceState(a,"")}),V("navigation.instant.prefetch")&&L(h(document.body,"mousemove"),h(document.body,"focusin")).pipe(Pe(e),b(([a,c])=>hi(a,c)),Ae(25),Qr(({href:a})=>a),hr(a=>{let c=document.createElement("link");return c.rel="prefetch",c.href=a.toString(),document.head.appendChild(c),h(c,"load").pipe(m(()=>c),Ee(1))})).subscribe(a=>a.remove()),s}var yi=$t(ro());function xi(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,s)=>`${i}${s}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").replace(/&/g,"&").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return s=>(0,yi.default)(s).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function zt(e){return e.type===1}function Sr(e){return e.type===3}function Ei(e,t){let r=Mn(e);return L($(location.protocol!=="file:"),Je("search")).pipe(Re(o=>o),b(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:V("search.suggest")}}})),r}function wi(e){var l;let{selectedVersionSitemap:t,selectedVersionBaseURL:r,currentLocation:o,currentBaseURL:n}=e,i=(l=po(n))==null?void 0:l.pathname;if(i===void 0)return;let s=ys(o.pathname,i);if(s===void 0)return;let a=Es(t.keys());if(!t.has(a))return;let c=po(s,a);if(!c||!t.has(c.href))return;let p=po(s,r);if(p)return p.hash=o.hash,p.search=o.search,p}function po(e,t){try{return new URL(e,t)}catch(r){return}}function ys(e,t){if(e.startsWith(t))return e.slice(t.length)}function xs(e,t){let r=Math.min(e.length,t.length),o;for(o=0;oy)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:s,aliases:a})=>s===i||a.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),b(n=>h(document.body,"click").pipe(g(i=>!i.metaKey&&!i.ctrlKey),te(o),b(([i,s])=>{if(i.target instanceof Element){let a=i.target.closest("a");if(a&&!a.target&&n.has(a.href)){let c=a.href;return!i.target.closest(".md-version")&&n.get(c)===s?y:(i.preventDefault(),$(new URL(c)))}}return y}),b(i=>kt(i).pipe(m(s=>{var a;return(a=wi({selectedVersionSitemap:s,selectedVersionBaseURL:i,currentLocation:we(),currentBaseURL:t.base}))!=null?a:i})))))).subscribe(n=>st(n,!0)),z([r,o]).subscribe(([n,i])=>{j(".md-header__topic").appendChild(Wn(n,i))}),e.pipe(b(()=>o)).subscribe(n=>{var a;let i=new URL(t.base),s=__md_get("__outdated",sessionStorage,i);if(s===null){s=!0;let c=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(c)||(c=[c]);e:for(let p of c)for(let l of n.aliases.concat(n.version))if(new RegExp(p,"i").test(l)){s=!1;break e}__md_set("__outdated",s,sessionStorage,i)}if(s)for(let c of me("outdated"))c.hidden=!1})}function ws(e,{worker$:t}){let{searchParams:r}=we();r.has("q")&&(at("search",!0),e.value=r.get("q"),e.focus(),Je("search").pipe(Re(i=>!i)).subscribe(()=>{let i=we();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=Ye(e),n=L(t.pipe(Re(zt)),h(e,"keyup"),o).pipe(m(()=>e.value),Y());return z([n,o]).pipe(m(([i,s])=>({value:i,focus:s})),Z(1))}function Si(e,{worker$:t}){let r=new T,o=r.pipe(oe(),ae(!0));z([t.pipe(Re(zt)),r],(i,s)=>s).pipe(ne("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ne("focus")).subscribe(({focus:i})=>{i&&at("search",i)}),h(e.form,"reset").pipe(W(o)).subscribe(()=>e.focus());let n=j("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),ws(e,{worker$:t}).pipe(O(i=>r.next(i)),A(()=>r.complete()),m(i=>P({ref:e},i)),Z(1))}function Oi(e,{worker$:t,query$:r}){let o=new T,n=un(e.parentElement).pipe(g(Boolean)),i=e.parentElement,s=j(":scope > :first-child",e),a=j(":scope > :last-child",e);Je("search").subscribe(l=>{a.setAttribute("role",l?"list":"presentation"),a.hidden=!l}),o.pipe(te(r),Gr(t.pipe(Re(zt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:s.textContent=f.length?Me("search.result.none"):Me("search.result.placeholder");break;case 1:s.textContent=Me("search.result.one");break;default:let u=br(l.length);s.textContent=Me("search.result.other",u)}});let c=o.pipe(O(()=>a.innerHTML=""),b(({items:l})=>L($(...l.slice(0,10)),$(...l.slice(10)).pipe(ot(4),Xr(n),b(([f])=>f)))),m(Fn),le());return c.subscribe(l=>a.appendChild(l)),c.pipe(J(l=>{let f=ue("details",l);return typeof f=="undefined"?y:h(f,"toggle").pipe(W(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(g(Sr),m(({data:l})=>l)).pipe(O(l=>o.next(l)),A(()=>o.complete()),m(l=>P({ref:e},l)))}function Ts(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=we();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function Li(e,t){let r=new T,o=r.pipe(oe(),ae(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(W(o)).subscribe(n=>n.preventDefault()),Ts(e,t).pipe(O(n=>r.next(n)),A(()=>r.complete()),m(n=>P({ref:e},n)))}function Mi(e,{worker$:t,keyboard$:r}){let o=new T,n=Ce("search-query"),i=L(h(n,"keydown"),h(n,"focus")).pipe(xe(pe),m(()=>n.value),Y());return o.pipe(Pe(i),m(([{suggest:a},c])=>{let p=c.split(/([\s-]+)/);if(a!=null&&a.length&&p[p.length-1]){let l=a[a.length-1];l.startsWith(p[p.length-1])&&(p[p.length-1]=l)}else p.length=0;return p})).subscribe(a=>e.innerHTML=a.join("").replace(/\s/g," ")),r.pipe(g(({mode:a})=>a==="search")).subscribe(a=>{a.type==="ArrowRight"&&e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText)}),t.pipe(g(Sr),m(({data:a})=>a)).pipe(O(a=>o.next(a)),A(()=>o.complete()),m(()=>({ref:e})))}function _i(e,{index$:t,keyboard$:r}){let o=Te();try{let n=Ei(o.search,t),i=Ce("search-query",e),s=Ce("search-result",e);h(e,"click").pipe(g(({target:c})=>c instanceof Element&&!!c.closest("a"))).subscribe(()=>at("search",!1)),r.pipe(g(({mode:c})=>c==="search")).subscribe(c=>{let p=Ne();switch(c.type){case"Enter":if(p===i){let l=new Map;for(let f of M(":first-child [href]",s)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}c.claim()}break;case"Escape":case"Tab":at("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof p=="undefined")i.focus();else{let l=[i,...M(":not(details) > [href], summary, details[open] [href]",s)],f=Math.max(0,(Math.max(0,l.indexOf(p))+l.length+(c.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}c.claim();break;default:i!==Ne()&&i.focus()}}),r.pipe(g(({mode:c})=>c==="global")).subscribe(c=>{switch(c.type){case"f":case"s":case"/":i.focus(),i.select(),c.claim();break}});let a=Si(i,{worker$:n});return L(a,Oi(s,{worker$:n,query$:a})).pipe(Ve(...me("search-share",e).map(c=>Li(c,{query$:a})),...me("search-suggest",e).map(c=>Mi(c,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,tt}}function Ai(e,{index$:t,location$:r}){return z([t,r.pipe(Q(we()),g(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>xi(o.config)(n.searchParams.get("h"))),m(o=>{var s;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let a=i.nextNode();a;a=i.nextNode())if((s=a.parentElement)!=null&&s.offsetHeight){let c=a.textContent,p=o(c);p.length>c.length&&n.set(a,p)}for(let[a,c]of n){let{childNodes:p}=x("span",null,c);a.replaceWith(...Array.from(p))}return{ref:e,nodes:n}}))}function Ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:s},{offset:{y:a}}])=>(s=s+Math.min(n,Math.max(0,a-i))-n,{height:s,locked:a>=i+n})),Y((i,s)=>i.height===s.height&&i.locked===s.locked))}function lo(e,o){var n=o,{header$:t}=n,r=vo(n,["header$"]);let i=j(".md-sidebar__scrollwrap",e),{y:s}=Be(i);return H(()=>{let a=new T,c=a.pipe(oe(),ae(!0)),p=a.pipe($e(0,ye));return p.pipe(te(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*s}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),p.pipe(Re()).subscribe(()=>{for(let l of M(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2})}}}),fe(M("label[tabindex]",e)).pipe(J(l=>h(l,"click").pipe(xe(pe),m(()=>l),W(c)))).subscribe(l=>{let f=j(`[id="${l.htmlFor}"]`);j(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),V("content.tooltips")&&fe(M("abbr[title]",e)).pipe(J(l=>Xe(l,{viewport$})),W(c)).subscribe(),Ss(e,r).pipe(O(l=>a.next(l)),A(()=>a.complete()),m(l=>P({ref:e},l)))})}function Ci(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return rt(ze(`${r}/releases/latest`).pipe(ve(()=>y),m(o=>({version:o.tag_name})),Qe({})),ze(r).pipe(ve(()=>y),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return ze(r).pipe(m(o=>({repositories:o.public_repos})),Qe({}))}}function ki(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return rt(ze(`${r}/releases/permalink/latest`).pipe(ve(()=>y),m(({tag_name:o})=>({version:o})),Qe({})),ze(r).pipe(ve(()=>y),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),Qe({}))).pipe(m(([o,n])=>P(P({},o),n)))}function Hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return Ci(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return ki(r,o)}return y}var Os;function Ls(e){return Os||(Os=H(()=>{let t=__md_get("__source",sessionStorage);if(t)return $(t);if(me("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return y}return Hi(e.href).pipe(O(o=>__md_set("__source",o,sessionStorage)))}).pipe(ve(()=>y),g(t=>Object.keys(t).length>0),m(t=>({facts:t})),Z(1)))}function $i(e){let t=j(":scope > :last-child",e);return H(()=>{let r=new T;return r.subscribe(({facts:o})=>{t.appendChild(jn(o)),t.classList.add("md-source__repository--active")}),Ls(e).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function Ms(e,{viewport$:t,header$:r}){return Le(document.body).pipe(b(()=>Er(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ne("hidden"))}function Pi(e,t){return H(()=>{let r=new T;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(V("navigation.tabs.sticky")?$({hidden:!1}):Ms(e,t)).pipe(O(o=>r.next(o)),A(()=>r.complete()),m(o=>P({ref:e},o)))})}function _s(e,{viewport$:t,header$:r}){let o=new Map,n=M(".md-nav__link",e);for(let a of n){let c=decodeURIComponent(a.hash.substring(1)),p=ue(`[id="${c}"]`);typeof p!="undefined"&&o.set(a,p)}let i=r.pipe(ne("height"),m(({height:a})=>{let c=Ce("main"),p=j(":scope > :first-child",c);return a+.8*(p.offsetTop-c.offsetTop)}),le());return Le(document.body).pipe(ne("height"),b(a=>H(()=>{let c=[];return $([...o].reduce((p,[l,f])=>{for(;c.length&&o.get(c[c.length-1]).tagName>=f.tagName;)c.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return p.set([...c=[...c,l]].reverse(),u)},new Map))}).pipe(m(c=>new Map([...c].sort(([,p],[,l])=>p-l))),Pe(i),b(([c,p])=>t.pipe(Ut(([l,f],{offset:{y:u},size:d})=>{let v=u+d.height>=Math.floor(a.height);for(;f.length;){let[,S]=f[0];if(S-p=u&&!v)f=[l.pop(),...f];else break}return[l,f]},[[],[...c]]),Y((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([a,c])=>({prev:a.map(([p])=>p),next:c.map(([p])=>p)})),Q({prev:[],next:[]}),ot(2,1),m(([a,c])=>a.prev.length{let i=new T,s=i.pipe(oe(),ae(!0));if(i.subscribe(({prev:a,next:c})=>{for(let[p]of c)p.classList.remove("md-nav__link--passed"),p.classList.remove("md-nav__link--active");for(let[p,[l]]of a.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",p===a.length-1)}),V("toc.follow")){let a=L(t.pipe(Ae(1),m(()=>{})),t.pipe(Ae(250),m(()=>"smooth")));i.pipe(g(({prev:c})=>c.length>0),Pe(o.pipe(xe(pe))),te(a)).subscribe(([[{prev:c}],p])=>{let[l]=c[c.length-1];if(l.offsetHeight){let f=vr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=de(f);f.scrollTo({top:u-d/2,behavior:p})}}})}return V("navigation.tracking")&&t.pipe(W(s),ne("offset"),Ae(250),Ie(1),W(n.pipe(Ie(1))),vt({delay:250}),te(i)).subscribe(([,{prev:a}])=>{let c=we(),p=a[a.length-1];if(p&&p.length){let[l]=p,{hash:f}=new URL(l.href);c.hash!==f&&(c.hash=f,history.replaceState({},"",`${c}`))}else c.hash="",history.replaceState({},"",`${c}`)}),_s(e,{viewport$:t,header$:r}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))})}function As(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:s}})=>s),ot(2,1),m(([s,a])=>s>a&&a>0),Y()),i=r.pipe(m(({active:s})=>s));return z([i,n]).pipe(m(([s,a])=>!(s&&a)),Y(),W(o.pipe(Ie(1))),ae(!0),vt({delay:250}),m(s=>({hidden:s})))}function Ii(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new T,s=i.pipe(oe(),ae(!0));return i.subscribe({next({hidden:a}){e.hidden=a,a?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(W(s),ne("height")).subscribe(({height:a})=>{e.style.top=`${a+16}px`}),h(e,"click").subscribe(a=>{a.preventDefault(),window.scrollTo({top:0})}),As(e,{viewport$:t,main$:o,target$:n}).pipe(O(a=>i.next(a)),A(()=>i.complete()),m(a=>P({ref:e},a)))}function Fi({document$:e,viewport$:t}){e.pipe(b(()=>M(".md-ellipsis")),J(r=>mt(r).pipe(W(e.pipe(Ie(1))),g(o=>o),m(()=>r),Ee(1))),g(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,V("content.tooltips")?Xe(n,{viewport$:t}).pipe(W(e.pipe(Ie(1))),A(()=>n.removeAttribute("title"))):y})).subscribe(),V("content.tooltips")&&e.pipe(b(()=>M(".md-status")),J(r=>Xe(r,{viewport$:t}))).subscribe()}function ji({document$:e,tablet$:t}){e.pipe(b(()=>M(".md-toggle--indeterminate")),O(r=>{r.indeterminate=!0,r.checked=!1}),J(r=>h(r,"change").pipe(Jr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),te(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function Cs(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function Ui({document$:e}){e.pipe(b(()=>M("[data-md-scrollfix]")),O(t=>t.removeAttribute("data-md-scrollfix")),g(Cs),J(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Wi({viewport$:e,tablet$:t}){z([Je("search"),t]).pipe(m(([r,o])=>r&&!o),b(r=>$(r).pipe(nt(r?400:100))),te(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ks(){return location.protocol==="file:"?_t(`${new URL("search/search_index.js",Or.base)}`).pipe(m(()=>__index),Z(1)):ze(new URL("search/search_index.json",Or.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ct=an(),Kt=bn(),Ht=yn(Kt),mo=hn(),ke=Ln(),Lr=Wt("(min-width: 60em)"),Vi=Wt("(min-width: 76.25em)"),Ni=xn(),Or=Te(),zi=document.forms.namedItem("search")?ks():tt,fo=new T;di({alert$:fo});ui({document$:ct});var uo=new T,qi=kt(Or.base);V("navigation.instant")&&gi({sitemap$:qi,location$:Kt,viewport$:ke,progress$:uo}).subscribe(ct);var Di;((Di=Or.version)==null?void 0:Di.provider)==="mike"&&Ti({document$:ct});L(Kt,Ht).pipe(nt(125)).subscribe(()=>{at("drawer",!1),at("search",!1)});mo.pipe(g(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=ue("link[rel=prev]");typeof t!="undefined"&&st(t);break;case"n":case".":let r=ue("link[rel=next]");typeof r!="undefined"&&st(r);break;case"Enter":let o=Ne();o instanceof HTMLLabelElement&&o.click()}});Fi({viewport$:ke,document$:ct});ji({document$:ct,tablet$:Lr});Ui({document$:ct});Wi({viewport$:ke,tablet$:Lr});var ft=ai(Ce("header"),{viewport$:ke}),qt=ct.pipe(m(()=>Ce("main")),b(e=>pi(e,{viewport$:ke,header$:ft})),Z(1)),Hs=L(...me("consent").map(e=>An(e,{target$:Ht})),...me("dialog").map(e=>ni(e,{alert$:fo})),...me("palette").map(e=>li(e)),...me("progress").map(e=>mi(e,{progress$:uo})),...me("search").map(e=>_i(e,{index$:zi,keyboard$:mo})),...me("source").map(e=>$i(e))),$s=H(()=>L(...me("announce").map(e=>_n(e)),...me("content").map(e=>oi(e,{sitemap$:qi,viewport$:ke,target$:Ht,print$:Ni})),...me("content").map(e=>V("search.highlight")?Ai(e,{index$:zi,location$:Kt}):y),...me("header").map(e=>si(e,{viewport$:ke,header$:ft,main$:qt})),...me("header-title").map(e=>ci(e,{viewport$:ke,header$:ft})),...me("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?eo(Vi,()=>lo(e,{viewport$:ke,header$:ft,main$:qt})):eo(Lr,()=>lo(e,{viewport$:ke,header$:ft,main$:qt}))),...me("tabs").map(e=>Pi(e,{viewport$:ke,header$:ft})),...me("toc").map(e=>Ri(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})),...me("top").map(e=>Ii(e,{viewport$:ke,header$:ft,main$:qt,target$:Ht})))),Ki=ct.pipe(b(()=>$s),Ve(Hs),Z(1));Ki.subscribe();window.document$=ct;window.location$=Kt;window.target$=Ht;window.keyboard$=mo;window.viewport$=ke;window.tablet$=Lr;window.screen$=Vi;window.print$=Ni;window.alert$=fo;window.progress$=uo;window.component$=Ki;})(); +//# sourceMappingURL=bundle.79ae519e.min.js.map + diff --git a/docs-site/site/assets/javascripts/bundle.79ae519e.min.js.map b/docs-site/site/assets/javascripts/bundle.79ae519e.min.js.map new file mode 100644 index 0000000..5cf0289 --- /dev/null +++ b/docs-site/site/assets/javascripts/bundle.79ae519e.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinct.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/exhaustMap.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/link/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/alternate/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/findurl/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2025 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n fetchSitemap,\n setupAlternate,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 60em)\")\nconst screen$ = watchMedia(\"(min-width: 76.25em)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up language selector */\nsetupAlternate({ document$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up sitemap for instant navigation and previews */\nconst sitemap$ = fetchSitemap(config.base)\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ sitemap$, location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { sitemap$, viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n */\nexport class Subscription implements SubscriptionLike {\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param value The `next` value.\n */\n next(value: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param err The `error` exception.\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as ((value: T) => void) | undefined,\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent.\n * @param subscriber The stopped subscriber.\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @param subscribe The function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @param subscribe the subscriber function to be passed to the Observable constructor\n * @return A new observable.\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @param operator the operator defining the operation to take on the observable\n * @return A new observable with the Operator applied.\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param observerOrNext Either an {@link Observer} with some or all callback methods,\n * or the `next` handler that is called for each value emitted from the subscribed Observable.\n * @param error A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param complete A handler for a terminal event resulting from successful completion.\n * @return A subscription reference to the registered handlers.\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next A handler for each value emitted by the observable.\n * @return A promise that either resolves on observable completion or\n * rejects with the handled error.\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @return This instance of the observable.\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n *\n * @return The Observable result of all the operators having been called\n * in the order they were passed in.\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return Observable that this Subject casts to.\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param _bufferSize The size of the buffer to replay on subscription\n * @param _windowTime The amount of time the buffered items will stay buffered\n * @param _timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param state Some contextual data that the `work` function uses when called by the\n * Scheduler.\n * @param delay Time to wait before executing the work, where the time unit is implicit\n * and defined by the Scheduler.\n * @return A subscription in order to be able to unsubscribe the scheduled work.\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param work A function representing a task, or some unit of work to be\n * executed by the Scheduler.\n * @param delay Time to wait before executing the work, where the time unit is\n * implicit and defined by the Scheduler itself.\n * @param state Some contextual data that the `work` function uses when called\n * by the Scheduler.\n * @return A subscription in order to be able to unsubscribe the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && id === scheduler._scheduled && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n let flushId;\n if (action) {\n flushId = action.id;\n } else {\n flushId = this._scheduled;\n this._scheduled = undefined;\n }\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an

eiQevnjD%9uaGI|G~C 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 r0000000000000000000003Y%jUh!{SvN$9)00000NkvXXu0mjf83T4h literal 0 HcmV?d00001 diff --git a/docs-site/site/assets/images/runtime-comparison.png b/docs-site/site/assets/images/runtime-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e8c2447bde5e5478b41643a1ad2206ad9f7417 GIT binary patch literal 56693 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

eiQevnjD%9uaGI|G~C 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 r0000000000000000000003Y%jUh!{SvN$9)00000NkvXXu0mjf83T4h literal 0 HcmV?d00001 diff --git a/docs-site/docs/assets/images/runtime-comparison.png b/docs-site/docs/assets/images/runtime-comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e8c2447bde5e5478b41643a1ad2206ad9f7417 GIT binary patch literal 56693 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